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

976 lines
33 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 代理系统重构方案
## 文档概述
本文档定义了代理系统的核心规则和实现逻辑,包括:
- **代理等级体系**:普通、黄金、钻石三个等级
- **团队结构规则**:上下级关系约束、升级规则、团队统计
- **业务推广规则**:价格体系、收益分配规则
- **升级机制**:升级方式、费用规则、返佣规则
- **核心算法**:团队统计、收益分配、升级流程等业务逻辑伪代码
## 一、代理等级体系
### 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. **团队统计更新**:所有关系变更后,需要正确更新团队统计范围