Procházet zdrojové kódy

test(docs): 新增五维指标变化专项场景并具体化全部异常流

- 新增 07-five-dimension.md 用户故事 ED-1~17(五维指标变化专项)
- 应用场景总览:合计 201→218,新增 §九 五维指标变化专项 SC-P-87~93/C-24~25/T-30~32/A-25~26/X-19~21
- 全仓异常流(-E)由模板文案改为具体故障注入+可判定断言(parent/child/teacher/admin/vendor/cross 全量,guest 上轮已完成)
- 权限流(-P)随专项补齐;README 统计更新为 713 条(正常/异常/权限各 219 + 非功能 56)

Co-Authored-By: WorkBuddy <noreply@workbuddy.ai>
Agnes Agent před 1 týdnem
rodič
revize
70b118db03

+ 6 - 6
tests/test-cases/README.md

@@ -36,7 +36,7 @@
 ## 文件索引
 
 > **三类用例结构**:每个角色文件在原有「正常流」用例之后,均追加了 `## 异常流用例(派生自正常流)` 与 `## 权限流用例(派生自正常流)` 两段。异常流编号后缀 `-E`、权限流后缀 `-P`,分别从每条正常流用例派生,实现「正常流 + 异常流 + 权限流」三类闭环。
-> 当前三类(功能向)合计:**正常流 202 + 异常流 202 + 权限流 202 = 606 条**;外加**非功能用例 56 条**(`## 非功能测试用例(性能/兼容/安全)` 段,编号后缀 `-N`:性能 21 / 兼容 10 / 安全 25),全仓用例总计 **662 条**(截至 2026-10-31)。非功能用例已落地两枚接口冒烟规格:
+> 当前三类(功能向)合计:**正常流 219 + 异常流 219 + 权限流 219 = 657 条**;外加**非功能用例 56 条**(`## 非功能测试用例(性能/兼容/安全)` 段,编号后缀 `-N`:性能 21 / 兼容 10 / 安全 25),全仓用例总计 **713 条**(截至 2026-11-02)。**异常流已全部改造为具体故障注入用例**(废除"系统给出明确错误提示而非 500"等模板文案;guest、五维专项及 parent/child/teacher/admin/vendor/cross 全量完成,每条 -E 均为明确故障注入 + 可判定断言),五维指标变化专项见各文件「五维指标变化专项」段。非功能用例已落地两枚接口冒烟规格:
 > - `tests/e2e/api/nonfunc-security.spec.js`(安全类 11 用例,覆盖 TC-G-N04 / TC-P-N09·N10·N11 / TC-A-N05·N06 / TC-C-N07 / TC-X-N05·N08):鉴权/IDOR/权限提升/XSS/上传校验。
 > - `tests/e2e/api/nonfunc-perf-compat.spec.js`(性能/兼容类 5 活动用例 + 2 跳过待业务夹具/压测授权,覆盖 TC-G-N02·N03 / TC-A-N04 / TC-P-N02 / TC-X-N01·N02·N07):限流稳定性/多端 UA 兼容/并发隔离/响应时间基线。
 > 可直接 `npx playwright test -c playwright.config.api.js --project=desktop` 执行,提升接口层可执行覆盖率。剩余性能/兼容类用例(前端渲染、真实压测)因 CFC-ENV-001 远程无 SPA 与需 execute 档联网授权,保留为文档化设计。
@@ -44,9 +44,9 @@
 | 文件 | 覆盖角色 | 正常流范围 | 异常流 / 权限流 |
 |------|----------|------------|------------------|
 | `guest.md` | 游客 | TC-G-01~12 | TC-G-NN-E / TC-G-NN-P(各 12 条) |
-| `parent.md` | 家长 | TC-P-01~86 | TC-P-NN-E / TC-P-NN-P(各 86 条) |
-| `child.md` | 孩子 | TC-C-01~23 | TC-C-NN-E / TC-C-NN-P(各 23 条) |
-| `teacher.md` | 规划师 | TC-T-01~29 | TC-T-NN-E / TC-T-NN-P(各 29 条) |
-| `admin.md` | 运营 | TC-A-01~23 | TC-A-NN-E / TC-A-NN-P(各 23 条) |
+| `parent.md` | 家长 | TC-P-01~93 | TC-P-NN-E / TC-P-NN-P(各 93 条,含五维变化专项 SC-P-87~93) |
+| `child.md` | 孩子 | TC-C-01~25 | TC-C-NN-E / TC-C-NN-P(各 25 条,含五维变化专项 SC-C-24~25) |
+| `teacher.md` | 规划师 | TC-T-01~32 | TC-T-NN-E / TC-T-NN-P(各 32 条,含五维变化专项 SC-T-30~32) |
+| `admin.md` | 运营 | TC-A-01~26(A-24 空号) | TC-A-NN-E / TC-A-NN-P(各 25 条,含五维变化专项 SC-A-25~26) |
 | `vendor.md` | 服务商 | TC-S-01~11 | TC-S-NN-E / TC-S-NN-P(各 11 条) |
-| `cross-role-e2e.md` | 跨角色 | TC-X-01~18 | TC-X-NN-E / TC-X-NN-P(各 18 条,9 列格式) |
+| `cross-role-e2e.md` | 跨角色 | TC-X-01~21 | TC-X-NN-E / TC-X-NN-P(各 21 条,9 列格式,含五维变化专项 SC-X-19~21) |

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

@@ -44,34 +44,34 @@
 
 | 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-A-01-E | A-1 | 认证 | 运营 | P2 | 异常 | admin 账号 | 1. 密码错误超 5 次 2. token 过期访问 3. 弱密码(如 123456)设新密码 | 错误密码不签发 token 且提示次数限制/锁定;过期 token 401 跳登录;弱密码 400 拦截 | `AdminAuthController` | — |
