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