TASK-P0-002-wealth-dimension-split.md 7.8 KB

P0 任务工作票 — 富维度子维度拆分 + 身克富杠杆

任务 ID: TASK-P0-002
优先级: P0(阻塞性)
预计工时: 2-3 天(后端 2d + 前端 1d)
状态: 待开始
负责人: 待分配
关联文档: plans/2026-07-12-wealth-dimension-redesign.md


业务背景

当前"富"维度的问题:

  1. 成人和孩子的"富"混为一谈——成人=积分总量/500,孩子=积分获取效率,没有差异化的"富"定义
  2. 缺少身克富的系统体现——相克关系只有文档,没有在能量计算和前端落地
  3. 小程序富页面是大杂烢——显示的是"行动数据"和"成长报告",与"富"无关

本任务重构 EnergyServicecalcChildWealth / calcParentWealth,拆为子维度,实现身克富杠杆,并重写富页面。


范围

包含

  • 后端 MemberEnergyDTO 新增子维度字段和身克富字段
  • EnergyService.calcChildWealth / calcParentWealth 重构为子维度加权
  • 新增 applyBodyWealthRestraint() 身克富杠杆算法
  • 新增 POST /api/energy/wealth-detail API
  • 小程序 pages/wealth/index.vue 完全重写(角色感知)
  • 新建 WealthSubScores.vueBodyWealthAlert.vue 组件

不包含

  • 成就/网络录入接口(第一阶段占位返回 0)
  • 新数据库表(不改变 schema)
  • 章鱼图(FamilyRelationGraph)集成(Phase 3)
  • 圈子系统(Phase 2)

技术方案

数据模型

MemberEnergyDTO 新增字段

// 富的子维度(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%)

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%)

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 显示成人/孩子子维度
[增值服务入口]  记账打卡 / 保单管理 / 创客中心 / 成就系统 / 成长报告
[底部菜单]      精简后的操作入口

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)

测试策略

后端单元测试

@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 为三者之一
}

前端 E2E 测试

  • 访问富页面,验证子维度卡片数量(家长 3 个,孩子 3 个)
  • 触发身克富条件(修改 mock 数据),验证预警条显示
  • 点击子维度卡片,验证跳转(或占位提示)

部署检查清单

  • 后端 MemberEnergyDTO 序列化兼容性测试(旧客户端不崩溃)
  • 小程序富页面灰度发布(10% 用户)
  • 监控指标:wealth_detail_durationbody_wealth_restraint_count
  • 回滚方案:旧富页面代码保留在 pages/wealth/index.legacy.vue

风险与缓解

风险 影响 缓解
子维度权重争议 用户感知不公平 产品经理确认权重,提供 A/B 测试开关
身克富算法引发用户不满 用户体验下降 消息文案温和化,提供"了解更多"说明页
成就/网络数据缺失导致显示 0 用户困惑 显示"暂无数据"占位符,不显示 0
富页面重写引入回归 功能缺失 逐项对照旧页面功能清单,确保无遗漏

后续迭代(Phase 3)

  • 成就录入接口(家长填写成就,系统评分)
  • 资源网络可视化(章鱼图嵌入富页面)
  • 圈子系统集成(显示参与中的圈子)
  • 身克富正向激励(身体优秀时财富加成)

文档结束