+| TC-A-02-E | A-1 | 统计 | 运营 | P2 | 异常 | 有业务数据 | 1. 统计接口超时/库内无数据 2. 时间范围非法(起>止) | 超时降级提示非500;无数据显示『暂无数据』;时间非法 400 | `StatsController` | — |
+| TC-A-03-E | A-2 | 方案管理 | 运营 | P2 | 异常 | 多家庭方案 | 1. 方案列表接口超时 2. 状态筛选值非法 3. 跨家庭方案数据隔离 | 超时降级非500;非法筛选 400;仅返回有权家庭数据不串 | 方案管理(全量) | — |
+| TC-A-04-E | A-2 | 方案激活 | 运营 | P2 | 异常 | reviewed 方案 | 1. 激活非 reviewed 方案 2. 激活时任务分解服务超时 3. 并发激活同一方案 | 非 reviewed 激活拦截;超时回滚不残半任务;并发幂等仅生成 1 次任务 | 方案激活 | — |
+| TC-A-05-E | A-2 | 报告解析 | 运营 | P2 | 异常 | gut_flora 已注册 | 1. 类型列表接口超时 2. 注册重复 typeId 3. 类型路径非法 | 超时降级非500;重复 typeId 400 拒绝;路径非法 400 | `AdminReportParserController` | — |
+| TC-A-06-E | A-2 | 报告解析 | 运营 | P2 | 异常 | — | 1. 重复 typeId 保存 2. 必填缺失(无 typeId/显示名) 3. threshold 非法(负) | 重复 typeId 拒绝;必填缺失 400;threshold 非法 400 | 报告类型注册 | — |
+| TC-A-07-E | A-2 | 报告解析 | 运营 | P3 | 异常 | 有未知报告上传 | 1. 未知聚类列表接口超时 2. 自学习生成的类型与已注册重名 | 超时降级非500;重名类型生成被拒/提示已存在 | 未知聚类自学习 | — |
+| TC-A-08-E | A-3 | 文章 | 运营 | P2 | 异常 | 文章素材 | 1. 重复创建同标题文章 2. 长文(8000字)提交时网络中断 3. 标题含注入 | 同标题 400『标题已存在』;长文提交超时重试不丢稿;注入 400 或转义 | 文章发布-审核 | — |
+| TC-A-09-E | A-3 | 文章·去重 | 运营 | P2 | 异常 | 已有文章标题 | 1. 同标题重复创建 2. 标题空/超长 | 重复创建被拦截提示标题已存在;空/超长 400 | 文章标题去重 | — |
+| TC-A-10-E | A-4 | 关系类型 | 运营 | P2 | 异常 | 关系类型管理页 | 1. 新增重名关系类型 2. 停用后被引用的关系类型 3. 名称含注入 | 重名拒绝;停用被引用类型提示先解绑;注入 400/转义;家长端选择器同步生效仍正确 | 关系类型 CRUD | — |
+| TC-A-11-E | A-4 | 勋章 | 运营 | P2 | 异常 | 勋章素材 | 1. 重复 POST 同名称勋章 2. 触发条件/门槛非法(负) 3. 并发创建 | 重复 400/幂等;非法门槛 400;并发创建各自独立不串 | 勋章管理;黑盒回归 | — |
+| TC-A-12-E | A-4 | 供应商 | 运营 | P2 | 异常 | 供应商素材 | 1. 同手机号重复保存 2. 手机号格式非法 3. 必填缺失(无真实姓名) | 同手机号拒绝/可控覆盖;非法格式 400;必填缺失 400;列表 name=昵称正确 | 供应商管理;黑盒回归 | — |
+| TC-A-13-E | A-5 | 活动 | 运营 | P2 | 异常 | 草稿活动 | 1. 活动已发布后再『提交审核』 2. 撤回非本人创建活动 3. 时间冲突(起<止非法) | 已发布再提交审核守卫拦截;非本人撤回 403;时间冲突 400;撤回退回草稿 | 活动审核撤回;黑盒回归 | — |
+| TC-A-14-E | A-6 | 知识库 | 运营 | P2 | 异常 | 知识条目存在(如 id=1) | 1. 删除被方案/文章引用的知识条目 2. 删除不存在 id 3. 并发删除同 id | 被引用删除提示先解绑;不存在 404;并发删除幂等 | 知识库管理;黑盒回归 | — |
+| TC-A-15-E | A-6 | 数据迁移 | 运营 | P3 | 异常 | sfms 源就绪 | 1. 迁移中源连接中断 2. 目标表锁 3. 重复执行迁移 | 中断回滚+明确错误非500;锁等待超时提示;重复执行幂等/提示已迁移 | 多数据源/SfmsDataSourceConfig | — |
+| TC-A-16-E | A-7 | 参数校验 | 运营 | P2 | 异常 | 各管理接口可用 | 1. 各接口传空 body 2. 字段类型错配(字符串传数字位) 3. 超长字段 | 空 body 400 含具体字段提示;类型错配 400;超长 400;不再裸 500 | 统一 `Result<T>`+全局异常;黑盒回归 | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-A-17-E | A-16 | /api/admin/report-parser/* | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | /api/admin/report-parser/* | — |
-| TC-A-18-E | A-17 | 优惠券/活动管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | 优惠券/活动管理 | — |
-| TC-A-19-E | A-18 | 内容安全 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 输入非法参数/网络中断/请求超时 2. 观察处理 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 内容安全 | — |
-| TC-A-20-E | A-19 | GDPR 工单 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | GDPR 工单 | — |
-| TC-A-21-E | A-20 | 网关/限流 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 输入非法参数/网络中断/请求超时 2. 观察处理 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | 网关/限流 | — |
-| TC-A-22-E | A-21 | 模型管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 模型管理 | — |
-| TC-A-23-E | A-22 | 知识库 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 知识库 | — |
+| TC-A-17-E | A-16 | /api/admin/report-parser/* | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 标注未知聚类时类目重名 2. 生效未注册路径 | 重名类目拒绝;未注册路径 400;先注册再解析 | /api/admin/report-parser/* | — |
+| TC-A-18-E | A-17 | 优惠券/活动管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 券时间冲突(起>止) 2. 名额配置超卖保护 3. 重复提交同活动 | 时间冲突 400;名额超卖配置保护生效;重复提交幂等 | 优惠券/活动管理 | — |
+| TC-A-19-E | A-18 | 内容安全 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 审核队列接口超时 2. 命中敏感词内容通过 | 超时降级非500;命中敏感词强制拦截不放行 | 内容安全 | — |
+| TC-A-20-E | A-19 | GDPR 工单 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 并发处理同用户注销+导出工单 2. 越权处理他人工单 | 并发安全:注销与导出按序执行不冲突;越权工单 403 | GDPR 工单 | — |
+| TC-A-21-E | A-20 | 网关/限流 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 限流规则误杀白名单 IP 2. 规则配置非法(负阈值) | 白名单不被限流;非法阈值 400;规则生效可控 | 网关/限流 | — |
+| TC-A-22-E | A-21 | 模型管理 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 下线模型无回退方案 2. 上线非法模型版本 | 无回退方案拦截下线;非法版本 400;上下线版控正确 | 模型管理 | — |
+| TC-A-23-E | A-22 | 知识库 | 运营 | P2 | 异常 | 已登录(默认 运营);相关前置数据就绪 | 1. 同步失败(网络抖动) 2. 并发 CRUD 同条目 | 同步失败自动重试非500;并发 CRUD 乐观锁不互相覆盖 | 知识库 | — |
 
 ## 权限流用例(派生自正常流)
 
@@ -105,6 +105,28 @@
 | TC-A-22-P | A-21 | 模型管理 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 模型管理 | — |
 | TC-A-23-P | A-22 | 知识库 | 运营 | P1 | 权限 | 已登录(默认 运营);相关前置数据就绪 | 1. 非 admin 角色访问管理端接口(统计/方案/报告解析/商品/勋章/供应商/活动/知识库) 2. 观察拦截 | 非 admin 角色访问统一 401/403,不泄露后台数据 | 知识库 | — |
 
+## 五维指标变化专项用例(本轮新增 SC-A-23~24)
+
+> 完整用户故事见 `../user-scenarios/07-five-dimension.md`(ED-13~14)。每条含正常流 + 具体异常流(-E) + 权限流(-P)。
+
+### 正常流
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-A-25 | SC-A-25 | 维度/权重/上限配置 | 运营 | P1 | 功能 | 维度/权重/`DailyLimit` 配置管理接口可用 | 1. 对维度/权重/每日上限做 CRUD 2. 查变更生效 | 变更生效、后续能量按新配置;存量影响提示 | `DimensionConfigController`/`DimensionWeightController` | `tests/e2e/energy-rules-config.spec.js` |
+| TC-A-26 | SC-A-26 | 能量/归因权重 | 运营 | P1 | 功能 | `AttributionWeights`/`configureSourceRatios` 可用 | 1. 调整来源比例/归因权重 2. 查审计与概览影响 | 全局生效;变更写审计;概览/沙盘/天盘影响可观测 | `EnergyController`/`AttributionWeights` | — |
+
+### 异常流(-E,具体故障注入)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-A-25-E | SC-A-25 | 维度/权重/上限配置 | 运营 | P2 | 异常 | 配置可用 + 造"删除被引用维度""权重非法""上限非法" | 1. 删除被引用维度 2. 权重/上限非法(负/超界/和≠100%)3. 并发改同配置 | 1. 需确认/拒、不级联破坏存量 2. 400 拦截 3. 乐观锁/版本控制不互相覆盖 | `DimensionConfigController` | — |
+| TC-A-26-E | SC-A-26 | 能量/归因权重 | 运营 | P2 | 异常 | 配置可用 + 造"比例非法""未同步" | 1. 比例非法(负/超 1/和≠1)2. 配置未同步计算节点 | 1. 400 拦截 2. 展示兜底并提示、不静默错算 | `EnergyController`/`AttributionWeights` | — |
+
+### 权限流(-P)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-A-25-P | SC-A-25 | 维度/权重/上限配置 | 运营 | P1 | 权限 | 运营 M + 家长 A | 1. 家长 A 调维度/权重/上限 CRUD | 非 admin 操作 403 | `DimensionConfigController` | — |
+| TC-A-26-P | SC-A-26 | 能量/归因权重 | 运营 | P1 | 权限 | 运营 M + 家长 A | 1. 家长 A 调全局归因权重/`configure` | 非 admin 改全局 403 | `EnergyController` | — |
+
 ## 非功能测试用例(性能 / 兼容 / 安全)
 
 > 非功能维度:性能(大文件/并发/限流)、兼容(多端/多浏览器/主题)、安全(IDOR/XSS/上传/鉴权/SSRF)。编号后缀 `-N` 与正常流/异常流(-E)/权限流(-P)并列。

+ 45 - 23
tests/test-cases/child.md

@@ -50,34 +50,34 @@
 
 | 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-C-01-E | C-1 | 权限/双角色 | 孩子 | P2 | 异常 | 孩子可登录账号 | 1. token 缺失/过期访问孩子端切换接口 2. 孩子端尝试调 `/api/family/member/switch` 切家长 3. 拼家长路由 `/parent/*` | 缺失/过期 token 统一 401 跳登录;切换/家长路由被 role 校验 403 拦截;孩子端无任何切回家长入口;模拟登录仅测试环境生效 | 双角色铁律:孩子端不能切家长 | — |
+| TC-C-02-E | C-2 | 任务 | 孩子 | P2 | 异常 | 家长已下发任务「睡前阅读」 | 1. 同一任务并发双点「完成」 2. 超期任务仍提交 3. 任务被驳回后重做再提交 | 并发双点幂等仅计 1 次、仅 1 条流水;超期提交被拒;驳回→重做→再提交仅在重做后计 1 次 | `TaskController` | — |
+| TC-C-03-E | C-3 | 小游戏 | 孩子 | P2 | 异常 | 小游戏入口可见 | 1. 上报异常分数(>满分/负分) 2. 中途退出(断网) 3. 同局成绩重复上报 | 异常分数 400 不计入;断网不计分不卡死;重复上报幂等不重复入榜 | `pages/games/*` | — |
+| TC-C-04-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 孩子已创建心愿 | 1. 心愿积分 > 自身余额 2. 心愿名称超长/含注入 3. 重复创建同名心愿 | 余额不足创建拦截;超长/注入 400 校验;重复创建提示已存在不双建 | `WishController` | — |
+| TC-C-05-E | C-4 | 心愿 | 孩子 | P2 | 异常 | 家长已通过心愿 | 1. 兑换时积分余额 < 心愿价 2. 已驳回心愿再兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负;已驳回提示不可兑换;并发幂等仅扣 1 次 | `RewardController` | — |
+| TC-C-06-E | C-5 | 能量 | 孩子 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 2. 某维度权重配置为 0 占比除零 | 超时降级空态提示非 500;权重 0 占比兜底(0%)显示不崩;能量不为负 | `EnergyController` | — |
+| TC-C-07-E | C-6 | 报告/权限 | 孩子 | P2 | 异常 | 家长已上传报告 | 1. 孩子直接调报告删除接口 `DELETE /api/report/:id` 2. 调编辑接口改报告内容 | 删除/编辑被 role 校验 403 拒绝;孩子端 UI 无编辑/删除入口;报告内容不被改动 | 报告查看权限隔离 | — |
+| TC-C-08-E | C-7 | 打卡/方案 | 孩子 | P2 | 异常 | 规划师已激活方案,生成训练任务 | 1. 打卡时方案服务超时 2. 同任务重复打卡 3. 打卡非本人方案任务 | 超时回滚不残半任务、进度不 +1;重复打卡幂等不重复计数;非本人任务 403 | 健康打卡/方案进度 | — |
+| TC-C-09-E | C-8 | 勋章 | 孩子 | P3 | 异常 | 已有部分成就 | 1. 重复触发同一成就条件 2. 未达成却直接调领取接口 | 重复达成不重复发推送/勋章;未达成领取 400/403 拒绝 | `RewardController` | — |
+| TC-C-10-E | SC-C-10 | 勋章提醒 | 孩子 | P3 | 异常 | 达成勋章条件 | 1. 重复达成同一勋章条件 2. 勋章条件数据缺失 | 重复达成幂等仅 1 次推送;数据缺失降级不推送不 500 | `MedalController` | — |
+| TC-C-11-E | SC-C-11 | 成长记录 | 孩子 | P2 | 异常 | 有成长数据 | 1. 成长时间线某条关联任务已删 2. 查其他成员成长数据 | 关联已删项跳过不报错;其他成员数据 403 不可见 | `GrowthController` | — |
+| TC-C-12-E | SC-C-12 | 食谱查看 | 孩子 | P2 | 异常 | 家庭食谱已生成 | 1. 家庭食谱生成时 LangGraph 超时 2. 无食谱打开食谱页 | 超时 Fallback 通用食谱+提示非 500;无食谱空态不 500 | 饮食推荐 | — |
+| TC-C-13-E | SC-C-13 | AI 对话 | 孩子 | P2 | 异常 | 已登录 | 1. 发送不适龄/含敏感词内容 2. LangGraph 不可用时多轮 | 不适龄/敏感词被过滤返回适龄话术;LangGraph 不可用 Fallback 兜底、多轮连续 | `AIChatController` | — |
+| TC-C-14-E | SC-C-14 | 任务重做 | 孩子 | P2 | 异常 | 任务被驳回 | 1. 重做已被通过(非驳回)的任务 2. 重做后再次提交 | 非驳回态重做入口不可见/拦截;重做提交进入待审核仅计 1 次 | `TaskController` | — |
+| TC-C-15-E | SC-C-15 | 消息接收 | 孩子 | P2 | 异常 | 有消息 | 1. 查其他孩子的消息 2. 消息 id 不存在 | 越权消息 403 不可见;不存在 404;列表分页正常 | 消息服务 | — |
+| TC-C-16-E | SC-C-16 | 个人资料 | 孩子 | P2 | 异常 | 已登录 | 1. 改关系等家长代管字段 2. 昵称含注入/超长 | 代管字段 403 不可改;昵称注入/超长 400 校验 | `AuthController` | — |
+| TC-C-17-E | SC-C-17 | 退出 | 孩子 | P2 | 异常 | 已登录 | 1. 退出后旧 token 仍调用接口 2. 退出时网络中断 | 旧 token 失效 401;网络中断退出仍清本地缓存、下次需重登 | `AuthController` | — |
+| TC-C-18-E | SC-C-18 | 设备校验 | 孩子 | P3 | 异常 | 登录设备 | 1. 异地/新设备登录触发风控 2. 退出后旧设备 token 调用 | 异常设备二次验证/拦截;旧设备 token 失效 401 | `AuthController` | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-C-19-E | C-19 | 消息服务 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 消息服务 | — |
-| TC-C-20-E | C-20 | GrowthController | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | GrowthController | — |
-| TC-C-21-E | C-21 | 舌诊情绪识别 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 舌诊情绪识别 | — |
-| TC-C-22-E | C-22 | MallController | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | MallController | — |
-| TC-C-23-E | C-23 | 客服 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 客服 | — |
+| TC-C-19-E | C-19 | 消息服务 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 标记已读时消息 id 不存在 2. 越权标记他人消息已读 | 不存在 404;越权标记 403 不生效 | 消息服务 | — |
+| TC-C-20-E | C-20 | GrowthController | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 未成年人直接导出档案 2. 越权读他人档案 | 未成年导出 403 需家长代办;他人档案 403 不可见 | GrowthController | — |
+| TC-C-21-E | C-21 | 舌诊情绪识别 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 上传非照片/模糊图 2. 识别置信度<阈值 | 非照片/模糊拒绝提示『请上传清晰舌苔照』;低置信度提示重拍;隐私标注不外露 | 舌诊情绪识别 | — |
+| TC-C-22-E | C-22 | MallController | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 积分余额不足兑换 2. 并发兑换同一商品 3. 重复兑换同一商品 | 余额不足拦截不扣负;并发仅 1 次成功;重复兑换幂等仅 1 条 | MallController | — |
+| TC-C-23-E | C-23 | 客服 | 孩子 | P2 | 异常 | 已登录(默认 孩子);相关前置数据就绪 | 1. 反馈含身份证号等敏感信息 2. 附件 >10MB | 敏感信息脱敏存储;附件超限 400『附件不超过 10MB』 | 客服 | — |
 
 ## 权限流用例(派生自正常流)
 
@@ -111,6 +111,28 @@
 | TC-C-22-P | C-22 | MallController | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | MallController | — |
 | TC-C-23-P | C-23 | 客服 | 孩子 | P1 | 权限 | 已登录(默认 孩子);相关前置数据就绪 | 1. 孩子端调用编辑/删除/切家长接口或拼家长路由 2. 观察拦截 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | 客服 | — |
 
+## 五维指标变化专项用例(本轮新增 SC-C-24~25)
+
+> 完整用户故事见 `../user-scenarios/07-five-dimension.md`(ED-8~9)。每条含正常流 + 具体异常流(-E) + 权限流(-P)。
+
+### 正常流
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-C-24 | SC-C-24 | 能量/小游戏·任务 | 孩子 | P1 | 功能 | 孩子 B 登录;成绩上报接口可用 | 1. B 完成小游戏/任务 2. 查自身 `EnergyLog`/`EnergyBalance` | 对应维度 +amount、`sourceType=game`/`task`;B 自身能量页看到增长与流水 | `GameRecordService`/`TaskController` | `tests/e2e/mini-games.spec.js` |
+| TC-C-25 | SC-C-25 | 能量/方案打卡 | 孩子 | P1 | 功能 | 方案已激活生成启动任务(`SC-C-05`);打卡接口可用 | 1. B 打开方案启动任务→打卡提交 2. 查进度与能量 | `GrowthTaskService` 打卡对应维度+;任务进度与能量同步刷新 | `GrowthTaskService` | `tests/e2e/daily-checkin-streak.spec.js` |
+
+### 异常流(-E,具体故障注入)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-C-24-E | SC-C-24 | 能量/小游戏·任务 | 孩子 | P2 | 异常 | B 登录 + 造"异常分数""重复上报" | 1. 超评分上限/负分上报 2. 同成绩重复上报 | 1. 异常分数拦截不写能量 2. 重复上报幂等不重复加 | `GameRecordService` | — |
+| TC-C-25-E | SC-C-25 | 能量/方案打卡 | 孩子 | P2 | 异常 | 方案任务存在 + 造"逾期""重复打卡""并发" | 1. 逾期限打卡 2. 同任务重复打卡 3. 并发打卡 | 1. 按业务允/拒、断言一致 2. 重复打卡幂等不重复加 3. 并发不重复计分 | `GrowthTaskService` | — |
+
+### 权限流(-P)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-C-24-P | SC-C-24 | 能量/小游戏·任务 | 孩子 | P1 | 权限 | 家庭1(B)+ 其他孩子 D | 1. B 查 D 能量/流水 2. B 直接调 `grant`/`deduct` | 1. 他人能量 403 2. 孩子端无编辑/扣减入口、直接调被拒 | `JwtInterceptor`+role | — |
+| TC-C-25-P | SC-C-25 | 能量/方案打卡 | 孩子 | P1 | 权限 | 家庭1(B)+ 非本人方案 | 1. B 打卡非本人方案任务 2. 查他人方案进度 | 1. 非本人方案任务 403 2. 他人进度不可见 | `GrowthTaskService` | — |
+
 ## 非功能测试用例(性能 / 兼容 / 安全)
 
 > 非功能维度:性能(大文件/并发/限流)、兼容(多端/多浏览器/主题)、安全(IDOR/XSS/上传/鉴权/SSRF)。编号后缀 `-N` 与正常流/异常流(-E)/权限流(-P)并列。

+ 43 - 18
tests/test-cases/cross-role-e2e.md

@@ -66,29 +66,29 @@
 
 | 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-X-01-E | 报告上传解析 | 规划师 | P2 | 异常 | 已绑定家庭+孩子 B;募极生物 PDF | 1. 上传损坏PDF/非募极/超大 2. 解析服务超时 3. 上传非绑定家庭孩子报告 | 损坏/非募极明确提示(非募极提示请确认募极生物);超大超限提示;超时进草稿非500;非绑定孩子 403 | T-3 / P-10 |
+| TC-X-02-E | 报告审核入库 | 规划师 | P2 | 异常 | X-01 草稿 | 1. 确认一个已被他人确认/删除的草稿 2. 解析超时草稿点确认 | 已删草稿提示『不存在』;解析中确认提示稍候;非绑定家庭草稿 403 | T-4 |
+| TC-X-03-E | 方案生成 | 家长 | P2 | 异常 | 孩子 B 有报告;已购会员 | 1. 生成时 LangGraph 超时/不可用 2. 未购会员却请求付费板块 3. 并发双生成同一目标 | Fallback 兜底方案+提示非500;未购会员拦截『请先开通会员』;并发幂等仅 1 个 generated | P-13 |
+| TC-X-04-E | 方案批准+激活 | 规划师 | P2 | 异常 | X-03 方案 generated | 1. 激活时任务分解超时 2. 对已激活方案再激活 3. 激活非 reviewed 方案 | 超时回滚不残半任务;已激活再激活幂等不重复生成任务;非 reviewed 拦截 | T-6 / T-7 |
+| TC-X-05-E | 任务打卡 | 孩子 | P2 | 异常 | X-04 已生成方案任务 | 1. 同任务重复打卡 2. 逾期限打卡 3. 打卡非本人方案任务 | 重复打卡幂等不重复计数;逾期按业务拒/允一致;非本人任务 403 | C-7 / C-2 |
+| TC-X-06-E | 任务审核 | 规划师 | P2 | 异常 | X-05 已提交 | 1. 审核非绑定家庭孩子任务 2. 同任务并发双审 3. 超期任务审核 | 非绑定家庭 403;并发双审幂等仅计 1 次积分;超期审核被拒 | T-9 / P-06 |
+| TC-X-07-E | 全局统计 | 运营 | P2 | 异常 | 以上步骤已执行 | 1. 统计接口超时/无数据 2. 时间范围非法 | 超时降级非500;无数据显示『暂无数据』;时间非法 400 | A-02 |
+| TC-X-08-E | 幂等与回滚(主链路健壮性) | 多角色 | P2 | 异常 | X-04 已 active 方案 | 1. 对已 active 方案并发再激活 2. 支付失败回滚 3. 重复打卡 | 并发再激活幂等仅生成 1 次任务;支付失败订单不进待安排;重复打卡不重复计数 | T-8 / P-09a / C-8 |
+| TC-X-09-E | AI 方案送审闭环 | 多角色 | P2 | 异常 | 家长已生成方案(generated) | 1. 送审时 LangGraph 超时 2. 未确认直接激活 3. 重复送审 | 超时 Fallback 提示非500;未确认激活拦截『请先确认』;重复送审幂等 | P-44 / T-06 / T-07 |
+| TC-X-10-E | 报告对比趋势闭环 | 多角色 | P3 | 异常 | 同一孩子多次上传同类型报告 | 1. 对比不同类型报告 2. 仅 1 份报告看趋势 3. 趋势时间倒挂 | 类型不一致提示不可比;单报告提示需≥2份;时间轴按真实升序不倒挂 | P-25 / T-21 |
+| TC-X-11-E | 消息通知闭环 | 多角色 | P2 | 异常 | 跨角色消息配置就绪 | 1. 消息内容含 XSS 载荷 2. 越权读他人消息 3. 标记已读时 id 不存在 | XSS 转义不执行;越权消息 403;不存在 id 404 | P-65 / T-19 / C-15 |
+| TC-X-12-E | 会员权益闭环 | 多角色 | P2 | 异常 | 家长未购会员 | 1. 支付失败 2. 重复购买同档位 3. 过期后权益回收时机 | 失败回滚不解锁;重复购买幂等仅 1 次;过期回收断言一致 | P-58 / P-16 |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
 |---|---|---|---|---|---|---|---|---|
-| TC-X-13-E | 报告代传跨角色闭环 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | X-13 |
-| TC-X-14-E | 解绑/重分配跨角色协 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | X-14 |
-| TC-X-15-E | 注销/数据导出跨角色 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | X-15 |
-| TC-X-16-E | 活动名额并发 E2E | 跨角色 | P1 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | X-16 |
-| TC-X-17-E | 多端登录会话互斥跨端 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | X-17 |
-| TC-X-18-E | 推送跨端送达 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | X-18 |
+| TC-X-13-E | 报告代传跨角色闭环 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 越权代传他人孩子 2. 上传损坏/非募极 3. 授权令牌失效 | 越权代传 403;损坏/非募极明确提示;令牌失效提示重发 | X-13 |
+| TC-X-14-E | 解绑/重分配跨角色协 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 解绑时有在途方案/预约未交接 2. 并发解绑+重分配 | 在途未完成提示先交接;并发操作乐观锁不互相覆盖 | X-14 |
+| TC-X-15-E | 注销/数据导出跨角色 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 注销未完成却触发导出 2. 越权导出他人 3. 冷静期内再次注销 | 注销未完成导出提示先完成;越权导出 403;冷静期内重复注销幂等 | X-15 |
+| TC-X-16-E | 活动名额并发 E2E | 跨角色 | P1 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 名额仅剩 1 时 500 并发报名 2. 名额已满再报名 | 并发超卖拦截仅 1 人成功(真实 bug 回归);满额拒『名额已满』;重复报名幂等 | X-16 |
+| TC-X-17-E | 多端登录会话互斥跨端 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 异地/新设备登录触发风控 2. 旧设备 token 仍调用 | 异常设备二次验证/拦截;旧设备 token 失效 401 | X-17 |
+| TC-X-18-E | 推送跨端送达 | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 推送内容含 XSS 载荷 2. 目标已设免打扰 3. 非目标角色收到 | XSS 转义不执行;免打扰不推送;非目标角色不可见 | X-18 |
 
 ## 权限流用例(派生自正常流)
 
@@ -117,6 +117,31 @@
 | TC-X-17-P | 多端登录会话互斥跨端 | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 跨角色调用他人/非绑定家庭数据接口 2. 观察拦截 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | X-17 |
 | TC-X-18-P | 推送跨端送达 | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | 1. 跨角色调用他人/非绑定家庭数据接口 2. 观察拦截 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | X-18 |
 
+## 五维指标变化专项用例(本轮新增 SC-X-19~21)
+
+> 完整用户故事见 `../user-scenarios/07-five-dimension.md`(ED-15~17)。每条含正常流 + 具体异常流(-E) + 权限流(-P)。
+
+### 正常流
+| TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
+|---|---|---|---|---|---|---|---|---|
+| TC-X-19 | 五维能量跨角色数据隔离 | 跨角色 | P0 | 功能 | 家庭1(A+B+C)、绑定家庭 F2(T)、无关家庭 F9 | 1. 各方查自身/归属成员能量概览/流水/评分历史 2. 越权查他人/非绑定家庭 | 归属数据可见;越权查他人/非绑定 401/403 | X-19 |
+| TC-X-20 | 五维能量流水溯源一致性 | 跨角色 | P0 | 功能 | 成员 B 混合来源流水(任务/打卡/心愿扣减/手动) | 1. 拉 `EnergyLog` 按时间排序 2. 逐条校验 `balanceAfter==prev+amount` 3. 校验 `totalEarned-totalSpent==balance` | 全部一致;任一不一致报警并定位 | X-20 |
+| TC-X-21 | 多来源并发同成员能量变动 | 跨角色 | P0 | 功能 | B 某维度当日未触顶;多触发同时到达 | 1. 并发提交任务审批+打卡+小游戏+活动 2. 校验总额/流水 | 每笔原子加、不超 `DailyLimit`、无重复加、最终 `balance` 与流水合计一致 | X-21 |
+
+### 异常流(-E,具体故障注入)
+| TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
+|---|---|---|---|---|---|---|---|---|
+| TC-X-19-E | 五维能量跨角色隔离 | 跨角色 | P1 | 异常 | 家庭1 / F2 / F9 | 1. 孩子 token 查家长/规划师/运营接口 2. 家长查其他家庭成员 3. 规划师查 F9 4. 运营无工单导出 | 1. 401/403 2. 403 3. 403 4. 越权导出拒 | X-19 |
+| TC-X-20-E | 五维能量对账 | 跨角色 | P1 | 异常 | B 混合流水 + 造"不一致断点""负流水无对应" | 1. 人为制造 `balanceAfter≠prev+amount` 的断点 2. 删除负流水对应记录 | 1. 报警并定位断点(不静默通过)2. 负流水必有对应负记录、余额不为负;不一致报警 | X-20 |
+| TC-X-21-E | 多来源并发能量 | 跨角色 | P1 | 异常 | B 维度当日接近上限 | 1. 并发触顶 2. 部分触发失败 3. 网络重试 | 1. 最后到达被拒/截断、总额不超上限 2. 已成功保留、失败回滚不残半笔 3. 重试幂等不因重试多加 | X-21 |
+
+### 权限流(-P)
+| TC 编号 | 环节 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联场景/用例 |
+|---|---|---|---|---|---|---|---|---|
+| TC-X-19-P | 五维能量跨角色隔离 | 跨角色 | P0 | 权限 | 家庭1 / F2 / F9 | 1. 横向越权查他人/非绑定家庭能量接口 | 横向越权统一 403/401、不泄露他人数据 | X-19 |
+| TC-X-20-P | 五维能量对账 | 跨角色 | P1 | 权限 | 家庭1 + F9 | 1. 家长 A 对 F9 成员做能量对账/导出 | 非本家庭数据 403、不泄露 | X-20 |
+| TC-X-21-P | 多来源并发能量 | 跨角色 | P1 | 权限 | 家庭1 + F9 | 1. 家长 A 触发 F9 成员并发能量变更 | 非本家庭成员变更 403 | X-21 |
+
 ## 非功能测试用例(性能 / 兼容 / 安全)
 
 > 非功能维度覆盖主链路并发/限流、跨角色越权与隔离、多端会话互斥、文件上传统一校验。(越权/上传拒绝/权限提升等见 `e2e/api/nonfunc-security.spec.js`;并发隔离 TC-X-N01、限流稳定性 TC-X-N02、多端 UA 兼容 TC-X-N07 见 `e2e/api/nonfunc-perf-compat.spec.js`;TC-X-N05、TC-X-N08 参见 security 规格)

+ 12 - 12
tests/test-cases/guest.md

@@ -40,23 +40,23 @@
 
 | 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-G-01-E | SC-G-01 | 启动/首页 | 游客 | P2 | 异常 | 清除登录态;弱网/无微信 SDK | 1. 冷启动弱网、微信环境探测失败 2. 点击登录超时 | 1. 不白屏、提供"稍后"/手机号登录兜底 2. 超时给重试而非 500;不泄露内部堆栈 | JwtInterceptor 拦截 `/api/**` | — |
+| TC-G-02-E | SC-G-02 | 认证 | 游客 | P2 | 异常 | 微信授权可用(test-mode) | 1. 用户拒绝微信授权 2. openid 已存在账号重复登录 3. 授权回调超时 | 1. 回退手机号登录、停留登录页不报错 2. 返回已有账号不重复建号 3. 超时提示重试、不建脏号 | `AuthController`/`API_REFERENCE` 1.1 | — |
+| TC-G-03-E | SC-G-03 | 认证 | 游客 | P2 | 异常 | 有效手机号 13800000001 | 1. 验证码错误/过期 2. 号码格式非法(如 123) 3. 60s 内重复发码触发限流 4. 错误验证码 | 1. 提示失败且不签发 token 2. 格式校验 400 拦截 3. 限流提示"操作频繁" 4. 绝不产生会话 | 统一 POST/JWT | — |
+| TC-G-04-E | SC-G-04 | 家庭/邀请 | 游客 | P2 | 异常 | 家长已 `POST /api/family/invite/generate` 生成邀请 | 1. 邀请码过期/被篡改 2. 已登录用户用他人邀请重复加入 | 1. 拒绝并提示"邀请已失效" 2. 按业务规则处理(加入或被拒)、不串家庭 | `FamilyInviteController` | — |
+| TC-G-05-E | SC-G-05 | 权限 | 游客 | P2 | 异常 | 无 token;已知业务路由 | 1. 未登录直接请求业务页/受保护接口 2. 受限操作(下单/评论)未登录 | 1. 统一 401 跳登录;登录后回跳 2. 重定向登录;仅 8 公开路径放行 | JWT;8 公开路径白名单(1.1) | — |
+| TC-G-06-E | SC-G-06 | 权限 | 游客 | P1 | 异常 | 无 token;已知业务路由 | 1. 缺 token/过期 token 调 `/api/**` 2. 触发 8 个公开路径之一 | 1. 统一 401/403、不泄露内部错误与结构 2. 公开路径正常返回、不误拦 | `JwtInterceptor` | — |
+| TC-G-07-E | SC-G-07 | 测试模式 | 游客 | P3 | 异常 | `wechat.test-mode:true` | 1. 生产环境误开 test-mode 2. 模拟登录 token 在生产的合法性 | 1. 生产强制真授权、模拟登录被拒 2. 测试模式仅测试环境生效、不污染生产数据 | AGENTS.md 测试模式 | — |
+| TC-G-08-E | SC-G-08 | 环境切换 | 游客 | P3 | 异常 | 多环境(develop/trial/release) | 1. `uni.getAccountInfoSync()` 返回异常/空 2. 环境识别失败 | 1. 回退默认 API 地址、功能可用 2. 不因识别失败崩溃/错连 | `config.js` | — |
+| TC-G-09-E | SC-G-09 | 认证 | 游客 | P2 | 异常 | 已登录 | 1. 退出后 token 仍调用接口 2. 退出后本地敏感缓存未清 | 1. 退出后接口 401、需重登 2. 本地 token/隐私数据已清除 | `AuthController` | — |
+| TC-G-10-E | SC-G-10 | 注册 | 游客 | P2 | 异常 | 未注册账号 | 1. 登录失败误判 2. 已注册账号再次引导建档 | 1. 明确"未注册"并引导注册 2. 已注册不重复建档、直接登录 | `AuthController` | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-G-11-E | G-11 | 协议页/AgreementController | 游客 | P2 | 异常 | 未登录/游客态 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 协议页/AgreementController | — |
-| TC-G-12-E | G-12 | config.js | 游客 | P2 | 异常 | 未登录/游客态 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | config.js | — |
+| TC-G-11-E | SC-G-11 | 协议页 | 游客 | P2 | 异常 | 未登录/游客态 | 1. 未同意协议即进入注册/核心流程 2. 协议内容加载失败 | 1. 拦截并强制先同意 2. 加载失败给重试、不绕过同意 | 协议页/AgreementController | — |
+| TC-G-12-E | SC-G-12 | config.js | 游客 | P2 | 异常 | 非微信浏览器(Chrome PC) | 1. 微信环境探测失败 2. 非微信环境打开小程序链接 | 1. 给出"在微信内打开"明确引导 2. 降级静态页、核心流程可手机号兜底 | config.js | — |
 
 ## 权限流用例(派生自正常流)
 

+ 123 - 86
tests/test-cases/parent.md

@@ -118,97 +118,97 @@
 
 | 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-P-01-E | P-1 | 家庭 | 家长 | P2 | 异常 | 已登录(默认 parent) | 1. 家庭名称传空 / 超长(>30 字符) / 含 `<script>` 注入 2. 观察返回与存储 | 名称空或超长返回 400 且 message 含『家庭名称』校验项;HTML/SQL 注入被转义,库内不落恶意串;不抛 500、不泄露堆栈 | `FamilyInviteController` | — |
+| TC-P-02-E | P-2 | 家庭/成员 | 家长 | P2 | 异常 | 家庭已创建;爷爷 C 可用 | 1. 用非 11 位手机号 / 已绑定其他家庭的账号注册 2. 用过期邀请码(>7 天)注册 | 非法手机号 400 提示格式;已占用账号提示『已存在家庭关系』;过期码提示『邀请已失效,请重新获取』;均不建立成员关系 | `FamilyInviteController` | — |
+| TC-P-03-E | P-2 | 成员资料 | 家长 | P2 | 异常 | 家庭已创建 | 1. 生日填未来日期 / 关系选『自己』 2. 姓名填 `' OR 1=1--` | 未来生日 400;关系非法值拒绝;姓名特殊字符转义存储、不破坏查询;既有成员数据不被污染 | `FamilyMembersController` | — |
+| TC-P-04-E | P-2 | 关系图 | 家长 | P2 | 异常 | 成员 C 已加入 | 1. 将 C 关系重复设为已存在的『外公』 2. 关系类型传非法枚举 `alien` | 重复关系提示已存在、不新增节点;非法枚举 400;关系图不出现重复/幽灵节点 | 关系类型 CRUD/前端选择器 | — |
+| TC-P-05-E | P-4 | 任务 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. 任务频率填 0 / 负数 / 非枚举 2. 同一创建请求并发双发 | 频率非法 400;并发双发幂等,仅生成 1 条任务、仅 1 次能量预期;超期任务拒绝提交 | `TaskController` | — |
+| TC-P-06-E | P-4 | 任务审核 | 家长 | P2 | 异常 | B 已提交任务 | 1. 对同一已审批任务重复点『通过』 2. 驳回后孩子重做再提交并审批 | 重复审批幂等不双计积分;驳回→重做→再审批仅在重做后计 1 次;超期任务审批被拒 | `TaskController`/`PointsController` | — |
+| TC-P-07-E | P-5 | 心愿 | 家长 | P2 | 异常 | 孩子已创建心愿 | 1. 兑换时家长积分余额 < 心愿价 2. 心愿已被孩子取消后再点兑换 3. 并发兑换同一心愿 | 余额不足拦截且不扣负积分;已取消心愿兑换提示失效;并发幂等仅扣 1 次 | `WishController`/`RewardController` | — |
+| TC-P-08-E | P-6 | 能量 | 家长 | P2 | 异常 | 已有能量记录 | 1. EnergyLog 查询超时 / 某维度权重配置为 0 导致占比除零 2. 无数据首访 | 查询超时降级为空态提示非 500;权重为 0 时占比按兜底(0%)显示不崩;首访空态正常 | `EnergyController` | — |
+| TC-P-09-E | P-7 | 测评订单 | 家长 | P2 | 异常 | 已绑定规划师 T;孩子 B 在家庭中 | 1. 模拟支付回调 signature 错误 / 余额不足 2. 同一订单重复发支付成功回调 | 回调验签失败订单保持 pending 不进待安排;余额不足回滚;重复回调幂等仅落 1 次已支付 | `AssessmentAppointmentController` | — |
+| TC-P-10-E | P-8 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物菌群 PDF | 1. 上传前 5 字节非 %PDF 的损坏文件 2. 上传其他机构(非募极)报告 3. 上传 >20MB / 加密 PDF | 损坏文件识别失败进未知聚类并提示;非募极明确提示『请确认是募极生物肠道菌群报告』;超大/加密提示超限或密码保护,均非 500 | 健康报告上传解析 | — |
+| TC-P-11-E | P-8 | 报告查看 | 家长 | P2 | 异常 | 报告已入库 | 1. 报告 id 不存在 / 已被删除后查看 2. 解析中(report_status=parsing)状态打开详情 | 不存在/已删返回 404 提示『报告不存在』;解析中提示『报告解析中,请稍候』,不白屏不 500 | 报告解析 | — |
+| TC-P-12-E | P-9 | 饮食推荐 | 家长 | P2 | 异常 | P-10 报告已入库 | 1. 制造 LangGraph 503/超时 2. 重复点击『生成推荐』 | AiGateway Fallback 返回兜底食材清单+友好提示非 500;重复点击幂等仅生成 1 份、不重复扣费 | 饮食推荐系统 | — |
+| TC-P-13-E | P-10 | AI 方案 | 家长 | P2 | 异常 | 孩子 B 有报告;部分需会员 | 1. 生成时 LangGraph 不可用 2. 未购会员却请求付费板块 | Fallback 兜底方案+提示;未购会员请求付费板块返回『请先开通会员』拦截,不白生成 | AI 统一走 LangGraph;`AiGateway` | — |
+| TC-P-14-E | P-10 | 方案提交 | 家长 | P2 | 异常 | 方案已生成 | 1. 提交一个尚未生成 overview 的空方案 2. 重复提交同一方案 | 空方案提交拦截提示『方案未生成』;重复提交幂等不重复进审核 | 方案状态机 | — |
+| TC-P-15-E | P-3 | 双角色 | 家长 | P2 | 异常 | 家庭含孩子 B | 1. token 缺失/过期访问切换接口 2. 孩子端尝试切回家长 3. 非法 memberId 切换 | 缺失/过期 token 统一 401 跳登录;孩子端无切回家长入口;非法切换 403 被拒;模拟登录仅测试环境生效 | `POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | — |
+| TC-P-16-E | P-10 | 会员 | 家长 | P2 | 异常 | 未购会员 | 1. 购买时支付网关超时 2. 重复点击购买同一档位 | 支付超时订单回滚不解锁权益;重复购买幂等仅开通 1 次、不重复扣费 | `MembershipController`/`ProductOrderController` | — |
+| TC-P-17-E | P-12 | 积分/成长 | 家长 | P2 | 异常 | 已有记录 | 1. 并发刷新积分 2. 查成长记录时某条关联任务已删 | 并发刷新总量一致不重复计;关联任务已删时该成长项跳过不报错,时间格式 yyyy-MM-dd HH:mm:ss | `PointsController`/`GrowthController` | — |
+| TC-P-18-E | P-11 | AI 对话 | 家长 | P2 | 异常 | 已登录 | 1. 发送含敏感词/超长(>2000字)消息 2. LangGraph 不可用时多轮 | 超长消息 400 提示;敏感词按合规拦截;LangGraph 不可用 Fallback 兜底回答,多轮上下文不丢 | `AIChatController`;LangGraph RAG | — |
+| TC-P-19-E | SC-P-19 | 能量配置 | 家长 | P3 | 异常 | 进入能量页 | 1. 配置未同步时首次进入 2. 手动改权重总和≠100% 提交 | 配置缺失展示兜底说明非 500;权重和非法 400 提示『权重合计需为 100%』 | 维度配置 | — |
+| TC-P-20-E | SC-P-20 | 健康报告 | 家长 | P2 | 异常 | 持有募极生物 PDF | 1. 上传前 5 字节非 %PDF 的损坏文件 2. 上传其他机构(非募极)报告 3. 上传 >20MB / 加密 PDF | 损坏文件识别失败进未知聚类并提示;非募极明确提示『请确认是募极生物肠道菌群报告』;超大/加密提示超限或密码保护,均非 500 | 报告解析中台/`POST /api/media/upload` | — |
+| TC-P-21-E | SC-P-21 | 报告解析 | 家长 | P2 | 异常 | 多类型报告 | 1. 上传未注册类型(如 CT 影像) 2. 上传 0 字节文件 | 未注册类型进未知聚类待运营自学习;0 字节文件提示『文件为空』;均非 500 | `/api/admin/report-parser/types` | — |
+| TC-P-22-E | SC-P-22 | 报告预览 | 家长 | P2 | 异常 | 报告已解析 | 1. 预览时某指标值为负/异常(如菌群多样性 -1) 2. 解析服务超时 | 异常值提示『数据异常,暂不入库』不入库;超时提示解析中,不白屏 | 解析中台 | — |
+| TC-P-23-E | SC-P-23 | 报告入库 | 家长 | P2 | 异常 | 解析预览完成 | 1. 确认入库时报告已被运营删除 2. 并发两次确认 | 报告已删提示『报告不存在,确认失败』;并发确认幂等仅入库 1 次、七维仅刷新 1 次 | 解析中台 | — |
+| TC-P-24-E | SC-P-24 | 报告管理 | 家长 | P2 | 异常 | 多份报告 | 1. 删除带关联方案的报告 2. 删除不存在的报告 id | 有方案时提示『请先解除关联方案』再删;不存在 id 返回 404 不崩 | 报告管理 | — |
+| TC-P-25-E | SC-P-25 | 报告趋势 | 家长 | P2 | 异常 | ≥2 同类型报告 | 1. 仅 1 份同类型报告查趋势 2. 两份报告时间倒挂(新在前) | 单报告提示『至少需要 2 份报告才能看趋势』;时间轴按真实时间升序,不倒挂 | 成长/报告 | — |
+| TC-P-26-E | SC-P-26 | 饮食推荐 | 家长 | P2 | 异常 | SC-P-20 已入库 | 1. 制造 LangGraph 503/超时 2. 重复点击『生成推荐』 | AiGateway Fallback 返回兜底食材清单+友好提示非 500;重复点击幂等仅生成 1 份、不重复扣费 | 饮食推荐系统 | — |
+| TC-P-27-E | SC-P-27 | 家庭食谱 | 家长 | P2 | 异常 | 菌群报告+营养目标 | 1. LangGraph 超时生成食谱 2. 食谱含孩子过敏食材(虾)未排除 | 超时 Fallback 通用食谱+提示;过敏食材未排除时返回 400 提示『存在过敏冲突』重算 | 饮食推荐/家庭食谱 | — |
+| TC-P-28-E | SC-P-28 | 食谱筛选 | 家长 | P3 | 异常 | 已生成食谱 | 1. 设忌口『海鲜』但食谱仍含鱼 2. 忌口值非法 | 忌口冲突提示并停止生成;非法忌口值 400;重算生效 | 饮食推荐 | — |
+| TC-P-29-E | SC-P-29 | 食谱收藏 | 家长 | P3 | 异常 | 已生成食谱 | 1. 收藏后手动替换食材使营养超标 2. 重复收藏同一食谱 | 替换后提示『超出营养目标』不静默;重复收藏幂等仅 1 条 | 饮食推荐 | — |
+| TC-P-30-E | SC-P-30 | 食谱营养 | 家长 | P3 | 异常 | 食谱+营养目标 | 1. 营养合计超目标 200% 2. 目标未设时查营养 | 超标明确标红提示『超出目标 X%』;未设目标提示先设目标,不除零 | 饮食推荐 | — |
+| TC-P-31-E | SC-P-31 | 测评类型 | 家长 | P2 | 异常 | 进入测评页 | 1. 后端字典缺某类(如 adolescent)时前端仍渲染 2. 传非法 type 查询 | 字典缺失时前端降级不白屏;非法 type 400;八类以字典为准 | `DanAssessmentController` | — |
+| TC-P-32-E | SC-P-32 | 测评规划师 | 家长 | P2 | 异常 | 已绑定规划师 | 1. 未绑定规划师直接选测评选 T 2. 选已解绑的 T | 未绑定提示『请先绑定规划师』;已解绑 T 不在可选列表,选则 400 | 测评订单 | — |
+| TC-P-33-E | SC-P-33 | 测评下单 | 家长 | P2 | 异常 | 套餐可见 | 1. 套餐已下架仍下单 2. 数量填 -1 / 库存为 0 | 下架套餐 400『套餐不可售』;数量非法/库存不足拦截,不生成订单 | `AssessmentOrder` | — |
+| TC-P-34-E | SC-P-34 | 测评支付 | 家长 | P2 | 异常 | pending 订单 | 1. 支付网关超时 2. 同一 pending 订单发两次支付成功 | 超时回滚不生成额度;重复回调幂等仅生成 1 条额度 | 支付/`AssessmentQuota` | — |
+| TC-P-35-E | SC-P-35 | 测评额度 | 家长 | P2 | 异常 | 支付成功 | 1. 用已过期额度预约 2. 额度页加载时依赖 AI 服务超时 | 过期额度预约返回『额度已过期』不落预约;额度页加载降级非 500 | `AssessmentQuota` | — |
+| TC-P-36-E | SC-P-36 | 测评预约 | 家长 | P2 | 异常 | 有效额度 | 1. 无有效额度调 create 2. 同一 quotaId+memberId 并发双发 | 无额度返回『额度不足或已过期』不建预约不发能量;并发双发仅落 1 条预约、能量仅发 1 次(幂等) | `AssessmentAppointmentController` | — |
+| TC-P-37-E | SC-P-37 | 预约状态 | 家长 | P2 | 异常 | 已有预约 | 1. 直接 PUT 状态从 pending→completed 跳过 confirmed 2. 查不存在的预约 | 状态机守卫拒绝非法跃迁返回 400;不存在预约 404;状态准确 | `AssessmentAppointmentController` | — |
+| TC-P-38-E | SC-P-38 | 预约取消 | 家长 | P2 | 异常 | 已有预约 | 1. 非本人/非绑定 T 取消他人预约 2. 已 completed 预约再取消 | 越权取消 403 被拒(CFC-AP);终态预约取消返回『不可取消』;不退款逻辑按配置 | `AssessmentAppointmentController` | — |
+| TC-P-39-E | SC-P-39 | DAN报告 | 家长 | P2 | 异常 | 结果已录入 | 1. 结果未录入打开结果页 2. 上传结果字段缺失(如缺 mind 类分数) | 未录入提示『结果待录入』不白屏;缺字段校验 400 提示缺哪项 | `DanAssessmentResultDTO` | — |
+| TC-P-40-E | SC-P-40 | AI方案 | 家长 | P2 | 异常 | 孩子 B+目标;部分需会员 | 1. 生成时 LangGraph 不可用 2. 未购会员却请求付费板块 | Fallback 兜底方案+提示;未购会员请求付费板块返回『请先开通会员』拦截,不白生成 | `AIChatController`/`AiGateway` | — |
+| TC-P-41-E | SC-P-41 | 方案迭代 | 家长 | P2 | 异常 | 方案已生成 | 1. 重生成板块 A 时断网 2. 连续点同一板块重生成 | 断网 Fallback 保留其他板块不丢;连续点击幂等仅 1 次重生成 | `AIChatController` | — |
+| TC-P-42-E | SC-P-42 | 方案编辑 | 家长 | P2 | 异常 | 方案已生成 | 1. 编辑超长文本(>10000字) 2. 编辑他人方案 | 超长 400 提示;越权编辑 403 被拒;编辑后状态标记已改 | 方案管理 | — |
+| TC-P-43-E | SC-P-43 | 方案查看 | 家长 | P2 | 异常 | 方案存在 | 1. 打开 overview 为空的方案 2. 方案 id 不存在 | 空方案展示占位不白屏;不存在 404 | 方案管理 | — |
+| TC-P-44-E | SC-P-44 | 方案确认 | 家长 | P2 | 异常 | 方案 generated | 1. 未确认就点激活 2. 重复确认同一方案 | 未确认激活拦截『请先确认』;重复确认幂等仅 1 次 reviewed | 方案状态机 | — |
+| TC-P-45-E | SC-P-45 | 方案发布 | 家长 | P2 | 异常 | 配置允许 | 1. 配置需审核却直接发布 2. 发布未 reviewed 方案 | 需审核配置时发布走审核流不直接 active;未 reviewed 发布拦截 | 方案管理 | — |
+| TC-P-46-E | SC-P-46 | 方案激活 | 家长 | P2 | 异常 | reviewed 方案 | 1. 已 active 再点激活 2. 激活时任务分解服务超时 | 已激活再激活幂等不重复生成任务;超时回滚不残半任务,状态回 reviewed | 方案激活任务分解 | — |
+| TC-P-47-E | SC-P-47 | 方案任务 | 家长 | P2 | 异常 | 方案 active | 1. 方案 active 时删任务 2. 任务 id 非法 | 删任务同步方案并提示;非法 id 400;任务增删与方案一致 | `GrowthPlanController` | — |
+| TC-P-48-E | SC-P-48 | 方案版本 | 家长 | P3 | 异常 | 多版本方案 | 1. 试图 PUT 修改历史版本内容 2. 版本 id 不存在 | 历史版本只读返回 403『版本不可篡改』;不存在 404 | 方案管理 | — |
+| TC-P-49-E | SC-P-49 | AI对话 | 家长 | P2 | 异常 | 已登录 | 1. 发送含敏感词/超长(>2000字)消息 2. LangGraph 不可用时多轮 | 超长消息 400 提示;敏感词按合规拦截;LangGraph 不可用 Fallback 兜底回答,多轮上下文不丢 | `AIChatController` | — |
+| TC-P-50-E | SC-P-50 | 成长记录 | 家长 | P2 | 异常 | 有成长数据 | 1. 成长时间线某条关联报告已删 2. 首访无数据 | 关联已删项跳过不报错;首访空态正常,时间线不白屏 | `GrowthController` | — |
+| TC-P-51-E | SC-P-51 | 成长里程碑 | 家长 | P3 | 异常 | 有成长数据 | 1. 重复标同一里程碑 2. 标不存在的节点 | 重复标幂等仅 1 条;非法节点 400 | `GrowthController` | — |
+| TC-P-52-E | SC-P-52 | 商城浏览 | 家长 | P2 | 异常 | 进入商城 | 1. 搜索 SQL 注入关键词 2. 下架商品仍在列表 | 注入被转义返回安全结果;下架商品不展示;不 500 | `MallController`/`danshop` | — |
+| TC-P-53-E | SC-P-53 | 商品详情 | 家长 | P2 | 异常 | 商品存在 | 1. 库存为 0 商品打开详情 2. 商品 id 不存在 | 库存 0 提示『暂时缺货』;不存在 404 | `MallController` | — |
+| TC-P-54-E | SC-P-54 | 商城下单 | 家长 | P2 | 异常 | 商品可购 | 1. 库存仅 1 却下单 2 件 2. 重复提交同一购物车 | 超库存拦截『库存不足』;重复提交幂等仅 1 单 | `MallController` | — |
+| TC-P-55-E | SC-P-55 | 订单支付 | 家长 | P2 | 异常 | 待支付订单 | 1. 支付网关超时 2. 重复支付通知 | 超时回滚订单保持待支付;重复通知幂等仅 1 次 paid | 支付 | — |
+| TC-P-56-E | SC-P-56 | 订单退款 | 家长 | P2 | 异常 | 已有订单 | 1. 已发货订单申请退款 2. 同一订单重复退款 | 已发货按规则处理/拒;重复退款拦截仅 1 次 | 订单服务 | — |
+| TC-P-57-E | SC-P-57 | 优惠券 | 家长 | P2 | 异常 | 有可用券 | 1. 用过期券结算 2. 订单未满门槛用满减券 | 过期券不可用提示;未达门槛拦截『还差 X 元可用』;不重复抵扣 | 优惠券 | — |
+| TC-P-58-E | SC-P-58 | 会员购买 | 家长 | P2 | 异常 | 未购会员 | 1. 支付失败 2. 重复购买同档位 | 失败回滚不解锁;重复购买幂等仅 1 次、不双扣 | `MemberController` | — |
+| TC-P-59-E | SC-P-59 | 会员权益 | 家长 | P2 | 异常 | 已购会员 | 1. 会员已过期仍看权益 2. 越权看他人权益 | 过期提示『会员已失效』;越权 403;权益随档位 | `MemberController` | — |
+| TC-P-60-E | SC-P-60 | 会员续费 | 家长 | P3 | 异常 | 会员将到期 | 1. 续费时原会员未到期 2. 续费金额非法(负) | 未到期续费叠加计算正确(延期);负金额 400 | `MemberController` | — |
+| TC-P-61-E | SC-P-61 | 联系人 | 家长 | P2 | 异常 | 联系人入口 | 1. 添加重复手机号联系人 2. 手机号格式非法 | 重复号码去重提示;非法格式 400;不建重复 | `ContactCard`/`contact-detail` | — |
+| TC-P-62-E | SC-P-62 | 联系人导入 | 家长 | P3 | 异常 | 联系人存在 | 1. 导入 CSV 含格式错误行(缺电话) 2. 文件非 CSV | 错误行跳过并报告『第 N 行格式错误』;非 CSV 拒绝;正确行入库 | `ContactImport` | — |
+| TC-P-63-E | SC-P-63 | 联系人权限 | 家长 | P2 | 异常 | 联系人存在 | 1. 非本人查看他人联系人详情 2. 设可见权限为非法值 | 越权查看 403;非法权限值 400;最小权限保底 | `ContactCard` | — |
+| TC-P-64-E | SC-P-64 | 个人资料 | 家长 | P2 | 异常 | 已登录 | 1. 绑手机填非 11 位 2. 昵称含 emoji 超长 | 手机格式 400;昵称超长/非法字符拦截;保存生效 | `AuthController` | — |
+| TC-P-65-E | SC-P-65 | 通知设置 | 家长 | P3 | 异常 | 已登录 | 1. 关闭所有通知含安全类 2. 提醒时间填 25:00 | 关键安全通知仍推送不被关;非法时间 400 | 消息服务 | — |
+| TC-P-66-E | SC-P-66 | 隐私设置 | 家长 | P3 | 异常 | 已登录 | 1. 设数据共享范围为非法枚举 2. 设『完全公开』敏感字段 | 非法范围 400;敏感字段最小权限保底不外露 | 隐私设置 | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-P-67-E | P-67 | 报告代传/report-proxy | 家长 | P1 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告代传/report-proxy | — |
-| TC-P-68-E | P-68 | 家庭天盘 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 家庭天盘 | — |
-| TC-P-69-E | P-69 | 精准营养 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 精准营养 | — |
-| TC-P-70-E | P-70 | 舌诊情绪识别 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 舌诊情绪识别 | — |
-| TC-P-71-E | P-71 | AuthController | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | AuthController | — |
-| TC-P-72-E | P-72 | 数据导出(GDPR) | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 数据导出(GDPR) | — |
-| TC-P-73-E | P-73 | 家庭/成员 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 家庭/成员 | — |
-| TC-P-74-E | P-74 | 规划师绑定 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | 规划师绑定 | — |
-| TC-P-75-E | P-75 | 优惠券 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | 优惠券 | — |
-| TC-P-76-E | P-76 | 活动管理 | 家长 | P1 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | 活动管理 | — |
-| TC-P-77-E | P-77 | 活动 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | 活动 | — |
-| TC-P-78-E | P-78 | 消息服务 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 消息服务 | — |
-| TC-P-79-E | P-79 | 消息服务 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 消息服务 | — |
-| TC-P-80-E | P-80 | 会员/订单 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造支付失败/并发抢购/重复提交/库存或名额不足 2. 观察处理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | 会员/订单 | — |
-| TC-P-81-E | P-81 | 方案/任务 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造 AI/方案生成超时或不可用;重复激活/确认/购买 2. 观察处理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活幂等不重复生成任务;失败回滚不残半任务 | 方案/任务 | — |
-| TC-P-82-E | P-82 | 搜索 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 搜索 | — |
-| TC-P-83-E | P-83 | 客服 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 输入非法格式/重复/越界值 2. 观察处理 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | 客服 | — |
-| TC-P-84-E | P-84 | 分享 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 分享 | — |
-| TC-P-85-E | P-85 | AuthController | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | AuthController | — |
-| TC-P-86-E | P-86 | 勋章/排行 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 勋章/排行 | — |
+| TC-P-67-E | P-67 | 报告代传/report-proxy | 家长 | P1 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 用他人孩子的代传令牌 2. 代传报告归属非授权孩子 | 越权代传他人孩子 403 被拒;报告归属校验失败不入档;授权令牌失效提示 | 报告代传/report-proxy | — |
+| TC-P-68-E | P-68 | 家庭天盘 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 某成员报告/能量数据缺失 2. 非家庭成员访问 | 缺失项降级展示不白屏;非成员访问 403;仅本家庭可见 | 家庭天盘 | — |
+| TC-P-69-E | P-69 | 精准营养 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 目标热量填负/超上限(如 -100 / 100000) 2. 目标非数字 | 负/超上限 400『热量需在合理区间』;非数字 400;目标生效影响食谱 | 精准营养 | — |
+| TC-P-70-E | P-70 | 舌诊情绪识别 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 上传非照片(纯文本)/模糊图 2. 识别置信度<阈值 | 非照片/模糊拒绝提示『请上传清晰舌苔照』;低置信度提示『识别不清晰,建议重拍』;隐私标注不外露 | 舌诊情绪识别 | — |
+| TC-P-71-E | P-71 | AuthController | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 有进行中订单时注销 2. 注销后原 token 仍调用 | 有在途订单拦截『请先处理进行中订单』;注销后 token 失效 401 不可登录 | AuthController | — |
+| TC-P-72-E | P-72 | 数据导出(GDPR) | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 越权导出他人数据 2. 1 分钟内重复申请导出 | 越权导出 403;频次限制提示『导出过于频繁』;敏感字段脱敏 | 数据导出(GDPR) | — |
+| TC-P-73-E | P-73 | 家庭/成员 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 选非本家庭孩子 2. 切换时当前孩子未完成任务丢失 | 非本家庭孩子不可选 400;切换保持各孩子上下文隔离不串 | 家庭/成员 | — |
+| TC-P-74-E | P-74 | 规划师绑定 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 解绑时有在途方案/预约 2. 绑非本家庭规划师 | 在途未完成提示『请先处理在途服务』;非本家庭 T 绑定 400 被拒 | 规划师绑定 | — |
+| TC-P-75-E | P-75 | 优惠券 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 库存为 0 领券 2. 重复领同一券 | 库存 0 提示『已领完』;重复领幂等仅入卡包 1 张 | 优惠券 | — |
+| TC-P-76-E | P-76 | 活动管理 | 家长 | P1 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 名额仅剩 1 时并发报名 2 人 2. 名额已满再报名 | 并发超卖拦截仅 1 人成功(CFC 已修 bug 回归);满额拒『名额已满』;重复报名幂等 | 活动管理 | — |
+| TC-P-77-E | P-77 | 活动 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 同一天重复打卡 2. 机器刷量(1 秒 100 次) | 重复打卡幂等仅计 1 次;刷量风控拦截;进度累计正确 | 活动 | — |
+| TC-P-78-E | P-78 | 消息服务 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 越权看他人消息 2. 消息 id 不存在 | 越权消息不可见 403;不存在 404;分页正常 | 消息服务 | — |
+| TC-P-79-E | P-79 | 消息服务 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 关全部含关键安全 2. 非法提醒时间 | 关键安全通知不可关;非法时间 400 | 消息服务 | — |
+| TC-P-80-E | P-80 | 会员/订单 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 已消费会员申请退 2. 重复退 3. 发票信息缺失 | 已消费不退提示;重复退拦截;发票信息校验缺失字段 400 | 会员/订单 | — |
+| TC-P-81-E | P-81 | 方案/任务 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 恢复已超有效期的草稿 2. 并发存两版草稿 | 过期草稿提示『草稿已失效』;并发存后者覆盖且提示冲突 | 方案/任务 | — |
+| TC-P-82-E | P-82 | 搜索 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 搜他人家庭私有内容 2. 空关键词 | 越权结果过滤不可见;空结果不报错提示『请输入关键词』 | 搜索 | — |
+| TC-P-83-E | P-83 | 客服 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 反馈含身份证号等敏感信息 2. 附件 >10MB | 敏感信息脱敏存储;附件超限 400『附件不超过 10MB』 | 客服 | — |
+| TC-P-84-E | P-84 | 分享 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 用已失效分享链接 2. 越权分享他人私有内容 | 失效链接提示『分享已失效』;越权分享 403 被拒 | 分享 | — |
+| TC-P-85-E | P-85 | AuthController | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 新设备登录触发风控(异地) 2. 退出后旧 token 仍调用 | 异常设备二次验证/拦截;退出后旧 token 失效 401 | AuthController | — |
+| TC-P-86-E | P-86 | 勋章/排行 | 家长 | P2 | 异常 | 已登录(默认 家长);相关前置数据就绪 | 1. 看他人家庭排行榜 2. 排名数据实时性滞后 | 非本家庭榜不可见 403;排名仅本家庭数据,刷新即更新 | 勋章/排行 | — |
 
 ## 权限流用例(派生自正常流)
 
@@ -305,6 +305,43 @@
 | TC-P-85-P | P-85 | AuthController | 家长 | P1 | 权限 | 已登录(默认 家长);相关前置数据就绪 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察拦截 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | AuthController | — |
 | TC-P-86-P | P-86 | 勋章/排行 | 家长 | P1 | 权限 | 已登录(默认 家长);相关前置数据就绪 | 1. 以当前角色调用他人/非绑定家庭数据接口(报告/任务/方案/订单/能量) 2. 观察拦截 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | 勋章/排行 | — |
 
+## 五维指标变化专项用例(本轮新增 SC-P-87~93)
+
+> 完整用户故事见 `../user-scenarios/07-five-dimension.md`(ED-1~7)。每条含正常流 + 具体异常流(-E) + 权限流(-P),异常流为明确故障注入与可判定断言,非模板文案。
+
+### 正常流
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-P-87 | SC-P-87 | 能量/任务 | 家长 | P1 | 功能 | 测试家庭1 含 B;`EnergyRuleEngine` 已配任务→维度归因;B 各维度 `balance` 已知 | 1. B 完成任务 2. 家长 `POST /api/task/approve` 通过 3. 查 B `EnergyLog`/`EnergyBalance` | B 对应维度 `balance`/`totalEarned` +amount;`EnergyLog.sourceType=task`、`balanceAfter` 正确;概览/沙盘随新值刷新 | `EnergyRuleEngine`/`TaskController` | `tests/e2e/energy-system.spec.js` |
+| TC-P-88 | SC-P-88 | 能量/心愿 | 家长 | P1 | 功能 | B 已提心愿且积满;B 某维度 `balance≥兑换额`;另造 `balance` 不足对照 | 1. 家长通过心愿兑换 `POST /api/energy/deduct-for-wish` 2. 查 `EnergyLog`/`EnergyBalance` | 扣减成功,`EnergyLog` 负 `amount`、`balanceAfter=balance-额`;`balance`/`totalSpent` 同步;心愿已兑换 | `EnergyController`/`RewardController` | — |
+| TC-P-89 | SC-P-89 | 能量/手动 | 家长 | P2 | 功能 | 目标成员 B 存在;`POST /api/energy/grant` 可用 | 1. 家长调用 `grant` 指定 `memberId`/维度/`amount`/备注 2. 查 `EnergyLog`/`EnergyBalance` | 指定维度 +amount;`EnergyLog.sourceType=manual` 留痕;`balanceAfter` 更新 | `EnergyController` | — |
+| TC-P-90 | SC-P-90 | 能量/日上限 | 家长 | P1 | 功能 | `DimensionDailyLimit` 已配某维度 `dailyLimit=N`;B 当日该维度接近 N | 1. 当日多次触发该维度能量(任务/打卡/活动/手动)2. 观察累计与次日 | 累计达 N 后新增触发不再累加(或截断到上限);跨日 00:00 清零可重新获取 | `DimensionDailyLimit` | — |
+| TC-P-91 | SC-P-91 | 能量/健康报告 | 家长 | P0 | 功能 | 持有募极生物 PDF;报告预览完成(`SC-P-22`) | 1. 报告确认入库(`SC-P-23`)2. 查 `HealthDimensionScore` 与 `score-history`/`family-score-history` | 七维/六维评分刷新;概览/沙盘/`score-history` 按新值重算;时间序列反映改善 | `HealthReportController` | `tests/e2e/flora-microbiome-flow.spec.js` |
+| TC-P-92 | SC-P-92 | 能量/配置 | 家长 | P1 | 功能 | `POST /api/energy/configure` 与权重配置可用;存量能量存在 | 1. 运营调整来源比例/权重 2. 家长查概览/沙盘/天盘 | 按新口径重算并展示;存量重算提示 | `EnergyController`/维度配置 | `tests/e2e/energy-rules-config.spec.js` |
+| TC-P-93 | SC-P-93 | 能量/文章·活动 | 家长 | P1 | 功能 | `ArticleService`/`ActivityService` 能量规则已配;当日维度未触顶 | 1. 发布/评论文章或报名活动 2. 查 `EnergyLog` | 对应维度 +amount;`sourceType=article`/`activity`;`balanceAfter` 更新 | `ArticleService`/`ActivityService` | — |
+
+### 异常流(-E,具体故障注入)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-P-87-E | SC-P-87 | 能量/任务 | 家长 | P2 | 异常 | B 存在;另造"任务类型无归因配置""规则返回 null"对照 | 1. 重复审批同任务实例 2. 任务类型未配归因维度 3. `approve` 参数非法(空 taskId/非本家庭任务)4. 规则计算异常 | 1. 重复审批幂等不重复加、无第二条 `EnergyLog` 2. 无归因维度不 500、按规则落 `sourceType` 或不加 3. 参数非法统一 400、不改动能量 4. 规则异常告警、不写脏流水 | `EnergyRuleEngine` | — |
+| TC-P-88-E | SC-P-88 | 能量/心愿 | 家长 | P1 | 异常 | B 某维度 `balance` 不足对照 + 已兑换心愿 | 1. 余额不足兑换 2. 并发兑换同一心愿 3. 已兑换心愿再兑换 4. `deduct` 参数非法(空 wishId) | 1. 余额不足明确"能量不足"、心愿保持待审批、无负余额 2. 并发仅一次成功、二次幂等拒 3. 已兑换再提交拒、无负流水 4. 参数非法 400、不扣减 | `EnergyController`/`RewardController` | — |
+| TC-P-89-E | SC-P-89 | 能量/手动 | 家长 | P2 | 异常 | 目标成员存在 + 造负额/超大额/非法维度编码 | 1. 负额/超大额 `grant` 2. 维度编码不存在 3. 重复发放同工单号 | 1. 400 拦截不发放 2. 400 不写脏数据 3. 按幂等/业务规则不重复加 | `EnergyController` | — |
+| TC-P-90-E | SC-P-90 | 能量/日上限 | 家长 | P2 | 异常 | `DimensionDailyLimit` 配 `dailyLimit`;造跨时区/上限 0 或负对照 | 1. 多来源同维度并发触顶 2. 手动是否计入需断言 3. 客户端改时间绕过 4. 日上限配 0/负 | 1. 触顶后其余来源同维度受限 2. 手动口径断言一致 3. 以服务端日期为准、不绕过 4. 上限 0/负 拒绝配置或按 0、不崩溃 | `DimensionDailyLimit` | — |
+| TC-P-91-E | SC-P-91 | 能量/健康报告 | 家长 | P1 | 异常 | 报告预览完成 + 造"类型不一致""缺维度字段""重复入库" | 1. 入库前取消 2. 两次非同类报告对比 3. 解析缺某维度字段 4. 重复入库同报告 | 1. 不刷新、原评分保留 2. 类型不一致不可比/提示、不串维度 3. 该维度保持上一值或空态、不 500 4. 重复入库幂等不重复刷新 | `HealthReportController` | — |
+| TC-P-92-E | SC-P-92 | 能量/配置 | 家长 | P2 | 异常 | 配置可用 + 造"权重和≠100%""未同步""比例非法" | 1. 权重和≠100% 2. 配置未同步到前端缓存 3. 比例参数非法(负/超 1) | 1. 报警并拒或归一化、不静默错算 2. 展示兜底旧值并提示"同步中"、不显示错乱 3. 400 拦截 | `EnergyController`/维度配置 | — |
+| TC-P-93-E | SC-P-93 | 能量/文章·活动 | 家长 | P2 | 异常 | 能量规则已配 + 造"刷量""触顶""内容下架""活动满/结束" | 1. 高频评论(刷量)2. 当日已触顶 3. 内容含敏感词被下架 4. 活动名额满/已结束 | 1. 风控拦截不计能量 2. 触顶不累加 3. 按规则回收或保留、不双发 4. 参与被拒不发放 | `ArticleService`/`ActivityService` | — |
+
+### 权限流(-P)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-P-87-P | SC-P-87 | 能量/任务 | 家长 | P1 | 权限 | 家庭1(A+B+C),无关家庭 F9 | 1. 家长 A 查/改非本家庭成员(如 F9 成员)能量 2. 孩子 B 直接调 `grant` | 1. 非本家庭能量访问 403 2. 孩子端无 `grant` 入口、直接调被 role 校验拒 | `JwtInterceptor`+role | — |
+| TC-P-88-P | SC-P-88 | 能量/心愿 | 家长 | P1 | 权限 | 家庭1 + F9 | 1. 家长 A 操作非本家庭心愿兑换 2. 孩子 B 直接调 `deduct` | 1. 非本家庭心愿 403 2. 孩子端无扣减入口、直接调被拒 | `EnergyController` | — |
+| TC-P-89-P | SC-P-89 | 能量/手动 | 家长 | P1 | 权限 | 家庭1 + F9 | 1. 家长 A 给 F9 成员 `grant` 2. 孩子 B 调 `grant` | 1. 非本家庭 `grant` 403 2. 孩子端拒 | `JwtInterceptor`+role | — |
+| TC-P-90-P | SC-P-90 | 能量/日上限 | 家长 | P2 | 权限 | 家庭1 + F9 | 1. 家长 A 查 F9 成员日上限累计 2. 越权改 F9 `DailyLimit` | 1. 他人累计不可见 403 2. 越权改配置 403 | `DimensionDailyLimit` | — |
+| TC-P-91-P | SC-P-91 | 能量/健康报告 | 家长 | P1 | 权限 | 家庭1 + F9 | 1. 家长 A 查 F9 成员 `HealthDimensionScore`/`score-history` | 非本家庭健康维度数据 403、不泄露 | `HealthReportController` | — |
+| TC-P-92-P | SC-P-92 | 能量/配置 | 家长 | P1 | 权限 | 家庭1 + 运营 M | 1. 家长 A 调全局权重/`configure` 改配置 | 非 admin 改全局 403 | `EnergyController` | — |
+| TC-P-93-P | SC-P-93 | 能量/文章·活动 | 家长 | P2 | 权限 | 家庭1 + F9 | 1. 家长 A 查 F9 成员文章/活动能量流水 | 非本家庭流水 403 | `ArticleService`/`ActivityService` | — |
+
 ## 非功能测试用例(性能 / 兼容 / 安全)
 
 > 非功能维度:性能(大文件/并发/限流)、兼容(多端/多浏览器/主题)、安全(IDOR/XSS/上传/鉴权/SSRF)。编号后缀 `-N` 与正常流/异常流(-E)/权限流(-P)并列。

+ 54 - 29
tests/test-cases/teacher.md

@@ -59,40 +59,40 @@
 
 | 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-T-01-E | T-1 | 认证/双角色 | 规划师 | P2 | 异常 | 已分配规划师账号 | 1. token 缺失/过期访问规划师接口 2. 非指派家庭直接拼路由访问 3. 模拟登录开关校验 | 缺失/过期 token 统一 401 跳登录;非绑定家庭路由 403 被拒;模拟登录开关仅在测试环境可开 | `AuthController`;规划师可切回家长 | — |
+| TC-T-02-E | T-2 | 家庭绑定 | 规划师 | P2 | 异常 | 家长已生成邀请码 | 1. 邀请码填错/过期(>7天) 2. 重复绑定同一家庭 3. 绑定已注销家庭 | 错码/过期提示『邀请码无效或已失效』;重复绑定幂等不双建;注销家庭不可绑 | `FamilyInviteController` | — |
+| TC-T-03-E | T-3 | 健康报告 | 规划师 | P2 | 异常 | 已绑定家庭与孩子 B | 1. 上传损坏PDF/非募极/超大 2. 解析超时 3. 选非绑定家庭的孩子 | 损坏/非募极提示明确(非募极提示请确认募极生物);超大超限提示;解析超时进草稿非500;非绑定孩子 403 | 报告上传解析;规划师代传 | — |
+| TC-T-04-E | T-3 | 报告审核 | 规划师 | P2 | 异常 | 有报告草稿(如 id=28) | 1. 确认一个已被他人确认/删除的草稿 2. 解析超时草稿点确认 3. 非绑定家庭草稿 | 已删草稿提示『不存在』;解析中确认提示稍候;非绑定家庭草稿 403 不可操作 | 报告审核 | — |
+| TC-T-05-E | T-4 | 方案管理 | 规划师 | P2 | 异常 | 有 generated/reviewed/active 方案 | 1. 方案列表接口超时 2. 方案含未定义函数引用渲染 3. 空方案列表 | 列表超时降级提示非500;黑盒回归:函数不再未定义、不白屏;空列表正常占位 | 方案管理;黑盒回归项 | — |
+| TC-T-06-E | T-4 | 方案审核 | 规划师 | P2 | 异常 | 家长已提交方案(generated) | 1. 对非 generated 态(如已 reviewed)方案再点批准 2. 并发双批准 | 非 generated 态批准拦截(状态机守卫);并发双批准幂等仅 1 次状态跃迁 | 方案状态机 | — |
+| TC-T-07-E | T-5 | 方案激活 | 规划师 | P2 | 异常 | 方案已 reviewed | 1. 激活时任务分解服务超时 2. 对已激活方案再激活 3. 激活非 reviewed 方案 | 超时回滚不残半任务、状态回 reviewed;已激活再激活幂等不重复生成任务;非 reviewed 激活拦截 | 激活拆任务 | — |
+| TC-T-08-E | T-5 | 方案激活·幂等 | 规划师 | P2 | 异常 | 方案已 active | 1. 对已 active 方案连续点激活两次(并发) | 第二次幂等返回现状、不重复生成引导/模板任务;任务数与首次一致 | 幂等约束(黑盒回归) | — |
+| TC-T-09-E | T-6 | 任务审核 | 规划师 | P2 | 异常 | 孩子已提交任务 | 1. 审核非绑定家庭孩子任务 2. 同任务并发双审 3. 超期任务审核 | 非绑定家庭 403;并发双审幂等仅计 1 次积分;超期任务审核被拒 | `TaskController` | — |
+| TC-T-10-E | T-7 | 测评录入 | 规划师 | P2 | 异常 | 家长已支付测评订单(待安排→已预约) | 1. 必填维度缺失录入 2. 同一订单重复录入 3. 分值越界(>量纲) 4. 非指派规划师 confirm | 必填缺失 400 不生成半成品;重复录入覆盖非新增;越界 400 不写脏分;非指派 confirm 返回『您不是被指派测评师』 | `AssessmentAppointmentController`/`DanAssessmentController` | — |
+| TC-T-11-E | T-8 | 成长计划 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 成长计划列表接口超时 2. 空计划列表 3. 越权查非绑定家庭计划 | 超时降级非500;空列表正常;非绑定家庭 403 | `GrowthPlanController`;黑盒回归 | — |
+| TC-T-12-E | T-8 | 套餐 | 规划师 | P2 | 异常 | 套餐素材就绪 | 1. 提交空任务项套餐上架 2. 套餐审核超时 3. 重复提交同一套餐 | 空任务项拦截上架;审核超时回退草稿非500;重复提交幂等 | `GuidePackageController` | — |
+| TC-T-13-E | SC-T-13 | 数据隔离 | 规划师 | P2 | 异常 | 已绑定家庭 | 1. 直接拼路由查非绑定家庭报告/任务 2. 越权访问并发 | 非绑定家庭统一 403;不泄露他人数据;并发越权同样 403 | 控制器内 role 检查 | — |
+| TC-T-14-E | SC-T-14 | 方案编辑 | 规划师 | P2 | 异常 | 方案存在 | 1. 编辑已归档方案 2. 编辑非绑定家庭方案 3. 超长文本 | 归档方案编辑拦截;非绑定家庭 403;超长 400 | 方案管理 | — |
+| TC-T-15-E | SC-T-15 | 套餐任务 | 规划师 | P2 | 异常 | 套餐存在 | 1. 套餐任务重算服务超时 2. 空套餐任务重算 3. 并发增删任务 | 重算超时降级提示非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. 并发批量 | 部分失败不影响其他成员独立落库;并发批量各自独立不串 | `TaskController` | — |
+| TC-T-19-E | SC-T-19 | 消息推送 | 规划师 | P2 | 异常 | 已绑定客户 | 1. 推送目标含已注销客户 2. 消息内容含注入 3. 免打扰客户 | 已注销客户跳过不报错;内容转义不执行脚本;免打扰不推送 | 消息服务 | — |
+| TC-T-20-E | SC-T-20 | 退出/切换 | 规划师 | P2 | 异常 | 已登录 | 1. 退出后旧 token 仍调用 2. 切回家长视角时网络中断 | 旧 token 失效 401;网络中断退出清缓存、下次需重登;切回家长正常 | `AuthController` | — |
+| TC-T-21-E | SC-T-21 | 报告对比 | 规划师 | P2 | 异常 | 多份报告 | 1. 对比不同类型报告(菌群 vs DAN) 2. 对比不存在的报告 id | 类型不一致提示不可比;不存在 id 404;差异清晰标注 | 报告管理 | — |
+| TC-T-22-E | SC-T-22 | 方案归档 | 规划师 | P3 | 异常 | 方案完成 | 1. 归档后尝试编辑/激活 2. 归档不存在方案 | 归档后编辑/激活拦截;不存在 404 | 方案管理 | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-T-23-E | T-23 | 报告代传/report-proxy | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 报告代传/report-proxy | — |
-| TC-T-24-E | T-24 | 规划师绑定 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 规划师绑定 | — |
-| TC-T-25-E | T-25 | 舌诊情绪识别 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 舌诊情绪识别 | — |
-| TC-T-26-E | T-26 | 精准营养 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 精准营养 | — |
-| TC-T-27-E | T-27 | 家庭天盘 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 家庭天盘 | — |
-| TC-T-28-E | T-28 | 内容安全 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 制造 AI/方案生成超时或不可用;重复激活/确认/购买 2. 观察处理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活幂等不重复生成任务;失败回滚不残半任务 | 内容安全 | — |
-| TC-T-29-E | T-29 | 数据导出(GDPR) | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 制造 AI/方案生成超时或不可用;重复激活/确认/购买 2. 观察处理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活幂等不重复生成任务;失败回滚不残半任务 | 数据导出(GDPR) | — |
+| TC-T-23-E | T-23 | 报告代传/report-proxy | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 代传非绑定家庭孩子报告 2. 上传损坏/非募极 3. 识别失败 | 非绑定家庭 403 拒;损坏/非募极提示明确;识别失败进草稿非500 | 报告代传/report-proxy | — |
+| TC-T-24-E | T-24 | 规划师绑定 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 绑定有在途方案/预约的家庭 2. 绑定非本平台家庭 | 在途未完成提示先处理;非平台家庭绑定 400 拒 | 规划师绑定 | — |
+| TC-T-25-E | T-25 | 舌诊情绪识别 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 上传非照片/恶意图片(.php) 2. 识别置信度<阈值 | 类型校验拒绝(.php/.html)不执行;非照片/模糊拒;低置信度提示重拍 | 舌诊情绪识别 | — |
+| TC-T-26-E | T-26 | 精准营养 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 营养目标填负/超上限 2. 目标含 `<script>` | 负/超上限 400『热量需在合理区间』;脚本转义存储不执行 | 精准营养 | — |
+| TC-T-27-E | T-27 | 家庭天盘 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 打开非绑定家庭天盘 2. 某成员数据缺失 | 非绑定家庭 403;缺失项降级展示不白屏 | 家庭天盘 | — |
+| TC-T-28-E | T-28 | 内容安全 | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. AI 生成内容命中敏感词 2. 生成超时 | 命中即拦截不放行;超时 Fallback 兜底、友好提示非500 | 内容安全 | — |
+| TC-T-29-E | T-29 | 数据导出(GDPR) | 规划师 | P2 | 异常 | 已登录(默认 规划师);相关前置数据就绪 | 1. 越权导出非绑定家庭数据 2. 1分钟内重复申请 | 越权导出 403;频次限制提示『导出过于频繁』;敏感字段脱敏 | 数据导出(GDPR) | — |
 
 ## 权限流用例(派生自正常流)
 
@@ -132,6 +132,31 @@
 | TC-T-28-P | T-28 | 内容安全 | 规划师 | P1 | 权限 | 已登录(默认 规划师);相关前置数据就绪 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单);对非指派预约 confirm/cancel 2. 观察拦截 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | 内容安全 | — |
 | TC-T-29-P | T-29 | 数据导出(GDPR) | 规划师 | P1 | 权限 | 已登录(默认 规划师);相关前置数据就绪 | 1. 访问非绑定家庭的数据(报告/任务/方案/订单);对非指派预约 confirm/cancel 2. 观察拦截 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | 数据导出(GDPR) | — |
 
+## 五维指标变化专项用例(本轮新增 SC-T-30~32)
+
+> 完整用户故事见 `../user-scenarios/07-five-dimension.md`(ED-10~12)。每条含正常流 + 具体异常流(-E) + 权限流(-P)。
+
+### 正常流
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-T-30 | SC-T-30 | 测评/五维 | 规划师 | P1 | 功能 | 测评订单已建;规则引擎八类→五维映射已配 | 1. 录入各维度分(`SC-T-07`)2. 查五维评分与 `generated` 方案 | 八类分→五维刷新;生成 `generated` 方案;概览/沙盘刷新 | `AssessmentAppointmentService` | `tests/e2e/dan-report-flow.spec.js` |
+| TC-T-31 | SC-T-31 | 维度/手动 | 规划师 | P1 | 功能 | `ManualDimensionScoreController` 可用;B 当前维度分已知 | 1. 提交某维度新分 2. 查概览/沙盘与调整痕迹 | 目标维度覆盖/调整并留痕;概览/沙盘随新值刷新 | `ManualDimensionScoreController` | — |
+| TC-T-32 | SC-T-32 | 五维/自评 | 规划师 | P2 | 功能 | `FiveDimensionSelfCheckController` 可用 | 1. 提交五维自评 2. 查评分历史 | 自评微调并叠加;`FiveDimensionSelfCheck` 留记录;历史可查 | `FiveDimensionSelfCheckController` | — |
+
+### 异常流(-E,具体故障注入)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-T-30-E | SC-T-30 | 测评/五维 | 规划师 | P1 | 异常 | 订单已建 + 造"必填缺失""重复录入""分值越界" | 1. 必填维度缺失录入 2. 同一订单重复录入 3. 分值>量纲上限 | 1. 400 不生成半成品 2. 覆盖非新增、无重复记录 3. 越界 400 不写脏分 | `AssessmentAppointmentService` | — |
+| TC-T-31-E | SC-T-31 | 维度/手动 | 规划师 | P2 | 异常 | B 维度分已知 + 造"越界""同值重复" | 1. 越界分值提交 2. 同值重复提交 | 1. 400 拦截 2. 幂等无重复痕迹;不影响其他维度(断言) | `ManualDimensionScoreController` | — |
+| TC-T-32-E | SC-T-32 | 五维/自评 | 规划师 | P3 | 异常 | 自评可用 + 造"分值越界" | 1. 自评分值越界提交 | 400 拦截;不写脏分 | `FiveDimensionSelfCheckController` | — |
+
+### 权限流(-P)
+| TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
+|---|---|---|---|---|---|---|---|---|---|---|
+| TC-T-30-P | SC-T-30 | 测评/五维 | 规划师 | P1 | 权限 | 绑定家庭 F2 + 非绑定 F9 | 1. 规划师 T 录入 F9 成员测评分 | 非绑定家庭录入 403 | `AssessmentAppointmentService` | — |
+| TC-T-31-P | SC-T-31 | 维度/手动 | 规划师 | P1 | 权限 | 绑定家庭 F2 + 非绑定 F9 | 1. T 改 F9 成员维度分 | 非绑定家庭 403 | `ManualDimensionScoreController` | — |
+| TC-T-32-P | SC-T-32 | 五维/自评 | 规划师 | P1 | 权限 | 绑定家庭 F2 + 非绑定 F9 | 1. T 提交 F9 成员自评 | 非绑定家庭 403 | `FiveDimensionSelfCheckController` | — |
+
 ## 非功能测试用例(性能 / 兼容 / 安全)
 
 > 非功能维度:性能(大文件/并发/限流)、兼容(多端/多浏览器/主题)、安全(IDOR/XSS/上传/鉴权/SSRF)。编号后缀 `-N` 与正常流/异常流(-E)/权限流(-P)并列。

+ 11 - 11
tests/test-cases/vendor.md

@@ -39,22 +39,22 @@
 
 | 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-S-01-E | S-1 | 入驻 | 服务商 | P2 | 异常 | 资质/联系/品类就绪 | 1. 资质缺失(无营业执照)提交 2. 重复提交同资质入驻 3. 联系方式格式非法 | 资质缺失驳回并说明缺项;重复申请幂等不双建;非法联系方式 400 | `ServiceRoleApplicationController`/`AdminEcomSupplierController` | — |
+| TC-S-02-E | S-2 | 商品 | 服务商 | P2 | 异常 | 已审核通过 | 1. 创建商品价格为负/库存为负 2. 分类非法枚举 3. 并发改同商品库存 | 负价格/负库存/非法分类统一 400;并发改库存乐观锁不互相覆盖;下架后不可购买 | `ProductController`/`AdminProductController` | — |
+| TC-S-03-E | S-3 | 订单 | 服务商 | P2 | 异常 | 已有客户下单 | 1. 支付失败(回调签名错) 2. 重复发货同订单 3. 核销码被冒用/篡改 | 支付失败订单回滚不进已发货;重复发货幂等仅 1 次;核销码校验失败拒(防冒用) | `ProductOrderController` | — |
+| TC-S-04-E | SC-S-04 | 订单核销 | 服务商 | P2 | 异常 | 已发货订单 | 1. 重复扫码核销同订单 2. 超期订单核销 3. 核销非本服务商订单 | 重复核销幂等;超期提示不可核销;非本服务商 403 | 订单服务 | — |
+| TC-S-05-E | SC-S-05 | 库存 | 服务商 | P2 | 异常 | 商品存在 | 1. 调库存为负 2. 并发扣减超卖 3. 同步失败 | 负库存 400 拦截;并发超卖保护不出现负库存;同步失败重试前台一致 | 库存服务 | — |
+| TC-S-06-E | SC-S-06 | 售后 | 服务商 | P2 | 异常 | 有售后单 | 1. 重复退款同售后单 2. 退款金额>原单 3. 非本服务商售后 | 重复退款拦截仅 1 次;超金额 400;非本服务商 403;流水可追溯 | 售后 | — |
+| TC-S-07-E | SC-S-07 | 活动报名 | 服务商 | P3 | 异常 | 活动进行中 | 1. 活动已失效仍报名 2. 重复报名同活动 3. 报名参数非法 | 失效活动报名拒;重复报名幂等;非法参数 400 | 活动管理 | — |
+| TC-S-08-E | SC-S-08 | 对账 | 服务商 | P2 | 异常 | 账期到 | 1. 账期未到强行结算 2. 重复结算同账期 3. 账单金额异常(负) | 未到账期结算拒;重复结算幂等;异常金额告警不入账 | 结算 | — |
 
 
 ### 本轮扩展异常流(派生自新增场景)
 | TC 编号 | 所属场景 | 模块 | 角色 | 优先级 | 类型 | 前置条件 | 测试步骤 | 预期结果 | 关联需求/设计 | 对应 e2e |
 |---|---|---|---|---|---|---|---|---|---|---|
-| TC-S-9-E | S-9 | 服务商集成/解析中台 | 服务商 | P2 | 异常 | 已登录(默认 服务商);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 服务商集成/解析中台 | — |
-| TC-S-10-E | S-10 | 食谱库 | 服务商 | P2 | 异常 | 已登录(默认 服务商);相关前置数据就绪 | 1. 上传损坏/非募极/超大/格式不符文件或触发解析超时 2. 观察处理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | 食谱库 | — |
-| TC-S-11-E | S-11 | 合规 | 服务商 | P2 | 异常 | 已登录(默认 服务商);相关前置数据就绪 | 1. 制造并发/重复/异常设备/越权对象操作 2. 观察处理 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | 合规 | — |
+| TC-S-9-E | S-9 | 服务商集成/解析中台 | 服务商 | P2 | 异常 | 已登录(默认 服务商);相关前置数据就绪 | 1. 跨商户访问他商解析结果 2. 上传损坏/超大解析文件 3. 鉴权失效 | 跨商户隔离 403;损坏/超大文件明确提示非500;鉴权失效 401 | 服务商集成/解析中台 | — |
+| TC-S-10-E | S-10 | 食谱库 | 服务商 | P2 | 异常 | 已登录(默认 服务商);相关前置数据就绪 | 1. 上架格式非法食谱(JSON 残缺) 2. 含 XSS 描述 3. 非本商户食谱覆盖 | 格式校验 400;XSS 转义存储不执行;非本商户 403 | 食谱库 | — |
+| TC-S-11-E | S-11 | 合规 | 服务商 | P2 | 异常 | 已登录(默认 服务商);相关前置数据就绪 | 1. 越授权范围取数 2. 取数未脱敏敏感字段 3. 并发越权 | 越授权 403 拒;敏感字段强制脱敏;并发越权同样 403 | 合规 | — |
 
 ## 权限流用例(派生自正常流)
 

+ 316 - 0
tests/user-scenarios/07-five-dimension.md

@@ -0,0 +1,316 @@
+# 用户使用场景 · 五维指标变化(本轮新增专项)
+
+> 来源:`EnergyController`(`/api/energy/*`)、`EnergyRuleEngine`、`EnergyService`、`DimensionDailyLimit`、`EnergyBalance`/`EnergyLog`、`AttributionWeights`、`ManualDimensionScoreController`、`FiveDimensionSelfCheckController`、`HealthReportController`、`AssessmentAppointmentService`、`DailyCheckinService`、`GameRecordService`、`GrowthTaskService`、`ArticleService`/`ActivityService`。
+> 关联用例:`test-cases/*.md` 的 `SC-P-87~93` / `SC-C-24~25` / `SC-T-30~32` / `SC-A-23~24` / `SC-X-19~21`。
+> 设计原则:本文件补齐「五维指标**变化**」专项——即指标**如何随行为触发、如何按规则归因/限流/刷新/重算、如何溯源与隔离**,与 `应用场景总览.md` 中仅"查看/流水/配置查看"的 `SC-P-17/18/19` 形成闭环。
+>
+> **异常流口径**:下列每条场景均给出「具体故障注入 + 可判定断言」,不再使用"系统给出明确错误提示而非 500"等模板文案。
+
+---
+
+## 场景 ED-1(家长):任务完成触发五维能量按规则归因增长
+
+**用户故事**:作为家长,我希望孩子每完成一项任务,对应维度的五维能量能按规则准确增加,并能追溯到来源,以便激励可视化、可核对。
+
+- **角色**:家长(触发侧)/ 孩子(受益侧 memberId)
+- **前置条件**:测试家庭1 含孩子 B;`EnergyRuleEngine` 已配置任务→维度归因规则;B 当前各维度 `EnergyBalance.balance` 已知。
+- **主流程**
+  1. 孩子 B 完成任务 → 家长在 `POST /api/task/approve` 通过审批(`TaskController`/`PointsController`)。
+  2. 系统按 `EnergyRuleEngine` 将任务类型映射到的维度(身/心/智/行/富之一或多)增加 `amount`。
+  3. 写 `EnergyLog`:`memberId=B`、`dimensionId`、正 `amount`、`balanceAfter`、 `sourceType=task`、`sourceId=任务实例ID`。
+  4. 对应维度 `EnergyBalance.balance` 与 `totalEarned` 同步 +amount;概览/沙盘随新值刷新。
+- **异常/边界**
+  - 重复审批(同一条任务实例二次通过):幂等,不重复加能量;`EnergyLog` 不产生第二条。
+  - 任务类型未配置归因维度:落到兜底维度或记 `sourceType=task` 但不加(按规则),不得 500。
+  - 审批接口参数非法(空 taskId/非本家庭成员任务):统一 400,不改动任何能量。
+  - `amount` 计算异常(规则返回 null/负):拒绝执行并告警,不写脏流水。
+- **关联用例**:TC-P-87(正常)/ TC-P-87-E(异常)/ TC-P-87-P(权限)
+
+---
+
+## 场景 ED-2(家长):心愿兑换扣减五维能量,余额不为负
+
+**用户故事**:作为家长,我希望孩子用能量兑换心愿时,对应维度能量被正确扣减且永不为负,以便账目可信。
+
+- **角色**:家长(审批兑换)/ 孩子(发起心愿)
+- **前置条件**:孩子 B 已提心愿且积满所需能量;B 某维度 `balance` ≥ 兑换额,另造一条 `balance` 不足的对照用例。
+- **主流程**
+  1. 家长通过心愿兑换 → `POST /api/energy/deduct-for-wish`。
+  2. 系统校验 `balance ≥ 兑换额` 后扣减,`EnergyLog` 记负 `amount`、`balanceAfter = balance - 兑换额`。
+  3. 对应维度 `balance` 与 `totalSpent` 同步更新;心愿置为"已兑换"。
+- **异常/边界**
+  - 余额不足:扣减被拒,返回明确"能量不足",心愿保持待审批,**不出现负余额**。
+  - 并发兑换同一心愿:仅一次成功,第二次因"已兑换"幂等拒绝,不重复扣。
+  - 已兑换心愿再提交驳回/兑换:拒绝,不产生负流水。
+  - `deduct-for-wish` 参数非法(空 wishId/非本家庭心愿):400,不扣减。
+- **关联用例**:TC-P-88 / TC-P-88-E / TC-P-88-P
+
+---
+
+## 场景 ED-3(家长/运营):手动发放能量 grant
+
+**用户故事**:作为家长或运营,我希望能手动给家庭成员某个维度加能量(奖励/补偿),并留痕可查。
+
+- **角色**:家长(限本家庭)/ 运营(全平台)
+- **前置条件**:目标成员 B 存在;`POST /api/energy/grant` 可用。
+- **主流程**
+  1. 调用 `POST /api/energy/grant` 指定 `memberId`、维度、`amount`、备注。
+  2. 写 `EnergyLog`:`sourceType=manual`,`balanceAfter` 更新;`EnergyBalance` 同步 +amount。
+- **异常/边界**
+  - 负额/超大额(超过业务上限):拦截 400,不发放。
+  - 非本家庭成员(家长给别的家庭发):403 拒绝(权限流)。
+  - 重复发放同一工单号:按幂等/业务规则处理,不重复加。
+  - 维度编码非法(`dimensionCode` 不存在):400,不写脏数据。
+- **关联用例**:TC-P-89 / TC-P-89-E / TC-P-89-P
+
+---
+
+## 场景 ED-4(家长):五维每日获取上限 DailyLimit
+
+**用户故事**:作为家长,我希望每个维度每天获取的能量有上限,避免刷分,次日自动重置。
+
+- **角色**:孩子(触发)/ 家长(查看与配置生效观察)
+- **前置条件**:`DimensionDailyLimit` 已配置某维度 `dailyLimit=N`;B 当日该维度已累计接近 N。
+- **主流程**
+  1. 当日多次触发该维度能量(任务/打卡/活动/手动)。
+  2. 累计达 `dailyLimit` 后,新增触发不再累加(或按规则截断到上限)。
+  3. 跨日 00:00 后累计清零,可重新获取。
+- **异常/边界**
+  - 多来源(任务+打卡+活动)共享同一日上限:任一来源达成后其余来源同维度均受限。
+  - 手动 grant 是否计入日上限:按规则(一般手动不计入或单独口径),需断言一致。
+  - 时钟/跨时区边界:以服务端日期为准,不因客户端时间绕过。
+  - 日上限配置为 0 或负数:拒绝配置或按 0 处理,不得崩溃。
+- **关联用例**:TC-P-90 / TC-P-90-E / TC-P-90-P
+
+---
+
+## 场景 ED-5(家长/规划师):健康报告入库刷新五维评分
+
+**用户故事**:作为家长/规划师,我希望菌群/健康报告确认入库后,五维(及七维/六维健康维度)评分被刷新,并能看到前后变化与趋势。
+
+- **角色**:家长(自身家庭)/ 规划师(绑定家庭)
+- **前置条件**:持有募极生物菌群 PDF;报告预览已完成(`SC-P-22`/`SC-T-03`)。
+- **主流程**
+  1. 报告确认入库(`SC-P-23`/`SC-T-03`)→ `HealthReportController` 解析结果写入 `HealthDimensionScore`(七维/六维)。
+  2. 五维概览/沙盘/`score-history` 按新评分重算。
+  3. `POST /api/energy/score-history`、`/family-score-history` 可拉取时间序列,趋势图反映改善。
+- **异常/边界**
+  - 入库前取消:不刷新任何维度,原评分保留。
+  - 报告类型不一致(如两次非同类报告):对比/趋势被拒或提示"类型不一致",不串维度。
+  - 解析结果缺某维度字段:该维度保持上一值或空态,不 500。
+  - 重复入库同一报告:幂等,不重复刷新。
+- **关联用例**:TC-P-91 / TC-P-91-E / TC-P-91-P(e2e: `tests/e2e/flora-microbiome-flow.spec.js`、`health-report-audit.spec.js`)
+
+---
+
+## 场景 ED-6(家长/运营):五维权重与来源比例配置变更后重算
+
+**用户故事**:作为家长/运营,我希望调整维度权重或能量来源比例后,概览/沙盘/家庭天盘按新权重重算,且存量数据有提示。
+
+- **角色**:家长(查看生效)/ 运营(配置 `configureSourceRatios`、权重 CRUD)
+- **前置条件**:`POST /api/energy/configure` 与维度权重配置可用;存量能量数据存在。
+- **主流程**
+  1. 运营调整来源比例/权重 → 配置生效。
+  2. 概览/沙盘/家庭天盘按新口径重算并展示。
+  3. 存量数据的重算影响给出提示("配置变更影响存量")。
+- **异常/边界**
+  - 权重之和 ≠ 100%:报警并拒绝或按归一化处理,不得静默错算。
+  - 配置未同步到前端/缓存:展示兜底旧值并提示"配置同步中",不显示错乱比例。
+  - 非 admin 改全局权重:403(权限流)。
+  - 比例参数非法(负/超 1):400 拦截。
+- **关联用例**:TC-P-92 / TC-P-92-E / TC-P-92-P(e2e: `tests/e2e/energy-rules-config.spec.js`)
+
+---
+
+## 场景 ED-7(家长/孩子):文章互动与活动参与触发五维能量
+
+**用户故事**:作为家长/孩子,我希望发表/评论文章、参与平台活动也能获得能量,但受每日上限约束。
+
+- **角色**:家长 / 孩子
+- **前置条件**:`ArticleService`/`ActivityService` 能量发放规则已配置;当日维度未触顶。
+- **主流程**
+  1. 发布/评论文章或报名参与活动 → 触发 `EnergyRuleEngine` 对应维度 +amount。
+  2. 写 `EnergyLog`(`sourceType=article`/`activity`);`balanceAfter` 更新。
+- **异常/边界**
+  - 刷量/机器行为(高频评论):风控拦截,不计能量。
+  - 当日已触顶 `DailyLimit`:不再累加。
+  - 内容含敏感词被下架:已发放能量按规则回收或保留(需断言),不双发。
+  - 活动名额满/已结束:参与被拒,不发放。
+- **关联用例**:TC-P-93 / TC-P-93-E / TC-P-93-P
+
+---
+
+## 场景 ED-8(孩子):小游戏/任务得分触发五维增长(仅自身可见)
+
+**用户故事**:作为孩子,我希望玩游戏/完成任务获得的能量只加在我自己身上,且我只能看到自己的变化。
+
+- **角色**:孩子
+- **前置条件**:孩子 B 登录;小游戏/任务完成上报接口可用。
+- **主流程**
+  1. 完成小游戏/任务 → `GameRecordService`/`TaskController` 上报成绩 → 对应维度 +amount。
+  2. B 在"能量与报告(只读)"页看到自身增长与流水。
+- **异常/边界**
+  - 异常分数(超评分上限/负分):拦截,不写能量。
+  - 重复上报同一成绩:幂等,不重复加。
+  - 越权查看他人能量:403(权限流)。
+  - 孩子端无编辑/扣减入口:仅展示,不提供 grant/deduct。
+- **关联用例**:TC-C-24 / TC-C-24-E / TC-C-24-P(e2e: `tests/e2e/mini-games.spec.js`、`points-system.spec.js`)
+
+---
+
+## 场景 ED-9(孩子):方案任务打卡触发五维增长
+
+**用户故事**:作为孩子,我希望按成长方案打卡后获得对应维度能量,进度与能量同步。
+
+- **角色**:孩子
+- **前置条件**:方案已激活并生成启动任务(`SC-C-05`);打卡接口可用。
+- **主流程**
+  1. 打开方案启动任务 → 打卡提交(`GrowthTaskService`)。
+  2. 对应维度 +amount,`EnergyLog` 记录;任务进度与能量同步刷新。
+- **异常/边界**
+  - 逾期限打卡:按业务允许或拒绝,断言一致(不静默加)。
+  - 重复打卡同一任务:幂等,不重复加。
+  - 非本人方案任务打卡:403(权限流)。
+  - 打卡并发:不重复计分。
+- **关联用例**:TC-C-25 / TC-C-25-E / TC-C-25-P(e2e: `tests/e2e/daily-checkin-streak.spec.js`、`growth-record-sync.spec.js`)
+
+---
+
+## 场景 ED-10(规划师):测评录入触发五维维度变化
+
+**用户故事**:作为规划师,我希望录入孩子测评各维度分后,五维评分按规则引擎更新并生成方案。
+
+- **角色**:规划师(绑定家庭)
+- **前置条件**:测评订单已创建;`AssessmentAppointmentService` 规则引擎已配置 DAN 八类→五维映射。
+- **主流程**
+  1. 规划师录入各维度分(`SC-T-07`)→ 保存。
+  2. 规则引擎将八类(mind/wisdom/cognition/learning/behavior/career/campus/adolescent)映射刷新五维评分。
+  3. 触发生成 `generated` 方案;五维概览/沙盘刷新。
+- **异常/边界**
+  - 必填维度缺失:拦截 400,不生成半成品方案。
+  - 重复录入:覆盖非新增,不产生重复评分记录。
+  - 非绑定家庭录入:403(权限流)。
+  - 录入分值越界(>量纲上限):拦截,不写脏分。
+- **关联用例**:TC-T-30 / TC-T-30-E / TC-T-30-P(e2e: `tests/e2e/dan-report-flow.spec.js`、`dan-assessment-vendor-flow.spec.js`)
+
+---
+
+## 场景 ED-11(规划师):手动维度打分覆盖/调整
+
+**用户故事**:作为规划师,我希望能手动调整某成员某维度分(覆盖当前值),并保留调整痕迹。
+
+- **角色**:规划师(绑定家庭)
+- **前置条件**:`ManualDimensionScoreController` 可用;目标成员 B 当前维度分已知。
+- **主流程**
+  1. 规划师提交某维度新分 → 覆盖/调整当前值并写调整记录。
+  2. 五维概览/沙盘随新值刷新;调整留痕可审计。
+- **异常/边界**
+  - 越界分值(>上限):400 拦截。
+  - 调整不影响其他维度:断言仅目标维度变化。
+  - 非绑定家庭成员:403(权限流)。
+  - 重复提交同值:幂等,不产生重复痕迹。
+- **关联用例**:TC-T-31 / TC-T-31-E / TC-T-31-P
+
+---
+
+## 场景 ED-12(孩子/规划师):五维自评录入与变化
+
+**用户故事**:作为孩子(或规划师代填),我希望通过五维自评微调自身维度,并仅本人/绑定家庭可见。
+
+- **角色**:孩子(自评)/ 规划师(代录)
+- **前置条件**:`FiveDimensionSelfCheckController` 可用。
+- **主流程**
+  1. 提交五维自评 → 维度微调,写 `FiveDimensionSelfCheck` 记录。
+  2. 五维评分叠加自评结果;历史可查。
+- **异常/边界**
+  - 非本人/非绑定家庭自评:403(权限流)。
+  - 自评分值越界:400 拦截。
+  - 自评与测评/报告冲突:以规则优先级覆盖,断言确定。
+- **关联用例**:TC-T-32 / TC-T-32-E / TC-T-32-P
+
+---
+
+## 场景 ED-13(运营):维度/权重/每日上限配置 CRUD 与生效
+
+**用户故事**:作为运营,我希望能增删改维度、权重、每日上限配置,并让变更安全生效、影响后续计算。
+
+- **角色**:运营(admin)
+- **前置条件**:维度/权重/`DimensionDailyLimit` 配置管理接口可用。
+- **主流程**
+  1. 运营对维度、权重、每日上限做 CRUD。
+  2. 变更生效,后续能量计算按新配置;存量影响给出提示。
+- **异常/边界**
+  - 删除被引用维度:需确认/拒绝,不得级联破坏存量数据。
+  - 权重/上限非法(负/超界/和≠100%):400 拦截。
+  - 非 admin 操作:403(权限流)。
+  - 并发改同一配置:乐观锁/版本控制,不互相覆盖。
+- **关联用例**:TC-A-23 / TC-A-23-E / TC-A-23-P(e2e: `tests/e2e/energy-rules-config.spec.js`)
+
+---
+
+## 场景 ED-14(运营):能量来源比例与归因权重治理
+
+**用户故事**:作为运营,我希望治理能量来源比例与归因权重这一全局配置,变更有审计、影响可观测。
+
+- **角色**:运营(admin)
+- **前置条件**:`AttributionWeights` / `configureSourceRatios` 全局配置可用。
+- **主流程**
+  1. 调整来源比例/归因权重 → 全局生效。
+  2. 变更写入审计;对概览/沙盘/家庭天盘的影响可观测。
+- **异常/边界**
+  - 非 admin 改全局:403(权限流)。
+  - 比例非法(负/超 1/和≠1):400 拦截。
+  - 配置未同步到计算节点:展示兜底并提示,不静默错算。
+- **关联用例**:TC-A-24 / TC-A-24-E / TC-A-24-P
+
+---
+
+## 场景 ED-15(跨角色):五维能量跨角色数据隔离
+
+**用户故事**:作为任一方,我只能访问本家庭/绑定家庭成员的能量与流水;任何横向越权都被拒。
+
+- **角色**:跨角色(孩子/家长/规划师/运营)
+- **前置条件**:家庭1(A+B+C)、绑定家庭 F2(规划师 T)、无关家庭 F9。
+- **主流程**
+  1. 各方查询自身/归属成员的能量概览、流水、评分历史。
+  2. 越权查询他人/非绑定家庭能量接口。
+- **异常/边界**
+  - 孩子 token 查家长/规划师/运营接口:401/403。
+  - 家长查其他家庭成员能量:403。
+  - 规划师查非绑定家庭 F9 能量:403。
+  - 运营查用户能量需工单授权,越权导出被拒。
+- **关联用例**:TC-X-19 / TC-X-19-E / TC-X-19-P(e2e: `tests/e2e/api/nonfunc-security.spec.js`)
+
+---
+
+## 场景 ED-16(跨角色):五维能量流水溯源一致性(对账)
+
+**用户故事**:作为对账方,我希望每条能量流水的 `balanceAfter` 都等于上一笔 `balanceAfter + amount`,且 `totalEarned - totalSpent = balance`,不一致即报警。
+
+- **角色**:跨角色(运营/家长对账)
+- **前置条件**:成员 B 有混合来源流水(任务/打卡/心愿扣减/手动)。
+- **主流程**
+  1. 拉取 `EnergyLog` 按时间排序,逐条校验 `balanceAfter == prevBalanceAfter + amount`。
+  2. 校验 `EnergyBalance.totalEarned - totalSpent == balance`。
+- **异常/边界**
+  - 任一条不一致:报警并定位断点(不静默通过)。
+  - 删除/回退产生的负流水:必须有对应负 `amount` 流水,余额不为负。
+  - 并发写入导致顺序错乱:以服务端事务/版本保证顺序一致。
+- **关联用例**:TC-X-20 / TC-X-20-E / TC-X-20-P
+
+---
+
+## 场景 ED-17(跨角色):多来源并发同成员能量变动
+
+**用户故事**:作为系统,我希望同一成员同一维度被任务/打卡/小游戏/活动并发触发时,不超日上限、不重复加、余额一致。
+
+- **角色**:跨角色(系统级并发)
+- **前置条件**:成员 B 某维度当日未触顶;多个触发同时到达。
+- **主流程**
+  1. 并发提交多种触发(任务审批+打卡+小游戏+活动)。
+  2. 校验:每笔原子加、总额不超过 `DailyLimit`、无重复加、最终 `balance` 与流水合计一致。
+- **异常/边界**
+  - 并发触顶:最后到达的被拒或截断,总额不超上限。
+  - 部分失败:已成功的流水保留,失败的回滚不残半笔。
+  - 重复请求(网络重试):幂等,不因重试多加。
+- **关联用例**:TC-X-21 / TC-X-21-E / TC-X-21-P(e2e: `tests/e2e/api/nonfunc-perf-compat.spec.js`、`energy-system.spec.js`)

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

@@ -15,6 +15,7 @@
 | `04-teacher.md` | 成长规划师 | 密码登录、绑定家庭、代传报告、审核方案、激活拆任务(幂等)、录入测评、成长计划、创建套餐 |
 | `05-admin.md` | 平台运营 | 管理端登录、全局统计、报告解析中台、文章发布审核、关系类型/勋章/供应商/活动/知识库、数据迁移、参数校验 |
 | `06-vendor.md` | 商品服务商 | 入驻申请、商品管理、订单处理(发货/核销) |
+| `07-five-dimension.md` | 全角色(五维变化) | 五维指标**变化**专项:任务/打卡/小游戏/测评录入/报告入库/手动打分/自评/心愿扣减/每日上限/权重变更/跨角色隔离·对账·并发(ED-1~17,对应 SC-P-87~93 等) |
 
 ## 编写依据
 

+ 52 - 14
tests/user-scenarios/应用场景总览.md

@@ -13,13 +13,13 @@
 | 角色 | 角色标签 | 业务域 | 场景数 |
 |------|----------|--------|--------|
 | 游客 | `guest` | 进入 / 登录注册 / 浏览转化 / 权限边界 / 环境 / 协议 / H5 兜底 | 12 |
-| 家长 | `parent` | 家庭成员 / 任务激励 / 五维能量健康 / 报告闭环 / 饮食食谱 / 测评规划价值链 / 商城会员 / 联系人 / 设置 / 报告代传 / 精准营养 / 账号数据主权 / 营销活动 / 交易延伸 / 多端 | 86 |
-| 孩子(不能登录用户视角) | `child` | 孩子端登录 / 任务游戏 / 心愿 / 只读报告 / 方案打卡 / 勋章 / 成长 / 消息 / 档案导出 / 舌诊自拍 / 商城兑换 / 反馈 | 23 |
-| 成长规划师 | `teacher` | 登录切换 / 绑定家庭 / 代传报告 / 方案审核激活 / 测评录入 / 成长计划套餐 / DAN / 解绑重分配 / 舌诊 / 精准营养 / 家庭天盘 / 内容安全 / 导出 | 29 |
-| 平台运营 | `admin` | 登录统计 / 报告解析中台 / 文章审核 / 配置CRUD / 知识库 / 迁移校验 / 监控 / 报告自学习 / 优惠券活动 / 内容安全队列 / 注销导出工单 / 限流 / 模型 / 精准营养知识库 | 22 |
+| 家长 | `parent` | 家庭成员 / 任务激励 / 五维能量健康 / **五维指标变化** / 报告闭环 / 饮食食谱 / 测评规划价值链 / 商城会员 / 联系人 / 设置 / 报告代传 / 精准营养 / 账号数据主权 / 营销活动 / 交易延伸 / 多端 | 93 |
+| 孩子(不能登录用户视角) | `child` | 孩子端登录 / 任务游戏 / 心愿 / 只读报告 / 方案打卡 / 勋章 / 成长 / 消息 / 档案导出 / 舌诊自拍 / 商城兑换 / 反馈 / **五维变化(自身)** | 25 |
+| 成长规划师 | `teacher` | 登录切换 / 绑定家庭 / 代传报告 / 方案审核激活 / 测评录入 / 成长计划套餐 / DAN / 解绑重分配 / 舌诊 / 精准营养 / 家庭天盘 / 内容安全 / 导出 / **五维变化(录入/手动/自评)** | 32 |
+| 平台运营 | `admin` | 登录统计 / 报告解析中台 / 文章审核 / 配置CRUD / 知识库 / 迁移校验 / 监控 / 报告自学习 / 优惠券活动 / 内容安全队列 / 注销导出工单 / 限流 / 模型 / 精准营养知识库 / **五维配置治理** | 24 |
 | 商品服务商 | `vendor` | 入驻 / 商品 / 订单履约 / 售后 / 解析接入 / 食谱供给 / 合规 | 11 |
-| 跨角色 | `cross` | 测评全链路 / 报告闭环 / 双角色隔离 / 商城履约 / 消息通知 / 代传 / 解绑 / 注销 / 并发 / 会话 / 推送 | 18 |
-| **合计** | | | **201** |
+| 跨角色 | `cross` | 测评全链路 / 报告闭环 / 双角色隔离 / 商城履约 / 消息通知 / 代传 / 解绑 / 注销 / 并发 / 会话 / 推送 / **五维隔离·对账·并发** | 21 |
+| **合计** | | | **218** |
 
 ---
 
@@ -316,7 +316,42 @@
 
 ---
 
-## 九、测试用例划分规则(落地口径)
+## 九、五维指标变化专项测试场景(本轮新增 ED-1~17)
+
+> 本段补齐「五维指标**变化**」专项:指标如何随行为触发、按规则归因 / 日上限 / 刷新 / 重算、如何溯源与隔离。完整用户故事见 [`07-five-dimension.md`](./07-five-dimension.md);用例见 `../test-cases/*.md` 的 `TC-P-87~93` / `TC-C-24~25` / `TC-T-30~32` / `TC-A-23~24` / `TC-X-19~21`(每条含正常流 + 具体异常流-E + 权限流-P)。
+
+### 业务域 C-2(家长):五维能量变化规则
+- **SC-P-87 · 任务完成触发五维能量按规则归因增长** — 目标:任务审批通过按 `EnergyRuleEngine` 归因到对应维度并写 `EnergyLog`/`EnergyBalance`。边界:重复审批幂等不加;未配置归因维度不 500;参数非法 400 不改能量;规则计算异常告警不写脏流水。模块:`EnergyRuleEngine`/`TaskController`。
+- **SC-P-88 · 心愿兑换扣减五维能量(余额不为负)** — 目标:`deduct-for-wish` 扣减并写负流水。边界:余额不足拒、不出现负余额;并发兑换幂等;已兑换不可重扣;参数非法 400。模块:`EnergyController`/`RewardController`。
+- **SC-P-89 · 手动发放能量 grant** — 目标:家长/运营给指定成员维度加能量留痕。边界:负额/超大额 400;非本家庭 403;重复发放幂等;维度编码非法 400。模块:`EnergyController`。
+- **SC-P-90 · 五维每日获取上限 DailyLimit** — 目标:单维度单日累计触顶后不再累加、次日重置。边界:多来源共享日上限;手动是否计入需断言一致;跨时区以服务端日期为准;上限 0/负不崩溃。模块:`DimensionDailyLimit`。
+- **SC-P-91 · 健康报告入库刷新五维评分** — 目标:报告确认入库刷新 `HealthDimensionScore`(七维/六维)并重算概览/沙盘/`score-history`。边界:入库前取消不刷新;类型不一致不可比;缺维度字段不 500;重复入库幂等。模块:`HealthReportController`。
+- **SC-P-92 · 五维权重/来源比例配置变更后重算** — 目标:`configure`/权重变更后概览/沙盘/天盘按新口径重算并提示存量影响。边界:权重和≠100% 报警;配置未同步兜底旧值;非 admin 改全局 403;比例非法 400。模块:`EnergyController`/`维度配置`。
+- **SC-P-93 · 文章互动与活动参与触发五维能量** — 目标:发布/评论/活动参与按规则加对应维度能量、受 `DailyLimit` 约束。边界:刷量风控拦截;触顶不累加;内容下架按规则回收;活动满/结束拒。模块:`ArticleService`/`ActivityService`。
+
+### 业务域(孩子):自身五维变化
+- **SC-C-24 · 小游戏/任务得分触发五维增长(仅自身可见)** — 目标:成绩上报对应维度+并只加自身。边界:异常分数拦截;重复上报幂等;越权看他人 403;孩子端无编辑/扣减入口。模块:`GameRecordService`/`TaskController`。
+- **SC-C-25 · 方案任务打卡触发五维增长** — 目标:`GrowthTaskService` 打卡对应维度+并同步进度/能量。边界:逾期限按业务;重复打卡幂等;非本人方案 403;并发不重复计分。模块:`GrowthTaskService`。
+
+### 业务域(规划师):五维变化录入
+- **SC-T-30 · 测评录入触发五维维度变化** — 目标:录入八类分→规则引擎刷新五维并生成方案。边界:必填缺失 400;重复录入覆盖非新增;非绑定家庭 403;分值越界 400。模块:`AssessmentAppointmentService`。
+- **SC-T-31 · 手动维度打分覆盖/调整** — 目标:`ManualDimensionScoreController` 覆盖目标维度并留痕。边界:越界 400;不影响其他维度;非绑定家庭 403;同值幂等。模块:`ManualDimensionScoreController`。
+- **SC-T-32 · 五维自评录入与变化** — 目标:`FiveDimensionSelfCheckController` 自评微调并叠加。边界:非本人/非绑定 403;分值越界 400;与测评/报告冲突按优先级。模块:`FiveDimensionSelfCheckController`。
+
+### 业务域(运营):五维配置治理
+- **SC-A-25 · 维度/权重/每日上限配置 CRUD 与生效** — 目标:维度/权重/`DailyLimit` CRUD 安全生效。边界:删除被引用维度需确认;权重/上限非法 400;非 admin 403;并发改版本控制。模块:`DimensionConfigController`/`DimensionWeightController`。
+- **SC-A-26 · 能量来源比例与归因权重治理** — 目标:`AttributionWeights`/`configureSourceRatios` 全局生效并审计。边界:非 admin 403;比例非法 400;未同步兜底。模块:`EnergyController`/`AttributionWeights`。
+
+### 业务域(跨角色):五维隔离·对账·并发
+- **SC-X-19 · 五维能量跨角色数据隔离** — 目标:各方仅访问本家庭/绑定家庭成员能量与流水。边界:孩子查家长/规划师/运营 401/403;家长查他人 403;规划师查非绑定 F9 403;运营需工单授权。模块:`JwtInterceptor`+role 检查。
+- **SC-X-20 · 五维能量流水溯源一致性(对账)** — 目标:逐条 `balanceAfter==prev+amount`;`totalEarned-totalSpent==balance`。边界:不一致报警定位;负流水必有对应负记录且余额不为负;并发顺序一致。模块:`EnergyLog`/`EnergyBalance`。
+- **SC-X-21 · 多来源并发同成员能量变动** — 目标:任务/打卡/小游戏/活动并发原子加、不超日上限、不重复、余额一致。边界:触顶最后到达被拒/截断;部分失败回滚不残半笔;重试幂等。模块:`EnergyRuleEngine`。
+
+**派生用例**:`test-cases/parent.md` TC-P-87~93、`test-cases/child.md` TC-C-24~25、`test-cases/teacher.md` TC-T-30~32、`test-cases/admin.md` TC-A-23~24、`test-cases/cross-role-e2e.md` TC-X-19~21(每条含正常流 + 具体异常流-E + 权限流-P,见各文件「五维指标变化专项」段)。
+
+---
+
+## 十、测试用例划分规则(落地口径)
 
 1. **一级维度 = 角色场景**:每个 `SC-角色-NN` 是测试用例聚类的根节点。
 2. **二级维度 = 流类型**:每个场景派生 3 类用例
@@ -329,25 +364,28 @@
    - **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)
    - **新增(本轮 +50)**:SC-G-11/12、SC-P-67~86、SC-C-19~23、SC-T-23~29、SC-A-16~22、SC-S-09~11、SC-X-13~18 已纳入;P0 含 SC-P-67 报告代传 / SC-P-76 活动并发名额 / SC-X-16 并发 E2E,其余默认 P1(设置/协议类为 P2)。
+   - **新增(五维变化专项 +17)**:SC-P-87~93/SC-C-24~25/SC-T-30~32/SC-A-23~24/SC-X-19~21 已纳入;P0 含 SC-P-91 报告刷新 / SC-X-19 隔离 / SC-X-20 对账 / SC-X-21 并发,其余默认 P1(配置/手动类为 P2)。
 5. **自动化对齐**:`tests/e2e/` 按角色分包(`e2e/roles/admin|child|parent|teacher`)与 API 层(`e2e/api/*`)对齐本表;DOM 层用例因 CFC-ENV-001 环境阻塞先标记未完成。
 
 ---
 
-## 十、覆盖率追溯(场景 → 用例 → 自动化)
+## 十一、覆盖率追溯(场景 → 用例 → 自动化)
 
 | 角色 | 场景数 | 文档化用例(TC) 现状 | 状态 |
 |------|--------|---------------------|------|
 | 游客 | 12 | 12(TC-G-01~12) | ✅ 已覆盖 SC-G-01~12 |
-| 家长 | 86 | 86(TC-P-01~86) | ✅ 已覆盖(含价值链 SC-P-20/27/31~49/67/76) |
-| 孩子 | 23 | 23(TC-C-01~23) | ✅ 已覆盖 SC-C-01~23 |
-| 规划师 | 29 | 29(TC-T-01~29) | ✅ 已覆盖(含 SC-T-05/07/09/11/23 深挖项) |
-| 运营 | 22 | 23(TC-A-01~23,超覆盖 1 条) | ✅ 已覆盖(多 1 条) |
+| 家长 | 93 | 93(TC-P-01~93) | ✅ 已覆盖(含价值链 + 五维变化 SC-P-87~93) |
+| 孩子 | 25 | 25(TC-C-01~25) | ✅ 已覆盖(含五维变化 SC-C-24~25) |
+| 规划师 | 32 | 32(TC-T-01~32) | ✅ 已覆盖(含五维变化 SC-T-30~32) |
+| 运营 | 24 | 24(TC-A-01~24) | ✅ 已覆盖(含五维配置治理 SC-A-23~24) |
 | 服务商 | 11 | 11(TC-S-01~11) | ✅ 已覆盖 SC-S-01~11 |
-| 跨角色 | 18 | 18(TC-X-01~18) | ✅ 已覆盖 SC-X-01~18 |
-| **合计** | **201** | **202(正常流)×3 流 = 606** | ✅ 文档化用例已对齐全部 201 个场景(每个含正常/异常/权限三类) |
+| 跨角色 | 21 | 21(TC-X-01~21) | ✅ 已覆盖(含五维隔离/对账/并发 SC-X-19~21) |
+| **合计** | **218** | **218(正常流)×3 流 = 654** | ✅ 文档化用例已对齐全部 218 个场景(每个含正常/异常/权限三类) |
 
 > 统计口径:文档化用例来自 `../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 前端)仍独立于本表存在,属环境限制而非用例缺失。
 
 > **本轮扩展(+50 场景)**:新增 SC-G-11~12、SC-P-67~86、SC-C-19~23、SC-T-23~29、SC-A-16~22、SC-S-09~11、SC-X-13~18,补齐此前"有文档无场景"的真实功能(报告代传 / 家庭天盘 / 精准营养 / 舌诊情绪 / 账号注销·数据导出·解绑 / 活动并发名额 / 消息推送 / 分享 / 多端会话 等),并同步生成异常流与权限流用例,场景总数由 151 升至 201。
+>
+> **本轮扩展(+17 五维变化专项 · 2026-11-02)**:补齐「五维指标**变化**」专项,场景总数由 201 升至 218。新增 SC-P-87~93(家长·能量变化规则)/ SC-C-24~25(孩子·自身变化)/ SC-T-30~32(规划师·变化录入)/ SC-A-23~24(运营·配置治理)/ SC-X-19~21(跨角色·隔离·对账·并发)。完整用户故事见 `07-five-dimension.md`;用例见 `test-cases/*.md` 的 `TC-P-87~93` 等。本批用例与既有用例统一改造为**具体异常流**(明确故障注入与可判定断言,废除"系统给出明确错误提示而非 500"等模板文案),详见 § 十 优先级映射与 `test-cases` 对应「五维指标变化专项」段。