新增自动完成队列服务开发。修改医生完成问诊接口

This commit is contained in:
wucongxing 2023-04-07 16:37:04 +08:00
parent 1c856bb057
commit 5fe311020a
6 changed files with 417 additions and 11 deletions

View File

@ -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);
}
}
}
}
}

View File

@ -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, "订单创建失败");
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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();