Files
report_viewer/代理.md
2025-12-16 12:27:12 +08:00

33 KiB
Raw Blame History

代理系统重构方案

文档概述

本文档定义了代理系统的核心规则和实现逻辑,包括:

  • 代理等级体系:普通、黄金、钻石三个等级
  • 团队结构规则:上下级关系约束、升级规则、团队统计
  • 业务推广规则:价格体系、收益分配规则
  • 升级机制:升级方式、费用规则、返佣规则
  • 核心算法:团队统计、收益分配、升级流程等业务逻辑伪代码

一、代理等级体系

1.1 等级定义

  • 普通代理Level 1初始等级
  • 黄金代理Level 2中级等级
  • 钻石代理Level 3最高等级团队首领

1.2 等级数值映射

代理等级 = {
  普通: 1,
  黄金: 2,
  钻石: 3
}

二、团队结构规则

2.1 团队定义

  • 团队:由一个钻石代理作为首领,及其所有下级代理组成的层级关系链
  • 团队首领:必须是钻石代理,每个团队有且仅有一个首领
  • 团队关系:从普通到钻石的完整链路属于同一个团队

2.2 上下级关系规则

2.2.1 直接上下级约束

  • 核心原则
    1. 下级不能比上级等级高:下级等级必须 ≤ 上级等级
    2. 同级不能作为上下级(除了普通代理):黄金和钻石不能作为同级上下级
  • 允许关系
    • 普通 → 普通 ✓(同级普通允许)
    • 黄金 → 普通 ✓(上级等级高于下级,允许)
    • 钻石 → 普通 ✓(上级等级高于下级,允许)
    • 钻石 → 黄金 ✓(上级等级高于下级,允许)
  • 禁止关系
    • 普通 → 黄金 ✗(下级等级高于上级,禁止)
    • 普通 → 钻石 ✗(下级等级高于上级,禁止)
    • 黄金 → 黄金 ✗(同级不能作为上下级)
    • 钻石 → 钻石 ✗(同级不能作为上下级)
    • 黄金 → 钻石 ✗(下级等级高于上级,禁止)

2.2.2 升级规则

核心规则:代理升级后,其所有下级(直接+间接)会跟随该代理。

  1. 普通 → 黄金

    • 升级后必须脱离直接上级关系(因为黄金等级高于普通,或与黄金同级,或钻石→黄金禁止)
    • 保留团队关系(通过团队首领钻石代理)
    • 仍属于原团队
    • 下级跟随:所有下级(直接+间接)继续跟随该代理
  2. 黄金 → 钻石

    • 独立成为新团队
    • 成为新团队的首领
    • 下级跟随:所有下级(直接+间接)跟随该代理到新团队
  3. 普通 → 钻石

    • 独立成为新团队
    • 成为新团队的首领
    • 下级跟随:所有下级(直接+间接)跟随该代理到新团队

2.2.3 升级方法和费用规则

升级方式

  1. 钻石代理升级下级

    • 钻石代理可以将下级的普通代理升级为黄金代理
    • 升级方式:钻石代理操作,无需被升级代理付费
  2. 代理自主付费升级

    • 普通代理可以付费升级为黄金代理
    • 普通代理可以付费升级为钻石代理
    • 黄金代理可以付费升级为钻石代理

升级费用和返佣规则

升级类型 升级费用 直接上级返佣 说明
普通→黄金 199元 139元 付费后立即返佣给直接上级
普通→钻石 980元 680元 付费后立即返佣给直接上级
黄金→钻石 980元 680元 付费后立即返佣给直接上级
钻石升级下级(普通→黄金) 免费 钻石代理操作,被升级代理无需付费

重要规则

  • 返佣给原直接上级:即使升级后脱离直接上下级关系,返佣仍然给原直接上级
  • 返佣时机:付费成功后立即返佣,然后执行升级操作
  • 升级流程:付费 → 返佣给直接上级 → 升级 → 根据情况脱离关系

升级流程示例

场景1普通代理付费升级为黄金

