基本计算模型
一笔订单产生时,系统按商品行逐行计算:佣金 = 计算基数 × 佣金比例,或直接使用固定金额。计算基数通常是商品实付金额,也就是扣掉优惠券、积分抵扣之后、不含运费的金额。这个基数的定义必须在需求阶段就定死。
触发时机
- 下单时:生成预估佣金,状态为冻结,分销商可见。
- 支付时:确认订单有效,佣金状态推进。
- 完成/解冻时:售后期结束,转为可提现。
- 退款时:按比例回退或作废。
最容易算错的五种情形
- 优惠分摊:订单级优惠券要按商品金额比例分摊到各行,否则佣金会偏高。
- 部分退款:只退了其中一个商品,其他商品的佣金不应受影响。
- 规则变更:中途改了佣金比例,历史订单应该按下单时的规则执行,需要保存规则快照。
- 等级变更:下单时是三级,结算时升到四级,通常按下单时的等级计算。
- 并发重复计算:支付回调重复触发,导致同一订单生成两份佣金流水。
一个简化的实现示意
for item in order.items:
base = item.pay_amount - share_coupon(item)
rule = rule_snapshot_at(order.created_at, item.sku_id)
commission = base * rule.rate
create_commission_record(
order_id, item.id, distributor_id,
commission, status="frozen"
)这里最关键的是 rule_snapshot_at:下单时把生效的规则快照存进佣金记录,后续规则怎么改都不影响历史数据。
怎么保证不出错
把佣金计算抽成独立模块,写单元测试覆盖全部边界场景,并做一笔“人工对账”:每月随机抽 20 笔订单用 Excel 手工算一遍,和系统结果比对。这个笨办法能发现绝大多数隐藏问题。