diff --git a/docs/08-模块任务管理.md b/docs/08-模块任务管理.md index 057203b..9780c1e 100644 --- a/docs/08-模块任务管理.md +++ b/docs/08-模块任务管理.md @@ -63,4 +63,4 @@ - [x] REQ-USR-004 用户登录 - [x] REQ-USR-001 增加用户 - [x] REQ-USR-003 查询用户 - - [ ] REQ-USR-002 修改用户 + - [x] REQ-USR-002 修改用户 diff --git a/docs/superpowers/reviews/2026-05-08-REQ-USR-002.md b/docs/superpowers/reviews/2026-05-08-REQ-USR-002.md index e27fd1c..af5fe0a 100644 --- a/docs/superpowers/reviews/2026-05-08-REQ-USR-002.md +++ b/docs/superpowers/reviews/2026-05-08-REQ-USR-002.md @@ -1,27 +1,29 @@ --- req_id: REQ-USR-002 date: 2026-05-08 -round: 1 +round: 2 reviewer: superpower-code-reviewer --- -# Review: REQ-USR-002 — round 1 +# Review: REQ-USR-002 — round 2 ## 结论 -request-changes +approve ## Must-fix -- [HIGH] backend/src/main/java/com/example/erp/module/usr/dto/UserUpdateReqDTO.java:12-13 — userType / language 缺少 @NotBlank + @Pattern 校验,非法值直接写库(建议:参照 UserCreateReqDTO 添加 @NotBlank + @Pattern 注解) -- [HIGH] frontend/src/pages/usr/UserFormDrawer.tsx:8-14 — InitialData 接口缺少 permGroupIds 字段,导致有权限组的用户打开编辑抽屉时权限组无法被预填(建议:添加 permGroupIds?: string[],useEffect 改为 setSelectedPermIds(initialData.permGroupIds ?? [])) -- [HIGH] frontend/src/pages/usr/UserListPage.tsx:124 — canEditDoc 写死为 false,每次保存会将已有用户的 canEditDoc 覆盖为 false(建议:在列表查询中加入 bCanEditDoc,传入 initialData 时使用真实值) -- [MEDIUM] backend/src/test/java/com/example/erp/module/usr/UserServiceTest.java — 缺少测试 userId==自己 但 userType 仍为 "超级管理员" 时不抛出 40301(建议:补充 updateUser_selfAdminKeepType_doesNotThrow 测试,确认允许路径) +(无) + +Round 1 全部 must-fix 已正确修复: +- M1 ✓ `updateUser_selfAdminKeepType_doesNotThrow` 测试已添加(含 userMapper.update stub) +- M2 ✓ `UserUpdateReqDTO` 已添加 @NotBlank/@Pattern/@NotNull 校验注解 +- M3 ✓ `UserFormDrawer.InitialData` 已添加 permGroupIds 字段,useEffect 用 `?? []` 初始化 +- M4 ✓ `UserListItemVO` 已添加 bCanEditDoc,mapper SELECT 已加列,UserListPage 传真实值 ## Nice-to-have -- backend/.../vo/UserUpdateRespVO.java — updatedAt 建议加 @JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss") 确保序列化格式显式 -- backend/.../dto/UserUpdateReqDTO.java — permGroupIds 建议加 @NotNull,防止调用方传 null 时静默跳过权限组删除 -- frontend/src/test/UserListPage.test.tsx:106 — editMode_submit_callsUpdateUser 只断言调用次数,建议补充 toHaveBeenCalledWith('u1', ...) 验证 userId 传值正确 +- backend/.../vo/UserUpdateRespVO.java — updatedAt 建议添加 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") 符合 docs/04 § 3.3 规范 +- frontend/src/test/UserListPage.test.tsx:106 — editMode_submit_callsUpdateUser 可补 toHaveBeenCalledWith('u1', ...) 断言 userId 参数正确 +- frontend/src/pages/usr/UserListPage.tsx:121-128 — initialData 未传 permGroupIds(因列表 API 无此字段),与规格 line 103 说明一致,属有意为之,建议加注释说明 ## 反例 / 测试覆盖缺口 -- 缺 "自己修改自己 userType 但保持 超级管理员" 的无异常路径测试(G1) -- controller 层无 BizException → 错误码映射测试(G4,40300/40400/40301 未被 controller 测试覆盖) -- canEditDoc/isDisabled 写入 DB 的 int 映射值(0/1)未在 service happy-path 测试中验证 +- controller 层 BizException 40300/40400/40301 → 错误码 JSON 映射缺测试(低风险,handler 已在 createUser 路径覆盖) +- happy-path 未用 ArgumentCaptor 断言 bCanEditDoc/bIsDisabled 映射为正确 int 值(低风险)