来源:
EnergyController(/api/energy/*)、EnergyRuleEngine、EnergyService、DimensionDailyLimit、EnergyBalance/EnergyLog、AttributionWeights、ManualDimensionScoreController、FiveDimensionSelfCheckController、HealthReportController、AssessmentAppointmentService、DailyCheckinService、GameRecordService、GrowthTaskService、ArticleService/ActivityService。 关联用例:test-cases/*.md的SC-P-87~93/SC-C-24~25/SC-T-30~32/SC-A-25~26/SC-X-19~21。 设计原则:本文件补齐「五维指标变化」专项——即指标如何随行为触发、如何按规则归因/限流/刷新/重算、如何溯源与隔离,与应用场景总览.md中仅"查看/流水/配置查看"的SC-P-17/18/19形成闭环。异常流口径:下列每条场景均给出「具体故障注入 + 可判定断言」,不再使用"系统给出明确错误提示而非 500"等模板文案。
用户故事:作为家长,我希望孩子每完成一项任务,对应维度的五维能量能按规则准确增加,并能追溯到来源,以便激励可视化、可核对。
EnergyRuleEngine 已配置任务→维度归因规则;B 当前各维度 EnergyBalance.balance 已知。POST /api/task/approve 通过审批(TaskController/PointsController)。EnergyRuleEngine 将任务类型映射到的维度(身/心/智/行/富之一或多)增加 amount。EnergyLog:memberId=B、dimensionId、正 amount、balanceAfter、 sourceType=task、sourceId=任务实例ID。EnergyBalance.balance 与 totalEarned 同步 +amount;概览/沙盘随新值刷新。EnergyLog 不产生第二条。sourceType=task 但不加(按规则),不得 500。amount 计算异常(规则返回 null/负):拒绝执行并告警,不写脏流水。用户故事:作为家长,我希望孩子用能量兑换心愿时,对应维度能量被正确扣减且永不为负,以便账目可信。
balance ≥ 兑换额,另造一条 balance 不足的对照用例。POST /api/energy/deduct-for-wish。balance ≥ 兑换额 后扣减,EnergyLog 记负 amount、balanceAfter = balance - 兑换额。balance 与 totalSpent 同步更新;心愿置为"已兑换"。deduct-for-wish 参数非法(空 wishId/非本家庭心愿):400,不扣减。用户故事:作为家长或运营,我希望能手动给家庭成员某个维度加能量(奖励/补偿),并留痕可查。
POST /api/energy/grant 可用。POST /api/energy/grant 指定 memberId、维度、amount、备注。EnergyLog:sourceType=manual,balanceAfter 更新;EnergyBalance 同步 +amount。dimensionCode 不存在):400,不写脏数据。用户故事:作为家长,我希望每个维度每天获取的能量有上限,避免刷分,次日自动重置。
DimensionDailyLimit 已配置某维度 dailyLimit=N;B 当日该维度已累计接近 N。dailyLimit 后,新增触发不再累加(或按规则截断到上限)。用户故事:作为家长/规划师,我希望菌群/健康报告确认入库后,五维(及七维/六维健康维度)评分被刷新,并能看到前后变化与趋势。
SC-P-22/SC-T-03)。SC-P-23/SC-T-03)→ HealthReportController 解析结果写入 HealthDimensionScore(七维/六维)。score-history 按新评分重算。POST /api/energy/score-history、/family-score-history 可拉取时间序列,趋势图反映改善。tests/e2e/flora-microbiome-flow.spec.js、health-report-audit.spec.js)用户故事:作为家长/运营,我希望调整维度权重或能量来源比例后,概览/沙盘/家庭天盘按新权重重算,且存量数据有提示。
configureSourceRatios、权重 CRUD)POST /api/energy/configure 与维度权重配置可用;存量能量数据存在。tests/e2e/energy-rules-config.spec.js)用户故事:作为家长/孩子,我希望发表/评论文章、参与平台活动也能获得能量,但受每日上限约束。
ArticleService/ActivityService 能量发放规则已配置;当日维度未触顶。EnergyRuleEngine 对应维度 +amount。EnergyLog(sourceType=article/activity);balanceAfter 更新。DailyLimit:不再累加。用户故事:作为孩子,我希望玩游戏/完成任务获得的能量只加在我自己身上,且我只能看到自己的变化。
GameRecordService/TaskController 上报成绩 → 对应维度 +amount。tests/e2e/mini-games.spec.js、points-system.spec.js)用户故事:作为孩子,我希望按成长方案打卡后获得对应维度能量,进度与能量同步。
SC-C-05);打卡接口可用。GrowthTaskService)。EnergyLog 记录;任务进度与能量同步刷新。tests/e2e/daily-checkin-streak.spec.js、growth-record-sync.spec.js)用户故事:作为规划师,我希望录入孩子测评各维度分后,五维评分按规则引擎更新并生成方案。
AssessmentAppointmentService 规则引擎已配置 DAN 八类→五维映射。SC-T-07)→ 保存。generated 方案;五维概览/沙盘刷新。tests/e2e/dan-report-flow.spec.js、dan-assessment-vendor-flow.spec.js)用户故事:作为规划师,我希望能手动调整某成员某维度分(覆盖当前值),并保留调整痕迹。
ManualDimensionScoreController 可用;目标成员 B 当前维度分已知。用户故事:作为孩子(或规划师代填),我希望通过五维自评微调自身维度,并仅本人/绑定家庭可见。
FiveDimensionSelfCheckController 可用。FiveDimensionSelfCheck 记录。用户故事:作为运营,我希望能增删改维度、权重、每日上限配置,并让变更安全生效、影响后续计算。
DimensionDailyLimit 配置管理接口可用。tests/e2e/energy-rules-config.spec.js)用户故事:作为运营,我希望治理能量来源比例与归因权重这一全局配置,变更有审计、影响可观测。
AttributionWeights / configureSourceRatios 全局配置可用。用户故事:作为任一方,我只能访问本家庭/绑定家庭成员的能量与流水;任何横向越权都被拒。
tests/e2e/api/nonfunc-security.spec.js)用户故事:作为对账方,我希望每条能量流水的 balanceAfter 都等于上一笔 balanceAfter + amount,且 totalEarned - totalSpent = balance,不一致即报警。
EnergyLog 按时间排序,逐条校验 balanceAfter == prevBalanceAfter + amount。EnergyBalance.totalEarned - totalSpent == balance。amount 流水,余额不为负。用户故事:作为系统,我希望同一成员同一维度被任务/打卡/小游戏/活动并发触发时,不超日上限、不重复加、余额一致。
DailyLimit、无重复加、最终 balance 与流水合计一致。tests/e2e/api/nonfunc-perf-compat.spec.js、energy-system.spec.js)