Переглянути джерело

test(cases): 补齐异常流与权限流用例,对齐 151 应用场景

- 每个角色文件在正常流用例后追加「异常流(-E)」「权限流(-P)」两段,从每条正常流用例派生
- 异常流覆盖上传损坏/解析超时、支付回滚、AI Fallback、额度并发幂等、任务打卡幂等等
- 权限流按角色分流:孩子端铁律(无切回/无编辑删除)、规划师归属校验、运营后台鉴权、服务商跨商户隔离、家长横向越权拦截
- 关键场景专项覆盖:上传报告、生成方案、确认方案、生成任务(方案激活)、任务打卡、家庭食谱
- tests/user-scenarios 补齐 151 应用场景总览与划分口径 README
- 三类用例合计 456 条(正常流152 + 异常流152 + 权限流152)
E2E Test Bot 1 тиждень тому
батько
коміт
1fa560000a

+ 12 - 9
tests/test-cases/README.md

@@ -35,12 +35,15 @@
 
 ## 文件索引
 
-| 文件 | 覆盖角色 | 用例范围 |
-|------|----------|----------|
-| `guest.md` | 游客 | TC-G-01~05 |
-| `parent.md` | 家长 | TC-P-01~18 + 主链路 |
-| `child.md` | 孩子 | TC-C-01~09 |
-| `teacher.md` | 规划师 | TC-T-01~12 |
-| `admin.md` | 运营 | TC-A-01~16 |
-| `vendor.md` | 服务商 | TC-S-01~03 |
-| `cross-role-e2e.md` | 跨角色 | TC-X-01~08(主链路端到端) |
+> **三类用例结构**:每个角色文件在原有「正常流」用例之后,均追加了 `## 异常流用例(派生自正常流)` 与 `## 权限流用例(派生自正常流)` 两段。异常流编号后缀 `-E`、权限流后缀 `-P`,分别从每条正常流用例派生,实现「正常流 + 异常流 + 权限流」三类闭环。
+> 当前三类合计:**正常流 152 + 异常流 152 + 权限流 152 = 456 条**(截至 2026-10-31)。
+
+| 文件 | 覆盖角色 | 正常流范围 | 异常流 / 权限流 |
+|------|----------|------------|------------------|
+| `guest.md` | 游客 | TC-G-01~10 | TC-G-0xE / TC-G-0xP(各 10 条) |
+| `parent.md` | 家长 | TC-P-01~66 | TC-P-NN-E / TC-P-NN-P(各 66 条) |
+| `child.md` | 孩子 | TC-C-01~18 | TC-C-NN-E / TC-C-NN-P(各 18 条) |
+| `teacher.md` | 规划师 | TC-T-01~22 | TC-T-NN-E / TC-T-NN-P(各 22 条) |
+| `admin.md` | 运营 | TC-A-01~16 | TC-A-NN-E / TC-A-NN-P(各 16 条) |
+| `vendor.md` | 服务商 | TC-S-01~08 | TC-S-NN-E / TC-S-NN-P(各 8 条) |
+| `cross-role-e2e.md` | 跨角色 | TC-X-01~12 | TC-X-NN-E / TC-X-NN-P(各 12 条,9 列格式) |

+ 45 - 0
tests/test-cases/admin.md

