From 511dfaf2ffce827b85dc4c520b67d6ecbe5de96a Mon Sep 17 00:00:00 2001 From: weigang Date: Sat, 5 Sep 2020 21:01:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=95=86=E5=93=81=E7=9A=84?= =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=88=B8=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/v3/ErrorCode.php | 4 +-- .../v3/Implementations/CouponRecService.php | 1 + .../v3/Implementations/OrderOnlineService.php | 25 +++++++++++++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/Constants/v3/ErrorCode.php b/app/Constants/v3/ErrorCode.php index 9b89d9b..9cdc096 100644 --- a/app/Constants/v3/ErrorCode.php +++ b/app/Constants/v3/ErrorCode.php @@ -188,8 +188,8 @@ class ErrorCode extends AbstractConstants const GOODS_ACTIVITY_RESTRICT_LIMIT = 1155; /** - * 订单中部分活动商户不可使用优惠券 - * @Message("活动商户不可使用优惠券") + * 订单中部分活动商品不可使用优惠券 + * @Message("有活动商品不可使用优惠券") */ const GOODS_ACTIVITY_CANNOT_USE_COUPON = 1156; diff --git a/app/Service/v3/Implementations/CouponRecService.php b/app/Service/v3/Implementations/CouponRecService.php index 910970f..8953662 100644 --- a/app/Service/v3/Implementations/CouponRecService.php +++ b/app/Service/v3/Implementations/CouponRecService.php @@ -35,6 +35,7 @@ class CouponRecService implements CouponRecServiceInterface * @param $marketId * @param $type * @param $storeTypeIds + * @return array */ public function allForOrderOlAvailable($totalAmount, $userId, $marketId, $type, $storeTypeIds = []) { diff --git a/app/Service/v3/Implementations/OrderOnlineService.php b/app/Service/v3/Implementations/OrderOnlineService.php index 14e9fd4..3e36ea5 100644 --- a/app/Service/v3/Implementations/OrderOnlineService.php +++ b/app/Service/v3/Implementations/OrderOnlineService.php @@ -100,6 +100,8 @@ class OrderOnlineService implements OrderOnlineServiceInterface $userAddr = UserAddress::query()->find($userAddrId); // 获取配送费用 $deliveryAmount = $this->deliveryService->do($userAddr->lat, $userAddr->lng); + // 优惠券数据 + $couponRec = CouponRec::query()->lockForUpdate()->whereIn('id', $receiveCouponIds)->get()->toArray(); // 处理购物车数据,计算订单金额、子订单数据处理等 $totalAmount = 0; # 实付金额 @@ -127,7 +129,7 @@ class OrderOnlineService implements OrderOnlineServiceInterface // 用户购物车数据 $cartIds = explode(',', $storeItem->cart_ids); - $carts = ShoppingCart::query()->whereIn('id', $cartIds)->where(['market_id' => $marketId])->get(); + $carts = ShoppingCart::query()->whereIn('id', $cartIds)->where(['market_id' => $marketId, 'user_id' => $userId])->get(); foreach ($carts as $k => &$cart) { // 查个商品 @@ -136,18 +138,33 @@ class OrderOnlineService implements OrderOnlineServiceInterface $goods = Goods::query()->lockForUpdate()->find($cart->goods_id); $check = $this->goodsService->check($goods->id, $cart->num); if (true !== $check) { - throw new ErrorCodeException($check, '[商品失效]'.$cart->goods_id); + // throw new ErrorCodeException($check, '[商品失效1]'.$cart->goods_id); } } elseif ($cart->activity_type == 2) { $goods = GoodsActivity::query()->lockForUpdate()->find($cart->goods_id); $check = $this->goodsActivityService->check($goods->id, $cart->num, $userId); if (true !== $check) { - throw new ErrorCodeException($check, '[商品失效]'.$cart->goods_id); + // throw new ErrorCodeException($check, '[商品失效2]'.$cart->goods_id); } + // 活动商品不可用优惠券 if ($goods->can_use_coupon!=1 && $receiveCouponIds) { throw new ErrorCodeException(ErrorCode::GOODS_ACTIVITY_CANNOT_USE_COUPON, '[商品失效]'.$cart->goods_id); } + + // 活动商品可用优惠券,再校验这些优惠券是不是可以在当前活动类型可用 + // receiveCouponIds中是不是有当前活动不可用的优惠券 + $couponIds = array_values(array_column($couponRec, 'coupon_id')); + $couponsActivityAvailable = Coupon::query() + ->select(['id']) + ->whereJsonContains('activity_available', [(string)$goods->type]) + ->whereIn('id', $couponIds) + ->get()->toArray(); + $couponsActivityAvailableIds = array_values(array_column($couponsActivityAvailable, 'id')); + if (!empty(array_diff($couponIds, $couponsActivityAvailableIds))) { + throw new ErrorCodeException(ErrorCode::GOODS_ACTIVITY_CANNOT_USE_COUPON, '[商品失效]'.json_encode($couponsActivityAvailableIds)); + } + } if (empty($goods)) { @@ -196,8 +213,6 @@ class OrderOnlineService implements OrderOnlineServiceInterface // 优惠券的使用 $couponMoney = 0; - // 优惠券数据 - $couponRec = CouponRec::query()->lockForUpdate()->whereIn('id', $receiveCouponIds)->get()->toArray(); if (!empty($couponRec)) { $couponsCanUse = $this->couponRecService->allForOrderOlAvailable($totalAmount, $userId, $marketId, 2, $storeTypeIds); $couponCanUseIds = array_column($couponsCanUse, 'id');