From 98cc84a75d87b69f2251b4f82864c68905b0eba1 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 18 Apr 2024 17:19:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8D=AF=E5=93=81=E8=AE=A2=E5=8D=95=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E3=80=81=E5=88=9B=E5=BB=BA=E8=8D=AF=E5=93=81=E8=AE=A2?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/PatientOrderController.php | 4 +- app/Request/PatientOrderRequest.php | 1 + app/Services/PatientOrderService.php | 329 +++++++++++++++------- 3 files changed, 235 insertions(+), 99 deletions(-) diff --git a/app/Controller/PatientOrderController.php b/app/Controller/PatientOrderController.php index 83d543d..dc4eb5e 100644 --- a/app/Controller/PatientOrderController.php +++ b/app/Controller/PatientOrderController.php @@ -108,6 +108,8 @@ class PatientOrderController extends AbstractController /** * 药品订单取消支付 * @return ResponseInterface + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ public function putPatientProductOrderCancelPay(): ResponseInterface { @@ -147,7 +149,7 @@ class PatientOrderController extends AbstractController * 模拟支付成功-金额为0时使用 * @return ResponseInterface * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface|GuzzleException + * @throws NotFoundExceptionInterface */ public function addPatientOrderPay(): ResponseInterface { diff --git a/app/Request/PatientOrderRequest.php b/app/Request/PatientOrderRequest.php index ab7109a..d561500 100644 --- a/app/Request/PatientOrderRequest.php +++ b/app/Request/PatientOrderRequest.php @@ -24,6 +24,7 @@ class PatientOrderRequest extends FormRequest "order_no"// 订单编号 ], 'addPatientOrderPay' => [ // 模拟支付成功-金额为0时使用 + "order_type", // 订单类型(1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单) "order_no"// 订单编号 ], 'addPatientProductOrder' => [ // 创建药品订单 diff --git a/app/Services/PatientOrderService.php b/app/Services/PatientOrderService.php index 9d2d32b..c1f4d61 100644 --- a/app/Services/PatientOrderService.php +++ b/app/Services/PatientOrderService.php @@ -6,9 +6,11 @@ use App\Amqp\Producer\AssignDoctorDelayDirectProducer; use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Amqp\Producer\DoctorNotYetInquiryDelayDirectProducer; +use App\Amqp\Producer\GrantUserCouponDelayDirectProducer; use App\Constants\DoctorTitleCode; use App\Constants\HttpEnumCode; use App\Model\BasicLogisticsCompany; +use App\Model\Coupon; use App\Model\DetectionProject; use App\Model\DiseaseClass; use App\Model\DoctorInquiryConfig; @@ -654,6 +656,8 @@ class PatientOrderService extends BaseService /** * 药品订单取消支付 * @return array + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ public function putPatientProductOrderCancelPay(): array { @@ -661,8 +665,18 @@ class PatientOrderService extends BaseService $order_product_id = $this->request->route('order_product_id'); - Db::beginTransaction(); + $redis = $this->container->get(Redis::class); + $redis_key = "order_product_lock_" . $order_product_id; + $redis_lock = $redis->setnx($redis_key, 1); + if (!$redis_lock) { + // 设置失败,表示已经设置该值 + return fail(HttpEnumCode::HTTP_SUCCESS, "请您稍后重试"); + } + // 设置过期时间 + $redis->expire($redis_key, 3); + + Db::beginTransaction(); try { // 获取药品订单数据 $params = array(); @@ -1126,123 +1140,242 @@ class PatientOrderService extends BaseService { $user_info = $this->request->getAttribute("userInfo") ?? []; + $order_type = $this->request->input('order_type'); $order_no = $this->request->input('order_no'); Db::beginTransaction(); try { - // 问诊订单 - $params = array(); - $params['inquiry_no'] = $order_no; - $params['patient_id'] = $user_info['client_user_id']; - $order_inquiry = OrderInquiry::getOne($params); - if (empty($order_inquiry)) { - Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); - } + switch ($order_type) { + case 1: // 问诊订单 + $params = array(); + $params['inquiry_no'] = $order_no; + $params['patient_id'] = $user_info['client_user_id']; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); + } - // 获取病例数据 - $params = array(); - $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - $order_inquiry_case = OrderInquiryCase::getOne($params); - if (empty($order_inquiry_case)) { - Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR, "患者病例错误"); - } + // 获取病例数据 + $params = array(); + $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $order_inquiry_case = OrderInquiryCase::getOne($params); + if (empty($order_inquiry_case)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "患者病例错误"); + } - // 验证订单状态 - if ($order_inquiry['inquiry_status'] != 1) { - Db::rollBack(); - // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) - return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); - } + // 验证订单状态 + if ($order_inquiry['inquiry_status'] != 1) { + // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); + } - // 验证支付金额 - if ($order_inquiry['payment_amount_total'] != 0) { - Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); - } + // 验证支付金额 + if ($order_inquiry['payment_amount_total'] != 0) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); + } - $generator = $this->container->get(IdGeneratorInterface::class); - $escrow_trade_no = "GD" . $generator->generate(); // 第三方支付流水号 - // 修改问诊订单支付状态 - $data = array(); - $data['inquiry_pay_channel'] = 3; // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) - $data['inquiry_pay_status'] = 2; - if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) { - // 专家-公益 - $data['inquiry_status'] = 3;// 3:待接诊 - } elseif ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) { - // 快速-购药 - $data['inquiry_status'] = 2;// 2:待分配 - } + $generator = $this->container->get(IdGeneratorInterface::class); + $escrow_trade_no = "GD" . $generator->generate(); // 第三方支付流水号 - $data['escrow_trade_no'] = $escrow_trade_no; - $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 - $data['updated_at'] = date('Y-m-d H:i:s', time()); - $params = array(); - $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - OrderInquiry::edit($params, $data); + // 修改问诊订单支付状态 + $data = array(); + $data['inquiry_pay_channel'] = 3; // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + $data['inquiry_pay_status'] = 2; + if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) { + // 专家-公益 + $data['inquiry_status'] = 3;// 3:待接诊 + } elseif ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) { + // 快速-购药 + $data['inquiry_status'] = 2;// 2:待分配 + } - // 修改订单表支付状态 - $data = array(); - $data['pay_status'] = 2; - $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 - $data['escrow_trade_no'] = $escrow_trade_no; - $data['updated_at'] = date('Y-m-d H:i:s', time()); + $data['escrow_trade_no'] = $escrow_trade_no; + $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 + $data['updated_at'] = date('Y-m-d H:i:s', time()); + $params = array(); + $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + OrderInquiry::edit($params, $data); - $params = array(); - $params['order_no'] = $order_inquiry['inquiry_no']; - Order::edit($params,$data); + // 修改订单表支付状态 + $data = array(); + $data['pay_status'] = 2; + $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 + $data['escrow_trade_no'] = $escrow_trade_no; + $data['updated_at'] = date('Y-m-d H:i:s', time()); - // 处理队列 - if ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) { - // 快速-购药 - // 加入分配医生队列 - $data = array(); - $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $params = array(); + $params['order_no'] = $order_inquiry['inquiry_no']; + Order::edit($params,$data); - $message = new AssignDoctorDelayDirectProducer($data); - $message->setDelayMs(1000 * 5); - $producer = $this->container->get(Producer::class); - $res = $producer->produce($message); - if (!$res) { + // 加入分配医生队列-快速-购药 + if ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) { + $data = array(); + $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + + $message = new AssignDoctorDelayDirectProducer($data); + $message->setDelayMs(1000 * 5); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "分配医生失败"); + } + } + + // 发送首条im消息-专家-公益 + if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) { + // 获取订单医生数据 + $params = array(); + $params['doctor_id'] = $order_inquiry['doctor_id']; + $user_doctor = UserDoctor::getOne($params); + if (empty($user_doctor)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "医生数据错误"); + } + + // 发送im消息 + $imService = new ImService(); + + // 等待医生接诊 + $imService->waitDoctorInquiry($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id']); + + // 发送站内、订阅失败发送短信消息-医生有新问诊 + $MessagePush = new MessagePush($user_doctor['user_id'], $order_inquiry['order_inquiry_id']); + $MessagePush->doctorHaveNewInquiry(); + + // 加入xx时间未接诊通知队列 + $data = array(); + $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + + $time = 1000 * 60 * 60 * 2; + $message = new DoctorNotYetInquiryDelayDirectProducer($data); + $message->setDelayMs($time); + $producer = $this->container->get(Producer::class); + $producer->produce($message); + } + + break; + case 2: // 药品订单 + $params = array(); + $params['order_product_no'] = $order_no; + $params['patient_id'] = $user_info['client_user_id']; + $order_product = OrderProduct::getOne($params); + if (empty($order_product)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); + } + + // 验证订单状态 + if ($order_product['order_product_status'] != 1) { + // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); + } + + // 验证支付金额 + if ($order_product['payment_amount_total'] != 0) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); + } + + $generator = $this->container->get(IdGeneratorInterface::class); + $escrow_trade_no = "GD" . $generator->generate(); // 第三方支付流水号 + + // 修改药品订单支付状态 + $data = array(); + $data['order_product_status'] = 2; + $data['pay_status'] = 2; + $data['pay_channel'] = 3; // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + $data['escrow_trade_no'] = $escrow_trade_no; + $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 + $data['updated_at'] = date('Y-m-d H:i:s', time()); + + $params = array(); + $params['order_product_id'] = $order_product['order_product_id']; + OrderProduct::edit($params, $data); + + // 修改订单表支付状态 + $data = array(); + $data['pay_status'] = 2; + $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 + $data['escrow_trade_no'] = $escrow_trade_no; + $data['updated_at'] = date('Y-m-d H:i:s', time()); + + $params = array(); + $params['order_no'] = $order_product['order_product_no']; + Order::edit($params,$data); + + try { + if ($order_product['coupon_amount_total'] > 0){ + // 获取药品订单优惠卷数据 + $params = array(); + $params['order_product_id'] = $order_product['order_product_id']; + $order_product_coupons = OrderProductCoupon::getList($params); + if (!empty($order_product_coupons)){ + foreach ($order_product_coupons as $order_product_coupon){ + // 获取用户优惠卷数据 + $params = array(); + $params['user_coupon_id'] = $order_product_coupon['user_coupon_id']; + $user_coupon = UserCoupon::getOne($params); + if (!empty($user_coupon)){ + // 获取优惠卷数据 + $params = array(); + $params['coupon_id'] = $user_coupon['coupon_id']; + $coupon = Coupon::getOne($params); + if (!empty($coupon)){ + if ($coupon['reissue_interval_days'] > 0){ + $data = array(); + $data['coupon_id'] = $coupon['coupon_id']; + $data['user_id'] = $user_coupon['user_id']; + + $time = $coupon['reissue_interval_days'] * 24 * 60 * 60 * 1000; + $message = new GrantUserCouponDelayDirectProducer($data); + $message->setDelayMs($time); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Log::getInstance("PatientOrderService-addPatientOrderPay")->error("再次发放优惠卷失败"); + } + + Log::getInstance("PatientOrderService-addPatientOrderPay")->info("再次发放优惠卷成功"); + } + } + } + } + } + } + }catch (\Throwable $e){ + // 此处异常不做处理 + Log::getInstance("PatientOrderService-addPatientOrderPay")->error($e->getMessage()); + } + + break; + case 3: // 检测订单 Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR, "分配医生失败"); - } - } elseif ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) { - // 专家-公益,发送im消息 - // 获取订单医生数据 - $params = array(); - $params['doctor_id'] = $order_inquiry['doctor_id']; - $user_doctor = UserDoctor::getOne($params); - if (empty($user_doctor)) { + return fail(HttpEnumCode::HTTP_ERROR, "非法订单类型"); + + break; + case 4: // 健康包订单 Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR, "医生数据错误"); - } + return fail(HttpEnumCode::HTTP_ERROR, "非法订单类型"); - // 发送im消息 - $imService = new ImService(); + break; + case 5: // 随访包订单 - // 等待医生接诊 - $imService->waitDoctorInquiry($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id']); - - // 发送站内、订阅失败发送短信消息-医生有新问诊 - $MessagePush = new MessagePush($user_doctor['user_id'], $order_inquiry['order_inquiry_id']); - $MessagePush->doctorHaveNewInquiry(); - - // 加入xx时间未接诊通知队列 - $data = array(); - $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - - $time = 1000 * 60 * 60 * 2; - $message = new DoctorNotYetInquiryDelayDirectProducer($data); - $message->setDelayMs($time); - $producer = $this->container->get(Producer::class); - $producer->produce($message); + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "非法订单类型"); + break; + default: + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "支付失败"); } Db::commit(); - } catch (\Exception $e) { + }catch (\Throwable $e){ Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage()); }