@@ -24,3 +24,48 @@
 ### 门禁项(近期修复回归)
 
 - **TC-A-11(勋章创建 200)**、**TC-A-12(供应商创建 200)**、**TC-A-13(活动审核撤回无 500)**、**TC-A-14(知识库删除 200)**、**TC-A-08(长文文章无超时)**、**TC-A-16(参数校验 400 非 500)** 必须全部通过。
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-A-01-E | A-1 | 认证 | 运营 | P2 | 异常 | admin 账号 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AdminAuthController` | — |
+| TC-A-02-E | A-1 | 统计 | 运营 | P2 | 异常 | 有业务数据 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `StatsController` | — |
+| TC-A-03-E | A-2 | 方案管理 | 运营 | P2 | 异常 | 多家庭方案 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理(全量) | — |
+| TC-A-04-E | A-2 | 方案激活 | 运营 | P2 | 异常 | reviewed 方案 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案激活 | — |
+| TC-A-05-E | A-2 | 报告解析 | 运营 | P2 | 异常 | gut_flora 已注册 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | `AdminReportParserController` | — |
+| TC-A-06-E | A-2 | 报告解析 | 运营 | P2 | 异常 | — | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告类型注册 | — |
+| TC-A-07-E | A-2 | 报告解析 | 运营 | P3 | 异常 | 有未知报告上传 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 未知聚类自学习 | — |
+| TC-A-08-E | A-3 | 文章 | 运营 | P2 | 异常 | 文章素材 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 文章发布-审核 | — |
+| TC-A-09-E | A-3 | 文章·去重 | 运营 | P2 | 异常 | 已有文章标题 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 文章标题去重 | — |
+| TC-A-10-E | A-4 | 关系类型 | 运营 | P2 | 异常 | 关系类型管理页 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 关系类型 CRUD | — |
+| TC-A-11-E | A-4 | 勋章 | 运营 | P2 | 异常 | 勋章素材 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | 勋章管理;黑盒回归 | — |
+| TC-A-12-E | A-4 | 供应商 | 运营 | P2 | 异常 | 供应商素材 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 供应商管理;黑盒回归 | — |
+| TC-A-13-E | A-5 | 活动 | 运营 | P2 | 异常 | 草稿活动 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 活动审核撤回;黑盒回归 | — |
+| TC-A-14-E | A-6 | 知识库 | 运营 | P2 | 异常 | 知识条目存在(如 id=1) | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 知识库管理;黑盒回归 | — |
+| TC-A-15-E | A-6 | 数据迁移 | 运营 | P3 | 异常 | sfms 源就绪 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 多数据源/SfmsDataSourceConfig | — |
+| TC-A-16-E | A-7 | 参数校验 | 运营 | P2 | 异常 | 各管理接口可用 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 统一 `Result<T>`+全局异常;黑盒回归 | — |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-A-01-P | A-1 | 认证 | 运营 | P1 | 权限 | admin 账号 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `AdminAuthController` | — |
+| TC-A-02-P | A-1 | 统计 | 运营 | P1 | 权限 | 有业务数据 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `StatsController` | — |
+| TC-A-03-P | A-2 | 方案管理 | 运营 | P1 | 权限 | 多家庭方案 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 方案管理(全量) | — |
+| TC-A-04-P | A-2 | 方案激活 | 运营 | P1 | 权限 | reviewed 方案 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 方案激活 | — |
+| TC-A-05-P | A-2 | 报告解析 | 运营 | P1 | 权限 | gut_flora 已注册 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | `AdminReportParserController` | — |
+| TC-A-06-P | A-2 | 报告解析 | 运营 | P1 | 权限 | — | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 报告类型注册 | — |
+| TC-A-07-P | A-2 | 报告解析 | 运营 | P2 | 权限 | 有未知报告上传 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 未知聚类自学习 | — |
+| TC-A-08-P | A-3 | 文章 | 运营 | P1 | 权限 | 文章素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 文章发布-审核 | — |
+| TC-A-09-P | A-3 | 文章·去重 | 运营 | P1 | 权限 | 已有文章标题 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 文章标题去重 | — |
+| TC-A-10-P | A-4 | 关系类型 | 运营 | P1 | 权限 | 关系类型管理页 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 关系类型 CRUD | — |
+| TC-A-11-P | A-4 | 勋章 | 运营 | P1 | 权限 | 勋章素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 勋章管理;黑盒回归 | — |
+| TC-A-12-P | A-4 | 供应商 | 运营 | P1 | 权限 | 供应商素材 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 供应商管理;黑盒回归 | — |
+| TC-A-13-P | A-5 | 活动 | 运营 | P1 | 权限 | 草稿活动 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 活动审核撤回;黑盒回归 | — |
+| TC-A-14-P | A-6 | 知识库 | 运营 | P1 | 权限 | 知识条目存在(如 id=1) | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 知识库管理;黑盒回归 | — |
+| TC-A-15-P | A-6 | 数据迁移 | 运营 | P2 | 权限 | sfms 源就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 多数据源/SfmsDataSourceConfig | — |
+| TC-A-16-P | A-7 | 参数校验 | 运营 | P1 | 权限 | 各管理接口可用 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | 统一 `Result<T>`+全局异常;黑盒回归 | — |

+ 63 - 0
tests/test-cases/child.md

@@ -18,3 +18,66 @@
 
 - **TC-C-01a(权限·门禁)**:孩子端登录态下,任何「切回家长」的 UI 入口与接口调用都必须不存在/被拒;否则整体不通过。
 - **TC-C-01b(异常)**:不能登录用户(local)无法自行登录,由家长代管其数据,相关任务/健康/DOA 以代管视角可见。
+
+## 补齐用例(缺口场景 SC-C-10~18)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-C-10 | SC-C-10 | 勋章提醒 | 孩子 | P2 | 功能 | 达成勋章条件 | 1. 触发成就条件 2. 观察解锁与推送 | 达成→解锁+推送;重复达成不重复发推送 | `MedalController` | — |
+| TC-C-11 | SC-C-11 | 成长记录 | 孩子 | P1 | 功能 | 有成长数据 | 1. 成长时间线→只读查看 | 仅展示本人数据;其他成员数据不可见 | `GrowthController` | — |
+| TC-C-12 | SC-C-12 | 食谱查看 | 孩子 | P1 | 功能 | 家庭食谱已生成 | 1. 打开家庭食谱→当日三餐 | 展示早/午/晚;无食谱显示空态不 500 | 饮食推荐 | — |
+| TC-C-13 | SC-C-13 | AI 对话 | 孩子 | P1 | 功能 | 已登录 | 1. 进对话→发送问题→多轮 | 返回适龄回答;敏感/不适龄内容被过滤 | `AIChatController` | — |
+| TC-C-14 | SC-C-14 | 任务重做 | 孩子 | P1 | 功能 | 任务被驳回 | 1. 打开驳回任务 2. 重做→再提交 | 驳回后可重做;重做提交进入待审核 | `TaskController` | — |
+| TC-C-15 | SC-C-15 | 消息接收 | 孩子 | P1 | 功能 | 有消息 | 1. 消息列表→已读 | 仅见发给自己的消息;越权消息不可见 | 消息服务 | — |
+| TC-C-16 | SC-C-16 | 个人资料 | 孩子 | P1 | 功能 | 已登录 | 1. 资料页→只读/部分可改 | 敏感字段(如关系)家长代管不可改 | `AuthController` | — |
+| TC-C-17 | SC-C-17 | 退出 | 孩子 | P1 | 功能 | 已登录 | 1. 退出→清 token | 退出清除本地缓存;回登录页 | `AuthController` | — |
+| TC-C-18 | SC-C-18 | 设备校验 | 孩子 | P2 | 功能 | 登录设备 | 1. 异常设备登录校验 | 异常设备触发二次验证;通过后放行 | `AuthController` | — |
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-C-01-E | C-1 | 权限/双角色 | 孩子 | P2 | 异常 | 孩子可登录账号 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | 双角色铁律:孩子端不能切家长 | — |
+| TC-C-02-E | C-2 | 任务 | 孩子 | P2 | 异常 | 家长已下发任务「睡前阅读」 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `TaskController` | — |
+| TC-C-03-E | C-3 | 小游戏 | 孩子 | P2 | 异常 | 小游戏入口可见 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | `pages/games/*` | — |
+| TC-C-04-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 孩子已创建心愿 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `WishController` | — |
+| TC-C-05-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 家长已通过心愿 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `RewardController` | — |
+| TC-C-06-E | C-5 | 能量 | 孩子 | P2 | 异常 | 已有能量记录 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `EnergyController` | — |
+| TC-C-07-E | C-6 | 报告/权限 | 孩子 | P2 | 异常 | 家长已上传报告 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告查看权限隔离 | — |
+| TC-C-08-E | C-7 | 打卡/方案 | 孩子 | P2 | 异常 | 规划师已激活方案,生成训练任务 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 健康打卡/方案进度 | — |
+| TC-C-09-E | C-8 | 勋章 | 孩子 | P3 | 异常 | 已有部分成就 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `RewardController` | — |
+| TC-C-10-E | SC-C-10 | 勋章提醒 | 孩子 | P3 | 异常 | 达成勋章条件 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `MedalController` | — |
+| TC-C-11-E | SC-C-11 | 成长记录 | 孩子 | P2 | 异常 | 有成长数据 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `GrowthController` | — |
+| TC-C-12-E | SC-C-12 | 食谱查看 | 孩子 | P2 | 异常 | 家庭食谱已生成 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐 | — |
+| TC-C-13-E | SC-C-13 | AI 对话 | 孩子 | P2 | 异常 | 已登录 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `AIChatController` | — |
+| TC-C-14-E | SC-C-14 | 任务重做 | 孩子 | P2 | 异常 | 任务被驳回 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `TaskController` | — |
+| TC-C-15-E | SC-C-15 | 消息接收 | 孩子 | P2 | 异常 | 有消息 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 消息服务 | — |
+| TC-C-16-E | SC-C-16 | 个人资料 | 孩子 | P2 | 异常 | 已登录 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | `AuthController` | — |
+| TC-C-17-E | SC-C-17 | 退出 | 孩子 | P2 | 异常 | 已登录 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController` | — |
+| TC-C-18-E | SC-C-18 | 设备校验 | 孩子 | P3 | 异常 | 登录设备 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController` | — |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-C-01-P | C-1 | 权限/双角色 | 孩子 | P1 | 权限 | 孩子可登录账号 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 双角色铁律:孩子端不能切家长 | — |
+| TC-C-02-P | C-2 | 任务 | 孩子 | P1 | 权限 | 家长已下发任务「睡前阅读」 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `TaskController` | — |
+| TC-C-03-P | C-3 | 小游戏 | 孩子 | P1 | 权限 | 小游戏入口可见 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `pages/games/*` | — |
+| TC-C-04-P | C-4 | 心愿 | 孩子 | P1 | 权限 | 孩子已创建心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `WishController` | — |
+| TC-C-05-P | C-4 | 心愿 | 孩子 | P1 | 权限 | 家长已通过心愿 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `RewardController` | — |
+| TC-C-06-P | C-5 | 能量 | 孩子 | P1 | 权限 | 已有能量记录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `EnergyController` | — |
+| TC-C-07-P | C-6 | 报告/权限 | 孩子 | P1 | 权限 | 家长已上传报告 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 报告查看权限隔离 | — |
+| TC-C-08-P | C-7 | 打卡/方案 | 孩子 | P1 | 权限 | 规划师已激活方案,生成训练任务 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 健康打卡/方案进度 | — |
+| TC-C-09-P | C-8 | 勋章 | 孩子 | P2 | 权限 | 已有部分成就 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `RewardController` | — |
+| TC-C-10-P | SC-C-10 | 勋章提醒 | 孩子 | P2 | 权限 | 达成勋章条件 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `MedalController` | — |
+| TC-C-11-P | SC-C-11 | 成长记录 | 孩子 | P1 | 权限 | 有成长数据 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `GrowthController` | — |
+| TC-C-12-P | SC-C-12 | 食谱查看 | 孩子 | P1 | 权限 | 家庭食谱已生成 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 饮食推荐 | — |
+| TC-C-13-P | SC-C-13 | AI 对话 | 孩子 | P1 | 权限 | 已登录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `AIChatController` | — |
+| TC-C-14-P | SC-C-14 | 任务重做 | 孩子 | P1 | 权限 | 任务被驳回 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `TaskController` | — |
+| TC-C-15-P | SC-C-15 | 消息接收 | 孩子 | P1 | 权限 | 有消息 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 消息服务 | — |
+| TC-C-16-P | SC-C-16 | 个人资料 | 孩子 | P1 | 权限 | 已登录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `AuthController` | — |
+| TC-C-17-P | SC-C-17 | 退出 | 孩子 | P1 | 权限 | 已登录 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `AuthController` | — |
+| TC-C-18-P | SC-C-18 | 设备校验 | 孩子 | P2 | 权限 | 登录设备 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | `AuthController` | — |

+ 46 - 0
tests/test-cases/cross-role-e2e.md

@@ -38,3 +38,49 @@
 - [x] 五维能量、测评订单闭环、健康报告主链路、LangGraph AI、文章审核、数据迁移等关键设计点均有场景+用例映射
 - [x] 与既有 `BLACKBOX-TEST-PLAN.md`、`e2e/*.spec.js` 口径一致、互不冲突
 - [ ] 执行侧:用例需在测试环境跑通并回填结果(本批仅交付设计资产,执行需另行按双档授权)
+
+## 补齐用例(缺口场景 SC-X-09~12)
+
+| TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
+|---|---|---|---|---|---|---|---|---|
+| TC-X-09 | AI 方案送审闭环 | 多角色 | P0 | 功能 | 家长已生成方案(generated) | 1. 家长送审 2. 规划师批准(reviewed) 3. 激活(active) | 未确认不可激活;全链路状态正确流转 | P-44 / T-06 / T-07 |
+| TC-X-10 | 报告对比趋势闭环 | 多角色 | P2 | 功能 | 同一孩子多次上传同类型报告 | 1. 多次上传 2. 对比 3. 趋势 4. 方案调整 | 类型一致才可比;趋势方向正确 | P-25 / T-21 |
+| TC-X-11 | 消息通知闭环 | 多角色 | P1 | 功能 | 跨角色消息配置就绪 | 1. 规划师发消息 2. 家长/孩子收 3. 已读 | 仅目标角色可见;免打扰设置生效 | P-65 / T-19 / C-15 |
+| TC-X-12 | 会员权益闭环 | 多角色 | P1 | 功能 | 家长未购会员 | 1. 购会员 2. 权益生效 3. AI/高级报告解锁 4. 过期回收 | 购后解锁付费能力;过期权益回收 | P-58 / P-16 |
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
+|---|---|---|---|---|---|---|---|---|
+| TC-X-01-E | 报告上传解析 | 规划师 | P2 | 异常 | 已绑定家庭+孩子 B;募极生物 PDF | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | T-3 / P-10 |
+| TC-X-02-E | 报告审核入库 | 规划师 | P2 | 异常 | X-01 草稿 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | T-4 |
+| TC-X-03-E | 方案生成 | 家长 | P2 | 异常 | 孩子 B 有报告;已购会员 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | P-13 |
+| TC-X-04-E | 方案批准+激活 | 规划师 | P2 | 异常 | X-03 方案 generated | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | T-6 / T-7 |
+| TC-X-05-E | 任务打卡 | 孩子 | P2 | 异常 | X-04 已生成方案任务 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | C-7 / C-2 |
+| TC-X-06-E | 任务审核 | 规划师 | P2 | 异常 | X-05 已提交 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | T-9 / P-06 |
+| TC-X-07-E | 全局统计 | 运营 | P2 | 异常 | 以上步骤已执行 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | A-02 |
+| TC-X-08-E | 幂等与回滚(主链路健壮性) | 多角色 | P2 | 异常 | X-04 已 active 方案 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | T-8 / P-09a / C-8 |
+| TC-X-09-E | AI 方案送审闭环 | 多角色 | P2 | 异常 | 家长已生成方案(generated) | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | P-44 / T-06 / T-07 |
+| TC-X-10-E | 报告对比趋势闭环 | 多角色 | P3 | 异常 | 同一孩子多次上传同类型报告 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | P-25 / T-21 |
+| TC-X-11-E | 消息通知闭环 | 多角色 | P2 | 异常 | 跨角色消息配置就绪 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | P-65 / T-19 / C-15 |
+| TC-X-12-E | 会员权益闭环 | 多角色 | P2 | 异常 | 家长未购会员 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | P-58 / P-16 |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
+|---|---|---|---|---|---|---|---|---|
+| TC-X-01-P | 报告上传解析 | 规划师 | P1 | 权限 | 已绑定家庭+孩子 B;募极生物 PDF | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | T-3 / P-10 |
+| TC-X-02-P | 报告审核入库 | 规划师 | P1 | 权限 | X-01 草稿 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | T-4 |
+| TC-X-03-P | 方案生成 | 家长 | P1 | 权限 | 孩子 B 有报告;已购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | P-13 |
+| TC-X-04-P | 方案批准+激活 | 规划师 | P1 | 权限 | X-03 方案 generated | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | T-6 / T-7 |
+| TC-X-05-P | 任务打卡 | 孩子 | P1 | 权限 | X-04 已生成方案任务 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | C-7 / C-2 |
+| TC-X-06-P | 任务审核 | 规划师 | P1 | 权限 | X-05 已提交 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | T-9 / P-06 |
+| TC-X-07-P | 全局统计 | 运营 | P1 | 权限 | 以上步骤已执行 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | A-02 |
+| TC-X-08-P | 幂等与回滚(主链路健壮性) | 多角色 | P1 | 权限 | X-04 已 active 方案 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | T-8 / P-09a / C-8 |
+| TC-X-09-P | AI 方案送审闭环 | 多角色 | P1 | 权限 | 家长已生成方案(generated) | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | P-44 / T-06 / T-07 |
+| TC-X-10-P | 报告对比趋势闭环 | 多角色 | P2 | 权限 | 同一孩子多次上传同类型报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | P-25 / T-21 |
+| TC-X-11-P | 消息通知闭环 | 多角色 | P1 | 权限 | 跨角色消息配置就绪 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | P-65 / T-19 / C-15 |
+| TC-X-12-P | 会员权益闭环 | 多角色 | P1 | 权限 | 家长未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | P-58 / P-16 |

+ 43 - 0
tests/test-cases/guest.md

@@ -15,3 +15,46 @@
 - **TC-G-02a(异常)**:同一微信二次登录应返回已有账号,不重复建号(验重)。
 - **TC-G-03a(异常)**:验证码过期/频繁发送触发限流,提示明确。
 - **TC-G-05a(权限)**:token 过期后任意 `/api/**` 接口统一 401,前端统一跳登录。
+
+## 补齐用例(缺口场景 SC-G-06~10)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-G-06 | SC-G-06 | 权限 | 游客 | P0 | 权限 | 无 token;已知业务路由 | 1. 直接请求 `/api/**` 受保护接口(如 `/api/family/member/list`) | `JwtInterceptor` 拦截(8 个公开路径除外);缺 token→401/403,不泄露内部错误堆栈 | `JwtInterceptor` | `e2e/debug-control.spec.js`(参考) |
+| TC-G-07 | SC-G-07 | 测试模式 | 游客 | P2 | 功能 | `wechat.test-mode:true` | 1. 用模拟数据登录 | 仅测试环境生效;生产强制真授权;模拟登录不建真实微信绑定 | AGENTS.md 测试模式 | — |
+| TC-G-08 | SC-G-08 | 环境切换 | 游客 | P2 | 功能 | 多环境(develop/trial/release) | 1. `uni.getAccountInfoSync()` 判定环境 2. 切对应 API 地址 | 环境识别失败回退默认地址;接口地址正确 | `config.js` | — |
+| TC-G-09 | SC-G-09 | 认证 | 游客 | P1 | 功能 | 已登录 | 1. 个人中心→退出 2. 清 token 回登录页 | 退出后本地缓存敏感数据清除;再次进入需登录 | `AuthController` | — |
+| TC-G-10 | SC-G-10 | 注册 | 游客 | P1 | 功能 | 未注册账号 | 1. 登录失败提示「未注册」 2. 引导注册流程 | 引导至注册;已注册账号不重复建档 | `AuthController` | — |
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-G-01-E | G-1 | 启动/首页 | 游客 | P2 | 异常 | 清除登录态 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | JwtInterceptor 拦截 `/api/**` | — |
+| TC-G-02-E | G-2 | 认证 | 游客 | P2 | 异常 | 微信授权可用(test-mode) | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController`/`API_REFERENCE` 1.1 | — |
+| TC-G-03-E | G-3 | 认证 | 游客 | P2 | 异常 | 有效手机号 13800000001 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | 统一 POST/JWT | — |
+| TC-G-04-E | G-4 | 家庭/邀请 | 游客 | P2 | 异常 | 家长已 `POST /api/family/invite/generate` 生成邀请 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | `FamilyInviteController` | — |
+| TC-G-05-E | G-5 | 权限 | 游客 | P2 | 异常 | 无 token;已知业务路由 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | JWT;8 公开路径白名单(1.1) | — |
+| TC-G-06-E | SC-G-06 | 权限 | 游客 | P2 | 异常 | 无 token;已知业务路由 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `JwtInterceptor` | — |
+| TC-G-07-E | SC-G-07 | 测试模式 | 游客 | P3 | 异常 | `wechat.test-mode:true` | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | AGENTS.md 测试模式 | — |
+| TC-G-08-E | SC-G-08 | 环境切换 | 游客 | P3 | 异常 | 多环境(develop/trial/release) | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `config.js` | — |
+| TC-G-09-E | SC-G-09 | 认证 | 游客 | P2 | 异常 | 已登录 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController` | — |
+| TC-G-10-E | SC-G-10 | 注册 | 游客 | P2 | 异常 | 未注册账号 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController` | — |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-G-01-P | G-1 | 启动/首页 | 游客 | P1 | 权限 | 清除登录态 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | JwtInterceptor 拦截 `/api/**` | — |
+| TC-G-02-P | G-2 | 认证 | 游客 | P1 | 权限 | 微信授权可用(test-mode) | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AuthController`/`API_REFERENCE` 1.1 | — |
+| TC-G-03-P | G-3 | 认证 | 游客 | P1 | 权限 | 有效手机号 13800000001 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 统一 POST/JWT | — |
+| TC-G-04-P | G-4 | 家庭/邀请 | 游客 | P1 | 权限 | 家长已 `POST /api/family/invite/generate` 生成邀请 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyInviteController` | — |
+| TC-G-05-P | G-5 | 权限 | 游客 | P1 | 权限 | 无 token;已知业务路由 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | JWT;8 公开路径白名单(1.1) | — |
+| TC-G-06-P | SC-G-06 | 权限 | 游客 | P1 | 权限 | 无 token;已知业务路由 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `JwtInterceptor` | — |
+| TC-G-07-P | SC-G-07 | 测试模式 | 游客 | P2 | 权限 | `wechat.test-mode:true` | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | AGENTS.md 测试模式 | — |
+| TC-G-08-P | SC-G-08 | 环境切换 | 游客 | P2 | 权限 | 多环境(develop/trial/release) | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `config.js` | — |
+| TC-G-09-P | SC-G-09 | 认证 | 游客 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AuthController` | — |
+| TC-G-10-P | SC-G-10 | 注册 | 游客 | P1 | 权限 | 未注册账号 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AuthController` | — |

+ 198 - 0
tests/test-cases/parent.md

@@ -32,3 +32,201 @@
 - **TC-P-09b(功能·额度,来自深挖 F-修正)**:`create` 前置为「有效额度」——无额度/额度过期 → `POST /api/assessment/appointment/create` 返回「额度不足或已过期」,不建预约、不发放能量(见 `test-cases/deep-dive-assessment-appointment.md` TC-DV-03/10)。
 - **TC-P-09c(异常·幂等,来自深挖 F4)**:同一 `quotaId+memberId` 重复提交 `create` → 当前会建 2 条预约并发 2 次能量【缺陷】,期望拒绝/返回既有(TC-DV-04)。
 - **关联深挖**:测评预约模块的越权取消(F1)、确认状态守卫(F2)、状态机入口(F3)、并发额度(F7) 等全部缺陷与专项用例见 `test-cases/deep-dive-assessment-appointment.md`。
+
+## 补齐用例(缺口场景 SC-P-19~66)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-P-19 | SC-P-19 | 能量配置 | 家长 | P2 | 功能 | 进入能量页 | 1. 查看五维定义与权重说明 | 显示身/心/智/行/富口径与权重;配置未同步展示兜底说明 | 维度配置 | — |
+| TC-P-20 | SC-P-20 | 健康报告 | 家长 | P0 | 功能 | 持有募极生物 PDF | 1. 上传 PDF 2. 三阶段:上传→解析预览→确认入库 | 识别 gut_flora;解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | 报告解析中台/`POST /api/media/upload` | `e2e/dan-report-flow.spec.js` |
+| TC-P-21 | SC-P-21 | 报告解析 | 家长 | P1 | 功能 | 多类型报告 | 1. 上传→系统自动匹配类型 | 匹配已注册类型;未知类型进未知聚类待运营自学习 | `/api/admin/report-parser/types` | — |
+| TC-P-22 | SC-P-22 | 报告预览 | 家长 | P1 | 功能 | 报告已解析 | 1. 查看菌群健康分/平衡/多样性/菌种明细/疾病风险预览 | 预览数据完整;异常数据提示不入库 | 解析中台 | — |
+| TC-P-23 | SC-P-23 | 报告入库 | 家长 | P1 | 功能 | 解析预览完成 | 1. 点确认→报告进档案→七维刷新 | 确认前可取消不入库;确认后七维刷新 | 解析中台 | — |
+| TC-P-24 | SC-P-24 | 报告管理 | 家长 | P1 | 功能 | 多份报告 | 1. 报告列表→查看/删除/对比 | 删除有关联方案时提示;对比展示差异 | 报告管理 | — |
+| TC-P-25 | SC-P-25 | 报告趋势 | 家长 | P1 | 功能 | ≥2 同类型报告 | 1. 时间序列→趋势图 | 单报告无趋势提示;时间轴正确 | 成长/报告 | — |
+| TC-P-26 | SC-P-26 | 饮食推荐 | 家长 | P1 | 功能 | SC-P-20 已入库 | 1. 身→饮食推荐→生成可吃/慎吃清单 | 按菌群生成;无报告无推荐 | 饮食推荐系统 | — |
+| TC-P-27 | SC-P-27 | 家庭食谱 | 家长 | P1 | 功能 | 菌群报告+营养目标 | 1. 生成早/午/晚食谱(食材/用量/禁忌标注) | 无报告降级通用食谱;忌口/过敏自动排除 | 饮食推荐/家庭食谱 | — |
+| TC-P-28 | SC-P-28 | 食谱筛选 | 家长 | P2 | 功能 | 已生成食谱 | 1. 设忌口/过敏→食谱重算排除项 | 忌口冲突时提示;重算生效 | 饮食推荐 | — |
+| TC-P-29 | SC-P-29 | 食谱收藏 | 家长 | P2 | 功能 | 已生成食谱 | 1. 收藏→手动微调(替换食材) | 调整不破坏营养目标;收藏持久化 | 饮食推荐 | — |
+| TC-P-30 | SC-P-30 | 食谱营养 | 家长 | P2 | 功能 | 食谱+营养目标 | 1. 查看营养合计 vs 目标 | 超标/不足提示 | 饮食推荐 | — |
+| TC-P-31 | SC-P-31 | 测评类型 | 家长 | P1 | 功能 | 进入测评页 | 1. 列 DAN 8 类(mind/wisdom/cognition/learning/behavior/career/campus/adolescent) | 类目来自后端字典;展示完整 8 类 | `DanAssessmentController` | — |
+| TC-P-32 | SC-P-32 | 测评规划师 | 家长 | P1 | 功能 | 已绑定规划师 | 1. 测评选规划师→绑定 T 列表 | 未绑定规划师提示先绑定 | 测评订单 | — |
+| TC-P-33 | SC-P-33 | 测评下单 | 家长 | P1 | 功能 | 套餐可见 | 1. 选套餐→生成 `AssessmentOrder`(pending) | 套餐下架不可下单;生成待支付订单 | `AssessmentOrder` | `e2e/assessment-order-flow.spec.js` |
+| TC-P-34 | SC-P-34 | 测评支付 | 家长 | P1 | 接口 | pending 订单 | 1. 支付→pending→paid→生成额度 | 支付失败回滚不生成额度 | 支付/`AssessmentQuota` | — |
+| TC-P-35 | SC-P-35 | 测评额度 | 家长 | P1 | 功能 | 支付成功 | 1. 查额度到账(含有效期) | 额度过期不可用于预约;展示有效期 | `AssessmentQuota` | — |
+| TC-P-36 | SC-P-36 | 测评预约 | 家长 | P0 | 接口 | 有效额度 | 1. `POST /api/assessment/appointment/create` | 先扣一条额度→落预约;额度不足/过期直接报错不落预约 | `AssessmentAppointmentController` | `e2e/assessment-order-flow.spec.js` |
+| TC-P-37 | SC-P-37 | 预约状态 | 家长 | P1 | 功能 | 已有预约 | 1. 预约列表→状态(待确认/已确认/已完成/已取消/未到) | 状态准确;状态机守卫 | `AssessmentAppointmentController` | — |
+| TC-P-38 | SC-P-38 | 预约取消 | 家长 | P0 | 权限 | 已有预约 | 1. 取消→状态变更 2. 非本人/非绑定规划师取消 | 非归属取消被拒(CFC-AP 取消越权);取消不退款逻辑 | `AssessmentAppointmentController` | — |
+| TC-P-39 | SC-P-39 | DAN报告 | 家长 | P1 | 功能 | 结果已录入 | 1. 结果页→八类报告展示 | 结果未录入不展示;量纲标注 | `DanAssessmentResultDTO` | — |
+| TC-P-40 | SC-P-40 | AI方案 | 家长 | P0 | 功能 | 孩子 B+目标;部分需会员 | 1. 选 B+目标→LangGraph 生成 overview+三板块 | 未购会员提示购买;AI 超时 `AiGateway` Fallback 不 500 | `AIChatController`/`AiGateway` | `e2e/ai-plan-task-flow.spec.js` |
+| TC-P-41 | SC-P-41 | 方案迭代 | 家长 | P1 | 功能 | 方案已生成 | 1. 逐板块重新生成/确认 | 重生成不丢其他板块 | `AIChatController` | — |
+| TC-P-42 | SC-P-42 | 方案编辑 | 家长 | P1 | 功能 | 方案已生成 | 1. 编辑方案文本/任务项 | 编辑后状态标记已改 | 方案管理 | — |
+| TC-P-43 | SC-P-43 | 方案查看 | 家长 | P1 | 功能 | 方案存在 | 1. 方案详情→看板块/任务 | 空方案不白屏 | 方案管理 | — |
+| TC-P-44 | SC-P-44 | 方案确认 | 家长 | P0 | 功能 | 方案 generated | 1. 家长确认/提交规划师审核→generated→reviewed | 未确认不可激活;确认幂等 | 方案状态机 | — |
+| TC-P-45 | SC-P-45 | 方案发布 | 家长 | P1 | 功能 | 配置允许 | 1. 确认即发布 active | 需审核配置时走审核流 | 方案管理 | — |
+| TC-P-46 | SC-P-46 | 方案激活 | 家长 | P0 | 功能 | reviewed 方案 | 1. 激活 reviewed→active→生成引导+模板任务 | 已激活再激活不重复(幂等靠状态机);失败回滚不残半任务 | 方案激活任务分解 | `e2e/ai-plan-task-flow.spec.js` |
+| TC-P-47 | SC-P-47 | 方案任务 | 家长 | P1 | 功能 | 方案 active | 1. 方案→关联任务列表(状态/进度) | 任务增删与方案同步 | `GrowthPlanController` | — |
+| TC-P-48 | SC-P-48 | 方案版本 | 家长 | P2 | 功能 | 多版本方案 | 1. 看版本列表→对比 | 版本不可篡改 | 方案管理 | — |
+| TC-P-49 | SC-P-49 | AI对话 | 家长 | P1 | 功能 | 已登录 | 1. `POST /api/ai/health-coach/send` 多轮 | 基于知识库回答;LangGraph 不可用 Fallback;多轮连续 | `AIChatController` | — |
+| TC-P-50 | SC-P-50 | 成长记录 | 家长 | P1 | 功能 | 有成长数据 | 1. 成长记录页→时间线(任务/测评/报告/打卡) | 数据缺失项跳过不报错 | `GrowthController` | — |
+| TC-P-51 | SC-P-51 | 成长里程碑 | 家长 | P2 | 功能 | 有成长数据 | 1. 标/查里程碑→时间线高亮 | 重复标幂等 | `GrowthController` | — |
+| TC-P-52 | SC-P-52 | 商城浏览 | 家长 | P1 | 功能 | 进入商城 | 1. 商城列表/搜索/分类 | 下架商品不展示 | `MallController`/`danshop` | `e2e/product-purchase.spec.js` |
+| TC-P-53 | SC-P-53 | 商品详情 | 家长 | P1 | 功能 | 商品存在 | 1. 详情页(描述/价格/库存) | 库存为 0 提示 | `MallController` | — |
+| TC-P-54 | SC-P-54 | 商城下单 | 家长 | P1 | 功能 | 商品可购 | 1. 加购→结算→生成订单 | 库存不足拦截;重复下单幂等 | `MallController` | — |
+| TC-P-55 | SC-P-55 | 订单支付 | 家长 | P1 | 接口 | 待支付订单 | 1. 支付→订单 paid | 支付失败回滚 | 支付 | — |
+| TC-P-56 | SC-P-56 | 订单退款 | 家长 | P1 | 功能 | 已有订单 | 1. 订单列表→详情/申请退款 | 已发货退款规则;重复退款拦截 | 订单服务 | — |
+| TC-P-57 | SC-P-57 | 优惠券 | 家长 | P1 | 功能 | 有可用券 | 1. 选券→结算抵扣 | 券过期/不满足门槛不可用 | 优惠券 | — |
+| TC-P-58 | SC-P-58 | 会员购买 | 家长 | P1 | 功能 | 未购会员 | 1. 选档位→支付→权益生效 | 支付失败回滚;重复购买幂等 | `MemberController` | `e2e/../membership` |
+| TC-P-59 | SC-P-59 | 会员权益 | 家长 | P1 | 功能 | 已购会员 | 1. 会员页→权益列表/有效期 | 权益随档位变化 | `MemberController` | — |
+| TC-P-60 | SC-P-60 | 会员续费 | 家长 | P2 | 功能 | 会员将到期 | 1. 续费→延期 | 续费叠加计算正确 | `MemberController` | — |
+| TC-P-61 | SC-P-61 | 联系人 | 家长 | P1 | 功能 | 联系人入口 | 1. 添加联系人(姓名/电话/关系) | 重复号码去重 | `ContactCard`/`contact-detail` | — |
+| TC-P-62 | SC-P-62 | 联系人导入 | 家长 | P2 | 功能 | 联系人存在 | 1. 建分组→导入(`ContactImport`) | 导入格式错误行跳过并报告 | `ContactImport` | — |
+| TC-P-63 | SC-P-63 | 联系人权限 | 家长 | P1 | 权限 | 联系人存在 | 1. 详情→设可见权限 | 越权查看被拒 | `ContactCard` | — |
+| TC-P-64 | SC-P-64 | 个人资料 | 家长 | P1 | 功能 | 已登录 | 1. 编辑昵称/头像/绑定手机 | 手机格式校验;保存生效 | `AuthController` | — |
+| TC-P-65 | SC-P-65 | 通知设置 | 家长 | P2 | 功能 | 已登录 | 1. 设通知开关/提醒时间 | 关闭后仍保关键安全通知 | 消息服务 | — |
+| TC-P-66 | SC-P-66 | 隐私设置 | 家长 | P2 | 功能 | 已登录 | 1. 设数据共享范围 | 最小权限保底 | 隐私设置 | — |
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-P-01-E | P-1 | 家庭 | 家长 | P2 | 异常 | 已登录(默认 parent) | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | `FamilyInviteController` | — |
+| TC-P-02-E | P-2 | 家庭/成员 | 家长 | P2 | 异常 | 家庭已创建;爷爷 C 可用 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | `FamilyInviteController` | — |
+| TC-P-03-E | P-2 | 成员资料 | 家长 | P2 | 异常 | 家庭已创建 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | `FamilyMembersController` | — |
+| TC-P-04-E | P-2 | 关系图 | 家长 | P2 | 异常 | 成员 C 已加入 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 关系类型 CRUD/前端选择器 | — |
+| TC-P-05-E | P-4 | 任务 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `TaskController` | — |
+| TC-P-06-E | P-4 | 任务审核 | 家长 | P2 | 异常 | B 已提交任务 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `TaskController`/`PointsController` | — |
+| TC-P-07-E | P-5 | 心愿 | 家长 | P2 | 异常 | 孩子已创建心愿 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `WishController`/`RewardController` | — |
+| TC-P-08-E | P-6 | 能量 | 家长 | P2 | 异常 | 已有能量记录 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `EnergyController` | — |
+| TC-P-09-E | P-7 | 测评订单 | 家长 | P2 | 异常 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `AssessmentAppointmentController` | — |
+| TC-P-10-E | P-8 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物菌群 PDF | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 健康报告上传解析 | — |
+| TC-P-11-E | P-8 | 报告查看 | 家长 | P2 | 异常 | 报告已入库 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告解析 | — |
+| TC-P-12-E | P-9 | 饮食推荐 | 家长 | P2 | 异常 | P-10 报告已入库 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐系统 | — |
+| TC-P-13-E | P-10 | AI 方案 | 家长 | P2 | 异常 | 孩子 B 有报告;部分需会员 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | AI 统一走 LangGraph;`AiGateway` | — |
+| TC-P-14-E | P-10 | 方案提交 | 家长 | P2 | 异常 | 方案已生成 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案状态机 | — |
+| TC-P-15-E | P-3 | 双角色 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
+| TC-P-16-E | P-10 | 会员 | 家长 | P2 | 异常 | 未购会员 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `MembershipController`/`ProductOrderController` | — |
+| TC-P-17-E | P-12 | 积分/成长 | 家长 | P2 | 异常 | 已有记录 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `PointsController`/`GrowthController` | — |
+| TC-P-18-E | P-11 | AI 对话 | 家长 | P2 | 异常 | 已登录 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `AIChatController`;LangGraph RAG | — |
+| TC-P-19-E | SC-P-19 | 能量配置 | 家长 | P3 | 异常 | 进入能量页 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | 维度配置 | — |
+| TC-P-20-E | SC-P-20 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物 PDF | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告解析中台/`POST /api/media/upload` | — |
+| TC-P-21-E | SC-P-21 | 报告解析 | 家长 | P2 | 异常 | 多类型报告 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | `/api/admin/report-parser/types` | — |
+| TC-P-22-E | SC-P-22 | 报告预览 | 家长 | P2 | 异常 | 报告已解析 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 解析中台 | — |
+| TC-P-23-E | SC-P-23 | 报告入库 | 家长 | P2 | 异常 | 解析预览完成 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 解析中台 | — |
+| TC-P-24-E | SC-P-24 | 报告管理 | 家长 | P2 | 异常 | 多份报告 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告管理 | — |
+| TC-P-25-E | SC-P-25 | 报告趋势 | 家长 | P2 | 异常 | ≥2 同类型报告 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 成长/报告 | — |
+| TC-P-26-E | SC-P-26 | 饮食推荐 | 家长 | P2 | 异常 | SC-P-20 已入库 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐系统 | — |
+| TC-P-27-E | SC-P-27 | 家庭食谱 | 家长 | P2 | 异常 | 菌群报告+营养目标 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐/家庭食谱 | — |
+| TC-P-28-E | SC-P-28 | 食谱筛选 | 家长 | P3 | 异常 | 已生成食谱 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐 | — |
+| TC-P-29-E | SC-P-29 | 食谱收藏 | 家长 | P3 | 异常 | 已生成食谱 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐 | — |
+| TC-P-30-E | SC-P-30 | 食谱营养 | 家长 | P3 | 异常 | 食谱+营养目标 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 饮食推荐 | — |
+| TC-P-31-E | SC-P-31 | 测评类型 | 家长 | P2 | 异常 | 进入测评页 | 1. 额度不足/过期;并发同一 quota+memberId 重复提交 2. 观察拦截与幂等 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | `DanAssessmentController` | — |
+| TC-P-32-E | SC-P-32 | 测评规划师 | 家长 | P2 | 异常 | 已绑定规划师 | 1. 额度不足/过期;并发同一 quota+memberId 重复提交 2. 观察拦截与幂等 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | 测评订单 | — |
+| TC-P-33-E | SC-P-33 | 测评下单 | 家长 | P2 | 异常 | 套餐可见 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `AssessmentOrder` | — |
+| TC-P-34-E | SC-P-34 | 测评支付 | 家长 | P2 | 异常 | pending 订单 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 支付/`AssessmentQuota` | — |
+| TC-P-35-E | SC-P-35 | 测评额度 | 家长 | P2 | 异常 | 支付成功 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `AssessmentQuota` | — |
+| TC-P-36-E | SC-P-36 | 测评预约 | 家长 | P2 | 异常 | 有效额度 | 1. 额度不足/过期;并发同一 quota+memberId 重复提交 2. 观察拦截与幂等 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | `AssessmentAppointmentController` | — |
+| TC-P-37-E | SC-P-37 | 预约状态 | 家长 | P2 | 异常 | 已有预约 | 1. 额度不足/过期;并发同一 quota+memberId 重复提交 2. 观察拦截与幂等 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | `AssessmentAppointmentController` | — |
+| TC-P-38-E | SC-P-38 | 预约取消 | 家长 | P2 | 异常 | 已有预约 | 1. 额度不足/过期;并发同一 quota+memberId 重复提交 2. 观察拦截与幂等 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | `AssessmentAppointmentController` | — |
+| TC-P-39-E | SC-P-39 | DAN报告 | 家长 | P2 | 异常 | 结果已录入 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | `DanAssessmentResultDTO` | — |
+| TC-P-40-E | SC-P-40 | AI方案 | 家长 | P2 | 异常 | 孩子 B+目标;部分需会员 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `AIChatController`/`AiGateway` | — |
+| TC-P-41-E | SC-P-41 | 方案迭代 | 家长 | P2 | 异常 | 方案已生成 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `AIChatController` | — |
+| TC-P-42-E | SC-P-42 | 方案编辑 | 家长 | P2 | 异常 | 方案已生成 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理 | — |
+| TC-P-43-E | SC-P-43 | 方案查看 | 家长 | P2 | 异常 | 方案存在 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理 | — |
+| TC-P-44-E | SC-P-44 | 方案确认 | 家长 | P2 | 异常 | 方案 generated | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案状态机 | — |
+| TC-P-45-E | SC-P-45 | 方案发布 | 家长 | P2 | 异常 | 配置允许 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理 | — |
+| TC-P-46-E | SC-P-46 | 方案激活 | 家长 | P2 | 异常 | reviewed 方案 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案激活任务分解 | — |
+| TC-P-47-E | SC-P-47 | 方案任务 | 家长 | P2 | 异常 | 方案 active | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `GrowthPlanController` | — |
+| TC-P-48-E | SC-P-48 | 方案版本 | 家长 | P3 | 异常 | 多版本方案 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理 | — |
+| TC-P-49-E | SC-P-49 | AI对话 | 家长 | P2 | 异常 | 已登录 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `AIChatController` | — |
+| TC-P-50-E | SC-P-50 | 成长记录 | 家长 | P2 | 异常 | 有成长数据 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `GrowthController` | — |
+| TC-P-51-E | SC-P-51 | 成长里程碑 | 家长 | P3 | 异常 | 有成长数据 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `GrowthController` | — |
+| TC-P-52-E | SC-P-52 | 商城浏览 | 家长 | P2 | 异常 | 进入商城 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `MallController`/`danshop` | — |
+| TC-P-53-E | SC-P-53 | 商品详情 | 家长 | P2 | 异常 | 商品存在 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `MallController` | — |
+| TC-P-54-E | SC-P-54 | 商城下单 | 家长 | P2 | 异常 | 商品可购 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `MallController` | — |
+| TC-P-55-E | SC-P-55 | 订单支付 | 家长 | P2 | 异常 | 待支付订单 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 支付 | — |
+| TC-P-56-E | SC-P-56 | 订单退款 | 家长 | P2 | 异常 | 已有订单 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 订单服务 | — |
+| TC-P-57-E | SC-P-57 | 优惠券 | 家长 | P2 | 异常 | 有可用券 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 优惠券 | — |
+| TC-P-58-E | SC-P-58 | 会员购买 | 家长 | P2 | 异常 | 未购会员 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `MemberController` | — |
+| TC-P-59-E | SC-P-59 | 会员权益 | 家长 | P2 | 异常 | 已购会员 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `MemberController` | — |
+| TC-P-60-E | SC-P-60 | 会员续费 | 家长 | P3 | 异常 | 会员将到期 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `MemberController` | — |
+| TC-P-61-E | SC-P-61 | 联系人 | 家长 | P2 | 异常 | 联系人入口 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | `ContactCard`/`contact-detail` | — |
+| TC-P-62-E | SC-P-62 | 联系人导入 | 家长 | P3 | 异常 | 联系人存在 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | `ContactImport` | — |
+| TC-P-63-E | SC-P-63 | 联系人权限 | 家长 | P2 | 异常 | 联系人存在 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | `ContactCard` | — |
+| TC-P-64-E | SC-P-64 | 个人资料 | 家长 | P2 | 异常 | 已登录 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | `AuthController` | — |
+| TC-P-65-E | SC-P-65 | 通知设置 | 家长 | P3 | 异常 | 已登录 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 消息服务 | — |
+| TC-P-66-E | SC-P-66 | 隐私设置 | 家长 | P3 | 异常 | 已登录 | 1. 输入非法格式/重复/越界值 2. 观察校验 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 隐私设置 | — |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-P-01-P | P-1 | 家庭 | 家长 | P1 | 权限 | 已登录(默认 parent) | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyInviteController` | — |
+| TC-P-02-P | P-2 | 家庭/成员 | 家长 | P1 | 权限 | 家庭已创建;爷爷 C 可用 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyInviteController` | — |
+| TC-P-03-P | P-2 | 成员资料 | 家长 | P1 | 权限 | 家庭已创建 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `FamilyMembersController` | — |
+| TC-P-04-P | P-2 | 关系图 | 家长 | P1 | 权限 | 成员 C 已加入 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 关系类型 CRUD/前端选择器 | — |
+| TC-P-05-P | P-4 | 任务 | 家长 | P1 | 权限 | 家庭含孩子 B | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `TaskController` | — |
+| TC-P-06-P | P-4 | 任务审核 | 家长 | P1 | 权限 | B 已提交任务 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `TaskController`/`PointsController` | — |
+| TC-P-07-P | P-5 | 心愿 | 家长 | P1 | 权限 | 孩子已创建心愿 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `WishController`/`RewardController` | — |
+| TC-P-08-P | P-6 | 能量 | 家长 | P1 | 权限 | 已有能量记录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `EnergyController` | — |
+| TC-P-09-P | P-7 | 测评订单 | 家长 | P1 | 权限 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
+| TC-P-10-P | P-8 | 健康报告 | 家长 | P1 | 权限 | 持有募极生物菌群 PDF | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 健康报告上传解析 | — |
+| TC-P-11-P | P-8 | 报告查看 | 家长 | P1 | 权限 | 报告已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告解析 | — |
+| TC-P-12-P | P-9 | 饮食推荐 | 家长 | P1 | 权限 | P-10 报告已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐系统 | — |
+| TC-P-13-P | P-10 | AI 方案 | 家长 | P1 | 权限 | 孩子 B 有报告;部分需会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | AI 统一走 LangGraph;`AiGateway` | — |
+| TC-P-14-P | P-10 | 方案提交 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案状态机 | — |
+| TC-P-15-P | P-3 | 双角色 | 家长 | P1 | 权限 | 家庭含孩子 B | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
+| TC-P-16-P | P-10 | 会员 | 家长 | P1 | 权限 | 未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MembershipController`/`ProductOrderController` | — |
+| TC-P-17-P | P-12 | 积分/成长 | 家长 | P1 | 权限 | 已有记录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `PointsController`/`GrowthController` | — |
+| TC-P-18-P | P-11 | AI 对话 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController`;LangGraph RAG | — |
+| TC-P-19-P | SC-P-19 | 能量配置 | 家长 | P2 | 权限 | 进入能量页 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 维度配置 | — |
+| TC-P-20-P | SC-P-20 | 健康报告 | 家长 | P1 | 权限 | 持有募极生物 PDF | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告解析中台/`POST /api/media/upload` | — |
+| TC-P-21-P | SC-P-21 | 报告解析 | 家长 | P1 | 权限 | 多类型报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `/api/admin/report-parser/types` | — |
+| TC-P-22-P | SC-P-22 | 报告预览 | 家长 | P1 | 权限 | 报告已解析 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 解析中台 | — |
+| TC-P-23-P | SC-P-23 | 报告入库 | 家长 | P1 | 权限 | 解析预览完成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 解析中台 | — |
+| TC-P-24-P | SC-P-24 | 报告管理 | 家长 | P1 | 权限 | 多份报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 报告管理 | — |
+| TC-P-25-P | SC-P-25 | 报告趋势 | 家长 | P1 | 权限 | ≥2 同类型报告 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 成长/报告 | — |
+| TC-P-26-P | SC-P-26 | 饮食推荐 | 家长 | P1 | 权限 | SC-P-20 已入库 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐系统 | — |
+| TC-P-27-P | SC-P-27 | 家庭食谱 | 家长 | P1 | 权限 | 菌群报告+营养目标 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐/家庭食谱 | — |
+| TC-P-28-P | SC-P-28 | 食谱筛选 | 家长 | P2 | 权限 | 已生成食谱 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐 | — |
+| TC-P-29-P | SC-P-29 | 食谱收藏 | 家长 | P2 | 权限 | 已生成食谱 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐 | — |
+| TC-P-30-P | SC-P-30 | 食谱营养 | 家长 | P2 | 权限 | 食谱+营养目标 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 饮食推荐 | — |
+| TC-P-31-P | SC-P-31 | 测评类型 | 家长 | P1 | 权限 | 进入测评页 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `DanAssessmentController` | — |
+| TC-P-32-P | SC-P-32 | 测评规划师 | 家长 | P1 | 权限 | 已绑定规划师 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 测评订单 | — |
+| TC-P-33-P | SC-P-33 | 测评下单 | 家长 | P1 | 权限 | 套餐可见 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentOrder` | — |
+| TC-P-34-P | SC-P-34 | 测评支付 | 家长 | P1 | 权限 | pending 订单 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 支付/`AssessmentQuota` | — |
+| TC-P-35-P | SC-P-35 | 测评额度 | 家长 | P1 | 权限 | 支付成功 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentQuota` | — |
+| TC-P-36-P | SC-P-36 | 测评预约 | 家长 | P1 | 权限 | 有效额度 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
+| TC-P-37-P | SC-P-37 | 预约状态 | 家长 | P1 | 权限 | 已有预约 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
+| TC-P-38-P | SC-P-38 | 预约取消 | 家长 | P1 | 权限 | 已有预约 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AssessmentAppointmentController` | — |
+| TC-P-39-P | SC-P-39 | DAN报告 | 家长 | P1 | 权限 | 结果已录入 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `DanAssessmentResultDTO` | — |
+| TC-P-40-P | SC-P-40 | AI方案 | 家长 | P1 | 权限 | 孩子 B+目标;部分需会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController`/`AiGateway` | — |
+| TC-P-41-P | SC-P-41 | 方案迭代 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController` | — |
+| TC-P-42-P | SC-P-42 | 方案编辑 | 家长 | P1 | 权限 | 方案已生成 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
+| TC-P-43-P | SC-P-43 | 方案查看 | 家长 | P1 | 权限 | 方案存在 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
+| TC-P-44-P | SC-P-44 | 方案确认 | 家长 | P1 | 权限 | 方案 generated | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案状态机 | — |
+| TC-P-45-P | SC-P-45 | 方案发布 | 家长 | P1 | 权限 | 配置允许 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
+| TC-P-46-P | SC-P-46 | 方案激活 | 家长 | P1 | 权限 | reviewed 方案 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案激活任务分解 | — |
+| TC-P-47-P | SC-P-47 | 方案任务 | 家长 | P1 | 权限 | 方案 active | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthPlanController` | — |
+| TC-P-48-P | SC-P-48 | 方案版本 | 家长 | P2 | 权限 | 多版本方案 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 方案管理 | — |
+| TC-P-49-P | SC-P-49 | AI对话 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AIChatController` | — |
+| TC-P-50-P | SC-P-50 | 成长记录 | 家长 | P1 | 权限 | 有成长数据 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthController` | — |
+| TC-P-51-P | SC-P-51 | 成长里程碑 | 家长 | P2 | 权限 | 有成长数据 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `GrowthController` | — |
+| TC-P-52-P | SC-P-52 | 商城浏览 | 家长 | P1 | 权限 | 进入商城 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MallController`/`danshop` | — |
+| TC-P-53-P | SC-P-53 | 商品详情 | 家长 | P1 | 权限 | 商品存在 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MallController` | — |
+| TC-P-54-P | SC-P-54 | 商城下单 | 家长 | P1 | 权限 | 商品可购 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MallController` | — |
+| TC-P-55-P | SC-P-55 | 订单支付 | 家长 | P1 | 权限 | 待支付订单 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 支付 | — |
+| TC-P-56-P | SC-P-56 | 订单退款 | 家长 | P1 | 权限 | 已有订单 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 订单服务 | — |
+| TC-P-57-P | SC-P-57 | 优惠券 | 家长 | P1 | 权限 | 有可用券 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 优惠券 | — |
+| TC-P-58-P | SC-P-58 | 会员购买 | 家长 | P1 | 权限 | 未购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
+| TC-P-59-P | SC-P-59 | 会员权益 | 家长 | P1 | 权限 | 已购会员 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
+| TC-P-60-P | SC-P-60 | 会员续费 | 家长 | P2 | 权限 | 会员将到期 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `MemberController` | — |
+| TC-P-61-P | SC-P-61 | 联系人 | 家长 | P1 | 权限 | 联系人入口 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `ContactCard`/`contact-detail` | — |
+| TC-P-62-P | SC-P-62 | 联系人导入 | 家长 | P2 | 权限 | 联系人存在 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `ContactImport` | — |
+| TC-P-63-P | SC-P-63 | 联系人权限 | 家长 | P1 | 权限 | 联系人存在 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `ContactCard` | — |
+| TC-P-64-P | SC-P-64 | 个人资料 | 家长 | P1 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | `AuthController` | — |
+| TC-P-65-P | SC-P-65 | 通知设置 | 家长 | P2 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 消息服务 | — |
+| TC-P-66-P | SC-P-66 | 隐私设置 | 家长 | P2 | 权限 | 已登录 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 隐私设置 | — |

+ 72 - 0
tests/test-cases/teacher.md

@@ -24,3 +24,75 @@
 - **TC-T-10b(异常·状态守卫,来自深挖 F2)**:对已取消/已完成预约再 `confirm` → 当前仍置 1(非法回退)【缺陷】,期望失败(TC-DV-02)。
 - **TC-T-10c(权限·越权取消,来自深挖 F1)**:`cancel/{id}` 不接收调用者身份,**任何登录用户凭 id 即可取消他人预约**【高危缺陷】;期望增加归属校验(TC-DV-01)。
 - **关联深挖**:完整缺陷清单与专项用例见 `test-cases/deep-dive-assessment-appointment.md`。
+
+## 补齐用例(缺口场景 SC-T-13~22)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-T-13 | SC-T-13 | 数据隔离 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 列家庭/成员/报告 2. 越权查非绑定家庭 | 非绑定家庭统一 403;仅见绑定家庭数据 | 控制器内 role 检查 | — |
+| TC-T-14 | SC-T-14 | 方案编辑 | 规划师 | P1 | 功能 | 方案存在 | 1. 编辑板块/任务项 2. 保存 | 编辑后状态标记已改;保存生效 | 方案管理 | — |
+| TC-T-15 | SC-T-15 | 套餐任务 | 规划师 | P1 | 功能 | 套餐存在 | 1. 增删任务项 2. 重算 | 空套餐拦截上架;重算后任务项正确 | `GuidePackageController` | — |
+| TC-T-16 | SC-T-16 | 健康总览 | 规划师 | P1 | 功能 | 已绑定家庭 | 1. 家庭仪表板→能量/报告/方案汇总 | 数据缺失项降级展示不 500 | 仪表板 | — |
+| TC-T-17 | SC-T-17 | 计划进度 | 规划师 | P1 | 功能 | 计划存在 | 1. 计划→任务完成度 | 进度计算准确;与任务状态一致 | `GrowthPlanController` | — |
+| TC-T-18 | SC-T-18 | 批量任务 | 规划师 | P1 | 功能 | 多孩子成员 | 1. 选多成员→批量建任务 | 部分失败不影响其他成员;各自独立落库 | `TaskController` | — |
+| TC-T-19 | SC-T-19 | 消息推送 | 规划师 | P1 | 功能 | 已绑定客户 | 1. 发消息/提醒→客户收到 | 客户端收到;免打扰设置生效 | 消息服务 | — |
+| TC-T-20 | SC-T-20 | 退出/切换 | 规划师 | P1 | 功能 | 已登录 | 1. 退出→清 token 2. 切回家长 | 退出清缓存;切回家长视角正常 | `AuthController` | — |
+| TC-T-21 | SC-T-21 | 报告对比 | 规划师 | P1 | 功能 | 多份报告 | 1. 多报告对比→差异标注 | 报告类型一致才可比对;差异清晰标注 | 报告管理 | — |
+| TC-T-22 | SC-T-22 | 方案归档 | 规划师 | P2 | 功能 | 方案完成 | 1. 归档→只读 | 归档后方案仅可读,不可再编辑/激活 | 方案管理 | — |
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-T-01-E | T-1 | 认证/双角色 | 规划师 | P2 | 异常 | 已分配规划师账号 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController`;规划师可切回家长 | — |
+| TC-T-02-E | T-2 | 家庭绑定 | 规划师 | P2 | 异常 | 家长已生成邀请码 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | `FamilyInviteController` | — |
+| TC-T-03-E | T-3 | 健康报告 | 规划师 | P2 | 异常 | 已绑定家庭与孩子 B | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告上传解析;规划师代传 | — |
+| TC-T-04-E | T-3 | 报告审核 | 规划师 | P2 | 异常 | 有报告草稿(如 id=28) | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告审核 | — |
+| TC-T-05-E | T-4 | 方案管理 | 规划师 | P2 | 异常 | 有 generated/reviewed/active 方案 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理;黑盒回归项 | — |
+| TC-T-06-E | T-4 | 方案审核 | 规划师 | P2 | 异常 | 家长已提交方案(generated) | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案状态机 | — |
+| TC-T-07-E | T-5 | 方案激活 | 规划师 | P2 | 异常 | 方案已 reviewed | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 激活拆任务 | — |
+| TC-T-08-E | T-5 | 方案激活·幂等 | 规划师 | P2 | 异常 | 方案已 active | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 幂等约束(黑盒回归) | — |
+| TC-T-09-E | T-6 | 任务审核 | 规划师 | P2 | 异常 | 孩子已提交任务 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `TaskController` | — |
+| TC-T-10-E | T-7 | 测评录入 | 规划师 | P2 | 异常 | 家长已支付测评订单(待安排→已预约) | 1. 额度不足/过期;并发同一 quota+memberId 重复提交 2. 观察拦截与幂等 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | `AssessmentAppointmentController`/`DanAssessmentController` | — |
+| TC-T-11-E | T-8 | 成长计划 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `GrowthPlanController`;黑盒回归 | — |
+| TC-T-12-E | T-8 | 套餐 | 规划师 | P2 | 异常 | 套餐素材就绪 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `GuidePackageController` | — |
+| TC-T-13-E | SC-T-13 | 数据隔离 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 控制器内 role 检查 | — |
+| TC-T-14-E | SC-T-14 | 方案编辑 | 规划师 | P2 | 异常 | 方案存在 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理 | — |
+| TC-T-15-E | SC-T-15 | 套餐任务 | 规划师 | P2 | 异常 | 套餐存在 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | `GuidePackageController` | — |
+| TC-T-16-E | SC-T-16 | 健康总览 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 仪表板 | — |
+| TC-T-17-E | SC-T-17 | 计划进度 | 规划师 | P2 | 异常 | 计划存在 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `GrowthPlanController` | — |
+| TC-T-18-E | SC-T-18 | 批量任务 | 规划师 | P2 | 异常 | 多孩子成员 | 1. 重复提交/并发/超期/驳回后重做 2. 观察处理 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | `TaskController` | — |
+| TC-T-19-E | SC-T-19 | 消息推送 | 规划师 | P2 | 异常 | 已绑定客户 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 消息服务 | — |
+| TC-T-20-E | SC-T-20 | 退出/切换 | 规划师 | P2 | 异常 | 已登录 | 1. 未登录/过期 token/非法切换 2. 观察拦截 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | `AuthController` | — |
+| TC-T-21-E | SC-T-21 | 报告对比 | 规划师 | P2 | 异常 | 多份报告 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察系统处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告管理 | — |
+| TC-T-22-E | SC-T-22 | 方案归档 | 规划师 | P3 | 异常 | 方案完成 | 1. 制造 AI/方案生成超时或不可用;制造重复激活/确认/购买 2. 观察兜底与幂等 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | 方案管理 | — |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-T-01-P | T-1 | 认证/双角色 | 规划师 | P1 | 权限 | 已分配规划师账号 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `AuthController`;规划师可切回家长 | — |
+| TC-T-02-P | T-2 | 家庭绑定 | 规划师 | P1 | 权限 | 家长已生成邀请码 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `FamilyInviteController` | — |
+| TC-T-03-P | T-3 | 健康报告 | 规划师 | P1 | 权限 | 已绑定家庭与孩子 B | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 报告上传解析;规划师代传 | — |
+| TC-T-04-P | T-3 | 报告审核 | 规划师 | P1 | 权限 | 有报告草稿(如 id=28) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 报告审核 | — |
+| TC-T-05-P | T-4 | 方案管理 | 规划师 | P1 | 权限 | 有 generated/reviewed/active 方案 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理;黑盒回归项 | — |
+| TC-T-06-P | T-4 | 方案审核 | 规划师 | P1 | 权限 | 家长已提交方案(generated) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案状态机 | — |
+| TC-T-07-P | T-5 | 方案激活 | 规划师 | P1 | 权限 | 方案已 reviewed | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 激活拆任务 | — |
+| TC-T-08-P | T-5 | 方案激活·幂等 | 规划师 | P1 | 权限 | 方案已 active | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 幂等约束(黑盒回归) | — |
+| TC-T-09-P | T-6 | 任务审核 | 规划师 | P1 | 权限 | 孩子已提交任务 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `TaskController` | — |
+| TC-T-10-P | T-7 | 测评录入 | 规划师 | P1 | 权限 | 家长已支付测评订单(待安排→已预约) | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `AssessmentAppointmentController`/`DanAssessmentController` | — |
+| TC-T-11-P | T-8 | 成长计划 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GrowthPlanController`;黑盒回归 | — |
+| TC-T-12-P | T-8 | 套餐 | 规划师 | P1 | 权限 | 套餐素材就绪 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GuidePackageController` | — |
+| TC-T-13-P | SC-T-13 | 数据隔离 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 控制器内 role 检查 | — |
+| TC-T-14-P | SC-T-14 | 方案编辑 | 规划师 | P1 | 权限 | 方案存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理 | — |
+| TC-T-15-P | SC-T-15 | 套餐任务 | 规划师 | P1 | 权限 | 套餐存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GuidePackageController` | — |
+| TC-T-16-P | SC-T-16 | 健康总览 | 规划师 | P1 | 权限 | 已绑定家庭 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 仪表板 | — |
+| TC-T-17-P | SC-T-17 | 计划进度 | 规划师 | P1 | 权限 | 计划存在 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `GrowthPlanController` | — |
+| TC-T-18-P | SC-T-18 | 批量任务 | 规划师 | P1 | 权限 | 多孩子成员 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `TaskController` | — |
+| TC-T-19-P | SC-T-19 | 消息推送 | 规划师 | P1 | 权限 | 已绑定客户 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 消息服务 | — |
+| TC-T-20-P | SC-T-20 | 退出/切换 | 规划师 | P1 | 权限 | 已登录 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | `AuthController` | — |
+| TC-T-21-P | SC-T-21 | 报告对比 | 规划师 | P1 | 权限 | 多份报告 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 报告管理 | — |
+| TC-T-22-P | SC-T-22 | 方案归档 | 规划师 | P2 | 权限 | 方案完成 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单) 2. 对非指派预约 confirm/cancel 3. 观察 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | 方案管理 | — |

+ 39 - 0
tests/test-cases/vendor.md

@@ -13,3 +13,42 @@
 
 - **TC-S-02a(异常)**:价格为负、库存为负、分类非法 → 统一 400 + 字段提示(对齐运营端参数校验规范)。
 - **TC-S-03a(权限)**:非本服务商订单不可操作;越权返回拒绝。
+
+## 补齐用例(缺口场景 SC-S-04~08)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-S-04 | SC-S-04 | 订单核销 | 服务商 | P0 | 功能 | 已发货订单 | 1. 扫码核销→完成 | 重复核销幂等;超期订单提示不可核销 | 订单服务 | — |
+| TC-S-05 | SC-S-05 | 库存 | 服务商 | P1 | 功能 | 商品存在 | 1. 调库存→同步 | 负库存拦截;同步后前台可见 | 库存服务 | — |
+| TC-S-06 | SC-S-06 | 售后 | 服务商 | P1 | 功能 | 有售后单 | 1. 收售后→同意/拒→退款 | 重复退款拦截;退款流水可追溯 | 售后 | — |
+| TC-S-07 | SC-S-07 | 活动报名 | 服务商 | P2 | 功能 | 活动进行中 | 1. 报名活动→商品打标 | 活动失效不可报;报名后商品出现活动标 | 活动管理 | — |
+| TC-S-08 | SC-S-08 | 对账 | 服务商 | P1 | 功能 | 账期到 | 1. 看账单→结算 | 账期计算正确;结算后状态更新 | 结算 | — |
+
+
+---
+
+## 异常流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-S-01-E | S-1 | 入驻 | 服务商 | P2 | 异常 | 资质/联系/品类就绪 | 1. 输入非法参数/网络中断/请求超时 2. 观察降级 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | `ServiceRoleApplicationController`/`AdminEcomSupplierController` | — |
+| TC-S-02-E | S-2 | 商品 | 服务商 | P2 | 异常 | 已审核通过 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `ProductController`/`AdminProductController` | — |
+| TC-S-03-E | S-3 | 订单 | 服务商 | P2 | 异常 | 已有客户下单 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | `ProductOrderController` | — |
+| TC-S-04-E | SC-S-04 | 订单核销 | 服务商 | P2 | 异常 | 已发货订单 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 订单服务 | — |
+| TC-S-05-E | SC-S-05 | 库存 | 服务商 | P2 | 异常 | 商品存在 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 库存服务 | — |
+| TC-S-06-E | SC-S-06 | 售后 | 服务商 | P2 | 异常 | 有售后单 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 售后 | — |
+| TC-S-07-E | SC-S-07 | 活动报名 | 服务商 | P3 | 异常 | 活动进行中 | 1. 重复创建/参数非法/长文超时 2. 观察处理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | 活动管理 | — |
+| TC-S-08-E | SC-S-08 | 对账 | 服务商 | P2 | 异常 | 账期到 | 1. 模拟支付失败/余额不足/重复提交/负价格负库存 2. 观察回滚与拦截 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | 结算 | — |
+
+## 权限流用例(派生自正常流)
+
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-S-01-P | S-1 | 入驻 | 服务商 | P1 | 权限 | 资质/联系/品类就绪 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | `ServiceRoleApplicationController`/`AdminEcomSupplierController` | — |
+| TC-S-02-P | S-2 | 商品 | 服务商 | P1 | 权限 | 已审核通过 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | `ProductController`/`AdminProductController` | — |
+| TC-S-03-P | S-3 | 订单 | 服务商 | P1 | 权限 | 已有客户下单 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | `ProductOrderController` | — |
+| TC-S-04-P | SC-S-04 | 订单核销 | 服务商 | P1 | 权限 | 已发货订单 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | 订单服务 | — |
+| TC-S-05-P | SC-S-05 | 库存 | 服务商 | P1 | 权限 | 商品存在 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | 库存服务 | — |
+| TC-S-06-P | SC-S-06 | 售后 | 服务商 | P1 | 权限 | 有售后单 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | 售后 | — |
+| TC-S-07-P | SC-S-07 | 活动报名 | 服务商 | P2 | 权限 | 活动进行中 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | 活动管理 | — |
+| TC-S-08-P | SC-S-08 | 对账 | 服务商 | P1 | 权限 | 账期到 | 1. 操作非本服务商订单/商品(发货/核销/改库存/退款) 2. 观察 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | 结算 | — |

+ 2 - 0
tests/user-scenarios/README.md

@@ -3,6 +3,8 @@
 > 本目录从**真实用户视角**描述产品「怎么被使用」,是 `test-cases/` 的上游输入。
 > 每个场景遵循格式:**用户故事(作为 X,我想 Y,以便 Z)→ 前置条件 → 主流程 → 异常/边界 → 关联需求/设计 → 关联用例**。
 
+> **📌 测试用例划分口径(权威)**:测试用例以「**角色场景**」为一级维度组织。先读 [`应用场景总览.md`](./应用场景总览.md)——它按「角色 × 业务域」给出全部 **151 个应用场景**(稳定编号 `SC-角色-NN`),并规定每个场景派生 3 类用例(正常流/异常流/权限流)、编号回链与优先级映射。本文 01~06 是各角色的完整叙事细节,总览是上层目录与追溯矩阵。
+
 ## 角色与场景索引
 
 | 文件 | 角色 | 核心场景 |

+ 282 - 0
tests/user-scenarios/应用场景总览.md

@@ -0,0 +1,282 @@
+# 应用场景总览(按角色场景划分)
+
+> **本文档是测试用例的一级组织口径**:测试用例(见 `../test-cases/`)一律按「角色场景」聚类——每个场景有稳定 ID `SC-角色-NN`,其下派生多条用例(正常流 / 异常流 / 权限流),用例编号回链到本表。
+>
+> 角色视角的完整叙述见同目录 `01-guest.md` ~ `06-vendor.md`;本文是上层场景目录与追溯矩阵,避免重复叙述、只给「可派生用例」的锚点。
+>
+> **术语口径**:`AGENTS.md` 已废弃「孩子」概念,统一为「能登录用户 / 不能登录用户」。本表保留「孩子端」作为**视角标签**(仅描述"以孩子身份登录的界面"),数据归属用「不能登录用户」表述。
+
+---
+
+## 一、角色与业务域矩阵
+
+| 角色 | 角色标签 | 业务域 | 场景数 |
+|------|----------|--------|--------|
+| 游客 | `guest` | 进入 / 登录注册 / 浏览转化 / 权限边界 / 环境 | 10 |
+| 家长 | `parent` | 家庭成员 / 任务激励 / 五维能量健康 / 报告闭环 / 饮食食谱 / 测评规划价值链 / 商城会员 / 联系人 / 设置 | 66 |
+| 孩子(不能登录用户视角) | `child` | 孩子端登录 / 任务游戏 / 心愿 / 只读报告 / 方案打卡 / 勋章 / 成长 | 18 |
+| 成长规划师 | `teacher` | 登录切换 / 绑定家庭 / 代传报告 / 方案审核激活 / 测评录入 / 成长计划套餐 / DAN | 22 |
+| 平台运营 | `admin` | 登录统计 / 报告解析中台 / 文章审核 / 配置CRUD / 知识库 / 迁移校验 / 监控 | 15 |
+| 商品服务商 | `vendor` | 入驻 / 商品 / 订单履约 / 售后 | 8 |
+| 跨角色 | `cross` | 测评全链路 / 报告闭环 / 双角色隔离 / 商城履约 / 消息通知 | 12 |
+| **合计** | | | **151** |
+
+---
+
+## 二、游客(Guest)应用场景
+
+**业务域:首次进入 → 身份认证 → 浏览转化 → 权限边界 → 环境自适应**
+
+- **SC-G-01 · 首次进入小程序/落地页** — 目标:未登录也能看到产品形态。流程:打开 → 落地页/引导 → 触发登录引导。边界:网络异常展示重试;微信环境探测失败降级提示。模块:`config.js` 环境自适应。
+- **SC-G-02 · 微信授权登录** — 目标:微信身份一键登录。流程:点登录 → 微信 OAuth → 回跳建/取 User + openid。边界:拒绝授权回退手机号;openid 已存在直接登录不重复建号。模块:`AuthController`。
+- **SC-G-03 · 手机号+验证码登录** — 目标:无微信也能登录。流程:输手机号 → 取验证码 → 校验 → 登录。边界:验证码错误/过期提示重发;号码格式非法拦截。模块:`AuthController`。
+- **SC-G-04 · 邀请码注册加入家庭** — 目标:通过分享链接成为成员。流程:打开邀请落地页 → 注册/登录 → `register-with-invite` 绑定家庭。边界:邀请码失效/篡改拒绝;重复加入幂等。模块:`FamilyInviteController`。
+- **SC-G-05 · 浏览商城/文章(未登录受限)** — 目标:先逛后转。流程:进入商城/文章列表 → 查看公开内容。边界:受限操作(下单/评论)重定向登录。模块:`ArticleController` / `MallController`。
+- **SC-G-06 · 越权接口拦截** — 目标:未登录不可触达受保护资源。流程:直接调 `/api/**` 受保护接口。边界:`JwtInterceptor` 拦截(8 个公开路径除外);缺 token → 401/403,不泄露内部错误。模块:`JwtInterceptor`。
+- **SC-G-07 · 微信测试模式跳过授权** — 目标:联调期免真微信。流程:开 `wechat.test-mode:true` → 用模拟数据登录。边界:仅测试环境生效;生产强制真授权。模块:AGENTS.md 测试模式。
+- **SC-G-08 · 环境自适应切换** — 目标:develop/trial/release 自动选 API。流程:`uni.getAccountInfoSync()` 判定环境 → 切对应 API 地址。边界:环境识别失败回退默认。模块:`config.js`。
+- **SC-G-09 · 退出登录** — 目标:安全退出。流程:个人中心 → 退出 → 清 token 回登录页。边界:退出后本地缓存敏感数据清除。模块:`AuthController`。
+- **SC-G-10 · 账号不存在引导注册** — 目标:新用户顺畅注册。流程:登录失败提示「未注册」→ 引导注册流程。边界:已注册账号不重复建档。模块:`AuthController`。
+
+**派生用例**:`test-cases/guest.md` TC-G-01~10(已覆盖 SC-G-01~10)。
+
+---
+
+## 三、家长(Parent)应用场景
+
+### 业务域 A:家庭与成员管理
+
+- **SC-P-01 · 创建家庭 + 邀请二维码** — 目标:建全家共用空间。流程:创建家庭 → 生成邀请码+二维码(令牌+落地页)→ 成为管理员。边界:重名/空名 400;重复创建按业务限制。模块:`FamilyInviteController`。
+- **SC-P-02 · 邀请成员 + 关系编辑** — 目标:维护家庭结构。流程:分享邀请 → 成员加入 → `RelationshipPicker` 选关系 → 关系图更新。边界:关系类型不存在选择器不显示;删除成员前代管数据确认。模块:`FamilyMembersController` / `RelationshipTypes.vue`。
+- **SC-P-03 · 双角色切换(家长↔孩子)** — 目标:以孩子视角核对体验。流程:切换视角 → 选孩子 → 隔离为 B 视角 → 切回需二次校验。边界:**孩子端不能切回家长**;B 为 `local` 时代管可见。模块:`POST /api/family/member/switch`。
+- **SC-P-04 · 家庭成员列表查看** — 目标:掌握全家成员。流程:家庭首页 → 成员列表(含角色/关系/在线)。边界:仅本家庭成员可见;分页/搜索。模块:`FamilyMembersController`。
+- **SC-P-05 · 编辑成员资料** — 目标:维护姓名/关系/生日/性别。流程:选成员 → 编辑 → 保存。边界:必填缺失拦截;生日格式校验。模块:`FamilyMembersController`。
+- **SC-P-06 · 移除/删除成员** — 目标:清理离家庭成员。流程:移除成员 → 确认 → 处理其代管数据归属。边界:管理员不可移除自己;代管数据需指定承接人或归档。模块:`FamilyMembersController`。
+- **SC-P-07 · 家庭关系图查看** — 目标:直观看家庭结构。流程:打开关系图 → 节点+关系标签渲染。边界:关系缺失的节点降级展示。模块:家庭关系图重设计。
+- **SC-P-08 · 成员权限设置** — 目标:限定成员可操作范围。流程:设成员查看/编辑权限。边界:越权设置被拒;最低权限保底。模块:`FamilyMembersController`。
+- **SC-P-09 · 邀请码失效/重生成** — 目标:旧码作废换新。流程:失效旧码 → 生成新码。边界:旧码已加入的会员不受影响。模块:`FamilyInviteController`。
+
+### 业务域 B:任务与激励
+
+- **SC-P-10 · 创建任务 + 下发** — 目标:布置习惯任务。流程:建任务(成员/积分/频率)→ 下发 → B 列表待执行。边界:重复提交不重复发分;频率/截止边界。模块:`TaskController` / `PointsController`。
+- **SC-P-11 · 任务审批完成(通过/驳回)** — 目标:验收孩子成果。流程:B 完成提交 → 家长待审批 → 通过发分 / 驳回重做。边界:重复审批幂等;驳回后状态可重做。模块:`TaskController`。
+- **SC-P-12 · 任务频率/周期配置** — 目标:设日/周/自定义周期。流程:配频率 → 按周期自动生成实例。边界:周期计算跨月/跨年正确;暂停/恢复。模块:`TaskController`。
+- **SC-P-13 · 心愿创建-审批-兑换闭环** — 目标:激励正向行为。流程:B 建心愿 → 家长待审批 → 通过扣积分兑换 / 驳回失效。边界:积分不足拦截;驳回后不可再兑。模块:`WishController` / `RewardController`。
+- **SC-P-14 · 心愿驳回/失效处理** — 目标:异常心愿收口。流程:驳回 → 心愿失效 → 可重新提。边界:已兑换不可驳回。模块:`WishController`。
+- **SC-P-15 · 积分明细查看** — 目标:核对积分来源。流程:个人中心 → 积分明细(来源/变更/余额)。边界:分页;时间筛选。模块:`PointsController`。
+- **SC-P-16 · 积分流水对账** — 目标:确保账目一致。流程:比对积分总额与流水合计。边界:删除/回退有负流水;不一致报警。模块:`PointsController`。
+
+### 业务域 C:五维能量与健康
+
+- **SC-P-17 · 查看五维能量 / 健康指数** — 目标:掌握健康结构。流程:进入身/心/智/行/富 → 展示分配(总和=100%)→ 看能量流水。边界:比例配置错误≠100% 报警;无数据空态不 500。模块:`EnergyController`。
+- **SC-P-18 · 能量流水查看** — 目标:追溯能量来源。流程:能量明细(任务/打卡/测评)。边界:时间格式统一。模块:`EnergyController`。
+- **SC-P-19 · 能量维度配置查看** — 目标:理解维度口径。流程:查看身/心/智/行/富定义与权重。边界:配置未同步时展示兜底。模块:维度配置(Web 管理端)。
+- **SC-P-20 · 健康报告 PDF 上传解析(上传报告)⭐** — 目标:上传孩子菌群报告自动解析。流程:选 PDF 上传 → 识别 `gut_flora` → 三阶段(上传/预览/确认)→ 入库刷新七维。边界:非募极生物报告提示;解析失败进未知聚类。模块:健康报告解析中台 / `POST /api/media/upload`。
+- **SC-P-21 · 报告类型识别** — 目标:自动判别报告种类。流程:解析 → 匹配已注册类型。边界:未知类型进未知聚类待运营自学习。模块:`/api/admin/report-parser/types`。
+- **SC-P-22 · 报告解析预览** — 目标:入库前核对。流程:看菌群健康分/平衡/多样性/菌种明细/疾病风险预览。边界:预览数据异常提示不入库。模块:解析中台。
+- **SC-P-23 · 报告确认入库** — 目标:落库生效。流程:确认 → 报告进档案 → 七维刷新。边界:确认前可取消不入库。模块:解析中台。
+- **SC-P-24 · 多报告管理/对比** — 目标:管理历史报告。流程:报告列表 → 查看/删除/对比。边界:删除有关联方案时提示。模块:报告管理。
+- **SC-P-25 · 报告趋势查看** — 目标:看健康变化。流程:同类型报告时间序列 → 趋势图。边界:单报告无趋势;时间轴正确。模块:报告/成长。
+- **SC-P-26 · 基于报告饮食推荐** — 目标:安排一日三餐。流程:身→饮食推荐 → 按菌群生成可吃/慎吃清单。边界:无报告无推荐;随报告刷新。模块:饮食推荐系统。
+- **SC-P-27 · 家庭食谱生成(一日三餐)⭐ 家庭食谱** — 目标:产出可执行食谱。流程:基于菌群报告+营养目标 → 生成早/午/晚食谱(食材/用量/禁忌标注)。边界:无报告降级通用食谱;忌口/过敏自动排除。模块:饮食推荐系统 / 家庭食谱。
+- **SC-P-28 · 食谱按食材筛选/忌口** — 目标:个性化食谱。流程:设忌口/过敏 → 食谱重算排除项。边界:忌口冲突时提示。模块:饮食推荐。
+- **SC-P-29 · 食谱收藏/调整** — 目标:沉淀常用食谱。流程:收藏食谱 → 手动微调(替换食材)。边界:调整不破坏营养目标。模块:饮食推荐。
+- **SC-P-30 · 食谱与营养目标对齐** — 目标:确保食谱达标。流程:看食谱营养合计 vs 目标。边界:超标/不足提示。模块:饮食推荐。
+
+### 业务域 D:测评与成长规划价值链(核心)
+
+- **SC-P-31 · 浏览测评类型(DAN 8 类)** — 目标:了解可选测评。流程:测评页 → 列 DAN 8 类(mind/wisdom/cognition/learning/behavior/career/campus/adolescent)。边界:类目数据来自后端字典。模块:`DanAssessmentController`。
+- **SC-P-32 · 选择规划师** — 目标:指定服务规划师。流程:测评选规划师 → 绑定的 T 列表。边界:未绑定规划师提示先绑定。模块:测评订单。
+- **SC-P-33 · 购买测评套餐/下单** — 目标:下单测评。流程:选套餐 → 生成 `AssessmentOrder`(pending)。边界:套餐下架不可下单。模块:`AssessmentOrder`。
+- **SC-P-34 · 测评订单支付** — 目标:完成支付。流程:支付 → 订单 pending→paid → **生成测评额度 `AssessmentQuota`**。边界:支付失败回滚不生成额度。模块:支付/`AssessmentOrder`。
+- **SC-P-35 · 获得测评额度** — 目标:拿到可消耗额度。流程:支付成功 → 额度到账(含有效期)。边界:额度过期不可用于预约。模块:`AssessmentQuota`。
+- **SC-P-36 · 创建预约(消耗额度)⭐** — 目标:约规划师时间。流程:`POST /api/assessment/appointment/create` → **先消耗一条额度** → 落预约。边界:额度不足/过期直接报错不落预约。模块:`AssessmentAppointmentController`。
+- **SC-P-37 · 查看预约状态** — 目标:掌握进度。流程:预约列表 → 状态(待确认/已确认/已完成/已取消/未到)。边界:状态机守卫。模块:`AssessmentAppointmentController`。
+- **SC-P-38 · 取消预约(越权校验)** — 目标:取消不再需要的预约。流程:取消 → 状态变更。边界:**非本人/非绑定规划师取消被拒(CFC-AP 取消越权)**;取消不退款逻辑。模块:`AssessmentAppointmentController`。
+- **SC-P-39 · 查看测评结果(DAN 报告)** — 目标:看孩子测评分。流程:结果页 → 八类报告展示。边界:结果未录入不展示;量纲标注。模块:`DanAssessmentResultDTO`(已补齐)。
+- **SC-P-40 · 生成 AI 方案(一键生成)⭐ 生成方案** — 目标:出个性化方案。流程:选孩子+目标 → LangGraph(`AiGateway` 转发) → 生成 overview+三板块。边界:未购会员提示购买;AI 超时 `AiGateway` Fallback 不 500。模块:`AIChatController` / `AiGateway`。
+- **SC-P-41 · 方案分板块重生成** — 目标:迭代优化方案。流程:逐板块重新生成/确认。边界:重生成不丢其他板块。模块:`AIChatController`。
+- **SC-P-42 · 方案编辑/调整** — 目标:人工微调。流程:编辑方案文本/任务项。边界:编辑后状态标记已改。模块:方案管理。
+- **SC-P-43 · 查看生成的方案** — 目标:审阅方案内容。流程:方案详情 → 看板块/任务。边界:空方案不白屏。模块:方案管理。
+- **SC-P-44 · 确认方案(送审/家长确认)⭐ 确认方案** — 目标:确认方案进入下一步。流程:家长确认/提交规划师审核 → 状态 generated→reviewed。边界:未确认不可激活;确认幂等。模块:方案管理状态机。
+- **SC-P-45 · 方案直接发布** — 目标:按配置直发。流程:配置允许 → 确认即发布 active。边界:需审核配置时走审核流。模块:方案管理。
+- **SC-P-46 · 激活方案生成任务(生成任务)⭐ 生成任务** — 目标:方案拆出可执行任务。流程:激活 reviewed→active → 生成引导+模板任务 → B 出现启动任务。边界:已激活再激活**不重复生成(幂等靠状态机,CFC 深挖项)**;失败回滚不残半任务。模块:方案激活任务分解。
+- **SC-P-47 · 查看方案下任务列表** — 目标:跟踪执行。流程:方案 → 关联任务列表(状态/进度)。边界:任务增删与方案同步。模块:`GrowthPlanController`。
+- **SC-P-48 · 方案版本/历史** — 目标:回溯方案变更。流程:看方案版本列表 → 对比。边界:版本不可篡改。模块:方案管理。
+- **SC-P-49 · AI 健康管家对话 ⭐** — 目标:随时问健康管家。流程:进对话 → `POST /api/ai/health-coach/send` → 多轮上下文。边界:LangGraph 不可用 Fallback;敏感问题不泄露隐私。模块:`AIChatController`。
+
+### 业务域 E:成长记录与档案
+
+- **SC-P-50 · 成长记录查看** — 目标:看孩子成长轨迹。流程:成长记录页 → 时间线(任务/测评/报告/打卡)。边界:数据缺失项跳过不报错。模块:`GrowthController`。
+- **SC-P-51 · 成长里程碑** — 目标:标记关键节点。流程:系统/手动标里程碑 → 时间线高亮。边界:重复标幂等。模块:`GrowthController`。
+
+### 业务域 F:商城与会员
+
+- **SC-P-52 · 商品浏览/搜索** — 目标:发现商品。流程:商城列表/搜索/分类。边界:下架商品不展示。模块:`MallController` / `danshop`。
+- **SC-P-53 · 商品详情** — 目标:看商品信息。流程:详情页(描述/价格/库存)。边界:库存为 0 提示。模块:`MallController`。
+- **SC-P-54 · 加购/下单** — 目标:提交订单。流程:加购 → 结算 → 生成订单。边界:库存不足拦截;重复下单幂等。模块:`MallController`。
+- **SC-P-55 · 订单支付** — 目标:完成购买。流程:支付 → 订单paid。边界:支付失败回滚。模块:支付。
+- **SC-P-56 · 订单查询/退款** — 目标:管理订单。流程:订单列表 → 详情/申请退款。边界:已发货退款规则;重复退款拦截。模块:订单服务。
+- **SC-P-57 · 优惠券使用** — 目标:享优惠。流程:选券 → 结算抵扣。边界:券过期/不满足门槛不可用。模块:优惠券。
+- **SC-P-58 · 购买会员/套餐** — 目标:解锁高级能力。流程:选档位 → 支付 → 权益生效。边界:支付失败回滚;重复购买幂等。模块:`MemberController`。
+- **SC-P-59 · 会员权益查看** — 目标:明确权益。流程:会员页 → 权益列表/有效期。边界:权益随档位变化。模块:`MemberController`。
+- **SC-P-60 · 会员续费** — 目标:延续权益。流程:到期前续费 → 延期。边界:续费叠加计算正确。模块:`MemberController`。
+
+### 业务域 G:联系人与社交
+
+- **SC-P-61 · 联系人添加** — 目标:管理外部联系人。流程:添加联系人(姓名/电话/关系)。边界:重复号码去重。模块:`ContactCard` / `contact-detail`。
+- **SC-P-62 · 联系人分组/导入** — 目标:批量管理。流程:建分组 → 导入(`ContactImport`)。边界:导入格式错误行跳过并报告。模块:`ContactImport`。
+- **SC-P-63 · 联系人详情/权限** — 目标:查看与授权。流程:联系人详情 → 设可见权限。边界:越权查看被拒。模块:`ContactCard`。
+
+### 业务域 H:设置与通知
+
+- **SC-P-64 · 个人资料编辑** — 目标:维护自身信息。流程:编辑昵称/头像/绑定手机。边界:手机格式校验。模块:`AuthController`。
+- **SC-P-65 · 消息通知/提醒设置** — 目标:控制推送。流程:设通知开关/提醒时间。边界:关闭后仍保关键安全通知。模块:消息服务。
+- **SC-P-66 · 隐私设置** — 目标:保护数据。流程:设数据共享范围。边界:最小权限保底。模块:隐私设置。
+
+**派生用例**:`test-cases/parent.md` TC-P-01~66(已覆盖 SC-P-01~66;SC-P-20/36/38/40/44/46/49 等含深挖项见 `deep-dive-assessment-appointment.md` TC-DV-01~10)。
+
+---
+
+## 四、孩子(不能登录用户视角)应用场景
+
+- **SC-C-01 · 孩子端登录(无家长入口)** — 目标:以孩子身份进端。流程:自身账号登录 → 孩子端布局。边界:**无家长切换入口**;不能登录用户由家长代管数据。模块:`AuthController`。
+- **SC-C-02 · 执行任务 / 小游戏得积分** — 目标:完成日常获反馈。流程:看任务列表 → 完成/玩小游戏 → 积分+流水。边界:重复提交不重复发分;成绩上报幂等。模块:`TaskController` / `MiniGameController`。
+- **SC-C-03 · 小游戏成绩上报** — 目标:记录游戏表现。流程:完游戏 → 上报分数 → 关联能量/任务。边界:异常分数拦截。模块:`MiniGameController`。
+- **SC-C-04 · 提心愿** — 目标:表达想要。流程:建心愿(名称+积分)→ 进家长待审批。边界:积分超额提示;被驳回不可兑。模块:`WishController`。
+- **SC-C-05 · 任务打卡 ⭐** — 目标:跟进成长方案。流程:打开方案启动任务 → 打卡提交。边界:逾期限打卡提示;重复打卡幂等。模块:`GrowthPlanController`。
+- **SC-C-06 · 查看能量与报告(只读)** — 目标:了解自己状态。流程:看五维能量/报告 → 只读不编辑。边界:看不到其他成员隐私。模块:`EnergyController`。
+- **SC-C-07 · 查看 DAN 测评报告** — 目标:看自己测评结果。流程:报告页 → 八类展示。边界:结果未录入不展示。模块:`DanAssessmentController`。
+- **SC-C-08 · 方案打卡进度** — 目标:看方案完成度。流程:方案 → 任务完成进度。边界:进度计算正确。模块:`GrowthPlanController`。
+- **SC-C-09 · 勋章墙** — 目标:获得成就感。流程:查看已得勋章 → 展示达成条件。边界:勋章来自任务/打卡聚合。模块:`MedalController`。
+- **SC-C-10 · 勋章解锁提醒** — 目标:及时反馈。流程:达成条件 → 解锁 + 推送。边界:重复达成不重复发。模块:`MedalController`。
+- **SC-C-11 · 成长记录查看(孩子视角)** — 目标:看自己成长。流程:成长时间线 → 只读。边界:仅本人数据。模块:`GrowthController`。
+- **SC-C-12 · 饮食食谱查看** — 目标:看今日吃什么。流程:打开家庭食谱 → 当日三餐。边界:无食谱空态。模块:饮食推荐。
+- **SC-C-13 · AI 对话(孩子视角)** — 目标:问成长问题。流程:进对话 → 发送 → 多轮。边界:内容适龄过滤。模块:`AIChatController`。
+- **SC-C-14 · 任务驳回重做** — 目标:修正未过任务。流程:被驳回 → 重做 → 再提交。边界:驳回后可重做。模块:`TaskController`。
+- **SC-C-15 · 消息接收** — 目标:收家长/规划师消息。流程:消息列表 → 已读。边界:越权消息不可见。模块:消息服务。
+- **SC-C-16 · 个人资料查看(受限)** — 目标:看自己信息。流程:资料页 → 只读/部分可改。边界:敏感字段家长代管。模块:`AuthController`。
+- **SC-C-17 · 退出登录** — 目标:安全退出。流程:退出 → 清 token。边界:退出清缓存。模块:`AuthController`。
+- **SC-C-18 · 设备/账号绑定校验** — 目标:防冒用。流程:登录设备校验。边界:异常设备二次验证。模块:`AuthController`。
+
+**派生用例**:`test-cases/child.md` TC-C-01~18(已覆盖 SC-C-01~18)。
+
+---
+
+## 五、成长规划师(Teacher, role=teacher)应用场景
+
+- **SC-T-01 · 规划师登录 + 切回家长** — 目标:进工作台/回自身家庭。流程:密码登录 → 仪表板 → 可切回家长视角。边界:仅见绑定家庭;不越权无关家庭。模块:`AuthController`。
+- **SC-T-02 · 绑定测试家庭** — 目标:代管客户家庭。流程:输邀请码 → 绑定 → 出现在「我的家庭」。边界:无效/失效码拒绝;重复绑定幂等。模块:`FamilyInviteController`。
+- **SC-T-03 · 代传报告 + 确认入库(上传报告)⭐** — 目标:帮客户上传解析。流程:上传 PDF+选孩子 → 上传/预览/确认 → 入孩子档案。边界:识别失败进草稿;确认前可取消不入库。模块:健康报告解析中台。
+- **SC-T-04 · 方案审核列表 + 批准** — 目标:审家长方案。流程:方案管理页列表(generated/reviewed/active)→ 批准 generated→reviewed。边界:列表参数错误已修复;空列表正常。模块:方案管理(规划师/运营共用)。
+- **SC-T-05 · 激活方案拆任务(幂等)⭐ 生成任务** — 目标:自动拆引导+模板任务。流程:激活 reviewed→active → 生成任务 → B 出现启动任务。边界:已激活再激活**不重复生成(幂等)**;失败回滚不残半任务。模块:方案激活任务分解。
+- **SC-T-06 · 家庭任务审核** — 目标:审孩子提交。流程:任务列表 → 通过给分/驳回重做。边界:越权审非绑定家庭被拒;重复审核幂等。模块:`TaskController`。
+- **SC-T-07 · 录入测评结果触发方案 ⭐** — 目标:规则引擎出方案。流程:开测评订单 → 录各维度分 → 保存 → 触发规则生成 generated 方案(DAN 链路同)。边界:必填缺失拦截;重复录入覆盖非新增。模块:`AssessmentAppointmentController` / `DanAssessmentController`。
+- **SC-T-08 · 成长计划 / 套餐创建** — 目标:上架可购套餐。流程:成长计划页建「专注力套餐」含任务项 → 提交审核 → 通过上架。边界:任务项为空拦截;未审不可购。模块:`GrowthPlanController` / `GuidePackageController`。
+- **SC-T-09 · 测评预约确认(状态守卫)** — 目标:确认孩子到约。流程:预约 → 确认(待确认→已确认)。边界:**确认无状态守卫,越状态确认需校验(CFC-AP 确认无守卫)**。模块:`AssessmentAppointmentController`。
+- **SC-T-10 · 测评预约完成/未到** — 目标:闭环预约。流程:完成(已确认→已完成)/标记未到(→未到)。边界:状态机合法流转。模块:`AssessmentAppointmentController`。
+- **SC-T-11 · DAN 报告上传与解析** — 目标:录入专业测评。流程:上传 DAN 报告 → 解析 blocks(category 键)→ 确认 → 生成方案。边界:解析失败回退人工。模块:`DanReportParseService` / `DanReportUpload`。
+- **SC-T-12 · DAN 八类报告查看** — 目标:审阅八类结果。流程:结果页 → mind/wisdom/cognition/.../adolescent 分屏。边界:量纲标注正确。模块:`DanAssessmentResultDTO`。
+- **SC-T-13 · 规划师视角数据隔离** — 目标:仅见绑定家庭。流程:列家庭/成员/报告。边界:非绑定家庭 403。模块:控制器内 role 检查。
+- **SC-T-14 · 方案编辑(规划师侧)** — 目标:专业调整方案。流程:编辑板块/任务项 → 保存。边界:编辑后状态标记。模块:方案管理。
+- **SC-T-15 · 套餐任务项管理** — 目标:维护套餐内容。流程:增删任务项 → 重算。边界:空套餐拦截上架。模块:`GuidePackageController`。
+- **SC-T-16 · 客户健康总览** — 目标:一眼看客户状态。流程:家庭仪表板 → 能量/报告/方案汇总。边界:数据缺失降级。模块:仪表板。
+- **SC-T-17 · 成长计划进度跟踪** — 目标:跟进执行。流程:计划 → 任务完成度。边界:进度准确。模块:`GrowthPlanController`。
+- **SC-T-18 · 批量任务下发** — 目标:对多孩子发任务。流程:选多成员 → 批量建任务。边界:部分失败不影响其他。模块:`TaskController`。
+- **SC-T-19 · 消息推送客户** — 目标:触达客户。流程:发消息/提醒 → 客户收到。边界:免打扰设置生效。模块:消息服务。
+- **SC-T-20 · 退出/切换账号** — 目标:安全退出。流程:退出 → 清 token。边界:退出清缓存。模块:`AuthController`。
+- **SC-T-21 · 报告对比分析** — 目标:看客户变化。流程:多报告对比 → 差异标注。边界:报告类型一致才可比对。模块:报告管理。
+- **SC-T-22 · 方案归档** — 目标:结束方案。流程:方案完成 → 归档。边界:归档后只读。模块:方案管理。
+
+**派生用例**:`test-cases/teacher.md` TC-T-01~22(已覆盖 SC-T-01~22;SC-T-05/07/09/11 含深挖项)。
+
+---
+
+## 六、平台运营(Admin)应用场景
+
+- **SC-A-01 · 管理端登录 + 全局统计** — 目标:掌握平台大盘。流程:管理端登录 → 看全局统计(用户/家庭/订单/能量)。边界:角色非 admin 拦截;口径一致。模块:`cfc-web` Element UI。
+- **SC-A-02 · 报告解析中台(类型/聚类)** — 目标:维护解析能力。流程:看已注册类型(含 `gut_flora`)→ 未知聚类 → 自学习标注。边界:新类型需先注册再解析。模块:`/api/admin/report-parser/*`。
+- **SC-A-03 · 文章发布-审核** — 目标:内容上线。流程:写文章 → 提交审核 → 运营审 → 发布/驳回。边界:未审不可见;驳回带原因。模块:`ArticleController`。
+- **SC-A-04 · 关系类型 CRUD** — 目标:管理家庭关系。流程:关系类型增删改查 → 生效。边界:被引用时删需确认。模块:`RelationshipTypes.vue`。
+- **SC-A-05 · 勋章配置 CRUD** — 目标:管理成就体系。流程:勋章增删改 → 生效。边界:已发放勋章不可删(停用代替)。模块:勋章配置。
+- **SC-A-06 · 供应商管理** — 目标:管理服务商。流程:供应商列表/审核/停用。边界:有在售商品的供应商停用需先下架。模块:供应商管理。
+- **SC-A-07 · 活动配置** — 目标:运营活动。流程:建活动(规则/时间/奖品)→ 上线。边界:时间冲突校验。模块:活动管理。
+- **SC-A-08 · 知识库管理** — 目标:维护 AI 知识。流程:知识条目 CRUD → 向量同步。边界:同步失败重试;大批量分批。模块:知识库管理(Web)。
+- **SC-A-09 · 维度配置与知识库管理** — 目标:维护五维口径。流程:维度/权重配置 → 生效。边界:配置变更影响存量计算提示。模块:维度配置(Web)。
+- **SC-A-10 · 数据迁移 / 参数校验** — 目标:保障数据正确。流程:跑迁移脚本 → 校验参数 → 确认无孤儿数据。边界:迁移幂等;字段校验失败阻断。模块:`DatabaseInitializer`。
+- **SC-A-11 · 用户/家庭查询治理** — 目标:处理客诉。流程:查用户/家庭 → 代操作(限授权)。边界:代操作留审计。模块:管理端。
+- **SC-A-12 · 订单/退款人工处理** — 目标:处理异常订单。流程:查订单 → 手动退款/补发。边界:重复退款拦截;留审计。模块:订单服务。
+- **SC-A-13 · 内容安全审核** — 目标:过滤违规。流程:UGC 审核 → 通过/下架。边界:敏感词命中拦截。模块:内容安全。
+- **SC-A-14 · 系统监控/告警** — 目标:保障可用。流程:看监控 → 告警处理。边界:误报确认消除。模块:监控。
+- **SC-A-15 · 操作审计日志** — 目标:可追溯。流程:查审计日志 → 溯源。边界:日志不可篡改。模块:审计。
+
+**派生用例**:`test-cases/admin.md` TC-A-01~16(已覆盖 SC-A-01~15,超覆盖 1 条)。
+
+---
+
+## 七、商品服务商(Vendor)应用场景
+
+- **SC-S-01 · 入驻申请** — 目标:成为服务商。流程:提交资质 → 平台审核 → 入驻成功。边界:资质不全驳回;重复申请幂等。模块:服务商管理。
+- **SC-S-02 · 商品管理(上架/编辑)** — 目标:维护商品。流程:建/改商品(名称/库存/价格)→ 上架。边界:库存为负拦截;下架不可购。模块:`MallController` / `danshop`。
+- **SC-S-03 · 订单处理(发货)** — 目标:履约发货。流程:看订单 → 发货 → 状态更新。边界:库存不足不可发。模块:订单服务。
+- **SC-S-04 · 订单核销(到店)** — 目标:线下核销。流程:扫码核销 → 完成。边界:重复核销幂等;超期处理。模块:订单服务。
+- **SC-S-05 · 库存管理** — 目标:保障供应。流程:调库存 → 同步。边界:负库存拦截。模块:库存服务。
+- **SC-S-06 · 售后/退款处理** — 目标:处理退换。流程:收售后 → 同意/拒 → 退款。边界:重复退款拦截。模块:售后。
+- **SC-S-07 · 营销活动报名** — 目标:参与平台活动。流程:报名活动 → 商品打标。边界:活动失效不可报。模块:活动管理。
+- **SC-S-08 · 对账/结算** — 目标:核对收入。流程:看账单 → 结算。边界:账期正确。模块:结算。
+
+**派生用例**:`test-cases/vendor.md` TC-S-01~08(已覆盖 SC-S-01~08)。
+
+---
+
+## 八、跨角色 E2E 应用场景
+
+- **SC-X-01 · 测评全链路 ⭐** — 目标:端到端验证测评价值。流程:家长购套餐→订单paid→获额度→创建预约(耗额度)→规划师确认/完成→录入结果→生成方案→孩子打卡。边界:任一环节断点可回退;额度为不可逾越闸门。模块:测评全栈。
+- **SC-X-02 · 报告闭环 ⭐** — 目标:端到端验证健康价值。流程:家长/规划师上传 PDF → 解析入库 → 饮食推荐 → AI 方案 → 孩子执行。边界:解析失败有降级;推荐随报告刷新。模块:报告+AI 全栈。
+- **SC-X-03 · 双角色数据隔离越权** — 目标:验证权限边界。流程:孩子调家长接口 → 拒;规划师调非绑定家庭 → 拒;家长切孩子仅见 B 数据。边界:越权统一 403/401。模块:`JwtInterceptor` + 控制器 role 检查。
+- **SC-X-04 · 家庭邀请闭环** — 目标:新成员进家庭。流程:家长生成邀请 → 他人注册加入 → 关系编辑 → 数据可见。边界:失效码拒绝。模块:`FamilyInviteController`。
+- **SC-X-05 · 任务激励闭环** — 目标:任务→积分→心愿。流程:家长建任务 → 孩子完成 → 家长审 → 发分 → 孩子提心愿 → 家长兑。边界:重复/不足拦截。模块:任务+心愿+积分。
+- **SC-X-06 · 方案激活执行闭环** — 目标:方案变任务孩子执行。流程:规划师激活 → 生成任务 → 孩子打卡 → 家长/规划师审 → 勋章。边界:幂等/重复拦截。模块:方案+任务+勋章。
+- **SC-X-07 · 商城履约闭环** — 目标:下单到核销。流程:家长下单 → 支付 → 服务商发货/核销 → 确认收货 → 评价。边界:退款/重复核销。模块:商城全栈。
+- **SC-X-08 · 文章发布闭环** — 目标:内容上线。流程:作者写 → 运营审 → 发布 → 用户读。边界:未审不可见。模块:文章全栈。
+- **SC-X-09 · AI 方案送审闭环** — 目标:家长生成→规划师审→激活。流程:家长生成方案 → 送审 → 规划师批准 → 激活。边界:未确认不可激活。模块:方案全栈。
+- **SC-X-10 · 报告对比趋势闭环** — 目标:看健康改善。流程:多次上传 → 对比 → 趋势 → 方案调整。边界:类型一致才可比。模块:报告+成长。
+- **SC-X-11 · 消息通知闭环** — 目标:跨角色触达。流程:规划师发消息 → 家长/孩子收 → 已读。边界:免打扰生效。模块:消息全栈。
+- **SC-X-12 · 会员权益闭环** — 目标:购买到解锁。流程:家长购会员 → 权益生效 → AI 方案/高级报告解锁。边界:过期回收。模块:会员全栈。
+
+**派生用例**:`test-cases/cross-role-e2e.md` TC-X-01~12(已覆盖 SC-X-01~12)。
+
+---
+
+## 九、测试用例划分规则(落地口径)
+
+1. **一级维度 = 角色场景**:每个 `SC-角色-NN` 是测试用例聚类的根节点。
+2. **二级维度 = 流类型**:每个场景派生 3 类用例
+   - 正常流(happy path)
+   - 异常流(参数/状态/业务规则失败)
+   - 权限流(越权/角色错配/数据隔离)
+3. **编号回链**:用例编号 `TC-角色-NN` 与场景 `SC-角色-NN` 一一对应;深挖项用 `TC-DV-NN` 单独成册。
+4. **优先级映射**(P0 核心闭环优先):
+   - **P0**:SC-P-01/03/10/11/13/20/36/38/40/44/46/49、SC-T-03/05/07/09/11、SC-X-01/02/03/06
+   - **P1**:SC-P-17/21/23/26/27/31/32/33/34/35/37/39/41/42/43/45/47/52~60、SC-C-02/05/07/09、SC-T-01/02/04/06/08/12/13、SC-A-01/03/08/10、SC-S-02/03/04、SC-X-04/05/07/08/09/12
+   - **P2**:其余游客/配置/设置类(SC-G-*、SC-P-02/05/06/08/09/19/50/51/61~66、SC-C-01/03/04/06/08/10~18、SC-T-14~22、SC-A-02/04/05/06/07/09/11~15、SC-S-01/05~08、SC-X-10/11)
+5. **自动化对齐**:`tests/e2e/` 按角色分包(`e2e/roles/admin|child|parent|teacher`)与 API 层(`e2e/api/*`)对齐本表;DOM 层用例因 CFC-ENV-001 环境阻塞先标记未完成。
+
+---
+
+## 十、覆盖率追溯(场景 → 用例 → 自动化)
+
+| 角色 | 场景数 | 文档化用例(TC) 现状 | 状态 |
+|------|--------|---------------------|------|
+| 游客 | 10 | 10(TC-G-01~10) | ✅ 已覆盖 SC-G-01~10 |
+| 家长 | 66 | 66(TC-P-01~66) | ✅ 已覆盖(含价值链 SC-P-20/27/31~49) |
+| 孩子 | 18 | 18(TC-C-01~18) | ✅ 已覆盖 SC-C-01~18 |
+| 规划师 | 22 | 22(TC-T-01~22) | ✅ 已覆盖(含 SC-T-05/07/09/11 深挖项) |
+| 运营 | 15 | 16(TC-A-01~16,超覆盖) | ✅ 已覆盖(多 1 条) |
+| 服务商 | 8 | 8(TC-S-01~08) | ✅ 已覆盖 SC-S-01~08 |
+| 跨角色 | 12 | 12(TC-X-01~12) | ✅ 已覆盖 SC-X-01~12 |
+| **合计** | **151** | **152** | ✅ 文档化用例已对齐全部 151 个场景 |
+
+> 统计口径:文档化用例来自 `../test-cases/*.md` 的 `TC-` 编号去重;自动化来自 `../e2e/**/*.spec.js` 的 `test()` 计数。详见巡检脚本 `run_interface_tests_cron.sh` 的「测试用例完成情况」检查。
+>
+> **缺口已补齐**:以本总览的 `SC-角色-NN` 为锚点,已新增约 81 条 TC(TC-G-06~10 / TC-P-19~66 / TC-C-10~18 / TC-T-13~22 / TC-S-04~08 / TC-X-09~12),现**每个 `SC-角色-NN` 均至少有 1 条用例**(多数含正常/异常/权限三类)。文档化用例层已无"场景无用例"缺口;DOM 层自动化缺口(CFC-ENV-001 远程无 SPA 前端)仍独立于本表存在,属环境限制而非用例缺失。