【產(chǎn)品名稱】:多店版
【產(chǎn)品版本】:v3.1.0
【部署方式】:linux寶塔面板
【部署環(huán)境】:本地環(huán)境
【php版本】:7.3
【Mysql版本】:5.7
【使用終端】:小程序/ H5
【問題描述】:
如圖,這里的運(yùn)費(fèi)是這樣設(shè)置的:即每一單無論多少件商品,就收1元配送費(fèi)。
咱們系統(tǒng)的默認(rèn)退費(fèi)邏輯是把配送費(fèi)也平均計(jì)算到各個(gè)商品退掉了。
舉例購買了5件商品,當(dāng)用戶部分退款,比如只退1件商品的時(shí)候,按我的配送邏輯,1元運(yùn)費(fèi)是不退的,只有最后那件商品也退款或者整單退款的時(shí)候,才會(huì)退運(yùn)費(fèi)。
但是系統(tǒng)的最終退費(fèi)值=商品單價(jià)*退款數(shù)量+(支付郵費(fèi)1元/訂單商品總數(shù)5件=0.2元)
求助一下,這個(gè)有沒有可解決的辦法呢?自己動(dòng)了下手,
把/app/services/order/StoreOrderRefundServices.php文件這樣修改了一下:
//總共申請(qǐng)多少件
$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; //部分退款時(shí),支付郵費(fèi)不退
//===========修改部分==============
}
}
//實(shí)際退款金額
$refund_pay_price = bcadd((string)$total_price, (string)$pay_postage, 2);
就是部分退款時(shí),實(shí)際退款的金額沒給加郵費(fèi),這樣實(shí)際退款的額度是對(duì)了,但是部分退款后,訂單會(huì)拆分,訂單數(shù)據(jù)表=售后訂單【eb_store_order_refund】中的【cart_info=退款商品信息】字段中,郵費(fèi)=postage_price的值還是平均計(jì)算了="0.20",導(dǎo)致訂單一拆分,沒退款的商品運(yùn)費(fèi)也減少了,這樣數(shù)據(jù)是錯(cuò)誤的。
又經(jīng)過進(jìn)一步調(diào)試,終于找到了拆分訂單postage_price的值修改的地方,代碼如下:
else {//整單退款
foreach ($cartInfos as $cart) {
if (!$cart['is_support_refund']) {
throw new ValidateException('該訂單中有商品不支持退款,請(qǐng)聯(lián)系管理員');
}
if ($cart['refund_num'] > 0) {
throw new ValidateException('超出訂單中商品數(shù)量,請(qǐng)重新選擇!');
}
}
}
foreach ($cartInfos as &$cart) {
$cart['cart_info'] = is_string($cart['cart_info']) ? json_decode($cart['cart_info'], true) : $cart['cart_info'];
//===========修改部分======部分退款時(shí),支付郵費(fèi)不退========
if ($total_num < $order['total_num']) {
$cart['cart_info']['postage_price'] = 0;
}
//===========修改部分=====部分退款時(shí),支付郵費(fèi)不退=========
}
$refundData['uid'] = $uid;
$refundData['store_id'] = $order['store_id'];
$refundData['supplier_id'] = $order['supplier_id'];
這樣部分退款拆分的訂單數(shù)據(jù)庫中的郵費(fèi)=postage_price的值就=0了。
暫時(shí)普通訂單的部分退款邏輯就改變了,還有主訂單的數(shù)據(jù)需要修改,繼續(xù)找……