升级前钻石D → 普通A → 普通B
流程:
1. 普通B支付199元
2. 普通A获得139元返佣原直接上级
3. 普通B升级为黄金
4. 黄金B脱离普通A的直接关系因为黄金等级高于普通下级不能比上级等级高
5. 黄金B仍属于钻石D的团队
结果钻石D → 普通A获得139元返佣
      → 黄金B支付199元脱离A的直接关系

场景1-2普通代理付费升级为黄金直接上级是黄金/钻石)

升级前钻石D → 黄金A → 普通B
流程:
1. 普通B支付199元
2. 黄金A获得139元返佣原直接上级
3. 普通B升级为黄金
4. 黄金B脱离黄金A的直接关系因为黄金 → 黄金是禁止的,同级不能作为上下级)
5. 黄金B仍属于钻石D的团队
结果钻石D → 黄金A获得139元返佣
      → 黄金B支付199元脱离A的直接关系

场景2普通代理付费升级为钻石

升级前钻石D → 普通A → 普通B
流程:
1. 普通B支付980元
2. 普通A获得680元返佣原直接上级
3. 普通B升级为钻石
4. 钻石B独立成新团队脱离普通A的直接关系
5. 钻石B的下级跟随到新团队
结果钻石D → 普通A获得680元返佣
      钻石B新团队支付980元

场景3钻石代理升级下级

升级前钻石D → 普通A → 普通B
流程:
1. 钻石D操作将普通B升级为黄金
2. 无需付费
3. 普通B升级为黄金
4. 黄金B脱离普通A的直接关系因为黄金等级高于普通下级不能比上级等级高
5. 黄金B仍属于钻石D的团队
结果钻石D → 普通A
      → 黄金B免费升级脱离A的直接关系

场景3-2钻石代理升级下级直接上级是黄金/钻石)

升级前钻石D → 黄金A → 普通B
流程:
1. 钻石D操作将普通B升级为黄金
2. 无需付费
3. 普通B升级为黄金
4. 黄金B脱离黄金A的直接关系因为黄金 → 黄金是禁止的,同级不能作为上下级)
5. 黄金B仍属于钻石D的团队
结果钻石D → 黄金A
      → 黄金B免费升级脱离A的直接关系

返佣规则总结

  • 返佣金额 = 升级费用 × 返佣比例
    • 普通→黄金139元 = 199元 × 69.8%
    • 升级为钻石680元 = 980元 × 69.4%
  • 返佣对象:原直接上级(即使升级后脱离关系)
  • 返佣时机:付费成功后立即返佣,然后执行升级

2.3 团队结构树状图示例

以下是从钻石代理作为团队首领的各种层级组合情况:

2.3.1 基础层级结构

场景1钻石 → 普通 → 普通 → 普通

钻石D (团队首领)
└── 普通A
    └── 普通B
        └── 普通C

场景2钻石 → 黄金 → 普通

钻石D (团队首领)
└── 黄金A
    └── 普通B

场景3钻石 → 普通 → 钻石(新团队)

钻石D (团队1首领)
└── 普通A
    └── 钻石B (团队2首领独立新团队)

场景4钻石 → 黄金 → 普通

钻石D (团队首领)
└── 黄金A
    └── 普通B

场景5钻石 → 黄金 → 钻石(新团队)

钻石D (团队1首领)
└── 黄金A
    └── 钻石B (团队2首领独立新团队)

2.3.2 复杂多分支结构

场景6钻石下多个分支

钻石D (团队首领)
├── 普通A
│   ├── 普通B
│   │   └── 普通C
│   └── 普通D
├── 普通G
│   └── 普通H
├── 黄金E
│   └── 普通F
└── 黄金I
    └── 普通J

场景7多层级混合结构

钻石D
├── 黄金A
│   ├── 普通A
│   │   ├── 普通E
│   │   └── 普通F
│   │       └── 普通G
│   └── 普通H
│       └── 普通I
└── 黄金B
    ├── 普通C
    │   └── 普通J
    └── 普通D

