WIN-2308041133\Administrator 2 months ago
parent
commit
f19b355023

+ 7 - 7
app/api/controller/v1/order/StoreOrderController.php

@@ -128,9 +128,9 @@ class StoreOrderController
         $uid = $request->uid();
         if ($this->services->be(['order_id|unique' => $key, 'uid' => $uid, 'is_del' => 0]))
             return app('json')->status('extend_order', 410173, ['orderId' => $key, 'key' => $key]);
-        list($addressId, $couponId, $payType, $useIntegral, $mark, $combinationId, $pinkId, $seckill_id, $bargainId, $shipping_type) = $request->postMore([
+        list($addressId, $couponId, $payType, $useIntegral, $mark, $combinationId, $pinkId, $seckill_id, $bargainId, $shipping_type,$repeat_discount) = $request->postMore([
             'addressId', 'couponId', ['payType', ''], ['useIntegral', 0], 'mark', ['combinationId', 0], ['pinkId', 0], ['seckill_id', 0], ['bargainId', ''],
-            ['shipping_type', 1],
+            ['shipping_type', 1],['repeat_discount',0]
         ], true);
         $payType = strtolower($payType);
         $cartGroup = $this->services->getCacheOrderInfo($uid, $key);
@@ -140,7 +140,7 @@ class StoreOrderController
             'pinkId' => $pinkId,
             'seckill_id' => $seckill_id,
             'bargainId' => $bargainId,
-        ])->computedOrder($request->uid(), $request->user()->toArray(), $cartGroup, $addressId, $payType, !!$useIntegral, (int)$couponId, false, (int)$shipping_type);
+        ])->computedOrder($request->uid(), $request->user()->toArray(), $cartGroup, $addressId, $payType, !!$useIntegral, (int)$couponId, false, (int)$shipping_type,$repeat_discount);
         if ($priceGroup)
             return app('json')->status('NONE', 100010, $priceGroup);
         else
@@ -163,7 +163,7 @@ class StoreOrderController
         $userInfo = $request->user()->toArray();
         if ($checkOrder = $this->services->getOne(['order_id|unique' => $key, 'uid' => $userInfo['uid'], 'is_del' => 0]))
             return app('json')->status('extend_order', 410209, ['orderId' => $checkOrder['order_id'], 'key' => $key]);
