Переглянути джерело

Merge branch 'redesign‌-260706' into dev

shish 8 годин тому
батько
коміт
37fcdf1b39

+ 1 - 1
app-ghs/controllers/StatKhCgController.php

@@ -28,7 +28,7 @@ class StatKhCgController extends BaseController
         util::success($respond);
     }
 
-    //客户按片区划分业绩 ssh 20251117
+    // 客户按片区划分业绩 ssh 20251117;返回 list + totalNum/totalCount/totalAmount/totalCost/totalProfit
     public function actionDist()
     {
         ini_set('memory_limit', '2045M');

+ 11 - 1
app-hd/controllers/OrderController.php

@@ -766,7 +766,10 @@ class OrderController extends BaseController
         }
     }
 
-    //开单操作 ssh 20220316
+    /**
+     * 开单操作
+     * 若前端已将会员折扣/门店满减写入 modifyPrice,可传 skipMemberDiscount、skipShopMeetCut,避免二次扣减。
+     */
     public function actionCreateOrder()
     {
         $post = Yii::$app->request->post();
@@ -1024,6 +1027,13 @@ class OrderController extends BaseController
             }
 
             $post['bigNum'] = $totalNum;
+            // 开单页已把会员折扣/门店满减写入 modifyPrice 时会传 skip*,避免 createHdOrder/addOrder 二次扣减
+            if (!empty($post['skipMemberDiscount'])) {
+                $post['skipMemberDiscount'] = 1;
+            }
+            if (!empty($post['skipShopMeetCut'])) {
+                $post['skipShopMeetCut'] = 1;
+            }
             //多处调用这个方法,注意同步修改,搜索关键词 createHdNewOrder
             $return = OrderService::createHdOrder($post, $custom, $hasPay);
 

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

@@ -685,6 +685,8 @@ class PurchaseController extends BaseController
                             $post['sendCost'] = bcadd($post['sendCost'] ?? 0, $sendCost, 2);
                             $post['sendDistance'] = $sendDistance;
 
