新增银行流水模型两期实施计划
This commit is contained in:
@@ -0,0 +1,276 @@
|
|||||||
|
# Bank Tag Real Rule Phase 1 Backend Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** 将第一期 9 条银行流水占位规则替换为真实 SQL,并接入现有项目级打标、风险人数回写与结果链路。
|
||||||
|
|
||||||
|
**Architecture:** 保持现有 `ccdi_bank_tag_rule + CcdiBankTagServiceImpl + CcdiBankTagAnalysisMapper.xml` 规则式架构不变,不新增模块、不保留兼容性双轨。所有真实命中逻辑统一落在 `CcdiBankTagAnalysisMapper.xml`,Service 只做规则分发和结果装配,参数仍由 `BankTagRuleConfigResolver` 解析。
|
||||||
|
|
||||||
|
**Tech Stack:** Java 21, Spring Boot 3, MyBatis XML, Maven, JUnit 5, Mockito, MySQL
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: 先锁定第一期规则边界与参数映射
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java`
|
||||||
|
- Modify: `sql/ccdi_model_param.sql`
|
||||||
|
- Modify: `sql/2026-03-16-update-ccdi-model-param-defaults.sql`
|
||||||
|
- Reference: `assets/模型信息.xlsx`
|
||||||
|
- Reference: `docs/design/2026-03-20-bank-tag-real-rule-two-phase-design.md`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
在 `BankTagRuleConfigResolverTest.java` 中补第一期参数映射断言,至少覆盖:
|
||||||
|
|
||||||
|
- `SINGLE_PURCHASE_AMOUNT`
|
||||||
|
- `SINGLE_SETTLEMENT_AMOUNT`
|
||||||
|
- `WITHDRAW_CNT`
|
||||||
|
- `STOCK_TFR_LARGE`
|
||||||
|
- `LARGE_STOCK_TRADING`
|
||||||
|
|
||||||
|
并补“无参数规则仍返回空参数集”的断言,至少覆盖:
|
||||||
|
|
||||||
|
- `GAMBLING_SENSITIVE_KEYWORD`
|
||||||
|
- `SPECIAL_AMOUNT_TRANSACTION`
|
||||||
|
- `SUSPICIOUS_INCOME_KEYWORD`
|
||||||
|
- `LARGE_PURCHASE_TRANSACTION`
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=BankTagRuleConfigResolverTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `FAIL`
|
||||||
|
- 原因是第一期规则参数映射或默认参数脚本尚未全部对齐
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
按第一期规则校准参数映射与默认参数脚本:
|
||||||
|
|
||||||
|
- 在 `BankTagRuleConfigResolver.java` 中补第一期规则的 `RULE_PARAM_MAPPING`
|
||||||
|
- 在 `sql/ccdi_model_param.sql` 中核对并补齐第一期阈值参数初始化
|
||||||
|
- 在 `sql/2026-03-16-update-ccdi-model-param-defaults.sql` 中同步已有环境默认值修正
|
||||||
|
|
||||||
|
要求:
|
||||||
|
|
||||||
|
- 只补第一期需要的参数
|
||||||
|
- 不修改第二期规则边界
|
||||||
|
- 所有新增或修改的 `param_code` 保持全大写
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=BankTagRuleConfigResolverTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java sql/ccdi_model_param.sql sql/2026-03-16-update-ccdi-model-param-defaults.sql
|
||||||
|
git commit -m "补齐第一期流水模型参数映射"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 2: 为第一期流水明细型规则写失败前 SQL 结构测试
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java`
|
||||||
|
- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
在 `CcdiBankTagAnalysisMapperXmlTest.java` 中为以下规则补结构断言:
|
||||||
|
|
||||||
|
- `selectGamblingSensitiveKeywordStatements`
|
||||||
|
- `selectSpecialAmountTransactionStatements`
|
||||||
|
- `selectSuspiciousIncomeKeywordStatements`
|
||||||
|
- `selectForexBuyAmtStatements`
|
||||||
|
- `selectForexSellAmtStatements`
|
||||||
|
- `selectLargePurchaseTransactionStatements`
|
||||||
|
- `selectStockTfrLargeStatements`
|
||||||
|
- `selectLargeStockTradingStatements`
|
||||||
|
|
||||||
|
断言内容:
|
||||||
|
|
||||||
|
- 目标 `select` 已存在
|
||||||
|
- 对应片段不再包含 `where 1 = 0`
|
||||||
|
- 仍返回 `bankStatementId/groupId/logId/reasonDetail`
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `FAIL`
|
||||||
|
- 原因是第一期规则仍是占位 SQL
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
在 `CcdiBankTagAnalysisMapper.xml` 中把第一期流水明细型规则替换为真实 SQL:
|
||||||
|
|
||||||
|
- `GAMBLING_SENSITIVE_KEYWORD`
|
||||||
|
- `SPECIAL_AMOUNT_TRANSACTION`
|
||||||
|
- `SUSPICIOUS_INCOME_KEYWORD`
|
||||||
|
- `SINGLE_PURCHASE_AMOUNT`
|
||||||
|
- `SINGLE_SETTLEMENT_AMOUNT`
|
||||||
|
- `LARGE_PURCHASE_TRANSACTION`
|
||||||
|
- `STOCK_TFR_LARGE`
|
||||||
|
- `LARGE_STOCK_TRADING`
|
||||||
|
|
||||||
|
实现要求:
|
||||||
|
|
||||||
|
- 继续输出 `bankStatementId/groupId/logId/reasonDetail`
|
||||||
|
- 条件判断尽量直接复用 `assets/模型信息.xlsx` 已校验可执行的 SQL 口径
|
||||||
|
- `reasonDetail` 要带出摘要、对手方、金额或阈值关键信息,便于后续结果展示与排障
|
||||||
|
- 不把业务判断搬到 Java 层
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java
|
||||||
|
git commit -m "实现第一期流水明细规则真实SQL"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 3: 为第一期对象型规则补真实 SQL 与分发校验
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
|
||||||
|
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
补以下断言:
|
||||||
|
|
||||||
|
- `selectWithdrawCntObjects` 不再使用占位 SQL
|
||||||
|
- `CcdiBankTagServiceImplTest` 中 `WITHDRAW_CNT` 能正确分发到 `analysisMapper.selectWithdrawCntObjects(projectId)`
|
||||||
|
- `WITHDRAW_CNT` 空命中时任务仍正常成功
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,CcdiBankTagServiceImplTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `FAIL`
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
在 XML 中实现 `WITHDRAW_CNT` 的真实对象型 SQL,要求:
|
||||||
|
|
||||||
|
- 按员工身份证号归并
|
||||||
|
- 统计微信/支付宝相关提现的单日次数
|
||||||
|
- 频次阈值使用参数解析结果
|
||||||
|
- 输出 `objectType/objectKey/reasonDetail`
|
||||||
|
|
||||||
|
同时在 `CcdiBankTagServiceImpl.java` 中确认:
|
||||||
|
|
||||||
|
- 第一期开启真实 SQL 的规则都命中明确分发分支
|
||||||
|
- 不会退回 `default -> List.of()`
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,CcdiBankTagServiceImplTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java
|
||||||
|
git commit -m "接通第一期对象规则真实分发"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 4: 做第一期后端回归与脚本对齐验证
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `sql/2026-03-16-bank-tagging.sql`
|
||||||
|
- Create: `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase1-backend-record.md`
|
||||||
|
- Create: `docs/tests/records/2026-03-20-bank-tag-real-rule-phase1-backend-verification.md`
|
||||||
|
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceRiskCountRefreshTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Align rule metadata SQL**
|
||||||
|
|
||||||
|
核对 `sql/2026-03-16-bank-tagging.sql` 中第一期规则元数据,要求:
|
||||||
|
|
||||||
|
- `rule_code`、`indicator_code`、`param_code` 保持全大写
|
||||||
|
- `remark` 从“占位规则,待补充真实SQL”调整为真实规则描述,或至少不再误导为占位
|
||||||
|
- 不误改第二期规则
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run targeted regression**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,BankTagRuleConfigResolverTest,CcdiBankTagServiceImplTest,CcdiBankTagServiceRiskCountRefreshTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
- 第一期开启真实 SQL 后,风险人数回写链路不回退
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write implementation record**
|
||||||
|
|
||||||
|
在 `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase1-backend-record.md` 中记录:
|
||||||
|
|
||||||
|
- 第一期 9 条规则范围
|
||||||
|
- 参数映射调整内容
|
||||||
|
- XML 真实 SQL 替换内容
|
||||||
|
- Service 分发调整内容
|
||||||
|
- 与第二期边界
|
||||||
|
|
||||||
|
- [ ] **Step 4: Write verification record**
|
||||||
|
|
||||||
|
在 `docs/tests/records/2026-03-20-bank-tag-real-rule-phase1-backend-verification.md` 中记录:
|
||||||
|
|
||||||
|
- 执行命令
|
||||||
|
- 执行时间
|
||||||
|
- 结果摘要
|
||||||
|
- 结论
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add sql/2026-03-16-bank-tagging.sql docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase1-backend-record.md docs/tests/records/2026-03-20-bank-tag-real-rule-phase1-backend-verification.md
|
||||||
|
git commit -m "补充第一期流水模型后端实施记录"
|
||||||
|
```
|
||||||
@@ -0,0 +1,262 @@
|
|||||||
|
# Bank Tag Real Rule Phase 2 Backend Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** 将第二期 10 条复杂对象聚合与跨表比对规则替换为真实 SQL,完成 19 条目标银行流水模型的后端真实落地收口。
|
||||||
|
|
||||||
|
**Architecture:** 继续沿用现有 `CcdiBankTagServiceImpl + CcdiBankTagAnalysisMapper.xml + BankTagRuleConfigResolver` 链路,不新增平行计算模块。第二期重点放在聚合口径、关系人归并、资产登记比对和时间窗口判断,所有真实规则仍统一落在 XML 中完成。
|
||||||
|
|
||||||
|
**Tech Stack:** Java 21, Spring Boot 3, MyBatis XML, Maven, JUnit 5, Mockito, MySQL
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: 先锁定第二期参数与聚合边界
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java`
|
||||||
|
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java`
|
||||||
|
- Modify: `sql/ccdi_model_param.sql`
|
||||||
|
- Modify: `sql/2026-03-16-update-ccdi-model-param-defaults.sql`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
为以下规则补参数与无参数边界断言:
|
||||||
|
|
||||||
|
- `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`
|
||||||
|
- `SALARY_QUICK_TRANSFER`、`SALARY_UNUSED` 为无参数规则
|
||||||
|
- `LOW_INCOME_RELATIVE_LARGE_TRANSACTION`、`SUPPLIER_CONCENTRATION`、三条资产不匹配规则为无参数规则
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=BankTagRuleConfigResolverTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `FAIL`
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
补齐第二期规则参数映射和默认值脚本,要求:
|
||||||
|
|
||||||
|
- 只补设计文档明确需要阈值的规则
|
||||||
|
- 不为无参数规则制造虚假参数
|
||||||
|
- 继续保持大小写统一
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=BankTagRuleConfigResolverTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java sql/ccdi_model_param.sql sql/2026-03-16-update-ccdi-model-param-defaults.sql
|
||||||
|
git commit -m "补齐第二期流水模型参数映射"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 2: 实现第二期跨表比对型流水规则
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
为以下规则补结构断言:
|
||||||
|
|
||||||
|
- `selectHouseRegistrationMismatchStatements`
|
||||||
|
- `selectPropertyFeeRegistrationMismatchStatements`
|
||||||
|
- `selectTaxAssetRegistrationMismatchStatements`
|
||||||
|
|
||||||
|
断言要求:
|
||||||
|
|
||||||
|
- 不再出现 `where 1 = 0`
|
||||||
|
- SQL 中显式使用 `ccdi_asset_info`
|
||||||
|
- 仍返回标准 `STATEMENT` 命中字段
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `FAIL`
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
在 XML 中实现三条资产不匹配规则:
|
||||||
|
|
||||||
|
- 购房交易与房产登记不匹配
|
||||||
|
- 物业缴费与房产登记不匹配
|
||||||
|
- 大额纳税与资产登记不匹配
|
||||||
|
|
||||||
|
要求:
|
||||||
|
|
||||||
|
- 使用当前环境已确认可执行的 `ccdi_asset_info` 字段口径
|
||||||
|
- 资产类型、状态值以当前仓库和现网样例已确认值为准
|
||||||
|
- 关系人和员工本人都纳入比对
|
||||||
|
- `reasonDetail` 能反映交易类型、金额或登记缺失事实
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java
|
||||||
|
git commit -m "实现第二期资产比对规则真实SQL"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 3: 实现第二期对象聚合规则
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
覆盖以下规则的 SQL 结构与 Service 分发断言:
|
||||||
|
|
||||||
|
- `LOW_INCOME_RELATIVE_LARGE_TRANSACTION`
|
||||||
|
- `MULTI_PARTY_GAMBLING_TRANSFER`
|
||||||
|
- `MONTHLY_FIXED_INCOME`
|
||||||
|
- `FIXED_COUNTERPARTY_TRANSFER`
|
||||||
|
- `SUPPLIER_CONCENTRATION`
|
||||||
|
- `SALARY_QUICK_TRANSFER`
|
||||||
|
- `SALARY_UNUSED`
|
||||||
|
|
||||||
|
锁定要点:
|
||||||
|
|
||||||
|
- `objectType/objectKey/reasonDetail` 字段完整
|
||||||
|
- SQL 不再占位
|
||||||
|
- Service 命中正确 Mapper 方法
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,CcdiBankTagServiceImplTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `FAIL`
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
在 XML 中按规则口径实现对象型聚合:
|
||||||
|
|
||||||
|
- 低收入亲属大额交易:先算月均收入,再判断累计交易额
|
||||||
|
- 疑似赌博交易:按日期、不同对手方和区间金额聚合
|
||||||
|
- 疑似兼职两条:按月份或季度聚合并做稳定性/区间判断
|
||||||
|
- 供应商集中度:基于 `ccdi_purchase_transaction` 计算集中度
|
||||||
|
- 工资快速转出:工资入账后 24h 内转出比例判断
|
||||||
|
- 工资无使用记录:工资入账后 30 天内无消费/转账支出口径判断
|
||||||
|
|
||||||
|
要求:
|
||||||
|
|
||||||
|
- 对象维度统一为员工身份证号
|
||||||
|
- 不在 Java 层做二次业务判断
|
||||||
|
- 保留 `reasonDetail` 解释性信息,便于后续结果总览和排障
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,CcdiBankTagServiceImplTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java
|
||||||
|
git commit -m "实现第二期对象聚合规则真实SQL"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 4: 完成第二期回归与全量收口
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `sql/2026-03-16-bank-tagging.sql`
|
||||||
|
- Create: `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md`
|
||||||
|
- Create: `docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md`
|
||||||
|
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceRiskCountRefreshTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Align metadata and remarks**
|
||||||
|
|
||||||
|
校对第二期规则在 `sql/2026-03-16-bank-tagging.sql` 中的元数据,要求:
|
||||||
|
|
||||||
|
- 真实规则不再误写为“占位规则”
|
||||||
|
- 风险等级、结果类型与设计文档一致
|
||||||
|
- 第二期规则与第一期规则口径不冲突
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run final backend regression**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn test -pl ccdi-project -Dtest=CcdiBankTagAnalysisMapperXmlTest,BankTagRuleConfigResolverTest,CcdiBankTagServiceImplTest,CcdiBankTagServiceRiskCountRefreshTest,CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewControllerTest
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
- 19 条目标规则替换完成后,结果总览相关后端链路不回退
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write implementation record**
|
||||||
|
|
||||||
|
在 `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md` 中记录:
|
||||||
|
|
||||||
|
- 第二期 10 条规则范围
|
||||||
|
- 跨表比对与对象聚合口径
|
||||||
|
- 参数和元数据调整
|
||||||
|
- 与第一期衔接关系
|
||||||
|
- 全量收口结论
|
||||||
|
|
||||||
|
- [ ] **Step 4: Write verification record**
|
||||||
|
|
||||||
|
在 `docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md` 中记录:
|
||||||
|
|
||||||
|
- 执行命令
|
||||||
|
- 执行时间
|
||||||
|
- 结果摘要
|
||||||
|
- 最终结论
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add sql/2026-03-16-bank-tagging.sql docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-backend-record.md docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-backend-verification.md
|
||||||
|
git commit -m "补充第二期流水模型后端实施记录"
|
||||||
|
```
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
# Bank Tag Real Rule Phase 1 Frontend Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** 固化第一期银行流水真实规则落地的前端边界,确认本期不改页面结构与交互,只做接口影响核验和联调预期沉淀。
|
||||||
|
|
||||||
|
**Architecture:** 前端继续沿用现有结果总览页面与模型区展示结构,不新增字段、不调整交互、不新增接口调用。第一期真实规则落地只影响后端打标结果和统计数据来源,前端本期只做边界校验、回归验证和文档记录。
|
||||||
|
|
||||||
|
**Tech Stack:** Vue 2, Element UI, Node.js
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: 锁定第一期前端无代码改造边界
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Test: `ruoyi-ui/tests/unit/project-overview-api.test.js`
|
||||||
|
- Test: `ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js`
|
||||||
|
- Test: `ruoyi-ui/tests/unit/preliminary-check-model-linkage-flow.test.js`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
补一个前端边界断言,锁定:
|
||||||
|
|
||||||
|
- 本期不新增前端 API 方法
|
||||||
|
- `PreliminaryCheck.vue` 仍按现有接口集合取数
|
||||||
|
- `RiskModelSection.vue` 不新增规则编码分支判断
|
||||||
|
|
||||||
|
可以在现有测试文件中加入如下静态断言思路:
|
||||||
|
|
||||||
|
```js
|
||||||
|
assert(!source.includes('GAMBLING_SENSITIVE_KEYWORD'))
|
||||||
|
assert(!source.includes('SPECIAL_AMOUNT_TRANSACTION'))
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
node tests/unit/project-overview-api.test.js
|
||||||
|
node tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node tests/unit/preliminary-check-model-linkage-flow.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 若当前测试尚未锁定边界,则至少有 1 个断言需要补充并先失败
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
只补测试断言,不改前端业务代码,确保计划执行时能防止误把后端规则落地扩散成前端结构改造。
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
node tests/unit/project-overview-api.test.js
|
||||||
|
node tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node tests/unit/preliminary-check-model-linkage-flow.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ruoyi-ui/tests/unit/project-overview-api.test.js ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js ruoyi-ui/tests/unit/preliminary-check-model-linkage-flow.test.js
|
||||||
|
git commit -m "锁定第一期流水模型前端边界"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 2: 做第一期前端回归并补文档
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Create: `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase1-frontend-record.md`
|
||||||
|
- Create: `docs/tests/records/2026-03-20-bank-tag-real-rule-phase1-frontend-verification.md`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Run focused frontend regression**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
node tests/unit/project-overview-api.test.js
|
||||||
|
node tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node tests/unit/preliminary-check-model-api.test.js
|
||||||
|
node tests/unit/preliminary-check-model-data-loading.test.js
|
||||||
|
node tests/unit/preliminary-check-model-linkage-flow.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
- 第一期开启真实规则后,前端现有接口依赖和模型区联动结构保持稳定
|
||||||
|
|
||||||
|
- [ ] **Step 2: Write implementation record**
|
||||||
|
|
||||||
|
在 `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase1-frontend-record.md` 中记录:
|
||||||
|
|
||||||
|
- 第一期前端无业务代码改造
|
||||||
|
- 仅做边界锁定与联调预期说明
|
||||||
|
- 前端受影响的仅是后端打标结果数据源更真实
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write verification record**
|
||||||
|
|
||||||
|
在 `docs/tests/records/2026-03-20-bank-tag-real-rule-phase1-frontend-verification.md` 中记录:
|
||||||
|
|
||||||
|
- 执行命令
|
||||||
|
- 执行时间
|
||||||
|
- 结果摘要
|
||||||
|
- 未启动额外前端长期进程;若临时启动,验证后需停止
|
||||||
|
|
||||||
|
- [ ] **Step 4: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase1-frontend-record.md docs/tests/records/2026-03-20-bank-tag-real-rule-phase1-frontend-verification.md
|
||||||
|
git commit -m "补充第一期流水模型前端实施记录"
|
||||||
|
```
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
# Bank Tag Real Rule Phase 2 Frontend Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** 固化第二期银行流水真实规则落地后的前端边界与联调预期,确认本期仍不新增页面字段和交互改造,只做结果链路稳定性验证与文档沉淀。
|
||||||
|
|
||||||
|
**Architecture:** 第二期后端会补齐对象聚合、时间窗口和资产比对类规则,但前端继续只消费既有结果总览接口和模型区接口,不增加规则级展示逻辑。本期前端计划聚焦无改造边界校验、结果链路回归和最终收口记录。
|
||||||
|
|
||||||
|
**Tech Stack:** Vue 2, Element UI, Node.js
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: 锁定第二期前端结构无扩散
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Test: `ruoyi-ui/tests/unit/preliminary-check-summary-and-people.test.js`
|
||||||
|
- Test: `ruoyi-ui/tests/unit/preliminary-check-risk-people-binding.test.js`
|
||||||
|
- Test: `ruoyi-ui/tests/unit/preliminary-check-model-and-detail.test.js`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Write the failing test**
|
||||||
|
|
||||||
|
补静态/绑定断言,锁定:
|
||||||
|
|
||||||
|
- 第二期后端规则收口不引起 `RiskPeopleSection.vue` 新增列
|
||||||
|
- 模型区与风险明细区不增加规则编码硬编码展示
|
||||||
|
- 页面仍按现有 `riskPeople / riskModels / riskDetails` 结构消费结果
|
||||||
|
|
||||||
|
- [ ] **Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
node tests/unit/preliminary-check-summary-and-people.test.js
|
||||||
|
node tests/unit/preliminary-check-risk-people-binding.test.js
|
||||||
|
node tests/unit/preliminary-check-model-and-detail.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 若边界断言未写,则至少有 1 个测试需要先失败
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write minimal implementation**
|
||||||
|
|
||||||
|
只补测试边界,不改前端业务代码。目标是避免在第二期后端复杂规则落地时,把结果字段变化误扩散成页面结构改造。
|
||||||
|
|
||||||
|
- [ ] **Step 4: Run test to verify it passes**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
node tests/unit/preliminary-check-summary-and-people.test.js
|
||||||
|
node tests/unit/preliminary-check-risk-people-binding.test.js
|
||||||
|
node tests/unit/preliminary-check-model-and-detail.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ruoyi-ui/tests/unit/preliminary-check-summary-and-people.test.js ruoyi-ui/tests/unit/preliminary-check-risk-people-binding.test.js ruoyi-ui/tests/unit/preliminary-check-model-and-detail.test.js
|
||||||
|
git commit -m "锁定第二期流水模型前端边界"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 2: 做第二期前端收口回归并补文档
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Create: `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-frontend-record.md`
|
||||||
|
- Create: `docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-frontend-verification.md`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Run final frontend regression**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
node tests/unit/project-overview-api.test.js
|
||||||
|
node tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node tests/unit/preliminary-check-summary-and-people.test.js
|
||||||
|
node tests/unit/preliminary-check-risk-people-binding.test.js
|
||||||
|
node tests/unit/preliminary-check-model-api.test.js
|
||||||
|
node tests/unit/preliminary-check-model-data-loading.test.js
|
||||||
|
node tests/unit/preliminary-check-model-match-mode.test.js
|
||||||
|
node tests/unit/preliminary-check-model-filters.test.js
|
||||||
|
node tests/unit/preliminary-check-model-table-columns.test.js
|
||||||
|
node tests/unit/preliminary-check-model-linkage-flow.test.js
|
||||||
|
node tests/unit/preliminary-check-model-and-detail.test.js
|
||||||
|
node tests/unit/preliminary-check-states.test.js
|
||||||
|
node tests/unit/preliminary-check-layout.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `PASS`
|
||||||
|
- 第二期后端规则全量收口后,前端现有结果总览结构仍稳定
|
||||||
|
|
||||||
|
- [ ] **Step 2: Write implementation record**
|
||||||
|
|
||||||
|
在 `docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-frontend-record.md` 中记录:
|
||||||
|
|
||||||
|
- 第二期前端仍无业务代码改造
|
||||||
|
- 主要工作为结构边界锁定、联调预期确认与全量收口记录
|
||||||
|
- 后端真实规则全量落地后,前端继续消费既有接口
|
||||||
|
|
||||||
|
- [ ] **Step 3: Write verification record**
|
||||||
|
|
||||||
|
在 `docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-frontend-verification.md` 中记录:
|
||||||
|
|
||||||
|
- 执行命令
|
||||||
|
- 执行时间
|
||||||
|
- 结果摘要
|
||||||
|
- 未启动额外前端长期进程;若临时启动,验证后需停止
|
||||||
|
|
||||||
|
- [ ] **Step 4: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add docs/reports/implementation/2026-03-20-bank-tag-real-rule-phase2-frontend-record.md docs/tests/records/2026-03-20-bank-tag-real-rule-phase2-frontend-verification.md
|
||||||
|
git commit -m "补充第二期流水模型前端实施记录"
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user