任务 ID: TASK-P0-002
优先级: P0(阻塞性)
预计工时: 2-3 天(后端 2d + 前端 1d)
状态: 待开始
负责人: 待分配
关联文档: plans/2026-07-12-wealth-dimension-redesign.md
当前"富"维度的问题:
本任务重构 EnergyService 中 calcChildWealth / calcParentWealth,拆为子维度,实现身克富杠杆,并重写富页面。
MemberEnergyDTO 新增子维度字段和身克富字段EnergyService.calcChildWealth / calcParentWealth 重构为子维度加权applyBodyWealthRestraint() 身克富杠杆算法POST /api/energy/wealth-detail APIpages/wealth/index.vue 完全重写(角色感知)WealthSubScores.vue、BodyWealthAlert.vue 组件// 富的子维度(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; // 用户可见的消息
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);
}
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);
}
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 显示成人/孩子子维度
[增值服务入口] 记账打卡 / 保单管理 / 创客中心 / 成就系统 / 成长报告
[底部菜单] 精简后的操作入口
POST /api/energy/wealth-detail
请求: { memberId: Long, memberType: "parent" | "child" }
响应: MemberEnergyDTO(包含所有子维度 + 身克富字段)
| 端点 | 改动 | 说明 |
|---|---|---|
POST /api/energy/overview |
响应 energy.wealth 字段改为总分(不变) |
保持向后兼容 |
POST /api/energy/detail |
响应增加子维度字段(可选) | 可选扩展 |
wealthEducation 从 DanAssessmentResult 计算(最近 3 次测评)wealthPoints 从现有积分效率逻辑计算wealthIncome 从现有积分总量计算@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(不下调)
}
@Test
void wealthDetailApi_shouldReturnSubScores() {
// 调用 POST /api/energy/wealth-detail
// 验证响应包含所有子维度字段
// 验证 bodyWealthStatus 为三者之一
}
MemberEnergyDTO 序列化兼容性测试(旧客户端不崩溃)wealth_detail_duration、body_wealth_restraint_countpages/wealth/index.legacy.vue| 风险 | 影响 | 缓解 |
|---|---|---|
| 子维度权重争议 | 用户感知不公平 | 产品经理确认权重,提供 A/B 测试开关 |
| 身克富算法引发用户不满 | 用户体验下降 | 消息文案温和化,提供"了解更多"说明页 |
| 成就/网络数据缺失导致显示 0 | 用户困惑 | 显示"暂无数据"占位符,不显示 0 |
| 富页面重写引入回归 | 功能缺失 | 逐项对照旧页面功能清单,确保无遗漏 |
文档结束