说明:此结构符合所有关系约束规则

2.3.3 升级后的结构变化

场景8普通升级为黄金脱离直接上级

升级前:
钻石D (团队首领)
└── 普通A
    └── 普通B
        └── 普通C

升级后B升级为黄金黄金等级高于普通必须脱离A的直接关系
钻石D (团队首领)
├── 普通A
│   └── (B已脱离直接关系)
└── 黄金B (仍属于D的团队但脱离A的直接关系)
    └── 普通C

场景8-2普通升级为黄金直接上级是黄金/钻石,脱离关系)

升级前:
钻石D (团队首领)
└── 黄金A
    └── 普通B
        └── 普通C

升级后B升级为黄金黄金 → 黄金是禁止关系,需脱离):
钻石D (团队首领)
├── 黄金A
│   └── (B已脱离直接关系)
└── 黄金B (仍属于D的团队但脱离A的直接关系)
    └── 普通C

场景9普通升级为钻石独立新团队

升级前:
钻石D (团队1首领)
└── 普通A
    └── 普通B
        └── 普通C

升级后B升级为钻石
钻石D (团队1首领)
└── 普通A
    └── (B已独立成新团队)

钻石B (团队2首领新团队)
└── 普通C (跟随B到新团队)

场景10黄金升级为钻石独立新团队

升级前:
钻石D (团队1首领)
└── 黄金A
    ├── 普通B
    └── 普通C

升级后A升级为钻石
钻石D (团队1首领)
└── (A已独立成新团队)

钻石A (团队2首领新团队)
├── 普通B (跟随A到新团队)
└── 普通C (跟随A到新团队)

2.3.4 特殊边界情况

场景11普通直接升级为钻石跳过黄金

升级前:
钻石D (团队1首领)
└── 普通A
    └── 普通B
        └── 普通C

升级后B直接升级为钻石
钻石D (团队1首领)
└── 普通A
    └── (B已独立成新团队)

钻石B (团队2首领新团队)
└── 普通C (跟随B到新团队)

场景12多级普通代理链

钻石D (团队首领)
└── 普通A
    └── 普通B
        └── 普通C
            └── 普通D
                └── 普通E

场景13黄金代理下多级普通代理

钻石D (团队首领)
└── 黄金A
    └── 普通B
        └── 普通C
            └── 普通D

2.3.5 图例说明

  • 钻石D团队首领等级3
  • 黄金A中级代理等级2
  • 普通A初始代理等级1
  • :直接上下级关系
  • └──:树状图分支线
  • ├──:树状图分支线(有后续分支)
  • 团队1/团队2:不同团队的标识

2.3.6 关键规则总结

  1. 团队首领:必须是钻石代理
  2. 直接关系约束:黄金/钻石不能直接管理黄金/钻石
  3. 升级影响
    • 普通→黄金:脱离直接上级,保留团队关系
    • 黄金→钻石:独立成新团队,下级跟随
    • 普通→钻石:独立成新团队,下级跟随
  4. 团队归属:通过向上查找钻石代理确定团队归属

2.4 团队查找算法

function findTeamLeader(agent):
  current = agent
  while current.parent exists:
    if current.level == 钻石:
      return current
    current = current.parent
  return null  // 无上级则自己就是首领

2.5 团队统计规则

2.5.1 核心规则定义

团队统计的基本概念

  • 团队定义:每个代理的团队 = 自己 + 所有下级(直接+间接,递归)
  • 统计范围:以代理自己为起点,向下递归包含所有下级代理
  • 团队独立性:不同代理的团队是不同的,互不干扰
  • 权限统一:所有代理(普通、黄金、钻石)的权限范围相同,都只能查看自己团队范围内的数据

