调整下单获取可用优惠券
parent
781db692fe
commit
e92d849d57
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue