订单退款逻辑总结(含订单拆分)
1. 退款订单表结构
从数据库表 eb_store_order_refund 可以看到退款订单的核心字段:
- store_order_id : 关联原订单ID
- refund_type : 退款类型(0仅退款,1退货退款)
- refund_num : 退款件数
- refund_price : 申请退款金额
- refunded_price : 已退款金额
- cart_info : 退款商品信息(JSON格式存储购物车数据)
2. 订单拆分退款核心流程 2.1 触发条件
当用户申请部分商品退款时,系统会触发订单拆分逻辑,主要发生在:
- 仅退款部分商品
- 退货退款部分商品
2.2 拆分处理流程
步骤1:调用订单拆分服务
// StoreOrderRefundServices.php 中的 agreeRefund 方法
$splitOrder = $this->storeOrderSplitServices->equalSplit($order, $refund);
步骤2:equalSplit方法处理逻辑 (StoreOrderSplitServices.php)
- 购物车数据拆分 :从原订单的购物车数据中分离出要退款的商品
- 创建新订单 :为剩余商品创建新的子订单
- 金额重新计算 :
- 按比例分摊优惠券金额
- 按比例分摊积分抵扣
- 重新计算运费
- 重新计算佣金
步骤3:退款金额计算
// 计算拆分后的退款金额
$refundPrice = $refund['refund_price']; // 用户申请的退款金额
$refundedPrice = $refund['refunded_price']; // 已退款金额
$splitPrice = $order['pay_price'] - $refundPrice; // 剩余订单金额
2.3 数据一致性处理
库存回退 :
- 退款商品库存自动回退
- 新订单商品库存保持不变
优惠券处理 :
- 如果优惠券被部分使用,按比例退回剩余价值
- 新订单重新计算优惠券抵扣
积分处理 :
- 退回退款商品对应的积分
- 新订单积分重新计算
佣金处理 :
- 取消退款商品的佣金
- 新订单佣金重新计算
3. 关键代码逻辑
3.1 订单拆分核心方法
3.2 退款处理完整流程