Procházet zdrojové kódy

花掌柜手动开单、计算器开单,界面显示会员折扣/店铺优惠。手动开单不能再次计算优惠,支付金额以实际金额为准

ouyang před 20 hodinami
rodič
revize
0bf3f4ce6c

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

@@ -765,7 +765,10 @@ class OrderController extends BaseController
         }
     }
 
-    //开单操作 ssh 20220316
+    /**
+     * 开单操作
+     * 若前端已将会员折扣/门店满减写入 modifyPrice,可传 skipMemberDiscount、skipShopMeetCut,避免二次扣减。
+     */
     public function actionCreateOrder()
     {
         $post = Yii::$app->request->post();
@@ -1023,6 +1026,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);
 

+ 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]);

+ 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;