6
0
Fork 0

调整下单获取可用优惠券

release
vine_liutk 2021-12-14 13:33:17 +08:00
parent 781db692fe
commit e92d849d57
1 changed files with 42 additions and 14 deletions

View File

@ -13,22 +13,47 @@ class CouponService
* 根据SKU商品获取可用优惠券 * 根据SKU商品获取可用优惠券
* *
* @param User $user * @param User $user
* @param collection $skus * @param array $skus 至少包含以下内容
* [
* ['id', 'category_id', 'sell_price', 'vip_price', 'num']
* ]
* @return collection * @return collection
*/ */
public function availableCouponsToUser(User $user, collection $skus): collection public function availableCouponsToUser(User $user, array $skus): collection
{ {
//获取用户当前所有可用券 //获取用户当前所有可用券
$coupons = $this->userValidCoupons($user); $coupons = $this->userValidCoupons($user);
//判断券在这批商品中是否可用
$availableCouponIds = []; $couponSkus = [];
$availableCoupons = []; $availableCoupons = [];
foreach ($coupons as $coupon) { foreach ($coupons as $coupon) {
if (in_array($coupon->coupon_id, $availableCouponIds)) {//遇到同样的券ID时直接跳过 if (!isset($couponSkus[$coupon->coupon_id])) {
$availableCoupons[] = $coupon; foreach ($skus as $sku) {
} else { //这个商品是否在这个券的可用范围
if ($this->isAvailableCouponToSomeSku($skus, $coupon)) { if ($this->isAvailableCouponToSku($sku, $coupon)) {
$availableCouponIds[] = $coupon->coupon_id; //按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; $availableCoupons[] = $coupon;
} }
} }
@ -47,7 +72,7 @@ class CouponService
{ {
return UserCoupon::with('ranges')->where([ return UserCoupon::with('ranges')->where([
'user_id'=>$user->id, '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 * @param Coupon $coupon
* @return boolean * @return boolean
*/ */
protected function isAvailableCouponToSku(ProductSku $sku, UserCoupon $coupon) protected function isAvailableCouponToSku($sku, UserCoupon $coupon)
{ {
$res = false; $res = false;
if ($coupon->ranges->count() == 0) {//如果没有规则则通用
return true;
}
foreach ($coupon->ranges as $range) { foreach ($coupon->ranges as $range) {
switch ($range->type) { switch ($range->type) {
case 1://指定商品分类 case 1://指定商品分类
if (in_array($sku->category_id, explode(',', $range->ranges))) { if (in_array($sku['category_id'], explode(',', $range->ranges))) {
$res = true; $res = true;
} }
break; break;
case 2://指定商品IDS case 2://指定商品IDS
if (in_array($sku->id, explode(',', $range->ranges))) { if (in_array($sku['id'], explode(',', $range->ranges))) {
$res = true; $res = true;
} }
break; break;