关键规则

  1. 团队范围统一:无论代理等级如何,团队统计范围都是"自己 + 所有下级"
  2. 权限范围统一:所有代理只能查看自己团队的数据,无法查看其他代理的团队数据
  3. 升级后下级跟随:代理升级后,其所有下级(直接+间接)会跟随该代理
  4. 团队归属不变:下级升级脱离直接关系后,不影响上级的团队归属,上级的团队归属保持不变
  5. 单一上级原则:每个代理只可能有一个上级,不可能有多个上级

2.5.2 不同等级代理的团队统计

统一规则:所有等级的代理(普通、黄金、钻石)的团队统计规则完全相同。

代理等级 团队统计范围 权限范围 说明
钻石 自己 + 所有下级 只能查看自己团队 下级可以是普通、黄金(钻石下级会独立成新团队)
黄金 自己 + 所有下级 只能查看自己团队 下级只能是普通(黄金下级会脱离关系)
普通 自己 + 所有下级 只能查看自己团队 下级只能是普通(普通不能作为黄金或钻石的上级)

重要说明

  • 同一代理可能出现在多个上级的团队统计中(这是正常的)
  • 例如A的下级是BB的下级是C那么C会同时出现在A和B的团队统计中
  • 每个代理的团队统计是独立计算的,互不影响

2.5.3 升级后下级跟随规则

核心规则:代理升级后,其所有下级(直接+间接)会跟随该代理。

升级类型 升级前结构 升级后结构 下级跟随情况
普通→黄金 上级 → 普通A → 下级B → 下级C 上级 → 普通A
黄金A → 下级B → 下级C
B和C跟随A
黄金→钻石 上级 → 黄金A → 下级B → 下级C 上级
钻石A新团队→ 下级B → 下级C
B和C跟随A到新团队
普通→钻石 上级 → 普通A → 下级B → 下级C 上级 → 普通A
钻石A新团队→ 下级B → 下级C
B和C跟随A到新团队

重要说明

  • 升级后脱离直接关系的代理,其下级会跟随该代理
  • 如果升级为钻石,会独立成新团队,下级跟随到新团队
  • 升级不影响上级的团队归属,上级的团队归属保持不变

2.5.4 团队统计算法

function getTeamMembers(agent):
  // 获取代理的团队成员(包括自己和所有下级)
  team_members = [agent]  // 包括自己
  
  function collectChildren(agent):
    // 递归收集所有下级
    for each child in agent.children:  // 直接下级
      team_members.append(child)
      collectChildren(child)  // 递归收集间接下级
  
  collectChildren(agent)
  return team_members

function getTeamStatistics(agent):
  // 获取代理的团队统计数据
  team_members = getTeamMembers(agent)
  
  statistics = {
    total_count: team_members的数量,  // 团队总人数(包括自己)
    self: agent,  // 自己
    members: team_members,  // 所有成员(自己+所有下级)
    by_level: {
      钻石: 从team_members中筛选出等级为钻石的,
      黄金: 从team_members中筛选出等级为黄金的,
      普通: 从team_members中筛选出等级为普通的
    },
    direct_children: agent.children,  // 直接下级
    indirect_children: team_members中排除自己和直接下级的  // 间接下级
  }
  
  return statistics

function hasPermissionToView(agent, target_agent):
  // 检查代理是否有权限查看目标代理的数据
  if agent.id == target_agent.id:
    return true  // 可以查看自己
  
  // 检查目标代理是否是当前代理的下级
  team_members = getTeamMembers(agent)
  return target_agent是否在team_members中

2.5.5 团队统计示例

示例1不同代理的团队统计范围

整体结构:
钻石D
├── 普通A
│   ├── 普通B
│   └── 普通C
├── 黄金E
│   └── 普通F
└── 黄金G
    └── 普通H

各代理的团队统计

代理 团队统计范围 总计 说明
钻石D 自己 + A + B + C + E + F + G + H 8人 包含所有下级
黄金E 自己 + F 2人 只包含自己的下级
黄金G 自己 + H 2人 只包含自己的下级
普通A 自己 + B + C 3人 只包含自己的下级(普通代理的下级只能是普通代理)

