Files
hospital-applets-api/app/Amqp/Consumer/AutoCompleteInquiryDelayDirectConsumer.php
T
2023-04-14 16:20:53 +08:00

185 lines
7.8 KiB
PHP

<?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()->error("开始执行 自动完成问诊订单 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE));
Db::beginTransaction();
try {
// 检测入参参数
if (empty($data['order_inquiry_id'])) {
Db::rollBack();
Log::getInstance()->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()->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()->info("自动完成问诊订单队列执行结果:无需处理");
return Result::DROP;
}
// 检测问诊订单退款状态
if (!in_array($order_inquiry['inquiry_refund_status'],[0,4,5])){
// 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
Db::rollBack();
Log::getInstance()->info("自动完成问诊订单队列执行结果:订单退款中,无需处理");
return Result::DROP;
}
// 订单支付状态
if ($order_inquiry['inquiry_pay_status'] != 2){
Db::rollBack();
Log::getInstance()->info("自动完成问诊订单队列执行结果:订单未支付,无需处理");
return Result::DROP;
}
// 新增患者历史问诊表
$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()->info("自动完成问诊订单队列执行结果:新增患者历史问诊表失败");
return Result::DROP;
}
// 获取医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if(empty($user_doctor)){
Db::rollBack();
Log::getInstance()->info("自动完成问诊订单队列执行结果:缺少医生数据");
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);
// 站内、订阅失败发送短信-医生开具的处方审核未通过
$MessagePush = new MessagePush($user_doctor['user_id'],$order_inquiry['order_inquiry_id']);
$MessagePush->prescriptionVerifyFail($order_prescription['order_prescription_id']);
}
}
// 发送IM消息-问诊已结束
$imService = new ImService();
$imService->inquiryEnd($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['order_inquiry_id']);
$MessagePush->finishInquiryToDoctor();
// 添加自动完成队列
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$message = new AutoFinishInquiryDelayDirectProducer($data);
$message->setDelayMs(1000 * 60 * 1);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
Log::getInstance()->info("自动完成问诊订单队列执行结果:添加自动结束队列失败");
return Result::DROP;
}
Db::commit();
Log::getInstance()->info("自动完成问诊订单队列执行成功");
return Result::ACK;
} catch (\Exception $e) {
Db::rollBack();
Log::getInstance()->error("自动完成问诊订单执行失败:" . $e->getMessage());
return Result::ACK; // 重回队列
}
}
}