Quellcode durchsuchen

套包订单用优惠券

gorden vor 7 Monaten
Ursprung
Commit
2431efcfba

+ 9 - 5
app/admin/controller/coupon/CouponDetailController.php

@@ -194,6 +194,7 @@ class CouponDetailController extends Curd
     {
         $memberId = $request->get('member_id', '');
         $goods = $request->get('goods', []);
+        $settlementNow = $request->get('settlement_now', 'N');
         if ($memberId == '') {
             return json_fail("参数异常");
         }
@@ -213,11 +214,14 @@ class CouponDetailController extends Curd
             'coupon' => function ($query) {
                 $query->select('coupon_id', 'coupon_name', 'coupon_classify', 'coupon_value', 'coupon_category', 'coupon_minimum_limit');
             }
-        ])
-            ->whereIn('join_detail_coupon_id', $couponIds)
-            ->where('join_coupon_detail_member_id', $memberId)
-            ->where('coupon_detail_status', 'ACTIVED')
-            ->selectRaw('join_detail_coupon_id,join_coupon_detail_member_id,COUNT(*) as count')
+        ])->whereIn('join_detail_coupon_id', $couponIds)
+            ->where('join_coupon_detail_member_id', $memberId);
+            if ($settlementNow == 'Y') {
+                $details = $details->whereIn('coupon_detail.coupon_detail_status', ['ACTIVED', 'WAITING']);
+            } else {
+                $details = $details->where('coupon_detail.coupon_detail_status', 'ACTIVED');
+            }
+            $details = $details->selectRaw('join_detail_coupon_id,join_coupon_detail_member_id,COUNT(*) as count')
             ->groupBy('join_detail_coupon_id', 'join_coupon_detail_member_id')
             ->get()
             ->toArray();

+ 20 - 5
app/admin/controller/order/WholeController.php

@@ -15,6 +15,7 @@ use app\controller\Curd;
 use app\model\Appointment;
 use app\model\ClientConfig;
 use app\model\Coupon;
+use app\model\CouponDetail;
 use app\model\Device;
 use app\model\Goods;
 use app\model\GoodsComponent;
@@ -796,7 +797,7 @@ class WholeController extends Curd
             // 使用优惠券
             $couponUseJson = [];
             if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
-                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                $couponResult = OrderService::payUseCoupon('pay', 'Y', $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
                 if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
                     throw new BusinessException("计算优惠后,实付金额错误!");
                 }
@@ -1373,7 +1374,7 @@ class WholeController extends Curd
         try {// 使用优惠券
             $couponUseJson = [];
             if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
-                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                $couponResult = OrderService::payUseCoupon('pay','Y', $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
                 if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
                     throw new BusinessException("计算优惠后,实付金额错误!");
                 }
@@ -1736,6 +1737,19 @@ class WholeController extends Curd
             if ($order->order_status_system != 'PAYING' || $order->order_category != 'DISHES') {
                 return json_fail('仅未支付的餐饮订单可以取消!');
             }
+            if (!empty($order->order_discount_json)) {
+                $orderDiscountJson = json_decode($order->order_discount_json, true);
+                foreach ($orderDiscountJson as $discount) {
+                    if (!empty($discount['coupon_id']) && !empty($discount['coupon_detail_id'])) {
+                        foreach ($discount['coupon_detail_id'] as $detailId) {
+                            if (substr($detailId, 0, 4) == 'CUDT') {
+                                // 恢复优惠券
+                                CouponDetail::where('coupon_detail_id', $detailId)->update(['coupon_detail_status' => 'ACTIVED']);
+                            }
+                        }
+                    }
+                }
+            }
             // sheet 表
             OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'CANCEL']);
             // payDetail 表
@@ -1793,7 +1807,7 @@ class WholeController extends Curd
             // 使用优惠券
             $couponUseJson = [];
             if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
-                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                $couponResult = OrderService::payUseCoupon('insert', $params['settlement_now'], $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
                 if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
                     throw new BusinessException("计算优惠后,实付金额错误!");
                 }
@@ -2380,7 +2394,7 @@ class WholeController extends Curd
             // 使用优惠券
             $couponUseJson = [];
             if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
-                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                $couponResult = OrderService::payUseCoupon('insert', $params['settlement_now'], $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
                 if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
                     throw new BusinessException("计算优惠后,实付金额错误!");
                 }
@@ -4385,6 +4399,7 @@ class WholeController extends Curd
         $coupon = $request->post('coupon', []);
         $payAmount = $request->post('pay_amount', 0);
         $memberId = $request->post('member_id', '');
+        $settlementNow = $request->post('settlement_now', 'N');
         if (empty($goods) || empty($coupon) || empty($memberId)) {
             return json_fail("参数异常");
         }
