5.6 KiB
5.6 KiB
佣金计算逻辑检查
🔍 用户反馈
问题: "推广者应该获取支付金额的90%,但却是10%"
📊 配置值流转
1. 管理后台保存(/admin/referral-settings)
输入:
分销比例:90 (表示90%)
保存代码:
const safeConfig = {
distributorShare: Number(config.distributorShare) || 0
}
// 保存到数据库:distributorShare = 90
数据库存储:
{
"distributorShare": 90
}
2. 后端读取配置(/api/miniprogram/pay/notify)
读取代码:
const config = await getConfig('referral_config')
const distributorShare = config.distributorShare / 100
// 结果:90 / 100 = 0.9
佣金计算:
const commission = Math.round(amount * distributorShare * 100) / 100
// 例如:1元 * 0.9 = 0.9元
3. 返回给小程序(/api/referral/data)
返回代码:
shareRate: Math.round(distributorShare * 100)
// 结果:0.9 * 100 = 90
小程序显示:
你获得 {{shareRate}}% 收益
<!-- 显示:你获得 90% 收益 -->
⚠️ 可能的问题点
问题1: 配置值保存错误
检查点:
- 管理后台输入的是 90 还是 0.9?
- 数据库实际保存的值是多少?
验证SQL:
SELECT config_value FROM system_config WHERE config_key = 'referral_config';
预期结果:
{
"distributorShare": 90
}
如果看到:
{
"distributorShare": 0.1 // ❌ 错误!应该是 90
}
问题2: 计算公式错误
检查点: 是否有地方用错了公式?
错误示例:
// ❌ 错误:用了减法
const commission = amount * (1 - distributorShare)
// 1 * (1 - 0.9) = 0.1 元(10%)
// ✅ 正确:直接乘
const commission = amount * distributorShare
// 1 * 0.9 = 0.9 元(90%)
问题3: 除以100的位置错误
错误示例:
// ❌ 错误:没有除以100
const distributorShare = config.distributorShare
const commission = amount * distributorShare / 100
// 1 * 90 / 100 = 0.9 元(看起来对,但下一步就错了)
正确方式:
// ✅ 正确:先除以100
const distributorShare = config.distributorShare / 100 // 90 → 0.9
const commission = amount * distributorShare // 1 * 0.9 = 0.9
🧪 测试用例
测试1: 购买1元(无折扣)
输入:
- 支付金额: 1.00元
- distributorShare: 90
计算过程:
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
计算过程:
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 (❌ 错误的保存值)
计算过程:
const distributorShare = 0.9 / 100 = 0.009
const commission = 1.00 * 0.009 = 0.009 ≈ 0.01元
错误结果: 推荐人只获得 0.01元(1%)❌
🔍 排查步骤
步骤1: 检查数据库配置值
SQL查询:
SELECT config_key, config_value
FROM system_config
WHERE config_key = 'referral_config';
检查要点:
distributorShare应该是 90(不是 0.9)- 如果是其他值(如 10),说明保存时出错了
步骤2: 检查实际佣金记录
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日志:
pm2 logs soul --lines 100 | grep "处理分佣"
预期输出:
[PayNotify] 处理分佣: {
amount: 0.95,
commission: 0.855,
shareRate: '90%'
}
如果看到:
shareRate: '10%' // ❌ 错误!
🔧 可能的修复方案
修复1: 如果配置值错误
检查数据库:
SELECT config_value FROM system_config WHERE config_key = 'referral_config';
如果显示:
{"distributorShare": 10} // ❌ 错误
手动修复:
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行
当前代码:
const commission = Math.round(amount * distributorShare * 100) / 100
验证:
- 如果 distributorShare = 0.9,commission = 0.9元 ✅
- 如果 distributorShare = 0.009,commission = 0.009元 ❌
📝 诊断建议
请提供以下信息以便诊断:
-
管理后台显示的值:
- 进入
/admin/referral-settings - 查看"分销比例"输入框中的值是多少?
- 进入
-
实际佣金金额:
- 用户A购买1元商品
- 推荐人B实际获得多少佣金?
-
小程序显示的比例:
- 分销中心显示的是"你获得 xx% 收益"
- 这个 xx 是多少?
根据你的反馈,我会立即定位并修复问题!