diff --git a/app/Amqp/Consumer/AssignDoctorDelayDirectConsumer.php b/app/Amqp/Consumer/AssignDoctorDelayDirectConsumer.php index 6c9e8ec..8df9858 100644 --- a/app/Amqp/Consumer/AssignDoctorDelayDirectConsumer.php +++ b/app/Amqp/Consumer/AssignDoctorDelayDirectConsumer.php @@ -52,85 +52,88 @@ class AssignDoctorDelayDirectConsumer extends ConsumerMessage public function consumeMessage($data, AMQPMessage $message): string { - return Result::ACK; Log::getInstance('queue-AssignDoctor')->info(json_encode($data, JSON_UNESCAPED_UNICODE)); - // 获取订单数据 - $params = array(); - $params['order_inquiry_id'] = $data['order_inquiry_id']; - $order_inquiry = OrderInquiry::getOne($params); - if (empty($order_inquiry)) { - Log::getInstance('queue-AssignDoctor')->error("未查询到对应订单数据"); - return Result::DROP;// 销毁 - } + // 检测执行次数并处理分配医生失败情况 + Db::beginTransaction(); + try { + // 获取订单数据 + $params = array(); + $params['order_inquiry_id'] = $data['order_inquiry_id']; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + Log::getInstance('queue-AssignDoctor')->error("未查询到对应订单数据"); + return Result::DROP;// 销毁 + } - // 获取病例数据 - $params = array(); - $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - $order_inquiry_case = OrderInquiryCase::getOne($params); - if (empty($order_inquiry_case)){ - Log::getInstance('queue-AssignDoctor')->error("患者病例错误"); - return Result::DROP;// 销毁 - } + // 检测执行次数 + $Utils = new Utils(); + $redis_key = "assign_doctor_number_" . $data['order_inquiry_id']; + $res = $Utils->checkHandleNumber($redis_key); + if (!$res) { + Log::getInstance("queue-AssignDoctor")->error("超出最大执行次数或检测错误"); - // 检测订单状态 - $res = $this->checkInquiryStatus($order_inquiry); - if (!$res){ - Log::getInstance('queue-AssignDoctor')->error("订单状态错误"); - return Result::DROP;// 销毁 - } + // 处理分配医生失败 + $this->handleAssignDoctorFail($order_inquiry['inquiry_no']); - // 检测分配时间 - $pay_time = strtotime($order_inquiry['pay_time']); - $diff_time = time() - $pay_time; - if ($diff_time < 0) { - Log::getInstance('queue-AssignDoctor')->error("支付时间错误"); - return Result::DROP;// 销毁 + Db::commit(); + return Result::ACK; + }else{ + Db::commit(); + } + }catch (\Throwable $e){ + Db::rollBack(); + Log::getInstance("queue-AssignDoctor")->error($e->getMessage()); + return Result::REQUEUE; } Db::beginTransaction(); try { - // 检测当前是否符合系统问诊时间 + // 获取病例数据 + $params = array(); + $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $order_inquiry_case = OrderInquiryCase::getOne($params); + if (empty($order_inquiry_case)){ + Log::getInstance('queue-AssignDoctor')->error("患者病例错误"); + + // 处理分配医生失败 + $this->handleAssignDoctorFail($order_inquiry['inquiry_no']); + + Db::commit(); + return Result::DROP;// 销毁 + } + + // 检测订单状态 + $res = $this->checkInquiryStatus($order_inquiry); + if (!$res){ + Log::getInstance('queue-AssignDoctor')->error("订单状态错误"); + + // 处理分配医生失败 + $this->handleAssignDoctorFail($order_inquiry['inquiry_no']); + + Db::commit(); + return Result::DROP;// 销毁 + } + + // 检测分配时间 + $pay_time = strtotime($order_inquiry['pay_time']); + $diff_time = time() - $pay_time; + if ($diff_time < 0) { + Log::getInstance('queue-AssignDoctor')->error("支付时间错误"); + + // 处理分配医生失败 + $this->handleAssignDoctorFail($order_inquiry['inquiry_no']); + + Db::commit(); + return Result::DROP;// 销毁 + } + + // 检测当前是否符合系统问诊时间-非坐班时间,执行退款 $inquiryService = new InquiryService(); $is_system_time_pass = $inquiryService->checkSystemInquiryTime($order_inquiry['inquiry_type']); if (!$is_system_time_pass && $order_inquiry['inquiry_type'] == 4){ - // 非坐班时间 - Log::getInstance("queue-AssignDoctor")->info("非坐班时间,执行退款"); - - // 检测执行次数 - $Utils = new Utils(); - $redis_key = "inquiryRefund" . $order_inquiry['inquiry_no']; - $res = $Utils->checkHandleNumber($redis_key); - if (!$res) { - Db::rollBack(); - Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大执行次数或检测错误"); - return Result::ACK; - } - - $OrderService = new OrderService(); - $OrderService->orderRefund($order_inquiry['inquiry_no'], "无可分配医生"); - - // 取消订单 - $order_data = array(); - $order_data['cancel_status'] = 1; - $order_data['cancel_time'] = date("Y-m-d H:i:s", time()); - $order_data['cancel_remarks'] = "未分配到合适的医生"; - $order_data['updated_at'] = date("Y-m-d H:i:s", time()); - - $params = array(); - $params['order_id'] = $order_inquiry['order_id']; - Order::edit($params, $order_data); - - $save_data = array(); - $save_data['inquiry_status'] = 7; - $save_data['cancel_time'] = date("Y-m-d H:i:s", time()); - $save_data['cancel_reason'] = 3; // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) - $save_data['cancel_remarks'] = "未分配到合适的医生"; // 取消订单备注 - $save_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, $save_data); + // 处理分配医生失败 + $this->handleAssignDoctorFail($order_inquiry['inquiry_no']); Db::commit(); @@ -145,46 +148,10 @@ class AssignDoctorDelayDirectConsumer extends ConsumerMessage return Result::ACK; } - // 检测分配时间 + // 检测分配时间-超出10分钟,执行退款 if ($diff_time > 600) { - Log::getInstance("queue-AssignDoctor")->info("超出10分钟,执行退款"); - - // 检测执行次数 - $Utils = new Utils(); - $redis_key = "inquiryRefund" . $order_inquiry['inquiry_no']; - $res = $Utils->checkHandleNumber($redis_key); - if (!$res) { - Db::rollBack(); - Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大执行次数或检测错误"); - return Result::ACK; - } - - $OrderService = new OrderService(); - $OrderService->orderRefund($order_inquiry['inquiry_no'], "未分配到合适的医生"); - - // 取消订单 - $order_data = array(); - $order_data['cancel_status'] = 1; - $order_data['cancel_time'] = date("Y-m-d H:i:s", time()); - $order_data['cancel_remarks'] = "未分配到合适的医生"; - $order_data['updated_at'] = date("Y-m-d H:i:s", time()); - - $params = array(); - $params['order_id'] = $order_inquiry['order_id']; - Order::edit($params, $order_data); - - $save_data = array(); - $save_data['inquiry_status'] = 7; - $save_data['cancel_time'] = date("Y-m-d H:i:s", time()); - $save_data['cancel_reason'] = 3; // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) - $save_data['cancel_remarks'] = "未分配到合适的医生"; // 取消订单备注 - $save_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, $save_data); - - Log::getInstance("queue-AssignDoctor")->info("已退款"); + // 处理分配医生失败 + $this->handleAssignDoctorFail($order_inquiry['inquiry_no']); Db::commit(); @@ -199,49 +166,18 @@ class AssignDoctorDelayDirectConsumer extends ConsumerMessage return Result::ACK; } - // 检测执行次数 - $res = $this->checkHandleNumber($data['order_inquiry_id']); - if (!$res) { - // 超出执行次数后,不再进行分配,按照结束分配时间,重新加入队列。 - Log::getInstance("queue-AssignDoctor")->info("超出最大执行次数或检测错误"); - - Log::getInstance("queue-AssignDoctor")->info("重新加入延迟队列"); - + // 分配医生 + $UserDoctorService = new UserDoctorService(); + $doctor_id = $UserDoctorService->getInquiryAssignDoctor($order_inquiry['inquiry_type'],$order_inquiry['patient_id'],$is_system_time_pass); + if (empty($doctor_id)){ $queue_data = array(); $queue_data['order_inquiry_id'] = $data['order_inquiry_id']; // 5分钟-支付时间-1s:10:00支付 此时10:04 5-(10:04-10:00) - $time = 1000 * (300- (time() - $pay_time) - 1); + $time = 300- (time() - $pay_time) - 1; $message = new AssignDoctorDelayDirectProducer($queue_data); - $message->setDelayMs($time); - $producer = $this->container->get(Producer::class); - $res = $producer->produce($message); - if (!$res) { - Db::rollBack(); - Log::getInstance("queue-AssignDoctor")->error("重新加入分配医生队列失败,重回队列"); - return Result::REQUEUE; - } - - Db::commit(); - Log::getInstance("queue-AssignDoctor")->info("结束"); - return Result::ACK; - } - - Log::getInstance("queue-AssignDoctor")->info("分配医生"); - $UserDoctorService = new UserDoctorService(); - $doctor_id = $UserDoctorService->getInquiryAssignDoctor($order_inquiry['inquiry_type'],$order_inquiry['patient_id'],$is_system_time_pass); - if (empty($doctor_id)){ - Log::getInstance("queue-AssignDoctor")->info("无合适医生"); - Db::rollBack(); - - Log::getInstance("queue-AssignDoctor")->info("重新加入延迟队列"); - - $queue_data = array(); - $queue_data['order_inquiry_id'] = $data['order_inquiry_id']; - - $message = new AssignDoctorDelayDirectProducer($queue_data); - $message->setDelayMs(1000 * 60); + $message->setDelayMs(1000 * $time); $producer = $this->container->get(Producer::class); $res = $producer->produce($message); if (!$res) { @@ -401,4 +337,36 @@ class AssignDoctorDelayDirectConsumer extends ConsumerMessage return true; } + /** + * 处理分配医生失败 + * @param string $inquiry_no + * @return void + */ + protected function handleAssignDoctorFail(string $inquiry_no): void + { + $OrderService = new OrderService(); + $OrderService->orderRefund($inquiry_no, "无可分配医生"); + + // 取消订单 + $order_data = array(); + $order_data['cancel_status'] = 1; + $order_data['cancel_time'] = date("Y-m-d H:i:s", time()); + $order_data['cancel_remarks'] = "未分配到合适的医生"; + $order_data['updated_at'] = date("Y-m-d H:i:s", time()); + + $params = array(); + $params['order_no'] = $inquiry_no; + Order::edit($params, $order_data); + + $save_data = array(); + $save_data['inquiry_status'] = 7; + $save_data['cancel_time'] = date("Y-m-d H:i:s", time()); + $save_data['cancel_reason'] = 3; // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) + $save_data['cancel_remarks'] = "未分配到合适的医生"; // 取消订单备注 + $save_data['updated_at'] = date("Y-m-d H:i:s", time()); + + $params = array(); + $params['inquiry_no'] = $inquiry_no; + OrderInquiry::edit($params, $save_data); + } }