# 用户使用流程图 — 佣金与结算 > **端口说明**: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动 > > **分层说明**: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体 ## 佣金体系概述 系统采用**两级推荐佣金**(L1+L2)机制: | 层级 | 说明 | 佣金来源 | 适用场景 | |------|------|---------|---------| | L1(一级) | 买家的直接推荐人 | 商品利润分成 / 服务费率 / 会员费率 | 所有订单 | | L2(二级) | 推荐人的推荐人 | 会员订单费率 | 仅会员订阅订单 | | DAN结算 | 测评师/规划师服务费 | 测评订单服务费 | DAN测评服务 | ```mermaid flowchart TD %% ============ 颜色定义 ============ classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2 classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3 %% ============ 角色 ============ A0(("👤 推荐人")):::actor B0(("👤 被推荐人(买家)")):::actor C0(("📋 规划师/管家")):::actor D0(("🖥 管理员")):::actor %% ================================================================ %% 阶段一:推荐关系绑定 %% ================================================================ subgraph 阶段一[阶段一:推荐关系绑定] direction TB P1["🏠 新用户注册页"]:::page P1 -->|"输入邀请码"| A1["🔗 注册流程中调用
CommissionService.bindReferral()"]:::api A1 -->|"用户ID, 邀请码"| S1["⚙️ CommissionService.bindReferral()"]:::service S1 -->|"校验邀请码有效性"| S1a{"邀请码是否有效?"}:::service S1a -->|"无效"| D1a["📦 返回错误: 邀请码无效"]:::data S1a -->|"已绑定"| D1b["📦 返回错误: 已绑定推荐人"]:::data S1a -->|"有效"| S1b["⚙️ 更新用户 referrerId
+ 推荐人 directCount++"]:::service S1b -->|"写入关系"| D1["📦 users 表
referrer_id 关联"]:::data S1b -->|"触发里程碑检查"| S1c["⚙️ InviteMilestoneService
checkMilestones()"]:::service S1b -->|"更新排行榜"| S1d["⚙️ ReferralLeaderboardService
incrementCount()"]:::service end %% ================================================================ %% 阶段二:佣金生成(订单支付触发) %% ================================================================ subgraph 阶段二[阶段二:佣金生成] D2["📦 订单支付成功
product_orders/
assessment_orders"]:::data D2 -->|"订单ID, 订单类型, 买家ID, 金额, 商品ID"| S2["⚙️ CommissionService.settleTwoLevel()"]:::service S2 -->|"查询买家推荐人"| S2a{"买家有推荐人?"}:::service S2a -->|"无"| D2a["📦 无佣金, 跳过"]:::data S2a -->|"有 L1 推荐人"| S2b["⚙️ 计算 L1 佣金"]:::service S2b -->|"会员订单"| S2c["⚙️ 费率: commission_member_l1_rate
默认 20%"]:::service S2b -->|"非会员订单"| S2d["⚙️ 判断商品利润模式"]:::service S2d -->|"有 P-point 配置"| S2e["⚙️ 利润分成: 订单金额×P-point
×profit_share_bps"]:::service S2d -->|"有 product.profitRate"| S2f["⚙️ 利润分成: 订单金额×利润率
×profit_share_bps"]:::service S2d -->|"无利润配置"| S2g["⚙️ 服务费率: commission_service_rate
默认 10%"]:::service S2c -->|"L1金额>0"| S2h["⚙️ 创建 L1 佣金记录
+ 更新家庭公共账户"]:::service S2e -->|"L1金额>0"| S2h S2f -->|"L1金额>0"| S2h S2g -->|"L1金额>0"| S2h S2h -->|"写入记录"| D2b["📦 commission_records 表
level=1, status=settled"]:::data S2h -->|"推广等级倍率加成"| S2i["⚙️ PromotionTierService
applyTierBoost()"]:::service S2b -->|"L1推荐人也有推荐人
且是会员订单"| S2j["⚙️ 计算 L2 佣金"]:::service S2j -->|"费率: commission_member_l2_rate
默认 5%"| S2k["⚙️ 创建 L2 佣金记录"]:::service S2k -->|"写入记录"| D2c["📦 commission_records 表
level=2, status=settled"]:::data S2k -->|"L1推荐人 indirectCount++"| S2l["⚙️ 更新推荐人间接推荐数"]:::service end %% ================================================================ %% 阶段三:DAN测评服务结算 %% ================================================================ subgraph 阶段三[阶段三:DAN测评服务结算] D2 -->|"测评订单支付"| P3["📋 测评师/规划师:结算记录"]:::page P3 --> A3["🔗 POST /api/admin/dan-settlement/list"]:::api A3 -->|"状态筛选"| S3["⚙️ DanSettlementService
getAllSettlements()"]:::service S3 -->|"查询结算记录"| D3["📦 service_settlements 表"]:::data D3 --> P3a["🖥 管理员:结算审核页"]:::page P3a -->|"确认打款"| A3a["🔗 POST /api/admin/dan-settlement/confirm/{settlementId}"]:::api A3a -->|"结算ID"| S3a["⚙️ 更新状态=settled"]:::service S3a -->|"标记已结算"| D3a["📦 service_settlements 表
状态更新"]:::data P3a -->|"查看统计"| A3b["🔗 POST /api/admin/dan-settlement/stats"]:::api A3b -->|"无参数"| S3b["⚙️ DanSettlementService
getSettlementStats()"]:::service S3b -->|"统计汇总"| D3b["📦 总金额, 待结算, 已结算"]:::data end %% ================================================================ %% 阶段四:佣金查询与管理 %% ================================================================ subgraph 阶段四[阶段四:佣金查询与管理] D2b --> P4["📋 规划师/管家:佣金面板"]:::page P4 -->|"查看汇总"| A4["🔗 POST /api/commission/summary"]:::api A4 -->|"用户ID"| S4["⚙️ CommissionService.getSummary()"]:::service S4 -->|"汇总数据"| D4["📦 可提现, 已结算, 待结算, 总佣金"]:::data P4 -->|"查看流水"| A4a["🔗 POST /api/commission/list"]:::api A4a -->|"页码, 页大小"| S4a["⚙️ CommissionService.getList()"]:::service S4a -->|"分页列表"| D4a["📦 commission_records 分页"]:::data P4 -->|"团队统计"| A4b["🔗 POST /api/commission/team"]:::api A4b -->|"用户ID"| S4b["⚙️ CommissionService.getTeamStats()"]:::service S4b -->|"L1/L2人数, 团队佣金"| D4b["📦 团队统计数据"]:::data P4 -->|"可提现余额"| A4c["🔗 POST /api/commission/balance"]:::api A4c -->|"用户ID"| S4c["⚙️ CommissionService.getSummary()"]:::service S4c -->|"可用余额详情"| D4c["📦 available, settled, pending, withdrawn"]:::data P4 -->|"佣金漏斗"| A4d["🔗 POST /api/commission/funnel"]:::api A4d -->|"用户ID"| S4d["⚙️ CommissionService.getCommissionFunnel()"]:::service S4d -->|"漏斗数据"| D4d["📦 转化漏斗各阶段数据"]:::data P4 -->|"被推荐人列表"| A4e["🔗 POST /api/commission/my-referrals"]:::api A4e -->|"页码, 页大小"| S4e["⚙️ CommissionService.getMyReferrals()"]:::service S4e -->|"分页列表"| D4e["📦 被推荐人用户列表"]:::data end %% ================================================================ %% 阶段五:提现 %% ================================================================ subgraph 阶段五[阶段五:佣金提现] D4c -->|"可提现余额"| P5["📋 规划师/管家:提现页"]:::page P5 -->|"输入金额, 账户信息"| A5["🔗 POST /api/withdrawal/apply"]:::api A5 -->|"提现金额, 账户信息"| S5["⚙️ WithdrawalService.apply()"]:::service S5 -->|"校验余额充足"| S5a{"余额 >= 提现金额?"}:::service S5a -->|"不足"| D5a["📦 返回错误: 余额不足"]:::data S5a -->|"充足"| S5b["⚙️ 冻结金额, 写入申请"]:::service S5b -->|"写入提现申请"| D5["📦 withdrawal_requests 表
status=pending"]:::data D5 --> P5a["🖥 管理员:提现审核页"]:::page P5a -->|"查看待审核列表"| A5a["🔗 POST /api/admin/commission/withdrawals"]:::api A5a -->|"状态筛选"| S5c["⚙️ WithdrawalService.getAdminList()"]:::service S5c -->|"分页列表"| D5a["📦 withdrawal_requests 分页"]:::data P5a -->|"审核通过"| A5b["🔗 POST /api/admin/commission/audit
status=approved"]:::api A5b -->|"提现ID, 审核结果"| S5d["⚙️ WithdrawalService.audit()"]:::service S5d -->|"更新状态=approved"| D5b["📦 withdrawal_requests 表
状态更新"]:::data P5a -->|"审核驳回"| A5c["🔗 POST /api/admin/commission/audit
status=rejected"]:::api A5c -->|"提现ID, 驳回原因"| S5e["⚙️ WithdrawalService.audit()"]:::service S5e -->|"解冻金额, 状态=rejected"| D5c["📦 withdrawal_requests 表
状态更新, 余额解冻"]:::data end %% ================================================================ %% 阶段六:管理员佣金配置 %% ================================================================ subgraph 阶段六[阶段六:管理员佣金配置] P6["🖥 管理员:佣金配置页"]:::page P6 -->|"查看配置"| A6["🔗 POST /api/admin/commission/config"]:::api A6 -->|"无参数"| S6["⚙️ 查询佣金配置表"]:::service S6 -->|"配置列表"| D6["📦 rebate_commission_config 表"]:::data P6 -->|"更新配置"| A6a["🔗 POST /api/admin/commission/config/update"]:::api A6a -->|"配置ID, 费率, 启用状态"| S6a["⚙️ 更新佣金配置"]:::service S6a -->|"更新记录"| D6a["📦 rebate_commission_config 表"]:::data P6 -->|"设置商品利润率"| A6b["🔗 POST /api/admin/commission/update-profit-rate"]:::api A6b -->|"商品ID, 利润率(千分比)"| S6b["⚙️ 更新 product.profitRate"]:::service S6b -->|"更新商品表"| D6b["📦 products 表
profit_rate 字段"]:::data P6 -->|"手动结算"| A6c["🔗 POST /api/admin/commission/settle"]:::api A6c -->|"结算参数"| S6c["⚙️ 提交结算任务"]:::service S6c -->|"创建结算任务"| D6c["📦 结算任务已提交"]:::data P6 -->|"佣金退款处理"| A6d["🔗 POST /api/admin/commission/refund"]:::api A6d -->|"退款参数"| S6d["⚙️ 处理佣金退款"]:::service S6d -->|"更新佣金记录"| D6d["📦 commission_records 表
退款状态更新"]:::data end %% ================================================================ %% 角色关联 %% ================================================================ A0 -.- P1 B0 -.- P1 C0 -.- P4 C0 -.- P5 D0 -.- P5a D0 -.- P6 D0 -.- P3a ``` ## 端点明细 ### 推荐关系 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/commission/bind-referral` | 绑定推荐关系 | ⚙️系统 | 用户ID, 邀请码 | 成功/失败 | | `POST /api/commission/my-referrals` | 我的被推荐人列表 | 📱小程序 | 页码, 页大小 | 分页被推荐人列表 | ### 佣金查询 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/commission/summary` | 佣金汇总 | 📋规划师 | 用户ID | 可提现/已结算/待结算/总佣金 | | `POST /api/commission/list` | 佣金流水 | 📋规划师 | 页码, 页大小 | 分页佣金记录 | | `POST /api/commission/stats` | 佣金统计面板 | 📋规划师 | 用户ID | 今日/本月/累计/可提现 | | `POST /api/commission/balance` | 可提现余额详情 | 📋规划师 | 用户ID | 可用/已结算/待结算/已提现 | | `POST /api/commission/team` | 团队统计 | 📋规划师 | 用户ID | L1/L2人数, 团队佣金 | | `POST /api/commission/team/list` | 团队成员列表 | 📋规划师 | 页码, 页大小, 层级 | 分页成员列表 | | `POST /api/commission/funnel` | 佣金转化漏斗 | 📋规划师 | 用户ID | 各阶段漏斗数据 | ### 提现 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/withdrawal/apply` | 申请提现 | 📋规划师 | 提现金额, 账户信息 | 成功/失败 | | `POST /api/withdrawal/history` | 提现记录 | 📋规划师 | 页码, 页大小 | 分页提现记录 | ### 管理员审核 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/admin/commission/withdrawals` | 提现列表 | 🖥管理后台 | 状态, 页码, 页大小 | 分页提现申请 | | `POST /api/admin/commission/audit` | 审核提现 | 🖥管理后台 | 提现ID, 状态(approved/rejected), 备注 | 成功/失败 | | `POST /api/admin/commission/config` | 佣金配置列表 | 🖥管理后台 | 无 | 佣金配置列表 | | `POST /api/admin/commission/config/update` | 更新佣金配置 | 🖥管理后台 | 配置ID, 费率, 启用状态 | 成功/失败 | | `POST /api/admin/commission/update-profit-rate` | 设置商品利润率 | 🖥管理后台 | 商品ID, 利润率 | 成功/失败 | | `POST /api/admin/commission/settle` | 手动结算 | 🖥管理后台 | 结算参数 | 结算任务已提交 | | `POST /api/admin/commission/refund` | 佣金退款 | 🖥管理后台 | 退款参数 | 退款已处理 | | `POST /api/admin/commission/records` | 佣金记录查询 | 🖥管理后台 | 无 | 佣金记录列表 | ### DAN测评结算 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/admin/dan-settlement/list` | 结算记录列表 | 🖥管理后台 | 状态筛选 | 结算记录列表 | | `POST /api/admin/dan-settlement/detail/{settlementId}` | 结算详情 | 🖥管理后台 | 路径: 结算ID | 结算单详情 | | `POST /api/admin/dan-settlement/confirm/{settlementId}` | 确认打款 | 🖥管理后台 | 路径: 结算ID | 成功/失败 | | `POST /api/admin/dan-settlement/stats` | 结算统计 | 🖥管理后台 | 无 | 总金额/待结算/已结算 | ### 推广佣金 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/promotion/commission/record` | 记录推广佣金 | ⚙️系统 | 佣金对象 | 成功/失败 | | `POST /api/promotion/commission/family-total` | 家庭总佣金 | ⚙️系统 | 家庭ID | 总佣金金额 | ## 数据实体关系 ```mermaid erDiagram User ||--o{ CommissionRecord : "推荐人获得佣金" User ||--o{ WithdrawalRequest : "申请提现" ProductOrder ||--o{ CommissionRecord : "订单触发佣金" CommissionRecord ||--o{ FamilyEarnings : "佣金计入家庭账户" User { Long id PK Long referrerId FK "推荐人ID" string referralCode UK "我的邀请码" int directCount "直接推荐人数" int indirectCount "间接推荐人数" Long totalCommissionEarned "累计佣金" } CommissionRecord { Long id PK Long orderId FK "来源订单ID" string orderType "product/membership/assessment" Long referrerId FK "获得佣金者" Long buyerId FK "买家ID" string commissionType "member/profit/service" int orderAmount "订单金额" int commissionAmount "佣金金额" int level "1=L1, 2=L2" string status "settled/frozen/cancelled/refunded" Long familyId "关联家庭" datetime settledAt datetime createdAt } WithdrawalRequest { Long id PK Long userId FK int amount "提现金额" string accountInfo "账户信息" string status "pending/approved/rejected/completed" Long auditBy "审核人" string auditRemark "审核备注" datetime createdAt datetime processedAt } RebateCommissionConfig { Long id PK string configKey "费率key" int rateBps "费率(基点)" string description int enabled datetime createdAt datetime updatedAt } ServiceSettlement { Long id PK Long orderId FK Long providerId "服务提供者ID" string providerType "assessor/planner" int amount "结算金额" string status "pending/settled/failed" datetime createdAt datetime settledAt } ``` ## 完整性分析 ### 流程完整性 - ✅ 推荐关系绑定→佣金生成→查询→提现→审核全链路覆盖 - ✅ L1+L2 两级佣金计算 - ✅ 多种佣金类型(会员/利润分成/服务费) - ✅ DAN测评服务结算 - ✅ 管理员佣金配置管理 ### 异常路径 - ❌ 佣金结算失败的重试机制未标注 - ❌ 订单退款时佣金回滚的处理未标注 - ❌ 提现打款失败的处理(已审核但打款失败) - ❌ 推广等级变更对佣金的影响未标注 ### 角色覆盖 - ✅ 推荐人(查看佣金、提现) - ✅ 被推荐人(注册时绑定) - ✅ 规划师/管家(佣金面板、团队、提现) - ✅ 管理员(审核提现、配置佣金、管理结算) ### 数据流向 - ✅ 绑定推荐人 → 订单支付 → 计算佣金 → 写入记录 → 可提现 → 申请提现 → 审核 → 打款 - ✅ 测评订单 → 服务结算 → 管理员确认 → 打款 ### 遗漏端点 | 端点 | 说明 | 建议补充 | |------|------|---------| | `POST /api/admin/commission/refunds/pending` | 待处理退款列表 | 退款佣金处理流程 | | `POST /api/admin/commission/refunds/cancel` | 中止退款 | 退款异常处理 | | `POST /api/admin/commission/refunds/summary` | 退款汇总 | 退款统计 | | 定时任务:佣金自动结算 | 系统自动 | 定期结算待处理佣金 |