--- req_id: REQ-USR-001 date: 2026-05-06 round: 2 reviewer: superpower-code-reviewer --- # Review: REQ-USR-001 — round 2 ## 结论 approve ## Must-fix (无) Round 1 两条 must_fix 处理结果: 1. **HIGH(reviewer 误判)**:`UserServiceImpl.java:102` 实际已含 `up.setTCreateDate(LocalDateTime.now());`,round 1 reviewer 看错。fix commit 520c01f 正确不动代码。 2. **MEDIUM(已修)**:spec/plan 中 `bSelected` 提及全部转为「无该列」注解,与 docs/03 SSoT + UserPermissionEntity 实现一致(fix commit 520c01f)。 ## Nice-to-have(待 sweep) - backend/src/main/java/com/xly/erp/common/response/ErrorCode.java — 3 个新常量(STAFF_NOT_FOUND / PERM_CATEGORY_NOT_FOUND / USR_USER_NAME_OR_NO_DUP)追 Javadoc,特别 `STAFF_NOT_FOUND(40421)` 与 `MOD_NOT_FOUND(40421)` 段位共享但语义不同——Javadoc 注明使用模块差异,避免 IDE 跳错枚举。 - backend/src/main/java/com/xly/erp/module/usr/service/impl/UserServiceImpl.java:30 — `INITIAL_PASSWORD = "666666"` 外置到 `application.yml` + `@Value("${xly.user.initial-password:666666}")`,便于环境差异化 + REQ-USR-004 登录校验复用。 - backend/src/test/java/com/xly/erp/module/usr/controller/UserControllerIT.java — 补 `post_staffSoftDeleted_returns40421`、`post_duplicateUserNo_returns40921` 两条 IT 镜像 service 单测分支。 - backend/src/main/java/com/xly/erp/module/usr/service/impl/UserServiceImpl.java:70 — `permissionCategoryIds` 含重复 id 时 found.size() < ids.size() 误报 40422;可在校验前 distinct。 - docs/05 § REQ-USR-001 错误码段位 40020 vs spec 落地 40010 sweep 对齐。 - docs/superpowers/plans/2026-05-06-REQ-USR-001.md Task 5 API shape — Javadoc 注释笔误 `REQ-MOD-001 用户新增`,Controller.java 内已正确为 `REQ-USR-001`;plan 同步修正即可。 ## 反例 / 测试覆盖缺口 1. spec § 验收 #6(iStaffId 已软删除)IT 层未覆盖(仅 service mock 单测覆盖)。 2. spec § 验收 #4 sUserNo 唯一冲突 IT 层未直接覆盖(仅 sUserName 冲突的 IT)。 3. spec § 业务规则 8 「DuplicateKeyException 端到端映射 40921」无 IT 触发路径(@Transactional 包裹下不易触发;service mock 已覆盖,gap 可接受)。 4. 跨 round 1 / round 2:fix commit 520c01f 仅触及 3 份 docs,0 行代码变更;UserServiceImpl / UserPermissionEntity / 测试均保持原样,无新引入风险。`scripts/test.sh` 全量 101/0/0/0 BUILD SUCCESS。 **核心结论**:round 1 must_fix #1 是 reviewer 误判(无需修),#2 已修。所有 IT + 单元测试 101 个全绿。verdict: approve。