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

206 lines
8.2 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\Amqp\Producer\AutoFinishInquiryDelayDirectProducer;
use App\Constants\HttpEnumCode;
use App\Model\OrderInquiry;
use App\Model\OrderPrescription;
use App\Model\PatientHistoryInquiry;
use App\Model\UserDoctor;
use App\Services\ImService;
use App\Services\MessagePush;
use App\Utils\Log;
use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait;
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
use Hyperf\Amqp\Message\Type;
use Hyperf\Amqp\Producer;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\DbConnection\Db;
use PhpAmqpLib\Message\AMQPMessage;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/**
* 自动完成问诊订单
* 延迟队列
*/
#[Consumer(nums: 1)]
class AutoCompleteInquiryDelayDirectConsumer extends ConsumerMessage
{
use ProducerDelayedMessageTrait;
use ConsumerDelayedMessageTrait;
protected string $exchange = 'amqp.delay.direct';
protected ?string $queue = 'auto.complete.inquiry.delay.queue';
protected string $type = Type::DIRECT; //Type::FANOUT;
protected string|array $routingKey = 'AutoCompleteInquiry';
public function consumeMessage($data, AMQPMessage $message): string
{
Log::getInstance("queue-AutoCompleteInquiry")->info(json_encode($data, JSON_UNESCAPED_UNICODE));
Db::beginTransaction();
try {
// 检测入参参数
if (empty($data['order_inquiry_id'])) {
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->error("参数错误");
return Result::DROP;
}
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $data['order_inquiry_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->error("问诊订单数据为空");
return Result::DROP;
}
$order_inquiry = $order_inquiry->toArray();
// 检测问诊订单状态
if ($order_inquiry['inquiry_status'] != 4) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->info("无需处理");
return Result::ACK;
}
// 检测问诊订单退款状态
if (!in_array($order_inquiry['inquiry_refund_status'],[0,4,5])){
// 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->info("订单退款中,无需处理");
return Result::ACK;
}
// 订单支付状态
if ($order_inquiry['inquiry_pay_status'] != 2){
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->info("订单未支付,无需处理");
return Result::ACK;
}
// 新增患者历史问诊表
$data = array();
$data['patient_id'] = $order_inquiry['patient_id'];
$data['doctor_id'] = $order_inquiry['doctor_id'];
if (!empty($order_inquiry['pharmacist_id'])){
$data['pharmacist_id'] = $order_inquiry['pharmacist_id'];
}
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$data['history_status'] = 1;
$patient_history_inquiry = PatientHistoryInquiry::addPatientHistoryInquiry($data);
if (empty($patient_history_inquiry)){
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->error("新增患者历史问诊表失败");
return Result::REQUEUE;
}
// 获取医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if(empty($user_doctor)){
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->error("缺少医生数据");
return Result::DROP;
}
// 处理问诊订单数据为已完成
$data = array();
$data['inquiry_status'] = 5;// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$data['complete_time'] = 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_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$params['doctor_id'] = $user_doctor['doctor_id'];
$params['pharmacist_audit_status'] = 1;
$order_prescription = OrderPrescription::getList($params);
foreach ($order_prescription as $item){
if ($item['prescription_status'] == 1 && $item['pharmacist_audit_status'] == 0){
$params = array();
$params['order_prescription_id'] = $item['order_prescription_id'];
$data = array();
$data['pharmacist_audit_status'] = 2;
$data['pharmacist_verify_time'] = date('Y-m-d H:i:s',time());
$data['pharmacist_fail_reason'] = "当前问诊已结束,药师还未审核处方,系统自动驳回";
OrderPrescription::edit($params,$data);
// 是否需要推送消息
$is_push_prescription_verify_fail = true;
// 驳回处方id
$order_prescription_id = $item['order_prescription_id'];
}
}
// 添加自动完成队列
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$message = new AutoFinishInquiryDelayDirectProducer($data);
$message->setDelayMs(1000 * 60 * 60 * 24 * 3);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->error("添加自动结束队列失败");
return Result::DROP;
}
Db::commit();
Log::getInstance("queue-AutoCompleteInquiry")->info("执行成功");
} catch (\Exception $e) {
Db::rollBack();
Log::getInstance("queue-AutoCompleteInquiry")->error($e->getMessage());
return Result::ACK; // 重回队列
}
// 发送消息
try {
if (isset($is_push_prescription_verify_fail)){
// 站内、订阅失败发送短信-医生开具的处方审核未通过
$order_prescription_id = $order_prescription_id ?? "";
$MessagePush = new MessagePush($user_doctor['user_id'],$order_inquiry['inquiry_no']);
$MessagePush->prescriptionVerifyFail($order_prescription_id);
}
// 发送IM消息-问诊已完成
$imService = new ImService();
$imService->inquiryComplete($order_inquiry,$user_doctor['user_id'],$order_inquiry['user_id']);
// 发送IM消息-问诊结束评价通知
$imService->inquiryEndEvaluation($order_inquiry,$user_doctor['user_id'],$order_inquiry['user_id']);
// 医生-发送站内消息-问诊结束
$MessagePush = new MessagePush($user_doctor['user_id'],$order_inquiry['inquiry_no']);
$MessagePush->finishInquiryToDoctor();
}catch (\Throwable $e){
Log::getInstance("queue-AutoCompleteInquiry")->error($e->getMessage());
return Result::ACK;
}
return Result::ACK;
}
}