-        [$addressId, $couponId, $payType, $useIntegral, $mark, $combinationId, $pinkId, $seckillId, $bargainId, $shipping_type, $real_name, $phone, $storeId, $news, $invoice_id, $advanceId, $customForm,$spread_uid] = $request->postMore([
+        [$addressId, $couponId, $payType, $useIntegral, $mark, $combinationId, $pinkId, $seckillId, $bargainId, $shipping_type, $real_name, $phone, $storeId, $news, $invoice_id, $advanceId, $customForm,$spread_uid,$useRepeatDiscount] = $request->postMore([
             [['addressId', 'd'], 0],
             [['couponId', 'd'], 0],
             ['payType', ''],
@@ -182,11 +182,11 @@ class StoreOrderController
             [['advanceId', 'd'], 0],
             ['custom_form', []],
             ['spread_uid', 0],
-
+            ['useRepeatDiscount', 0],
         ], true);
         $payType = strtolower($payType);
-        $order = CacheService::lock('orderCreat' . $key, function () use ($createServices, $userInfo, $key, $addressId, $payType, $useIntegral, $couponId, $mark, $combinationId, $pinkId, $seckillId, $bargainId, $shipping_type, $real_name, $phone, $storeId, $news, $advanceId, $customForm, $invoice_id,$spread_uid) {
-            return $createServices->createOrder($userInfo['uid'], $key, $userInfo, $addressId, $payType, !!$useIntegral, $couponId, $mark, $combinationId, $pinkId, $seckillId, $bargainId, $shipping_type, $real_name, $phone, $storeId, !!$news, $advanceId, $customForm, $invoice_id,$spread_uid);
+        $order = CacheService::lock('orderCreat' . $key, function () use ($createServices, $userInfo, $key, $addressId, $payType, $useIntegral, $couponId, $mark, $combinationId, $pinkId, $seckillId, $bargainId, $shipping_type, $real_name, $phone, $storeId, $news, $advanceId, $customForm, $invoice_id,$spread_uid,$useRepeatDiscount) {
+            return $createServices->createOrder($userInfo['uid'], $key, $userInfo, $addressId, $payType, !!$useIntegral, $couponId, $mark, $combinationId, $pinkId, $seckillId, $bargainId, $shipping_type, $real_name, $phone, $storeId, !!$news, $advanceId, $customForm, $invoice_id,$spread_uid,$useRepeatDiscount);
         });
         $orderId = $order['order_id'];
         return app('json')->status('success', 410203, compact('orderId', 'key'));

+ 1 - 1
app/api/controller/v1/store/StoreCartController.php

@@ -101,7 +101,7 @@ class StoreCartController
             $hasOrder = $orderServices->count([
                 ['uid', '=', $request->uid()],
                 ['order_type', '=', 1],
-                ['paid', '=', 1],
+                ['paid', '=', 1]
             ]);
             if ($hasOrder > 0) {
                 return app('json')->fail('礼包商品只能购买一次');

+ 55 - 4
app/services/order/StoreOrderComputedServices.php

@@ -79,7 +79,7 @@ class StoreOrderComputedServices extends BaseServices
      * @param int $shipping_type
      * @return array
      */
-    public function computedOrder(int $uid, array $userInfo = [], array &$cartGroup, int $addressId, string $payType, bool $useIntegral = false, int $couponId = 0, bool $isCreate = false, int $shippingType = 1)
+    public function computedOrder(int $uid, array $userInfo = [], array &$cartGroup, int $addressId, string $payType, bool $useIntegral = false, int $couponId = 0, bool $isCreate = false, int $shippingType = 1,int $repeat_discount=0)
     {
         $offlinePayStatus = (int)sys_config('offline_pay_status') ?? (int)2;
         $systemPayType = PayServices::PAY_TYPE;
@@ -113,9 +113,9 @@ class StoreOrderComputedServices extends BaseServices
         $bargainId = $this->paramData['bargainId'] ?? 0;
         $isActivity = $combinationId || $seckillId || $bargainId;
         if (!$isActivity) {
-            // 当使用了优惠券时,检查购物车中是否存在复购商品(is_repeat=1)
-            // 若存在,则取消会员折扣(优惠券与会员折扣互斥),重新按原价计算总价
-            if ($couponId > 0) {
+            // 当使用了复购折扣时,检查购物车中是否存在复购商品(is_repeat=1)
+            // 若存在,则取消会员折扣(复购折扣与会员折扣互斥),重新按原价计算总价
+            if ($repeat_discount > 0) {
                 $productIds = array_unique(array_column($cartInfo, 'product_id'));
                 /** @var StoreProductServices $productServices */
                 $productServices = app()->make(StoreProductServices::class);
@@ -156,6 +156,8 @@ class StoreOrderComputedServices extends BaseServices
             [$payPrice, $couponPrice] = $this->useCouponId($couponId, $uid, $cartInfo, $payPrice, $isCreate);
             //使用积分
             [$payPrice, $deductionPrice, $usedIntegral, $SurplusIntegral] = $this->useIntegral($useIntegral, $userInfo, $payPrice, $other);
+            //使用复购折扣
+            [$payPrice, $deductionPrice, $usedRepeatDiscount, $SurplusRepeatDiscount] = $this->useRepeatDiscount($repeat_discount, $userInfo, $payPrice, $hasRepeat ?? false, $deductionPrice ?? 0);
         }
 
         //计算邮费
@@ -169,6 +171,8 @@ class StoreOrderComputedServices extends BaseServices
             'deduction_price' => $deductionPrice ?? 0,
             'usedIntegral' => $usedIntegral ?? 0,
             'SurplusIntegral' => $SurplusIntegral ?? 0,
+            'usedRepeatDiscount' => $usedRepeatDiscount ?? 0,
+            'SurplusRepeatDiscount' => $SurplusRepeatDiscount ?? 0,
             'storePostageDiscount' => $storePostageDiscount ?? 0,
             'isStoreFreePostage' => $isStoreFreePostage ?? false,
             'storeFreePostage' => $storeFreePostage ?? 0
@@ -302,6 +306,53 @@ class StoreOrderComputedServices extends BaseServices
         return [$payPrice, $deductionPrice, $usedIntegral, $SurplusIntegral];
     }
 
+    /**
+     * 使用复购折扣
+     * @param int $repeatDiscount
+     * @param array $userInfo
+     * @param string $payPrice
+     * @param bool $hasRepeat
+     * @param float $deductionPrice
+     * @return array
+     */
+    public function useRepeatDiscount(int $repeatDiscount, $userInfo, string $payPrice, bool $hasRepeat = false, $deductionPrice = 0)
+    {
+        if ($repeatDiscount > 0 && $hasRepeat) {
+            @file_put_contents("quanju.txt", "使用复购折扣\r\n", 8);
+            // 计算有多少个50元
+            $units = intval(bcdiv((string)$payPrice, '50', 0));
+            @file_put_contents("quanju.txt", json_encode(['payPrice'=>$payPrice,'units'=>$units])."-复购折扣计算\r\n", 8);
+
+            if ($units > 0) {
+                // 获取用户的复购折扣次数
+                $availableDiscounts = isset($userInfo['repeat_discount_num']) ? (int)$userInfo['repeat_discount_num'] : 0;
+
+                // 使用可用的折扣次数(有多少扣多少)
+                $useUnits = min($units, $availableDiscounts);
+
+                if ($useUnits > 0) {
+                    // 每满50元减免20元
+                    $discountAmount = bcmul((string)$useUnits, '20', 2);
+                    $payPrice = bcsub((string)$payPrice, $discountAmount, 2);
+                    // 确保价格不低于0.01
+                    $payPrice = $payPrice < 0.01 ? '0.01' : $payPrice;
+
+                    // 将复购折扣金额累加到deductionPrice
+                    $deductionPrice = bcadd((string)$deductionPrice, $discountAmount, 2);
+
+                    $usedRepeatDiscount = $useUnits;
+                    $SurplusRepeatDiscount = $availableDiscounts - $useUnits;
+
+                    @file_put_contents("quanju.txt", json_encode(['units'=>$units,'availableDiscounts'=>$availableDiscounts,'useUnits'=>$useUnits,'discountAmount'=>$discountAmount,'payPrice'=>$payPrice,'deductionPrice'=>$deductionPrice,'usedRepeatDiscount'=>$usedRepeatDiscount,'SurplusRepeatDiscount'=>$SurplusRepeatDiscount])."-复购折扣计算结果\r\n", 8);
+
+                    return [$payPrice, $deductionPrice, $usedRepeatDiscount, $SurplusRepeatDiscount];
+                }
+            }
+        }
+        // 不使用复购折扣或不符合条件
+        return [$payPrice, $deductionPrice, 0, 0];
+    }
+
     /**
      * 计算邮费
      * @param int $shipping_type

+ 10 - 2
app/services/order/StoreOrderCreateServices.php

@@ -143,7 +143,7 @@ class StoreOrderCreateServices extends BaseServices
      * @email 442384644@qq.com
      * @date 2023/03/01
      */
-    public function createOrder($uid, $key, $userInfo, $addressId, $payType, $useIntegral = false, $couponId = 0, $mark = '', $combinationId = 0, $pinkId = 0, $seckillId = 0, $bargainId = 0, $shippingType = 1, $real_name = '', $phone = '', $storeId = 0, $news = false, $advanceId = 0, $customForm = [], $invoice_id = 0,$spread_uid=0)
+    public function createOrder($uid, $key, $userInfo, $addressId, $payType, $useIntegral = false, $couponId = 0, $mark = '', $combinationId = 0, $pinkId = 0, $seckillId = 0, $bargainId = 0, $shippingType = 1, $real_name = '', $phone = '', $storeId = 0, $news = false, $advanceId = 0, $customForm = [], $invoice_id = 0,$spread_uid=0,$useRepeatDiscount=0)
     {
         $order_type = 0;
         /** @var StoreOrderServices $orderService */
@@ -176,7 +176,7 @@ class StoreOrderCreateServices extends BaseServices
 
         /** @var StoreOrderComputedServices $computedServices */
         $computedServices = app()->make(StoreOrderComputedServices::class);
-        $priceData = $computedServices->computedOrder($uid, $userInfo, $cartGroup, $addressId, $payType, $useIntegral, $couponId, true, $shippingType);
+        $priceData = $computedServices->computedOrder($uid, $userInfo, $cartGroup, $addressId, $payType, $useIntegral, $couponId, true, $shippingType,$useRepeatDiscount);
         /** @var WechatUserServices $wechatServices */
         $wechatServices = app()->make(WechatUserServices::class);
         /** @var UserAddressServices $addressServices */
@@ -251,6 +251,7 @@ class StoreOrderCreateServices extends BaseServices
             'pay_price' => $priceData['pay_price'],
             'pay_postage' => $priceData['pay_postage'],
             'deduction_price' => $priceData['deduction_price'],
+            'repeat_discount_num' => $priceData['usedRepeatDiscount'], //使用的复购折扣次数
             'paid' => 0,
             'pay_type' => $payType,
             'use_integral' => $priceData['usedIntegral'],
@@ -306,6 +307,13 @@ class StoreOrderCreateServices extends BaseServices
             if ($priceData['usedIntegral'] > 0) {
                 $this->deductIntegral($userInfo, $useIntegral, $priceData, (int)$userInfo['uid'], $order['id']);
             }
+            //复购折扣抵扣
+            if ($priceData['usedRepeatDiscount'] > 0) {
+                /** @var UserServices $userService */
+                $userService = app()->make(UserServices::class);
+                $userService->bcDec((int)$userInfo['uid'], 'repeat_discount_num', $priceData['usedRepeatDiscount'], 'uid');
+                @file_put_contents("quanju.txt", json_encode(['uid'=>$userInfo['uid'],'usedRepeatDiscount'=>$priceData['usedRepeatDiscount']])."-扣除复购折扣次数\r\n", 8);
+            }
             //扣库存
             $this->decGoodsStock($cartInfo, $combinationId, $seckillId, $bargainId, $advanceId);
             //保存购物车商品信息

+ 15 - 0
app/services/order/StoreOrderRefundServices.php

@@ -459,6 +459,21 @@ class StoreOrderRefundServices extends BaseServices
             'change_message' => '商品退积分',
             'change_time' => time()
         ]);
+
+        //回退复购折扣
+        if (isset($order['repeat_discount_num']) && $order['repeat_discount_num'] > 0) {
+            /** @var UserServices $userService */
+            $userService = app()->make(UserServices::class);
+            $userService->bcInc($order['uid'], 'repeat_discount_num', $order['use_repeat_discount'], 'uid');
+            $statusService->save([
+                'oid' => $order['id'],
+                'change_type' => 'repeat_discount_back',
+                'change_message' => '商品退复购折扣',
+                'change_time' => time()
+            ]);
+            @file_put_contents("quanju.txt", json_encode(['uid'=>$order['uid'],'use_repeat_discount'=>$order['use_repeat_discount']])."-回退复购折扣次数\r\n", 8);
+        }
+
         return $res && $order->save();
     }
 

+ 14 - 1
app/services/order/StoreOrderServices.php

@@ -2571,9 +2571,22 @@ HTML;
                     $cartInfoServices = app()->make(StoreOrderCartInfoServices::class);
                     // 直接查询用户是否购买过该礼包商品的已支付订单
 
-                    if ($cartInfoServices->hasUserPurchasedProduct($uid,$item['productInfo'] ['id'])) {
+//                if ($is_gift == 1) {
+                    /** @var StoreOrderServices $orderServices */
+                    $orderServices = app()->make(StoreOrderServices::class);
+                    // 检查用户是否有已支付的礼包订单(order_type=1)
+                    $hasOrder = $orderServices->count([
+                        ['uid', '=', $uid],
+                        ['order_type', '=', 1],
+                        ['paid', '=', 1]
+                    ]);
+                    if ($hasOrder > 0) {
                         return app('json')->fail('礼包商品只能购买一次');
                     }
+//                }
+//                    if ($cartInfoServices->hasUserPurchasedProduct($uid,$item['productInfo'] ['id'])) {
+//                        return app('json')->fail('礼包商品只能购买一次');
+//                    }
 
             }
             if (isset($item['productInfo']['is_repeat']) && $item['productInfo']['is_repeat'] == 1) {

+ 35 - 1
app/services/product/product/StoreProductServices.php

@@ -1570,12 +1570,46 @@ class StoreProductServices extends BaseServices
      * @param bool $is_show
      * @return array|float|int|mixed|string
      */
-    public function setLevelPrice($price, int $uid, $userInfo, $vipStatus, $discount = 0, $vipPrice = 0.00, $is_vip = 0, $is_show = false)
+    public function setLevelPrice($price, int $uid, $userInfo, $vipStatus, $discount = 0, $vipPrice = 0.00, $is_vip = 0, $is_show = false,$is_repeat_discount = 0)
     {
         @file_put_contents("quanju.txt", $discount."-折扣比例\r\n", 8);
 
         if (!(float)$price) return [0, 0, 'level'];
         if (!$vipStatus) $is_vip = 0;
+
+        // 检查是否使用复购折扣
+//        if ($is_repeat_discount == 1 && $uid && $userInfo) {
+//            @file_put_contents("quanju.txt", "使用复购折扣\r\n", 8);
+//            // 计算有多少个50元
+//            $units = intval(bcdiv((string)$price, '50', 0));
+//            @file_put_contents("quanju.txt", json_encode(['price'=>$price,'units'=>$units])."-复购折扣计算\r\n", 8);
+//
+//            if ($units > 0) {
+//                // 获取用户的复购折扣次数
+//                $availableDiscounts = isset($userInfo['repeat_discount_num']) ? (int)$userInfo['repeat_discount_num'] : 0;
+//
+//                // 使用可用的折扣次数(有多少扣多少)
+//                $useUnits = min($units, $availableDiscounts);
+//
+//                if ($useUnits > 0) {
+//                    // 每满50元减免20元
+//                    $discountAmount = bcmul((string)$useUnits, '20', 2);
+//                    $truePrice = bcsub((string)$price, $discountAmount, 2);
+//                    // 确保价格不低于0.01
+//                    $truePrice = $truePrice < 0.01 ? 0.01 : $truePrice;
+//
+//                    // 这里需要扣除用户的复购折扣次数
+//                    // 注意:这里只是计算价格,实际扣除次数应该在订单支付成功时处理
+//                    @file_put_contents("quanju.txt", json_encode(['units'=>$units,'availableDiscounts'=>$availableDiscounts,'useUnits'=>$useUnits,'discountAmount'=>$discountAmount,'truePrice'=>$truePrice])."-复购折扣计算结果\r\n", 8);
+//
+//                    return [(float)$truePrice, (float)$truePrice, 'repeat_discount'];
+//                } else {
+//                    // 复购折扣次数不足,使用正常折扣
+//                    @file_put_contents("quanju.txt", "复购折扣次数不足,使用正常折扣\r\n", 8);
+//                }
+//            }
+//        }
+
         //已登录
         if ($uid) {
             if (!$userInfo) {