308 lines
5.6 KiB
Markdown
308 lines
5.6 KiB
Markdown
# 佣金计算逻辑检查
|
||
|
||
## 🔍 用户反馈
|
||
|
||
**问题**: "推广者应该获取支付金额的90%,但却是10%"
|
||
|
||
---
|
||
|
||
## 📊 配置值流转
|
||
|
||
### 1. 管理后台保存(/admin/referral-settings)
|
||
|
||
**输入**:
|
||
```
|
||
分销比例:90 (表示90%)
|
||
```
|
||
|
||
**保存代码**:
|
||
```typescript
|
||
const safeConfig = {
|
||
distributorShare: Number(config.distributorShare) || 0
|
||
}
|
||
// 保存到数据库:distributorShare = 90
|
||
```
|
||
|
||
**数据库存储**:
|
||
```json
|
||
{
|
||
"distributorShare": 90
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 后端读取配置(/api/miniprogram/pay/notify)
|
||
|
||
**读取代码**:
|
||
```typescript
|
||
const config = await getConfig('referral_config')
|
||
const distributorShare = config.distributorShare / 100
|
||
// 结果:90 / 100 = 0.9
|
||
```
|
||
|
||
**佣金计算**:
|
||
```typescript
|
||
const commission = Math.round(amount * distributorShare * 100) / 100
|
||
// 例如:1元 * 0.9 = 0.9元
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 返回给小程序(/api/referral/data)
|
||
|
||
**返回代码**:
|
||
```typescript
|
||
shareRate: Math.round(distributorShare * 100)
|
||
// 结果:0.9 * 100 = 90
|
||
```
|
||
|
||
**小程序显示**:
|
||
```xml
|
||
你获得 {{shareRate}}% 收益
|
||
<!-- 显示:你获得 90% 收益 -->
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 可能的问题点
|
||
|
||
### 问题1: 配置值保存错误
|
||
|
||
**检查点**:
|
||
- 管理后台输入的是 90 还是 0.9?
|
||
- 数据库实际保存的值是多少?
|
||
|
||
**验证SQL**:
|
||
```sql
|
||
SELECT config_value FROM system_config WHERE config_key = 'referral_config';
|
||
```
|
||
|
||
**预期结果**:
|
||
```json
|
||
{
|
||
"distributorShare": 90
|
||
}
|
||
```
|
||
|
||
**如果看到**:
|
||
```json
|
||
{
|
||
"distributorShare": 0.1 // ❌ 错误!应该是 90
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 问题2: 计算公式错误
|
||
|
||
**检查点**: 是否有地方用错了公式?
|
||
|
||
**错误示例**:
|
||
```typescript
|
||
// ❌ 错误:用了减法
|
||
const commission = amount * (1 - distributorShare)
|
||
// 1 * (1 - 0.9) = 0.1 元(10%)
|
||
|
||
// ✅ 正确:直接乘
|
||
const commission = amount * distributorShare
|
||
// 1 * 0.9 = 0.9 元(90%)
|
||
```
|
||
|
||
---
|
||
|
||
### 问题3: 除以100的位置错误
|
||
|
||
**错误示例**:
|
||
```typescript
|
||
// ❌ 错误:没有除以100
|
||
const distributorShare = config.distributorShare
|
||
const commission = amount * distributorShare / 100
|
||
// 1 * 90 / 100 = 0.9 元(看起来对,但下一步就错了)
|
||
```
|
||
|
||
**正确方式**:
|
||
```typescript
|
||
// ✅ 正确:先除以100
|
||
const distributorShare = config.distributorShare / 100 // 90 → 0.9
|
||
const commission = amount * distributorShare // 1 * 0.9 = 0.9
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 测试用例
|
||
|
||
### 测试1: 购买1元(无折扣)
|
||
|
||
**输入**:
|
||
- 支付金额: 1.00元
|
||
- distributorShare: 90
|
||
|
||
**计算过程**:
|
||
```typescript
|
||
const distributorShare = 90 / 100 = 0.9
|
||
const commission = 1.00 * 0.9 = 0.90元
|
||
```
|
||
|
||
**预期结果**: 推荐人获得 0.90元
|
||
|
||
---
|
||
|
||
### 测试2: 购买1元(5%折扣)
|
||
|
||
**输入**:
|
||
- 原价: 1.00元
|
||
- 好友优惠: 5%
|
||
- 实付: 0.95元
|
||
- distributorShare: 90
|
||
|
||
**计算过程**:
|
||
```typescript
|
||
const finalAmount = 1.00 * (1 - 0.05) = 0.95元
|
||
const commission = 0.95 * 0.9 = 0.855 ≈ 0.86元
|
||
```
|
||
|
||
**预期结果**: 推荐人获得 0.86元
|
||
|
||
---
|
||
|
||
### 测试3: 如果配置错误保存为0.9
|
||
|
||
**输入**:
|
||
- 支付金额: 1.00元
|
||
- distributorShare: 0.9 (❌ 错误的保存值)
|
||
|
||
**计算过程**:
|
||
```typescript
|
||
const distributorShare = 0.9 / 100 = 0.009
|
||
const commission = 1.00 * 0.009 = 0.009 ≈ 0.01元
|
||
```
|
||
|
||
**错误结果**: 推荐人只获得 0.01元(1%)❌
|
||
|
||
---
|
||
|
||
## 🔍 排查步骤
|
||
|
||
### 步骤1: 检查数据库配置值
|
||
|
||
**SQL查询**:
|
||
```sql
|
||
SELECT config_key, config_value
|
||
FROM system_config
|
||
WHERE config_key = 'referral_config';
|
||
```
|
||
|
||
**检查要点**:
|
||
- `distributorShare` 应该是 **90**(不是 0.9)
|
||
- 如果是其他值(如 10),说明保存时出错了
|
||
|
||
---
|
||
|
||
### 步骤2: 检查实际佣金记录
|
||
|
||
**SQL查询**:
|
||
```sql
|
||
SELECT
|
||
rb.referrer_id,
|
||
rb.referee_id,
|
||
rb.purchase_count,
|
||
rb.total_commission,
|
||
o.amount,
|
||
o.order_sn
|
||
FROM referral_bindings rb
|
||
JOIN orders o ON o.user_id = rb.referee_id AND o.status = 'paid'
|
||
WHERE rb.purchase_count > 0
|
||
ORDER BY rb.last_purchase_date DESC
|
||
LIMIT 5;
|
||
```
|
||
|
||
**检查要点**:
|
||
- 订单金额 1.00元 → 佣金应该约 0.90元
|
||
- 如果佣金是 0.10元,说明计算错误
|
||
|
||
---
|
||
|
||
### 步骤3: 检查控制台日志
|
||
|
||
**查看PM2日志**:
|
||
```bash
|
||
pm2 logs soul --lines 100 | grep "处理分佣"
|
||
```
|
||
|
||
**预期输出**:
|
||
```
|
||
[PayNotify] 处理分佣: {
|
||
amount: 0.95,
|
||
commission: 0.855,
|
||
shareRate: '90%'
|
||
}
|
||
```
|
||
|
||
**如果看到**:
|
||
```
|
||
shareRate: '10%' // ❌ 错误!
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 可能的修复方案
|
||
|
||
### 修复1: 如果配置值错误
|
||
|
||
**检查数据库**:
|
||
```sql
|
||
SELECT config_value FROM system_config WHERE config_key = 'referral_config';
|
||
```
|
||
|
||
**如果显示**:
|
||
```json
|
||
{"distributorShare": 10} // ❌ 错误
|
||
```
|
||
|
||
**手动修复**:
|
||
```sql
|
||
UPDATE system_config
|
||
SET config_value = '{"distributorShare":90,"minWithdrawAmount":10,"bindingDays":30,"userDiscount":5,"enableAutoWithdraw":false}'
|
||
WHERE config_key = 'referral_config';
|
||
```
|
||
|
||
**或者在管理后台重新保存** 90%。
|
||
|
||
---
|
||
|
||
### 修复2: 如果计算公式错误
|
||
|
||
**检查位置**: `app/api/miniprogram/pay/notify/route.ts` 第395行
|
||
|
||
**当前代码**:
|
||
```typescript
|
||
const commission = Math.round(amount * distributorShare * 100) / 100
|
||
```
|
||
|
||
**验证**:
|
||
- 如果 distributorShare = 0.9,commission = 0.9元 ✅
|
||
- 如果 distributorShare = 0.009,commission = 0.009元 ❌
|
||
|
||
---
|
||
|
||
## 📝 诊断建议
|
||
|
||
请提供以下信息以便诊断:
|
||
|
||
1. **管理后台显示的值**:
|
||
- 进入 `/admin/referral-settings`
|
||
- 查看"分销比例"输入框中的值是多少?
|
||
|
||
2. **实际佣金金额**:
|
||
- 用户A购买1元商品
|
||
- 推荐人B实际获得多少佣金?
|
||
|
||
3. **小程序显示的比例**:
|
||
- 分销中心显示的是"你获得 xx% 收益"
|
||
- 这个 xx 是多少?
|
||
|
||
---
|
||
|
||
**根据你的反馈,我会立即定位并修复问题!**
|