权限说明

  • 钻石D只能查看自己团队8人的数据
  • 黄金E只能查看自己团队2人的数据看不到D、A、B、C、G、H的数据
  • 黄金G只能查看自己团队2人的数据看不到D、A、B、C、E、F的数据
  • 普通A只能查看自己团队3人的数据看不到D、E、F、G、H的数据

示例2升级后团队统计变化

升级前:
钻石D → 黄金A → 普通B → 普通C

升级后A升级为钻石独立成新团队
钻石D
钻石A新团队→ 普通B → 普通CB和C跟随A

升级后的团队统计

代理 升级前统计 升级后统计 变化说明
钻石A 自己 + B + C3人 自己 + B + C3人 下级跟随,统计不变
钻石D 自己 + A + B + C4人 自己1人 A独立后不再包含A及其下级

关键点

  • A升级后B和C跟随A到新团队
  • D的团队统计不再包含A、B、C因为A已独立
  • A的团队统计仍然包含B和C因为下级跟随

三、业务推广规则

3.1 价格体系

3.1.1 基础底价

  • 系统基础底价BasePrice系统配置

3.1.2 等级加成规则

等级加成 = {
  钻石: 0,
  黄金: 3,
  普通: 6
}

3.1.3 实际底价计算

实际底价 = 基础底价 + 等级加成[代理等级]

3.1.4 价格设定范围

  • 最低价:实际底价
  • 最高价系统设定上限SystemMaxPrice
  • 代理设定价格:必须在最低价和最高价之间(包含两端),即:实际底价 ≤ 设定价格 ≤ SystemMaxPrice

3.2 收益分配规则

3.2.1 核心分配原则

重要规则

  • 平台固定收入:无论哪个等级的代理推广,平台固定收到 基础底价BasePrice
  • 等级加成部分:作为返佣分配给上级链
    • 钻石代理:等级加成 = 0无返佣分配
    • 黄金代理:等级加成 = 3全部作为返佣给钻石上级
    • 普通代理:等级加成 = 6按规则分配给上级链

分配结构

用户支付金额 = 代理设定价格
├── 代理收益 = 设定价格 - 实际底价 - 提价成本
├── 实际底价 = 基础底价 + 等级加成
    ├── 基础底价 → 平台(固定)
    └── 等级加成 → 上级链返佣(按规则分配)

3.2.2 代理收益计算

提价成本 = 0
if (设定价格 > 提价标准阈值):
  提价成本 = (设定价格 - 提价标准阈值) × 提价手续费比例

代理收益 = 设定价格 - 实际底价 - 提价成本

3.2.3 等级加成返佣分配规则

分配算法

function distributeLevelBonus(agent):
  // 分配等级加成返佣
  levelBonus = LevelBonus[agent.level]
  
  // 钻石代理等级加成为0无返佣分配
  if agent.level == 钻石:
    return { platform: 0 }  // 无返佣平台也不收这部分因为加成本身就是0
  
  // 黄金代理等级加成3元全部给钻石上级
  if agent.level == 黄金:
    diamondParent = findDiamondParent(agent)
    if diamondParent存在:
      return { [diamondParent.id]: levelBonus }  // 3元给钻石上级
    // 找不到钻石上级,返佣归平台(异常情况)
    return { platform: levelBonus }
  
  // 普通代理等级加成6元按规则分配给上级链
  if agent.level == 普通:
    return distributeNormalAgentBonus(agent, levelBonus)
  
  return { platform: levelBonus }

