Browse Source

chore: auto bump version and changelog [skip ci]

iwt 1 day ago
parent
commit
61fc6049a4

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-6be111656056cd386f98c608ff1331b34b2af131
+242a0ba763f631ca1e298c4e9c4174968bc989f0

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.1499",
+  "version": "1.0.1501",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.1499",
+      "version": "1.0.1501",
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",

+ 1 - 1
cfc-web/package.json

@@ -1,6 +1,6 @@
 {
   "name": "cfc-web",
-  "version": "1.0.1501",
+  "version": "1.0.1502",
   "private": true,
   "scripts": {
     "dev": "vue-cli-service serve",

+ 3 - 0
cfc-web/public/CHANGELOG-v1.0.md

@@ -6,9 +6,12 @@
 
 ## v1.0.1501 (2026-10-04)
 
+<<<<<<< Updated upstream
 ### Bug 修复
 - env-version default develop->release,修复 getwxacode 41030 invalid page rid [skip ci]
 
+=======
+>>>>>>> Stashed changes
 ### 文档
 - 记录任务 9 计划缺陷 26 并同步 PROJECT-OVERVIEW 进度
 

+ 3 - 0
cfc-web/public/CHANGELOG.md

@@ -10,9 +10,12 @@
 
 ## v1.0.1501 (2026-10-04)
 
+<<<<<<< Updated upstream
 ### Bug 修复
 - env-version default develop->release,修复 getwxacode 41030 invalid page rid [skip ci]
 
+=======
+>>>>>>> Stashed changes
 ### 文档
 - 记录任务 9 计划缺陷 26 并同步 PROJECT-OVERVIEW 进度
 

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

@@ -383,7 +383,7 @@
 
 | 文件 | 状态 | 说明 |
 |------|:----:|------|
-| `2026-10-04-plan-review-workbench.md` | 🟡 进行中(15 任务,任务 0-7 已完成:0 修 test-compile 基线、1 GuideFamilyAccessGuard、2 confirmBind 重绑复位、3 七个端点接入绑定校验、4 rejectPlan 状态守卫 + getPlanForFamily IDOR 反查、5 approveAndPublish 返回 taskGenerated(新增 PlanApproveResultDTO)、6 GuidePlanReviewController 方案审核 4 端点(含 planId IDOR 反查,6/6 绿)、7 GuideFamilyQueryService/Controller 新增 my-families + members 端点(授权源与 isBound 同源,4/4 绿)、8 后端整体验证(compile/test-compile EXIT 0 + 五个新增单测类共 32 个用例全绿 + 全仓 1688 条映射零重复路由)、9 utils/api.js 新增审核工作台 8 个 API 封装(各导出唯一,语法校验须用 .mjs 副本);任务 10-13 前端 3 页面 + 分包注册 + families.vue 入口 → 14 文档同步与禁区检查) | 规划师审核工作台实现计划(拆 2 层编排:后端并行 + 前端并行;验收门为 `mvn test-compile` + 纯 Mockito 单测,不依赖真实数据库。⚠️ `pom.xml:28` 有 `<skipTests>true</skipTests>`,跑单测必须显式 `-DskipTests=false`,否则只输出 `Tests are skipped` 的假通过。⚠️ 路由查重必须按「类级 @RequestMapping 前缀 + 方法级字面量」归一化比较,只比方法字面量会产生假阳性) |
+| `2026-10-04-plan-review-workbench.md` | 🟢 已实施(15 任务全部完成:0 修 test-compile 基线、1 GuideFamilyAccessGuard、2 confirmBind 重绑复位、3 七个端点接入绑定校验、4 rejectPlan 状态守卫 + getPlanForFamily IDOR 反查、5 approveAndPublish 返回 taskGenerated(新增 PlanApproveResultDTO)、6 GuidePlanReviewController 方案审核 4 端点(含 planId IDOR 反查,6/6 绿)、7 GuideFamilyQueryService/Controller 新增 my-families + members 端点(授权源与 isBound 同源,4/4 绿)、8 后端整体验证(compile/test-compile EXIT 0 + 五个新增单测类共 32 个用例全绿 + 全仓 1688 条映射零重复路由)、9 utils/api.js 新增审核工作台 8 个 API 封装(各导出唯一,语法校验须用 .mjs 副本)、10 review-workbench.vue 审核台首页、11 review-family.vue 单家庭双 Tab(Task 用 deadline 非 dueDate;HealthPlan 无 title)、12 plan-detail.vue 方案详情(含 taskGenerated=false 部分成功提示;updatePlanContent 用 `if (planJson != null)` 守卫,3 参调用不会清空 plan_json)、13 pages.json 分包注册 3 页面(裸 path)+ families.vue 加入口、14 文档同步 API_REFERENCE 4.47;计划本身核实并修正 26 处初版事实错误) | 规划师审核工作台实现计划(拆 2 层编排:后端并行 + 前端并行;验收门为 `mvn test-compile` + 纯 Mockito 单测,不依赖真实数据库。⚠️ `pom.xml:28` 有 `<skipTests>true</skipTests>`,跑单测必须显式 `-DskipTests=false`,否则只输出 `Tests are skipped` 的假通过。⚠️ 路由查重必须按「类级 @RequestMapping 前缀 + 方法级字面量」归一化比较,只比方法字面量会产生假阳性) |
 | `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` | ✅ 已完成(登录态四段式重排 + 自测大卡 + 方法与计算属性 + 样式;未登录态零改动) | 首页健康漏斗实现计划 |
@@ -477,7 +477,7 @@
 | `2026-09-12-doa-family-goal-design.md` | 🟢 设计完成 | DOA 家庭打卡个人目标-周计划-周复盘设计(并列共同挑战新模块,5 领域/自选周期/家人可见/代管不能登录成员;设计稿:2026-09-12-doa-family-goal-design.md) |
 | `2026-09-12-vendor-order-review-design.md` | ✅ 已实施 | 供应商订单审核设计(pending 订单可修改价格/配送方式/添加临时优惠券/赠品,自动重算金额) |
 | `2026-09-19-task-orchestration-design.md` | 🟡 设计已确认(待写实现计划) | 任务编排系统设计(含环 DAG:多前置 AND/OR + 后置 timeout/failed 兜底 + 计数/条件循环终止 + Quartz 轮询 + jsPlumb 可视化画布;节点执行创建 tasks 实例复用积分体系;4 张新表) |
-| `2026-10-04-plan-review-workbench-design.md` | 🟢 设计已确认(实现计划已生成,见 `plans/2026-10-04-plan-review-workbench.md`,待实施) | 规划师审核工作台设计(A1:新增 6 个 `/api/guide/families/*` 端点 + 3 个前端页面;授权源统一为 `guide_families`(`status='binding'`);修复 3 处阻塞缺陷——`GuideFamilyTaskController` 7 个带 `{familyId}` 端点跨家庭越权、`confirmBind` 重绑不复活 status、`rejectPlan` 缺状态守卫;并使 approve 任务生成失败不再静默。轨 A 后续:A2 提醒/消息中心、A3 测评链路;轨 B:B1 合伙人分佣、B2 免费/收费服务合同) |
+| `2026-10-04-plan-review-workbench-design.md` | 🟢 已实施(实现计划已全部完成,见 `plans/2026-10-04-plan-review-workbench.md`) | 规划师审核工作台设计(A1:新增 6 个 `/api/guide/families/*` 端点 + 3 个前端页面;授权源统一为 `guide_families`(`status='binding'`);修复 3 处阻塞缺陷——`GuideFamilyTaskController` 7 个带 `{familyId}` 端点跨家庭越权、`confirmBind` 重绑不复活 status、`rejectPlan` 缺状态守卫;并使 approve 任务生成失败不再静默。轨 A 后续:A2 提醒/消息中心、A3 测评链路;轨 B:B1 合伙人分佣、B2 免费/收费服务合同。实现计划:`plans/2026-10-04-plan-review-workbench.md`) |
 
 ---
 

+ 28 - 1
docs/superpowers/api/API_REFERENCE.md

@@ -1479,7 +1479,34 @@ interactionType 取值:`PHONE` / `WECHAT` / `MEETING` / `OTHER`。
 - 入选范围限定 `status IN ('draft','pending_review')`,按 `created_at` 倒序。
 
 > **注意**:`health_plans.teacher_id` 列由迁移 251 建立(`DatabaseInitializer`),`schema.sql` 已同步。
-> 前端 `getPendingReviewPlans()`(`utils/api.js`)目前尚无页面消费,规划师审核页未接通。
+> 前端 `getPendingReviewPlans()`(`utils/api.js`)目前尚无页面消费,规划师审核页未接通;新审核工作台改用 `4.47` 的 `plans/pending` 端点,本节 4 个端点保留但不再被前端调用。
+
+> ⚠️ 2026-10-04:`/pending-review/approve` 响应由 `Result<HealthPlan>` 改为 `Result<PlanApproveResultDTO>`(新增 `taskGenerated` / `taskCount` / `message` 字段)。该端点无前端调用点(`health-plan-summary.vue` 仅有未调用的死导入),变更安全。
+
+> ✅ 2026-10-04:`/{familyId}/overview`、`/{familyId}/children/{memberId}/tasks`、`/{familyId}/children/{memberId}/pending-review`、`/{familyId}/tasks/{taskId}/review`、`/{familyId}/tasks/batch-review`、`/{familyId}/tasks/{taskId}`、`/{familyId}/tasks/{taskId}/delete` 共 7 个端点已接入 `guide_families` 绑定校验,修复跨家庭越权。
+
+---
+
+### 4.47 规划师审核工作台(`/api/guide/families/*`)
+
+规划师侧审核工作台的统一入口,授权源为 `guide_families.status='binding'`(与 `GuideFamilyService.isBound(guideId, familyId)` 同源),不使用 `users.teacher_family_ids`。
+
+| 端点 | 权限 |
+|---|---|
+| `POST /api/guide/families/my-families` | teacher / admin |
+| `POST /api/guide/families/{familyId}/members` | teacher 需 isBound;admin 放行 |
+| `POST /api/guide/families/{familyId}/plans/pending` | teacher 需 isBound;admin 可传 teacherId 过滤 |
+| `POST /api/guide/families/{familyId}/plans/{planId}/update` | 同上 + planId IDOR 反查 |
+| `POST /api/guide/families/{familyId}/plans/{planId}/approve` | 同上 + planId IDOR 反查;返回 `PlanApproveResultDTO` |
+| `POST /api/guide/families/{familyId}/plans/{planId}/reject` | 同上 + planId IDOR 反查 |
+
+- **`my-families`** 不走 `checkFamilyAccess(role, userId, null)` —— 该路径下 `familyId == null` 会把 teacher 直接拒掉,故改为显式角色判断 + 按 `guide_id` 查本人绑定家庭,返回体含 `familyName`(取自 `Family.name`,注意字段名不是 `familyName`)。
+- **`members`** 返回该家庭可审核成员,供工作台「成员」选择器使用。
+- **未分配池规则**:`plans/pending` 复用 `listPendingReviewPlans()`,`teacherId` 非空时按 `(teacher_id = ? OR teacher_id IS NULL)` 过滤;teacher 无需传该参数,admin 可显式传以过滤。
+- **IDOR 防护**:`{planId}` 类端点先 `checkFamilyAccess(role, userId, familyId)`,再用 `getPlanForFamily(planId, familyId)` 按 familyId 反查,返回 `null` 即 403。控制器内 `resolvePlan` 的第二次 recheck 仅为纵深防御,`getPlanForFamily` 已按 familyId 过滤,**该 recheck 永不单独拦截请求**,不可依赖它替代首道校验。
+- **`approve` 返回 `PlanApproveResultDTO`**:`planId` / `status` / `taskGenerated` / `taskCount` / `message`。任务生成器 `generateDailyTasksFromPlan` 返回 `void`,故实现改为生成后按 `source_type='health_plan' AND source_id=planId` 统计实际条数;生成异常或计数为 0 时方案仍发布并返回 `taskGenerated=false`,属**部分成功**,前端须与失败区分提示。
+
+> **注意**:配套前端为 `pages/teacher/review-workbench.vue`、`review-family.vue`、`plan-detail.vue`,入口在 `pages/teacher/families.vue`。
 
 ---