diff --git a/docs/plans/backend/2026-03-20-bank-tag-real-rule-phase1-backend-implementation.md b/docs/plans/backend/2026-03-20-bank-tag-real-rule-phase1-backend-implementation.md new file mode 100644 index 00000000..93032287 --- /dev/null +++ b/docs/plans/backend/2026-03-20-bank-tag-real-rule-phase1-backend-implementation.md @@ -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 "补充第一期流水模型后端实施记录" +``` diff --git a/docs/plans/backend/2026-03-20-bank-tag-real-rule-phase2-backend-implementation.md b/docs/plans/backend/2026-03-20-bank-tag-real-rule-phase2-backend-implementation.md new file mode 100644 index 00000000..a5ca7eeb --- /dev/null +++ b/docs/plans/backend/2026-03-20-bank-tag-real-rule-phase2-backend-implementation.md @@ -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 "补充第二期流水模型后端实施记录" +``` diff --git a/docs/plans/frontend/2026-03-20-bank-tag-real-rule-phase1-frontend-implementation.md b/docs/plans/frontend/2026-03-20-bank-tag-real-rule-phase1-frontend-implementation.md new file mode 100644 index 00000000..250431cb --- /dev/null +++ b/docs/plans/frontend/2026-03-20-bank-tag-real-rule-phase1-frontend-implementation.md @@ -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 "补充第一期流水模型前端实施记录" +``` diff --git a/docs/plans/frontend/2026-03-20-bank-tag-real-rule-phase2-frontend-implementation.md b/docs/plans/frontend/2026-03-20-bank-tag-real-rule-phase2-frontend-implementation.md new file mode 100644 index 00000000..6464ece5 --- /dev/null +++ b/docs/plans/frontend/2026-03-20-bank-tag-real-rule-phase2-frontend-implementation.md @@ -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 "补充第二期流水模型前端实施记录" +```