2026-05-06-REQ-MOD-001.md 3.98 KB

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

reviewer: superpower-code-reviewer

Review: REQ-MOD-001 — round 1

结论

approve

Must-fix

(无)

Nice-to-have

  • backend/src/main/java/com/xly/erp/common/exception/GlobalExceptionHandler.java:30 — 兜底 @ExceptionHandler(Exception.class) 会吃掉 HttpMessageNotReadableException / HttpRequestMethodNotSupportedException / MissingServletRequestParameterException 等参数类异常并映射到 50000;语义上更接近 40010。建议下一个 REQ 顺手为这几类异常补独立 handler。
  • backend/src/main/java/com/xly/erp/config/SecurityConfig.java:18 — csrf -> csrf.disable() 等三处 lambda 可改用方法引用 AbstractHttpConfigurer::disable,更符合 Spring Security 6 官方示例风格。
  • backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:39 — .eq(ModuleEntity::getBDeleted, false) 可读性建议统一用 Boolean.FALSE 或抽常量,依赖 JDBC 默认转换不影响正确性。
  • backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:26 / Controller / Mapper / Entity — spec § 代码与文档要求关键类贴 // REQ-MOD-001 模块新增 标签;目前 Controller 仅有 REQ-USR-004 备忘注释,缺 REQ-MOD-001 标签,Service / Mapper / Entity / DTO / VO 也均未显式标。建议补一行类级注释。
  • backend/src/main/java/com/xly/erp/config/JacksonConfig.java:18 — JacksonConfig 是计划外补丁(修复匈牙利前缀字段 JSON 序列化);plan 文件清单未列出。建议补一条 ObjectMapper 序列化测试断言 iIncrement 而非 IIncrement,把这个隐式契约钉死。
  • backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:55 — post_validRootModule 应额外断言 VO 字段值(sDisplayType / sModuleNameZh / iSortOrder / tCreateDate / bShowPermission),spec 验收 § 1 要求"DB 中查询新记录字段与入参一致"。
  • backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:77 — post_validChildModule 没有断言 iSortOrder / bShowPermission / sCreatedBy 留 NULL 等持久化字段,建议补 select-after-insert 验证。
  • backend/src/main/java/com/xly/erp/common/response/ApiResponse.java:28 — fail(ErrorCode ec, String detail) 把 message 替换为 detail,前端会吃到带英文字段名的中文混合串。建议将 detail 单列字段或保留 ec.getMessage() 作为 message。
  • backend/src/main/resources/application.yml:21 — 全局 map-underscore-to-camel-case: false 对未来非匈牙利前缀字段有传染影响;当前 entity 已显式 @TableField,可改回 MyBatis-Plus 默认 true。

反例 / 测试覆盖缺口

  1. spec § 验收 § 功能正确性 1 要求"DB 中查询新记录字段与入参一致"——目前 ControllerIT 只断言 3 个字段、未回查 DB;ModuleMapperIT 单独覆盖 mapper 层往返,端到端层面字段一致性不直观。
  2. spec § 测试覆盖列出"并发同 sProcedureName"用例标可选,未实现——可接受。
  3. spec § 业务规则 5 要求 bDeleted=0 / tDeletedDate=NULL / sDeletedBy=NULL / sBrandsId/sSubsidiaryId/sCreatedBy=NULL 在 INSERT 后真正落库——ModuleServiceImplTest 用 mock 不能验证 entity 在传给 mapper.insert 前的赋值;建议加 ArgumentCaptor 断言。
  4. Controller 层缺 HttpMessageNotReadableException 用例(POST 非法 JSON 当前会走 50000 兜底);spec 未显式要求,但 docs/04 § 1.4 友好错误码原则下属盲区。
  5. 计划清单列出的 MybatisPlusConfig.java 未创建——plan 自身注明"REQ-MOD-001 不用,先建空骨架",YAGNI 角度可接受;建议在 plan 上同步勾掉或删除该行。
  6. 未发现硬编码凭据、未跨模块改动、未引入技术栈外组件、commit 全部带 REQ-MOD-001 标签、响应不回显堆栈——全部合规。spec 写明的 REQ-USR-004 技术债(permitAll + 多租户字段 NULL + sCreatedBy NULL)落地受控,无失控扩散。