【產品名稱】:多店版
【產品版本】: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了。
暫時普通訂單的部分退款邏輯就改變了,還有主訂單的數據需要修改,繼續找……