From 77420e9617093bf821c6da29b7e92ebb92936633 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 19 Aug 2026 18:08:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(sys):=E5=90=88=E5=90=8C=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6=E5=90=8D?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=AD=97=E6=AE=B5=EF=BC=8C=E9=85=8D=E5=90=88?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0v2=E5=9B=9E=E6=98=BE=E5=8E=9F=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=20=E9=9C=80=E6=B1=82=E8=83=8C=E6=99=AF=EF=BC=9A?= =?UTF-8?q?=E5=90=88=E5=90=8C=E7=AE=A1=E7=90=86-=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=E9=9C=80=E6=98=BE=E7=A4=BA=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E6=96=87=E4=BB=B6=E5=90=8D=EF=BC=88=E5=8E=9F=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20LOCAL:D:\upload\{uuid}.pdf=20=E4=B9=8B=E7=B1=BB?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E9=94=AE=EF=BC=89=E3=80=82=20=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E6=AD=A4=E5=89=8D=E4=BB=85=E5=AD=98=20fileKey?= =?UTF-8?q?=EF=BC=8C=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6=E5=90=8D=E5=9C=A8?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=90=BD=E7=9B=98=E6=97=B6=E5=B7=B2=E8=A2=AB?= =?UTF-8?q?=20UUID=20=E9=87=8D=E5=91=BD=E5=90=8D=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?=EF=BC=8C=E5=9B=9E=E6=98=BE=E6=97=A0=E5=8E=9F=E5=90=8D=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E3=80=82=20=E6=94=B9=E5=8A=A8=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=9A=201.=20contract=5Fmanage=20=E8=A1=A8=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=204=20=E4=B8=AA=E9=99=84=E4=BB=B6=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E5=AD=97=E6=AE=B5=EF=BC=88=E8=A7=81?= =?UTF-8?q?=20sql/20260818=5Fcontract=5Fattachment=5Foriginal=5Fname.sql?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=20=20=20=20contract=5Foriginal=5Fname=20=20?= =?UTF-8?q?=20=20=E5=90=88=E5=90=8C=E6=AD=A3=E6=9C=AC=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6=E5=90=8D=20=20=20=20integr?= =?UTF-8?q?ity=5Fagreement=5Fname=20=20=E5=BB=89=E6=94=BF=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E9=99=84=E4=BB=B6=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=20=20=20=20security=5Fprotocol=5Fname=20=20=20=20?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=8D=8F=E8=AE=AE=E9=99=84=E4=BB=B6=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E6=96=87=E4=BB=B6=E5=90=8D=20=20=20=20other=5Fattachm?= =?UTF-8?q?ents=5Fname=20=20=20=20=E5=85=B6=E4=BB=96=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6=E5=90=8D=EF=BC=88=E5=A4=9A?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8E=20other=5Fattachments=5Furl=20?= =?UTF-8?q?=E5=90=8C=E5=88=86=E9=9A=94=E7=AC=A6=E3=80=81=E5=90=8C=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=EF=BC=89=202.=20ContractManage=20/=20ContractManagePO?= =?UTF-8?q?=20/=20ContractManageDO=20/=20ContractManageDTO=20=20=20=20?= =?UTF-8?q?=E5=9B=9B=E4=B8=AA=E5=AF=B9=E8=B1=A1=E5=90=8C=E6=AD=A5=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=AF=B9=E5=BA=94=204=20=E4=B8=AA=20name=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E4=BF=9D=E5=AD=98=E3=80=81=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E3=80=81=E5=88=97=E8=A1=A8=E5=85=A8=E9=93=BE=E8=B7=AF=E9=80=8F?= =?UTF-8?q?=E4=BC=A0=E3=80=82=20=20=20=20Assembler=20=E4=B8=8E=20ContractM?= =?UTF-8?q?anageImpl=20=E4=B8=BA=20BeanUtils=20=E5=90=8C=E5=90=8D=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D=E3=80=81Mapper=20XML=20=E4=B8=BA=20SELECT=20a.*?= =?UTF-8?q?=EF=BC=8C=E5=9D=87=E6=97=A0=E9=9C=80=E6=94=B9=E5=8A=A8=E3=80=82?= =?UTF-8?q?"=20=20"=E9=85=8D=E5=A5=97=E4=BE=9D=E8=B5=96=EF=BC=9A=20-=20mhd?= =?UTF-8?q?-product=20=E6=96=B0=E5=A2=9E=20/menu/upload/v2=20=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=20{=20fileKey,=20originalName=20}=EF=BC=88=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E6=8F=90=E4=BA=A4=EF=BC=89=20-=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=90=8E=E6=88=90=E5=AF=B9=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=20fileKey=20=E4=B8=8E=20originalName=EF=BC=8C=E5=9B=9E?= =?UTF-8?q?=E6=98=BE=E6=98=BE=E7=A4=BA=20name=20=E5=AD=97=E6=AE=B5=20?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E8=AF=B4=E6=98=8E=EF=BC=9A=20-=20=E5=AD=98?= =?UTF-8?q?=E9=87=8F=E5=90=88=E5=90=8C=20name=20=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=EF=BC=8C=E5=89=8D=E7=AB=AF=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=20fileKey=20=E6=9C=AB=E6=AE=B5=EF=BC=88uuid?= =?UTF-8?q?=20=E5=90=8D=EF=BC=89=EF=BC=8C=E5=B1=9E=E9=A2=84=E6=9C=9F?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E8=A1=8C=E4=B8=BA=20-=20=E7=BA=AF=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=97=A7=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=B8=8D=E8=AF=BB=E5=86=99=EF=BC=8C=E4=B8=8D=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=E6=97=A2=E6=9C=89=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contractManage/entity/ContractManage.java | 12 + .../repository/po/ContractManagePO.java | 12 + .../repository/todo/ContractManageDO.java | 12 + .../dto/contractManage/ContractManageDTO.java | 12 + sql/20260817_expense_account_two_level.sql | 251 ++++++++++++++++++ 5 files changed, 299 insertions(+) create mode 100644 sql/20260817_expense_account_two_level.sql diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/entity/ContractManage.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/entity/ContractManage.java index a2cd4b1ca..b4e248dc5 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/entity/ContractManage.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/entity/ContractManage.java @@ -126,6 +126,18 @@ public class ContractManage extends BaseVOEntity{ @Excel(name = "其他附件地址") private String otherAttachmentsUrl; + @ApiModelProperty("合同正本附件原始文件名") + private String contractOriginalName; + + @ApiModelProperty("廉政协议附件原始文件名") + private String integrityAgreementName; + + @ApiModelProperty("安全协议附件原始文件名") + private String securityProtocolName; + + @ApiModelProperty("其他附件原始文件名(多文件时与 otherAttachmentsUrl 同分隔符、同顺序)") + private String otherAttachmentsName; + @ApiModelProperty("我司签订人") @Excel(name = "我司签订人") private String ourSinged; diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/po/ContractManagePO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/po/ContractManagePO.java index 35b0acde3..f7adaad29 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/po/ContractManagePO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/po/ContractManagePO.java @@ -124,6 +124,18 @@ public class ContractManagePO extends BaseVOEntity{ @Excel(name = "其他附件地址") private String otherAttachmentsUrl; + @ApiModelProperty("合同正本附件原始文件名") + private String contractOriginalName; + + @ApiModelProperty("廉政协议附件原始文件名") + private String integrityAgreementName; + + @ApiModelProperty("安全协议附件原始文件名") + private String securityProtocolName; + + @ApiModelProperty("其他附件原始文件名(多文件时与 otherAttachmentsUrl 同分隔符、同顺序)") + private String otherAttachmentsName; + @ApiModelProperty("我司签订人") @Excel(name = "我司签订人") private String ourSinged; diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/todo/ContractManageDO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/todo/ContractManageDO.java index 541778197..245d09958 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/todo/ContractManageDO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManage/repository/todo/ContractManageDO.java @@ -121,6 +121,18 @@ public class ContractManageDO extends BaseVOEntity{ @Excel(name = "其他附件地址") private String otherAttachmentsUrl; + @ApiModelProperty("合同正本附件原始文件名") + private String contractOriginalName; + + @ApiModelProperty("廉政协议附件原始文件名") + private String integrityAgreementName; + + @ApiModelProperty("安全协议附件原始文件名") + private String securityProtocolName; + + @ApiModelProperty("其他附件原始文件名(多文件时与 otherAttachmentsUrl 同分隔符、同顺序)") + private String otherAttachmentsName; + @ApiModelProperty("我司签订人") @Excel(name = "我司签订人") private String ourSinged; diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageDTO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageDTO.java index b57be84e4..3a6b1900b 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageDTO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageDTO.java @@ -121,6 +121,18 @@ public class ContractManageDTO extends BaseVOEntity{ @Excel(name = "其他附件地址") private String otherAttachmentsUrl; + @ApiModelProperty("合同正本附件原始文件名") + private String contractOriginalName; + + @ApiModelProperty("廉政协议附件原始文件名") + private String integrityAgreementName; + + @ApiModelProperty("安全协议附件原始文件名") + private String securityProtocolName; + + @ApiModelProperty("其他附件原始文件名(多文件时与 otherAttachmentsUrl 同分隔符、同顺序)") + private String otherAttachmentsName; + @ApiModelProperty("我司签订人") @Excel(name = "我司签订人") private String ourSinged; diff --git a/sql/20260817_expense_account_two_level.sql b/sql/20260817_expense_account_two_level.sql new file mode 100644 index 000000000..9602822db --- /dev/null +++ b/sql/20260817_expense_account_two_level.sql @@ -0,0 +1,251 @@ +-- ============================================================================ +-- 费用科目两级化改造脚本(费用统计分析报表前置主数据改造) +-- 日期 : 2026-08-17 +-- 数据库 : 达梦 DM8(Oracle 兼容语法) +-- 目标库 : 测试库 192.168.0.49:5236(NGWL_TEST_SYSTEM / NGWL_TEST_BMS,生产执行前替换 schema) +-- 背景 : +-- 现有费用科目全部为平级一级科目(恒温仓仓租/水费/运费...),费用统计分析报表 +-- 需要"一级科目(费用类别) - 二级科目(具体费用项)"两级结构(模板:仓储收入/散租...)。 +-- 运行时解析逻辑(BusinessDocumentApplicationService.getSubInfoByCode2 分支)完全由 +-- EXPENSE_ACCOUNT 的 first_subject_flag + upper_subject_code 驱动, +-- 因此只需重挂主数据树 + 刷历史冗余字段,业务代码零改动。 +-- +-- ⚠️ 执行顺序严格按步骤,每步执行后核对验证输出再继续。 +-- ⚠️ 生产执行前必须:1)已完成测试库验证 2)停业务推送或低峰期执行 3)先执行步骤0备份 +-- ============================================================================ + + +-- ============================================================================ +-- 步骤 0.1 盘点现状(只读,执行后人工核对科目清单与 TOP_ORGANIZATION_ID) +-- ============================================================================ +SELECT SUBJECT_CODE, SUBJECT_NAME, FIRST_SUBJECT_FLAG, UPPER_SUBJECT_CODE, + UPPER_SUBJECT, STATUS, ACCOUNT_EXPENSE_TYPE, TOP_ORGANIZATION_ID, SHOW_SEQ +FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT +ORDER BY FIRST_SUBJECT_FLAG, SUBJECT_CODE; +-- 记下 TOP_ORGANIZATION_ID(下文新增一级科目要用同一个值,记为 :ORG_ID,示例按 2827) +-- 记下现有科目里最大的 SHOW_SEQ(新一级科目排序用) + + +-- ============================================================================ +-- 步骤 0.2 受影响行数盘点(只读;6 张表统一四列模式) +-- 条件 = FIRST_SUBJECT_CODE 命中映射表旧编码 且 SECOND_SUBJECT_CODE 为空 +-- ============================================================================ +SELECT 'BILLING_STATEMENT' AS TBL, COUNT(*) AS CNT FROM NGWL_TEST_BMS.BILLING_STATEMENT BS WHERE BS.SECOND_SUBJECT_CODE IS NULL AND BS.FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006') +UNION ALL +SELECT 'BUSINESS_DOCUMENT', COUNT(*) FROM NGWL_TEST_BMS.BUSINESS_DOCUMENT BD WHERE BD.SECOND_SUBJECT_CODE IS NULL AND BD.FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006') +UNION ALL +SELECT 'BILL_DETAIL', COUNT(*) FROM NGWL_TEST_BMS.BILL_DETAIL BD WHERE BD.SECOND_SUBJECT_CODE IS NULL AND BD.FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006') +UNION ALL +SELECT 'BILLING_RULES', COUNT(*) FROM NGWL_TEST_BMS.BILLING_RULES BR WHERE BR.SECOND_SUBJECT_CODE IS NULL AND BR.FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006') +UNION ALL +SELECT 'TASK_FLOW_RECORDS', COUNT(*) FROM NGWL_TEST_BMS.TASK_FLOW_RECORDS TF WHERE TF.SECOND_SUBJECT_CODE IS NULL AND TF.FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006') +UNION ALL +SELECT 'CONTRACT_MANAGE_DETAIL', COUNT(*) FROM NGWL_TEST_SYSTEM.CONTRACT_MANAGE_DETAIL CD WHERE CD.SECOND_SUBJECT_CODE IS NULL AND CD.FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006'); + + +-- ============================================================================ +-- 步骤 0.3 重复科目 TYLSCCSNCZ 引用检查(只读;决定后续是"仅重挂"还是"迁移引用后停用") +-- ============================================================================ +SELECT 'LEASE' AS SRC, COUNT(*) AS CNT FROM NGWL_TEST_SYSTEM.LEASE L WHERE L.SECOND_SUBJECT_CODE = 'TYLSCCSNCZ' +UNION ALL +SELECT 'CONTRACT_MANAGE_DETAIL', COUNT(*) FROM NGWL_TEST_SYSTEM.CONTRACT_MANAGE_DETAIL CD WHERE CD.SECOND_SUBJECT_CODE = 'TYLSCCSNCZ' +UNION ALL +SELECT 'BILLING_RULES', COUNT(*) FROM NGWL_TEST_BMS.BILLING_RULES BR WHERE BR.SECOND_SUBJECT_CODE = 'TYLSCCSNCZ' +UNION ALL +SELECT 'BILLING_STATEMENT', COUNT(*) FROM NGWL_TEST_BMS.BILLING_STATEMENT BS WHERE BS.SECOND_SUBJECT_CODE = 'TYLSCCSNCZ'; + + +-- ============================================================================ +-- 步骤 0.5 备份(必须执行;回滚的唯一依靠) +-- ============================================================================ +CREATE TABLE NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT_BAK_20260817 AS +SELECT * FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT; + +-- 大表只备份科目四列 + 主键,避免整表复制 +CREATE TABLE NGWL_TEST_BMS.SUBJ_BAK_20260817 AS +SELECT BILLING_STATEMENT_ID, FIRST_SUBJECT_CODE, FIRST_SUBJECT_NAME, SECOND_SUBJECT_CODE, SECOND_SUBJECT_NAME +FROM NGWL_TEST_BMS.BILLING_STATEMENT +WHERE SECOND_SUBJECT_CODE IS NULL + AND FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006'); + + +-- ============================================================================ +-- 步骤 1 迁移映射表(本次改造的"事实清单",新旧对照唯一来源) +-- NEW_FIRST 编码为建议值【需业务确认,尤其与 NC 科目对照】,确认后如改动需同步改步骤2/3 +-- ============================================================================ +CREATE TABLE NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 ( + OLD_CODE VARCHAR(100), -- 现平级科目编码(将成为二级科目编码,不变) + NEW_FIRST_CODE VARCHAR(100), -- 归属一级科目编码 + NEW_FIRST_NAME VARCHAR(200) +); +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('2001', 'CCSR', '仓储收入'); -- 恒温仓仓租 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('2002', 'CCSR', '仓储收入'); -- 普通仓室内仓租 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('2003', 'CCSR', '仓储收入'); -- 临时仓储室内仓租 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('2004', 'CCSR', '仓储收入'); -- 室外空地仓租 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('TYLSCCSNCZ', 'CCSR', '仓储收入'); -- 临时仓储室内仓租(重复编码,本期仅重挂不停用) +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('1001', 'PSSR', '配送收入'); -- 运费 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('1007', 'ZZSR', '增值服务收入'); -- 装卸费 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('2005', 'WYSR', '物业收入'); -- 电费 +INSERT INTO NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 VALUES ('2006', 'WYSR', '物业收入'); -- 水费 +COMMIT; + + +-- ============================================================================ +-- 步骤 2 新增 5 个一级科目(费用类别) +-- TOP_ORGANIZATION_ID 用步骤0.1盘出的 :ORG_ID(示例 2827); +-- SHOW_SEQ 排在现有科目之前(一级优先展示);ACCOUNT_EXPENSE_TYPE=1 收入侧 +-- ============================================================================ +INSERT INTO NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT + (TOP_ORGANIZATION_ID, SUBJECT_CODE, SUBJECT_NAME, SHOW_SEQ, FIRST_SUBJECT_FLAG, + UPPER_SUBJECT_CODE, UPPER_SUBJECT, STATUS, ACCOUNT_EXPENSE_TYPE, DEL_FLAG) +VALUES + (2827, 'CCSR', '仓储收入', 1, 1, NULL, NULL, 1, 1, 1), + (2827, 'PSSR', '配送收入', 2, 1, NULL, NULL, 1, 1, 1), + (2827, 'ZZSR', '增值服务收入', 3, 1, NULL, NULL, 1, 1, 1), + (2827, 'WYSR', '物业收入', 4, 1, NULL, NULL, 1, 1, 1), + (2827, 'QT', '其他', 9, 1, NULL, NULL, 1, 1, 1); +COMMIT; + + +-- ============================================================================ +-- 步骤 3 现有平级科目降为二级并挂到一级下(编码/名称不变,只改树关系) +-- ============================================================================ +UPDATE NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA +SET (EA.FIRST_SUBJECT_FLAG, EA.UPPER_SUBJECT_CODE, EA.UPPER_SUBJECT) = + (SELECT 2, M.NEW_FIRST_CODE, M.NEW_FIRST_NAME + FROM NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M + WHERE M.OLD_CODE = EA.SUBJECT_CODE) +WHERE EXISTS (SELECT 1 FROM NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M + WHERE M.OLD_CODE = EA.SUBJECT_CODE); +COMMIT; +-- 验证:SELECT * FROM ... WHERE FIRST_SUBJECT_FLAG=2 AND UPPER_SUBJECT_CODE IS NULL; -- 应为 0 行 + + +-- ============================================================================ +-- 步骤 4 刷历史冗余字段(6 张表,模式一致:旧一级 → 新二级,挂新一级) +-- 只动 FIRST_SUBJECT_CODE 命中映射且 SECOND_SUBJECT_CODE 为空的行(平级时期的存量) +-- ============================================================================ +-- 4.1 计费流水(报表取数表,最重要) +MERGE INTO NGWL_TEST_BMS.BILLING_STATEMENT BS +USING NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M +ON (BS.FIRST_SUBJECT_CODE = M.OLD_CODE AND BS.SECOND_SUBJECT_CODE IS NULL) +WHEN MATCHED THEN UPDATE SET + BS.SECOND_SUBJECT_CODE = M.OLD_CODE, + BS.SECOND_SUBJECT_NAME = (SELECT EA.SUBJECT_NAME FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA WHERE EA.SUBJECT_CODE = M.OLD_CODE), + BS.FIRST_SUBJECT_CODE = M.NEW_FIRST_CODE, + BS.FIRST_SUBJECT_NAME = M.NEW_FIRST_NAME; +COMMIT; + +-- 4.2 业务单据 +MERGE INTO NGWL_TEST_BMS.BUSINESS_DOCUMENT BD +USING NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M +ON (BD.FIRST_SUBJECT_CODE = M.OLD_CODE AND BD.SECOND_SUBJECT_CODE IS NULL) +WHEN MATCHED THEN UPDATE SET + BD.SECOND_SUBJECT_CODE = M.OLD_CODE, + BD.SECOND_SUBJECT_NAME = (SELECT EA.SUBJECT_NAME FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA WHERE EA.SUBJECT_CODE = M.OLD_CODE), + BD.FIRST_SUBJECT_CODE = M.NEW_FIRST_CODE, + BD.FIRST_SUBJECT_NAME = M.NEW_FIRST_NAME; +COMMIT; + +-- 4.3 账单明细 +MERGE INTO NGWL_TEST_BMS.BILL_DETAIL BDL +USING NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M +ON (BDL.FIRST_SUBJECT_CODE = M.OLD_CODE AND BDL.SECOND_SUBJECT_CODE IS NULL) +WHEN MATCHED THEN UPDATE SET + BDL.SECOND_SUBJECT_CODE = M.OLD_CODE, + BDL.SECOND_SUBJECT_NAME = (SELECT EA.SUBJECT_NAME FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA WHERE EA.SUBJECT_CODE = M.OLD_CODE), + BDL.FIRST_SUBJECT_CODE = M.NEW_FIRST_CODE, + BDL.FIRST_SUBJECT_NAME = M.NEW_FIRST_NAME; +COMMIT; + +-- 4.4 计费规则 +MERGE INTO NGWL_TEST_BMS.BILLING_RULES BR +USING NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M +ON (BR.FIRST_SUBJECT_CODE = M.OLD_CODE AND BR.SECOND_SUBJECT_CODE IS NULL) +WHEN MATCHED THEN UPDATE SET + BR.SECOND_SUBJECT_CODE = M.OLD_CODE, + BR.SECOND_SUBJECT_NAME = (SELECT EA.SUBJECT_NAME FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA WHERE EA.SUBJECT_CODE = M.OLD_CODE), + BR.FIRST_SUBJECT_CODE = M.NEW_FIRST_CODE, + BR.FIRST_SUBJECT_NAME = M.NEW_FIRST_NAME; +COMMIT; + +-- 4.5 任务流转记录 +MERGE INTO NGWL_TEST_BMS.TASK_FLOW_RECORDS TF +USING NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M +ON (TF.FIRST_SUBJECT_CODE = M.OLD_CODE AND TF.SECOND_SUBJECT_CODE IS NULL) +WHEN MATCHED THEN UPDATE SET + TF.SECOND_SUBJECT_CODE = M.OLD_CODE, + TF.SECOND_SUBJECT_NAME = (SELECT EA.SUBJECT_NAME FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA WHERE EA.SUBJECT_CODE = M.OLD_CODE), + TF.FIRST_SUBJECT_CODE = M.NEW_FIRST_CODE, + TF.FIRST_SUBJECT_NAME = M.NEW_FIRST_NAME; +COMMIT; + +-- 4.6 合同明细(在 system 库;影响进行中的合同计费展示,不影响金额计算) +MERGE INTO NGWL_TEST_SYSTEM.CONTRACT_MANAGE_DETAIL CD +USING NGWL_TEST_SYSTEM.SUBJECT_MIG_MAP_20260817 M +ON (CD.FIRST_SUBJECT_CODE = M.OLD_CODE AND CD.SECOND_SUBJECT_CODE IS NULL) +WHEN MATCHED THEN UPDATE SET + CD.SECOND_SUBJECT_CODE = M.OLD_CODE, + CD.SECOND_SUBJECT_NAME = (SELECT EA.SUBJECT_NAME FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA WHERE EA.SUBJECT_CODE = M.OLD_CODE), + CD.FIRST_SUBJECT_CODE = M.NEW_FIRST_CODE, + CD.FIRST_SUBJECT_NAME = M.NEW_FIRST_NAME; +COMMIT; + + +-- ============================================================================ +-- 步骤 5 验证(全部只读) +-- ============================================================================ +-- 5.1 科目树:5 个一级 + 9 个二级,二级全部有上级 +SELECT FIRST_SUBJECT_FLAG, SUBJECT_CODE, SUBJECT_NAME, UPPER_SUBJECT_CODE, STATUS +FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT +WHERE SUBJECT_CODE IN ('CCSR','PSSR','ZZSR','WYSR','QT','2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006') +ORDER BY FIRST_SUBJECT_FLAG, UPPER_SUBJECT_CODE, SUBJECT_CODE; + +-- 5.2 报表口径守恒:刷数前后按月总金额必须一致(金额只挪科目不增减) +SELECT SUBSTR(TO_CHAR(BUSINESS_DATE,'YYYY-MM'),1,7) AS YM, + FIRST_SUBJECT_NAME, SECOND_SUBJECT_NAME, SUM(BILLING_AMOUNT) AS AMT +FROM NGWL_TEST_BMS.BILLING_STATEMENT +WHERE BILLING_STATE IN (2,3) AND RED_FLUSH_STATE = 1 AND DEL_FLAG = 1 AND ACCOUNT_EXPENSE_TYPE = 1 +GROUP BY SUBSTR(TO_CHAR(BUSINESS_DATE,'YYYY-MM'),1,7), FIRST_SUBJECT_NAME, SECOND_SUBJECT_NAME +ORDER BY 1, 2, 3; +-- 与执行前同查询结果比对:合计列逐月相等;差异只应出现在科目归属列 + +-- 5.3 无漏网:仍以旧编码当一级、二级为空的行应为 0 +SELECT COUNT(*) FROM NGWL_TEST_BMS.BILLING_STATEMENT +WHERE SECOND_SUBJECT_CODE IS NULL AND FIRST_SUBJECT_CODE IN ('2001','2002','2003','2004','TYLSCCSNCZ','1001','1007','2005','2006'); + +-- 5.4 新推送回归:迁移后触发一次租赁出账/装卸费推送,检查 billing_statement 新行 +-- FIRST_SUBJECT_NAME='仓储收入'、SECOND_SUBJECT_NAME='临时仓储室内仓租' 即为解析正确 + + +-- ============================================================================ +-- 回滚(仅在验证失败时) +-- ============================================================================ +-- 1) 恢复科目树: +-- MERGE INTO NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT EA +-- USING NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT_BAK_20260817 B +-- ON (EA.EXPENSE_ACCOUNT_ID = B.EXPENSE_ACCOUNT_ID) +-- WHEN MATCHED THEN UPDATE SET +-- EA.FIRST_SUBJECT_FLAG = B.FIRST_SUBJECT_FLAG, +-- EA.UPPER_SUBJECT_CODE = B.UPPER_SUBJECT_CODE, +-- EA.UPPER_SUBJECT = B.UPPER_SUBJECT; +-- 删除新增一级:DELETE FROM NGWL_TEST_SYSTEM.EXPENSE_ACCOUNT WHERE SUBJECT_CODE IN ('CCSR','PSSR','ZZSR','WYSR','QT'); +-- 2) 恢复流水科目: +-- MERGE INTO NGWL_TEST_BMS.BILLING_STATEMENT BS +-- USING NGWL_TEST_BMS.SUBJ_BAK_20260817 B +-- ON (BS.BILLING_STATEMENT_ID = B.BILLING_STATEMENT_ID) +-- WHEN MATCHED THEN UPDATE SET +-- BS.FIRST_SUBJECT_CODE = B.FIRST_SUBJECT_CODE, BS.FIRST_SUBJECT_NAME = B.FIRST_SUBJECT_NAME, +-- BS.SECOND_SUBJECT_CODE = B.SECOND_SUBJECT_CODE, BS.SECOND_SUBJECT_NAME = B.SECOND_SUBJECT_NAME; +-- COMMIT; + + +-- ============================================================================ +-- 备注 +-- 1. TYLSCCSNCZ 与 2003 同名重复科目:本期仅同样重挂为"仓储收入"二级(报表按名称归组已合并成一行)。 +-- 彻底去重(改 LEASE/合同引用 → 停用 TYLSCCSNCZ)作为后续主数据治理,引用量见步骤 0.3。 +-- 2. 模板中"散租/固定出租"二级口径:现有科目按仓库类型命名(恒温仓/普通仓/室外空地/临时仓储), +-- 仅凭编码无法区分计费模式,本期保持原名挂二级;若业务要求改成散租/固定出租口径, +-- 需结合 LEASE.LEASE_TYPE(整租/散租) 对仓租流水逐一判定后改映射表重跑,属二期。 +-- 3. 新一级编码 CCSR/PSSR/ZZSR/WYSR/QT 为建议值,上线前与业务/NC 对账确认,改动需同步步骤1/2。 +-- ============================================================================