Files
report_viewer/代理.md

976 lines
33 KiB
Markdown
Raw Permalink Normal View History

2025-12-16 12:27:12 +08:00
# 代理系统重构方案
## 文档概述
本文档定义了代理系统的核心规则和实现逻辑,包括:
- **代理等级体系**:普通、黄金、钻石三个等级
- **团队结构规则**:上下级关系约束、升级规则、团队统计
- **业务推广规则**:价格体系、收益分配规则
- **升级机制**:升级方式、费用规则、返佣规则
- **核心算法**:团队统计、收益分配、升级流程等业务逻辑伪代码
## 一、代理等级体系
### 1.1 等级定义
- **普通代理**Level 1初始等级
- **黄金代理**Level 2中级等级
- **钻石代理**Level 3最高等级团队首领
### 1.2 等级数值映射
```javascript
代理等级 = {
普通: 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<br>黄金A → 下级B → 下级C | B和C跟随A |
| 黄金→钻石 | 上级 → 黄金A → 下级B → 下级C | 上级<br>钻石A新团队→ 下级B → 下级C | B和C跟随A到新团队 |
| 普通→钻石 | 上级 → 普通A → 下级B → 下级C | 上级 → 普通A<br>钻石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 等级加成规则
```javascript
等级加成 = {
钻石: 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元<br>- 有钻石4元全部给钻石<br>- 只有黄金3元给黄金1元归平台<br>- 都没有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. **团队统计更新**:所有关系变更后,需要正确更新团队统计范围