6
0
Fork 0
jiqu-library-server/app/Services/CouponService.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;
}
}