function distributeNormalAgentBonus(agent, amount):
  // 普通代理的等级加成返佣分配6元
  // 核心规则:
  // 1. 根据直接上级等级分配固定金额给直接上级
  // 2. 剩余金额按优先级分配给上级链钻石优先全部黄金次之最多3元平台兜底
  
  parent = agent.parent
  if parent不存在:
    return { platform: amount }  // 无上级,全部归平台
  
  // 步骤1给直接上级分配固定金额
  // 直接上级分配规则钻石6元黄金3元普通2元
  directParentAmount = {
    钻石: 6,
    黄金: 3,
    普通: 2
  }[parent.level]
  
  result = { [parent.id]: directParentAmount }
  remaining = amount - directParentAmount  // 剩余金额
  
  // 步骤2分配剩余金额如果直接上级是钻石则无剩余
  if remaining > 0:
    // 确定查找起点:直接上级是普通时从直接上级开始查找,否则从直接上级的上级开始查找
    searchStart = parent if parent.level == 普通 else parent.parent
    
    if searchStart存在:
      // 查找上级链中的钻石和黄金
      diamondParent = findDiamondParent(searchStart)
      goldParent = findGoldParent(searchStart)
      
      // 按优先级分配剩余金额
      if diamondParent存在:
        // 优先级1有钻石剩余金额全部给钻石
        result[diamondParent.id] = remaining
      else if goldParent存在:
        // 优先级2只有黄金最多3元给黄金剩余归平台
        goldAmount = min(remaining, 3)  // 黄金最多3元
        result[goldParent.id] = goldAmount
        if remaining > goldAmount:
          result.platform = remaining - goldAmount
      else:
        // 优先级3都没有剩余金额归平台
        result.platform = remaining
    else:
      // 无法查找上级链,剩余金额归平台
      result.platform = remaining
  
  return result

function findDiamondParent(agent):
  // 向上查找钻石上级
  current = agent.parent
  while current存在:
    if current.level == 钻石:
      return current
    current = current.parent
  return null

function findGoldParent(agent):
  // 向上查找黄金上级
  current = agent.parent
  while current存在:
    if current.level == 黄金:
      return current
    current = current.parent
  return null

3.2.4 分配规则总结表

核心原则

  • 基础底价BasePrice:无论哪个等级,全部归平台(固定收入)
  • 等级加成部分:作为返佣分配给上级链
代理等级 等级加成 直接上级 等级加成返佣分配规则
钻石 0元 无返佣分配加成为0
黄金 3元 钻石 3元全部给钻石上级
普通 6元 钻石 6元全部给钻石上级
普通 6元 黄金 3元给黄金上级3元给钻石上级上上级
普通 6元 普通 2元给直接上级普通剩余4元
- 有钻石4元全部给钻石
- 只有黄金3元给黄金1元归平台
- 都没有4元归平台

收益分配示例

  • 钻石代理推广:用户支付 = 基础底价,平台收入 = 基础底价,返佣 = 0
  • 黄金代理推广:用户支付 = 基础底价 + 3平台收入 = 基础底价,返佣 = 3元给钻石
  • 普通代理推广:用户支付 = 基础底价 + 6平台收入 = 基础底价,返佣 = 6元按规则分配

四、系统配置参数

4.1 价格相关

  • BasePrice: 基础底价
  • SystemMaxPrice: 系统价格上限
  • PriceThreshold: 提价标准阈值
  • PriceFeeRate: 提价手续费比例

4.2 分配相关

  • BasePrice: 基础底价(固定归平台)
  • LevelBonus: 等级加成配置
    • 钻石: 0元
    • 黄金: 3元全部给钻石上级
    • 普通: 6元按规则分配给上级链
  • DirectParentAmount: 直接上级分配金额配置
    • 普通→钻石: 6元
    • 普通→黄金: 3元
    • 普通→普通: 2元
  • MaxGoldAmount: 黄金代理最大分配金额3元
  • GoldToDiamondAmount: 黄金→钻石分配金额3元

4.3 等级加成

  • LevelBonus: { 钻石: 0, 黄金: 3, 普通: 6 }

4.4 升级费用和返佣

  • UpgradeFee: 升级费用配置
    • NormalToGold: 199元普通→黄金
    • NormalToDiamond: 980元普通→钻石
    • GoldToDiamond: 980元黄金→钻石
  • UpgradeRebate: 升级返佣配置
    • NormalToGoldRebate: 139元普通→黄金给直接上级
    • ToDiamondRebate: 680元升级为钻石给直接上级
  • UpgradeRebateRate: 升级返佣比例
    • NormalToGoldRate: 69.8%139/199
    • ToDiamondRate: 69.4%680/980

