2026-05-06-REQ-MOD-004.md 3.25 KB

req_id: REQ-MOD-004 date: 2026-05-06 round: 1

reviewer: superpower-code-reviewer

Review: REQ-MOD-004 — round 1

结论

approve

Must-fix

(无)

Nice-to-have

  • backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:530 — 补 IT 覆盖 spec § 验收 #7『同级排序』:插入 root(iSortOrder=2) + root(iSortOrder=1),断言 GET 返回数组首个 iIncrement 是 sort=1 那条。当前同级排序仅在单测覆盖,缺端到端断言。
  • backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:530 — 补 IT 覆盖 spec § 验收 #6『keyword 含中英混合』:插入 sModuleNameZh='user 用户',GET ?keyword=user 用户 命中。
  • backend/src/test/java/com/xly/erp/module/mod/service/ModuleServiceImplTest.java:497 — tree_softDeletedExcluded 仅 verify(...).selectList(any()),未捕 wrapper 形状(plan 要求 ArgumentCaptor)。建议改名或真用 ArgumentCaptor 抽 wrapper.getTargetSql() 断言含 bDeleted = 0
  • backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:227 — Comparator 对 iSortOrder 做了 null→0 防御,但 docs/03 已注明 NOT NULL;可简化为 Comparator.comparingInt(ModuleTreeNodeVO::getISortOrder).thenComparingInt(::getIIncrement)
  • backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:198 — survivorIds = byId.keySet() 是 live view,与 keyword 分支返回的独立 HashSet 类型不一致;建议改成 new HashSet<>(byId.keySet()) 一致化。
  • backend/pom.xml:121 — surefire includes 修改是项目级配置;建议在 docs/04 测试规范节追加一行说明『*IT.java 走 surefire (mvn test) 而非 failsafe (mvn verify)』,避免后续贡献者破坏 includes。
  • docs/03-数据库设计文档.md § tModule 业务注记 — 建议追加一行『模块树最大深度 5 层(iParentId 自引用),由 service 层校验,REQ-MOD-002 / REQ-MOD-004 引用本约束』,把深度上限提升为 SSoT。
  • backend/src/main/java/com/xly/erp/module/mod/dto/ModuleQueryDTO.java:11 — 在 @Size 上方 javadoc 写明『empty 视为不过滤』。

反例 / 测试覆盖缺口

  1. spec § 验收 #7 同级排序的端到端 IT 缺失(仅单测)。
  2. spec § 验收 #6 中英混合 keyword 没有专属 IT。
  3. tree_softDeletedExcluded 单测断言强度低于 plan 期望。
  4. 反例缺:keyword 含 SQL 通配符 % / _(spec 声明本期不转义,作为已知边界)。
  5. 反例缺:祖先链深度 ≥ 5 的截断边界用例;docs/03 已限深度 5,正常打不到边界,可后续补 6 层强构数据单测固化截断语义。
  6. Controller javadoc 标了『REQ-USR-004 完成后追加 @PreAuthorize』但缺集中跟踪——建议在 docs/08 § 二 USR-004 子项挂 follow-up 备注。

核心结论:实现忠实于 spec — keyword 过滤 + 祖先链 walk-up + 内存树构造 + 同级 (iSortOrder, iIncrement) 排序 + 叶子 children=[] 全部正确。API 契约字段精简到位(VO 7 个公开字段 + children)。surefire includes 修复是揭示性发现——本仓库之前 *IT.java 没在 mvn test 跑过,REQ-MOD-001/002/003 的 IT 都是"死代码";本 REQ commit body 已披露,REQ-MOD-004 的 IT 是首次在 mvn test 跑通。