From 5fe311020a7523683158f502626823665e2e6c86 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 7 Apr 2023 16:37:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E9=98=9F=E5=88=97=E6=9C=8D=E5=8A=A1=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E3=80=82=E4=BF=AE=E6=94=B9=E5=8C=BB=E7=94=9F=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=97=AE=E8=AF=8A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutoFinishInquiryDelayDirectConsumer.php | 319 +++++++++++++++++- app/Controller/TestController.php | 19 +- app/Model/DoctorAccount.php | 34 ++ app/Model/DoctorAccountDay.php | 35 ++ app/Services/DoctorAccountService.php | 8 +- app/Services/UserDoctorService.php | 13 + 6 files changed, 417 insertions(+), 11 deletions(-) diff --git a/app/Amqp/Consumer/AutoFinishInquiryDelayDirectConsumer.php b/app/Amqp/Consumer/AutoFinishInquiryDelayDirectConsumer.php index f3cb8e4..23625e3 100644 --- a/app/Amqp/Consumer/AutoFinishInquiryDelayDirectConsumer.php +++ b/app/Amqp/Consumer/AutoFinishInquiryDelayDirectConsumer.php @@ -4,6 +4,13 @@ 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\PatientFamilyHealth; +use App\Model\PatientFamilyPersonal; use App\Utils\Log; use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait; use Hyperf\Amqp\Message\ProducerDelayedMessageTrait; @@ -39,7 +46,8 @@ class AutoFinishInquiryDelayDirectConsumer extends ConsumerMessage Db::beginTransaction(); try { // 检测入参参数 - if (empty($data['order_inquiry_id'])){ + if (empty($data['order_inquiry_id'])) { + Db::rollBack(); Log::getInstance()->error("自动完成问诊订单队列执行失败:入参错误"); return Result::DROP; } @@ -47,16 +55,60 @@ class AutoFinishInquiryDelayDirectConsumer extends ConsumerMessage // 获取问诊订单数据 $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; + } - // 添加医生账户总表 + // 问诊订单状态(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); Db::commit(); Log::getInstance()->info("自动完成问诊订单队列执行成功"); @@ -67,4 +119,259 @@ class AutoFinishInquiryDelayDirectConsumer extends ConsumerMessage 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; + } + + // 未评价 + $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'] = $order_inquiry['patient_name_mask']; + $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); + } + } + } + } } diff --git a/app/Controller/TestController.php b/app/Controller/TestController.php index 8931835..54154bf 100644 --- a/app/Controller/TestController.php +++ b/app/Controller/TestController.php @@ -3,6 +3,7 @@ namespace App\Controller; use App\Amqp\Producer\AssignDoctorProducer; +use App\Amqp\Producer\AutoFinishInquiryDelayDirectProducer; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Constants\HttpEnumCode; use App\Exception\BusinessException; @@ -53,7 +54,8 @@ class TestController extends AbstractController // $this->test_5(); // $this->test_1(); // $this->test_11(); - $this->test_12(); +// $this->test_12(); + $this->test_13(); } // 获取云证书-首次 @@ -747,4 +749,19 @@ class TestController extends AbstractController // $result = $regulatoryPlatform->uploadFurtherConsult($arg); dump($result); } + + public function test_13(){ + $data = array(); + $data['order_inquiry_id'] = "502880753563086849"; + + $message = new AutoFinishInquiryDelayDirectProducer($data); + $message->setDelayMs(1000 * 20); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Db::rollBack(); + return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); + } + + } } \ No newline at end of file diff --git a/app/Model/DoctorAccount.php b/app/Model/DoctorAccount.php index c5f1e3e..4ad6ada 100644 --- a/app/Model/DoctorAccount.php +++ b/app/Model/DoctorAccount.php @@ -60,4 +60,38 @@ class DoctorAccount extends Model { return self::where($params)->get($fields); } + + /** + * 自增 + * @param array $params + * @param string $field + * @param float $numeral + * @return int + */ + public static function inc(array $params,string $field,float $numeral = 1): int + { + return self::where($params)->increment($field,$numeral); + } + + /** + * 自减 + * @param array $params + * @param string $field + * @param float $numeral + * @return int + */ + public static function dec(array $params,string $field,float $numeral = 1): int + { + return self::where($params)->decrement($field,$numeral); + } + + /** + * 新增 + * @param array $data + * @return \Hyperf\Database\Model\Model|DoctorAccount + */ + public static function addDoctorAccount(array $data): \Hyperf\Database\Model\Model|DoctorAccount + { + return self::create($data); + } } diff --git a/app/Model/DoctorAccountDay.php b/app/Model/DoctorAccountDay.php index a91d283..e06d0d6 100644 --- a/app/Model/DoctorAccountDay.php +++ b/app/Model/DoctorAccountDay.php @@ -6,6 +6,7 @@ namespace App\Model; +use Hyperf\Database\Model\Model; use Hyperf\Snowflake\Concern\Snowflake; /** @@ -71,4 +72,38 @@ class DoctorAccountDay extends Model { return self::where($params)->sum("total_amount"); } + + /** + * 新增 + * @param array $data + * @return Model|DoctorAccountDay + */ + public static function addDoctorAccountDay(array $data): \Hyperf\Database\Model\Model|DoctorAccountDay + { + return self::create($data); + } + + /** + * 自增 + * @param array $params + * @param string $field + * @param float $numeral + * @return int + */ + public static function inc(array $params,string $field,float $numeral = 1): int + { + return self::where($params)->increment($field,$numeral); + } + + /** + * 自减 + * @param array $params + * @param string $field + * @param float $numeral + * @return int + */ + public static function dec(array $params,string $field,float $numeral = 1): int + { + return self::where($params)->decrement($field,$numeral); + } } diff --git a/app/Services/DoctorAccountService.php b/app/Services/DoctorAccountService.php index 626dfc2..231fac4 100644 --- a/app/Services/DoctorAccountService.php +++ b/app/Services/DoctorAccountService.php @@ -187,7 +187,7 @@ class DoctorAccountService extends BaseService $bank['bank_card_code_mask'] = $doctor_bank_card['bank_card_code_mask']; $balance_account = 0; - $order_inquiry_ids = []; + $order_inquiry_id_array = []; // 获取医生账户余额 if (!empty($order_inquiry_ids)){ $params = array(); @@ -201,13 +201,13 @@ class DoctorAccountService extends BaseService $balance_account = array_sum(array_column($order_inquiry->toArray(),'amount_total')); } - $order_inquiry_ids = $in_params; + $order_inquiry_id_array = $in_params; }else{ $InquiryService = new InquiryService(); $order_inquiry = $InquiryService->getDoctorCanWithdrawalInquiryOrder($user_info['client_user_id']); if (!empty($order_inquiry)){ $balance_account = array_sum(array_column($order_inquiry,'amount_total')); - $order_inquiry_ids = array_column($order_inquiry,'order_inquiry_id'); + $order_inquiry_id_array = array_column($order_inquiry,'order_inquiry_id'); } } @@ -226,7 +226,7 @@ class DoctorAccountService extends BaseService $result['bank'] = $bank;//银行数据 $result['withdrawal_amount'] = $withdrawal_amount; // 提现金额 $result['income_tax'] = $income_tax; // 个人所得税 - $result['order_inquiry_ids'] = $order_inquiry_ids; // 订单合集 + $result['order_inquiry_ids'] = $order_inquiry_id_array; // 订单合集 return success($result); } diff --git a/app/Services/UserDoctorService.php b/app/Services/UserDoctorService.php index 5f5dc48..828eea7 100644 --- a/app/Services/UserDoctorService.php +++ b/app/Services/UserDoctorService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Amqp\Producer\AssignPharmacistProducer; +use App\Amqp\Producer\AutoFinishInquiryDelayDirectProducer; use App\Constants\DoctorTitleCode; use App\Constants\HttpEnumCode; use App\Exception\BusinessException; @@ -1712,6 +1713,18 @@ class UserDoctorService extends BaseService $MessagePush = new MessagePush($user_info['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(); + return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); + } Db::commit(); } catch (\Exception $e) { Db::rollBack();