# TDD 测试用例总台账(跨源编目 · 标注来源 · 可回写) > 生成依据:`tdd-orchestrator/scripts/test_inventory.py` 对全仓库测试源的只读扫描。 > **仅发现/格式化/跟踪已有测试,不创建、不发明**。每条用例均标注**来源**(原文件路径 + 锚点), > 进度回写落在 `.tdd/test-progress.json` 侧车(按来源锚点索引),**绝不改动原测试文件**。 ## 一、汇总(按来源类型) | 来源类型 | 文件数 | 用例/方法数 | | --- | --- | --- | | 结构化测试用例(md) | 9 | 678 | | Playwright(spec.js) | 70 | 411 | | Python(pytest) | 11 | 47 | | Java后端(测试文件) | 185 | 1390 (@Test) | | 用户场景(md) | 8 | 文件级 | | **合计** | — | **2526** 用例/方法 | ## 二、结构化测试用例(`tests/test-cases/*.md`) > 每条来源锚点 = `文件#TC编号`,回写进度时定位此锚点即可,不改原 markdown 表格。 | TC编号 | 模块 | 角色 | 优先级 | 类型 | 来源 | 对应e2e | 关联设计 | | --- | --- | --- | --- | --- | --- | --- | --- | | `TC-A-01` | 认证 | 运营 | P0 | 接口 | `tests/test-cases/admin.md#TC-A-01` | AdminAuthController | 登录进入 Dashboard;错误密码不签发 token | | `TC-A-02` | 统计 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-02` | StatsController | 显示任务总量/完成率,与库内一致 | | `TC-A-03` | 方案管理 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-03` | 方案管理(全量) | 列出全部方案(含 source/进度/审核时间);可筛状态 | | `TC-A-04` | 方案激活 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-04` | 方案激活 | 生成任务成功,提示成功 | | `TC-A-05` | 报告解析 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-05` | AdminReportParserController | 类型列表返回≥1 条(含 gut_flora) | | `TC-A-06` | 报告解析 | 运营 | P1 | 接口 | `tests/test-cases/admin.md#TC-A-06` | 报告类型注册 | 保存成功列表可见;重复 typeId 被拒绝 | | `TC-A-07` | 报告解析 | 运营 | P2 | 功能 | `tests/test-cases/admin.md#TC-A-07` | 未知聚类自学习 | 聚类列表可见;可自学习生成类型 | | `TC-A-08` | 文章 | 运营 | P0 | 功能 | `tests/test-cases/admin.md#TC-A-08` | 文章发布-审核 | 创建 1s 内返回成功(无超时);审核通过 C 端可见;长文稳定 | | `TC-A-09` | 文章·去重 | 运营 | P1 | 异常 | `tests/test-cases/admin.md#TC-A-09` | 文章标题去重 | 第二次被拦截(标题已存在) | | `TC-A-10` | 关系类型 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-10` | 关系类型 CRUD | 操作成功;家长端关系选择器同步生效 | | `TC-A-11` | 勋章 | 运营 | P0 | 接口 | `tests/test-cases/admin.md#TC-A-11` | 勋章管理;黑盒回归 | 200 成功,badgeId 自动生成,列表可见 | | `TC-A-12` | 供应商 | 运营 | P0 | 接口 | `tests/test-cases/admin.md#TC-A-12` | 供应商管理;黑盒回归 | 200 成功,列表 name=昵称;同手机号重复被拒/可控覆盖 | | `TC-A-13` | 活动 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-13` | 活动审核撤回;黑盒回归 | 状态流转正确;已发布可撤回;全流程无 500 | | `TC-A-14` | 知识库 | 运营 | P1 | 接口 | `tests/test-cases/admin.md#TC-A-14` | 知识库管理;黑盒回归 | 200 成功,列表移除,无 500 | | `TC-A-15` | 数据迁移 | 运营 | P2 | 功能 | `tests/test-cases/admin.md#TC-A-15` | 多数据源/SfmsDataSourceConfig | 接口返回成功,关键业务表数据量更新;失败回滚+明确错误 | | `TC-A-16` | 参数校验 | 运营 | P0 | 异常 | `tests/test-cases/admin.md#TC-A-16` | 统一 `Result`+全局异常;黑盒回归 | 返回 400 + 具体字段提示(不再裸 500) | | `TC-A-17` | /api/admin/report-parser/* | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-17` | /api/admin/report-parser/* | 达成目标:标注未知聚类;边界:新类先注册再解析 | | `TC-A-18` | 优惠券/活动管理 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-18` | 优惠券/活动管理 | 达成目标:后台配券建活动;边界:时间冲突校验;名额超卖配置保护 | | `TC-A-19` | 内容安全 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-19` | 内容安全 | 达成目标:审 UGC/AI;边界:敏感词命中拦截 | | `TC-A-20` | GDPR 工单 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-20` | GDPR 工单 | 达成目标:处理用户注销/导出;边界:审计留痕;冷静期 | | `TC-A-21` | 网关/限流 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-21` | 网关/限流 | 达成目标:接口防护;边界:误杀白名单 | | `TC-A-22` | 模型管理 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-22` | 模型管理 | 达成目标:模型版本/开关;边界:下线前回退方案 | | `TC-A-23` | 知识库 | 运营 | P1 | 功能 | `tests/test-cases/admin.md#TC-A-23` | 知识库 | 达成目标:维护营养知识;边界:同步失败重试 | | `TC-A-01-E` | 认证 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-01-E` | AdminAuthController | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-A-02-E` | 统计 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-02-E` | StatsController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-A-03-E` | 方案管理 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-03-E` | 方案管理(全量) | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-A-04-E` | 方案激活 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-04-E` | 方案激活 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-A-05-E` | 报告解析 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-05-E` | AdminReportParserController | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-A-06-E` | 报告解析 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-06-E` | 报告类型注册 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-A-07-E` | 报告解析 | 运营 | P3 | 异常 | `tests/test-cases/admin.md#TC-A-07-E` | 未知聚类自学习 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-A-08-E` | 文章 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-08-E` | 文章发布-审核 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-A-09-E` | 文章·去重 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-09-E` | 文章标题去重 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-A-10-E` | 关系类型 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-10-E` | 关系类型 CRUD | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-A-11-E` | 勋章 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-11-E` | 勋章管理;黑盒回归 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-A-12-E` | 供应商 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-12-E` | 供应商管理;黑盒回归 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-A-13-E` | 活动 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-13-E` | 活动审核撤回;黑盒回归 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-A-14-E` | 知识库 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-14-E` | 知识库管理;黑盒回归 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-A-15-E` | 数据迁移 | 运营 | P3 | 异常 | `tests/test-cases/admin.md#TC-A-15-E` | 多数据源/SfmsDataSourceConfig | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-A-16-E` | 参数校验 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-16-E` | 统一 `Result`+全局异常;黑盒回归 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-A-17-E` | /api/admin/report-parser/* | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-17-E` | /api/admin/report-parser/* | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-A-18-E` | 优惠券/活动管理 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-18-E` | 优惠券/活动管理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | | `TC-A-19-E` | 内容安全 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-19-E` | 内容安全 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-A-20-E` | GDPR 工单 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-20-E` | GDPR 工单 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | | `TC-A-21-E` | 网关/限流 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-21-E` | 网关/限流 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-A-22-E` | 模型管理 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-22-E` | 模型管理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-A-23-E` | 知识库 | 运营 | P2 | 异常 | `tests/test-cases/admin.md#TC-A-23-E` | 知识库 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-A-01-P` | 认证 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-01-P` | AdminAuthController | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-02-P` | 统计 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-02-P` | StatsController | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-03-P` | 方案管理 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-03-P` | 方案管理(全量) | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-04-P` | 方案激活 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-04-P` | 方案激活 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-05-P` | 报告解析 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-05-P` | AdminReportParserController | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-06-P` | 报告解析 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-06-P` | 报告类型注册 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-07-P` | 报告解析 | 运营 | P2 | 权限 | `tests/test-cases/admin.md#TC-A-07-P` | 未知聚类自学习 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-08-P` | 文章 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-08-P` | 文章发布-审核 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-09-P` | 文章·去重 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-09-P` | 文章标题去重 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-10-P` | 关系类型 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-10-P` | 关系类型 CRUD | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-11-P` | 勋章 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-11-P` | 勋章管理;黑盒回归 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-12-P` | 供应商 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-12-P` | 供应商管理;黑盒回归 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-13-P` | 活动 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-13-P` | 活动审核撤回;黑盒回归 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-14-P` | 知识库 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-14-P` | 知识库管理;黑盒回归 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-15-P` | 数据迁移 | 运营 | P2 | 权限 | `tests/test-cases/admin.md#TC-A-15-P` | 多数据源/SfmsDataSourceConfig | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-16-P` | 参数校验 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-16-P` | 统一 `Result`+全局异常;黑盒回归 | 非 admin 角色访问管理端接口统一 401/403,不泄露后台数据 | | `TC-A-17-P` | /api/admin/report-parser/* | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-17-P` | /api/admin/report-parser/* | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-18-P` | 优惠券/活动管理 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-18-P` | 优惠券/活动管理 | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-19-P` | 内容安全 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-19-P` | 内容安全 | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-20-P` | GDPR 工单 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-20-P` | GDPR 工单 | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-21-P` | 网关/限流 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-21-P` | 网关/限流 | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-22-P` | 模型管理 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-22-P` | 模型管理 | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-23-P` | 知识库 | 运营 | P1 | 权限 | `tests/test-cases/admin.md#TC-A-23-P` | 知识库 | 非 admin 角色访问统一 401/403,不泄露后台数据 | | `TC-A-N01` | 配置CRUD | 运营 | P1 | 性能 | `tests/test-cases/admin.md#TC-A-N01` | 配置管理 | 列表 ≤ 2s;CRUD 即时生效 | | `TC-A-N02` | 报告解析中台 | 运营 | P0 | 性能 | `tests/test-cases/admin.md#TC-A-N02` | 解析中台 | 单条 ≤ 30s;失败进未知聚类;监控可见积压 | | `TC-A-N03` | 登录统计 | 运营 | P1 | 性能 | `tests/test-cases/admin.md#TC-A-N03` | 统计聚合 | 聚合 ≤ 3s;支持分页/缓存;大数据不超时 | | `TC-A-N04` | 限流熔断 | 运营 | P0 | 性能 | `tests/test-cases/admin.md#TC-A-N04` | 限流熔断 | 触发限流/熔断返回 429/友好降级;系统不雪崩;恢复后正常 | | `TC-A-N05` | 登录统计 | 运营 | P0 | 安全 | `tests/test-cases/admin.md#TC-A-N05` | 后台鉴权 | 返回 401/403;后台不可被非管理员进入 | | `TC-A-N06` | 文章审核 | 运营 | P1 | 安全 | `tests/test-cases/admin.md#TC-A-N06` | 内容安全 | 内容转义/过滤;不执行脚本 | | `TC-A-N07` | 内容安全 | 运营 | P0 | 安全 | `tests/test-cases/admin.md#TC-A-N07` | SSRF 防护 | 禁止内网地址(SSRF 防护);仅白名单外域;超时截断 | | `TC-A-N08` | 知识库 | 运营 | P1 | 安全 | `tests/test-cases/admin.md#TC-A-N08` | 上传校验 | 类型校验拒绝;不落盘执行 | | `TC-A-N09` | 注销导出 | 运营 | P0 | 安全 | `tests/test-cases/admin.md#TC-A-N09` | 数据导出合规 | 仅工单授权用户可导出;数据脱敏打包;操作留痕审计 | | `TC-C-01` | 权限/双角色 | 孩子 | P0 | 权限 | `tests/test-cases/child.md#TC-C-01` | 双角色铁律:孩子端不能切家长 | 进入孩子端首页;**无切换家长入口**;直接拼家长路由被 role 校验拦截 | | `TC-C-02` | 任务 | 孩子 | P0 | 功能 | `tests/test-cases/child.md#TC-C-02` | TaskController | 状态→待家长审核;完成动作写入记录;重复提交不重复计分 | | `TC-C-03` | 小游戏 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-03` | pages/games/* | 得分按规则计算;积分/能量到账;成绩入榜;中途退出不计分 | | `TC-C-04` | 心愿 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-04` | WishController | 心愿进入家长待审批列表;积分不足创建拦截 | | `TC-C-05` | 心愿 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-05` | RewardController | 兑换成功,积分扣减正确;驳回后不可兑换 | | `TC-C-06` | 能量 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-06` | EnergyController | 显示个人能量值;有增量且流水可追溯;能量不为负 | | `TC-C-07` | 报告/权限 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-07` | 报告查看权限隔离 | 可见报告内容;UI 无编辑/删除入口;直接调删除接口被 role 校验拒绝(403/401) | | `TC-C-08` | 打卡/方案 | 孩子 | P0 | 功能 | `tests/test-cases/child.md#TC-C-08` | 健康打卡/方案进度 | 打卡成功,方案 completedDays+1;重复打卡不重复计数(幂等) | | `TC-C-09` | 勋章 | 孩子 | P2 | 功能 | `tests/test-cases/child.md#TC-C-09` | RewardController | 显示已获得/未获得勋章及进度;未解锁不显示领取 | | `TC-C-10` | 勋章提醒 | 孩子 | P2 | 功能 | `tests/test-cases/child.md#TC-C-10` | MedalController | 达成→解锁+推送;重复达成不重复发推送 | | `TC-C-11` | 成长记录 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-11` | GrowthController | 仅展示本人数据;其他成员数据不可见 | | `TC-C-12` | 食谱查看 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-12` | 饮食推荐 | 展示早/午/晚;无食谱显示空态不 500 | | `TC-C-13` | AI 对话 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-13` | AIChatController | 返回适龄回答;敏感/不适龄内容被过滤 | | `TC-C-14` | 任务重做 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-14` | TaskController | 驳回后可重做;重做提交进入待审核 | | `TC-C-15` | 消息接收 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-15` | 消息服务 | 仅见发给自己的消息;越权消息不可见 | | `TC-C-16` | 个人资料 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-16` | AuthController | 敏感字段(如关系)家长代管不可改 | | `TC-C-17` | 退出 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-17` | AuthController | 退出清除本地缓存;回登录页 | | `TC-C-18` | 设备校验 | 孩子 | P2 | 功能 | `tests/test-cases/child.md#TC-C-18` | AuthController | 异常设备触发二次验证;通过后放行 | | `TC-C-19` | 消息服务 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-19` | 消息服务 | 达成目标:收通知;边界:越权消息不可见 | | `TC-C-20` | GrowthController | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-20` | GrowthController | 达成目标:看自己档案;边界:未成年人导出受限,需家长代办 | | `TC-C-21` | 舌诊情绪识别 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-21` | 舌诊情绪识别 | 达成目标:拍照上传;边界:模糊/非照片拒绝;隐私标注 | | `TC-C-22` | MallController | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-22` | MallController | 达成目标:用积分换;边界:积分不足拦截;重复兑换幂等 | | `TC-C-23` | 客服 | 孩子 | P1 | 功能 | `tests/test-cases/child.md#TC-C-23` | 客服 | 达成目标:提反馈;边界:内容适龄过滤;敏感信息脱敏 | | `TC-C-01-E` | 权限/双角色 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-01-E` | 双角色铁律:孩子端不能切家长 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-C-02-E` | 任务 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-02-E` | TaskController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-03-E` | 小游戏 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-03-E` | pages/games/* | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-C-04-E` | 心愿 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-04-E` | WishController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-05-E` | 心愿 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-05-E` | RewardController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-06-E` | 能量 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-06-E` | EnergyController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-07-E` | 报告/权限 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-07-E` | 报告查看权限隔离 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-C-08-E` | 打卡/方案 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-08-E` | 健康打卡/方案进度 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-C-09-E` | 勋章 | 孩子 | P3 | 异常 | `tests/test-cases/child.md#TC-C-09-E` | RewardController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-10-E` | 勋章提醒 | 孩子 | P3 | 异常 | `tests/test-cases/child.md#TC-C-10-E` | MedalController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-11-E` | 成长记录 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-11-E` | GrowthController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-12-E` | 食谱查看 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-12-E` | 饮食推荐 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-C-13-E` | AI 对话 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-13-E` | AIChatController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-C-14-E` | 任务重做 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-14-E` | TaskController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-C-15-E` | 消息接收 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-15-E` | 消息服务 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-C-16-E` | 个人资料 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-16-E` | AuthController | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-C-17-E` | 退出 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-17-E` | AuthController | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-C-18-E` | 设备校验 | 孩子 | P3 | 异常 | `tests/test-cases/child.md#TC-C-18-E` | AuthController | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-C-19-E` | 消息服务 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-19-E` | 消息服务 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-C-20-E` | GrowthController | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-20-E` | GrowthController | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | | `TC-C-21-E` | 舌诊情绪识别 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-21-E` | 舌诊情绪识别 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-C-22-E` | MallController | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-22-E` | MallController | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | | `TC-C-23-E` | 客服 | 孩子 | P2 | 异常 | `tests/test-cases/child.md#TC-C-23-E` | 客服 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-C-01-P` | 权限/双角色 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-01-P` | 双角色铁律:孩子端不能切家长 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-02-P` | 任务 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-02-P` | TaskController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-03-P` | 小游戏 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-03-P` | pages/games/* | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-04-P` | 心愿 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-04-P` | WishController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-05-P` | 心愿 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-05-P` | RewardController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-06-P` | 能量 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-06-P` | EnergyController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-07-P` | 报告/权限 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-07-P` | 报告查看权限隔离 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-08-P` | 打卡/方案 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-08-P` | 健康打卡/方案进度 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-09-P` | 勋章 | 孩子 | P2 | 权限 | `tests/test-cases/child.md#TC-C-09-P` | RewardController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-10-P` | 勋章提醒 | 孩子 | P2 | 权限 | `tests/test-cases/child.md#TC-C-10-P` | MedalController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-11-P` | 成长记录 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-11-P` | GrowthController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-12-P` | 食谱查看 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-12-P` | 饮食推荐 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-13-P` | AI 对话 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-13-P` | AIChatController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-14-P` | 任务重做 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-14-P` | TaskController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-15-P` | 消息接收 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-15-P` | 消息服务 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-16-P` | 个人资料 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-16-P` | AuthController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-17-P` | 退出 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-17-P` | AuthController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-18-P` | 设备校验 | 孩子 | P2 | 权限 | `tests/test-cases/child.md#TC-C-18-P` | AuthController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-19-P` | 消息服务 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-19-P` | 消息服务 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-20-P` | GrowthController | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-20-P` | GrowthController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-21-P` | 舌诊情绪识别 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-21-P` | 舌诊情绪识别 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-22-P` | MallController | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-22-P` | MallController | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-23-P` | 客服 | 孩子 | P1 | 权限 | `tests/test-cases/child.md#TC-C-23-P` | 客服 | 孩子端无编辑/删除/切家长入口;直接调用被 role 校验拒绝(403/401),不越权操作家庭数据 | | `TC-C-N01` | 任务打卡 | 孩子 | P1 | 性能 | `tests/test-cases/child.md#TC-C-N01` | TaskController | 重复提交幂等;并发不重复计分;响应 ≤ 1s | | `TC-C-N02` | 消息通知 | 孩子 | P2 | 性能 | `tests/test-cases/child.md#TC-C-N02` | 消息中心 | 列表渲染 ≤ 1.5s;标记已读即时 | | `TC-C-N03` | 孩子端 | 孩子 | P1 | 兼容 | `tests/test-cases/child.md#TC-C-N03` | 孩子端 | 功能一致;无错位;低龄设备流畅 | | `TC-C-N04` | 只读报告 | 孩子 | P2 | 兼容 | `tests/test-cases/child.md#TC-C-N04` | 报告前端 | 图表自适应;无溢出;可读 | | `TC-C-N05` | 心愿 | 孩子 | P1 | 安全 | `tests/test-cases/child.md#TC-C-N05` | 心愿鉴权 | 服务端校验归属;403/拒绝;孩子不可越权操作他人 | | `TC-C-N06` | 消息通知 | 孩子 | P2 | 安全 | `tests/test-cases/child.md#TC-C-N06` | 消息渲染 | 内容转义渲染;不执行脚本 | | `TC-C-N07` | 孩子端 | 孩子 | P0 | 安全 | `tests/test-cases/child.md#TC-C-N07` | 双角色铁律 | 一律 401/403;**孩子端不可切回家长**铁律生效 | | `TC-X-01` | 规划师 | P0 | 功能 | 已绑定家庭+孩子 B;募极生物 PDF | `tests/test-cases/cross-role-e2e.md#TC-X-01` | - | T-3 / P-10 | | `TC-X-02` | 规划师 | P0 | 功能 | X-01 草稿 | `tests/test-cases/cross-role-e2e.md#TC-X-02` | - | T-4 | | `TC-X-03` | 家长 | P0 | 功能 | 孩子 B 有报告;已购会员 | `tests/test-cases/cross-role-e2e.md#TC-X-03` | - | P-13 | | `TC-X-04` | 规划师 | P0 | 功能 | X-03 方案 generated | `tests/test-cases/cross-role-e2e.md#TC-X-04` | - | T-6 / T-7 | | `TC-X-05` | 孩子 | P0 | 功能 | X-04 已生成方案任务 | `tests/test-cases/cross-role-e2e.md#TC-X-05` | - | C-7 / C-2 | | `TC-X-06` | 规划师 | P0 | 功能 | X-05 已提交 | `tests/test-cases/cross-role-e2e.md#TC-X-06` | - | T-9 / P-06 | | `TC-X-07` | 运营 | P1 | 功能 | 以上步骤已执行 | `tests/test-cases/cross-role-e2e.md#TC-X-07` | - | A-02 | | `TC-X-08` | 多角色 | P0 | 异常 | X-04 已 active 方案 | `tests/test-cases/cross-role-e2e.md#TC-X-08` | - | T-8 / P-09a / C-8 | | `TC-X-09` | 多角色 | P0 | 功能 | 家长已生成方案(generated) | `tests/test-cases/cross-role-e2e.md#TC-X-09` | - | P-44 / T-06 / T-07 | | `TC-X-10` | 多角色 | P2 | 功能 | 同一孩子多次上传同类型报告 | `tests/test-cases/cross-role-e2e.md#TC-X-10` | - | P-25 / T-21 | | `TC-X-11` | 多角色 | P1 | 功能 | 跨角色消息配置就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-11` | - | P-65 / T-19 / C-15 | | `TC-X-12` | 多角色 | P1 | 功能 | 家长未购会员 | `tests/test-cases/cross-role-e2e.md#TC-X-12` | - | P-58 / P-16 | | `TC-X-13` | 跨角色 | P1 | 功能 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-13` | - | X-13 | | `TC-X-14` | 跨角色 | P1 | 功能 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-14` | - | X-14 | | `TC-X-15` | 跨角色 | P1 | 功能 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-15` | - | X-15 | | `TC-X-16` | 跨角色 | P0 | 功能 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-16` | - | X-16 | | `TC-X-17` | 跨角色 | P1 | 功能 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-17` | - | X-17 | | `TC-X-18` | 跨角色 | P1 | 功能 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-18` | - | X-18 | | `TC-X-01-E` | 规划师 | P2 | 异常 | 已绑定家庭+孩子 B;募极生物 PDF | `tests/test-cases/cross-role-e2e.md#TC-X-01-E` | - | T-3 / P-10 | | `TC-X-02-E` | 规划师 | P2 | 异常 | X-01 草稿 | `tests/test-cases/cross-role-e2e.md#TC-X-02-E` | - | T-4 | | `TC-X-03-E` | 家长 | P2 | 异常 | 孩子 B 有报告;已购会员 | `tests/test-cases/cross-role-e2e.md#TC-X-03-E` | - | P-13 | | `TC-X-04-E` | 规划师 | P2 | 异常 | X-03 方案 generated | `tests/test-cases/cross-role-e2e.md#TC-X-04-E` | - | T-6 / T-7 | | `TC-X-05-E` | 孩子 | P2 | 异常 | X-04 已生成方案任务 | `tests/test-cases/cross-role-e2e.md#TC-X-05-E` | - | C-7 / C-2 | | `TC-X-06-E` | 规划师 | P2 | 异常 | X-05 已提交 | `tests/test-cases/cross-role-e2e.md#TC-X-06-E` | - | T-9 / P-06 | | `TC-X-07-E` | 运营 | P2 | 异常 | 以上步骤已执行 | `tests/test-cases/cross-role-e2e.md#TC-X-07-E` | - | A-02 | | `TC-X-08-E` | 多角色 | P2 | 异常 | X-04 已 active 方案 | `tests/test-cases/cross-role-e2e.md#TC-X-08-E` | - | T-8 / P-09a / C-8 | | `TC-X-09-E` | 多角色 | P2 | 异常 | 家长已生成方案(generated) | `tests/test-cases/cross-role-e2e.md#TC-X-09-E` | - | P-44 / T-06 / T-07 | | `TC-X-10-E` | 多角色 | P3 | 异常 | 同一孩子多次上传同类型报告 | `tests/test-cases/cross-role-e2e.md#TC-X-10-E` | - | P-25 / T-21 | | `TC-X-11-E` | 多角色 | P2 | 异常 | 跨角色消息配置就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-11-E` | - | P-65 / T-19 / C-15 | | `TC-X-12-E` | 多角色 | P2 | 异常 | 家长未购会员 | `tests/test-cases/cross-role-e2e.md#TC-X-12-E` | - | P-58 / P-16 | | `TC-X-13-E` | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-13-E` | - | X-13 | | `TC-X-14-E` | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-14-E` | - | X-14 | | `TC-X-15-E` | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-15-E` | - | X-15 | | `TC-X-16-E` | 跨角色 | P1 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-16-E` | - | X-16 | | `TC-X-17-E` | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-17-E` | - | X-17 | | `TC-X-18-E` | 跨角色 | P2 | 异常 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-18-E` | - | X-18 | | `TC-X-01-P` | 规划师 | P1 | 权限 | 已绑定家庭+孩子 B;募极生物 PDF | `tests/test-cases/cross-role-e2e.md#TC-X-01-P` | - | T-3 / P-10 | | `TC-X-02-P` | 规划师 | P1 | 权限 | X-01 草稿 | `tests/test-cases/cross-role-e2e.md#TC-X-02-P` | - | T-4 | | `TC-X-03-P` | 家长 | P1 | 权限 | 孩子 B 有报告;已购会员 | `tests/test-cases/cross-role-e2e.md#TC-X-03-P` | - | P-13 | | `TC-X-04-P` | 规划师 | P1 | 权限 | X-03 方案 generated | `tests/test-cases/cross-role-e2e.md#TC-X-04-P` | - | T-6 / T-7 | | `TC-X-05-P` | 孩子 | P1 | 权限 | X-04 已生成方案任务 | `tests/test-cases/cross-role-e2e.md#TC-X-05-P` | - | C-7 / C-2 | | `TC-X-06-P` | 规划师 | P1 | 权限 | X-05 已提交 | `tests/test-cases/cross-role-e2e.md#TC-X-06-P` | - | T-9 / P-06 | | `TC-X-07-P` | 运营 | P1 | 权限 | 以上步骤已执行 | `tests/test-cases/cross-role-e2e.md#TC-X-07-P` | - | A-02 | | `TC-X-08-P` | 多角色 | P1 | 权限 | X-04 已 active 方案 | `tests/test-cases/cross-role-e2e.md#TC-X-08-P` | - | T-8 / P-09a / C-8 | | `TC-X-09-P` | 多角色 | P1 | 权限 | 家长已生成方案(generated) | `tests/test-cases/cross-role-e2e.md#TC-X-09-P` | - | P-44 / T-06 / T-07 | | `TC-X-10-P` | 多角色 | P2 | 权限 | 同一孩子多次上传同类型报告 | `tests/test-cases/cross-role-e2e.md#TC-X-10-P` | - | P-25 / T-21 | | `TC-X-11-P` | 多角色 | P1 | 权限 | 跨角色消息配置就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-11-P` | - | P-65 / T-19 / C-15 | | `TC-X-12-P` | 多角色 | P1 | 权限 | 家长未购会员 | `tests/test-cases/cross-role-e2e.md#TC-X-12-P` | - | P-58 / P-16 | | `TC-X-13-P` | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-13-P` | - | X-13 | | `TC-X-14-P` | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-14-P` | - | X-14 | | `TC-X-15-P` | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-15-P` | - | X-15 | | `TC-X-16-P` | 跨角色 | P0 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-16-P` | - | X-16 | | `TC-X-17-P` | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-17-P` | - | X-17 | | `TC-X-18-P` | 跨角色 | P1 | 权限 | 已登录(默认 跨角色);相关前置数据就绪 | `tests/test-cases/cross-role-e2e.md#TC-X-18-P` | - | X-18 | | `TC-X-N01` | 跨角色 | P0 | 性能 | 多家庭并发(≥10 家庭) | `tests/test-cases/cross-role-e2e.md#TC-X-N01` | - | X-01 | | `TC-X-N02` | 跨角色 | P0 | 性能 | 多家庭同时生成方案 | `tests/test-cases/cross-role-e2e.md#TC-X-N02` | - | X-03 | | `TC-X-N03` | 跨角色 | P0 | 性能 | 活动名额 100,瞬时 500 请求 | `tests/test-cases/cross-role-e2e.md#TC-X-N03` | - | X-15 | | `TC-X-N04` | 跨角色 | P1 | 性能 | 全平台打卡高峰 | `tests/test-cases/cross-role-e2e.md#TC-X-N04` | - | X-05 | | `TC-X-N05` | 跨角色 | P0 | 安全 | 跨角色越权 | `tests/test-cases/cross-role-e2e.md#TC-X-N05` | - | X-01~X-06 | | `TC-X-N06` | 跨角色 | P0 | 安全 | 导出授权 | `tests/test-cases/cross-role-e2e.md#TC-X-N06` | - | X-17 | | `TC-X-N07` | 跨角色 | P1 | 兼容 | iOS/Android/小程序/Web 同时在线 | `tests/test-cases/cross-role-e2e.md#TC-X-N07` | - | X-18 | | `TC-X-N08` | 跨角色 | P0 | 安全 | 文件上传链路 | `tests/test-cases/cross-role-e2e.md#TC-X-N08` | - | X-01 | | `TC-DV-01` | 预约/权限 | 家长A vs 家长B | P0 | 权限 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-01` | F1 | **当前**:返回 success 且 status=3(越权成功)→【缺陷 F1】;期望:403/拒绝 | | `TC-DV-02` | 预约/状态机 | 规划师 | P1 | 异常 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-02` | F2 | **当前**:status 置 1(非法回退)→【缺陷 F2】;期望:失败 | | `TC-DV-03` | 预约/额度 | 家长 | P0 | 功能 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-03` | 修正口径 | 返回「额度不足或已过期」;不建预约、不扣能量 | | `TC-DV-04` | 预约/幂等 | 家长 | P1 | 异常 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-04` | F4 | **当前**:2 条预约 + 20 能量 →【缺陷 F4】;期望:第 2 次拒绝/返回既有 | | `TC-DV-05` | 预约/权限 | 非指派用户 | P0 | 权限 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-05` | 既有 | 返回「您不是被指派的测评师」;status 不变 | | `TC-DV-06` | 预约/校验 | 家长 | P1 | 接口 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-06` | 既有 | 返回「assessorId或guideId必须提供一个」 | | `TC-DV-07` | 列表/权限 | 非 teacher | P2 | 权限 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-07` | F5 | 返回「只有成长规划师可以查看此列表」;assessor-list 仅见自身 | | `TC-DV-08` | 预约/校验 | 家长 | P2 | 异常 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-08` | F6 | **当前**:无校验入库(F6);期望:400 | | `TC-DV-09` | 预约/状态机 | 规划师 | P1 | 功能 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-09` | 状态机 | 0→1→2 正确;能量 10+30 发放且流水一致 | | `TC-DV-10` | 订单↔额度↔预约 | 家长 | P0 | 功能 | `tests/test-cases/deep-dive-assessment-appointment.md#TC-DV-10` | 修正口径 | 额度扣减正确;额度为 0 时 create 失败 | | `TC-PA-01` | 激活/拆任务 | 规划师 | P0 | 功能 | `tests/test-cases/deep-dive-plan-activation.md#TC-PA-01` | G1 | status→active;生成 1 引导 + N 模板任务;能量/流水一致 | | `TC-PA-02` | 激活/幂等 | 规划师 | P0 | 异常 | `tests/test-cases/deep-dive-plan-activation.md#TC-PA-02` | G1 | 抛「方案状态异常,需要先审核通过」 | | `TC-PA-03` | 激活/并发幂等 | 规划师×2 | P1 | 并发 | `tests/test-cases/deep-dive-plan-activation.md#TC-PA-03` | G2 | 任务总数 = 1+ N(不翻倍);若翻倍→【缺陷 G2】 | | `TC-PA-04` | 激活/取消 | 规划师 | P1 | 功能 | `tests/test-cases/deep-dive-plan-activation.md#TC-PA-04` | G3 | 旧任务 cancelled 不计入,重新生成 1+N 任务 | | `TC-PA-05` | 拆任务/边界 | 规划师 | P2 | 边界 | `tests/test-cases/deep-dive-plan-activation.md#TC-PA-05` | G3 | 仅生成引导任务,无模板任务(文档化) | | `TC-PA-06` | 拆任务/数据 | 规划师 | P2 | 数据 | `tests/test-cases/deep-dive-plan-activation.md#TC-PA-06` | G4 | 非当天过期(待确认设计) | | `TC-G-01` | 启动/首页 | 游客 | P1 | 功能 | `tests/test-cases/guest.md#TC-G-01` | JwtInterceptor 拦截 `/api/** | 显示引流首页,不进入任何业务页;明显展示微信/手机号/邀请登录入口 | | `TC-G-02` | 认证 | 游客 | P0 | 接口 | `tests/test-cases/guest.md#TC-G-02` | AuthController`/`API_REFERENCE` 1.1 | 返回 Result 含 token+用户信息;角色默认 parent;跳转家长首页;首次登录建 User+family_members(memberType=login) | | `TC-G-03` | 认证 | 游客 | P0 | 接口 | `tests/test-cases/guest.md#TC-G-03` | 统一 POST/JWT | 验证码正确→登录下发 token;错误→提示失败且**不产生会话**;限流生效 | | `TC-G-04` | 家庭/邀请 | 游客 | P1 | 功能 | `tests/test-cases/guest.md#TC-G-04` | FamilyInviteController | 登录后自动归属对应家庭,成员列表出现该用户;令牌失效→「邀请已失效」 | | `TC-G-05` | 权限 | 游客 | P0 | 权限 | `tests/test-cases/guest.md#TC-G-05` | JWT;8 公开路径白名单(1.1) | 业务页→401 跳登录,登录后回跳;商城/文章列表可见(公开);需登录详情被拦截 | | `TC-G-06` | 权限 | 游客 | P0 | 权限 | `tests/test-cases/guest.md#TC-G-06` | JwtInterceptor | JwtInterceptor 拦截(8 个公开路径除外);缺 token→401/403,不泄露内部错误堆栈 | | `TC-G-07` | 测试模式 | 游客 | P2 | 功能 | `tests/test-cases/guest.md#TC-G-07` | AGENTS.md 测试模式 | 仅测试环境生效;生产强制真授权;模拟登录不建真实微信绑定 | | `TC-G-08` | 环境切换 | 游客 | P2 | 功能 | `tests/test-cases/guest.md#TC-G-08` | config.js | 环境识别失败回退默认地址;接口地址正确 | | `TC-G-09` | 认证 | 游客 | P1 | 功能 | `tests/test-cases/guest.md#TC-G-09` | AuthController | 退出后本地缓存敏感数据清除;再次进入需登录 | | `TC-G-10` | 注册 | 游客 | P1 | 功能 | `tests/test-cases/guest.md#TC-G-10` | AuthController | 引导至注册;已注册账号不重复建档 | | `TC-G-11` | 协议页/AgreementController | 游客 | P2 | 功能 | `tests/test-cases/guest.md#TC-G-11` | 协议页/AgreementController | 达成目标:合规告知;边界:未同意不可进入注册/核心流程 | | `TC-G-12` | config.js | 游客 | P2 | 功能 | `tests/test-cases/guest.md#TC-G-12` | config.js | 达成目标:非微信浏览器打开小程序链接;边界:探测失败给出明确引导 | | `TC-G-01-E` | 启动/首页 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-01-E` | JwtInterceptor 拦截 `/api/** | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-G-02-E` | 认证 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-02-E` | AuthController`/`API_REFERENCE` 1.1 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-03-E` | 认证 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-03-E` | 统一 POST/JWT | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-04-E` | 家庭/邀请 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-04-E` | FamilyInviteController | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-G-05-E` | 权限 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-05-E` | JWT;8 公开路径白名单(1.1) | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-06-E` | 权限 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-06-E` | JwtInterceptor | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-07-E` | 测试模式 | 游客 | P3 | 异常 | `tests/test-cases/guest.md#TC-G-07-E` | AGENTS.md 测试模式 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-G-08-E` | 环境切换 | 游客 | P3 | 异常 | `tests/test-cases/guest.md#TC-G-08-E` | config.js | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-09-E` | 认证 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-09-E` | AuthController | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-10-E` | 注册 | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-10-E` | AuthController | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-G-11-E` | 协议页/AgreementController | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-11-E` | 协议页/AgreementController | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-G-12-E` | config.js | 游客 | P2 | 异常 | `tests/test-cases/guest.md#TC-G-12-E` | config.js | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-G-01-P` | 启动/首页 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-01-P` | JwtInterceptor 拦截 `/api/** | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-02-P` | 认证 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-02-P` | AuthController`/`API_REFERENCE` 1.1 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-03-P` | 认证 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-03-P` | 统一 POST/JWT | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-04-P` | 家庭/邀请 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-04-P` | FamilyInviteController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-05-P` | 权限 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-05-P` | JWT;8 公开路径白名单(1.1) | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-06-P` | 权限 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-06-P` | JwtInterceptor | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-07-P` | 测试模式 | 游客 | P2 | 权限 | `tests/test-cases/guest.md#TC-G-07-P` | AGENTS.md 测试模式 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-08-P` | 环境切换 | 游客 | P2 | 权限 | `tests/test-cases/guest.md#TC-G-08-P` | config.js | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-09-P` | 认证 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-09-P` | AuthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-10-P` | 注册 | 游客 | P1 | 权限 | `tests/test-cases/guest.md#TC-G-10-P` | AuthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-G-11-P` | 协议页/AgreementController | 游客 | P2 | 权限 | `tests/test-cases/guest.md#TC-G-11-P` | 协议页/AgreementController | 统一 401/403,不泄露内部错误与数据;8 个公开路径除外 | | `TC-G-12-P` | config.js | 游客 | P2 | 权限 | `tests/test-cases/guest.md#TC-G-12-P` | config.js | 统一 401/403,不泄露内部错误与数据;8 个公开路径除外 | | `TC-G-N01` | 落地页 | 游客 | P2 | 性能 | `tests/test-cases/guest.md#TC-G-N01` | 落地页/邀请 | 首屏 ≤ 3s;骨架屏生效;CDN 资源命中;无白屏 | | `TC-G-N02` | 浏览转化 | 游客 | P2 | 兼容 | `tests/test-cases/guest.md#TC-G-N02` | 登录注册 | 布局一致;微信授权正常;兜底登录可用;无错位 | | `TC-G-N03` | 非微信H5 | 游客 | P2 | 兼容 | `tests/test-cases/guest.md#TC-G-N03` | H5 兜底 | 功能可用;无微信 SDK 依赖报错;流程闭环 | | `TC-G-N04` | 落地页 | 游客 | P0 | 安全 | `tests/test-cases/guest.md#TC-G-N04` | 接口鉴权 | 返回 401;不泄露数据与结构 | | `TC-G-N05` | 登录注册 | 游客 | P0 | 安全 | `tests/test-cases/guest.md#TC-G-N05` | 登录限流 | 触发限流/锁定;验证码一次性;防爆破;无撞库成功 | | `TC-P-01` | 家庭 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-01` | FamilyInviteController | 家庭创建成功;生成唯一邀请码+二维码(令牌+落地页);角色变家庭管理员 | | `TC-P-02` | 家庭/成员 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-02` | FamilyInviteController | C 加入家庭,成员列表出现 C | | `TC-P-03` | 成员资料 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-03` | FamilyMembersController | 成员卡片正确显示;关系标签可选(RelationshipPicker) | | `TC-P-04` | 关系图 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-04` | 关系类型 CRUD/前端选择器 | 关系图节点与关系标签同步更新 | | `TC-P-05` | 任务 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-05` | TaskController | 任务出现在 B 列表,状态待执行 | | `TC-P-06` | 任务审核 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-06` | TaskController`/`PointsController | 通过→B 积分+N 并生成流水;驳回→退回重做;重复提交不重复发分 | | `TC-P-07` | 心愿 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-07` | WishController`/`RewardController | 通过→扣积分进入兑换;驳回→心愿失效;积分不足兑换拦截 | | `TC-P-08` | 能量 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-08` | EnergyController | 显示家庭健康指数与五维能量分配(总和=100%);流水可追溯;无数据时空态非 500 | | `TC-P-09` | 测评订单 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-09` | AssessmentAppointmentController | 生成测评订单;状态 已支付→待安排→已预约;未支付/未选规划师不进入待安排 | | `TC-P-10` | 健康报告 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-10` | 健康报告上传解析 | 识别为 gut_flora;三阶段上传→解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | | `TC-P-11` | 报告查看 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-11` | 报告解析 | 显示菌群健康分/平衡/多样性、菌种明细、疾病风险;七维评分刷新 | | `TC-P-12` | 饮食推荐 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-12` | 饮食推荐系统 | 按报告生成食材推荐指数,展示可吃/慎吃列表;无报告时无推荐 | | `TC-P-13` | AI 方案 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-13` | AI 统一走 LangGraph;`AiGateway | 生成 overview+营养/饮食/运动三板块;可逐板块重生成/确认;未购买会员→提示购买 | | `TC-P-14` | 方案提交 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-14` | 方案状态机 | 进入「已提交(待规划师审核)」或按配置直接发布 | | `TC-P-15` | 双角色 | 家长 | P0 | 权限 | `tests/test-cases/parent.md#TC-P-15` | POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | 切换为孩子端界面(数据隔离);切回需密码;**孩子端不能切回家长** | | `TC-P-16` | 会员 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-16` | MembershipController`/`ProductOrderController | 支付成功解锁方案生成等付费功能;未购买点击生成提示购买 | | `TC-P-17` | 积分/成长 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-17` | PointsController`/`GrowthController | 积分流水与孩子成长记录一致;时间格式 yyyy-MM-dd HH:mm:ss;积分与流水总额一致 | | `TC-P-18` | AI 对话 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-18` | AIChatController`;LangGraph RAG | 返回基于知识库回答,可含产品/任务推荐;LangGraph 不可用时 AiGateway Fallback 兜底;多轮连续 | | `TC-P-19` | 能量配置 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-19` | 维度配置 | 显示身/心/智/行/富口径与权重;配置未同步展示兜底说明 | | `TC-P-20` | 健康报告 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-20` | 报告解析中台/`POST /api/media/upload | 识别 gut_flora;解析预览→确认入库;非募极报告提示「请确认是募极生物肠道菌群报告」 | | `TC-P-21` | 报告解析 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-21` | /api/admin/report-parser/types | 匹配已注册类型;未知类型进未知聚类待运营自学习 | | `TC-P-22` | 报告预览 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-22` | 解析中台 | 预览数据完整;异常数据提示不入库 | | `TC-P-23` | 报告入库 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-23` | 解析中台 | 确认前可取消不入库;确认后七维刷新 | | `TC-P-24` | 报告管理 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-24` | 报告管理 | 删除有关联方案时提示;对比展示差异 | | `TC-P-25` | 报告趋势 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-25` | 成长/报告 | 单报告无趋势提示;时间轴正确 | | `TC-P-26` | 饮食推荐 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-26` | 饮食推荐系统 | 按菌群生成;无报告无推荐 | | `TC-P-27` | 家庭食谱 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-27` | 饮食推荐/家庭食谱 | 无报告降级通用食谱;忌口/过敏自动排除 | | `TC-P-28` | 食谱筛选 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-28` | 饮食推荐 | 忌口冲突时提示;重算生效 | | `TC-P-29` | 食谱收藏 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-29` | 饮食推荐 | 调整不破坏营养目标;收藏持久化 | | `TC-P-30` | 食谱营养 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-30` | 饮食推荐 | 超标/不足提示 | | `TC-P-31` | 测评类型 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-31` | DanAssessmentController | 类目来自后端字典;展示完整 8 类 | | `TC-P-32` | 测评规划师 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-32` | 测评订单 | 未绑定规划师提示先绑定 | | `TC-P-33` | 测评下单 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-33` | AssessmentOrder | 套餐下架不可下单;生成待支付订单 | | `TC-P-34` | 测评支付 | 家长 | P1 | 接口 | `tests/test-cases/parent.md#TC-P-34` | 支付/`AssessmentQuota | 支付失败回滚不生成额度 | | `TC-P-35` | 测评额度 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-35` | AssessmentQuota | 额度过期不可用于预约;展示有效期 | | `TC-P-36` | 测评预约 | 家长 | P0 | 接口 | `tests/test-cases/parent.md#TC-P-36` | AssessmentAppointmentController | 先扣一条额度→落预约;额度不足/过期直接报错不落预约 | | `TC-P-37` | 预约状态 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-37` | AssessmentAppointmentController | 状态准确;状态机守卫 | | `TC-P-38` | 预约取消 | 家长 | P0 | 权限 | `tests/test-cases/parent.md#TC-P-38` | AssessmentAppointmentController | 非归属取消被拒(CFC-AP 取消越权);取消不退款逻辑 | | `TC-P-39` | DAN报告 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-39` | DanAssessmentResultDTO | 结果未录入不展示;量纲标注 | | `TC-P-40` | AI方案 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-40` | AIChatController`/`AiGateway | 未购会员提示购买;AI 超时 AiGateway Fallback 不 500 | | `TC-P-41` | 方案迭代 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-41` | AIChatController | 重生成不丢其他板块 | | `TC-P-42` | 方案编辑 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-42` | 方案管理 | 编辑后状态标记已改 | | `TC-P-43` | 方案查看 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-43` | 方案管理 | 空方案不白屏 | | `TC-P-44` | 方案确认 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-44` | 方案状态机 | 未确认不可激活;确认幂等 | | `TC-P-45` | 方案发布 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-45` | 方案管理 | 需审核配置时走审核流 | | `TC-P-46` | 方案激活 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-46` | 方案激活任务分解 | 已激活再激活不重复(幂等靠状态机);失败回滚不残半任务 | | `TC-P-47` | 方案任务 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-47` | GrowthPlanController | 任务增删与方案同步 | | `TC-P-48` | 方案版本 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-48` | 方案管理 | 版本不可篡改 | | `TC-P-49` | AI对话 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-49` | AIChatController | 基于知识库回答;LangGraph 不可用 Fallback;多轮连续 | | `TC-P-50` | 成长记录 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-50` | GrowthController | 数据缺失项跳过不报错 | | `TC-P-51` | 成长里程碑 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-51` | GrowthController | 重复标幂等 | | `TC-P-52` | 商城浏览 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-52` | MallController`/`danshop | 下架商品不展示 | | `TC-P-53` | 商品详情 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-53` | MallController | 库存为 0 提示 | | `TC-P-54` | 商城下单 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-54` | MallController | 库存不足拦截;重复下单幂等 | | `TC-P-55` | 订单支付 | 家长 | P1 | 接口 | `tests/test-cases/parent.md#TC-P-55` | 支付 | 支付失败回滚 | | `TC-P-56` | 订单退款 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-56` | 订单服务 | 已发货退款规则;重复退款拦截 | | `TC-P-57` | 优惠券 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-57` | 优惠券 | 券过期/不满足门槛不可用 | | `TC-P-58` | 会员购买 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-58` | MemberController | 支付失败回滚;重复购买幂等 | | `TC-P-59` | 会员权益 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-59` | MemberController | 权益随档位变化 | | `TC-P-60` | 会员续费 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-60` | MemberController | 续费叠加计算正确 | | `TC-P-61` | 联系人 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-61` | ContactCard`/`contact-detail | 重复号码去重 | | `TC-P-62` | 联系人导入 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-62` | ContactImport | 导入格式错误行跳过并报告 | | `TC-P-63` | 联系人权限 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-63` | ContactCard | 越权查看被拒 | | `TC-P-64` | 个人资料 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-64` | AuthController | 手机格式校验;保存生效 | | `TC-P-65` | 通知设置 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-65` | 消息服务 | 关闭后仍保关键安全通知 | | `TC-P-66` | 隐私设置 | 家长 | P2 | 功能 | `tests/test-cases/parent.md#TC-P-66` | 隐私设置 | 最小权限保底 | | `TC-P-67` | 报告代传/report-proxy | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-67` | 报告代传/report-proxy | 达成目标:无报告原件时由他人代传;边界:代传需授权令牌;越权代传他人孩子被拒;代传报告归属校验 | | `TC-P-68` | 家庭天盘 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-68` | 家庭天盘 | 达成目标:一眼看全家健康/能量;边界:数据缺失降级展示;仅本家庭成员可见 | | `TC-P-69` | 精准营养 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-69` | 精准营养 | 达成目标:设定每日营养/热量目标;边界:目标非法(负/超上限)拦截 | | `TC-P-70` | 舌诊情绪识别 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-70` | 舌诊情绪识别 | 达成目标:上传舌苔照辅助评估;边界:非照片/模糊拒绝;隐私标注不外露 | | `TC-P-71` | AuthController | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-71` | AuthController | 达成目标:注销账号;边界:有进行中订单/未结清拦截;注销后不可登录 | | `TC-P-72` | 数据导出(GDPR) | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-72` | 数据导出(GDPR) | 达成目标:下载本人数据;边界:敏感字段脱敏;频次限制;越权导出被拒 | | `TC-P-73` | 家庭/成员 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-73` | 家庭/成员 | 达成目标:多孩子家庭切换;边界:仅本家庭孩子可选;当前孩子态隔离 | | `TC-P-74` | 规划师绑定 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-74` | 规划师绑定 | 达成目标:更换服务规划师;边界:解绑前处理在途方案/预约;非本家庭规划师拒 | | `TC-P-75` | 优惠券 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-75` | 优惠券 | 达成目标:得券;边界:库存为0/已领拦截;重复领幂等 | | `TC-P-76` | 活动管理 | 家长 | P0 | 功能 | `tests/test-cases/parent.md#TC-P-76` | 活动管理 | 达成目标:报名平台活动;边界:**并发超卖拦截(CFC 真实 bug 已修)**;名额满拒;重复报名幂等 | | `TC-P-77` | 活动 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-77` | 活动 | 达成目标:参与打卡/裂变;边界:重复打卡幂等;刷量/机器行为拦截 | | `TC-P-78` | 消息服务 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-78` | 消息服务 | 达成目标:看系统/任务/方案提醒;边界:越权消息不可见;分页 | | `TC-P-79` | 消息服务 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-79` | 消息服务 | 达成目标:控制接收;边界:关键安全通知不可关闭 | | `TC-P-80` | 会员/订单 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-80` | 会员/订单 | 达成目标:退会员/开发票;边界:已消费不退;重复退拦截;发票信息校验 | | `TC-P-81` | 方案/任务 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-81` | 方案/任务 | 达成目标:暂存未完;边界:草稿有效期;恢复冲突提示 | | `TC-P-82` | 搜索 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-82` | 搜索 | 达成目标:快速定位;边界:越权结果过滤;空结果不报错 | | `TC-P-83` | 客服 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-83` | 客服 | 达成目标:提反馈;边界:敏感信息脱敏;附件大小限制 | | `TC-P-84` | 分享 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-84` | 分享 | 达成目标:共享;边界:链接失效/权限校验;越权分享被拒 | | `TC-P-85` | AuthController | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-85` | AuthController | 达成目标:同账号多设备;边界:异常设备风控;退出清 token | | `TC-P-86` | 勋章/排行 | 家长 | P1 | 功能 | `tests/test-cases/parent.md#TC-P-86` | 勋章/排行 | 达成目标:激励;边界:数据仅本家庭可见;排名实时性 | | `TC-P-01-E` | 家庭 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-01-E` | FamilyInviteController | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-P-02-E` | 家庭/成员 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-02-E` | FamilyInviteController | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-P-03-E` | 成员资料 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-03-E` | FamilyMembersController | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-04-E` | 关系图 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-04-E` | 关系类型 CRUD/前端选择器 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-P-05-E` | 任务 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-05-E` | TaskController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-06-E` | 任务审核 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-06-E` | TaskController`/`PointsController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-07-E` | 心愿 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-07-E` | WishController`/`RewardController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-08-E` | 能量 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-08-E` | EnergyController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-09-E` | 测评订单 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-09-E` | AssessmentAppointmentController | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-10-E` | 健康报告 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-10-E` | 健康报告上传解析 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-11-E` | 报告查看 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-11-E` | 报告解析 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-12-E` | 饮食推荐 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-12-E` | 饮食推荐系统 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-13-E` | AI 方案 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-13-E` | AI 统一走 LangGraph;`AiGateway | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-14-E` | 方案提交 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-14-E` | 方案状态机 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-15-E` | 双角色 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-15-E` | POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-P-16-E` | 会员 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-16-E` | MembershipController`/`ProductOrderController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-17-E` | 积分/成长 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-17-E` | PointsController`/`GrowthController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-18-E` | AI 对话 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-18-E` | AIChatController`;LangGraph RAG | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-19-E` | 能量配置 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-19-E` | 维度配置 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-20-E` | 健康报告 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-20-E` | 报告解析中台/`POST /api/media/upload | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-21-E` | 报告解析 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-21-E` | /api/admin/report-parser/types | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-22-E` | 报告预览 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-22-E` | 解析中台 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-23-E` | 报告入库 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-23-E` | 解析中台 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-24-E` | 报告管理 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-24-E` | 报告管理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-25-E` | 报告趋势 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-25-E` | 成长/报告 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-26-E` | 饮食推荐 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-26-E` | 饮食推荐系统 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-27-E` | 家庭食谱 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-27-E` | 饮食推荐/家庭食谱 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-28-E` | 食谱筛选 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-28-E` | 饮食推荐 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-29-E` | 食谱收藏 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-29-E` | 饮食推荐 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-30-E` | 食谱营养 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-30-E` | 饮食推荐 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-31-E` | 测评类型 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-31-E` | DanAssessmentController | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | | `TC-P-32-E` | 测评规划师 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-32-E` | 测评订单 | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | | `TC-P-33-E` | 测评下单 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-33-E` | AssessmentOrder | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-34-E` | 测评支付 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-34-E` | 支付/`AssessmentQuota | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-35-E` | 测评额度 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-35-E` | AssessmentQuota | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-36-E` | 测评预约 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-36-E` | AssessmentAppointmentController | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | | `TC-P-37-E` | 预约状态 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-37-E` | AssessmentAppointmentController | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | | `TC-P-38-E` | 预约取消 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-38-E` | AssessmentAppointmentController | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | | `TC-P-39-E` | DAN报告 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-39-E` | DanAssessmentResultDTO | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-40-E` | AI方案 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-40-E` | AIChatController`/`AiGateway | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-41-E` | 方案迭代 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-41-E` | AIChatController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-42-E` | 方案编辑 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-42-E` | 方案管理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-43-E` | 方案查看 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-43-E` | 方案管理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-44-E` | 方案确认 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-44-E` | 方案状态机 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-45-E` | 方案发布 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-45-E` | 方案管理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-46-E` | 方案激活 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-46-E` | 方案激活任务分解 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-47-E` | 方案任务 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-47-E` | GrowthPlanController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-48-E` | 方案版本 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-48-E` | 方案管理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-49-E` | AI对话 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-49-E` | AIChatController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-50-E` | 成长记录 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-50-E` | GrowthController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-51-E` | 成长里程碑 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-51-E` | GrowthController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-P-52-E` | 商城浏览 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-52-E` | MallController`/`danshop | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-53-E` | 商品详情 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-53-E` | MallController | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-54-E` | 商城下单 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-54-E` | MallController | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-55-E` | 订单支付 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-55-E` | 支付 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-56-E` | 订单退款 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-56-E` | 订单服务 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-57-E` | 优惠券 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-57-E` | 优惠券 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-P-58-E` | 会员购买 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-58-E` | MemberController | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-P-59-E` | 会员权益 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-59-E` | MemberController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-60-E` | 会员续费 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-60-E` | MemberController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-P-61-E` | 联系人 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-61-E` | ContactCard`/`contact-detail | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-62-E` | 联系人导入 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-62-E` | ContactImport | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-63-E` | 联系人权限 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-63-E` | ContactCard | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-64-E` | 个人资料 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-64-E` | AuthController | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-65-E` | 通知设置 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-65-E` | 消息服务 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-66-E` | 隐私设置 | 家长 | P3 | 异常 | `tests/test-cases/parent.md#TC-P-66-E` | 隐私设置 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-67-E` | 报告代传/report-proxy | 家长 | P1 | 异常 | `tests/test-cases/parent.md#TC-P-67-E` | 报告代传/report-proxy | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-68-E` | 家庭天盘 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-68-E` | 家庭天盘 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-69-E` | 精准营养 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-69-E` | 精准营养 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-70-E` | 舌诊情绪识别 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-70-E` | 舌诊情绪识别 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-71-E` | AuthController | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-71-E` | AuthController | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | | `TC-P-72-E` | 数据导出(GDPR) | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-72-E` | 数据导出(GDPR) | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-73-E` | 家庭/成员 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-73-E` | 家庭/成员 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-74-E` | 规划师绑定 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-74-E` | 规划师绑定 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | | `TC-P-75-E` | 优惠券 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-75-E` | 优惠券 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | | `TC-P-76-E` | 活动管理 | 家长 | P1 | 异常 | `tests/test-cases/parent.md#TC-P-76-E` | 活动管理 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | | `TC-P-77-E` | 活动 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-77-E` | 活动 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | | `TC-P-78-E` | 消息服务 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-78-E` | 消息服务 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-79-E` | 消息服务 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-79-E` | 消息服务 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-80-E` | 会员/订单 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-80-E` | 会员/订单 | 支付失败回滚不生成额度/订单;并发超卖拦截;重复提交幂等;库存/名额边界正确 | | `TC-P-81-E` | 方案/任务 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-81-E` | 方案/任务 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活幂等不重复生成任务;失败回滚不残半任务 | | `TC-P-82-E` | 搜索 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-82-E` | 搜索 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-83-E` | 客服 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-83-E` | 客服 | 字段格式校验拦截;重复去重;最小权限保底;保存失败不污染既有数据 | | `TC-P-84-E` | 分享 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-84-E` | 分享 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-85-E` | AuthController | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-85-E` | AuthController | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | | `TC-P-86-E` | 勋章/排行 | 家长 | P2 | 异常 | `tests/test-cases/parent.md#TC-P-86-E` | 勋章/排行 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-P-01-P` | 家庭 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-01-P` | FamilyInviteController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-02-P` | 家庭/成员 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-02-P` | FamilyInviteController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-03-P` | 成员资料 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-03-P` | FamilyMembersController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-04-P` | 关系图 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-04-P` | 关系类型 CRUD/前端选择器 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-05-P` | 任务 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-05-P` | TaskController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-06-P` | 任务审核 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-06-P` | TaskController`/`PointsController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-07-P` | 心愿 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-07-P` | WishController`/`RewardController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-08-P` | 能量 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-08-P` | EnergyController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-09-P` | 测评订单 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-09-P` | AssessmentAppointmentController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-10-P` | 健康报告 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-10-P` | 健康报告上传解析 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-11-P` | 报告查看 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-11-P` | 报告解析 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-12-P` | 饮食推荐 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-12-P` | 饮食推荐系统 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-13-P` | AI 方案 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-13-P` | AI 统一走 LangGraph;`AiGateway | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-14-P` | 方案提交 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-14-P` | 方案状态机 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-15-P` | 双角色 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-15-P` | POST /api/family/member/switch`(替代废弃 switch-mode);双角色铁律 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-16-P` | 会员 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-16-P` | MembershipController`/`ProductOrderController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-17-P` | 积分/成长 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-17-P` | PointsController`/`GrowthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-18-P` | AI 对话 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-18-P` | AIChatController`;LangGraph RAG | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-19-P` | 能量配置 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-19-P` | 维度配置 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-20-P` | 健康报告 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-20-P` | 报告解析中台/`POST /api/media/upload | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-21-P` | 报告解析 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-21-P` | /api/admin/report-parser/types | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-22-P` | 报告预览 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-22-P` | 解析中台 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-23-P` | 报告入库 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-23-P` | 解析中台 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-24-P` | 报告管理 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-24-P` | 报告管理 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-25-P` | 报告趋势 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-25-P` | 成长/报告 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-26-P` | 饮食推荐 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-26-P` | 饮食推荐系统 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-27-P` | 家庭食谱 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-27-P` | 饮食推荐/家庭食谱 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-28-P` | 食谱筛选 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-28-P` | 饮食推荐 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-29-P` | 食谱收藏 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-29-P` | 饮食推荐 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-30-P` | 食谱营养 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-30-P` | 饮食推荐 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-31-P` | 测评类型 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-31-P` | DanAssessmentController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-32-P` | 测评规划师 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-32-P` | 测评订单 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-33-P` | 测评下单 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-33-P` | AssessmentOrder | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-34-P` | 测评支付 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-34-P` | 支付/`AssessmentQuota | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-35-P` | 测评额度 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-35-P` | AssessmentQuota | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-36-P` | 测评预约 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-36-P` | AssessmentAppointmentController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-37-P` | 预约状态 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-37-P` | AssessmentAppointmentController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-38-P` | 预约取消 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-38-P` | AssessmentAppointmentController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-39-P` | DAN报告 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-39-P` | DanAssessmentResultDTO | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-40-P` | AI方案 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-40-P` | AIChatController`/`AiGateway | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-41-P` | 方案迭代 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-41-P` | AIChatController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-42-P` | 方案编辑 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-42-P` | 方案管理 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-43-P` | 方案查看 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-43-P` | 方案管理 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-44-P` | 方案确认 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-44-P` | 方案状态机 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-45-P` | 方案发布 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-45-P` | 方案管理 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-46-P` | 方案激活 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-46-P` | 方案激活任务分解 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-47-P` | 方案任务 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-47-P` | GrowthPlanController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-48-P` | 方案版本 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-48-P` | 方案管理 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-49-P` | AI对话 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-49-P` | AIChatController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-50-P` | 成长记录 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-50-P` | GrowthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-51-P` | 成长里程碑 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-51-P` | GrowthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-52-P` | 商城浏览 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-52-P` | MallController`/`danshop | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-53-P` | 商品详情 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-53-P` | MallController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-54-P` | 商城下单 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-54-P` | MallController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-55-P` | 订单支付 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-55-P` | 支付 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-56-P` | 订单退款 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-56-P` | 订单服务 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-57-P` | 优惠券 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-57-P` | 优惠券 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-58-P` | 会员购买 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-58-P` | MemberController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-59-P` | 会员权益 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-59-P` | MemberController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-60-P` | 会员续费 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-60-P` | MemberController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-61-P` | 联系人 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-61-P` | ContactCard`/`contact-detail | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-62-P` | 联系人导入 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-62-P` | ContactImport | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-63-P` | 联系人权限 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-63-P` | ContactCard | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-64-P` | 个人资料 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-64-P` | AuthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-65-P` | 通知设置 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-65-P` | 消息服务 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-66-P` | 隐私设置 | 家长 | P2 | 权限 | `tests/test-cases/parent.md#TC-P-66-P` | 隐私设置 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-67-P` | 报告代传/report-proxy | 家长 | P0 | 权限 | `tests/test-cases/parent.md#TC-P-67-P` | 报告代传/report-proxy | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-68-P` | 家庭天盘 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-68-P` | 家庭天盘 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-69-P` | 精准营养 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-69-P` | 精准营养 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-70-P` | 舌诊情绪识别 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-70-P` | 舌诊情绪识别 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-71-P` | AuthController | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-71-P` | AuthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-72-P` | 数据导出(GDPR) | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-72-P` | 数据导出(GDPR) | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-73-P` | 家庭/成员 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-73-P` | 家庭/成员 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-74-P` | 规划师绑定 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-74-P` | 规划师绑定 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-75-P` | 优惠券 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-75-P` | 优惠券 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-76-P` | 活动管理 | 家长 | P0 | 权限 | `tests/test-cases/parent.md#TC-P-76-P` | 活动管理 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-77-P` | 活动 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-77-P` | 活动 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-78-P` | 消息服务 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-78-P` | 消息服务 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-79-P` | 消息服务 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-79-P` | 消息服务 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-80-P` | 会员/订单 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-80-P` | 会员/订单 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-81-P` | 方案/任务 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-81-P` | 方案/任务 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-82-P` | 搜索 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-82-P` | 搜索 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-83-P` | 客服 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-83-P` | 客服 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-84-P` | 分享 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-84-P` | 分享 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-85-P` | AuthController | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-85-P` | AuthController | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-86-P` | 勋章/排行 | 家长 | P1 | 权限 | `tests/test-cases/parent.md#TC-P-86-P` | 勋章/排行 | 非归属数据访问统一 403/401,不泄露他人数据;横向越权被拒 | | `TC-P-N01` | 健康报告 | 家长 | P1 | 性能 | `tests/test-cases/parent.md#TC-P-N01` | 健康报告上传解析 | 上传+解析 ≤ 30s;超时走 AiGateway 友好降级而非 500;进度可见 | | `TC-P-N02` | AI 方案 | 家长 | P1 | 性能 | `tests/test-cases/parent.md#TC-P-N02` | AiGateway/LangGraph | 各方案独立完整、数据不串;单请求 P95 ≤ 15s;LangGraph 超时回退 Fallback | | `TC-P-N03` | 任务 | 家长 | P2 | 性能 | `tests/test-cases/parent.md#TC-P-N03` | TaskController | 首屏 ≤ 2s;翻页流畅;分页/虚拟滚动生效 | | `TC-P-N04` | 全局搜索 | 家长 | P2 | 性能 | `tests/test-cases/parent.md#TC-P-N04` | 搜索接口 | 搜索结果 ≤ 1.5s;匹配高亮;空结果空态 | | `TC-P-N05` | 报告查看 | 家长 | P2 | 性能 | `tests/test-cases/parent.md#TC-P-N05` | 报告解析 | 列表/详情渲染 ≤ 2s;七维评分刷新不卡顿 | | `TC-P-N06` | 双角色 | 家长 | P1 | 兼容 | `tests/test-cases/parent.md#TC-P-N06` | 双角色铁律 | 四端功能一致;切回家长需密码;孩子端不可回切 | | `TC-P-N07` | 饮食推荐 | 家长 | P2 | 兼容 | `tests/test-cases/parent.md#TC-P-N07` | 饮食推荐 | 推荐列表与可吃/慎吃标签布局正常;图片自适应 | | `TC-P-N08` | 设置 | 家长 | P2 | 兼容 | `tests/test-cases/parent.md#TC-P-N08` | 前端适配 | 无样式错位;可点区域 ≥ 44px;无横向滚动 | | `TC-P-N09` | 报告闭环 | 家长 | P0 | 安全 | `tests/test-cases/parent.md#TC-P-N09` | 报告鉴权 | 返回 403(IDOR 横向越权拦截);不泄露跨家庭数据 | | `TC-P-N10` | AI 对话 | 家长 | P1 | 安全 | `tests/test-cases/parent.md#TC-P-N10` | AIChatController | 输入后端 HTML 转义存储/渲染;无脚本执行 | | `TC-P-N11` | 健康报告 | 家长 | P0 | 安全 | `tests/test-cases/parent.md#TC-P-N11` | 上传校验 | 类型/大小校验拒绝(400/413);不落盘执行;不触发解析 | | `TC-P-N12` | 双角色 | 家长 | P1 | 安全 | `tests/test-cases/parent.md#TC-P-N12` | switch 接口鉴权 | 服务端二次校验身份;篡改无效;不越权 | | `TC-P-N13` | 设置 | 家长 | P1 | 安全 | `tests/test-cases/parent.md#TC-P-N13` | 数据安全 | 无身份证/手机号明文泄露;日志脱敏;状态变更含 CSRF token 校验 | | `TC-T-01` | 认证/双角色 | 规划师 | P0 | 权限 | `tests/test-cases/teacher.md#TC-T-01` | AuthController`;规划师可切回家长 | 进入仪表板;可切回自身家长视角;越权访问无关家庭被拒 | | `TC-T-02` | 家庭绑定 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-02` | FamilyInviteController | 家庭出现在列表,可见成员;无效码提示失败;重复绑定幂等 | | `TC-T-03` | 健康报告 | 规划师 | P0 | 功能 | `tests/test-cases/teacher.md#TC-T-03` | 报告上传解析;规划师代传 | 报告进入孩子档案;健康列表可见;识别失败进草稿/未知聚类 | | `TC-T-04` | 报告审核 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-04` | 报告审核 | 草稿确认入库,健康报告列表可见;确认前可取消不入库 | | `TC-T-05` | 方案管理 | 规划师 | P0 | 功能 | `tests/test-cases/teacher.md#TC-T-05` | 方案管理;黑盒回归项 | 列表正常渲染(无白屏);函数不报未定义 | | `TC-T-06` | 方案审核 | 规划师 | P0 | 功能 | `tests/test-cases/teacher.md#TC-T-06` | 方案状态机 | 状态 generated→reviewed | | `TC-T-07` | 方案激活 | 规划师 | P0 | 功能 | `tests/test-cases/teacher.md#TC-T-07` | 激活拆任务 | 状态 reviewed→active;生成引导任务+模板任务;孩子 B 出现方案启动任务 | | `TC-T-08` | 方案激活·幂等 | 规划师 | P0 | 异常 | `tests/test-cases/teacher.md#TC-T-08` | 幂等约束(黑盒回归) | 返回状态异常提示,**不重复生成任务**(幂等) | | `TC-T-09` | 任务审核 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-09` | TaskController | 通过→孩子得积分;驳回→退回重做;越权审核非绑定家庭被拒 | | `TC-T-10` | 测评录入 | 规划师 | P0 | 功能 | `tests/test-cases/teacher.md#TC-T-10` | AssessmentAppointmentController`/`DanAssessmentController | 结果可见;触发规则引擎自动生成方案(generated);必填缺失→校验拦截;重复录入覆盖 | | `TC-T-11` | 成长计划 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-11` | GrowthPlanController`;黑盒回归 | 列表显示自己创建的计划(childName/状态/时间);不再 400 | | `TC-T-12` | 套餐 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-12` | GuidePackageController | 上架前提交审核;审核通过后可被市场购买;任务项为空→校验拦截 | | `TC-T-13` | 数据隔离 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-13` | 控制器内 role 检查 | 非绑定家庭统一 403;仅见绑定家庭数据 | | `TC-T-14` | 方案编辑 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-14` | 方案管理 | 编辑后状态标记已改;保存生效 | | `TC-T-15` | 套餐任务 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-15` | GuidePackageController | 空套餐拦截上架;重算后任务项正确 | | `TC-T-16` | 健康总览 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-16` | 仪表板 | 数据缺失项降级展示不 500 | | `TC-T-17` | 计划进度 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-17` | GrowthPlanController | 进度计算准确;与任务状态一致 | | `TC-T-18` | 批量任务 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-18` | TaskController | 部分失败不影响其他成员;各自独立落库 | | `TC-T-19` | 消息推送 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-19` | 消息服务 | 客户端收到;免打扰设置生效 | | `TC-T-20` | 退出/切换 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-20` | AuthController | 退出清缓存;切回家长视角正常 | | `TC-T-21` | 报告对比 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-21` | 报告管理 | 报告类型一致才可比对;差异清晰标注 | | `TC-T-22` | 方案归档 | 规划师 | P2 | 功能 | `tests/test-cases/teacher.md#TC-T-22` | 方案管理 | 归档后方案仅可读,不可再编辑/激活 | | `TC-T-23` | 报告代传/report-proxy | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-23` | 报告代传/report-proxy | 达成目标:帮客户上传;边界:非绑定家庭拒;识别失败进草稿 | | `TC-T-24` | 规划师绑定 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-24` | 规划师绑定 | 达成目标:更换绑定;边界:在途方案/预约处理;非绑定家庭不可操作 | | `TC-T-25` | 舌诊情绪识别 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-25` | 舌诊情绪识别 | 达成目标:录入识别结果;边界:识别失败回退人工 | | `TC-T-26` | 精准营养 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-26` | 精准营养 | 达成目标:基于营养目标出方案;边界:目标非法拦截 | | `TC-T-27` | 家庭天盘 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-27` | 家庭天盘 | 达成目标:给家庭看聚合视图并解读;边界:仅绑定家庭可见 | | `TC-T-28` | 内容安全 | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-28` | 内容安全 | 达成目标:复核 AI 敏感内容;边界:命中即拦截 | | `TC-T-29` | 数据导出(GDPR) | 规划师 | P1 | 功能 | `tests/test-cases/teacher.md#TC-T-29` | 数据导出(GDPR) | 达成目标:导出客户数据;边界:授权/脱敏;越权拒 | | `TC-T-01-E` | 认证/双角色 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-01-E` | AuthController`;规划师可切回家长 | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-T-02-E` | 家庭绑定 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-02-E` | FamilyInviteController | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-T-03-E` | 健康报告 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-03-E` | 报告上传解析;规划师代传 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-04-E` | 报告审核 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-04-E` | 报告审核 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-05-E` | 方案管理 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-05-E` | 方案管理;黑盒回归项 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-06-E` | 方案审核 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-06-E` | 方案状态机 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-07-E` | 方案激活 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-07-E` | 激活拆任务 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-08-E` | 方案激活·幂等 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-08-E` | 幂等约束(黑盒回归) | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-09-E` | 任务审核 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-09-E` | TaskController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-T-10-E` | 测评录入 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-10-E` | AssessmentAppointmentController`/`DanAssessmentController | 额度不足/过期直接报错不落预约;并发重复提交被拒(幂等);状态机守卫非法回退 | | `TC-T-11-E` | 成长计划 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-11-E` | GrowthPlanController`;黑盒回归 | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-T-12-E` | 套餐 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-12-E` | GuidePackageController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-13-E` | 数据隔离 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-13-E` | 控制器内 role 检查 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-T-14-E` | 方案编辑 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-14-E` | 方案管理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-15-E` | 套餐任务 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-15-E` | GuidePackageController | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-16-E` | 健康总览 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-16-E` | 仪表板 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-T-17-E` | 计划进度 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-17-E` | GrowthPlanController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-T-18-E` | 批量任务 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-18-E` | TaskController | 重复提交幂等不重复计分;驳回可重做;超期不可操作;能量不为负、流水可追溯;空态/缺数据降级非 500 | | `TC-T-19-E` | 消息推送 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-19-E` | 消息服务 | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-T-20-E` | 退出/切换 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-20-E` | AuthController | token 过期/缺失统一 401 跳登录;孩子端无切回家长入口;越权切换被拒;模拟登录仅测试环境生效 | | `TC-T-21-E` | 报告对比 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-21-E` | 报告管理 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-22-E` | 方案归档 | 规划师 | P3 | 异常 | `tests/test-cases/teacher.md#TC-T-22-E` | 方案管理 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活/确认/购买幂等不重复生成任务/扣费;失败回滚不残半任务 | | `TC-T-23-E` | 报告代传/report-proxy | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-23-E` | 报告代传/report-proxy | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-24-E` | 规划师绑定 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-24-E` | 规划师绑定 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-25-E` | 舌诊情绪识别 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-25-E` | 舌诊情绪识别 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-26-E` | 精准营养 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-26-E` | 精准营养 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-27-E` | 家庭天盘 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-27-E` | 家庭天盘 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-T-28-E` | 内容安全 | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-28-E` | 内容安全 | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活幂等不重复生成任务;失败回滚不残半任务 | | `TC-T-29-E` | 数据导出(GDPR) | 规划师 | P2 | 异常 | `tests/test-cases/teacher.md#TC-T-29-E` | 数据导出(GDPR) | LangGraph 不可用时 AiGateway Fallback 兜底,前端友好提示而非 500;重复激活幂等不重复生成任务;失败回滚不残半任务 | | `TC-T-01-P` | 认证/双角色 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-01-P` | AuthController`;规划师可切回家长 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-02-P` | 家庭绑定 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-02-P` | FamilyInviteController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-03-P` | 健康报告 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-03-P` | 报告上传解析;规划师代传 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-04-P` | 报告审核 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-04-P` | 报告审核 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-05-P` | 方案管理 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-05-P` | 方案管理;黑盒回归项 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-06-P` | 方案审核 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-06-P` | 方案状态机 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-07-P` | 方案激活 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-07-P` | 激活拆任务 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-08-P` | 方案激活·幂等 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-08-P` | 幂等约束(黑盒回归) | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-09-P` | 任务审核 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-09-P` | TaskController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-10-P` | 测评录入 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-10-P` | AssessmentAppointmentController`/`DanAssessmentController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-11-P` | 成长计划 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-11-P` | GrowthPlanController`;黑盒回归 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-12-P` | 套餐 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-12-P` | GuidePackageController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-13-P` | 数据隔离 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-13-P` | 控制器内 role 检查 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-14-P` | 方案编辑 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-14-P` | 方案管理 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-15-P` | 套餐任务 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-15-P` | GuidePackageController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-16-P` | 健康总览 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-16-P` | 仪表板 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-17-P` | 计划进度 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-17-P` | GrowthPlanController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-18-P` | 批量任务 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-18-P` | TaskController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-19-P` | 消息推送 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-19-P` | 消息服务 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-20-P` | 退出/切换 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-20-P` | AuthController | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-21-P` | 报告对比 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-21-P` | 报告管理 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-22-P` | 方案归档 | 规划师 | P2 | 权限 | `tests/test-cases/teacher.md#TC-T-22-P` | 方案管理 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒(高危越权修复) | | `TC-T-23-P` | 报告代传/report-proxy | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-23-P` | 报告代传/report-proxy | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-24-P` | 规划师绑定 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-24-P` | 规划师绑定 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-25-P` | 舌诊情绪识别 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-25-P` | 舌诊情绪识别 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-26-P` | 精准营养 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-26-P` | 精准营养 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-27-P` | 家庭天盘 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-27-P` | 家庭天盘 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-28-P` | 内容安全 | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-28-P` | 内容安全 | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-29-P` | 数据导出(GDPR) | 规划师 | P1 | 权限 | `tests/test-cases/teacher.md#TC-T-29-P` | 数据导出(GDPR) | 非绑定家庭数据统一 403;confirm/cancel 增加归属校验,非指派调用被拒 | | `TC-T-N01` | 健康报告 | 规划师 | P1 | 性能 | `tests/test-cases/teacher.md#TC-T-N01` | 报告解析中台 | 队列不堵;单份 ≤ 30s;失败重试不重复入库 | | `TC-T-N02` | 方案审核 | 规划师 | P1 | 性能 | `tests/test-cases/teacher.md#TC-T-N02` | 方案状态机 | 列表 ≤ 2s;筛选/排序生效 | | `TC-T-N03` | 绑定家庭 | 规划师 | P2 | 性能 | `tests/test-cases/teacher.md#TC-T-N03` | 绑定家庭 | 切换 ≤ 1.5s;数据隔离不串 | | `TC-T-N04` | 报告代传 | 规划师 | P1 | 兼容 | `tests/test-cases/teacher.md#TC-T-N04` | 代传入口 | 上传入口一致;解析预览正常 | | `TC-T-N05` | 健康报告 | 规划师 | P0 | 安全 | `tests/test-cases/teacher.md#TC-T-N05` | 规划师鉴权 | 返回 403(非绑定家庭越权拦截);不泄露 | | `TC-T-N06` | 方案审核 | 规划师 | P0 | 安全 | `tests/test-cases/teacher.md#TC-T-N06` | 方案鉴权 | 服务端归属校验;非法操作 403/拒绝 | | `TC-T-N07` | 舌诊录入 | 规划师 | P1 | 安全 | `tests/test-cases/teacher.md#TC-T-N07` | 上传校验 | 类型校验拒绝;不执行;存储路径随机化防遍历 | | `TC-T-N08` | 精准营养 | 规划师 | P1 | 安全 | `tests/test-cases/teacher.md#TC-T-N08` | 方案内容安全 | 后端转义存储;前端不执行 | | `TC-S-01` | 入驻 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-01` | ServiceRoleApplicationController`/`AdminEcomSupplierController | 进入运营审核队列;审核通过→获得供应商身份;资质缺失→驳回说明;重复申请幂等 | | `TC-S-02` | 商品 | 服务商 | P0 | 接口 | `tests/test-cases/vendor.md#TC-S-02` | ProductController`/`AdminProductController | 商品在商城可见;库存/价格即时生效;字段校验错误→400;负价格/负库存拦截;下架不可购买 | | `TC-S-03` | 订单 | 服务商 | P0 | 功能 | `tests/test-cases/vendor.md#TC-S-03` | ProductOrderController | 订单状态正确流转;客户可见物流/核销码;重复发货幂等;核销码校验防冒用 | | `TC-S-04` | 订单核销 | 服务商 | P0 | 功能 | `tests/test-cases/vendor.md#TC-S-04` | 订单服务 | 重复核销幂等;超期订单提示不可核销 | | `TC-S-05` | 库存 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-05` | 库存服务 | 负库存拦截;同步后前台可见 | | `TC-S-06` | 售后 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-06` | 售后 | 重复退款拦截;退款流水可追溯 | | `TC-S-07` | 活动报名 | 服务商 | P2 | 功能 | `tests/test-cases/vendor.md#TC-S-07` | 活动管理 | 活动失效不可报;报名后商品出现活动标 | | `TC-S-08` | 对账 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-08` | 结算 | 账期计算正确;结算后状态更新 | | `TC-S-9` | 服务商集成/解析中台 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-9` | 服务商集成/解析中台 | 达成目标:提供解析能力;边界:跨商户隔离;鉴权 | | `TC-S-10` | 食谱库 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-10` | 食谱库 | 达成目标:供食谱数据;边界:数据合规;格式校验 | | `TC-S-11` | 合规 | 服务商 | P1 | 功能 | `tests/test-cases/vendor.md#TC-S-11` | 合规 | 达成目标:授权内用数;边界:越授权拒;脱敏 | | `TC-S-01-E` | 入驻 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-01-E` | ServiceRoleApplicationController`/`AdminEcomSupplierController | 系统给出明确错误提示而非 500;关键操作可重试或回滚;不泄露内部堆栈 | | `TC-S-02-E` | 商品 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-02-E` | ProductController`/`AdminProductController | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-S-03-E` | 订单 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-03-E` | ProductOrderController | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-S-04-E` | 订单核销 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-04-E` | 订单服务 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-S-05-E` | 库存 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-05-E` | 库存服务 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-S-06-E` | 售后 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-06-E` | 售后 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-S-07-E` | 活动报名 | 服务商 | P3 | 异常 | `tests/test-cases/vendor.md#TC-S-07-E` | 活动管理 | 标题/名称重复被拦截;参数非法统一 400 非 500;长文稳定无超时;操作可逆或有确认 | | `TC-S-08-E` | 对账 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-08-E` | 结算 | 支付失败订单回滚不进入已支付;重复提交幂等;负价格/负库存/参数非法统一 400 拦截;重复核销/退款幂等 | | `TC-S-9-E` | 服务商集成/解析中台 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-9-E` | 服务商集成/解析中台 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-S-10-E` | 食谱库 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-10-E` | 食谱库 | 识别失败或解析超时给出明确提示,进入未知聚类/草稿而非 500;非募极报告明确提示「请确认是募极生物肠道菌群报告」 | | `TC-S-11-E` | 合规 | 服务商 | P2 | 异常 | `tests/test-cases/vendor.md#TC-S-11-E` | 合规 | 并发安全;重复操作幂等;异常设备二次验证;数据归档/导出脱敏合规 | | `TC-S-01-P` | 入驻 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-01-P` | ServiceRoleApplicationController`/`AdminEcomSupplierController | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-02-P` | 商品 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-02-P` | ProductController`/`AdminProductController | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-03-P` | 订单 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-03-P` | ProductOrderController | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-04-P` | 订单核销 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-04-P` | 订单服务 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-05-P` | 库存 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-05-P` | 库存服务 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-06-P` | 售后 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-06-P` | 售后 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-07-P` | 活动报名 | 服务商 | P2 | 权限 | `tests/test-cases/vendor.md#TC-S-07-P` | 活动管理 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-08-P` | 对账 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-08-P` | 结算 | 非本服务商资源操作被拒;核销码校验防冒用;跨商户数据隔离 | | `TC-S-9-P` | 服务商集成/解析中台 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-9-P` | 服务商集成/解析中台 | 非本商户资源隔离,跨商户访问 403 | | `TC-S-10-P` | 食谱库 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-10-P` | 食谱库 | 非本商户资源隔离,跨商户访问 403 | | `TC-S-11-P` | 合规 | 服务商 | P1 | 权限 | `tests/test-cases/vendor.md#TC-S-11-P` | 合规 | 非本商户资源隔离,跨商户访问 403 | | `TC-S-N01` | 商品 | 服务商 | P2 | 性能 | `tests/test-cases/vendor.md#TC-S-N01` | 商品管理 | 列表 ≤ 2s;筛选生效 | | `TC-S-N02` | 订单履约 | 服务商 | P1 | 性能 | `tests/test-cases/vendor.md#TC-S-N02` | 订单服务 | 查询 ≤ 2s;状态流转即时 | | `TC-S-N03` | 入驻 | 服务商 | P2 | 兼容 | `tests/test-cases/vendor.md#TC-S-N03` | 服务商后台 | 表单布局正常;上传兼容 | | `TC-S-N04` | 订单履约 | 服务商 | P0 | 安全 | `tests/test-cases/vendor.md#TC-S-N04` | 商户隔离 | 返回 403(跨商户隔离);不泄露他商数据 | | `TC-S-N05` | 报告解析接入 | 服务商 | P0 | 安全 | `tests/test-cases/vendor.md#TC-S-N05` | 上传校验 | 类型/大小校验;不执行;存储隔离 | | `TC-S-N06` | 营养食谱 | 服务商 | P1 | 安全 | `tests/test-cases/vendor.md#TC-S-N06` | 内容安全 | 内容转义存储/渲染;不执行 | ## 三、Playwright 端到端 / 集成测试(`tests/*.md`) > 来源锚点 = `文件#用例标题`。用例标题列于 JSON(`inventory.json`)便于回写。 | 文件 | 用例数 | 来源 | | --- | --- | --- | | `tests/e2e/_smoke_browser.spec.js` | 2 | `tests/e2e/_smoke_browser.spec.js` | | `tests/e2e/activity-registration.spec.js` | 5 | `tests/e2e/activity-registration.spec.js` | | `tests/e2e/admin-activity-review.spec.js` | 2 | `tests/e2e/admin-activity-review.spec.js` | | `tests/e2e/admin-butler-review.spec.js` | 6 | `tests/e2e/admin-butler-review.spec.js` | | `tests/e2e/admin-commission-config.spec.js` | 4 | `tests/e2e/admin-commission-config.spec.js` | | `tests/e2e/admin-ecom-supplier.spec.js` | 3 | `tests/e2e/admin-ecom-supplier.spec.js` | | `tests/e2e/admin-menu-survey.spec.js` | 2 | `tests/e2e/admin-menu-survey.spec.js` | | `tests/e2e/admin-panel.spec.js` | 4 | `tests/e2e/admin-panel.spec.js` | | `tests/e2e/admin-promotion-config.spec.js` | 2 | `tests/e2e/admin-promotion-config.spec.js` | | `tests/e2e/ai-plan-task-flow.spec.js` | 7 | `tests/e2e/ai-plan-task-flow.spec.js` | | `tests/e2e/api/api-smoke.spec.js` | 4 | `tests/e2e/api/api-smoke.spec.js` | | `tests/e2e/api/article-api.spec.js` | 7 | `tests/e2e/api/article-api.spec.js` | | `tests/e2e/api/contact-api.spec.js` | 6 | `tests/e2e/api/contact-api.spec.js` | | `tests/e2e/api/energy-api.spec.js` | 9 | `tests/e2e/api/energy-api.spec.js` | | `tests/e2e/api/family-member-api.spec.js` | 14 | `tests/e2e/api/family-member-api.spec.js` | | `tests/e2e/api/nonfunc-perf-compat.spec.js` | 5 | `tests/e2e/api/nonfunc-perf-compat.spec.js` | | `tests/e2e/api/nonfunc-security.spec.js` | 11 | `tests/e2e/api/nonfunc-security.spec.js` | | `tests/e2e/article-management.spec.js` | 5 | `tests/e2e/article-management.spec.js` | | `tests/e2e/assessment-appointment-functional.spec.js` | 7 | `tests/e2e/assessment-appointment-functional.spec.js` | | `tests/e2e/assessment-appointment.spec.js` | 6 | `tests/e2e/assessment-appointment.spec.js` | | `tests/e2e/assessment-order-flow.spec.js` | 5 | `tests/e2e/assessment-order-flow.spec.js` | | `tests/e2e/consignee-management.spec.js` | 8 | `tests/e2e/consignee-management.spec.js` | | `tests/e2e/contact-management.spec.js` | 4 | `tests/e2e/contact-management.spec.js` | | `tests/e2e/daily-checkin-streak.spec.js` | 9 | `tests/e2e/daily-checkin-streak.spec.js` | | `tests/e2e/dan-assessment-vendor-flow.spec.js` | 10 | `tests/e2e/dan-assessment-vendor-flow.spec.js` | | `tests/e2e/dan-report-flow.spec.js` | 9 | `tests/e2e/dan-report-flow.spec.js` | | `tests/e2e/debug-admin-spa.spec.js` | 1 | `tests/e2e/debug-admin-spa.spec.js` | | `tests/e2e/debug-control.spec.js` | 1 | `tests/e2e/debug-control.spec.js` | | `tests/e2e/debug-full-instrument.spec.js` | 1 | `tests/e2e/debug-full-instrument.spec.js` | | `tests/e2e/energy-rules-config.spec.js` | 4 | `tests/e2e/energy-rules-config.spec.js` | | `tests/e2e/energy-system.spec.js` | 8 | `tests/e2e/energy-system.spec.js` | | `tests/e2e/family-earnings-flow.spec.js` | 6 | `tests/e2e/family-earnings-flow.spec.js` | | `tests/e2e/family-member-management.spec.js` | 10 | `tests/e2e/family-member-management.spec.js` | | `tests/e2e/flora-microbiome-flow.spec.js` | 9 | `tests/e2e/flora-microbiome-flow.spec.js` | | `tests/e2e/growth-record-sync.spec.js` | 8 | `tests/e2e/growth-record-sync.spec.js` | | `tests/e2e/guide-family-list.spec.js` | 7 | `tests/e2e/guide-family-list.spec.js` | | `tests/e2e/health-knowledge-base.spec.js` | 4 | `tests/e2e/health-knowledge-base.spec.js` | | `tests/e2e/health-report-audit.spec.js` | 8 | `tests/e2e/health-report-audit.spec.js` | | `tests/e2e/mass-create-users.spec.js` | 1 | `tests/e2e/mass-create-users.spec.js` | | `tests/e2e/membership-system.spec.js` | 3 | `tests/e2e/membership-system.spec.js` | | `tests/e2e/mini-games-full.spec.js` | 5 | `tests/e2e/mini-games-full.spec.js` | | `tests/e2e/mini-games-playwright.spec.js` | 12 | `tests/e2e/mini-games-playwright.spec.js` | | `tests/e2e/mini-games.spec.js` | 14 | `tests/e2e/mini-games.spec.js` | | `tests/e2e/nutritionist-apply.spec.js` | 3 | `tests/e2e/nutritionist-apply.spec.js` | | `tests/e2e/nutritionist-flow.spec.js` | 10 | `tests/e2e/nutritionist-flow.spec.js` | | `tests/e2e/planner-bind-invite.spec.js` | 9 | `tests/e2e/planner-bind-invite.spec.js` | | `tests/e2e/points-system.spec.js` | 4 | `tests/e2e/points-system.spec.js` | | `tests/e2e/product-purchase.spec.js` | 9 | `tests/e2e/product-purchase.spec.js` | | `tests/e2e/publish-dimension-articles.spec.js` | 1 | `tests/e2e/publish-dimension-articles.spec.js` | | `tests/e2e/roles/admin/article/workflow.spec.js` | 4 | `tests/e2e/roles/admin/article/workflow.spec.js` | | `tests/e2e/roles/admin/login.spec.js` | 2 | `tests/e2e/roles/admin/login.spec.js` | | `tests/e2e/roles/admin/vendor/management.spec.js` | 2 | `tests/e2e/roles/admin/vendor/management.spec.js` | | `tests/e2e/roles/child/daily-checkin.spec.js` | 3 | `tests/e2e/roles/child/daily-checkin.spec.js` | | `tests/e2e/roles/child/login.spec.js` | 2 | `tests/e2e/roles/child/login.spec.js` | | `tests/e2e/roles/child/mini-games.spec.js` | 3 | `tests/e2e/roles/child/mini-games.spec.js` | | `tests/e2e/roles/parent/assessment-order.spec.js` | 6 | `tests/e2e/roles/parent/assessment-order.spec.js` | | `tests/e2e/roles/parent/energy-dashboard.spec.js` | 5 | `tests/e2e/roles/parent/energy-dashboard.spec.js` | | `tests/e2e/roles/parent/family-management.spec.js` | 8 | `tests/e2e/roles/parent/family-management.spec.js` | | `tests/e2e/roles/parent/points.spec.js` | 6 | `tests/e2e/roles/parent/points.spec.js` | | `tests/e2e/roles/parent/wish-management.spec.js` | 5 | `tests/e2e/roles/parent/wish-management.spec.js` | | `tests/e2e/roles/teacher/family-binding.spec.js` | 4 | `tests/e2e/roles/teacher/family-binding.spec.js` | | `tests/e2e/roles/teacher/login.spec.js` | 2 | `tests/e2e/roles/teacher/login.spec.js` | | `tests/e2e/teacher-dashboard.spec.js` | 10 | `tests/e2e/teacher-dashboard.spec.js` | | `tests/e2e/unified-audit-center.spec.js` | 8 | `tests/e2e/unified-audit-center.spec.js` | | `tests/e2e/vendor-onboarding.spec.js` | 3 | `tests/e2e/vendor-onboarding.spec.js` | | `tests/e2e/vendor-product-manage.spec.js` | 8 | `tests/e2e/vendor-product-manage.spec.js` | | `tests/e2e/wish-exchange-flow.spec.js` | 12 | `tests/e2e/wish-exchange-flow.spec.js` | | `tests/integration/mini-games-api.spec.js` | 13 | `tests/integration/mini-games-api.spec.js` | | `tests/integration/plan-chain.spec.js` | 10 | `tests/integration/plan-chain.spec.js` | | `tests/unit/games/1a2b.spec.js` | 1 | `tests/unit/games/1a2b.spec.js` | ## 四、Python 测试(`cfc-langgraph/tests · tools/xaf_agent_hub/tests`) | 文件 | 用例数 | 来源 | | --- | --- | --- | | `cfc-langgraph/tests/qna/test_graph.py` | 4 | `cfc-langgraph/tests/qna/test_graph.py` | | `cfc-langgraph/tests/test_analyze.py` | 2 | `cfc-langgraph/tests/test_analyze.py` | | `cfc-langgraph/tests/test_auto_tag.py` | 5 | `cfc-langgraph/tests/test_auto_tag.py` | | `cfc-langgraph/tests/test_chat.py` | 1 | `cfc-langgraph/tests/test_chat.py` | | `cfc-langgraph/tests/test_graph.py` | 5 | `cfc-langgraph/tests/test_graph.py` | | `cfc-langgraph/tests/test_health_plan.py` | 13 | `cfc-langgraph/tests/test_health_plan.py` | | `cfc-langgraph/tests/test_intent.py` | 5 | `cfc-langgraph/tests/test_intent.py` | | `cfc-langgraph/tests/test_memory.py` | 3 | `cfc-langgraph/tests/test_memory.py` | | `cfc-langgraph/tests/test_recommend.py` | 3 | `cfc-langgraph/tests/test_recommend.py` | | `cfc-langgraph/tests/test_report_parse.py` | 5 | `cfc-langgraph/tests/test_report_parse.py` | | `cfc-langgraph/tests/test_tongue.py` | 1 | `cfc-langgraph/tests/test_tongue.py` | ## 五、Java 后端测试(`cfc-backend/src/test/java`) > 方法级覆盖矩阵(控制器 handler 命中情况)见 `discovery.md`。此处文件级编目,来源锚点 = 原 java 路径。 | 测试文件 | 类型 | @Test数 | 目标类 | 来源 | | --- | --- | --- | --- | --- | | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | cfc-backend | 9 | AdminRoles | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | cfc-backend | 0 | TestRoles.java | `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | cfc-backend | 7 | AttributionStage1Foundation | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | cfc-backend | 6 | DatabaseInitializerSeed | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | cfc-backend | 11 | FamilyAccessInterceptor | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | cfc-backend | 5 | JwtInterceptorLoginRequired | `cfc-backend/src/test/java/com/etotem/cfc/config/JwtInterceptorLoginRequiredTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | cfc-backend | 1 | AttributionController | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | cfc-backend | 3 | AttributionSurveyRouting | `cfc-backend/src/test/java/com/etotem/cfc/controller/AttributionSurveyRoutingTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` | cfc-backend | 6 | HealthCheckinCfEarnCallSite | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthCheckinCfEarnCallSiteTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | cfc-backend | 6 | HealthPlanDeleteController | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthPlanDeleteControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerListPaginationTest.java` | cfc-backend | 4 | HealthReportControllerListPagination | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerListPaginationTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | cfc-backend | 6 | HealthReportControllerProxyParseBinding | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | cfc-backend | 2 | IndicatorController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | cfc-backend | 10 | IndicatorFavoriteController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | cfc-backend | 4 | AdminProductControllerBatchShelve | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` | cfc-backend | 3 | ReportParserAdminController | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | cfc-backend | 4 | FamilyMembersControllerList | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | cfc-backend | 2 | FamilyMembersControllerRenameFamily | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | cfc-backend | 1 | TeacherMessageControllerMy | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | cfc-backend | 3 | ActivityDTO | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | cfc-backend | 6 | DailyCheckinStreakFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | cfc-backend | 7 | EnergySystemFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java` | cfc-backend | 10 | GrowthRecordSyncFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java` | cfc-backend | 4 | GuideModule | `cfc-backend/src/test/java/com/etotem/cfc/integration/GuideModuleIntegrationTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/PlannerBindInviteFlowTest.java` | cfc-backend | 9 | PlannerBindInviteFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/PlannerBindInviteFlowTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AIChatControllerTest.java` | cfc-backend | 17 | AIChatController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AIChatControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ActivityControllerTest.java` | cfc-backend | 16 | ActivityController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ActivityControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminFamilyOverviewControllerTest.java` | cfc-backend | 3 | AdminFamilyOverviewController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminFamilyOverviewControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminSpecialPriceControllerTest.java` | cfc-backend | 8 | AdminSpecialPriceController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AdminSpecialPriceControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleCategoryControllerTest.java` | cfc-backend | 3 | ArticleCategoryController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleCategoryControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleControllerTest.java` | cfc-backend | 11 | ArticleController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ArticleControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AuthControllerTest.java` | cfc-backend | 39 | AuthController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/AuthControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | cfc-backend | 2 | DailyTaskController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DailyTaskControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | cfc-backend | 13 | DimensionAdminController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/DimensionAdminControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | cfc-backend | 8 | FamilyController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/FamilyControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | cfc-backend | 20 | GuideFamilyTaskController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideFamilyTaskControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | cfc-backend | 8 | GuideOrderController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideOrderControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideRolePermissionTest.java` | cfc-backend | 21 | GuideRolePermission | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideRolePermissionTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideTeamControllerTest.java` | cfc-backend | 9 | GuideTeamController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/GuideTeamControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/HealthDimensionControllerTest.java` | cfc-backend | 15 | HealthDimensionController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/HealthDimensionControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/PaymentControllerTest.java` | cfc-backend | 12 | PaymentController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/PaymentControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductControllerTest.java` | cfc-backend | 16 | ProductController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductOrderControllerTest.java` | cfc-backend | 20 | ProductOrderController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/ProductOrderControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/SpecialPriceControllerTest.java` | cfc-backend | 3 | SpecialPriceController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/SpecialPriceControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/StatsControllerTest.java` | cfc-backend | 6 | StatsController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/StatsControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/WishControllerTest.java` | cfc-backend | 29 | WishController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/WishControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/mind/MindFortuneControllerTest.java` | cfc-backend | 1 | MindFortuneController | `cfc-backend/src/test/java/com/etotem/cfc/integration/controller/mind/MindFortuneControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | cfc-backend | 10 | ActivityAdminService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityServicePublishTest.java` | cfc-backend | 6 | ActivityServicePublish | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityServicePublishTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ArticleWorkflowTest.java` | cfc-backend | 14 | ArticleWorkflow | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ArticleWorkflowTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ChallengeScoreServiceTest.java` | cfc-backend | 4 | ChallengeScoreService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ChallengeScoreServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DailyOverviewServiceTest.java` | cfc-backend | 1 | DailyOverviewService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DailyOverviewServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DanReportParseServiceTest.java` | cfc-backend | 38 | DanReportParseService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DanReportParseServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DataMigrationServiceTest.java` | cfc-backend | 11 | DataMigrationService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DataMigrationServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionEnergySyncServiceTest.java` | cfc-backend | 5 | DimensionEnergySyncService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionEnergySyncServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionScoreServiceTest.java` | cfc-backend | 21 | DimensionScoreService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DimensionScoreServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FamilyFoodOverviewServiceTest.java` | cfc-backend | 9 | FamilyFoodOverviewService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FamilyFoodOverviewServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FiveDimensionSelfCheckServiceTest.java` | cfc-backend | 2 | FiveDimensionSelfCheckService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FiveDimensionSelfCheckServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodRecommendServiceTest.java` | cfc-backend | 18 | FoodRecommendService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodRecommendServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodServiceTest.java` | cfc-backend | 12 | FoodService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FoodServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FortuneServiceTest.java` | cfc-backend | 4 | FortuneService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/FortuneServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideApplicationServiceTest.java` | cfc-backend | 8 | GuideApplicationService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideApplicationServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideFamilyServiceTest.java` | cfc-backend | 7 | GuideFamilyService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideFamilyServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideHierarchyServiceTest.java` | cfc-backend | 10 | GuideHierarchyService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideHierarchyServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuidePackageServiceTest.java` | cfc-backend | 13 | GuidePackageService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuidePackageServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuidePackageTemplateServiceTest.java` | cfc-backend | 6 | GuidePackageTemplateService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuidePackageTemplateServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/MiniGameServiceTest.java` | cfc-backend | 5 | MiniGameService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/MiniGameServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/NutritionDeficiencyServiceTest.java` | cfc-backend | 14 | NutritionDeficiencyService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/NutritionDeficiencyServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/PdfParseServiceTest.java` | cfc-backend | 11 | PdfParseService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/PdfParseServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/RelationshipQuestionnaireServiceTest.java` | cfc-backend | 5 | RelationshipQuestionnaireService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/RelationshipQuestionnaireServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ReportBlockAssemblerTest.java` | cfc-backend | 6 | ReportBlockAssembler | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ReportBlockAssemblerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceContentServiceTest.java` | cfc-backend | 6 | ServiceContentService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceContentServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceTypeServiceTest.java` | cfc-backend | 4 | ServiceTypeService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ServiceTypeServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/SupplySystemServiceTest.java` | cfc-backend | 18 | SupplySystemService | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/SupplySystemServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TaskServiceMinigameTest.java` | cfc-backend | 5 | TaskServiceMinigame | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TaskServiceMinigameTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TeacherLoginTest.java` | cfc-backend | 4 | TeacherLogin | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TeacherLoginTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/impl/DimensionScoreServiceImplTest.java` | cfc-backend | 6 | DimensionScoreServiceImpl | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/impl/DimensionScoreServiceImplTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java` | cfc-backend | 8 | OrchestrationEngine | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationIntegrationTest.java` | cfc-backend | 7 | Orchestration | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationIntegrationTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityOrderServiceTest.java` | cfc-backend | 15 | ActivityOrderService | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityOrderServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityRegistrationQuotaConcurrencyTest.java` | cfc-backend | 6 | ActivityRegistrationQuotaConcurrency | `cfc-backend/src/test/java/com/etotem/cfc/service/ActivityRegistrationQuotaConcurrencyTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/AiGatewayTimeoutTest.java` | cfc-backend | 1 | AiGatewayTimeout | `cfc-backend/src/test/java/com/etotem/cfc/service/AiGatewayTimeoutTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ArticleAudioServiceChunkFilterTest.java` | cfc-backend | 3 | ArticleAudioServiceChunkFilter | `cfc-backend/src/test/java/com/etotem/cfc/service/ArticleAudioServiceChunkFilterTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfBalanceServiceTest.java` | cfc-backend | 25 | CfBalanceService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfBalanceServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java` | cfc-backend | 12 | CfCommissionServiceSettle | `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceSettleTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceTest.java` | cfc-backend | 2 | CfCommissionService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfCommissionServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfEarnDispatchServiceTest.java` | cfc-backend | 8 | CfEarnDispatchService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfEarnDispatchServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfGrowthPathwayEarnServiceTest.java` | cfc-backend | 16 | CfGrowthPathwayEarnService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfGrowthPathwayEarnServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerMigrationServiceTest.java` | cfc-backend | 3 | CfLegacyLedgerMigrationService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerMigrationServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerWiringTest.java` | cfc-backend | 5 | CfLegacyLedgerWiring | `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerWiringTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfPathwayEarnServiceTest.java` | cfc-backend | 32 | CfPathwayEarnService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfPathwayEarnServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfReferralServiceSalesTierTest.java` | cfc-backend | 11 | CfReferralServiceSalesTier | `cfc-backend/src/test/java/com/etotem/cfc/service/CfReferralServiceSalesTierTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfSpendDispatchServiceTest.java` | cfc-backend | 11 | CfSpendDispatchService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfSpendDispatchServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CfTransferServiceTest.java` | cfc-backend | 6 | CfTransferService | `cfc-backend/src/test/java/com/etotem/cfc/service/CfTransferServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionDistService410Test.java` | cfc-backend | 4 | CommissionDistService410 | `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionDistService410Test.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionServiceReferralF24Test.java` | cfc-backend | 5 | CommissionServiceReferralF24 | `cfc-backend/src/test/java/com/etotem/cfc/service/CommissionServiceReferralF24Test.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ConsigneeServiceBackfillTest.java` | cfc-backend | 2 | ConsigneeServiceBackfill | `cfc-backend/src/test/java/com/etotem/cfc/service/ConsigneeServiceBackfillTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceFamilyTest.java` | cfc-backend | 2 | EnergyServiceFamily | `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceFamilyTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceWealthIncomeTest.java` | cfc-backend | 4 | EnergyServiceWealthIncome | `cfc-backend/src/test/java/com/etotem/cfc/service/EnergyServiceWealthIncomeTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyAdminOverviewServiceTest.java` | cfc-backend | 3 | FamilyAdminOverviewService | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyAdminOverviewServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyJoinRequestServiceReferrerBindTest.java` | cfc-backend | 5 | FamilyJoinRequestServiceReferrerBind | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyJoinRequestServiceReferrerBindTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyPlatformPointsServiceCouponTest.java` | cfc-backend | 5 | FamilyPlatformPointsServiceCoupon | `cfc-backend/src/test/java/com/etotem/cfc/service/FamilyPlatformPointsServiceCouponTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceAuditConfirmTest.java` | cfc-backend | 8 | HealthReportServiceAuditConfirm | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceAuditConfirmTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceBackfillResilienceTest.java` | cfc-backend | 5 | HealthReportServiceBackfillResilience | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceBackfillResilienceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceIndicatorsTest.java` | cfc-backend | 3 | HealthReportServiceIndicators | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceIndicatorsTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceTest.java` | cfc-backend | 8 | HealthReportService | `cfc-backend/src/test/java/com/etotem/cfc/service/HealthReportServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceSemanticTest.java` | cfc-backend | 20 | IndicatorChangeServiceSemantic | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceSemanticTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceTest.java` | cfc-backend | 23 | IndicatorChangeService | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorChangeServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorCorrelationServiceTest.java` | cfc-backend | 1 | IndicatorCorrelationService | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorCorrelationServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorFavoriteServiceTest.java` | cfc-backend | 6 | IndicatorFavoriteService | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorFavoriteServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorMappingServiceTest.java` | cfc-backend | 4 | IndicatorMappingService | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorMappingServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTimelineServiceTest.java` | cfc-backend | 12 | IndicatorTimelineService | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTimelineServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTrendServiceTest.java` | cfc-backend | 9 | IndicatorTrendService | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorTrendServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorValueMapperTest.java` | cfc-backend | 1 | IndicatorValueMapper | `cfc-backend/src/test/java/com/etotem/cfc/service/IndicatorValueMapperTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipPaySwitchTest.java` | cfc-backend | 6 | MembershipPaySwitch | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipPaySwitchTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipServiceTest.java` | cfc-backend | 17 | MembershipService | `cfc-backend/src/test/java/com/etotem/cfc/service/MembershipServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/NormalizeIndicatorPipelineTest.java` | cfc-backend | 3 | NormalizeIndicatorPipeline | `cfc-backend/src/test/java/com/etotem/cfc/service/NormalizeIndicatorPipelineTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/NumSoulCalculatorTest.java` | cfc-backend | 5 | NumSoulCalculator | `cfc-backend/src/test/java/com/etotem/cfc/service/NumSoulCalculatorTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/PaymentServiceORDRoutingTest.java` | cfc-backend | 3 | PaymentServiceORDRouting | `cfc-backend/src/test/java/com/etotem/cfc/service/PaymentServiceORDRoutingTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/PlatformPointsServiceTest.java` | cfc-backend | 9 | PlatformPointsService | `cfc-backend/src/test/java/com/etotem/cfc/service/PlatformPointsServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/PointsExchangeServiceTest.java` | cfc-backend | 4 | PointsExchangeService | `cfc-backend/src/test/java/com/etotem/cfc/service/PointsExchangeServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceFulfillmentMultiModeTest.java` | cfc-backend | 6 | ProductOrderServiceFulfillmentMultiMode | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceFulfillmentMultiModeTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceSpecialDealTest.java` | cfc-backend | 8 | ProductOrderServiceSpecialDeal | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceSpecialDealTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceUpdateExpressFieldTest.java` | cfc-backend | 3 | ProductOrderServiceUpdateExpressField | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceUpdateExpressFieldTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/RealNameBackfillServiceTest.java` | cfc-backend | 8 | RealNameBackfillService | `cfc-backend/src/test/java/com/etotem/cfc/service/RealNameBackfillServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` | cfc-backend | 6 | ReportAnalyzeQuotaService | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportAnalyzeQuotaServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` | cfc-backend | 6 | ReportDateExtractor | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportDateExtractorTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | cfc-backend | 1 | ReportSummaryServiceCompleteness | `cfc-backend/src/test/java/com/etotem/cfc/service/ReportSummaryServiceCompletenessTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | cfc-backend | 9 | SpecialPriceService | `cfc-backend/src/test/java/com/etotem/cfc/service/SpecialPriceServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | cfc-backend | 4 | TaskServiceCfEarn | `cfc-backend/src/test/java/com/etotem/cfc/service/TaskServiceCfEarnTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` | cfc-backend | 4 | TencentTtsServiceAuthorization | `cfc-backend/src/test/java/com/etotem/cfc/service/TencentTtsServiceAuthorizationTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` | cfc-backend | 2 | UserAddressServiceBackfill | `cfc-backend/src/test/java/com/etotem/cfc/service/UserAddressServiceBackfillTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | cfc-backend | 5 | UserServiceEffectiveFamilyIds | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` | cfc-backend | 2 | UserServiceFamilyNameLink | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` | cfc-backend | 4 | WishService | `cfc-backend/src/test/java/com/etotem/cfc/service/WishServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | cfc-backend | 6 | WithdrawalService | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | cfc-backend | 4 | CfGrowthEarnCallSite | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/PurchaseServiceImplRenewalTest.java` | cfc-backend | 4 | PurchaseServiceImplRenewal | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/PurchaseServiceImplRenewalTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/task/OrderTimeoutCancelTaskSpecialDealTest.java` | cfc-backend | 3 | OrderTimeoutCancelTaskSpecialDeal | `cfc-backend/src/test/java/com/etotem/cfc/task/OrderTimeoutCancelTaskSpecialDealTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/task/TaskCheckinWebhookReminderTaskTest.java` | cfc-backend | 7 | TaskCheckinWebhookReminderTask | `cfc-backend/src/test/java/com/etotem/cfc/task/TaskCheckinWebhookReminderTaskTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/task/VirtualPayTimeoutTaskTest.java` | cfc-backend | 5 | VirtualPayTimeoutTask | `cfc-backend/src/test/java/com/etotem/cfc/task/VirtualPayTimeoutTaskTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityAuditTest.java` | cfc-backend | 10 | ActivityAudit | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityAuditTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationListTest.java` | cfc-backend | 3 | ActivityRegistrationList | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationListTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationQuotaUnitTest.java` | cfc-backend | 8 | ActivityRegistrationQuotaUnit | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationQuotaUnitTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationRejectTest.java` | cfc-backend | 3 | ActivityRegistrationReject | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityRegistrationRejectTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTagServiceTest.java` | cfc-backend | 5 | ActivityTagService | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTagServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTeamServiceUnitTest.java` | cfc-backend | 12 | ActivityTeamServiceUnit | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTeamServiceUnitTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleAutoTagServiceTest.java` | cfc-backend | 8 | ArticleAutoTagService | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleAutoTagServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleBackfillTest.java` | cfc-backend | 2 | ArticleBackfill | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleBackfillTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleRelatedServiceTest.java` | cfc-backend | 6 | ArticleRelatedService | `cfc-backend/src/test/java/com/etotem/cfc/unit/ArticleRelatedServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionAdjustServiceTest.java` | cfc-backend | 5 | AttributionAdjustService | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionAdjustServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPipelineMockTest.java` | cfc-backend | 2 | AttributionPipelineMock | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPipelineMockTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPlanServiceTest.java` | cfc-backend | 2 | AttributionPlanService | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionPlanServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionRedlinesTest.java` | cfc-backend | 8 | AttributionRedlines | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionRedlinesTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/CartReplaceComboTest.java` | cfc-backend | 5 | CartReplaceCombo | `cfc-backend/src/test/java/com/etotem/cfc/unit/CartReplaceComboTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java` | cfc-backend | 8 | CfBalanceController | `cfc-backend/src/test/java/com/etotem/cfc/unit/CfBalanceControllerTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboOfferCalculatorTest.java` | cfc-backend | 8 | ComboOfferCalculator | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboOfferCalculatorTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboOrderStockTest.java` | cfc-backend | 3 | ComboOrderStock | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboOrderStockTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboServiceTest.java` | cfc-backend | 10 | ComboService | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionEvaluatorServiceTest.java` | cfc-backend | 12 | ConditionEvaluatorService | `cfc-backend/src/test/java/com/etotem/cfc/unit/ConditionEvaluatorServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | cfc-backend | 7 | FamilyMemberDimensionBaseScoreService | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberServiceRenameTest.java` | cfc-backend | 4 | FamilyMemberServiceRename | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberServiceRenameTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` | cfc-backend | 5 | FamilyNamingSupport | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyNamingSupportTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | cfc-backend | 12 | FiveDimensionScoreService | `cfc-backend/src/test/java/com/etotem/cfc/unit/FiveDimensionScoreServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | cfc-backend | 9 | GuideFamilyAccessGuard | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | cfc-backend | 4 | GuideFamilyQueryService | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` | cfc-backend | 3 | GuideFamilyServiceBind | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuidePlanReviewControllerAuthTest.java` | cfc-backend | 6 | GuidePlanReviewControllerAuth | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuidePlanReviewControllerAuthTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` | cfc-backend | 6 | HealthPlanDeleteCascade | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` | cfc-backend | 5 | HealthPlanLazyBackfill | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanLazyBackfillTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | cfc-backend | 10 | HealthPlanReviewGuard | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanReviewGuardTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | cfc-backend | 9 | KnowledgeBaseBackfill | `cfc-backend/src/test/java/com/etotem/cfc/unit/KnowledgeBaseBackfillTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | cfc-backend | 6 | MemberPriceResolver | `cfc-backend/src/test/java/com/etotem/cfc/unit/MemberPriceResolverTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDTOMappingTest.java` | cfc-backend | 3 | ProductDTOMapping | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductDTOMappingTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductListNutritionTagFilterTest.java` | cfc-backend | 2 | ProductListNutritionTagFilter | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductListNutritionTagFilterTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductUpdateClearTest.java` | cfc-backend | 5 | ProductUpdateClear | `cfc-backend/src/test/java/com/etotem/cfc/unit/ProductUpdateClearTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/RecommendationNutritionTagTest.java` | cfc-backend | 1 | RecommendationNutritionTag | `cfc-backend/src/test/java/com/etotem/cfc/unit/RecommendationNutritionTagTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/RepeatTaskGeneratorPassThroughTest.java` | cfc-backend | 3 | RepeatTaskGeneratorPassThrough | `cfc-backend/src/test/java/com/etotem/cfc/unit/RepeatTaskGeneratorPassThroughTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ReviewCenterSummaryTest.java` | cfc-backend | 3 | ReviewCenterSummary | `cfc-backend/src/test/java/com/etotem/cfc/unit/ReviewCenterSummaryTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | cfc-backend | 6 | ServiceRoleApprove | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleApproveTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` | cfc-backend | 3 | ServiceRoleFilter | `cfc-backend/src/test/java/com/etotem/cfc/unit/ServiceRoleFilterTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` | cfc-backend | 4 | TaskPlanService | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskPlanServiceTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` | cfc-backend | 3 | TaskProgressUpdate | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskProgressUpdateTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/util/CfFormulaEvaluatorTest.java` | cfc-backend | 8 | CfFormulaEvaluator | `cfc-backend/src/test/java/com/etotem/cfc/util/CfFormulaEvaluatorTest.java` | | `cfc-backend/src/test/java/com/etotem/cfc/util/SpearmanUtilTest.java` | cfc-backend | 6 | SpearmanUtil | `cfc-backend/src/test/java/com/etotem/cfc/util/SpearmanUtilTest.java` | ## 六、用户场景(`tests/user-scenarios/*.md`,上游输入) | 文件 | 来源 | | --- | --- | | `tests/user-scenarios/01-guest.md` | `tests/user-scenarios/01-guest.md` | | `tests/user-scenarios/02-parent.md` | `tests/user-scenarios/02-parent.md` | | `tests/user-scenarios/03-child.md` | `tests/user-scenarios/03-child.md` | | `tests/user-scenarios/04-teacher.md` | `tests/user-scenarios/04-teacher.md` | | `tests/user-scenarios/05-admin.md` | `tests/user-scenarios/05-admin.md` | | `tests/user-scenarios/06-vendor.md` | `tests/user-scenarios/06-vendor.md` | | `tests/user-scenarios/README.md` | `tests/user-scenarios/README.md` | | `tests/user-scenarios/应用场景总览.md` | `tests/user-scenarios/应用场景总览.md` | ## 七、回写进展机制(不破坏原项目结构) 进度**不写回** `tests/` 与 `cfc-backend/src/test/java` 下的原始测试文件,而是落在本地侧车: ```json // .tdd/test-progress.json(与 config.json 同目录,本地不推送) { "schema": "tdd-test-progress/v1", "sources": [ { "anchor", "source_type", "source_path", "local_id", ...meta }, ... ], "progress": { "": { "status": "pass|fail|executed|blocked|untracked", "at": ISO, "by": "", "note": "" } } } ``` - `anchor` = `source_path#local_id`(如 `tests/test-cases/admin.md#TC-A-01`)。 - 回写时仅更新 `progress[anchor]`;原始 `.md/.spec.js/.py` 一律不动,原项目结构零侵入。 - 用 `test_inventory.py --emit-progress` 可(重新)播种 anchors(保留已有 progress)。 - **共享自动化状态**:本脚本默认生成 `docs/tdd/test/automation-status.md`(团队共享),按 anchor 标注「自动化状态 + 执行状态」;本地侧车 `.tdd/test-progress.json` 不推送。