From d7a4d9ab4a5155590b9ca52dab351750f6be1fb6 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Wed, 8 Nov 2023 14:11:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=9B=E5=BB=BA=E9=97=AE?= =?UTF-8?q?=E8=AF=8A=E8=AE=A2=E5=8D=95=20=E4=BC=98=E6=83=A0=E5=8D=B7?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Model/UserCoupon.php | 45 ++++++++++------ app/Services/InquiryService.php | 13 +++-- app/Services/UserCouponService.php | 87 ++++++++++++++++++++++-------- 3 files changed, 101 insertions(+), 44 deletions(-) diff --git a/app/Model/UserCoupon.php b/app/Model/UserCoupon.php index 15fde87..8797d0e 100644 --- a/app/Model/UserCoupon.php +++ b/app/Model/UserCoupon.php @@ -74,23 +74,6 @@ class UserCoupon extends Model ->where($params)->get($fields); } - /** - * 获取优惠卷信息-单条 - * @param array $params - * @param array $coupon_params - * @param array $fields - * @return object|null - */ - public static function getDateWithCouponOne(array $params, array $coupon_params, array $application_scope_params, array $fields = ['*']): object|null - { - return self::with(['Coupon']) - ->whereHas('Coupon' , function($query) use ($coupon_params,$application_scope_params){ - $query->where($coupon_params)->whereIn('application_scope',$application_scope_params); - }) - ->where($params) - ->first($fields); - } - /** * 新增用户优惠卷 * @param array $data @@ -111,4 +94,32 @@ class UserCoupon extends Model { return self::where($params)->update($data); } + + /** + * 获取患者问诊可用的优惠卷 + * @param string|int $user_id 用户id + * @param string|int $inquiry_type 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) + * @param array $fields 字段 + * @return Collection|array + */ + public static function getUserInquiryUsableCoupon(string|int $user_id, string|int $inquiry_type,array $fields = ['*']): Collection|array + { + $params = array(); + $params[] = ['user_id', '=', $user_id]; + $params[] = ['user_coupon_status', '=', 0];// 状态(0:未使用 1:已使用 3:已过期) + $params[] = ['valid_start_time', '<', date('Y-m-d H:i:s', time())]; // 有效使用时间 + $params[] = ['valid_end_time', '>', date('Y-m-d H:i:s', time())]; // 过期使用时间 + + return self::with(['Coupon'=> function($query) use($inquiry_type){ + $query->where("coupon_client",1) + ->where("coupon_status",1) + ->where("application_scope",2) + ->where(function ($query) use ($inquiry_type) { + $query->orwhere("inquiry_type","like",'%' . $inquiry_type+1 . '%'); + $query->orwhere("inquiry_type","like",'%1%'); + }); + }]) + ->where($params) + ->get($fields); + } } diff --git a/app/Services/InquiryService.php b/app/Services/InquiryService.php index 73b3c8b..fccde9a 100644 --- a/app/Services/InquiryService.php +++ b/app/Services/InquiryService.php @@ -150,14 +150,20 @@ class InquiryService extends BaseService return fail(HttpEnumCode::HTTP_ERROR, "当前非医生接诊时间"); } + // 定义优惠卷金额默认值 + $coupon_amount_total = 0; + // 获取问诊价格 $DoctorInquiryService = new DoctorInquiryService(); $inquiry_price = $DoctorInquiryService->getDoctorInquiryPrice($request_params['inquiry_type'], $request_params['inquiry_mode'], $request_params['doctor_id'] ?: ""); if ($inquiry_price > 0) { - // 获取用户可用优惠卷 + // 获取患者问诊可用的优惠卷 $userCouponService = new UserCouponService(); - $user_coupon = $userCouponService->getUserUsableCouponOne($user_info['user_id'], $request_params['inquiry_type']); + $user_coupon = $userCouponService->getUserInquiryUsableCoupon($user_info['user_id'], $request_params['inquiry_type']); + + // 获取可用优惠卷总金额 + $coupon_amount_total = $userCouponService->getCouponTotalPrice($user_coupon); } // 确定支付渠道 @@ -174,8 +180,7 @@ class InquiryService extends BaseService try { // 实际付款金额 - $coupon_amount_total = $user_coupon['coupon']['coupon_price'] ?? 0; - $payment_amount_total = $inquiry_price - $coupon_amount_total; + $payment_amount_total = bcsub($inquiry_price , $coupon_amount_total,2); if ($payment_amount_total < 0) { $payment_amount_total = 0; } diff --git a/app/Services/UserCouponService.php b/app/Services/UserCouponService.php index c527173..2e56978 100644 --- a/app/Services/UserCouponService.php +++ b/app/Services/UserCouponService.php @@ -10,34 +10,75 @@ use App\Model\UserCoupon; class UserCouponService extends BaseService { /** - * 获取用户可用优惠卷-单条 - * @param string|int $user_id 用户id - * @param string|int $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) - * @param int $coupon_client 使用平台(1:小程序) + * 获取患者问诊可用的优惠卷 + * @param string|int $user_id + * @param string|int $inquiry_type * @return array */ - public function getUserUsableCouponOne(string|int $user_id, string|int $inquiry_type, int $coupon_client = 1): array + public function getUserInquiryUsableCoupon(string|int $user_id, string|int $inquiry_type): array { - // 问诊类型需加1 - $inquiry_type = $inquiry_type + 1; - - $params = array(); - $params[] = ['user_id', '=', $user_id]; - $params[] = ['user_coupon_status', '=', 0];// 状态(0:未使用 1:已使用 3:已过期) - $params[] = ['valid_start_time', '<', date('Y-m-d H:i:s', time())]; // 有效使用时间 - $params[] = ['valid_end_time', '>', date('Y-m-d H:i:s', time())]; // 过期使用时间 - - $coupon_params = array(); - $coupon_params[] = ['coupon_client', '=', $coupon_client]; - $coupon_params[] = ['coupon_status', '=', 1]; // 状态(1:正常 2:强制失效 3:结束 4:删除) - - $application_scope_params = [1, $inquiry_type]; // 适用范围(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药) - - $user_coupon = \App\Model\UserCoupon::getDateWithCouponOne($params, $coupon_params, $application_scope_params); - if (empty($user_coupon)) { + $user_coupons = UserCoupon::getUserInquiryUsableCoupon($user_id, $inquiry_type); + if (empty($user_coupons)) { return array(); } - return $user_coupon->toArray(); + // 选中的优惠卷 + $selected_coupons = array(); + + // 优惠卷最高金额 + $coupon_high_price = 0; + + // 是否存在互斥卷 + $is_mutex = 0; + + // 可选择优惠卷中是否存在互斥卷 + foreach ($user_coupons as $coupon) { + if ($coupon['is_mutex'] == 1) { + $is_mutex = 1; + } + } + + foreach ($user_coupons as $coupon) { + if (empty($selected_coupon)) { + $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 getCouponTotalPrice(array $coupons): int + { + $coupon_total_price = 0; + + foreach ($coupons as $coupon){ + $coupon_total_price = bcadd($coupon_total_price,$coupon['coupon_price'],2); + } + + return $coupon_total_price; } } \ No newline at end of file