shish 8 часов назад
Родитель
Сommit
7942abcdcd

+ 14 - 0
app-hd/controllers/PurchaseController.php

@@ -667,6 +667,20 @@ class PurchaseController extends BaseController
                                 $sendCost = bcmul($sendCost, $rate, 2);
                             }
 
+                            // 自定义计费也要套满减,否则确认页按规则免了 15 元、下单仍按起步价落库
+                            $distanceMeters = floatval($distanceRespond['distance'] ?? 0);
+                            if ($distanceMeters <= 0 && $sendDistance > 0) {
+                                $distanceMeters = floatval(bcmul($sendDistance, 1000, 2));
+                            }
+                            $discountRespond = DeliveryQuoteUtil::applyReduceRules(
+                                $shCurrentConfig,
+                                $sendCost,
+                                $distanceMeters,
+                                $shMethodItemAmount,
+                                $productCount
+                            );
+                            $sendCost = $discountRespond['sendCost'] ?? $sendCost;
+
                             $post['sendCost'] = bcadd($post['sendCost'] ?? 0, $sendCost, 2);
                             $post['sendDistance'] = $sendDistance;
 

+ 23 - 1
common/components/delivery/util/DeliveryQuoteUtil.php

@@ -161,7 +161,29 @@ class DeliveryQuoteUtil
         ];
     }
 
-    //查询是否符合跑腿的满减规则
+    /**
+     * 按配送方式满减规则判断是否免跑腿费(自定义计费与跑腿平台报价共用)。
+     * 满扎数、满金额、距离在 freeKm 内同时满足时 sendCost 置 0,避免确认页显示免了、下单仍收起步价。
+     * @param array $shConfig 配送方式配置,需含 reduceRules
+     * @param float $sendCost 减免前跑腿费(元)
+     * @param float $sendDistanceMeters 距离(米),内部会换算成公里再和 freeKm 比较
+     * @param float $totalPrice 花材合计金额
+     * @param float $totalNum 扎数
+     * @return array ['sendCost' => 减免后金额]
+     */
+    public static function applyReduceRules($shConfig, $sendCost, $sendDistanceMeters, $totalPrice, $totalNum)
+    {
+        return self::discountSearch([
+            'shConfig' => $shConfig,
+            'sendCost' => $sendCost,
+            'sendDistance' => $sendDistanceMeters,
+            'freightType' => 0,
+            'totalPrice' => $totalPrice,
+            'totalNum' => $totalNum,
+        ]);
+    }
+
+    // 查询是否符合跑腿的满减规则;sendDistance 单位为米
     private static function discountSearch($params)
     {
         $shConfig = $params['shConfig'] ?? [];