@@ -4399,7 +4414,7 @@ class WholeController extends Curd
             'cut_balance' => 0,
         ];
         foreach ($goods as $good) {
-            $result = OrderService::chooseCoupon($memberId, $goods, $good, $coupon, $amountBalance);
+            $result = OrderService::chooseCoupon($settlementNow, $memberId, $goods, $good, $coupon, $amountBalance);
             $amountBalance = [
                 'pay_amount' => $result['pay_amount'],
                 'welfare_balance' => $result['welfare_balance'],

+ 33 - 12
app/admin/service/order/OrderService.php

@@ -439,7 +439,7 @@ class OrderService
      * @param $payAmount
      * @return array|mixed
      */
-    public static function payUseCoupon($memberId, $goods, $coupon, $payAmount)
+    public static function payUseCoupon($type, $settlementNow, $memberId, $goods, $coupon, $payAmount)
     {
         try {
             foreach ($coupon as $item) {
@@ -453,7 +453,7 @@ class OrderService
                 'cut_balance' => 0,
             ];
             foreach ($goods as $good) {
-                $result = OrderService::useCoupon($memberId, $goods, $good, $coupon, $amountBalance);
+                $result = OrderService::useCoupon($type,$settlementNow, $memberId, $goods, $good, $coupon, $amountBalance);
                 $amountBalance = [
                     'pay_amount' => $result['pay_amount'],
                     'welfare_balance' => $result['welfare_balance'],
@@ -476,7 +476,7 @@ class OrderService
         }
     }
 
-    public static function useCoupon($memberId, $goods, $good, $coupon, $amountBalance)
+    public static function useCoupon($type,$settlementNow, $memberId, $goods, $good, $coupon, $amountBalance)
     {
         try {
             $cacheKey = "ORDER:USE:COUPON:" . $memberId;
@@ -500,12 +500,27 @@ class OrderService
                     ->where('coupon_goods.join_coupon_goods_id', $goodsId)
                     ->where('coupon_goods.join_coupon_goods_sku_id', $good['sku_id'])
                     ->where('join_goods_coupon_id', $couponId)
-                    ->where('coupon_detail.join_coupon_detail_member_id', $memberId)
-                    ->where('coupon_detail.coupon_detail_status', 'ACTIVED')
+                    ->where('coupon_detail.join_coupon_detail_member_id', $memberId);
+                if ($settlementNow == 'Y' && $type == 'pay') {
+                    $couponDetail = $couponDetail->whereIn('coupon_detail.coupon_detail_status', ['ACTIVED', 'WAITING']);
+                } else {
+                    $couponDetail = $couponDetail->where('coupon_detail.coupon_detail_status', 'ACTIVED');
+                }
+                $couponDetail = $couponDetail->orderBy('coupon_detail_id', 'DESC')
                     ->first();
                 if (!$couponDetail) {
                     continue;
                 }
+                if ($settlementNow == 'Y') {
+                    $updateData = [
+                        'coupon_detail_status' => 'USED',
+                        'coupon_detail_used_datetime' => date('Y-m-d H:i:s')
+                    ];
+                } else {
+                    $updateData = [
+                        'coupon_detail_status' => 'WAITING',
+                    ];
+                }
                 // 计算优惠券包含的优惠商品的件数和总价
                 $countAndAmount = self::countAndAmount($goods, $couponId);
                 // 如果是计件
@@ -527,7 +542,8 @@ class OrderService
                             'coupon_detail_id' => [$couponDetail->coupon_detail_id]
                         ];
                         Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
-                        CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED', 'coupon_detail_used_datetime' => date('Y-m-d H:i:s')]);
+
+                        CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update($updateData);
                     }
                 } elseif ($couponDetail->coupon_classify == '折扣券') {
                     if (Redis::sIsMember($cacheKey, $couponId)) {
@@ -545,14 +561,14 @@ class OrderService
                             'coupon_detail_id' => [$couponDetail->coupon_detail_id]
                         ];
                         Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
-                        CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED', 'coupon_detail_used_datetime' => date('Y-m-d H:i:s')]);
+                        CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update($updateData);
                     }
                 } elseif (in_array($couponDetail->coupon_classify, ['抵用券', '赠品券'])) {
                     if (Redis::sIsMember($cacheKey, $couponId)) {
                         continue;
                     }
                     Redis::sAdd($cacheKey, $couponId);
-                    CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED', 'coupon_detail_used_datetime' => date('Y-m-d H:i:s')]);
+                    CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update($updateData);
                     if ($good['nbr'] > 1) {
                         $diyongAmount = $good['goods_sales_price'];
                         $payAmount = $payAmount - $diyongAmount;
@@ -573,7 +589,7 @@ class OrderService
                         continue;
                     }
                     Redis::sAdd($cacheKey, $couponId);
-                    CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED', 'coupon_detail_used_datetime' => date('Y-m-d H:i:s')]);
+                    CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update($updateData);
                     $fuliAmount = 0;
                     if (!empty($couponDetail->coupon_value)) {
                         $fuliAmount = $couponDetail->coupon_value;
@@ -651,7 +667,7 @@ class OrderService
      * @param $amountBalance
      * @return array|void
      */
-    public static function chooseCoupon($memberId, $goods, $good, $coupon, $amountBalance)
+    public static function chooseCoupon($settlementNow, $memberId, $goods, $good, $coupon, $amountBalance)
     {
         try {
             $cacheKey = "ORDER:USE:COUPON:" . $memberId;
@@ -667,8 +683,13 @@ class OrderService
                     ->where('coupon_goods.join_coupon_goods_id', $goodsId)
                     ->where('coupon_goods.join_coupon_goods_sku_id', $good['sku_id'])
                     ->where('join_goods_coupon_id', $couponId)
-                    ->where('coupon_detail.join_coupon_detail_member_id', $memberId)
-                    ->where('coupon_detail.coupon_detail_status', 'ACTIVED')
+                    ->where('coupon_detail.join_coupon_detail_member_id', $memberId);
+                if ($settlementNow == 'Y') {
+                    $couponDetail = $couponDetail->whereIn('coupon_detail.coupon_detail_status', ['ACTIVED', 'WAITING']);
+                } else {
+                    $couponDetail = $couponDetail->where('coupon_detail.coupon_detail_status', 'ACTIVED');
+                }
+                $couponDetail = $couponDetail->orderBy('coupon_detail_id', 'DESC')
                     ->first();
                 if (!$couponDetail) {
                     continue;