440 lines
19 KiB
PHP
440 lines
19 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Amqp\Consumer;
|
||
|
||
use App\Model\DoctorAccount;
|
||
use App\Model\DoctorAccountDay;
|
||
use App\Model\OrderEvaluation;
|
||
use App\Model\OrderInquiry;
|
||
use App\Model\OrderInquiryCase;
|
||
use App\Model\OrderPrescription;
|
||
use App\Model\PatientFamilyHealth;
|
||
use App\Model\PatientFamilyPersonal;
|
||
use App\Model\UserDoctor;
|
||
use App\Model\UserPatient;
|
||
use App\Services\MessagePush;
|
||
use App\Utils\Log;
|
||
use App\Utils\Mask;
|
||
use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait;
|
||
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
|
||
use Hyperf\Amqp\Message\Type;
|
||
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 AutoFinishInquiryDelayDirectConsumer extends ConsumerMessage
|
||
{
|
||
use ProducerDelayedMessageTrait;
|
||
use ConsumerDelayedMessageTrait;
|
||
|
||
protected string $exchange = 'amqp.delay.direct';
|
||
|
||
protected ?string $queue = 'auto.finish.inquiry.delay.queue';
|
||
|
||
protected string $type = Type::DIRECT; //Type::FANOUT;
|
||
|
||
protected string|array $routingKey = 'AutoFinishInquiry';
|
||
|
||
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();
|
||
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
if ($order_inquiry['inquiry_status'] != 5) {
|
||
Db::rollBack();
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:问诊订单未完成,无法结束");
|
||
return Result::DROP;
|
||
}
|
||
|
||
// 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
|
||
if (!in_array($order_inquiry['inquiry_refund_status'], [0, 4, 5])) {
|
||
Db::rollBack();
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:问诊订单正在申请退款");
|
||
return Result::DROP;
|
||
}
|
||
|
||
if (empty($order_inquiry['doctor_id'])) {
|
||
Db::rollBack();
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:医生id为空");
|
||
return Result::DROP;
|
||
}
|
||
|
||
// 处理统计问题
|
||
if ($order_inquiry['amount_total'] > 0) {
|
||
// 处理医生账户总表
|
||
$res = $this->handleDoctorAccount($order_inquiry);
|
||
if (!$res) {
|
||
Db::rollBack();
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:处理医生账户总表失败");
|
||
return Result::DROP;
|
||
}
|
||
|
||
// 处理医生账户表-日
|
||
$res = $this->handleDoctorAccountDay($order_inquiry);
|
||
if (!$res) {
|
||
Db::rollBack();
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:处理医生账户表-日失败");
|
||
return Result::DROP;
|
||
}
|
||
}
|
||
|
||
// 处理问诊订单表
|
||
$this->handleOrderInquiry($order_inquiry);
|
||
|
||
// 处理订单评价
|
||
$this->handleOrderEvaluation($order_inquiry);
|
||
|
||
// 处理回写患者病例-回写失败不做处理
|
||
$this->handleOrderInquiryCase($order_inquiry);
|
||
|
||
// 处理医生服务患者数量
|
||
$this->handleDoctorServedPatientsNum($order_inquiry['doctor_id']);
|
||
|
||
// 处理医生好评率
|
||
$this->handleDoctorPraiseRate($order_inquiry['doctor_id']);
|
||
|
||
Db::commit();
|
||
Log::getInstance()->info("自动结束问诊订单队列执行成功");
|
||
return Result::ACK;
|
||
} catch (\Exception $e) {
|
||
Db::rollBack();
|
||
Log::getInstance()->error("自动结束问诊订单执行失败:" . $e->getMessage());
|
||
return Result::ACK; // 重回队列
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 处理医生账户总表
|
||
* 创建/修改医生账户总表中总金额、账户余额数据
|
||
* @param array|object $order_inquiry
|
||
* @return bool
|
||
*/
|
||
protected function handleDoctorAccount(array|object $order_inquiry): bool
|
||
{
|
||
$params = array();
|
||
$params['doctor_id'] = $order_inquiry['doctor_id'];
|
||
$doctor_account = DoctorAccount::getOne($params);
|
||
if (empty($doctor_account)) {
|
||
// 首次
|
||
$data = array();
|
||
$data['doctor_id'] = $order_inquiry['doctor_id'];
|
||
$data['total_amount'] = $order_inquiry['amount_total'] * 0.75;
|
||
$data['balance_account'] = $order_inquiry['amount_total'] * 0.75;
|
||
$data['applied_withdrawal_amount'] = 0;
|
||
$data['actual_withdrawal_amount'] = 0;
|
||
$data['income_tax'] = 0;
|
||
$doctor_account = DoctorAccount::addDoctorAccount($data);
|
||
if (empty($doctor_account)) {
|
||
return false;
|
||
}
|
||
} else {
|
||
// 非首次
|
||
// 总金额(已结束订单的总金额)
|
||
$params = array();
|
||
$params['account_id'] = $doctor_account['account_id'];
|
||
DoctorAccount::inc($params, 'total_amount', $order_inquiry['amount_total'] * 0.75);
|
||
|
||
// 账户余额
|
||
DoctorAccount::inc($params, 'balance_account', $order_inquiry['amount_total'] * 0.75);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 处理医生账户表-日
|
||
* @param array|object $order_inquiry
|
||
* @return bool
|
||
*/
|
||
protected function handleDoctorAccountDay(array|object $order_inquiry): bool
|
||
{
|
||
$params = array();
|
||
$params['doctor_id'] = $order_inquiry['doctor_id'];
|
||
$params['date'] = date('Y-m-d', strtotime($order_inquiry['created_at']));
|
||
$doctor_account_day = DoctorAccountDay::getOne($params);
|
||
if (empty($doctor_account_day)) {
|
||
// 当日首次
|
||
$data = array();
|
||
$data['doctor_id'] = $order_inquiry['doctor_id'];
|
||
$data['year'] = date('Y', strtotime($order_inquiry['created_at']));
|
||
$data['month'] = date('m', strtotime($order_inquiry['created_at']));
|
||
$data['day'] = date('d', strtotime($order_inquiry['created_at']));
|
||
$data['date'] = date('Y-m-d', strtotime($order_inquiry['created_at']));
|
||
$data['total_amount'] = $order_inquiry['amount_total'] * 0.75;
|
||
$doctor_account_day = DoctorAccountDay::addDoctorAccountDay($data);
|
||
if (empty($doctor_account_day)) {
|
||
return false;
|
||
}
|
||
} else {
|
||
// 非当日首次
|
||
$params = array();
|
||
$params['account_detail_id'] = $doctor_account_day['account_detail_id'];
|
||
DoctorAccountDay::inc($params, 'total_amount', $order_inquiry['amount_total'] * 0.75);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 处理问诊订单表
|
||
* @param array|object $order_inquiry
|
||
* @return void
|
||
*/
|
||
protected function handleOrderInquiry(array|object $order_inquiry): void
|
||
{
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
|
||
$data = array();
|
||
$data['inquiry_status'] = 6; // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
$data['finish_time'] = date('Y-m-d H:i:s', time()); // 订单结束时间
|
||
$data['statistics_status'] = 1; // 订单统计状态(0:未统计 1:已统计 2:统计失败)
|
||
$data['statistics_time'] = date('Y-m-d H:i:s', time()); // 订单统计时间
|
||
$data['updated_at'] = date('Y-m-d H:i:s', time()); // 修改时间
|
||
OrderInquiry::edit($params, $data);
|
||
}
|
||
|
||
/**
|
||
* 处理订单评价
|
||
* @param array|object $order_inquiry
|
||
* @return bool
|
||
*/
|
||
protected function handleOrderEvaluation(array|object $order_inquiry): bool
|
||
{
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$order_evaluation = OrderEvaluation::getOne($params);
|
||
if (!empty($order_evaluation)) {
|
||
// 已评价
|
||
return true;
|
||
}
|
||
|
||
// 获取用户数据
|
||
$params = array();
|
||
$params['patient_id'] = $order_inquiry['patient_id'];
|
||
$user_patient = UserPatient::getOne($params);
|
||
|
||
// 未评价
|
||
$data = array();
|
||
$data['doctor_id'] = $order_inquiry['doctor_id'];
|
||
$data['patient_id'] = $order_inquiry['patient_id'];
|
||
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$data['name_mask'] = Mask::maskNameStr($user_patient['user_name'],2);
|
||
$data['reply_quality'] = 100;//回复质量(百分制)
|
||
$data['service_attitude'] = 100; // 服务态度(百分制)
|
||
$data['reply_progress'] = 100; // 回复速度(百分制)
|
||
$data['avg_score'] = 100; // 平均得分(百分制,回复质量占4、服务态度占3、回复速度占3,计算公式:每个得分 * 占比 相加)
|
||
$data['type'] = 1; // 类型(1:默认评价 2:主动评价)
|
||
$order_evaluation = OrderEvaluation::addOrderEvaluation($data);
|
||
if (empty($order_evaluation)) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 处理回写患者病例
|
||
* 回写失败不做处理
|
||
* @param array|object $order_inquiry
|
||
* @return void
|
||
*/
|
||
protected function handleOrderInquiryCase(array|object $order_inquiry): void
|
||
{
|
||
// 获取订单-问诊病例表
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params);
|
||
if (!empty($order_inquiry_case)) {
|
||
// 获取患者家庭成员信息表-健康情况
|
||
$params = array();
|
||
$params['family_id'] = $order_inquiry['family_id'];
|
||
$params['patient_id'] = $order_inquiry['patient_id'];
|
||
$patient_family_health = PatientFamilyHealth::getOne($params);
|
||
if (empty($patient_family_health)) {
|
||
// 表数据为空
|
||
$data = array();
|
||
$data['family_id'] = $order_inquiry['family_id'];
|
||
$data['patient_id'] = $order_inquiry['patient_id'];
|
||
if (!empty($order_inquiry_case['disease_class_id'])) {
|
||
$data['disease_class_id'] = $order_inquiry_case['disease_class_id']; // 疾病分类id-系统
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['disease_class_name'])) {
|
||
$data['disease_class_name'] = $order_inquiry_case['disease_class_name']; // 疾病名称-系统
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['diagnosis_date'])) {
|
||
$data['diagnosis_date'] = $order_inquiry_case['diagnosis_date']; // 确诊日期
|
||
}
|
||
|
||
$patient_family_health = PatientFamilyHealth::addPatientFamilyHealth($data);
|
||
if (empty($patient_family_health)) {
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:回写患者家庭成员信息表-健康情况表失败");
|
||
}
|
||
} else {
|
||
$data = array();
|
||
if (!empty($order_inquiry_case['disease_class_id']) && $order_inquiry_case['disease_class_id'] != $patient_family_health['disease_class_id']) {
|
||
$data['disease_class_id'] = $order_inquiry_case['disease_class_id']; // 疾病分类id-系统
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['disease_class_name']) && $order_inquiry_case['disease_class_name'] != $patient_family_health['disease_class_name']) {
|
||
$data['disease_class_name'] = $order_inquiry_case['disease_class_name']; // 疾病名称-系统
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['diagnosis_date']) && $order_inquiry_case['diagnosis_date'] != $patient_family_health['diagnosis_date']) {
|
||
$data['diagnosis_date'] = $order_inquiry_case['diagnosis_date']; // 确诊日期
|
||
}
|
||
|
||
if (!empty($data)) {
|
||
$params = array();
|
||
$params['family_health_id'] = $patient_family_health['family_health_id'];
|
||
PatientFamilyHealth::edit($params, $data);
|
||
}
|
||
}
|
||
|
||
// 获取患者家庭成员信息表-个人情况
|
||
$params = array();
|
||
$params['family_id'] = $order_inquiry['family_id'];
|
||
$params['patient_id'] = $order_inquiry['patient_id'];
|
||
$patient_family_personal = PatientFamilyPersonal::getOne($params);
|
||
if (empty($patient_family_personal)) {
|
||
$data = array();
|
||
$data['family_id'] = $order_inquiry['family_id'];
|
||
$data['patient_id'] = $order_inquiry['patient_id'];
|
||
if (!empty($order_inquiry_case['is_allergy_history'])) {
|
||
$data['is_allergy_history'] = $order_inquiry_case['is_allergy_history']; // 是否存在过敏史(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['allergy_history'])) {
|
||
$data['allergy_history'] = $order_inquiry_case['allergy_history']; // 过敏史描述
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['is_family_history'])) {
|
||
$data['is_family_history'] = $order_inquiry_case['is_family_history']; // 是否存在家族病史(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['family_history'])) {
|
||
$data['family_history'] = $order_inquiry_case['family_history']; // 家族病史描述
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['is_pregnant'])) {
|
||
$data['is_pregnant'] = $order_inquiry_case['is_pregnant']; // 是否备孕、妊娠、哺乳期(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['is_pregnant'])) {
|
||
$data['is_pregnant'] = $order_inquiry_case['is_pregnant']; // 是否备孕、妊娠、哺乳期(0:否 1:是)
|
||
}
|
||
|
||
$patient_family_personal = PatientFamilyPersonal::addPatientFamilyPersonal($data);
|
||
if (empty($patient_family_personal)) {
|
||
Log::getInstance()->error("自动结束问诊订单队列执行失败:回写患者家庭成员信息表-个人情况表失败");
|
||
}
|
||
} else {
|
||
$data = array();
|
||
if (!empty($order_inquiry_case['is_allergy_history']) && $order_inquiry_case['is_allergy_history'] != $patient_family_personal['is_allergy_history']) {
|
||
$data['is_allergy_history'] = $order_inquiry_case['is_allergy_history']; // 是否存在过敏史(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['allergy_history']) && $order_inquiry_case['allergy_history'] != $patient_family_personal['allergy_history']) {
|
||
$data['allergy_history'] = $order_inquiry_case['allergy_history']; // 过敏史描述
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['is_family_history']) && $order_inquiry_case['is_family_history'] != $patient_family_personal['is_family_history']) {
|
||
$data['is_family_history'] = $order_inquiry_case['is_family_history']; // 是否存在家族病史(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['family_history']) && $order_inquiry_case['family_history'] != $patient_family_personal['family_history']) {
|
||
$data['family_history'] = $order_inquiry_case['family_history']; // 家族病史描述
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['is_pregnant']) && $order_inquiry_case['is_pregnant'] != $patient_family_personal['is_pregnant']) {
|
||
$data['is_pregnant'] = $order_inquiry_case['is_pregnant']; // 是否备孕、妊娠、哺乳期(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($order_inquiry_case['is_pregnant']) && $order_inquiry_case['is_pregnant'] != $patient_family_personal['is_pregnant']) {
|
||
$data['is_pregnant'] = $order_inquiry_case['is_pregnant']; // 是否备孕、妊娠、哺乳期(0:否 1:是)
|
||
}
|
||
|
||
if (!empty($data)) {
|
||
$params = array();
|
||
$params['family_personal_id'] = $patient_family_personal['family_personal_id'];
|
||
PatientFamilyPersonal::edit($params, $data);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 处理医生服务患者数量
|
||
* @param string $doctor_id
|
||
* @return void
|
||
*/
|
||
protected function handleDoctorServedPatientsNum(string $doctor_id): void
|
||
{
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
UserDoctor::inc($params,'served_patients_num');
|
||
}
|
||
|
||
/**
|
||
* 处理医生好评率
|
||
* @param string $doctor_id
|
||
* @return int|void
|
||
*/
|
||
protected function handleDoctorPraiseRate(string $doctor_id)
|
||
{
|
||
// 获取该医生全部问诊评价总数
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$order_evaluation_count = OrderEvaluation::getCount($params);
|
||
if ($order_evaluation_count == 0){
|
||
return 0;
|
||
}
|
||
|
||
// 获取该医生好评的评价总数
|
||
$avg_score_params = [80, 100];
|
||
$good_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
|
||
$praise_rate = floor(($good_quantity / $order_evaluation_count) * 100);
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
|
||
$data = array();
|
||
$data['praise_rate'] = $praise_rate;
|
||
UserDoctor::editUserDoctor($params,$data);
|
||
}
|
||
}
|