【产品名称】:多店版
【产品版本】:v3.1.0
【部署方式】:linux宝塔面板
【部署环境】:本地环境
【php版本】:7.3
【Mysql版本】:5.7
【使用终端】:小程序/ H5
【问题描述】:
如图,这里的运费是这样设置的:即每一单无论多少件商品,就收1元配送费。
咱们系统的默认退费逻辑是把配送费也平均计算到各个商品退掉了。
举例购买了5件商品,当用户部分退款,比如只退1件商品的时候,按我的配送逻辑,1元运费是不退的,只有最后那件商品也退款或者整单退款的时候,才会退运费。
但是系统的最终退费值=商品单价*退款数量+(支付邮费1元/订单商品总数5件=0.2元)
求助一下,这个有没有可解决的办法呢?自己动了下手,
把/app/services/order/StoreOrderRefundServices.php文件这样修改了一下:
//总共申请多少件
$total_num = array_sum(array_column($cart_ids, 'cart_num'));
if ($total_num < $order['total_num']) {
/** @var StoreOrderSplitServices $storeOrderSpliteServices */
$storeOrderSpliteServices = app()->make(StoreOrderSplitServices::class);
$cartInfos = $storeOrderSpliteServices->getSplitOrderCartInfo($id, $cart_ids, $order);
$total_price = $pay_postage = 0;
foreach ($cartInfos as $cart) {
$_info = is_string($cart['cart_info']) ? json_decode($cart['cart_info'], true) : $cart['cart_info'];
$total_price = bcadd((string)$total_price, bcmul((string)($_info['truePrice'] ?? 0), (string)$cart['cart_num'], 4), 2);
if (!in_array($order['shipping_type'], [2, 4])) {
//===========修改部分==============
//$pay_postage = bcadd((string)$pay_postage, (string)($_info['postage_price'] ?? 0), 2);
$pay_postage = 0; //部分退款时,支付邮费不退
//===========修改部分==============
}
}
//实际退款金额
$refund_pay_price = bcadd((string)$total_price, (string)$pay_postage, 2);
就是部分退款时,实际退款的金额没给加邮费,这样实际退款的额度是对了,但是部分退款后,订单会拆分,订单数据表=售后订单【eb_store_order_refund】中的【cart_info=退款商品信息】字段中,邮费=postage_price的值还是平均计算了="0.20",导致订单一拆分,没退款的商品运费也减少了,这样数据是错误的。
又经过进一步调试,终于找到了拆分订单postage_price的值修改的地方,代码如下:
else {//整单退款
foreach ($cartInfos as $cart) {
if (!$cart['is_support_refund']) {
throw new ValidateException('该订单中有商品不支持退款,请联系管理员');
}
if ($cart['refund_num'] > 0) {
throw new ValidateException('超出订单中商品数量,请重新选择!');
}
}
}
foreach ($cartInfos as &$cart) {
$cart['cart_info'] = is_string($cart['cart_info']) ? json_decode($cart['cart_info'], true) : $cart['cart_info'];
//===========修改部分======部分退款时,支付邮费不退========
if ($total_num < $order['total_num']) {
$cart['cart_info']['postage_price'] = 0;
}
//===========修改部分=====部分退款时,支付邮费不退=========
}
$refundData['uid'] = $uid;
$refundData['store_id'] = $order['store_id'];
$refundData['supplier_id'] = $order['supplier_id'];
这样部分退款拆分的订单数据库中的邮费=postage_price的值就=0了。
暂时普通订单的部分退款逻辑就改变了,还有主订单的数据需要修改,继续找……