修正优惠卷问题

This commit is contained in:
wucongxing8150 2024-04-28 09:25:58 +08:00
parent 3c6d820ee2
commit cc1215ffdb
2 changed files with 260 additions and 39 deletions

View File

@ -132,7 +132,7 @@ class UserCoupon extends Model
* @param array $fields 字段 * @param array $fields 字段
* @return Collection|array * @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 = array();
$params[] = ['user_id', '=', $user_id]; $params[] = ['user_id', '=', $user_id];
@ -144,12 +144,12 @@ class UserCoupon extends Model
->whereHas('Coupon', function ($query) use ($coupon_product_datas) { ->whereHas('Coupon', function ($query) use ($coupon_product_datas) {
$query->where("coupon_client",1) $query->where("coupon_client",1)
->where("coupon_status",1) ->where("coupon_status",1)
->whereIn("application_scope",[1,3,4,5]) ->whereIn("application_scope",[1,3,4,5,6]);
->where(function ($query) use ($coupon_product_datas) { // ->when(function ($query) use ($coupon_product_datas) {
foreach ($coupon_product_datas as $coupon_product_data){ // foreach ($coupon_product_datas as $coupon_product_data){
$query->orwhere("product_id","=",$coupon_product_data['product_id']); // $query->orwhere("product_id","=",$coupon_product_data['product_id']);
} // }
}); // });
}) })
->where($params) ->where($params)
->groupBy("coupon_id") ->groupBy("coupon_id")

View File

@ -103,9 +103,166 @@ class UserCouponService extends BaseService
* @param array $coupon_product_datas * @param array $coupon_product_datas
* @return array * @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 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)) { if (empty($user_coupons)) {
return array(); return array();
} }
@ -133,21 +290,57 @@ class UserCouponService extends BaseService
$coupons[$key]['cannot_use_coupon_reason'] = ""; // 不可使用原因 $coupons[$key]['cannot_use_coupon_reason'] = ""; // 不可使用原因
} }
// 处理优惠卷数量限制问题
foreach ($coupons as $key => $coupon) { foreach ($coupons as $key => $coupon) {
// 处理数量优惠卷 // 优惠卷类型1:无门槛 2:满减 3:数量)
if ($coupon['coupon_type'] == 3 && !empty($coupon['product_id'])){ if ($coupon['coupon_type'] == 3){
// 数量是否足够标识字段 // 数量是否足够标识字段
$quantity_quantity = 0; $quantity_quantity = 0;
foreach ($coupon_product_datas as $coupon_product_data){ // 品牌
// 如该优惠卷不包含此商品,跳过 if ($coupon['application_scope'] == 3){
if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])){ // 获取商品品牌
continue; // 计算相同品牌的商品总数量
// 标记为数量足够
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; continue;
} }
@ -159,30 +352,60 @@ class UserCouponService extends BaseService
// 此优惠卷无商品能达到规定最小数量 // 此优惠卷无商品能达到规定最小数量
$coupons[$key]['is_can_use'] = 0; $coupons[$key]['is_can_use'] = 0;
$coupons[$key]['cannot_use_coupon_reason'] = "商品不足" . $coupon['min_usable_number'] . "盒,不满足使用优惠卷条件"; $coupons[$key]['cannot_use_coupon_reason'] = "商品不足" . $coupon['min_usable_number'] . "盒,不满足使用优惠卷条件";
continue;
} }
} }
// 处理满减金额/无门槛优惠卷 // 满减金额/无门槛优惠卷
if ($coupon['coupon_type'] == 2 || $coupon['coupon_type'] == 1){ if ($coupon['coupon_type'] == 2 || $coupon['coupon_type'] == 1){
// 可共用一个优惠卷的商品金额问题 // 获取商品总金额
$product_price = 0; $product_price = 0;
foreach ($coupon_product_datas as $coupon_product_data) { // 品牌
// 如该优惠卷不包含此商品,跳过 if ($coupon['application_scope'] == 3){
if (!empty($coupon['product_id'])){ // 获取商品品牌
if (!str_contains($coupon['product_id'], $coupon_product_data['product_id'])) { // 计算相同品牌的商品总金额
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; continue;
} }
}
$product_price = bcadd($product_price, $product_price = bcadd($product_price,
bcmul( // 商品价格*数量 bcmul( // 商品价格*数量
$coupon_product_data['product_price'], $coupon_product_data['product_price'],
$coupon_product_data['product_num'], $coupon_product_data['product_num'],
2
),
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){ if ($coupon['with_amount'] > $product_price){
// 此优惠卷因商品金额不足,无法使用 // 此优惠卷因商品金额不足,无法使用
$coupons[$key]['is_can_use'] = 0; $coupons[$key]['is_can_use'] = 0;
continue;
} }
} }
@ -198,11 +422,10 @@ class UserCouponService extends BaseService
if ($product_price <= 0){ if ($product_price <= 0){
// 商品总金额已经为0不使用优惠卷 // 商品总金额已经为0不使用优惠卷
$coupons[$key]['is_can_use'] = 0; $coupons[$key]['is_can_use'] = 0;
continue;
} }
} }
} }
// 判断品牌是否符合-暂无品牌
} }
// 可选择优惠卷中是否存在互斥卷 // 可选择优惠卷中是否存在互斥卷
@ -237,15 +460,13 @@ class UserCouponService extends BaseService
continue; 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 = array();
$selected_coupons[] = $coupon; $selected_coupons[] = $coupon;
continue; continue;
}
} }
$selected_coupons[] = $coupon; // 选中的优惠卷数据 $selected_coupons[] = $coupon; // 选中的优惠卷数据