From e92d849d57593ff92ec641b0427a5acb22311587 Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Tue, 14 Dec 2021 13:33:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=8B=E5=8D=95=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8F=AF=E7=94=A8=E4=BC=98=E6=83=A0=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/CouponService.php | 56 +++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/app/Services/CouponService.php b/app/Services/CouponService.php index 5ff86c39..61099377 100644 --- a/app/Services/CouponService.php +++ b/app/Services/CouponService.php @@ -13,22 +13,47 @@ class CouponService * 根据SKU商品获取可用优惠券 * * @param User $user - * @param collection $skus + * @param array $skus 至少包含以下内容 + * [ + * ['id', 'category_id', 'sell_price', 'vip_price', 'num'] + * ] * @return collection */ - public function availableCouponsToUser(User $user, collection $skus): collection + public function availableCouponsToUser(User $user, array $skus): collection { //获取用户当前所有可用券 $coupons = $this->userValidCoupons($user); - //判断券在这批商品中是否可用 - $availableCouponIds = []; + + $couponSkus = []; $availableCoupons = []; + foreach ($coupons as $coupon) { - if (in_array($coupon->coupon_id, $availableCouponIds)) {//遇到同样的券ID时直接跳过 - $availableCoupons[] = $coupon; - } else { - if ($this->isAvailableCouponToSomeSku($skus, $coupon)) { - $availableCouponIds[] = $coupon->coupon_id; + if (!isset($couponSkus[$coupon->coupon_id])) { + foreach ($skus as $sku) { + //这个商品是否在这个券的可用范围 + if ($this->isAvailableCouponToSku($sku, $coupon)) { + //按coupon_id 分组商品 + $couponSkus[$coupon->coupon_id][] = $sku; + } + } + } + } + + foreach ($coupons as $coupon) { + // 这个券是否有可用的商品 + if (isset($couponSkus[$coupon->coupon_id])) { + //用户是否是vip + if ($user->isVip()) { + $totalAmount = collect($couponSkus[$coupon->coupon_id])->sum(function ($item) { + return bcmul($item['vip_price'], $item['num']); + }); + } else { + $totalAmount = collect($couponSkus[$coupon->coupon_id])->sum(function ($item) { + return bcmul($item['sell_price'], $item['num']); + }); + } + //针对这个券,可用的商品合计价格是否满足使用门槛 + if ($totalAmount >= $coupon->coupon_threshold) { $availableCoupons[] = $coupon; } } @@ -47,7 +72,7 @@ class CouponService { return UserCoupon::with('ranges')->where([ 'user_id'=>$user->id, - ])->unuse()->get(); + ])->onlyUnuse()->get(); } /** @@ -70,22 +95,25 @@ class CouponService /** * 这个商品是否可用这个券 * - * @param ProductSku $productSku + * @param array $productSku ['id', 'category_id', 'sell_price', 'vip_price', 'num'] * @param Coupon $coupon * @return boolean */ - protected function isAvailableCouponToSku(ProductSku $sku, UserCoupon $coupon) + protected function isAvailableCouponToSku($sku, UserCoupon $coupon) { $res = false; + if ($coupon->ranges->count() == 0) {//如果没有规则则通用 + return true; + } foreach ($coupon->ranges as $range) { switch ($range->type) { case 1://指定商品分类 - if (in_array($sku->category_id, explode(',', $range->ranges))) { + if (in_array($sku['category_id'], explode(',', $range->ranges))) { $res = true; } break; case 2://指定商品IDS - if (in_array($sku->id, explode(',', $range->ranges))) { + if (in_array($sku['id'], explode(',', $range->ranges))) { $res = true; } break;