hospital-applets-api/app/Services/InquiryService.php

2322 lines
98 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
namespace App\Services;
use App\Amqp\Producer\AutoFinishInquiryDelayDirectProducer;
use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer;
use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer;
use App\Amqp\Producer\SendSmsMessageProducer;
use App\Amqp\Producer\SendVideoNoticeDelayDirectProducer;
use App\Constants\DoctorTitleCode;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\DetectionProject;
use App\Model\DiseaseClass;
use App\Model\DoctorConfigDifficultConsultation;
use App\Model\DoctorInquiryConfig;
use App\Model\Hospital;
use App\Model\InquiryCaseProduct;
use App\Model\MessageIm;
use App\Model\Order;
use App\Model\OrderCoupon;
use App\Model\OrderDetection;
use App\Model\OrderEvaluation;
use App\Model\OrderInquiry;
use App\Model\OrderInquiryCase;
use App\Model\OrderInquiryCoupon;
use App\Model\OrderInquiryRefund;
use App\Model\OrderInquiryVideoRecord;
use App\Model\OrderInquiryVideoReservation;
use App\Model\OrderPrescription;
use App\Model\OrderProductCoupon;
use App\Model\OrderServicePackage;
use App\Model\OrderServicePackageDetail;
use App\Model\OrderServicePackageInquiry;
use App\Model\OrderServicePackageProduct;
use App\Model\PatientFamily;
use App\Model\PatientFamilyHealth;
use App\Model\PatientFamilyPersonal;
use App\Model\PatientFollow;
use App\Model\PatientHistoryInquiry;
use App\Model\Product;
use App\Model\SystemInquiryConfig;
use App\Model\SystemInquiryTime;
use App\Model\User;
use App\Model\UserCoupon;
use App\Model\UserDoctor;
use App\Model\UserPatient;
use App\Model\VideoRecord;
use App\Model\VideoReservation;
use App\Utils\Log;
use App\Utils\Mask;
use App\Utils\PcreMatch;
use Extend\Wechat\WechatPay;
use GuzzleHttp\Exception\GuzzleException;
use Hyperf\Amqp\Producer;
use Hyperf\Context\ApplicationContext;
use Hyperf\DbConnection\Db;
use Hyperf\Redis\Redis;
use Hyperf\Snowflake\IdGeneratorInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use SebastianBergmann\CodeCoverage\TestIdMissingException;
/**
* 问诊
*/
class InquiryService extends BaseService
{
/**
* 创建问诊订单
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function addInquiryOrder(): array
{
$result = array();
$result['status'] = 1;
$result['message'] = "成功";
$result['data'] = [
"inquiry_no" => "",
"order_inquiry_id" => "",
"order_no" => "",
];
$user_info = $this->request->getAttribute("userInfo") ?? [];
$request_params = $this->request->all();
// 检测家庭成员是否存在
$params = array();
$params['family_id'] = $request_params['family_id'];
$params['patient_id'] = $user_info['client_user_id'];
$params['status'] = 1;
$patient_family = PatientFamily::getOne($params);
if (empty($patient_family)) {
return fail(HttpEnumCode::HTTP_ERROR, "患者信息错误");
}
// 获取患者家庭成员信息表-健康情况
$params = array();
$params['family_id'] = $request_params['family_id'];
$patient_family_health = PatientFamilyHealth::getOne($params);
// 获取患者家庭成员信息表-个人情况
$params = array();
$params['family_id'] = $request_params['family_id'];
$patient_family_personal = PatientFamilyPersonal::getOne($params);
// 检测是否存在同类型未完成的问诊订单
$PatientOrderService = new PatientOrderService();
$order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry($request_params['inquiry_type'], $request_params['inquiry_mode'], $user_info['client_user_id']);
if (!empty($order_inquiry_id)) {
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)){
return fail(HttpEnumCode::HTTP_ERROR, "无法问诊");
}
$result['status'] = 2;
$result['message'] = "当前患者存在进行中的问诊订单";
$result['data']['order_inquiry_id'] = $order_inquiry_id;
$result['data']['order_no'] = $order_inquiry['inquiry_no'];
return success($result);
}
// 是否备孕、妊娠、哺乳期0:否 1:是)
if ($request_params['is_pregnant'] == 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请您到线下问诊");
}
// 是否服用过禁忌药物且无相关禁忌0:否 1:是)问诊购药时存在
if (isset($request_params['is_taboo'])) {
if ($request_params['is_taboo'] == 0) {
return fail(HttpEnumCode::HTTP_ERROR, "无法为您开具药物");
}
}
// 检测所患疾病是否正确
$params = array();
$params['disease_class_id'] = $request_params['disease_class_id'];
$params['disease_class_status'] = 1;
$disease_class = DiseaseClass::getOne($params);
if (empty($disease_class)) {
return fail(HttpEnumCode::HTTP_ERROR, "疾病信息填写错误");
}
// 获取当前问诊医生信息
// 专家问诊-公益问诊
if ($request_params['inquiry_type'] == 3 || $request_params['inquiry_type'] == 1) {
if (empty($request_params['doctor_id'])) {
return fail(HttpEnumCode::HTTP_ERROR, "未选择医生");
}
$params = array();
$params['doctor_id'] = $request_params['doctor_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "当前医生无法接诊,请重新选择");
}
if ($doctor['iden_auth_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "当前医生无法接诊,请重新选择");
}
// 检测当前医生是否和患者存在未完成问诊订单
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($user_info['client_user_id'], $request_params['doctor_id']);
if (!empty($order_inquiry)) {
$result['status'] = 2;
$result['message'] = "您和当前医生存在问诊中订单,无法再次发起问诊";
$result['data']['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$result['data']['order_no'] = $order_inquiry['inquiry_no'];
return success($result);
}
// 获取患者家庭成员是否存在未支付的服务包订单
$OrderServicePackageService = new OrderServicePackageService();
$order_service_package = $OrderServicePackageService->getPatientFamilyNoPayServicePackage($user_info['user_id'], $request_params['family_id'], $request_params['doctor_id']);
if (!empty($order_service_package)){
$result['status'] = 3;
$result['message'] = "您和当前医生存在未支付的服务包订单,无法再次发起问诊";
$result['data']['order_no'] = $order_service_package['order_service_no'];
return success($result);
}
}
// 问诊购药
if ($request_params['inquiry_type'] == 4) {
// 检测当前是否符合系统问诊时间
$inquiryService = new InquiryService();
$is_system_time_pass = $inquiryService->checkSystemInquiryTime($request_params['inquiry_type']);
if (!$is_system_time_pass) {
return fail(HttpEnumCode::HTTP_ERROR, "当前非医生接诊时间");
}
}
// 定义优惠卷金额默认值
$coupon_amount_total = 0;
// 获取问诊价格
$DoctorInquiryService = new DoctorInquiryService();
$inquiry_price = $DoctorInquiryService->getDoctorInquiryPrice($request_params['inquiry_type'], $request_params['inquiry_mode'], $request_params['doctor_id'] ?: "");
if ($inquiry_price > 0) {
// 获取患者问诊可用的优惠卷
$userCouponService = new UserCouponService();
$user_coupons = $userCouponService->getUserInquiryUsableCoupon($user_info['user_id'], $request_params['inquiry_type']);
// 获取可用优惠卷总金额
$coupon_amount_total = $userCouponService->getCouponTotalPrice($user_coupons);
}
// 确定支付渠道
// 支付渠道1:小程序支付 2:微信扫码支付)
if ($request_params['client_type'] == 1) {
$inquiry_pay_channel = 1;
} elseif ($request_params['client_type'] == 2) {
$inquiry_pay_channel = 2;
}
// 处理复诊凭证
if (!empty($request_params['diagnose_images'])) {
// 医师资格证
$diagnose_images = implode(',', $request_params['diagnose_images']);
$diagnose_images = PcreMatch::pregRemoveOssWebsite($diagnose_images);
}
// 沟通次数,沟通时长
$params = array();
$params['inquiry_type'] = $request_params['inquiry_type'];
$params['inquiry_mode'] = $request_params['inquiry_mode'];
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (empty($system_inquiry_config)) {
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
Db::beginTransaction();
$generator = $this->container->get(IdGeneratorInterface::class);
try {
// 实际付款金额
$payment_amount_total = bcsub($inquiry_price, $coupon_amount_total, 2);
if ($payment_amount_total < 0) {
$payment_amount_total = 0;
}
// 生成订单表
$data = array();
$data['user_id'] = $user_info['user_id'];
$data['patient_id'] = $user_info['client_user_id'];
if (isset($request_params['doctor_id'])) {
if (!empty($request_params['doctor_id'])) {
$data['doctor_id'] = $request_params['doctor_id'];
}
}
$data['order_type'] = 1; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
$data['inquiry_pay_channel'] = $inquiry_pay_channel ?? 0;// 支付渠道1:小程序支付 2:微信扫码支付)
$data['pay_status'] = 1;// 1:待支付
$data['order_no'] = "I" . $generator->generate();// 订单编号
$data['amount_total'] = $inquiry_price;// 订单金额
$data['coupon_amount_total'] = $coupon_amount_total;// 优惠卷总金额
$data['payment_amount_total'] = $payment_amount_total;// 实际付款金额
$order = Order::addOrder($data);
if (empty($order)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 生成问诊订单
$data = array();
$data['order_id'] = $order['order_id'];
$data['user_id'] = $user_info['user_id'];
$data['patient_id'] = $user_info['client_user_id'];
if (isset($request_params['doctor_id'])) {
if (!empty($request_params['doctor_id'])) {
$data['doctor_id'] = $request_params['doctor_id'];
}
}
$data['family_id'] = $request_params['family_id'];
$data['inquiry_type'] = $request_params['inquiry_type'];
$data['inquiry_mode'] = $request_params['inquiry_mode'];
$data['inquiry_status'] = 1;// 1:待支付
$data['inquiry_pay_channel'] = $inquiry_pay_channel ?? 0;// 支付渠道1:小程序支付 2:微信扫码支付)
$data['inquiry_no'] = $order['order_no'];// 订单编号
$data['amount_total'] = $inquiry_price;// 订单金额
$data['coupon_amount_total'] = $coupon_amount_total;// 优惠卷总金额
$data['payment_amount_total'] = $payment_amount_total;// 实际付款金额
$data['times_number'] = $system_inquiry_config['times_number'];// 沟通次数0为不限制次数
$data['duration'] = $system_inquiry_config['duration'];// 沟通时长分钟0为不限制时长
$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'] = getIdCardAge($patient_family['id_number']);// 患者年龄-就诊人
$order_inquiry = OrderInquiry::addOrderInquiry($data);
if (empty($order_inquiry)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 增加患者问诊病例
$data = array();
$data['user_id'] = $user_info['user_id'];
$data['patient_id'] = $user_info['client_user_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:未知 1:男 2:女)
$data['disease_class_id'] = $disease_class['disease_class_id']; // 疾病分类id-系统
$data['disease_class_name'] = $disease_class['disease_class_name']; // 疾病名称-系统
$data['diagnosis_date'] = $request_params['diagnosis_date']; // 确诊日期
$data['disease_desc'] = $request_params['disease_desc']; // 病情描述(主诉)
$data['diagnose_images'] = $diagnose_images ?? ""; // 复诊凭证(多个使用逗号分隔)
if ($patient_family['age'] != null) {
$data['age'] = getIdCardAge($patient_family['id_number']);// 患者年龄
}
// 身高cm
if ($patient_family['height'] != null) {
$data['height'] = $patient_family['height'];
}
// 体重kg
if ($patient_family['weight'] != null) {
$data['weight'] = $patient_family['weight'];
}
// 职业id-职业名称
if ($patient_family['job_id'] != null) {
$data['job_id'] = $patient_family['job_id'];
if ($patient_family['job_name'] != null) {
$data['job_name'] = $patient_family['job_name'];
}
}
// 民族id-民族名称
if ($patient_family['nation_id'] != null) {
$data['nation_id'] = $patient_family['nation_id'];
if ($patient_family['nation_name'] != null) {
$data['nation_name'] = $patient_family['nation_name'];
}
}
// 婚姻状况
if ($patient_family['marital_status'] != null) {
$data['marital_status'] = $patient_family['marital_status'];
}
// 家庭成员-健康情况
if (!empty($patient_family_health)) {
if ($patient_family_health['diagnosis_hospital'] != null) {
$data['diagnosis_hospital'] = $patient_family_health['diagnosis_hospital']; // 确诊医院
}
if ($patient_family_health['is_take_medicine'] != null) {
$data['is_take_medicine'] = $patient_family_health['is_take_medicine']; // 正在服药
if ($patient_family_health['drugs_name'] != null) {
$data['drugs_name'] = $patient_family_health['drugs_name']; // 正在服药名称
}
}
}
// 家庭成员-个人情况
if (!empty($patient_family_personal)) {
if ($patient_family_personal['drink_wine_status'] != null) {
$data['drink_wine_status'] = $patient_family_personal['drink_wine_status']; // 饮酒状态
}
if ($patient_family_personal['smoke_status'] != null) {
$data['smoke_status'] = $patient_family_personal['smoke_status']; // 吸烟状态
}
if ($patient_family_personal['chemical_compound_status'] != null) {
$data['chemical_compound_status'] = $patient_family_personal['chemical_compound_status']; // 化合物状态
if ($patient_family_personal['chemical_compound_describe'] != null) {
$data['chemical_compound_describe'] = $patient_family_personal['chemical_compound_describe']; // 化合物描述
}
}
if ($patient_family_personal['is_operation'] != null) {
$data['is_operation'] = $patient_family_personal['is_operation']; // 是否存在手术
if ($patient_family_personal['operation'] != null) {
$data['operation'] = $patient_family_personal['operation']; // 手术描述
}
}
}
// 过敏史
if (array_key_exists("is_allergy_history", $request_params)) {
if ($request_params['is_allergy_history'] !== null) {
$data['is_allergy_history'] = $request_params['is_allergy_history']; // 是否存在过敏史0:否 1:是)
if ($request_params['allergy_history'] != "") {
$data['allergy_history'] = $request_params['allergy_history']; // 过敏史描述
}
}
}
// 家族病史
if (array_key_exists("is_family_history", $request_params)) {
if ($request_params['is_family_history'] !== null) {
$data['is_family_history'] = $request_params['is_family_history']; // 是否存在家族病史0:否 1:是)
if ($request_params['family_history'] != "") {
$data['family_history'] = $request_params['family_history']; // 家族病史描述
}
}
}
// 是否备孕、妊娠、哺乳期0:否 1:是)
if (array_key_exists("is_pregnant", $request_params)) {
if ($request_params['is_pregnant'] !== null) {
$data['is_pregnant'] = $request_params['is_pregnant']; // 是否备孕、妊娠、哺乳期0:否 1:是)
}
}
// 是否存在禁忌药物0:否 1:是)问诊购药时存在
if (array_key_exists("is_taboo", $request_params)) {
if ($request_params['is_taboo'] !== null) {
$data['is_taboo'] = $request_params['is_taboo']; // 是否存在禁忌药物0:否 1:是)问诊购药时存在
}
}
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
if (empty($order_inquiry_case)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 处理优惠卷数据
if (!empty($user_coupons)) {
foreach ($user_coupons as $user_coupon) {
// 增加订单优惠卷表
$data = array();
$data['order_id'] = $order['order_id'];// 订单id
$data['user_coupon_id'] = $user_coupon['user_coupon_id'];
$data['coupon_name'] = $user_coupon['coupon_name'];
$data['coupon_use_price'] = $user_coupon['coupon_price'];
$order_coupon = OrderCoupon::addOrderCoupon($data);
if (empty($order_coupon)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 增加问诊优惠卷表
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
$data['user_coupon_id'] = $user_coupon['user_coupon_id'];
$data['coupon_name'] = $user_coupon['coupon_name'];
$data['coupon_use_price'] = $user_coupon['coupon_price'];
$order_inquiry_coupon = OrderInquiryCoupon::addOrderInquiryCoupon($data);
if (empty($order_inquiry_coupon)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 修改优惠卷使用状态
$data = array();
$data['user_coupon_status'] = 1;
$data['coupon_use_date'] = date('Y-m-d H:i:s', time());
$params = array();
$params['user_coupon_id'] = $user_coupon['user_coupon_id'];
UserCoupon::edit($params, $data);
}
}
// 意向用药处理
if ($request_params['inquiry_type'] == 4 && !empty($request_params['product'])) {
foreach ($request_params['product'] as $item) {
$params = array();
$params['product_id'] = $item['product_id'];
$product = Product::getWithAmountOne($params);
if (empty($product)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "意向药品错误");
}
// 用药意向是否和过敏史重叠
if (!empty($request_params['allergy_history'])) {
$res = strpos($request_params['allergy_history'], $product['product_name']);
if ($res !== false) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "过敏史中存在意向用药,请您仔细检查");
}
}
// 新增病例商品表
$data = array();
$data['inquiry_case_id'] = $order_inquiry_case['inquiry_case_id'];
$data['product_id'] = $item['product_id'];
$data['case_product_num'] = $item['product_num'];
$inquiry_case_product = InquiryCaseProduct::addInquiryCaseProduct($data);
if (empty($inquiry_case_product)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
}
}
// 增加至未支付取消订单延迟队列
$time = 60 * 30;
if (\Hyperf\Config\config('app_env') == "dev") {
$time = 60 * 5;
}
$data = array();
$data['order_no'] = $order_inquiry['inquiry_no'];
$data['order_type'] = 1;
$message = new CancelUnpayOrdersDelayDirectProducer($data);
$message->setDelayMs(1000 * $time);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 加入未接诊取消订单延迟队列
// 专家问诊-公益问诊
if (!empty($request_params['doctor_id']) && ($request_params['inquiry_type'] == 1 || $request_params['inquiry_type'] == 3)) {
$time = 60 * 60 * 24;
if (\Hyperf\Config\config('app_env') == "dev") {
$time = 60 * 10;
}
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$data['order_no'] = $order_inquiry['inquiry_no'];
$message = new CancelUnInquiryOrdersDelayDirectProducer($data);
$message->setDelayMs(1000 * $time);
$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();
Log::getInstance()->error("错误:" . $e->getMessage());
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
}
$result['status'] = 1;
$result['data']['order_inquiry_id'] = (string)$order_inquiry['order_inquiry_id']; // 订单主键id
$result['data']['inquiry_no'] = (string)$order_inquiry['inquiry_no']; // 订单编号
$result['data']['order_no'] = (string)$order_inquiry['inquiry_no']; // 订单编号
return success($result);
}
/**
* 获取患者问诊病例
* @return array
*/
public function getPatientInquiryCase(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->input('order_inquiry_id');
// 获取用户数据
$params = array();
$params['user_id'] = $user_info['user_id'];
$user = User::getOne($params);
if (empty($user)) {
return fail();
}
// 获取订单数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
if ($user['user_type'] == 1) {
$params['patient_id'] = $user_info['client_user_id'];
} elseif ($user['user_type'] == 2) {
$params['doctor_id'] = $user_info['client_user_id'];
}
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail();
}
// 获取病例信息
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$params['status'] = 1;
$order_inquiry_case = OrderInquiryCase::getOne($params);
if (empty($order_inquiry_case)) {
return fail();
}
$order_inquiry_case = $order_inquiry_case->toArray();
// 获取患者家庭成员信息表-基本信息
$params = array();
$params['family_id'] = $order_inquiry_case['family_id'];
$patient_family = PatientFamily::getOne($params);
// 民族
$nation_name = "";
if (isset($patient_family)) {
if (!empty($patient_family['nation_name'])) {
$nation_name = $patient_family['nation_name'];
} else {
if (!empty($order_inquiry_case['nation_name'])) {
$nation_name = $order_inquiry_case['nation_name'];
}
}
}
$order_inquiry_case['height'] = $order_inquiry_case['height'] ?: $patient_family['height'] ?: NULL;
$order_inquiry_case['weight'] = $order_inquiry_case['weight'] ?: $patient_family['weight'] ?: NULL;
$order_inquiry_case['job_name'] = $patient_family['job_name'] ?? "";
$order_inquiry_case['nation_name'] = $nation_name;
$order_inquiry_case['marital_status'] = $patient_family['marital_status'] ?? 0;
$order_inquiry_case['id_number'] = $patient_family['id_number'] ?? "";
// 获取患者家庭成员信息表-健康情况
$params = array();
$params['family_id'] = $order_inquiry_case['family_id'];
$patient_family_health = PatientFamilyHealth::getOne($params);
if (empty($patient_family_health)) {
$order_inquiry_case['diagnosis_hospital'] = "";
$order_inquiry_case['is_take_medicine'] = null;
$order_inquiry_case['drugs_name'] = "";
} else {
$order_inquiry_case['diagnosis_hospital'] = $patient_family_health['diagnosis_hospital'];
$order_inquiry_case['is_take_medicine'] = $patient_family_health['is_take_medicine'];
$order_inquiry_case['drugs_name'] = $patient_family_health['drugs_name'];
}
// 获取患者家庭成员信息表-个人情况
$params = array();
$params['family_id'] = $order_inquiry_case['family_id'];
$patient_family_personal = PatientFamilyPersonal::getOne($params);
if (empty($patient_family_personal)) {
$order_inquiry_case['drink_wine_status'] = null;
$order_inquiry_case['smoke_status'] = null;
$order_inquiry_case['chemical_compound_status'] = null;
$order_inquiry_case['chemical_compound_describe'] = "";
$order_inquiry_case['is_operation'] = null;
$order_inquiry_case['operation'] = "";
} else {
$order_inquiry_case['drink_wine_status'] = $patient_family_personal['drink_wine_status'];
$order_inquiry_case['smoke_status'] = $patient_family_personal['smoke_status'];
$order_inquiry_case['chemical_compound_status'] = $patient_family_personal['chemical_compound_status'];
$order_inquiry_case['chemical_compound_describe'] = $patient_family_personal['chemical_compound_describe'];
$order_inquiry_case['is_operation'] = $patient_family_personal['is_operation'];
$order_inquiry_case['operation'] = $patient_family_personal['operation'];
}
// 获取用药意向
$product = [];
$fields = [
'inquiry_case_id',
'product_id',
'case_product_num',
];
$params = array();
$params['inquiry_case_id'] = $order_inquiry_case['inquiry_case_id'];
$inquiry_case_product = InquiryCaseProduct::getWithProductList($params, $fields);
if (!empty($inquiry_case_product)) {
foreach ($inquiry_case_product as &$item) {
if (!empty($item['Product'])) {
$product[] = $item['Product']['product_name'] . ' ' . $item['Product']['product_spec'] . '(' . $item['case_product_num'] . $item['Product']['packaging_unit'] . ')';
}
}
}
$order_inquiry_case['product'] = $product;
unset($inquiry_case_product);
// 复诊凭证
if (!empty($order_inquiry_case['diagnose_images'])) {
$diagnose_images = explode(',', $order_inquiry_case['diagnose_images']);
foreach ($diagnose_images as &$item) {
$item = addAliyunOssWebsite($item);
}
$order_inquiry_case['diagnose_images'] = $diagnose_images;
}
// 检测项目
$order_inquiry_case['detection_project'] = null;
if ($order_inquiry['inquiry_type'] == 5) {
// 获取检测订单
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_detection = OrderDetection::getOne($params);
if (!empty($order_detection)) {
// 获取检测项目
$params = array();
$params['detection_project_id'] = $order_detection['detection_project_id'];
$detection_project = DetectionProject::getOne($params);
if (!empty($detection_project)) {
$order_inquiry_case['detection_project']['detection_project_name'] = $detection_project['detection_project_name']; // 检测项目名称
$order_inquiry_case['detection_project']['detection_time'] = $order_detection['detection_time']; // 检测时间
$order_inquiry_case['detection_project']['detection_link'] = addAliyunOssWebsite($order_detection['detection_result_pdf']); // 检测结果链接
}
}
}
return success($order_inquiry_case);
}
/**
* 检测快速、购药订单分配医生状态
* @return array
*/
public function getInquiryAssign(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->route('order_inquiry_id');
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$params['patient_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail();
}
if (empty($order_inquiry['doctor_id'])) {
return success();
}
// 检测订单类型
if ($order_inquiry['inquiry_type'] != 2 && $order_inquiry['inquiry_type'] != 4) {
return fail(HttpEnumCode::HTTP_ERROR, "订单类型不允许检测");
}
// 检测订单退款状态
if (!in_array($order_inquiry['inquiry_refund_status'], [0, 4, 5])) {
// 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
return fail(HttpEnumCode::HTTP_ERROR, "订单已退款");
}
// 获取医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail(HttpEnumCode::SERVER_ERROR);
}
$result = array();
$result['doctor_id'] = $order_inquiry['doctor_id'];
$result['user_id'] = $user_doctor['user_id'];
return success($result);
}
/**
* 新增问诊评价
* @return array
*/
public function addInquiryEvaluation(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$doctor_id = $this->request->input('doctor_id');
$order_inquiry_id = $this->request->input('order_inquiry_id');
$reply_quality = $this->request->input('reply_quality');
$service_attitude = $this->request->input('service_attitude');
$reply_progress = $this->request->input('reply_progress'); //
$content = $this->request->input('content');
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$params['patient_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail();
}
// 检测订单状态
if ($order_inquiry['inquiry_status'] != 5 && $order_inquiry['inquiry_status'] != 6) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
return fail(HttpEnumCode::HTTP_ERROR, "请问诊完成后进行评价");
}
// 检测是否评价过
$params = array();
$params['doctor_id'] = $doctor_id;
$params['patient_id'] = $user_info['client_user_id'];
$params['order_inquiry_id'] = $order_inquiry_id;;
$order_evaluation = OrderEvaluation::getOne($params);
if (!empty($order_evaluation)) {
// 已评价
return fail(HttpEnumCode::HTTP_ERROR, "您已评价,请勿重复评价");
}
// 获取用户数据
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$user_patient = UserPatient::getOne($params);
// 整理数据
$reply_quality = $reply_quality * 20;
$service_attitude = $service_attitude * 20;
$reply_progress = $reply_progress * 20;
// 计算平均值 百分制回复质量占4、服务态度占3、回复速度占3计算公式每个得分 * 占比 相加)
$avg_score = $reply_quality * 0.4 + $service_attitude * 0.3 + $reply_progress * 0.3;
$data = array();
$data['doctor_id'] = $doctor_id;
$data['patient_id'] = $user_info['client_user_id'];
$data['order_inquiry_id'] = $order_inquiry_id;
$data['name_mask'] = Mask::maskNameStr($order_inquiry['patient_name'], 2);
$data['reply_quality'] = $reply_quality;
$data['service_attitude'] = $service_attitude;
$data['reply_progress'] = $reply_progress;
$data['avg_score'] = $avg_score;
$data['type'] = 1;
$data['content'] = $content;
$order_evaluation = OrderEvaluation::addOrderEvaluation($data);
if (empty($order_evaluation)) {
return fail();
}
return success();
}
/**
* 获取订单问诊评价
* @return array
*/
public function getInquiryEvaluation(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->route('order_inquiry_id');
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$params['patient_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return success(null);
}
// 检测是否评价过
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$params['patient_id'] = $order_inquiry['patient_id'];
$params['order_inquiry_id'] = $order_inquiry_id;;
$order_evaluation = OrderEvaluation::getOne($params);
if (empty($order_evaluation)) {
return success(null);
}
$order_evaluation = $order_evaluation->toArray();
$order_evaluation['reply_quality'] = floor($order_evaluation['reply_quality'] * 0.05); // 回复质量(百分制)
$order_evaluation['service_attitude'] = floor($order_evaluation['service_attitude'] * 0.05); // 服务态度(百分制)
$order_evaluation['reply_progress'] = floor($order_evaluation['reply_progress'] * 0.05);//回复速度(百分制)
$order_evaluation['avg_score'] = floor($order_evaluation['avg_score'] * 0.05); // 平均得分百分制回复质量占4、服务态度占3、回复速度占3计算公式每个得分 * 占比 相加)
return success($order_evaluation);
}
/**
* 获取问诊最低价格
* @return array
*/
public function getInquiryLowestPrice(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 快速
$quick_inquiry_price = 0;
$params = array();
$params['inquiry_type'] = 2;
$params['inquiry_mode'] = 1;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (!empty($system_inquiry_config)) {
$quick_inquiry_price = $system_inquiry_config['inquiry_price'];
}
// 问诊购药
$medicine_inquiry_price = 0;
$params = array();
$params['inquiry_type'] = 4;
$params['inquiry_mode'] = 1;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (!empty($system_inquiry_config)) {
$medicine_inquiry_price = $system_inquiry_config['inquiry_price'];
}
// 专家问诊
$expert_inquiry_price = 0;
$params = array();
$params['inquiry_type'] = 1;
$params['inquiry_mode'] = 1;
$expert_inquiry_price = DoctorInquiryConfig::getMinInquiryPriceMinOne($params);
if (empty($expert_inquiry_price)) {
$params = array();
$params['inquiry_type'] = 1;
$params['inquiry_mode'] = 1;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (!empty($system_inquiry_config)) {
$expert_inquiry_price = $system_inquiry_config['min_inquiry_price'];
}
}
// 公益问诊
$params = array();
$params['inquiry_type'] = 3;
$params['inquiry_mode'] = 1;
$welfare_inquiry_price = DoctorInquiryConfig::getMinInquiryPriceMinOne($params);
if (empty($welfare_inquiry_price)) {
$params = array();
$params['inquiry_type'] = 1;
$params['inquiry_mode'] = 1;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (!empty($system_inquiry_config)) {
$inquiry_price = explode(',', $system_inquiry_config['inquiry_price']);
$welfare_inquiry_price = $inquiry_price[0] ?? 0;
}
}
$result = array();
$result['quick_inquiry_price'] = $quick_inquiry_price;
$result['medicine_inquiry_price'] = $medicine_inquiry_price;
$result['expert_inquiry_price'] = $expert_inquiry_price ?: 0;
$result['welfare_inquiry_price'] = $welfare_inquiry_price ?: 0;
return success($result);
}
/**
* 获取问诊订单消息内页基础数据
* @return array
*/
public function getInquiryMessageBasic(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->route('order_inquiry_id');
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail(HttpEnumCode::HTTP_ERROR, "订单错误");
}
$order_inquiry = $order_inquiry->toArray();
if ($user_info['user_type'] == 1) {
if ($order_inquiry['patient_id'] != $user_info['client_user_id']) {
return fail(HttpEnumCode::SERVER_ERROR);
}
}
if ($user_info['user_type'] == 2) {
if ($order_inquiry['doctor_id'] != $user_info['client_user_id']) {
return fail(HttpEnumCode::SERVER_ERROR);
}
}
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail();
}
$follow = false; // 关注状态
$is_evaluation = false; // 评价状态
// 处理可处方字段
$userDoctorService = new UserDoctorService();
$multi_point_enable = $userDoctorService->getDoctorMultiPointEnable($user_doctor["doctor_id"]);
if ($user_info['user_type'] == 1) {
// 关注状态
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$params['doctor_id'] = $order_inquiry['doctor_id'];
$follow = PatientFollow::getExists($params);
// 评价状态
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$params['patient_id'] = $user_info['client_user_id'];
$params['order_inquiry_id'] = $order_inquiry_id;;
$is_evaluation = OrderEvaluation::getExists($params);
}
// 处理问诊回合数及时长-兼容旧数据
if (empty($order_inquiry['times_number']) || empty($order_inquiry['duration'])) {
// 疑难问诊特殊处理
if ($order_inquiry['inquiry_type'] == 1 && $order_inquiry['inquiry_mode'] == 6) {
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$doctor_config_difficult_consultation = DoctorConfigDifficultConsultation::getOne($params);
if (empty($doctor_config_difficult_consultation)) {
return fail();
}
$order_inquiry['times_number'] = $doctor_config_difficult_consultation['service_rounds']; // 服务回合数
$order_inquiry['duration'] = $doctor_config_difficult_consultation['service_period'] * 24 * 60; // 服务周期
} else {
$params = array();
$params['inquiry_type'] = $order_inquiry['inquiry_type'];
$params['inquiry_mode'] = $order_inquiry['inquiry_mode'];
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (empty($system_inquiry_config)) {
return fail();
}
if (empty($order_inquiry['times_number'])) {
$order_inquiry['times_number'] = $system_inquiry_config['times_number'];
}
if (empty($order_inquiry['duration'])) {
$order_inquiry['duration'] = $system_inquiry_config['duration'];
}
}
}
$result = array();
$result['doctor_user_id'] = $user_doctor['user_id'];
$result['patient_user_id'] = $order_inquiry['user_id'];
$result['doctor_id'] = $order_inquiry['doctor_id'];
$result['patient_id'] = $order_inquiry['patient_id'];
$result['family_id'] = $order_inquiry['family_id'];
$result['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$result['patient_family_name'] = $order_inquiry['patient_name'];
$result['patient_family_sex'] = $order_inquiry['patient_sex'];
$result['patient_family_age'] = $order_inquiry['patient_age'];
$result['inquiry_type'] = $order_inquiry['inquiry_type'];
$result['inquiry_mode'] = $order_inquiry['inquiry_mode'];
$result['inquiry_status'] = $order_inquiry['inquiry_status'];
$result['times_number'] = $order_inquiry['times_number']; // 沟通次数0为不限制次数
$result['duration'] = $order_inquiry['duration']; // 沟通时长分钟0为不限制时长
$result['follow'] = $follow;
$result['is_evaluation'] = $is_evaluation;
$result['reception_time'] = $order_inquiry['reception_time'] ?: null; // 接诊时间
$result['multi_point_status'] = $user_doctor['multi_point_status'] ?: null;// 医生多点执业认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
$result['multi_point_enable'] = $multi_point_enable;// 医生问诊购药是否开启
return success($result);
}
/**
* 结束问诊会话列表
* @return array
*/
public function getDoctorFinishMessageList(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$page = $this->request->input('page', 1);
$per_page = $this->request->input('per_page', 10);
// 获取该医生下问诊过的用户id和家庭成员id
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$result = OrderInquiry::getInquiryEndPage($params, $page, $per_page);
if (empty($result['data'])) {
foreach ($result['data'] as &$item) {
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$params['user_id'] = $item['user_id'];
$params['family_id'] = $item['family_id'];
$inquiry_status_params = [5, 6];
$fields = [
'order_inquiry_id',
'user_id',
'patient_id',
'doctor_id',
'family_id',
'inquiry_type',
'inquiry_mode',
'inquiry_status',
'inquiry_no',
'reception_time',
'complete_time',
'finish_time',
'cancel_time',
'cancel_reason',
'cancel_remarks',
'patient_name',
'patient_sex',
'patient_age',
'created_at',
];
$order_inquiry = OrderInquiry::getInquiryStatusLastOne($params, $inquiry_status_params, $fields);
unset($item['user_id']);
unset($item['family_id']);
if (!empty($order_inquiry)) {
$item = $order_inquiry->toArray();
$params = array();
$params['message_send_result'] = 1;
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$item['message_im'] = MessageIm::getOne($params);
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){
// 获取im消息推送中服务包订单相关的自定义参数
$OrderServicePackageService = new OrderServicePackageService();
$result = $OrderServicePackageService->getImServicePackageCloudCustomData($order_inquiry['inquiry_no']);
if (!empty($result)){
$item = array_merge($item,$result);
}
}
}
}
}
return success($result);
}
/**
* 结束问诊
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function putFinishInquiry(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->route('order_inquiry_id');
if (empty($user_info)) {
return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
}
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail(HttpEnumCode::HTTP_ERROR, "非法订单");
}
$order_inquiry = $order_inquiry->toArray();
if ($order_inquiry['doctor_id'] != $user_info['client_user_id'] && $order_inquiry['patient_id'] != $user_info['client_user_id']) {
return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
}
if ($order_inquiry['inquiry_status'] != 4) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
}
// 订单退款状态
if (!in_array($order_inquiry['inquiry_refund_status'], [0, 4, 5])) {
// 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
return fail(HttpEnumCode::HTTP_ERROR, "订单正在退款,无法结束");
}
// 订单支付状态
if ($order_inquiry['inquiry_pay_status'] != 2) {
return fail(HttpEnumCode::HTTP_ERROR, "订单未支付,无法结束");
}
// 获取医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
}
Db::beginTransaction();
try {
// 修改问诊订单表
$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_id;
OrderInquiry::edit($params, $data);
// 新增患者历史问诊表-问诊完成后添加
$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();
return fail(HttpEnumCode::SERVER_ERROR, "添加患者历史问诊表失败");
}
// 添加自动完成队列
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$time = 60 * 60 * 24 * 3;
if (\Hyperf\Config\config("app_env") == "dev") {
$time = 60;
}
$message = new AutoFinishInquiryDelayDirectProducer($data);
$message->setDelayMs(1000 * $time);
$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();
Log::getInstance("InquiryService-putFinishInquiry")->error($e->getMessage());
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
try {
// 发送IM消息-问诊已完成
$imService = new ImService();
$imService->inquiryComplete($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id']);
// 发送IM消息-订单结束,提醒赠送回合数(医生端)
$imService->remindGiveFreeRounds($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['inquiry_no']);
$MessagePush->finishInquiryToDoctor();
// 患者-发送通知消息-患者的问诊服务结束
$MessagePush = new MessagePush($order_inquiry['user_id'], $order_inquiry['inquiry_no']);
$MessagePush->patientInquiryFinish();
} catch (\Throwable $e) {
Log::getInstance("InquiryService-putFinishInquiry")->error($e->getMessage());
}
return success();
}
/**
* 获取患者最后一条问诊订单id
* @return array
*/
public function getPatientLastInquiryId(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$patient_id = $this->request->input('patient_id');
$doctor_id = $this->request->input('doctor_id');
if (empty($user_info)) {
return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
}
// 获取问诊订单数据
$params = array();
$params['patient_id'] = $patient_id;
$params['doctor_id'] = $doctor_id;
$inquiry_status_params = [3, 4, 5, 6, 7];
$order_inquiry = OrderInquiry::getInquiryStatusLastOne($params, $inquiry_status_params);
if (empty($order_inquiry)) {
return success("");
}
return success($order_inquiry['order_inquiry_id']);
}
/**
* 医生赠送沟通回合数
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function addDoctorGiveInquiryOrder(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->input('order_inquiry_id');
$times_number = $this->request->input('times_number');
$duration = $this->request->input('duration');
if (empty($user_info)) {
return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
}
// 检测赠送的回合数和周期
if (!in_array($duration, [3 * 24 * 60, 7 * 24 * 60, 15 * 24 * 60])) {
return fail(HttpEnumCode::HTTP_ERROR, "请重新选择周期");
}
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$params['doctor_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail();
}
// 检测订单状态
if (!in_array($order_inquiry['inquiry_status'], [5, 6, 7])) {
return fail(HttpEnumCode::HTTP_ERROR, "问诊订单未完成,不可赠送");
}
// 检测是否存在同类型未完成的问诊订单
$PatientOrderService = new PatientOrderService();
$result = $PatientOrderService->getNotFinishedOrderInquiry($order_inquiry['inquiry_type'], $order_inquiry['inquiry_mode'], $order_inquiry['patient_id']);
if (!empty($result)) {
return fail(HttpEnumCode::HTTP_ERROR, "当前患者存在进行中的问诊订单");
}
// 检测当前医生是否和患者存在未完成问诊订单
$InquiryService = new InquiryService();
$result = $InquiryService->checkPatientDoctorProgressInquiry($order_inquiry['patient_id'], $user_info['client_user_id']);
if (!empty($result)) {
return fail(HttpEnumCode::HTTP_ERROR, "当前患者和您存在问诊订单,不可赠送");
}
// 获取患者家庭成员是否存在未支付的服务包订单
$OrderServicePackageService = new OrderServicePackageService();
$order_service_package = $OrderServicePackageService->getPatientFamilyNoPayServicePackage($order_inquiry['user_id'], $order_inquiry['family_id'], $order_inquiry['doctor_id']);
if (!empty($order_service_package)){
return fail(HttpEnumCode::HTTP_ERROR, "当前用户存在未支付订单,不支持赠送");
}
// 获取本次问诊病例
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_inquiry_case = OrderInquiryCase::getOne($params);
if (empty($order_inquiry_case)) {
return fail();
}
// 创建订单
Db::beginTransaction();
$generator = $this->container->get(IdGeneratorInterface::class);
try {
// 生成订单表
$data = array();
$data['user_id'] = $order_inquiry['user_id'];
$data['patient_id'] = $order_inquiry['patient_id'];
$data['doctor_id'] = $order_inquiry['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();
return fail(HttpEnumCode::SERVER_ERROR, "赠送失败");
}
// 生成问诊订单
$data = array();
$data['order_id'] = $order['order_id'];
$data['user_id'] = $order_inquiry['user_id'];
$data['patient_id'] = $order_inquiry['patient_id'];
$data['doctor_id'] = $order_inquiry['doctor_id'];
$data['family_id'] = $order_inquiry['family_id'];
$data['inquiry_type'] = $order_inquiry['inquiry_type'];
$data['inquiry_mode'] = 7;
$data['inquiry_status'] = 4;
$data['inquiry_pay_channel'] = 3;// 支付渠道1:小程序支付 2:微信扫码支付)
$data['inquiry_pay_status'] = 2;
$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['times_number'] = $times_number;// 沟通次数0为不限制次数
$data['duration'] = $duration;// 沟通时长分钟0为不限制时长
$data['patient_name'] = $order_inquiry['patient_name'];// 患者姓名-就诊人
$data['patient_name_mask'] = $order_inquiry['patient_name_mask'];// 患者姓名-就诊人(掩码)
$data['patient_sex'] = $order_inquiry['patient_sex'];// 患者性别-就诊人0:未知 1:男 2:女)
$data['patient_age'] = $order_inquiry['patient_age'];// 患者年龄-就诊人
$order_inquiry = OrderInquiry::addOrderInquiry($data);
if (empty($order_inquiry)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "赠送失败");
}
// 增加患者问诊病例
unset($order_inquiry_case["inquiry_case_id"]);
unset($order_inquiry_case["order_inquiry_id"]);
unset($order_inquiry_case["created_at"]);
unset($order_inquiry_case["updated_at"]);
$data = array();
$data = $order_inquiry_case->toArray();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
if (empty($order_inquiry_case)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "赠送失败");
}
// 不处理意向用药
Db::commit();
} catch (\Throwable $e) {
Db::rollBack();
Log::getInstance("InquiryService-addDoctorGiveInquiryOrder")->error($e->getMessage());
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
// 发送消息
try {
// 赠送到期时间
$give_expiration_time = date('Y-m-d H:i:s', time() + $duration * 60);
// 获取订单医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail(HttpEnumCode::SERVER_ERROR, "赠送失败");
}
// 发送im消息
$imService = new ImService();
// 赠送回合数消息
$imService->giveFreeRounds($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id'], $times_number, $give_expiration_time);
// 发送站内、订阅失败发送短信消息-患者-赠送回合数
$MessagePush = new MessagePush($order_inquiry['user_id'], $order_inquiry['inquiry_no']);
$MessagePush->doctorGiveFreeRounds($times_number, $give_expiration_time);
} catch (\Throwable $e) {
Log::getInstance("InquiryService-addDoctorGiveInquiryOrder")->error($e->getMessage());
}
$result = array();
$result['order_inquiry_id'] = (string)$order_inquiry['order_inquiry_id']; // 订单主键id
$result['inquiry_no'] = (string)$order_inquiry['inquiry_no']; // 订单编号
return success($result);
}
/**
* 获取视频问诊消息内页基础数据
* @return array
*/
public function getInquiryVideoMessageBasic(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->route('order_inquiry_id');
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail();
}
if ($user_info['user_type'] == 1) {
if ($order_inquiry['patient_id'] != $user_info['client_user_id']) {
return fail(HttpEnumCode::SERVER_ERROR);
}
}
if ($user_info['user_type'] == 2) {
if ($order_inquiry['doctor_id'] != $user_info['client_user_id']) {
return fail(HttpEnumCode::SERVER_ERROR);
}
}
// 定义返回数据
$is_reservation_time = false; // 是否已设置预约时间
$is_video = false; // 是否已开视频0:否 1:是)
$update_number = 0; // 修改次数
// 获取视频预约数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry_video_reservation = OrderInquiryVideoReservation::getOne($params);
if (!empty($order_inquiry_video_reservation)) {
$is_reservation_time = true; // 是否已设置预约时间
$update_number = $order_inquiry_video_reservation['update_number']; // 修改次数
// 检测是否已开过视频
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry_video_record = OrderInquiryVideoRecord::getOne($params);
if (!empty($order_inquiry_video_record)) {
$is_video = true; // 是否已开视频0:否 1:是)
}
}
$result = array();
$result['is_reservation_time'] = $is_reservation_time;
$result['is_video'] = $is_video;
$result['update_number'] = $update_number;
return success($result);
}
/**
* 获取服务包关联问诊订单消息内页基础数据
* @return array
*/
public function getInquiryServiceMessageBasic(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_inquiry_id = $this->request->route('order_inquiry_id');
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail(HttpEnumCode::HTTP_ERROR, "订单错误");
}
$order_inquiry = $order_inquiry->toArray();
if ($user_info['user_type'] == 1) {
if ($order_inquiry['patient_id'] != $user_info['client_user_id']) {
return success();
}
}
if ($user_info['user_type'] == 2) {
if ($order_inquiry['doctor_id'] != $user_info['client_user_id']) {
return success();
}
}
// 获取问诊订单关联服务包
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_service_package_inquiry = OrderServicePackageInquiry::getOne($params);
if (empty($order_service_package_inquiry)) {
return success();
}
// 获取用户当前购买的服务包
$params = array();
$params['order_service_no'] = $order_service_package_inquiry['order_service_no'];
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
return success();
}
// 检测服务包订单订单状态
if ($order_service_package['order_service_status'] == 1) {
return success();
}
if ($order_service_package['order_service_status'] == 2) {
return success();
}
// 获取服务包订单详情
$params = array();
$params['order_service_no'] = $order_service_package['order_service_no'];
$order_service_package_detail = OrderServicePackageDetail::getOne($params);
if (empty($order_service_package_detail)) {
return success();
}
// 获取当月已问诊次数
// 3.5号购买每月2次问诊次数。今天5.3,属于第几个月,这个月的开始时间和结束时间
$month_inquiry_count = 0;
if ($order_service_package_detail['monthly_frequency'] != 0 && !empty($order_service_package['start_time'])) {
// 获取服务包当月已问诊次数
$OrderServicePackageService = new OrderServicePackageService();
// 检测问诊是否服务包首次问诊
$is_first = $OrderServicePackageService->isFirstInquiryServicePackage($order_service_package['order_service_no']);
if ($is_first){
// 首次必定只问诊了一次
$month_inquiry_count = 1;
}else{
$month_inquiry_count = $OrderServicePackageService->getCurrentMonthInquiryCount($order_service_package['pay_time'], $order_service_package['order_service_type'], $order_service_package['user_id'], $order_service_package['doctor_id']);
}
}
// 处理剩余服务天数
$finish_day = null;
if (!empty($order_service_package['finish_time'])) {
$finish_day = ceil((strtotime($order_service_package['finish_time']) - time()) / 60 / 60 / 24);
}
$remaining_quantity = 0;
if ($order_service_package['order_service_type'] == 1){
$OrderServicePackageService = new OrderServicePackageService();
// 获取服务包内所有药品
$health_package_products = $OrderServicePackageService->getOrderServiceProduct($order_service_package_detail['package_id']);
foreach ($health_package_products as $health_package_product) {
// 获取服务包内某一药品的剩余数量
$remaining_quantity = $OrderServicePackageService->getOrderServiceProductCanUseQuantity($order_service_package['order_service_id'],$health_package_product['product_id'],$health_package_product['quantity']);
}
}
$result = array();
$result['remaining_finish_day'] = $finish_day; // 剩余服务天数
$result['month_inquiry_count'] = $month_inquiry_count; // 服务包当月已问诊次数
$result['monthly_frequency'] = $order_service_package_detail['monthly_frequency']; // 每月次数0表示不限次
$result['remaining_quantity'] = $remaining_quantity; // 剩余药品数量
if (!empty($order_service_package['start_time'])){
$result['start_time'] = date('Y-m-d H:i',strtotime($order_service_package['start_time'])); // 服务包开始时间
}
if (!empty($order_service_package['finish_time'])){
$result['finish_time'] = date('Y-m-d H:i',strtotime($order_service_package['finish_time'])); // 服务包结束时间
}
$result['remaining_month_inquiry_count'] = $order_service_package_detail['monthly_frequency'] - $month_inquiry_count; // 服务包当月剩余问诊次数
$result['service_period'] = $order_service_package_detail['service_period']; // 服务包服务周期
return success($result);
}
/**
* 获取医生未接诊订单数量
* @param string $doctor_id 医生id
* @return int
*/
public function getDoctorNotAcceptedInquiryNum(string $doctor_id): int
{
$params = array();
$params['doctor_id'] = $doctor_id;
$params['inquiry_status'] = 3; // 待接诊
$params['inquiry_refund_status'] = 0; // 无退款
$order_inquiry_count = OrderInquiry::getCount($params);
if (!empty($order_inquiry_count) || $order_inquiry_count != 0) {
$not_accepted_inquiry_num = $order_inquiry_count;
} else {
$not_accepted_inquiry_num = $order_inquiry_count;
}
return $not_accepted_inquiry_num;
}
/**
* 获取医生接诊中订单数量
* @param string $doctor_id 医生id
* @param string $inquiry_type 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
* @return int
*/
public function getDoctorAcceptingInquiryNum(string $doctor_id, string $inquiry_type = ""): int
{
$params = array();
$params['doctor_id'] = $doctor_id;
if (!empty($inquiry_type)) {
$params['inquiry_type'] = $inquiry_type; // 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
}
$params['inquiry_status'] = 4; // 已接诊
$params['inquiry_refund_status'] = 0; // 无退款
$order_inquiry_count = OrderInquiry::getCount($params);
if (!empty($order_inquiry_count) || $order_inquiry_count != 0) {
$accepting_inquiry_num = $order_inquiry_count;
} else {
$accepting_inquiry_num = $order_inquiry_count;
}
return $accepting_inquiry_num;
}
/**
* 获取医生当日接诊的订单金额
* 状态:已接诊
* @param string $doctor_id
* @param string $date
* @param string|int $is_platform_deep_cooperation 是否坐班医生
* @return float
*/
public function getDoctorDayAmountTotal(string $doctor_id, string $date, string|int $is_platform_deep_cooperation): float
{
// 获取当天开始时间
$start_date = date('Y-m-d 00:00:00', strtotime($date));
// 获取当天结束时间
$end_date = date('Y-m-d 23:59:59', strtotime($date));
// 获取医生当日接诊订单金额
$params = array();
$params['doctor_id'] = $doctor_id;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$params['is_withdrawal'] = 0; // 是否提现0:否 1:是 2:提现中)
$reception_time = [$start_date, $end_date];
$inquiry_status_params = [4, 5]; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$inquiry_type_not_params = [];
if ($is_platform_deep_cooperation) {
$inquiry_type_not_params = [2, 4];
}
$amount_total_sum = OrderInquiry::getDoctorAmountTotal($params, $reception_time, $inquiry_status_params, $inquiry_type_not_params);
return $amount_total_sum ?: 0;
}
/**
* 获取医生当日已完成未结束的订单金额
* 状态:已完成
* @param string $doctor_id
* @param string $date
* @param string|int $is_platform_deep_cooperation 是否坐班医生
* @return float
*/
public function getDoctorDayCompletedAmountTotal(string $doctor_id, string $date,string|int $is_platform_deep_cooperation): float
{
// 获取当天开始时间
$start_date = date('Y-m-d 00:00:00', strtotime($date));
// 获取当天结束时间
$end_date = date('Y-m-d 23:59:59', strtotime($date));
// 获取医生当日接诊订单金额
$params = array();
$params['doctor_id'] = $doctor_id;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$params['is_withdrawal'] = 0; // 是否提现0:否 1:是 2:提现中)
$reception_time = [$start_date, $end_date];
$inquiry_status_params = [5]; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$inquiry_type_not_params = [];
if ($is_platform_deep_cooperation) {
$inquiry_type_not_params = [2, 4];
}
$amount_total_sum = OrderInquiry::getDoctorAmountTotal($params, $reception_time, $inquiry_status_params,$inquiry_type_not_params);
return $amount_total_sum ?: 0;
}
/**
* 获取医生可提现金额
* @param string $doctor_id
* @return array
*/
public function getDoctorCanWithdrawalInquiryOrder(string $doctor_id): array
{
// 获取医生当日接诊订单金额
$params = array();
$params['doctor_id'] = $doctor_id;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$params['statistics_status'] = 1; // 订单统计状态0:未统计 1:已统计 2:统计失败)
$params['is_withdrawal'] = 0; // 是否提现0:否 1:是 2:提现中)
$params['inquiry_status'] = 6; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$order_inquiry = OrderInquiry::getList($params);
if (empty($order_inquiry)) {
return [];
}
return $order_inquiry->toArray();
}
/**
* 获取医生可提现金额-坐班医生
* @param string $doctor_id
* @return array
*/
public function getCooperationDoctorCanWithdrawalInquiryOrder(string $doctor_id): array
{
// 获取医生当日接诊订单金额
$params = array();
$params['doctor_id'] = $doctor_id;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$params['statistics_status'] = 1; // 订单统计状态0:未统计 1:已统计 2:统计失败)
$params['is_withdrawal'] = 0; // 是否提现0:否 1:是 2:提现中)
$inquiry_status_params = [6]; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$inquiry_type_not_params = [2, 4];
$order_inquiry = OrderInquiry::getCooperationDoctorCanWithdrawalInquiryOrder($params, $inquiry_status_params, $inquiry_type_not_params);
if (empty($order_inquiry)) {
return [];
}
return $order_inquiry->toArray();
}
/**
* 获取患者某一状态下的问诊订单数量
* @param string $patient_id 患者id
* @param int $inquiry_status 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
* @return int
*/
public function getPatientInquiryWithStatus(string $patient_id, int $inquiry_status): int
{
$params = array();
$params['patient_id'] = $patient_id;
$params['inquiry_status'] = $inquiry_status;
return OrderInquiry::getCount($params);
}
/**
* 问诊订单退款接口
* 务必外层接收异常,回滚事务
* @param string $order_inquiry_id
* @param string $refund_reason 退款原因
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
// public function inquiryRefund(string $order_inquiry_id, string $refund_reason): void
// {
// // 获取订单数据
// $params = array();
// $params['order_inquiry_id'] = $order_inquiry_id;
// $order_inquiry = OrderInquiry::getOne($params);
// if (empty($order_inquiry)) {
// throw new BusinessException("订单数据为空");
// }
//
// // 检测问诊订单状态
// if (!in_array($order_inquiry['inquiry_status'], [2, 3, 4, 5, 7])) {
// // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
// throw new BusinessException("订单状态错误");
// }
//
// // 检测订单退款状态
// if (in_array($order_inquiry['inquiry_refund_status'], [2, 3, 5])) {
// // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
// throw new BusinessException("订单退款状态错误");
// }
//
// // 检测支付状态
// if ($order_inquiry['inquiry_pay_status'] != 2) {
// // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
// throw new BusinessException("订单支付状态错误");
// }
//
// // 系统退款编号
// $generator = $this->container->get(IdGeneratorInterface::class);
// $inquiry_refund_no = $generator->generate();
//
// // 检测订单金额
// if ($order_inquiry['payment_amount_total'] > 0) {
// // 发起退款
// $WechatPay = new WechatPay(1, 1);
//
// $options = array();
// $options['transaction_id'] = $order_inquiry['escrow_trade_no'];
// $options['out_refund_no'] = (string)$inquiry_refund_no;
// $options['reason'] = $refund_reason;
// $options['amount'] = [
// 'refund' => (int)round($order_inquiry['payment_amount_total'] * 100),
// 'total' => (int)round($order_inquiry['payment_amount_total'] * 100),
// 'currency' => "CNY",
// ];
//
// $result = $WechatPay->refund($options);
//
// // 处理订单退款状态
// // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
// $success_time = "";
// if ($result['status'] == "SUCCESS") {
// // 退款成功
// $inquiry_refund_status = 3;
// $success_time = $result['success_time'];
// } elseif ($result['status'] == "CLOSED") {
// // 退款关闭
// $inquiry_refund_status = 5;
// } elseif ($result['status'] == "PROCESSING") {
// // 退款处理中
// $inquiry_refund_status = 2;
// } elseif ($result['status'] == "ABNORMAL") {
// // 退款异常,此情况不处理,进行短信通知
// throw new BusinessException("订单退款状态异常");
// } else {
// throw new BusinessException("订单退款状态错误");
// }
//
// $refund_id = $result['refund_id'];
//
// } else {
// // 模拟退款
// $inquiry_refund_status = 3;
// $refund_id = "模拟退款:" . $generator->generate();
// $success_time = date("Y-m-d H:i:s", time());
//
// // 模拟退款时手动退还优惠卷
// if (!empty($order_inquiry['coupon_amount_total']) && $order_inquiry['coupon_amount_total'] > 0) {
// // 获取该订单全部优惠卷数据
// $params = array();
// $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
// $order_inquiry_coupons = OrderInquiryCoupon::getList($params);
// if (!empty($order_inquiry_coupons)) {
// $userCouponService = new UserCouponService();
// foreach ($order_inquiry_coupons as $order_inquiry_coupon) {
// // 退还优惠卷
// $userCouponService->returnUserCoupon($order_inquiry_coupon['user_coupon_id']);
//
// // 发送站内消息-优惠卷退还
// $MessagePush = new MessagePush($order_inquiry['user_id']);
// $MessagePush->patientRefundCoupon($order_inquiry_coupon['coupon_name']);
// }
// }
// }
// }
//
// // 新增退款表
// $data = array();
// $data['patient_id'] = $order_inquiry['patient_id'];
// $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
// $data['inquiry_no'] = $order_inquiry['inquiry_no'];
// $data['inquiry_refund_no'] = $inquiry_refund_no;
// $data['refund_id'] = $refund_id;
// $data['inquiry_refund_status'] = $inquiry_refund_status;
// $data['refund_total'] = $order_inquiry['payment_amount_total'];
// $data['refund_reason'] = $refund_reason;
//
// if ($inquiry_refund_status == 3 && !empty($success_time)) {
// $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间
// }
//
// $order_inquiry_refund = OrderInquiryRefund::addOrderInquiryRefund($data);
// if (empty($order_inquiry_refund)) {
// throw new BusinessException("添加退款表失败");
// }
//
// // 修改问诊订单表状态
// $data = array();
// $data['inquiry_refund_status'] = $inquiry_refund_status;
//
// $params = array();
// $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
// OrderInquiry::edit($params, $data);
// }
/**
* 取消未支付的问诊订单
* @param string|int $order_no
* @param string|int $cancel_reason 取消订单原因1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时)
* @param string|int $cancel_remarks 取消订单备注
* @return array
*/
public function cancelUnpayInquiryOrder(string|int $order_no, string|int $cancel_reason, string|int $cancel_remarks): array
{
try {
$result = array();
$result['status'] = 1;
$result['message'] = "成功";
// 获取问诊订单数据
$params = array();
$params['inquiry_no'] = $order_no;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
throw new BusinessException("未查询到对应订单数据");
}
// 检测订单状态
if ($order_inquiry['inquiry_status'] == 7) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$result['status'] = 0;
$result['message'] = "订单已取消";
return $result;
}
if ($order_inquiry['inquiry_status'] != 1) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$result['status'] = 0;
$result['message'] = "订单取消失败";
return $result;
}
if (!in_array($order_inquiry['inquiry_refund_status'], [0, 4, 5])) {
// 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$result['status'] = 0;
$result['message'] = "订单正在退款中";
return $result;
}
if ($order_inquiry['inquiry_pay_status'] == 2) {
// 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$result['status'] = 0;
$result['message'] = "订单已支付";
return $result;
}
// 检测订单删除状态
if ($order_inquiry['is_delete'] == 1) {
// 删除状态0:否 1:是)
$result['status'] = 0;
$result['message'] = "订单已被删除";
return $result;
}
// 取消问诊订单
$data = array();
$data['inquiry_status'] = 7;
if ($cancel_reason == 5) {
$data['inquiry_pay_status'] = 5; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
}
$data['cancel_time'] = date("Y-m-d H:i:s", time());
$data['cancel_reason'] = $cancel_reason; // 取消订单原因1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时)
$data['cancel_remarks'] = $cancel_remarks; // 取消订单备注
$data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
OrderInquiry::edit($params, $data);
// 处理订单优惠卷
if (!empty($order_inquiry['coupon_amount_total']) && $order_inquiry['coupon_amount_total'] > 0) {
// 获取该订单全部优惠卷数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_inquiry_coupons = OrderInquiryCoupon::getList($params);
if (!empty($order_inquiry_coupons)) {
$userCouponService = new UserCouponService();
foreach ($order_inquiry_coupons as $order_inquiry_coupon) {
// 退还优惠卷
$userCouponService->returnUserCoupon($order_inquiry_coupon['user_coupon_id']);
// 发送站内消息-优惠卷退还
$MessagePush = new MessagePush($order_inquiry['user_id']);
$MessagePush->patientRefundCoupon($order_inquiry_coupon['coupon_name']);
}
}
}
} catch (\Throwable $e) {
throw new BusinessException($e->getMessage());
}
return $result;
}
/**
* 检测当前医生是否和患者进行中的问诊订单
* @param string $patient_id
* @param string $doctor_id
* @return array
*/
public function checkPatientDoctorProgressInquiry(string $patient_id, string $doctor_id): array
{
$params = array();
if (!empty($patient_id)) {
$params[] = ['patient_id', '=', $patient_id];
}
$params = array();
$params[] = ['patient_id', '=', $patient_id];
$params[] = ['doctor_id', '=', $doctor_id];
$inquiry_status_params = [1, 3, 4];// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$order_inquiry = OrderInquiry::getInquiryStatusOne($params, $inquiry_status_params);
if (empty($order_inquiry)) {
return [];
}
return $order_inquiry->toArray();
}
/**
* 检测问诊订单执行退款次数
* @param string $order_inquiry_id
* @return bool
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function checkInquiryRefundCount(string $order_inquiry_id): bool
{
try {
$redis = $this->container->get(Redis::class);
$redis_key = "inquiryRefund" . $order_inquiry_id;
$redis_value = $redis->get($redis_key);
if (empty($redis_value)) {
$redis->set($redis_key, 1, 60 * 60 * 24 * 2);
return true;
}
// 问诊订单执行退款次数过多
if ($redis_value > 3) {
// 加入短信队列,通知管理员
return false;
}
$redis->incr($redis_key);
} catch (\Exception $e) {
Log::getInstance()->error("检测问诊订单执行退款次数失败:" . $e->getMessage());
return false;
}
return true;
}
/**
* 检测当前是否符合系统问诊时间
* @param string $inquiry_type 接诊类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
* @return bool
*/
public function checkSystemInquiryTime(string $inquiry_type): bool
{
// 获取问诊配置
$params = array();
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = 1;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (empty($system_inquiry_config)) {
throw new BusinessException("系统问诊配置错误");
}
// 获取系统工作时间
$params = array();
$params['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id'];
$system_inquiry_time = SystemInquiryTime::getList($params);
if (empty($system_inquiry_time)) {
throw new BusinessException("系统问诊时间配置错误");
}
// 检测当前是否坐班时间
$is_time_pass = false; // 非坐班时间
foreach ($system_inquiry_time as $item) {
$now_time = date('H', time()) . date('i', time());
if ($item['start_time'] < $now_time && $item['end_time'] > $now_time) {
// 符合当前时间区间
$is_time_pass = true;
}
}
return $is_time_pass;
}
/**
* 获取现在时间距离订单结束时间的时间差
* @param array|object $order_inquiry
* @return float|int
*/
public function getInquiryFinishTimeDiff(array|object $order_inquiry): float|int
{
if (!in_array($order_inquiry['inquiry_status'], [1, 2, 3, 4])) {
throw new BusinessException("问诊订单状态错误");
}
// 随机初始时间
$time = mt_rand(60, 600);
$wait_pay_time = 60 * 30;// 待支付时间
$wait_assign_time = 60 * 5;// 待分配时间
$wait_inquiry_time = 0; // 待接诊时间
$wait_finish_time = 0;// 待结束时间
if ($order_inquiry['inquiry_type'] == 1) {
// 专家问诊
$wait_assign_time = 0;
$wait_inquiry_time = 60 * 60 * 24;
$wait_finish_time = 60 * 60 * 24;
} elseif ($order_inquiry['inquiry_type'] == 2) {
// 快速问诊
$wait_assign_time = 60 * 5;
$wait_inquiry_time = 60 * 10;
$wait_finish_time = 60 * 60;
} elseif ($order_inquiry['inquiry_type'] == 3) {
// 公益问诊
$wait_assign_time = 0;
$wait_inquiry_time = 60 * 60 * 24;
$wait_finish_time = 60 * 60 * 24;
} elseif ($order_inquiry['inquiry_type'] == 4) {
// 问诊购药
$wait_assign_time = 60 * 5;
$wait_inquiry_time = 60 * 10;
$wait_finish_time = 60 * 30;
} elseif ($order_inquiry['inquiry_type'] == 5) {
// 检测订单
$wait_finish_time = 60 * 60 * 24 * 3;
}
switch ($order_inquiry['inquiry_status']) {
case '1':
// 待支付
$wait_pay_time = $wait_pay_time - (time() - strtotime($order_inquiry['created_at']));
if ($wait_pay_time < 0) {
$wait_pay_time = 0;
}
$time = $time + $wait_pay_time + $wait_assign_time + $wait_inquiry_time + $wait_finish_time;
break;
case '2':
// 待分配
$time = $time + $wait_assign_time + $wait_inquiry_time + $wait_finish_time;
break;
case '3':
// 待接诊
$wait_inquiry_time = $wait_inquiry_time - (time() - strtotime($order_inquiry['pay_time']));
if ($wait_inquiry_time < 0) {
$wait_inquiry_time = 0;
}
$time = $time + $wait_inquiry_time + $wait_finish_time;
break;
case '4':
// 已接诊
$wait_finish_time = $wait_finish_time - (time() - strtotime($order_inquiry['reception_time']));
if ($wait_finish_time < 0) {
$wait_finish_time = 0;
}
$time = $time + $wait_finish_time;
break;
default:
break;
}
if ($time < 0) {
$time = 0;
}
return $time;
}
/**
* 获取患者在某一时间段的服务包问诊订单-创建时间
* @param string|int $order_service_type 服务包类型1:健康包 2:随访包)
* @param string $user_id
* @param string $doctor_id
* @param string $start_date
* @param string $end_date
* @return array
*/
public function getPatientServiceInquiry(string|int $order_service_type, string $user_id, string $doctor_id, string $start_date, string $end_date): array
{
if ($order_service_type == 1) {
$inquiry_type = 1;
$inquiry_mode = 8;
} else {
$inquiry_type = 1;
$inquiry_mode = 9;
}
// 获取医生当日接诊订单金额
$params = array();
$params['user_id'] = $user_id;
$params['doctor_id'] = $doctor_id;
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$created_at = [$start_date, $end_date];
$inquiry_status_params = [1, 2, 3, 4, 5, 6]; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$result = OrderInquiry::getInquiryWithCreateTime($params, $created_at, $inquiry_status_params);
if (empty($result)) {
return [];
}
return $result->toArray();
}
/**
* 获取医生当日有效问诊数量
* @param string|int $doctor_id
* @param string|int $inquiry_type
* @return int|mixed
*/
public function getDoctorDayInquiryCount(string|int $doctor_id,string|int $inquiry_type): mixed
{
$params = array();
$params[] = ['doctor_id', '=', $doctor_id];
$params[] = ['inquiry_type', '=', $inquiry_type];
$params[] = ['inquiry_mode', '=', 1];
$params[] = ['inquiry_refund_status', '=', 0];
// 获取当天开始时间
$start_date = date('Y-m-d 00:00:00', time());
// 获取当天结束时间
$end_date = date('Y-m-d 23:59:59', time());
$created_at = [$start_date, $end_date];
$inquiry_status_params = [1,2,3,4,5,6,7];
$order_inquirys = OrderInquiry::getInquiryWithCreateTime($params,$created_at,$inquiry_status_params);
if (empty($order_inquirys)){
return 0;
}
$count = 0;
foreach ($order_inquirys as $order_inquiry){
if ($order_inquiry['inquiry_status'] == 7){
continue;
}
$count = $count + 1;
}
return $count;
}
}