From dcf4ea603a0a27f96078ade2048da97d5d56d47d Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Fri, 20 Mar 2026 15:00:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=AC=AC=E4=BA=8C=E6=9C=9F?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E6=A8=A1=E5=9E=8B=E5=90=8E=E7=AB=AF=E5=AE=9E?= =?UTF-8?q?=E6=96=BD=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ank-tag-real-rule-phase2-backend-record.md | 80 +++++++++++++++++++ ...g-real-rule-phase2-backend-verification.md | 27 +++++++ sql/2026-03-16-bank-tagging.sql | 20 ++--- 3 files changed, 117 insertions(+), 10 deletions(-) create mode 100644 docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md create mode 100644 docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md diff --git a/docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md b/docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md new file mode 100644 index 00000000..bae561ec --- /dev/null +++ b/docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md @@ -0,0 +1,80 @@ +# 银行流水真实规则第二期后端实施记录 + +## 第二期规则范围 +- `LOW_INCOME_RELATIVE_LARGE_TRANSACTION` +- `MULTI_PARTY_GAMBLING_TRANSFER` +- `MONTHLY_FIXED_INCOME` +- `FIXED_COUNTERPARTY_TRANSFER` +- `HOUSE_REGISTRATION_MISMATCH` +- `PROPERTY_FEE_REGISTRATION_MISMATCH` +- `TAX_ASSET_REGISTRATION_MISMATCH` +- `SUPPLIER_CONCENTRATION` +- `SALARY_QUICK_TRANSFER` +- `SALARY_UNUSED` + +## 修改内容 +- 补齐第二期规则参数映射与阈值透传 +- 替换第二期 3 条资产比对明细规则占位 SQL +- 替换第二期 7 条对象聚合规则占位 SQL +- 对齐第二期规则元数据脚本、实施记录与验证记录 + +## 参数与分发调整 +- 在 `BankTagRuleConfigResolver` 中补齐第二期阈值规则参数映射: + - `MULTI_PARTY_GAMBLING_TRANSFER -> MULTI_PARTY_AMT_MIN, MULTI_PARTY_AMT_MAX` + - `MONTHLY_FIXED_INCOME -> MONTHLY_FIXED_INCOME` + - `FIXED_COUNTERPARTY_TRANSFER -> FIXED_COUNTERPARTY_TRANSFER_MIN, FIXED_COUNTERPARTY_TRANSFER_MAX` +- 明确以下规则为无阈值规则,继续返回空参数集: + - `LOW_INCOME_RELATIVE_LARGE_TRANSACTION` + - `SUPPLIER_CONCENTRATION` + - `HOUSE_REGISTRATION_MISMATCH` + - `PROPERTY_FEE_REGISTRATION_MISMATCH` + - `TAX_ASSET_REGISTRATION_MISMATCH` + - `SALARY_QUICK_TRANSFER` + - `SALARY_UNUSED` +- 在 `CcdiBankTagServiceImpl` 中为第二期 3 条阈值型对象规则改为显式透传解析后的阈值,避免继续走占位分支。 + +## 资产比对真实 SQL +- 在 `CcdiBankTagAnalysisMapper.xml` 中将以下 3 条明细规则替换为真实 SQL: + - `HOUSE_REGISTRATION_MISMATCH` + - `PROPERTY_FEE_REGISTRATION_MISMATCH` + - `TAX_ASSET_REGISTRATION_MISMATCH` +- 三条规则统一基于 `ccdi_asset_info` 校验员工及关系人当前资产登记情况,并继续输出 `bankStatementId/groupId/logId/reasonDetail`。 +- 房产登记口径统一使用当前项目数据中的实际枚举值: + - `asset_main_type = '房产'` + - `asset_sub_type = '住宅'` + - `asset_status = '正常'` + +## 对象聚合真实 SQL +- 在 `CcdiBankTagAnalysisMapper.xml` 中将以下 7 条对象规则替换为真实 SQL: + - `LOW_INCOME_RELATIVE_LARGE_TRANSACTION` + - `MULTI_PARTY_GAMBLING_TRANSFER` + - `MONTHLY_FIXED_INCOME` + - `FIXED_COUNTERPARTY_TRANSFER` + - `SUPPLIER_CONCENTRATION` + - `SALARY_QUICK_TRANSFER` + - `SALARY_UNUSED` +- 对象型规则统一按员工维度收口,返回 `objectType = 'STAFF_ID_CARD'`、`objectKey = 员工身份证号`,与结果表唯一键保持一致。 +- 各规则口径落地如下: + - `LOW_INCOME_RELATIVE_LARGE_TRANSACTION`:基于关系人年收入折算月收入,筛出无收入或月收入低于 3000 元且累计交易超 10 万元的员工。 + - `MULTI_PARTY_GAMBLING_TRANSFER`:按员工同日交易聚合,要求金额落在配置区间、交易笔数超过 2 笔且对手方至少 2 个。 + - `MONTHLY_FIXED_INCOME`:统计近 12 个月非工资稳定转入,满足月收入阈值、命中月数不少于 6 个月且波动率受控。 + - `FIXED_COUNTERPARTY_TRANSFER`:统计近 12 个月固定对手方按季度转入,季度金额落在配置区间且持续出现。 + - `SUPPLIER_CONCENTRATION`:基于采购交易表计算员工负责采购中单一供应商占比是否超过 70%。 + - `SALARY_QUICK_TRANSFER`:识别工资入账后 24 小时内快速转出超过 80% 的员工。 + - `SALARY_UNUSED`:识别工资入账后剔除代扣项目,连续 30 天无消费或转账支出的员工。 + +## 元数据脚本调整 +- 在 `sql/2026-03-16-bank-tagging.sql` 中将第二期已落地规则的 `remark` 从占位描述更新为真实规则说明。 +- `FIXED_COUNTERPARTY_TRANSFER.indicator_code` 调整为 `NULL`,避免继续保留不准确的单指标编码。 +- 修正 `SALARY_UNUSED` 的业务口径文本乱码问题。 +- 同步将 `TAX_ASSET_REGISTRATION_MISMATCH` 的业务口径更新为当前真实 SQL 已执行的房产登记校验表述。 + +## 与第一期衔接关系 +- 第一期已完成的 9 条规则保持不变,本次不回退第一期参数映射、明细规则与对象规则实现。 +- 第二期实现后,当前 19 条已落地真实规则共用同一套任务执行、结果落表、风险人数刷新与概览统计链路。 +- 本次回归继续覆盖项目概览相关测试,确认第二期改动未影响已有风险概览接口结构与 SQL。 + +## 全量收口结论 +- 第二期 10 条规则已全部替换为真实后端实现,不再依赖 `where 1 = 0` 占位 SQL。 +- 第二期规则参数编码、规则编码、脚本元数据均保持全大写约定。 +- 当前银行流水真实规则第一期与第二期后端范围已全部接入现有项目级打标主链路。 diff --git a/docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md b/docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md new file mode 100644 index 00000000..a64dc1ba --- /dev/null +++ b/docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md @@ -0,0 +1,27 @@ +# 银行流水真实规则第二期后端验证记录 + +## 执行命令 + +```bash +mvn test -pl ccdi-project -Dtest=BankTagRuleConfigResolverTest +mvn test -pl ccdi-project -Dtest=CcdiModelParamSqlDefaultsTest +mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest +mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,CcdiBankTagServiceImplTest +mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,BankTagRuleConfigResolverTest,CcdiBankTagServiceImplTest,CcdiBankTagServiceRiskCountRefreshTest,CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewControllerTest +``` + +## 执行时间 +- 2026-03-20 14:59 重新执行最终回归命令 `mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,BankTagRuleConfigResolverTest,CcdiBankTagServiceImplTest,CcdiBankTagServiceRiskCountRefreshTest,CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewControllerTest`,47 个测试全部通过,0 failure,0 error。 +- 本轮最终回归 `BUILD SUCCESS`,Maven 输出完成时间为 `2026-03-20T14:59:17+08:00`。 + +## 结果摘要 +- 第二期 10 条规则已全部通过结构测试或分发测试校验,不再保留占位 SQL。 +- `BankTagRuleConfigResolverTest` 已覆盖第二期 3 条阈值规则与 7 条无参规则的参数解析行为。 +- `CcdiBankTagAnalysisMapperXmlTest` 已确认第二期 3 条资产比对规则和 7 条对象规则均输出真实查询字段,剩余占位规则数量按预期下降。 +- `CcdiBankTagServiceImplTest` 已确认第二期阈值型对象规则参数成功接入服务分发链路,无参规则继续走空参数配置。 +- 项目概览相关 4 组测试继续通过,说明第二期规则接入未破坏风险人数刷新、概览 SQL 与概览接口结构。 +- 测试日志中出现的 `threshold missing` 与 `refresh failed` 为断言异常场景的预期输出,不代表本轮回归失败。 + +## 结论 +- 第二期后端实现已完成,10 条规则均已接入现有项目级流水打标主链路。 +- 当前验证范围为 Maven 单元测试与 SQL 结构测试,未启动额外前后端进程,因此无需执行进程清理。 diff --git a/sql/2026-03-16-bank-tagging.sql b/sql/2026-03-16-bank-tagging.sql index c0633949..dfdf0927 100644 --- a/sql/2026-03-16-bank-tagging.sql +++ b/sql/2026-03-16-bank-tagging.sql @@ -80,27 +80,27 @@ VALUES ('LARGE_TRANSACTION', '大额交易', 'FREQUENT_CASH_DEPOSIT', '短时间多次存现', 'FREQUENT_CASH_DEPOSIT', 'OBJECT', 'HIGH', '识别短时间多次现金存入对象', 1, 70, 'system', '初始化规则'), ('LARGE_TRANSACTION', '大额交易', 'LARGE_TRANSFER', '大额转账交易', 'FREQUENT_TRANSFER', 'STATEMENT', 'HIGH', '识别大额转账流水', 1, 80, 'system', '初始化规则'), ('ABNORMAL_TRANSACTION', '异常交易', 'ABNORMAL_CUSTOMER_TRANSACTION', '与客户之间非正常资金往来', NULL, 'STATEMENT', 'HIGH', '员工及关系人与客户及关系人之间有超过1000元以上的资金往来;客户指信贷类客户包括贷款户、担保人,中介库人员,包括中介注册的主体及主体关系人。', 1, 10, 'system', '占位规则,待补充真实SQL'), -('ABNORMAL_TRANSACTION', '异常交易', 'LOW_INCOME_RELATIVE_LARGE_TRANSACTION', '低收入亲属大额交易', NULL, 'OBJECT', 'GENERAL', '关系人中没有收入或月收入低于3000元的人员,累计交易金额超过10万元。', 1, 20, 'system', '占位规则,待补充真实SQL'), -('SUSPICIOUS_GAMBLING', '疑似赌博', 'MULTI_PARTY_GAMBLING_TRANSFER', '疑似赌博交易', NULL, 'OBJECT', 'HIGH', '多人(2人及以上)、多次(2次以上)、相近时间(同一天)内,有转账、微信转账、支付宝转账发生,且额度在可疑区间。金额区间可在排查设置页面进行设置', 1, 10, 'system', '占位规则,待补充真实SQL'), +('ABNORMAL_TRANSACTION', '异常交易', 'LOW_INCOME_RELATIVE_LARGE_TRANSACTION', '低收入亲属大额交易', NULL, 'OBJECT', 'GENERAL', '关系人中没有收入或月收入低于3000元的人员,累计交易金额超过10万元。', 1, 20, 'system', '真实规则:识别低收入关系人累计交易超10万元的员工对象'), +('SUSPICIOUS_GAMBLING', '疑似赌博', 'MULTI_PARTY_GAMBLING_TRANSFER', '疑似赌博交易', NULL, 'OBJECT', 'HIGH', '多人(2人及以上)、多次(2次以上)、相近时间(同一天)内,有转账、微信转账、支付宝转账发生,且额度在可疑区间。金额区间可在排查设置页面进行设置', 1, 10, 'system', '真实规则:识别同日多对手方且金额落在可疑区间的疑似赌博对象'), ('SUSPICIOUS_GAMBLING', '疑似赌博', 'GAMBLING_SENSITIVE_KEYWORD', '疑似敏感交易', NULL, 'STATEMENT', 'HIGH', '备注或交易摘要、对手有“游戏、抖币、体彩、福彩”等字眼。', 1, 20, 'system', '真实规则:识别摘要或对手方命中赌博敏感词的支出流水'), ('SUSPICIOUS_RELATION', '可疑关系', 'SPECIAL_AMOUNT_TRANSACTION', '特殊金额交易', NULL, 'STATEMENT', NULL, '除与配偶、子女外,发生特殊金额交易,如1314元、520元等具有特殊含义的金额。', 1, 10, 'system', '真实规则:识别与非配偶子女发生的特殊金额交易'), -('SUSPICIOUS_PART_TIME', '可疑兼职', 'MONTHLY_FIXED_INCOME', '疑似兼职', 'MONTHLY_FIXED_INCOME', 'OBJECT', NULL, '除本行工资收入外,每月有固定收入,固定收入金额自行设置。', 1, 10, 'system', '占位规则,待补充真实SQL'), -('SUSPICIOUS_PART_TIME', '可疑兼职', 'FIXED_COUNTERPARTY_TRANSFER', '疑似兼职', 'FIXED_COUNTERPARTY_TRANSFER', 'OBJECT', NULL, '每季或每年从固定交易对手转入金额,金额可设区间值,如5000-10000。', 1, 20, 'system', '占位规则,待补充真实SQL'), +('SUSPICIOUS_PART_TIME', '可疑兼职', 'MONTHLY_FIXED_INCOME', '疑似兼职', 'MONTHLY_FIXED_INCOME', 'OBJECT', NULL, '除本行工资收入外,每月有固定收入,固定收入金额自行设置。', 1, 10, 'system', '真实规则:识别近12个月持续出现稳定月度非工资收入的员工对象'), +('SUSPICIOUS_PART_TIME', '可疑兼职', 'FIXED_COUNTERPARTY_TRANSFER', '疑似兼职', NULL, 'OBJECT', NULL, '每季或每年从固定交易对手转入金额,金额可设区间值,如5000-10000。', 1, 20, 'system', '真实规则:识别固定交易对手季度转入金额落在设定区间的员工对象'), ('SUSPICIOUS_PART_TIME', '可疑兼职', 'SUSPICIOUS_INCOME_KEYWORD', '疑似兼职', NULL, 'STATEMENT', 'HIGH', '转入资金摘要有“工资”、“分红”、“红利”、“利息(非银行结息)”等收入', 1, 30, 'system', '真实规则:识别非本行工资代发的收入关键词转入流水'), -('SUSPICIOUS_PROPERTY', '可疑财产', 'HOUSE_REGISTRATION_MISMATCH', '购房交易与房产登记不匹配', NULL, 'STATEMENT', NULL, '员工及关系人有购房交易,但名下房产无新增登记;有新增登记购房,但无相关购房交易记录。', 1, 10, 'system', '占位规则,待补充真实SQL'), -('SUSPICIOUS_PROPERTY', '可疑财产', 'PROPERTY_FEE_REGISTRATION_MISMATCH', '物业缴费与房产登记不匹配', NULL, 'STATEMENT', NULL, '员工及关系人有物业缴费记录,但名下房产无新增登记。', 1, 20, 'system', '占位规则,待补充真实SQL'), -('SUSPICIOUS_PROPERTY', '可疑财产', 'TAX_ASSET_REGISTRATION_MISMATCH', '大额纳税与资产登记不匹配', NULL, 'STATEMENT', NULL, '员工及关系人有5000元以上的纳税记录,但名下无房产车产新增登记。', 1, 30, 'system', '占位规则,待补充真实SQL'), +('SUSPICIOUS_PROPERTY', '可疑财产', 'HOUSE_REGISTRATION_MISMATCH', '购房交易与房产登记不匹配', NULL, 'STATEMENT', NULL, '员工及关系人有购房交易,但名下房产无新增登记;有新增登记购房,但无相关购房交易记录。', 1, 10, 'system', '真实规则:识别购房支出但当前房产登记口径缺失的流水'), +('SUSPICIOUS_PROPERTY', '可疑财产', 'PROPERTY_FEE_REGISTRATION_MISMATCH', '物业缴费与房产登记不匹配', NULL, 'STATEMENT', NULL, '员工及关系人有物业缴费记录,但名下房产无新增登记。', 1, 20, 'system', '真实规则:识别物业缴费但当前房产登记口径缺失的流水'), +('SUSPICIOUS_PROPERTY', '可疑财产', 'TAX_ASSET_REGISTRATION_MISMATCH', '大额纳税与资产登记不匹配', NULL, 'STATEMENT', NULL, '员工及关系人有5000元以上的纳税记录,但当前资产登记口径下无房产登记。', 1, 30, 'system', '真实规则:识别大额纳税但当前房产登记口径缺失的流水'), ('SUSPICIOUS_PROPERTY', '可疑财产', 'INCOME_ASSET_MISMATCH', '收入资产不符', NULL, 'STATEMENT', 'HIGH', '豪华房产价值超家庭年收入10倍', 1, 40, 'system', '占位规则,待补充真实SQL'), ('SUSPICIOUS_FOREIGN_EXCHANGE', '可疑外汇交易', 'FOREX_BUY_AMT', '可疑外汇交易', 'SINGLE_PURCHASE_AMOUNT', 'STATEMENT', NULL, '单笔购汇金额超限', 1, 10, 'system', '真实规则:识别单笔购汇金额超过阈值的流水'), ('SUSPICIOUS_FOREIGN_EXCHANGE', '可疑外汇交易', 'FOREX_SELL_AMT', '可疑外汇交易', 'SINGLE_SETTLEMENT_AMOUNT', 'STATEMENT', NULL, '单笔结汇金额超限', 1, 20, 'system', '真实规则:识别单笔结汇金额超过阈值的流水'), ('SUSPICIOUS_FOREIGN_EXCHANGE', '可疑外汇交易', 'CROSS_BORDER_AMT', '可疑外汇交易', 'CROSS_BORDER_AMT', 'STATEMENT', NULL, '单笔跨境汇款金额超限', 1, 30, 'system', '占位规则,待补充真实SQL'), ('SUSPICIOUS_INTEREST_PAYMENT', '可疑付息', 'INTEREST_PAYMENT_BY_OTHERS', '可疑付息', NULL, 'OBJECT', 'HIGH', '客户经理管户的客户在智柜、柜面连续代交利息,且代交人数超过2人。', 1, 10, 'system', '占位规则,待补充真实SQL'), ('SUSPICIOUS_PURCHASE', '可疑采购', 'LARGE_PURCHASE_TRANSACTION', '可疑采购', NULL, 'STATEMENT', NULL, '单笔采购金额超过10万元。', 1, 10, 'system', '真实规则:识别单笔采购金额超过10万元的采购事项'), -('SUSPICIOUS_PURCHASE', '可疑采购', 'SUPPLIER_CONCENTRATION', '可疑采购', NULL, 'OBJECT', NULL, '单个供应商采购额占总采购额比例超过70%。', 1, 20, 'system', '占位规则,待补充真实SQL'), +('SUSPICIOUS_PURCHASE', '可疑采购', 'SUPPLIER_CONCENTRATION', '可疑采购', NULL, 'OBJECT', NULL, '单个供应商采购额占总采购额比例超过70%。', 1, 20, 'system', '真实规则:识别单个供应商采购额占比超过70%的员工对象'), ('ABNORMAL_BEHAVIOR', '异常行为', 'STOCK_TFR_LARGE', '可疑银证大额转账', 'STOCK_TFR_LARGE', 'STATEMENT', NULL, '家庭老人/非关系人银证大额转账', 1, 10, 'system', '真实规则:识别银证转账金额超过阈值的流水'), ('ABNORMAL_BEHAVIOR', '异常行为', 'WITHDRAW_CNT', '微信支付宝频繁提现', 'WITHDRAW_CNT', 'OBJECT', NULL, '微信、支付宝单日提现次数超过设置次数', 1, 20, 'system', '真实规则:识别微信支付宝单日提现次数超过阈值的对象'), ('ABNORMAL_BEHAVIOR', '异常行为', 'WITHDRAW_AMT', '微信支付宝提现超额', 'WITHDRAW_AMT', 'OBJECT', NULL, '微信、支付宝单日累计提现金额超过限额', 1, 30, 'system', '占位规则,待补充真实SQL'), -('ABNORMAL_BEHAVIOR', '异常行为', 'SALARY_QUICK_TRANSFER', '工资快速转出', NULL, 'OBJECT', NULL, '工资发放后24小时内转出超过80%的资金', 1, 40, 'system', '占位规则,待补充真实SQL'), -('ABNORMAL_BEHAVIOR', '异常行为', 'SALARY_UNUSED', '工资无使用记录', NULL, 'OBJECT', NULL, '工资发放后除代扣项目外,连续30天犖奕魏蜗鸦蜃思锹肌', 1, 50, 'system', '占位规则,待补充真实SQL'), +('ABNORMAL_BEHAVIOR', '异常行为', 'SALARY_QUICK_TRANSFER', '工资快速转出', NULL, 'OBJECT', NULL, '工资发放后24小时内转出超过80%的资金。', 1, 40, 'system', '真实规则:识别工资入账24小时内快速转出的员工对象'), +('ABNORMAL_BEHAVIOR', '异常行为', 'SALARY_UNUSED', '工资无使用记录', NULL, 'OBJECT', NULL, '工资发放后除代扣项目外,连续30天无消费或转账支出记录。', 1, 50, 'system', '真实规则:识别工资入账后30天内无消费或转账支出的员工对象'), ('ABNORMAL_BEHAVIOR', '异常行为', 'LARGE_STOCK_TRADING', '大额炒股', 'STOCK_TFR_LARGE', 'STATEMENT', 'HIGH', '单次三方资管交易金额超过100万元。', 1, 60, 'system', '真实规则:识别单笔三方资管交易金额超过阈值的流水'), ('ABNORMAL_BEHAVIOR', '异常行为', 'PROXY_ACCOUNT_OPERATION', '疑似代理他人账户', NULL, 'OBJECT', NULL, NULL, 1, 70, 'system', '占位规则,待补充真实SQL');