From cc1215ffdbffeb5498cd38121d5376d655a0f6fb Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Sun, 28 Apr 2024 09:25:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BC=98=E6=83=A0=E5=8D=B7?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Model/UserCoupon.php | 14 +- app/Services/UserCouponService.php | 285 +++++++++++++++++++++++++---- 2 files changed, 260 insertions(+), 39 deletions(-) diff --git a/app/Model/UserCoupon.php b/app/Model/UserCoupon.php index 2481c13..220e43d 100644 --- a/app/Model/UserCoupon.php +++ b/app/Model/UserCoupon.php @@ -132,7 +132,7 @@ class UserCoupon extends Model * @param array $fields 字段 * @return Collection|array */ - public static function getUserProductUsableCoupon(string|int $user_id,array $coupon_product_datas,array $fields = ['*']): Collection|array + public static function getUserProductUsableCoupon(string|int $user_id,array $coupon_product_datas = [],array $fields = ['*']): Collection|array { $params = array(); $params[] = ['user_id', '=', $user_id]; @@ -144,12 +144,12 @@ class UserCoupon extends Model ->whereHas('Coupon', function ($query) use ($coupon_product_datas) { $query->where("coupon_client",1) ->where("coupon_status",1) - ->whereIn("application_scope",[1,3,4,5]) - ->where(function ($query) use ($coupon_product_datas) { - foreach ($coupon_product_datas as $coupon_product_data){ - $query->orwhere("product_id","=",$coupon_product_data['product_id']); - } - }); + ->whereIn("application_scope",[1,3,4,5,6]); +// ->when(function ($query) use ($coupon_product_datas) { +// foreach ($coupon_product_datas as $coupon_product_data){ +// $query->orwhere("product_id","=",$coupon_product_data['product_id']); +// } +// }); }) ->where($params) ->groupBy("coupon_id") diff --git a/app/Services/UserCouponService.php b/app/Services/UserCouponService.php index 658ee85..7a9132c 100644 --- a/app/Services/UserCouponService.php +++ b/app/Services/UserCouponService.php @@ -103,9 +103,166 @@ class UserCouponService extends BaseService * @param array $coupon_product_datas * @return array */ +// public function getUserProductUsableCoupon(string|int $user_id, array $coupon_product_datas): array +// { +// $user_coupons = UserCoupon::getUserProductUsableCoupon($user_id); +// if (empty($user_coupons)) { +// return array(); +// } +// +// $user_coupons = $user_coupons->toArray(); +// +// $coupons = array(); +// foreach ($user_coupons as $user_coupon){ +// $user_coupon['coupon']['user_coupon_id'] = $user_coupon['user_coupon_id']; +// $coupons[] = $user_coupon['coupon']; +// } +// +// // 选中的优惠卷 +// $selected_coupons = array(); +// +// // 优惠卷最高金额 +// $coupon_high_price = 0; +// +// // 是否存在互斥卷 +// $is_mutex = 0; +// +// // 新增字段 +// foreach ($coupons as $key => $coupon) { +// $coupons[$key]['is_can_use'] = 1;// 是否可使用 +// $coupons[$key]['cannot_use_coupon_reason'] = ""; // 不可使用原因 +// } +// +// // 处理优惠卷数量限制问题 +// foreach ($coupons as $key => $coupon) { +// // 处理数量优惠卷 +// if ($coupon['coupon_type'] == 3){ +// // 数量是否足够标识字段 +// $quantity_quantity = 0; +// +// foreach ($coupon_product_datas as $coupon_product_data){ +// // 存在指定商品的情况,如该优惠卷不包含此商品,跳过 +// if (!empty($coupon['product_id'])){ +// if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])){ +// continue; +// } +// } +// +// // 判断商品数量是否满足 +// if($coupon['min_usable_number'] > $coupon_product_data['product_num']){ +// continue; +// } +// +// // 标记为数量足够 +// $quantity_quantity = 1; +// } +// +// if ($quantity_quantity == 0){ +// // 此优惠卷无商品能达到规定最小数量 +// $coupons[$key]['is_can_use'] = 0; +// $coupons[$key]['cannot_use_coupon_reason'] = "商品不足" . $coupon['min_usable_number'] . "盒,不满足使用优惠卷条件"; +// continue; +// } +// } +// +// // 处理满减金额/无门槛优惠卷 +// if ($coupon['coupon_type'] == 2 || $coupon['coupon_type'] == 1){ +// // 可共用一个优惠卷的商品金额问题 +// $product_price = 0; +// +// foreach ($coupon_product_datas as $coupon_product_data) { +// // 如该优惠卷不包含此商品,跳过 +// if (!empty($coupon['product_id'])){ +// if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])) { +// continue; +// } +// } +// +// $product_price = bcadd($product_price, +// bcmul( // 商品价格*数量 +// $coupon_product_data['product_price'], +// $coupon_product_data['product_num'], +// 2 +// ), +// 2 +// ); +// } +// +// // 满减金额优惠卷 +// if ($coupon['coupon_type'] == 2){ +// if ($coupon['with_amount'] > $product_price){ +// // 此优惠卷因商品金额不足,无法使用 +// $coupons[$key]['is_can_use'] = 0; +// continue; +// } +// } +// +// // 无门槛优惠卷 +// if ($coupon['coupon_type'] == 1){ +// if ($product_price <= 0){ +// // 商品总金额已经为0,不使用优惠卷 +// $coupons[$key]['is_can_use'] = 0; +// continue; +// } +// } +// } +// +// // 判断品牌是否符合-暂无品牌 +// // +// } +// +// // 可选择优惠卷中是否存在互斥卷 +// foreach ($coupons as $coupon) { +// if ($coupon['is_can_use'] == 0){ +// continue; +// } +// +// if ($coupon['is_mutex'] == 1) { +// $is_mutex = 1; +// } +// } +// +// // 处理存在互斥卷情况 +// foreach ($coupons as $coupon) { +// if ($coupon['is_can_use'] == 0){ +// continue; +// } +// +// if (empty($selected_coupons)) { +// $selected_coupons[] = $coupon; // 选中的优惠卷数据 +// +// $coupon_high_price = $coupon['coupon_price']; +// +// continue; +// } +// +// // 处理存在互斥卷情况 +// if ($is_mutex == 1) { +// // 选择金额最高的为选中 +// if ($coupon['coupon_price'] < $coupon_high_price){ +// continue; +// } +// +// if ($coupon['coupon_price'] > $coupon_high_price) { +// $coupon_high_price = $coupon['coupon_price']; +// +// // 选中的优惠卷数据置空 +// $selected_coupons = array(); +// $selected_coupons[] = $coupon; +// +// continue; +// } +// } +// +// $selected_coupons[] = $coupon; // 选中的优惠卷数据 +// } +// +// return $selected_coupons; +// } + public function getUserProductUsableCoupon(string|int $user_id, array $coupon_product_datas): array { - $user_coupons = UserCoupon::getUserProductUsableCoupon($user_id,$coupon_product_datas); + $user_coupons = UserCoupon::getUserProductUsableCoupon($user_id); if (empty($user_coupons)) { return array(); } @@ -133,21 +290,57 @@ class UserCouponService extends BaseService $coupons[$key]['cannot_use_coupon_reason'] = ""; // 不可使用原因 } - // 处理优惠卷数量限制问题 foreach ($coupons as $key => $coupon) { - // 处理数量优惠卷 - if ($coupon['coupon_type'] == 3 && !empty($coupon['product_id'])){ + // 优惠卷类型(1:无门槛 2:满减 3:数量) + if ($coupon['coupon_type'] == 3){ // 数量是否足够标识字段 $quantity_quantity = 0; - foreach ($coupon_product_datas as $coupon_product_data){ - // 如该优惠卷不包含此商品,跳过 - if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])){ - continue; + // 品牌 + if ($coupon['application_scope'] == 3){ + // 获取商品品牌 + // 计算相同品牌的商品总数量 + // 标记为数量足够 + continue; + } + + // 类别 + if ($coupon['application_scope'] == 4){ + // 获取商品类别 + // 计算相同类别的商品总数量 + // 标记为数量足够 + continue; + } + + // 单品使用 + if ($coupon['application_scope'] == 5){ + foreach ($coupon_product_datas as $coupon_product_data){ + if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])){ + continue; + } + + // 判断商品数量是否满足 + if($coupon['min_usable_number'] > $coupon_product_data['product_num']){ + continue; + } + + // 标记为数量足够 + $quantity_quantity = 1; + + break; + } + } + + // 全场通用/全品类药品 + if ($coupon['application_scope'] == 1 || $coupon['application_scope'] == 6){ + // 获取总商品数量 + $product_num = 0; + foreach ($coupon_product_datas as $coupon_product_data){ + $product_num = $product_num + $coupon_product_data['product_num']; } // 判断商品数量是否满足 - if($coupon['min_usable_number'] > $coupon_product_data['product_num']){ + if($coupon['min_usable_number'] > $product_num){ continue; } @@ -159,30 +352,60 @@ class UserCouponService extends BaseService // 此优惠卷无商品能达到规定最小数量 $coupons[$key]['is_can_use'] = 0; $coupons[$key]['cannot_use_coupon_reason'] = "商品不足" . $coupon['min_usable_number'] . "盒,不满足使用优惠卷条件"; + continue; } } - // 处理满减金额/无门槛优惠卷 + // 满减金额/无门槛优惠卷 if ($coupon['coupon_type'] == 2 || $coupon['coupon_type'] == 1){ - // 可共用一个优惠卷的商品金额问题 + // 获取商品总金额 $product_price = 0; - foreach ($coupon_product_datas as $coupon_product_data) { - // 如该优惠卷不包含此商品,跳过 - if (!empty($coupon['product_id'])){ - if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])) { + // 品牌 + if ($coupon['application_scope'] == 3){ + // 获取商品品牌 + // 计算相同品牌的商品总金额 + continue; + } + + // 类别 + if ($coupon['application_scope'] == 4){ + // 获取商品类别 + // 计算相同类别的商品总金额 + continue; + } + + // 单品使用 + if ($coupon['application_scope'] == 5){ + foreach ($coupon_product_datas as $coupon_product_data){ + if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])){ continue; } - } - $product_price = bcadd($product_price, - bcmul( // 商品价格*数量 - $coupon_product_data['product_price'], - $coupon_product_data['product_num'], + $product_price = bcadd($product_price, + bcmul( // 商品价格*数量 + $coupon_product_data['product_price'], + $coupon_product_data['product_num'], + 2 + ), 2 - ), - 2 - ); + ); + } + } + + // 全场通用/全品类药品 + if ($coupon['application_scope'] == 1 || $coupon['application_scope'] == 6){ + foreach ($coupon_product_datas as $coupon_product_data){ + // 计算商品总金额 + $product_price = bcadd($product_price, + bcmul( // 商品价格*数量 + $coupon_product_data['product_price'], + $coupon_product_data['product_num'], + 2 + ), + 2 + ); + } } // 满减金额优惠卷 @@ -190,6 +413,7 @@ class UserCouponService extends BaseService if ($coupon['with_amount'] > $product_price){ // 此优惠卷因商品金额不足,无法使用 $coupons[$key]['is_can_use'] = 0; + continue; } } @@ -198,11 +422,10 @@ class UserCouponService extends BaseService if ($product_price <= 0){ // 商品总金额已经为0,不使用优惠卷 $coupons[$key]['is_can_use'] = 0; + continue; } } } - - // 判断品牌是否符合-暂无品牌 } // 可选择优惠卷中是否存在互斥卷 @@ -237,15 +460,13 @@ class UserCouponService extends BaseService continue; } - if ($coupon['coupon_price'] > $coupon_high_price) { - $coupon_high_price = $coupon['coupon_price']; + $coupon_high_price = $coupon['coupon_price']; - // 选中的优惠卷数据置空 - $selected_coupons = array(); - $selected_coupons[] = $coupon; + // 选中的优惠卷数据置空 + $selected_coupons = array(); + $selected_coupons[] = $coupon; - continue; - } + continue; } $selected_coupons[] = $coupon; // 选中的优惠卷数据