99 lines
2.7 KiB
PHP
99 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\ProductSku;
|
|
use App\Models\User;
|
|
use App\Models\UserCoupon;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class CouponService
|
|
{
|
|
/**
|
|
* 根据SKU商品ids获取可用优惠券
|
|
*
|
|
* @return collection
|
|
*/
|
|
public function availableCouponsToUser(User $user, collection $skus): collection
|
|
{
|
|
//获取用户当前所有可用券
|
|
$coupons = $this->userCalidCoupons($user);
|
|
//判断券在这批商品中是否可用
|
|
$availableCouponIds = [];
|
|
$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;
|
|
$availableCoupons[] = $coupon;
|
|
}
|
|
}
|
|
}
|
|
|
|
return collect($availableCoupons);
|
|
}
|
|
|
|
/**
|
|
* 用户有效的优惠券
|
|
*
|
|
* @param User $user
|
|
* @return collection
|
|
*/
|
|
public function userCalidCoupons(User $user): collection
|
|
{
|
|
return UserCoupon::with('ranges')->where([
|
|
'user_id'=>$user->id,
|
|
'status'=>0,
|
|
])->where('use_start_at', '<=', now())->where('use_end_at', '>=', now())->get();
|
|
}
|
|
|
|
/**
|
|
* 这批商品中,这个券是否可用
|
|
*
|
|
* @return boolean
|
|
*/
|
|
protected function isAvailableCouponToSomeSku(collection $skus, UserCoupon $coupon)
|
|
{
|
|
$res = false;
|
|
foreach ($skus as $sku) {
|
|
if ($sku instanceof ProductSku && $this->isAvailableCouponToSku($sku, $coupon)) {
|
|
$res = true;
|
|
break;//提前退出循环
|
|
}
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 这个商品是否可用这个券
|
|
*
|
|
* @param ProductSku $productSku
|
|
* @param Coupon $coupon
|
|
* @return boolean
|
|
*/
|
|
protected function isAvailableCouponToSku(ProductSku $sku, UserCoupon $coupon)
|
|
{
|
|
$res = false;
|
|
foreach ($coupon->ranges as $range) {
|
|
switch ($range->type) {
|
|
case 1://指定商品分类
|
|
if (in_array($sku->category_id, explode(',', $range->ranges))) {
|
|
$res = true;
|
|
}
|
|
break;
|
|
case 2://指定商品IDS
|
|
if (in_array($sku->id, explode(',', $range->ranges))) {
|
|
$res = true;
|
|
}
|
|
break;
|
|
}
|
|
if ($res) {//如果可用提前跳出循环;
|
|
break;
|
|
}
|
|
}
|
|
return $res;
|
|
}
|
|
}
|