hospital-applets-api/app/Amqp/Consumer/AssignDoctorConsumer.php

123 lines
4.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace App\Amqp\Consumer;
use App\Model\OrderInquiry;
use App\Services\UserDoctorService;
use App\Utils\Log;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\Redis\Redis;
use PhpAmqpLib\Message\AMQPMessage;
/**
* 分配医生
* 快速问诊、问诊购药等订单支付完成后,进行分配医生
*/
#[Consumer(exchange: 'amqp.direct', routingKey: 'AssignDoctor', queue: 'assign.doctor.queue', nums: 1)]
class AssignDoctorConsumer extends ConsumerMessage
{
public function consumeMessage($data, AMQPMessage $message): string
{
Log::getInstance()->error("开始执行 分配医生 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE));
try {
// 获取订单数据
$params = array();
$params['order_inquiry_id'] = $data['order_inquiry_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
Log::getInstance()->error("队列执行失败原因:未查询到对应订单数据");
return Result::DROP;// 销毁
}
// 检测订单分配状态
if (!empty($order_inquiry['doctor_id'])){
Log::getInstance()->error("队列执行失败原因:已分配医生");
return Result::DROP;// 销毁
}
// 检测订单类型
if ($order_inquiry['inquiry_type'] != 2 && $order_inquiry['inquiry_type'] != 4){
Log::getInstance()->error("队列执行失败原因:订单非快速问诊、问诊购药类型");
return Result::DROP;// 销毁
}
// 检测订单退款状态
if (in_array($order_inquiry['inquiry_refund_status'],[1,2,3])){
// 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
Log::getInstance()->error("队列执行失败原因:订单存在退款");
return Result::DROP;// 销毁
}
// 检测订单状态
if ($order_inquiry['inquiry_status'] != 2){
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
Log::getInstance()->info("订单状态错误:当前为" . $order_inquiry['inquiry_status'] . " 无法进行分配");
return Result::DROP;// 销毁
}
// 检测订单支付状态
if ($order_inquiry['inquiry_pay_status'] != 2){
// 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
Log::getInstance()->info("订单支付状态错误:当前为" . $order_inquiry['inquiry_pay_status'] . " 无法进行分配");
return Result::DROP;// 销毁
}
// 检测订单分配时间
$pay_time = strtotime($order_inquiry['pay_time']);
$diff_time = time() - $pay_time;
if ($diff_time < 0){
Log::getInstance()->info("订单支付状态错误:时间计算错误");
return Result::DROP;// 销毁
}
if ($diff_time > 300){
// 超出5分钟执行退款
}
$redis = $this->container->get(Redis::class);
$redis_key = $order_inquiry['order_inquiry_id'];
// 分配医生
$UserDoctorService = new UserDoctorService();
$doctor_id = $UserDoctorService->getInquiryAssignDoctor($order_inquiry['inquiry_type']);
if (empty($doctor_id)){
Log::getInstance()->error("重回队列,目前没有合适医生");
$redis_value = $redis->get($redis_key);
if (!empty($redis_value)){
$redis_value = $redis_value + 1;
}else{
$redis_value = 1;
}
// 添加缓存添加失败情况不考虑最终都会睡眠5秒
$redis->set($redis_key,$redis_value);
// 执行睡眠,防止重复执行队列
// 执行规则第一次5秒第二次10秒。以5的倍数增加
sleep($redis_value * 5);
return Result::REQUEUE; // 重回队列
}
// 更改数据库
$data = array();
$data['doctor_id'] = $doctor_id;
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
OrderInquiry::edit($params,$data);
Log::getInstance()->error("分配医生 队列执行成功");
return Result::ACK;
} catch (\Exception $e) {
Log::getInstance()->error("队列执行失败原因:" . $e->getMessage());
return Result::REQUEUE; // 重回队列
}
}
}