五、核心算法伪代码

6.1 计算实际底价

function calculateActualBasePrice(agentLevel, basePrice):
  levelBonus = LevelBonus[agentLevel]
  return basePrice + levelBonus

6.2 计算代理收益

function calculateAgentProfit(setPrice, actualBasePrice, priceThreshold, feeRate):
  priceCost = 0
  if setPrice > priceThreshold:
    priceCost = (setPrice - priceThreshold) × feeRate
  return setPrice - actualBasePrice - priceCost

6.3 收益分配主流程

function distributeRevenue(agent, setPrice, basePrice):
  // 1. 计算实际底价
  levelBonus = LevelBonus[agent.level]
  actualBasePrice = basePrice + levelBonus
  
  // 2. 计算代理收益
  priceCost = calculatePriceCost(setPrice)
  agentProfit = setPrice - actualBasePrice - priceCost
  
  // 3. 基础底价部分:全部归平台(固定)
  platformRevenue = basePrice
  
  // 4. 等级加成部分:按规则分配给上级链
  levelBonusDistribution = distributeLevelBonus(agent)
  
  // 5. 汇总分配结果
  return {
    agentProfit: agentProfit,
    platformRevenue: platformRevenue,
    levelBonusDistribution: levelBonusDistribution
  }

6.4 等级加成返佣分配流程

function distributeLevelBonus(agent):
  levelBonus = LevelBonus[agent.level]
  
  if agent.level == 钻石:
    return {}  // 无返佣加成为0
  
  if agent.level == 黄金:
    diamondParent = findDiamondParent(agent)
    return { [diamondParent.id]: levelBonus }  // 3元给钻石
  
  if agent.level == 普通:
    return distributeNormalAgentBonus(agent, levelBonus)  // 6元按规则分配

6.5 代理升级流程

function upgradeAgent(agent, targetLevel, upgradeType):
  // 参数说明:
  // agent: 被升级的代理
  // targetLevel: 目标等级2=黄金, 3=钻石)
  // upgradeType: 'self_paid'自主付费or 'diamond_upgrade'(钻石升级)
  
  // 1. 验证升级条件
  if not canUpgrade(agent, targetLevel, upgradeType):
    return { error: '升级条件不满足' }
  
  // 2. 如果是自主付费升级,处理付费
  if upgradeType == 'self_paid':
    upgradeFee = getUpgradeFee(agent.level, targetLevel)
    rebateAmount = getUpgradeRebate(agent.level, targetLevel)
    originalParent = agent.parent
    
    // 2.1 代理付费
    paymentResult = processPayment(agent, upgradeFee)
    if not paymentResult.success:
      return { error: '付费失败' }
    
    // 2.2 返佣给原直接上级(即使升级后脱离关系)
    if originalParent:
      rebateResult = processRebate(originalParent, rebateAmount)
      if not rebateResult.success:
        // 如果返佣失败,需要退款
        refundPayment(agent, upgradeFee)
        return { error: '返佣失败,已退款' }
  
  // 3. 执行升级操作
  agent.level = targetLevel
  
  // 4. 检查是否需要脱离直接上级关系
  if needDetachFromParent(agent, agent.parent):
    agent.parent = null  // 脱离直接关系
    // 但保留团队关系(通过钻石首领)
  
  // 5. 如果升级为钻石,独立成新团队
  if targetLevel == 钻石:
    agent.teamLeaderId = agent.id  // 成为新团队首领
    // 下级会跟随(已在升级规则中定义)
  
  return { success: true, agent: agent }

function canUpgrade(agent, targetLevel, upgradeType):
  // 检查升级条件
  if upgradeType == 'diamond_upgrade':
    // 钻石升级下级:必须是钻石操作,且下级是普通代理
    return agent.level == 普通 and targetLevel == 黄金
  else if upgradeType == 'self_paid':
    // 自主付费:普通可以升级为黄金或钻石,黄金可以升级为钻石
    if agent.level == 普通:
      return targetLevel == 黄金 or targetLevel == 钻石
    else if agent.level == 黄金:
      return targetLevel == 钻石
  return false