+                            noticeUtil::push("自定义运费计算:" . $sendCost . "|" . $post['sendCost'] . " distanceMeters:" . $distanceMeters . " config:" . json_encode($shCurrentConfig), '15280215347');
+
                         } else {
                             // 使用 DeliveryQuoteUtil 获取配送报价
                             try {

+ 16 - 1
app-mall/controllers/OrderController.php

@@ -10,6 +10,7 @@ use bizHd\distribution\classes\DistributionOrderClass;
 use bizHd\express\classes\HdDeliveryOrderClass;
 use bizHd\order\classes\OrderClass as HdOrderClass;
 use bizHd\order\classes\PsMethodClass;
+use bizHd\order\classes\WholeOrderDiscountClass;
 use bizHd\refund\classes\MallRefundApplyClass;
 use bizHd\hb\classes\HbClass;
 use bizHd\hb\classes\HbScopeClass;
@@ -973,6 +974,7 @@ class OrderController extends BaseController
     /**
      * 花束+花材合并结算下单
      * 复用 OrderService::createHdOrder,不改动 buy-item / create-order
+     * 整单优惠:会员折扣与门店满减互斥,只落地优惠金额更大的一项(相等用会员折扣)
      */
     public function actionCreateMixOrder()
     {
@@ -1510,6 +1512,18 @@ class OrderController extends BaseController
             $post['bigNum'] = $totalNum;
             $post['modifyPrice'] = $modifyPrice;
             $post['hasSeckill'] = $hasSeckillGoods ? 1 : 0;
+            // 混合单:会员折扣与门店满减互斥,取优惠更大的一项,避免 createHdOrder 再叠满减
+            $wholePick = WholeOrderDiscountClass::pick(
+                $modifyPrice,
+                $unMeetBigNum,
+                $custom->discount ?? 1,
+                $shop
+            );
+            if ($wholePick['type'] === WholeOrderDiscountClass::TYPE_MEMBER) {
+                $post['skipShopMeetCut'] = 1;
+            } elseif ($wholePick['type'] === WholeOrderDiscountClass::TYPE_SHOP) {
+                $post['skipMemberDiscount'] = 1;
+            }
             $return = \bizHd\order\services\OrderService::createHdOrder($post, $custom, $hasPay);
 
             $orderSn = $return->orderSn ?? '';
@@ -1537,7 +1551,8 @@ class OrderController extends BaseController
             HomePageModuleClass::clearSeckillReservationSnapshot();
 
             $orderSn = $return->orderSn ?? '';
-            $orderPrice = $return->orderPrice ?? ($return->actPrice ?? 0);
+            // 优先 actPrice:门店满减落在 actPrice/orderPrice,避免仍按未减金额去支付
+            $orderPrice = $return->actPrice ?? ($return->orderPrice ?? 0);
             $id = $return->id ?? 0;
             $getPayType = dict::getDict('getPayType');
             util::success([

+ 10 - 6
app-mall/controllers/ShopController.php

@@ -57,14 +57,18 @@ class ShopController extends BaseController
                 $inviteBound = !empty($respond['inviteBound']) ? (int)$respond['inviteBound'] : 0;
             } else {
                 $hd = HdClass::getById($hdId, true);
-                $customId = $hd->customId;
-                $custom = CustomClass::getById($customId, true);
-                if (!empty($custom)) {
-                    $custom->visitTime = date("Y-m-d H:i:s");
-                    $custom->save();
+                if (!empty($hd)) {
+                    $customId = $hd->customId;
+                    $custom = CustomClass::getById($customId, true);
+                    if (!empty($custom)) {
+                        $custom->visitTime = date("Y-m-d H:i:s");
+                        $custom->save();
+                    }
                 }
             }
-            StatVisitClass::addHdCustomVisit($shop->id, $user->id);
+            if (!empty($shop)) {
+                StatVisitClass::addHdCustomVisit($shop->id, $user->id);
+            }
         }
 
         util::success(['info' => $info, 'hd' => $hd, 'custom' => $custom, 'inviteBound' => $inviteBound]);

+ 10 - 1
biz-ghs/stat/classes/StatSaleClass.php

@@ -1688,6 +1688,10 @@ class StatSaleClass extends BaseClass
         return $arr;
     }
 
+    /**
+     * 片区业绩:按片区汇总笔数/扎数/金额/成本/利润,供 ghsApp distSale、/stat-kh-cg/dist 使用。
+     * totalCount 为总扎数(含隔天售后扣减),与各行 count 口径一致。
+     */
     public static function customDistStat($mainId)
     {
         $get = Yii::$app->request->get();
@@ -1718,6 +1722,7 @@ class StatSaleClass extends BaseClass
         $ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
         $totalAmount = 0;
         $totalNum = 0;
+        $totalCount = 0;
         $totalProfit = 0;
         $totalCost = 0;
         if (!empty($ghsOrderList)) {
@@ -1746,6 +1751,7 @@ class StatSaleClass extends BaseClass
                 $distName = isset($distMap[$distId]) ? $distMap[$distId]['name'] : '未划片区';
 
                 $totalNum++;
+                $totalCount = bcadd($totalCount, $count, 2);
                 $totalAmount = bcadd($totalAmount, $actPrice, 2);
                 $totalProfit = bcadd($totalProfit, $profit, 2);
                 $totalCost = bcadd($totalCost, $cost, 2);
@@ -1822,6 +1828,7 @@ class StatSaleClass extends BaseClass
                 }
                 $profit = bcsub($actPrice, $cost, 2);
                 $totalNum++;
+                $totalCount = bcadd($totalCount, $count, 2);
                 $totalAmount = bcadd($totalAmount, $actPrice, 2);
                 $totalProfit = bcadd($totalProfit, $profit, 2);
                 $totalCost = bcadd($totalCost, $cost, 2);
@@ -1879,6 +1886,7 @@ class StatSaleClass extends BaseClass
             $arr[$distId]['count'] = bcsub((string)($arr[$distId]['count'] ?? 0), (string)$qty, 2);
             $totalAmount = bcsub((string)$totalAmount, (string)$amt, 2);
             $totalProfit = bcsub((string)$totalProfit, (string)$amt, 2);
+            $totalCount = bcsub((string)$totalCount, (string)$qty, 2);
         }
 
         $hdAmtMap = HdNextDayRefundClass::sumAmountGroupByCustom($mainId, $currentStartTime, $currentEndTime);
@@ -1911,12 +1919,13 @@ class StatSaleClass extends BaseClass
             $arr[$hdDistKey]['count'] = bcsub((string)($arr[$hdDistKey]['count'] ?? 0), $hdQtyTotal, 2);
             $totalAmount = bcsub((string)$totalAmount, $hdAmtTotal, 2);
             $totalProfit = bcsub((string)$totalProfit, $hdAmtTotal, 2);
+            $totalCount = bcsub((string)$totalCount, $hdQtyTotal, 2);
         }
         if (!empty($arr)) {
             $arr = arrayUtil::arraySort($arr, 'profit');
         }
         $totalAmount = floatval($totalAmount);
-        return ['list' => $arr, 'totalAmount' => $totalAmount, 'totalNum' => $totalNum, 'totalCost' => $totalCost, 'totalProfit' => $totalProfit];
+        return ['list' => $arr, 'totalAmount' => $totalAmount, 'totalNum' => $totalNum, 'totalCount' => floatval($totalCount), 'totalCost' => $totalCost, 'totalProfit' => $totalProfit];
     }
 
     /**

+ 1 - 1
biz-hd/custom/classes/CustomClass.php

@@ -337,7 +337,7 @@ class CustomClass extends BaseClass
         $current = $levelData[$newLevel] ?? [];
         $before = $levelData[$oldLevel] ?? [];
         $beforeName = $before['name'] ?? '普通客户';
-        $discount = $current['discount'] ?? 10;
+        $discount = $current['discount'] ? $current['discount'] / 10 : 1;
         $memberName = $current['name'] ?? '';
         $oldGrowth = $custom->growth;
 

+ 6 - 1
biz-hd/order/classes/OrderClass.php

@@ -190,7 +190,10 @@ class OrderClass extends BaseClass
             : strtotime($data['reachDate'] . ' 00:00:00');
 
         $book = $data['book'] ?? 0;
-        if ($book == 0) {
+        // skipShopMeetCut:前端已写入满减后金额时跳过,避免二次门店满减
+        $skipShopMeetCut = !empty($data['skipShopMeetCut']);
+        unset($data['skipShopMeetCut'], $data['skipMemberDiscount']);
+        if ($book == 0 && !$skipShopMeetCut) {
             $actPrice = $data['actPrice'];
             $meetNum = $shop->meetNum ?? 0;
             $meetAmount = $shop->meetAmount ?? 0;
@@ -211,6 +214,8 @@ class OrderClass extends BaseClass
                         $data['actPrice'] = $actPrice;
                         $data['realPrice'] = $actPrice;
                         $data['mainPay'] = $actPrice;
+                        // 满减后应付一并回写,避免混合单按未减的 orderPrice 拉起支付
+                        $data['orderPrice'] = $actPrice;
                     } else {
                         noticeUtil::push('订单金额不足满减金额,customId:' . $data['customId'], '15280215347');
                     }

+ 4 - 1
biz-hd/order/services/OrderService.php

@@ -238,8 +238,11 @@ class OrderService extends BaseService
         $totalPrice = bcsub($totalPrice, $hbAmount, 2);
 
         $modifyPrice = isset($data['modifyPrice']) && $data['modifyPrice'] > 0 ? $data['modifyPrice'] : 0;
+        // skipMemberDiscount:前端(mall 混合单 / hd 开单页)已写入折后 modifyPrice 时跳过,避免二次会员折
+        $skipMemberDiscount = !empty($data['skipMemberDiscount']);
+        unset($data['skipMemberDiscount']);
         $memberDiscount = $custom->discount ?? 1;
-        if (is_numeric($memberDiscount) && $memberDiscount > 0 && $memberDiscount < 1.0 && $modifyPrice > 0) {
+        if (!$skipMemberDiscount && is_numeric($memberDiscount) && $memberDiscount > 0 && $memberDiscount < 1.0 && $modifyPrice > 0) {
             $modifyPrice = bcmul($modifyPrice, $memberDiscount, 2);
             if (bccomp($modifyPrice, '0', 2) <= 0) {
                 $modifyPrice = 0.01;