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

315 lines
14 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\AutoCompleteInquiryDelayDirectProducer;
use App\Amqp\Producer\DetectionCompleteDelayDirectProducer;
use App\Exception\BusinessException;
use App\Model\DetectionProject;
use App\Model\Order;
use App\Model\OrderDetection;
use App\Model\OrderDetectionCase;
use App\Model\OrderInquiry;
use App\Model\OrderInquiryCase;
use App\Model\PatientFamily;
use App\Model\UserDoctor;
use App\Services\ImService;
use App\Services\InquiryService;
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 Hyperf\Snowflake\IdGeneratorInterface;
use PhpAmqpLib\Message\AMQPMessage;
/**
* 检测订单自动完成延迟队列
* 当接收到检测报告时,如当时患者-医生存在问诊中订单,则加入此延迟队列,等待问诊结束后,检测订单才会接收
*/
#[Consumer(nums: 1)]
class DetectionCompleteDelayDirectConsumer extends ConsumerMessage
{
use ProducerDelayedMessageTrait;
use ConsumerDelayedMessageTrait;
protected string $exchange = 'amqp.delay.direct';
protected ?string $queue = 'detection.complete.delay.queue';
protected string $type = Type::DIRECT; //Type::FANOUT;
protected string|array $routingKey = 'DetectionComplete';
public function consumeMessage($data, AMQPMessage $message): string
{
Log::getInstance("queue-DetectionComplete")->info("开始:" . json_encode($data, JSON_UNESCAPED_UNICODE));
// 获取检测订单数据
$params = array();
$params['detection_no'] = $data['detection_no'];
$order_detection = OrderDetection::getOne($params);
if (empty($order_detection)){
Log::getInstance("queue-DetectionComplete")->error("非法订单");
return Result::ACK;
}
// 检测订单状态
if ($order_detection['detection_status'] != 4){
Log::getInstance("queue-DetectionComplete")->error("订单状态错误,无法处理");
return Result::DROP;
}
if (empty($order_detection['detection_result_pdf'])){
Log::getInstance("queue-DetectionComplete")->error("无检测报告数据");
return Result::DROP;
}
if (!empty($order_detection['order_inquiry_id'])){
Log::getInstance("queue-DetectionComplete")->info("已创建检测问诊订单,无需继续处理");
return Result::ACK;
}
try {
// 检测当前医生是否和患者存在未完成问诊订单
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($order_detection['patient_id'],$order_detection['doctor_id']);
if (!empty($order_inquiry)){
// 存在未完成订单
// 获取现在时间距离订单结束时间的时间差
$time_diff = $InquiryService->getInquiryFinishTimeDiff($order_inquiry);
if ($time_diff == 0){
$time_diff = 60;
}
// 计算时间并重新加入队列
$queue_data = array();
$queue_data['detection_no'] = $data['detection_no'];
$message = new DetectionCompleteDelayDirectProducer($queue_data);
$message->setDelayMs(1000 * $time_diff);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Log::getInstance("queue-DetectionComplete")->error("重新添加队列失败");
return Result::REQUEUE;
}
return Result::DROP;
}
// 获取医生数据
$params = array();
$params['doctor_id'] = $order_detection['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)){
Log::getInstance("queue-DetectionComplete")->error("医生数据错误");
return Result::DROP;
}
// 获取检测病例数据
$params = array();
$params['order_detection_id'] = $order_detection['order_detection_id'];
$order_detection_case = OrderDetectionCase::getOne($params);
if (empty($order_detection_case)){
Log::getInstance("queue-DetectionComplete")->error("订单数据错误");
return Result::DROP;
}
// 获取检测项目数据
$params = array();
$params['detection_project_id'] = $order_detection['detection_project_id'];
$detection_project = DetectionProject::getOne($params);
if (empty($detection_project)){
Log::getInstance("queue-DetectionComplete")->error("订单数据错误");
return Result::DROP;
}
// 检测家庭成员是否存在
$params = array();
$params['family_id'] = $order_detection['family_id'];
$params['patient_id'] = $order_detection['patient_id'];
$patient_family = PatientFamily::getOne($params);
if (empty($patient_family)) {
Log::getInstance("queue-DetectionComplete")->error("患者信息错误");
return Result::DROP;
}
}catch (\Throwable $e){
Log::getInstance("queue-DetectionComplete")->error($e->getMessage());
return Result::DROP;
}
Db::beginTransaction();
try {
$generator = $this->container->get(IdGeneratorInterface::class);
// 生成订单表
$data = array();
$data['user_id'] = $order_detection['user_id'];
$data['patient_id'] = $order_detection['patient_id'];
$data['doctor_id'] = $order_detection['doctor_id'];
$data['order_type'] = 1; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付)
$data['pay_status'] = 2; // 1:待支付
$data['order_no'] = "I" . $generator->generate(); // 订单编号
$data['escrow_trade_no'] = "GD" . $generator->generate(); // 第三方支付流水号
$data['amount_total'] = 0; // 订单金额
$data['coupon_amount_total'] = 0; // 优惠卷总金额
$data['payment_amount_total'] = 0; // 实际付款金额
$order = Order::addOrder($data);
if (empty($order)) {
Db::rollBack();
Log::getInstance("queue-DetectionComplete")->error("问诊订单创建失败");
return Result::DROP;
}
// 创建问诊订单
$data = array();
$data['order_id'] = $order['order_id'];
$data['user_id'] = $order_detection['user_id'];
$data['patient_id'] = $order_detection['patient_id'];
$data['doctor_id'] = $order_detection['doctor_id'];
$data['family_id'] = $order_detection['family_id'];
$data['inquiry_type'] = 5; // 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测)
$data['inquiry_mode'] = 1; // 订单问诊方式1:图文 2:视频 3:语音 4:电话 5:会员)
$data['inquiry_status'] = 4; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
$data['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$data['inquiry_no'] = $order['order_no'];// 订单编号
$data['escrow_trade_no'] = $order['escrow_trade_no']; // 第三方支付流水号
$data['amount_total'] = 0;// 订单金额
$data['coupon_amount_total'] = 0;// 优惠卷总金额
$data['payment_amount_total'] = 0;// 实际付款金额
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['reception_time'] = date('Y-m-d H:i:s', time());// 接诊时间
$data['patient_name'] = $patient_family['card_name'];// 患者姓名-就诊人
$data['patient_name_mask'] = $patient_family['card_name_mask'];// 患者姓名-就诊人(掩码)
$data['patient_sex'] = $patient_family['sex'];// 患者性别-就诊人0:未知 1:男 2:女)
$data['patient_age'] = $patient_family['age'];// 患者年龄-就诊人
$order_inquiry = OrderInquiry::addOrderInquiry($data);
if (empty($order_inquiry)) {
Db::rollBack();
Log::getInstance("queue-DetectionComplete")->error("问诊订单创建失败");
return Result::DROP;
}
// 增加患者问诊病例
$data = array();
$data['user_id'] = $order_detection['user_id'];
$data['patient_id'] = $order_detection['patient_id'];
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
$data['family_id'] = $patient_family['family_id']; // 家庭成员id
$data['relation'] = $patient_family['relation']; // 与患者关系1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他
$data['name'] = $patient_family['card_name']; // 患者名称
$data['sex'] = $patient_family['sex'] ?? 0; // 患者性别0:未知 1:男 2:女)
$data['age'] = $patient_family['age'] ?? null; // 患者年龄
$data['height'] = $patient_family['height'] ?: null; // 身高cm
$data['weight'] = $patient_family['weight'] ?: null;; // 体重kg
$data['nation_id'] = $order_detection_case['nation_id'] ?: $patient_family['nation_id'] ?: null;; // 民族
$data['nation_name'] = $order_detection_case['nation_name'] ?: $patient_family['nation_name'] ?: null;; // 民族名称
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
if (empty($order_inquiry_case)) {
Db::rollBack();
Log::getInstance("queue-DetectionComplete")->error("问诊订单病例创建失败");
return Result::DROP;
}
// 修改检测订单
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
$params = array();
$params['order_detection_id'] = $order_detection['order_detection_id'];
OrderDetection::editOrderDetection($params,$data);
// 添加自动完成队列
$time = 1000 * 60 * 60 * 24 * 3;
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$message = new AutoCompleteInquiryDelayDirectProducer($data);
$message->setDelayMs($time);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
Log::getInstance("queue-DetectionComplete")->error("添加自动完成队列失败");
return Result::DROP;
}
// 发送im消息
$imService = new ImService();
// 患者病例
$imService->patientCase(
$order_inquiry,
$user_doctor['user_id'],
$order_inquiry_case['disease_desc']
);
// 发送IM消息-检测报告结果
$data = [
"order_inquiry_id" => $order_inquiry['order_inquiry_id'],
"inquiry_type" => $order_inquiry['inquiry_type'],
"detection_no" => $order_detection['detection_no'],
"patient_name" => $order_detection['patient_name'],
"patient_sex" => $order_detection['patient_sex'],
"patient_age" => $order_detection['patient_age'],
"detection_project_name" => $detection_project['detection_project_name'],
"disease_class_names" => $order_detection_case['detection_disease_class_names'],
"detection_result_pdf" => $order_detection['detection_result_pdf'],
"patient_user_id" => $order_detection['user_id'],
"doctor_user_id" => $user_doctor['user_id'],
];
$imService->detectionTestReport($data);
Db::commit();
}catch (\Throwable $e){
Db::rollBack();
Log::getInstance("queue-DetectionComplete")->error($e->getMessage());
return Result::DROP;
}
// 发送消息
try {
// 发送IM消息-检测报告结果-文字
$data = [
"order_inquiry_id" => $order_inquiry['order_inquiry_id'],
"inquiry_type" => $order_inquiry['inquiry_type'],
"detection_no" => $order_detection['detection_no'],
"doctor_name" => $user_doctor['user_name'],
"patient_name" => $order_detection['patient_name'],
"patient_sex" => $order_detection['patient_sex'],
"patient_age" => $order_detection['patient_age'],
"detection_project_name" => $detection_project['detection_project_name'],
"patient_user_id" => $order_detection['user_id'],
"doctor_user_id" => $user_doctor['user_id'],
];
$imService->detectionTestReportStr($data);
// 患者-新报告生成通知
$MessagePush = new MessagePush($order_detection['user_id']);
$MessagePush->patientDetectionResultNotice($order_detection['order_detection_id']);
// 医生-通知医生患者检测报告已生成
$MessagePush = new MessagePush($user_doctor['user_id']);
$MessagePush->doctorDetectionResultNotice($order_detection['order_detection_id']);
}catch (\Throwable $e){
Log::getInstance("queue-DetectionComplete")->error($e->getMessage());
return Result::DROP;
}
return Result::ACK;
}
}