版本: v1.0 日期: 2026-09-09 状态: 待审查 关联需求: 用户需求记录
用户故事:
作为家长用户,我想在「我的」页面查看我的推荐人、分享人数、团队层级树(从下往上生长)、团队总消费额、直推成员的消费额和我获得的 CF 值,以便直观了解我的推广成果与团队结构。
核心目标:
referral-code-bar 区块)/pages/profile/team-tree)POST /api/commission/team/list 扩展:返回中每个成员新增 memberConsumption、myCfEarnedFromMemberPOST /api/commission/team/consumption 新增:团队总消费额分级汇总POST /api/commission/my-referrer 新增:获取我的推荐人信息POST /api/commission/team/tree 新增:团队树形扁平数据(含层级、父子关系)| 表 | 关键字段 | 用途 |
|---|---|---|
users |
id, referrerId, referralCode, nickname, avatar, created_at |
用户与推荐关系 |
referral_tree |
parentId, childId, level, path |
物化全层级推荐树 |
product_orders |
buyerId, totalAmount, status, fulfillStatus, paidAt |
消费订单(fulfillStatus=completed 表示已完成履约) |
commission_records |
referrerId, buyerId, commissionAmount, level, status |
佣金记录(L1/L2;status=settled/cancelled) |
user_platform_balance |
userId, totalEarned, available, frozen, withdrawn |
CF 值钱包(现有,本需求不直接读) |
cf_rate_tier |
minTeamSize, ratePercent, enabled |
返佣阶梯(现有,复用其 maxLevel 配置) |
注:
referral_tree.level= 代际差(1=直推,2=间推...);commission_records.level= 1/2(仅 L1/L2 结算佣金);订单完成以fulfillStatus = 'completed'为准。
/api/commission/team/list请求: { page, size, level }(level: ALL/L1/L2)
响应扩展字段:
{
"records": [
{
"userId": 123,
"nickname": "用户名",
"avatarUrl": "https://...",
"createdAt": "2026-01-01",
"orderCount": 5,
"commissionEarned": 15000,
"memberConsumption": 32000, // 新增:该成员 completed 订单总额
"myCfEarnedFromMember": 9600 // 新增:我从该成员消费获得的 CF(佣金)总额
}
],
"total": 10,
"page": 1,
"size": 20
}
实现逻辑:
memberConsumption:查 product_orders 表 buyerId = 该成员 且 fulfillStatus = 'completed' 的 totalAmount 总和(仅统计已完成履约的订单)myCfEarnedFromMember:查 commission_records 表 referrerId = 我 且 buyerId = 该成员 且 status != 'cancelled' 的 commissionAmount 总和(含 settled + pending)/api/commission/team/consumption请求: { maxLevel: 3 }(默认 3,可选)
响应:
{
"totalConsumption": 125000,
"levelBreakdown": [
{ "level": 1, "memberCount": 5, "consumption": 80000 },
{ "level": 2, "memberCount": 12, "consumption": 35000 },
{ "level": 3, "memberCount": 8, "consumption": 10000 }
],
"totalMembers": 25,
"maxLevel": 3
}
实现逻辑:
referral_tree 表 parentId = 我 且 level <= maxLevel 的所有 childIdlevel 分组统计 memberCountchildId 的 product_orders(fulfillStatus = 'completed')totalAmount 总和,按 level 汇总配置化:
cf_rate_tier 表中 enabled=1 的记录,或新增 commission_config 表存储 team_consumption_max_level(默认 3)POST /api/admin/cf-rate-tier/setting(扩展现有)或新增/api/commission/my-referrer请求: 空
响应:
{
"referrerId": 456,
"nickname": "推荐人昵称",
"avatar": "https://...",
"referralCode": "ABC123XY",
"bindTime": "2026-01-15 10:30:00"
}
实现逻辑:
users 表 id = 当前用户.referrerIdreferrerId 为空,返回 { hasReferrer: false }/api/commission/team/tree请求: { maxLevel: 3 }(默认 3)
响应:
{
"nodes": [
{ "userId": 101, "nickname": "直推A", "avatar": "https://...", "level": 1, "parentId": 100, "referrerId": 100, "memberConsumption": 32000, "myCfEarnedFromMember": 9600 },
{ "userId": 102, "nickname": "间推B", "avatar": "https://...", "level": 2, "parentId": 101, "referrerId": 101, "memberConsumption": 8000, "myCfEarnedFromMember": 2400 },
{ "userId": 103, "nickname": "直推C", "avatar": "https://...", "level": 1, "parentId": 100, "referrerId": 100, "memberConsumption": 15000, "myCfEarnedFromMember": 4500 }
],
"totalMembers": 3,
"maxLevel": 3
}
说明:
nodes数组不包含根节点("我")——仅包含 team 成员(level >= 1);根节点仅用于前端统计/上下文。每个节点已包含memberConsumption(该成员自身已完成履约订单总额)和myCfEarnedFromMember(我从该成员消费获得的 CF 总额)。前端按parentId递归构建树,level用于层级标签与缩进。
| 文件 | 变更类型 | 详情 |
|---|---|---|
pages/wealth/index.vue |
删除 | 移除 referral-code-bar(第 161-165 行) |
pages/profile-main/profile.vue |
新增 | 1.「我的推荐人」卡片 2.「团队层级」入口按钮 → navigateTo('/pages/profile/team-tree') |
pages/profile/team-tree.vue |
新建 | 树形页面: - 顶部统计卡(总消费、人数) - 树形组件(从下往上生长,flex column-reverse + 递归) - 节点组件:头像、昵称、层级标签、消费额、我的 CF 获得 - 折叠/展开交互 |
utils/api.js |
新增 | getTeamConsumption(maxLevel)、getMyReferrer()、getTeamTree(maxLevel)、getTeamList 扩展字段 |
pages.json |
注册 | 新增 pages/profile/team-tree 页面 |
树形 UI 实现思路(从下往上生长):
<!-- 树形容器:flex column-reverse,L1节点在底部,分支向上延伸 -->
<view class="tree-container" style="flex-direction: column-reverse;">
<!-- L1节点作为根:扁平 nodes 先按 parentId 组装为树,再渲染 -->
<TreeNode v-for="root in level1Roots" :key="root.userId" :node="root" :level="1" :maxLevel="maxLevel" />
</view>
<!-- TreeNode.vue -->
<view class="tree-node" :style="{ 'padding-left': (level - 1) * 30 + 'rpx' }">
<view class="node-main" @click="toggle">
<image :src="node.avatar" />
<text>{{ node.nickname }}</text>
<tag>L{{ node.level }}</tag>
<text class="consumption">消费: ¥{{ (node.memberConsumption/100).toFixed(2) }}</text>
<text class="my-cf">我得CF: ¥{{ (node.myCfEarnedFromMember/100).toFixed(2) }}</text>
<icon :name="expanded ? 'up' : 'down'" />
</view>
<!-- 子节点:因为父容器 column-reverse,子节点会在上方渲染 -->
<view v-if="expanded && node.children" class="children">
<TreeNode v-for="child in node.children" :key="child.userId" :node="child" :level="level+1" :maxLevel="maxLevel" />
</view>
<!-- 连接线:::before 画竖线,父节点中心向上 -->
</view>
新增 Service 方法(CommissionService):
// 1. 团队消费统计
public Map<String, Object> getTeamConsumption(Long userId, Integer maxLevel)
// 2. 我的推荐人
public Map<String, Object> getMyReferrer(Long userId)
// 3. 团队树形数据
public Map<String, Object> getTeamTree(Long userId, Integer maxLevel)
// 4. 扩展 getTeamList:查询 memberConsumption、myCfEarnedFromMember
依赖注入需补充:
ProductOrderMapperReferralTreeMapperUserPlatformBalanceMapper(如需)新增 Controller 方法(CommissionController):
@PostMapping("/team/consumption")
public Result<Map<String, Object>> teamConsumption(@RequestAttribute("userId") Long userId,
@RequestBody Map<String, Object> params)
@PostMapping("/my-referrer")
public Result<Map<String, Object>> myReferrer(@RequestAttribute("userId") Long userId)
@PostMapping("/team/tree")
public Result<Map<String, Object>> teamTree(@RequestAttribute("userId") Long userId,
@RequestBody Map<String, Object> params)
| 接口 | 方法 | 请求体 | 响应关键字段 | 备注 |
|---|---|---|---|---|
/api/commission/team/list |
POST | {page,size,level} |
records[].memberConsumption, records[].myCfEarnedFromMember |
扩展现有 |
/api/commission/team/consumption |
POST | {maxLevel} |
totalConsumption, levelBreakdown[], totalMembers |
新增 |
/api/commission/my-referrer |
POST | {} |
referrerId, nickname, avatar, referralCode, bindTime |
新增 |
/api/commission/team/tree |
POST | {maxLevel} |
nodes[], totalMembers |
新增 |
| 配置键 | 默认值 | 说明 | 维护位置 |
|---|---|---|---|
team_consumption_max_level |
3 | 团队消费统计最大层级 | 后台管理 - CF返佣阶梯配置扩展 |
建议复用
AdminCfRateTierController新增设置接口,或新增CommissionConfigController
| 场景 | 处理 |
|---|---|
用户无推荐人(referrerId 为空) |
我的推荐人卡片显示"暂无推荐人",不显示邀请码 |
| 团队成员无消费订单 | 消费额显示 0,CF 获得显示 0 |
maxLevel 超过实际层级 |
按实际最大层级统计 |
referral_tree 数据不一致 |
以 users.referrerId 为准,referral_tree 为辅助加速查询 |
| 订单状态:仅统计已完成履约 | 高 |
| 用例 | 输入 | 预期输出 |
|---|---|---|
| 无推荐人用户访问我的页面 | 登录用户,referrerId=null | 推荐人卡片显示"暂无推荐人" |
| 有推荐人用户访问我的页面 | 登录用户,referrerId=456 | 显示推荐人昵称、头像、邀请码、绑定时间 |
| 空团队访问树形页面 | 无下级 | 仅显示根节点(自己),统计为 0 |
| 3层团队消费统计 | maxLevel=3 | 正确汇总 L1/L2/L3 消费额 |
| 直推成员列表 | level=L1 | 每行含 memberConsumption、myCfEarnedFromMember |
| 折叠/展开交互 | 点击节点图标 | 子节点显示/隐藏,连接线正确 |
docs/superpowers/api/API_REFERENCE.md - 接口参考(新增接口需同步记录)cfc-backend/AGENTS.md - 后端规范cfc-frontend/AGENTS.md - 前端规范后端先行(1-2 天):
API_REFERENCE.md前端并行(1-2 天):
配置化(0.5 天):
maxLevel 字段联调验证(0.5 天):
| 风险 | 等级 | 对策 |
|---|---|---|
referral_tree 数据量大,树形查询慢 |
中 | 限制 maxLevel≤5,加索引 idx_parent_level(parentId, level) |
| 消费额统计包含退款订单 | 高 | 严格筛选 fulfillStatus = 'completed'(仅统计已完成履约的订单,排除未结算/退货状态) |
| 树形 UI 在小程序渲染卡顿 | 低 | 虚拟列表/分页加载,层级>3 懒加载 |
| 后台配置未生效(缓存) | 低 | 配置读取走 Redis,更新后清理 |
文档结束