فهرست منبع

docs(sdd): 记录任务 4 计划缺陷 20 并同步 PROJECT-OVERVIEW 进度

iwt 2 روز پیش
والد
کامیت
13c770cb87
2فایلهای تغییر یافته به همراه6 افزوده شده و 3 حذف شده
  1. 1 1
      docs/superpowers/PROJECT-OVERVIEW.md
  2. 5 2
      docs/superpowers/plans/2026-10-04-plan-review-workbench.md

+ 1 - 1
docs/superpowers/PROJECT-OVERVIEW.md

@@ -383,7 +383,7 @@
 
 | 文件 | 状态 | 说明 |
 |------|:----:|------|
-| `2026-10-04-plan-review-workbench.md` | 🟡 进行中(15 任务,任务 0-3 已完成:0 修 test-compile 基线、1 GuideFamilyAccessGuard、2 confirmBind 重绑复位、3 七个端点接入绑定校验;任务 4-8 后端守卫/审核端点 → 9-13 前端 3 页面 + 分包注册 + families.vue 入口 → 14 文档同步与禁区检查) | 规划师审核工作台实现计划(拆 2 层编排:后端并行 + 前端并行;验收门为 `mvn test-compile` + 纯 Mockito 单测,不依赖真实数据库。⚠️ `pom.xml:28` 有 `<skipTests>true</skipTests>`,跑单测必须显式 `-DskipTests=false`,否则只输出 `Tests are skipped` 的假通过) |
+| `2026-10-04-plan-review-workbench.md` | 🟡 进行中(15 任务,任务 0-4 已完成:0 修 test-compile 基线、1 GuideFamilyAccessGuard、2 confirmBind 重绑复位、3 七个端点接入绑定校验、4 rejectPlan 状态守卫 + getPlanForFamily IDOR 反查;任务 5-8 后端审核端点 → 9-13 前端 3 页面 + 分包注册 + families.vue 入口 → 14 文档同步与禁区检查) | 规划师审核工作台实现计划(拆 2 层编排:后端并行 + 前端并行;验收门为 `mvn test-compile` + 纯 Mockito 单测,不依赖真实数据库。⚠️ `pom.xml:28` 有 `<skipTests>true</skipTests>`,跑单测必须显式 `-DskipTests=false`,否则只输出 `Tests are skipped` 的假通过) |
 | `2026-09-10-report-quick-analyze.md` | 🟡 待执行(5 任务:Redis 依赖/配置 + AIChatController 抽 buildChatInputs 新增 report/analyze 端点 + api.js 封装 + report-detail 浮层 + 验证) | 报告快速分析实现计划 |
 | `2026-09-10-key-person-expansion-octopus.md` | 🟡 待执行(12 任务:迁移305-307 三表 + 3实体/Mapper/Service/Controller + 新 OctopusDiagram 三层画布 + 成效/关键人录入页 + action-detail 集成 + API 文档同步 + 旧章鱼图清理) | 关键人拓展章鱼图替换实现计划 |
 | `2026-08-18-homepage-health-funnel.md` | ✅ 已完成(登录态四段式重排 + 自测大卡 + 方法与计算属性 + 样式;未登录态零改动) | 首页健康漏斗实现计划 |

+ 5 - 2
docs/superpowers/plans/2026-10-04-plan-review-workbench.md

@@ -851,7 +851,9 @@ class HealthPlanReviewGuardTest {
 
     @Test
     void getPlanForFamily_匹配返回方案() {
-        when(mapper.selectById(99L)).thenReturn(planWithStatus("pending_review"));
+        HealthPlan plan = planWithStatus("pending_review");
+        plan.setId(99L);
+        when(mapper.selectById(99L)).thenReturn(plan);
         HealthPlan p = service.getPlanForFamily(99L, 10L);
         assertNotNull(p);
         assertEquals(Long.valueOf(99L), p.getId());
@@ -2673,4 +2675,5 @@ cd /sc-data/cfc && git diff --name-only HEAD~14 HEAD | grep -E "chat\.vue|schema
 16. `generateDailyTasksFromPlan` 返回 `void` 且有 2 处提前 return、被 3 处调用,初版「改成返回 int」风险过高 → 改为生成后查库统计。
 17. `src/test/resources` 为空,`@SpringBootTest` 连真实 DB,`mvn test` 全量不可能稳定 `BUILD SUCCESS` → 改用分层验证口径。
 18. guard 返回 `Result<Void>`,而各端点返回 `Result<Map<String,Object>>` / `Result<Page<Task>>` / `Result<List<Task>>` / `Result<Boolean>`;**Java 泛型不变**,初版写法 `if (denied != null) return denied;` 编译失败(7 处)→ 改为 `return Result.error(denied.getCode(), denied.getMessage());`,既通过编译又原样保留 403 与文案。
-19. 改 6 个方法签名会破坏**两个**测试文件:除修订 14 已列的 `GuideFamilyTaskControllerTest`(15 处调用)外,还有 `GuideRolePermissionTest`(4 处调用),修订 14 仍遗漏 → 两个文件都需补 `@MockBean GuideFamilyAccessGuard`(Mockito 默认返回 `null` 等价放行,既有用例断言不受影响)。
+19. 改 6 个方法签名会破坏**两个**测试文件:除修订 14 已列的 `GuideFamilyTaskControllerTest`(15 处调用)外,还有 `GuideRolePermissionTest`(4 处调用),修订 14 仍遗漏 → 两个文件都需补 `@MockBean GuideFamilyAccessGuard`(Mockito 默认返回 `null` 等价放行,既有用例断言不受影响)。
+20. 任务 4 测试辅助方法 `planWithStatus` 固定 `setId(5L)`,而 `getPlanForFamily_匹配返回方案` 用 `selectById(99L)` 打桩却断言 `getId()==99` → 必然失败(实测 `expected: <99> but was: <5>`)→ 该用例需显式 `plan.setId(99L)` 后再打桩。注意同一辅助方法在 `不属于该家庭返回null` 用例中无害(只断言 null)。