function getUpgradeFee(fromLevel, toLevel):
  if fromLevel == 普通 and toLevel == 黄金:
    return 199
  else if toLevel == 钻石:
    return 980
  return 0

function getUpgradeRebate(fromLevel, toLevel):
  if fromLevel == 普通 and toLevel == 黄金:
    return 139
  else if toLevel == 钻石:
    return 680
  return 0

function needDetachFromParent(agent, parent):
  // 检查是否需要脱离直接上级关系
  // 规则1下级不能比上级等级高
  // 规则2同级不能作为上下级除了普通代理
  if not parent:
    return false
  
  // 如果代理等级高于上级等级,必须脱离
  if agent.level > parent.level:
    return true
  
  // 同级不能作为上下级(除了普通代理)
  if agent.level == parent.level:
    if agent.level == 黄金 or agent.level == 钻石:
      return true  // 黄金 → 黄金、钻石 → 钻石禁止
  
  // 钻石 → 黄金禁止(虽然钻石等级高于黄金,但这是特殊禁止规则)
  if agent.level == 黄金 and parent.level == 钻石:
    return true
  
  return false

六、业务流程图

7.1 代理升级流程

7.1.1 自主付费升级流程

代理发起升级请求
  ↓
检查升级条件(等级、权限等)
  ↓
计算升级费用和返佣金额
  ↓
代理支付升级费用
  ↓
付费成功后,立即返佣给原直接上级
  ↓
执行升级操作(更新代理等级)
  ↓
检查是否需要脱离直接上级关系
  ↓
如果升级为钻石
  → 独立成新团队
  → 成为团队首领
  → 下级跟随到新团队
  ↓
完成升级

7.1.2 钻石升级下级流程

钻石代理操作升级下级
  ↓
检查升级条件(必须是普通代理升级为黄金)
  ↓
无需付费,直接执行升级操作
  ↓
检查是否需要脱离直接上级关系
  ↓
完成升级

7.1.3 升级费用和返佣流程

升级费用表:
- 普通→黄金199元返佣139元给直接上级
- 普通→钻石980元返佣680元给直接上级
- 黄金→钻石980元返佣680元给直接上级

返佣规则:
- 返佣对象:原直接上级(即使升级后脱离关系)
- 返佣时机:付费成功后立即返佣
- 返佣金额:固定金额,不随升级后关系变化而改变

7.2 业务推广收益分配流程

用户付费查询(支付代理设定价格)
  ↓
计算实际底价 = 基础底价 + 等级加成
  ↓
计算代理收益 = 设定价格 - 实际底价 - 提价成本
  ↓
收益分配:
  ├── 基础底价部分 → 平台(固定收入)
  └── 等级加成部分 → 按规则分配给上级链
      ├── 钻石代理:加成=0无返佣
      ├── 黄金代理:加成=3全部给钻石上级
      └── 普通代理:加成=6按规则分配给上级链

七、边界情况处理

  1. 钻石代理有上级:理论上不应存在,但系统需处理异常情况
  2. 团队链断裂:如果上级链中找不到钻石代理,剩余金额归平台
  3. 价格异常:设定价格低于实际底价时,拒绝交易
  4. 升级冲突:升级时检查是否违反直接上下级约束规则
  5. 升级关系判断
    • 普通 → 黄金升级时,必须脱离直接上级关系
    • 原因:黄金等级高于普通(下级不能比上级等级高),或与黄金同级(同级不能作为上下级),或钻石→黄金禁止
    • 普通/黄金 → 钻石升级时,独立成新团队,脱离所有上级关系
  6. 返佣处理:返佣给原直接上级,即使升级后脱离关系,返佣不受影响
  7. 团队统计更新:所有关系变更后,需要正确更新团队统计范围