# P0 任务工作票 — 富维度子维度拆分 + 身克富杠杆 **任务 ID:** TASK-P0-002 **优先级:** P0(阻塞性) **预计工时:** 2-3 天(后端 2d + 前端 1d) **状态:** 待开始 **负责人:** 待分配 **关联文档:** `plans/2026-07-12-wealth-dimension-redesign.md` --- ## 业务背景 当前"富"维度的问题: 1. **成人和孩子的"富"混为一谈**——成人=积分总量/500,孩子=积分获取效率,没有差异化的"富"定义 2. **缺少身克富的系统体现**——相克关系只有文档,没有在能量计算和前端落地 3. **小程序富页面是大杂烢**——显示的是"行动数据"和"成长报告",与"富"无关 本任务重构 `EnergyService` 中 `calcChildWealth` / `calcParentWealth`,拆为子维度,实现身克富杠杆,并重写富页面。 --- ## 范围 ### 包含 - 后端 `MemberEnergyDTO` 新增子维度字段和身克富字段 - `EnergyService.calcChildWealth` / `calcParentWealth` 重构为子维度加权 - 新增 `applyBodyWealthRestraint()` 身克富杠杆算法 - 新增 `POST /api/energy/wealth-detail` API - 小程序 `pages/wealth/index.vue` 完全重写(角色感知) - 新建 `WealthSubScores.vue`、`BodyWealthAlert.vue` 组件 ### 不包含 - 成就/网络录入接口(第一阶段占位返回 0) - 新数据库表(不改变 schema) - 章鱼图(FamilyRelationGraph)集成(Phase 3) - 圈子系统(Phase 2) --- ## 技术方案 ### 数据模型 #### MemberEnergyDTO 新增字段 ```java // 富的子维度(parent) private Integer wealthIncome; // 金钱/收入(现有积分算法) private Integer wealthAchievement; // 社会成就(User.achievements JSON,第一阶段 0) private Integer wealthNetwork; // 资源网络(推荐团队人数,第一阶段 0) // 富的子维度(child) private Integer wealthEducation; // 学业成绩(DanAssessmentResult 最近3次综合分+趋势) private Integer wealthSocial; // 社交筹码(活动参与次数,第一阶段 0) private Integer wealthPoints; // 规则博弈(现有积分效率逻辑) // 身克富标记 private String bodyWealthStatus; // normal / overdraw / penalty private String bodyWealthMessage; // 用户可见的消息 ``` ### 算法设计 #### 孩子富计算(权重:教育 30% + 社交 20% + 积分 50%) ```java calcChildWealth(child, dto) { dto.wealthEducation = calcChildWealthEducation(child); // DanAssessmentResult dto.wealthSocial = calcChildWealthSocial(child); // 活动参与次数 dto.wealthPoints = calcChildWealthPoints(child); // 现有积分效率 return weightedSum(education*0.3, social*0.2, points*0.5); } ``` #### 成人富计算(权重:收入 50% + 成就 30% + 网络 20%) ```java calcParentWealth(parent, dto) { dto.wealthIncome = calcParentWealthIncome(parent); // 现有积分算法 dto.wealthAchievement = calcParentWealthAchievement(parent); // User.achievements dto.wealthNetwork = calcParentWealthNetwork(parent); // 推荐团队人数 return weightedSum(income*0.5, achievement*0.3, network*0.2); } ``` #### 身克富杠杆 ```java applyBodyWealthRestraint(bodyScore, wealthScore, dto) { if (bodyScore < 40) { dto.bodyWealthStatus = "penalty"; dto.bodyWealthMessage = "健康基础薄弱,财富能量被稀释"; return wealthScore * (0.5 + 0.5 * bodyScore / 100); // 打 5-9 折 } else if (bodyScore < 50 && wealthScore > bodyScore + 20) { dto.bodyWealthStatus = "overdraw"; dto.bodyWealthMessage = "身体健康与财富能量不匹配,注意透支风险"; return wealthScore; // 不下调,仅预警 } else { dto.bodyWealthStatus = "normal"; dto.bodyWealthMessage = bodyScore >= 70 ? "身体底盘稳固,财富能量健康" : null; return wealthScore; } } ``` ### 前端页面布局 ``` [PageBanner] "利他创富 · 价值共享" [身克富状态条] 身体分解 + 财力素养 + 消息行 [三子维度卡片] 根据 role 显示成人/孩子子维度 [增值服务入口] 记账打卡 / 保单管理 / 创客中心 / 成就系统 / 成长报告 [底部菜单] 精简后的操作入口 ``` --- ## API 设计 ### 新增端点 ``` POST /api/energy/wealth-detail 请求: { memberId: Long, memberType: "parent" | "child" } 响应: MemberEnergyDTO(包含所有子维度 + 身克富字段) ``` ### 修改端点 | 端点 | 改动 | 说明 | |------|------|------| | `POST /api/energy/overview` | 响应 `energy.wealth` 字段改为总分(不变) | 保持向后兼容 | | `POST /api/energy/detail` | 响应增加子维度字段(可选) | 可选扩展 | --- ## 验收标准 ### 功能验收 - [ ] 家长端富页面显示 3 个子维度卡片:金钱/收入、社会成就、资源网络 - [ ] 孩子端富页面显示 3 个子维度卡片:学业成绩、社交筹码、规则博弈 - [ ] 身克富状态条正确显示身体和财富进度条 + 状态消息 - [ ] 身克富三种状态可触发(normal/overdraw/penalty) - [ ] 点击子维度卡片可跳转详情页(占位即可) - [ ] 原"行动数据"区块已移除 ### 数据验收 - [ ] `wealthEducation` 从 DanAssessmentResult 计算(最近 3 次测评) - [ ] `wealthPoints` 从现有积分效率逻辑计算 - [ ] `wealthIncome` 从现有积分总量计算 - [ ] 未实现子维度(achievement/network/social)返回 0 ### 性能验收 - [ ] 财富详情 API 响应时间 ≤ 300ms - [ ] 富页面首屏加载时间 ≤ 1.5s - [ ] 无内存泄漏(连续切换角色 10 次) ### 代码质量验收 - [ ] 后端单元测试覆盖率 ≥ 80%(EnergyService 新增方法) - [ ] 前端组件单元测试(可选,≥ 50%) - [ ] LSP 诊断零错误 - [ ] 无 AI slop 模式(可选链、CSS Grid) --- ## 测试策略 ### 后端单元测试 ```java @Test void calcChildWealth_shouldWeightCorrectly() { // 教育 30% + 社交 20% + 积分 50% // 验证加权计算精度(保留整数) } @Test void applyBodyWealthRestraint_penaltyTriggered() { // bodyScore=35, wealthScore=80 // 预期: status=penalty, wealth=80*(0.5+0.5*35/100)=67 } @Test void applyBodyWealthRestraint_overdrawTriggered() { // bodyScore=45, wealthScore=80 // 预期: status=overdraw, wealth=80(不下调) } ``` ### 集成测试 ```java @Test void wealthDetailApi_shouldReturnSubScores() { // 调用 POST /api/energy/wealth-detail // 验证响应包含所有子维度字段 // 验证 bodyWealthStatus 为三者之一 } ``` ### 前端 E2E 测试 - 访问富页面,验证子维度卡片数量(家长 3 个,孩子 3 个) - 触发身克富条件(修改 mock 数据),验证预警条显示 - 点击子维度卡片,验证跳转(或占位提示) --- ## 部署检查清单 - [ ] 后端 `MemberEnergyDTO` 序列化兼容性测试(旧客户端不崩溃) - [ ] 小程序富页面灰度发布(10% 用户) - [ ] 监控指标:`wealth_detail_duration`、`body_wealth_restraint_count` - [ ] 回滚方案:旧富页面代码保留在 `pages/wealth/index.legacy.vue` --- ## 风险与缓解 | 风险 | 影响 | 缓解 | |------|------|------| | 子维度权重争议 | 用户感知不公平 | 产品经理确认权重,提供 A/B 测试开关 | | 身克富算法引发用户不满 | 用户体验下降 | 消息文案温和化,提供"了解更多"说明页 | | 成就/网络数据缺失导致显示 0 | 用户困惑 | 显示"暂无数据"占位符,不显示 0 | | 富页面重写引入回归 | 功能缺失 | 逐项对照旧页面功能清单,确保无遗漏 | --- ## 后续迭代(Phase 3) - [ ] 成就录入接口(家长填写成就,系统评分) - [ ] 资源网络可视化(章鱼图嵌入富页面) - [ ] 圈子系统集成(显示参与中的圈子) - [ ] 身克富正向激励(身体优秀时财富加成) --- **文档结束**