Commit a6badd20e60a7c5dc097b809dabec3fcc1241b12
1 parent
087eb8f5
docs(mod): review approved + check off REQ-MOD-003
Showing
2 changed files
with
34 additions
and
1 deletions
docs/08-模块任务管理.md
docs/superpowers/reviews/2026-04-29-REQ-MOD-003.md
0 → 100644
| 1 | +--- | |
| 2 | +req_id: REQ-MOD-003 | |
| 3 | +date: 2026-04-29 | |
| 4 | +round: 1 | |
| 5 | +reviewer: superpower-code-reviewer | |
| 6 | +--- | |
| 7 | + | |
| 8 | +# Review: REQ-MOD-003 — round 1 | |
| 9 | + | |
| 10 | +## 结论 | |
| 11 | +approve | |
| 12 | + | |
| 13 | +## Must-fix | |
| 14 | +(无) | |
| 15 | + | |
| 16 | +## Nice-to-have | |
| 17 | + | |
| 18 | +- backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:291 — `deleteValidId_with_jwt_returns200_andSoftDeletes` 仅断言 `sProcedureName` / `sCreatedBy` 不变,spec § 验收 第 95 行明确要求同时断 `sBrandsId`。建议把 SELECT 列表追加 `sBrandsId, sSubsidiaryId, tCreateDate, iSortOrder` 并加断言(service 单测已 captureArgument 验证 entity 上字段为 null + 依赖 NOT_NULL 策略,IT 端到端双保险更稳)。 | |
| 19 | +- backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java:362 — `deleteWithoutJwt_permitAllStub_returns200_andDeletedByIsSTUB` 沿袭 MOD-001/002 stub 用例缺 `// REQ-MOD-001 stub: see USR-004 follow-up` 锚点注释;USR-004 上线时一次性 grep 替换为 401 会漏这条。 | |
| 20 | +- backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:112 — `moduleMapper.updateById(entity)` 返回值(受影响行数)丢弃;并发场景下 selectById 与 updateById 之间另一线程已软删则 affected=0 而方法仍返回成功,覆盖之前的 `tDeletedDate` / `sDeletedBy`。可断言 affected==1 否则抛 BizException(40400)。同 MOD-002 update review 同源问题,stub 期接受。 | |
| 21 | +- backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:97 — `delete()` 方法缺行内 `// REQ-MOD-003: 模块删除` 锚点(CLAUDE.md § 编码行为约束 #4 要求 REQ-XXX-NNN 行内可追溯);MOD-001/002 的 create/update 也缺,建议三处统一补。 | |
| 22 | +- backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:97 — 删除路径未加悲观锁(无 SELECT … FOR UPDATE);spec 声明非幂等单实例顺序满足,多副本并发可能重复进入。建议未来用乐观条件 UPDATE WHERE iIncrement=? AND bDeleted=0 收口,本期接受。 | |
| 23 | + | |
| 24 | +## 反例 / 测试覆盖缺口 | |
| 25 | + | |
| 26 | +Spec 验收清单(service 5 + mapperIT 1 + controllerIT 6 + 工程 3)端到端实现 53/53 全绿。校验顺序(目标存在 → 子模块 → 写库)与 spec 一致;软删除字段策略与 MOD-001/002 风格统一;mapper `findActiveChildFlag` 用 SELECT 1 LIMIT 1 高效;JWT 伪造路径 IT 通过 filter 短路确认 service 未触发(`bDeleted` 仍 0);40902 外部引用拦截在 spec 双处显式声明本期不实现并指明 USR/后续模块入口;SecurityContextHelper 处理 anonymous 的方式与 MOD-001/002 一致;测试隔离用 sProcedureName LIKE 'sp_test_%' + Before/AfterEach 双清健壮。 | |
| 27 | + | |
| 28 | +非阻塞缺口: | |
| 29 | +1. `deleteValidId` IT 未断言 `sBrandsId` 等保留列(spec 明言)。 | |
| 30 | +2. `// REQ-MOD-001 stub: see USR-004 follow-up` 锚点未在 MOD-003 stub 用例上贴。 | |
| 31 | +3. `updateById` 返回值未校验,并发覆盖窗口存在。 | |
| 32 | +4. service 方法缺行内 REQ 锚点(MOD-001/002/003 同源)。 | |
| 33 | +5. 40902 外部引用待 USR/后续模块落地后回填。 | ... | ... |