commission-flow.md 18 KB

用户使用流程图 — 佣金与结算

端口说明: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动

分层说明: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体

佣金体系概述

系统采用两级推荐佣金(L1+L2)机制:

层级 说明 佣金来源 适用场景
L1(一级) 买家的直接推荐人 商品利润分成 / 服务费率 / 会员费率 所有订单
L2(二级) 推荐人的推荐人 会员订单费率 仅会员订阅订单
DAN结算 测评师/规划师服务费 测评订单服务费 DAN测评服务
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["🔗 注册流程中调用<br>CommissionService.bindReferral()"]:::api
        A1 -->|"用户ID, 邀请码"| S1["⚙️ CommissionService.bindReferral()"]:::service
        S1 -->|"校验邀请码有效性"| S1a{"邀请码是否有效?"}:::service
        S1a -->|"无效"| D1a["📦 返回错误: 邀请码无效"]:::data
        S1a -->|"已绑定"| D1b["📦 返回错误: 已绑定推荐人"]:::data
        S1a -->|"有效"| S1b["⚙️ 更新用户 referrerId<br>+ 推荐人 directCount++"]:::service
        S1b -->|"写入关系"| D1["📦 users 表<br>referrer_id 关联"]:::data
        S1b -->|"触发里程碑检查"| S1c["⚙️ InviteMilestoneService<br>checkMilestones()"]:::service
        S1b -->|"更新排行榜"| S1d["⚙️ ReferralLeaderboardService<br>incrementCount()"]:::service
    end

    %% ================================================================
    %% 阶段二:佣金生成(订单支付触发)
    %% ================================================================
    subgraph 阶段二[阶段二:佣金生成]
        D2["📦 订单支付成功<br>product_orders/<br>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<br>默认 20%"]:::service
        S2b -->|"非会员订单"| S2d["⚙️ 判断商品利润模式"]:::service
        S2d -->|"有 P-point 配置"| S2e["⚙️ 利润分成: 订单金额×P-point<br>×profit_share_bps"]:::service
        S2d -->|"有 product.profitRate"| S2f["⚙️ 利润分成: 订单金额×利润率<br>×profit_share_bps"]:::service
        S2d -->|"无利润配置"| S2g["⚙️ 服务费率: commission_service_rate<br>默认 10%"]:::service

        S2c -->|"L1金额>0"| S2h["⚙️ 创建 L1 佣金记录<br>+ 更新家庭公共账户"]:::service
        S2e -->|"L1金额>0"| S2h
        S2f -->|"L1金额>0"| S2h
        S2g -->|"L1金额>0"| S2h
        S2h -->|"写入记录"| D2b["📦 commission_records 表<br>level=1, status=settled"]:::data
        S2h -->|"推广等级倍率加成"| S2i["⚙️ PromotionTierService<br>applyTierBoost()"]:::service

        S2b -->|"L1推荐人也有推荐人<br>且是会员订单"| S2j["⚙️ 计算 L2 佣金"]:::service
        S2j -->|"费率: commission_member_l2_rate<br>默认 5%"| S2k["⚙️ 创建 L2 佣金记录"]:::service
        S2k -->|"写入记录"| D2c["📦 commission_records 表<br>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<br>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 表<br>状态更新"]:::data

        P3a -->|"查看统计"| A3b["🔗 POST /api/admin/dan-settlement/stats"]:::api
        A3b -->|"无参数"| S3b["⚙️ DanSettlementService<br>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 表<br>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<br>status=approved"]:::api
        A5b -->|"提现ID, 审核结果"| S5d["⚙️ WithdrawalService.audit()"]:::service
        S5d -->|"更新状态=approved"| D5b["📦 withdrawal_requests 表<br>状态更新"]:::data

        P5a -->|"审核驳回"| A5c["🔗 POST /api/admin/commission/audit<br>status=rejected"]:::api
        A5c -->|"提现ID, 驳回原因"| S5e["⚙️ WithdrawalService.audit()"]:::service
        S5e -->|"解冻金额, 状态=rejected"| D5c["📦 withdrawal_requests 表<br>状态更新, 余额解冻"]:::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 表<br>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 表<br>退款状态更新"]:::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 总佣金金额

数据实体关系

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 退款汇总 退款统计
定时任务:佣金自动结算 系统自动 定期结算待处理佣金