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

1880 lines
78 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\Constants\DoctorTitleCode;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\DetectionProject;
use App\Model\DiseaseClass;
use App\Model\DoctorInquiryConfig;
use App\Model\Hospital;
use App\Model\InquiryCaseProduct;
use App\Model\MessageIm;
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\OrderPrescription;
use App\Model\OrderProductCoupon;
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\Utils\Log;
use App\Utils\Mask;
use App\Utils\PcreMatch;
use Extend\Wechat\WechatPay;
use GuzzleHttp\Exception\GuzzleException;
use Hyperf\Amqp\Producer;
use Hyperf\DbConnection\Db;
use Hyperf\Redis\Redis;
use Hyperf\Snowflake\IdGeneratorInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/**
* 问诊
*/
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" => "",
];
$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'], $user_info['client_user_id']);
if (!empty($order_inquiry_id)) {
$result['status'] = 2;
$result['message'] = "当前患者存在进行中的问诊订单";
$result['data']['order_inquiry_id'] = $order_inquiry_id;
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_id;
return success($result);
}
}
// 检测当前是否符合系统问诊时间
$inquiryService = new InquiryService();
$is_system_time_pass = $inquiryService->checkSystemInquiryTime($request_params['inquiry_type']);
if (!$is_system_time_pass && $request_params['inquiry_type'] == 4) {
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['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'] = $generator->generate();// 订单编号
$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'] = $patient_family['age'];// 患者年龄-就诊人
$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'] = $patient_family['age'];// 患者年龄
}
// 身高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_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, "订单创建失败");
}
}
}
// 增加至未支付取消订单延迟队列
$data = array();
$data['order_no'] = $order_inquiry['inquiry_no'];
$data['order_type'] = 1;
$message = new CancelUnpayOrdersDelayDirectProducer($data);
$message->setDelayMs(1000 * 60 * 30);
$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)) {
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$message = new CancelUnInquiryOrdersDelayDirectProducer($data);
$message->setDelayMs(1000 * 60 * 60 * 24);
$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']; // 订单编号
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, "订单错误");
}
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; // 评价状态
// 获取医生问诊配置-问诊购药
$multi_point_enable = 0;
$params = array();
$params['doctor_id'] = $user_doctor['doctor_id'];
$params['inquiry_type'] = 4;
$params['inquiry_mode'] = 1;
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
if (!empty($doctor_inquiry_config)) {
if ($doctor_inquiry_config['is_enable'] == 1){
$multi_point_enable = 1;// 是否开启问诊购药
}
}
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);
}
$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);
}
}
}
return success($result);
}
/**
* 结束问诊
* @return array
* @throws GuzzleException
*/
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'];
$message = new AutoFinishInquiryDelayDirectProducer($data);
$message->setDelayMs(1000 * 60 * 60 * 24 * 3);
$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['order_inquiry_id']);
$MessagePush->finishInquiryToDoctor();
// 患者-发送通知消息-患者的问诊服务结束
$MessagePush = new MessagePush($order_inquiry['user_id'], $order_inquiry['order_inquiry_id']);
$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*60,7*60,5*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['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, "当前患者和您存在问诊订单,不可赠送");
}
// 获取本次问诊病例
$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['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'] = $generator->generate();// 订单编号
$data['escrow_trade_no'] = "GD" . $generator->generate(); // 第三方支付流水号
$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['order_inquiry_id']);
$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);
}
/**
* 获取医生未接诊订单数量
* @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
* @return float
*/
public function getDoctorDayAmountTotal(string $doctor_id, string $date): 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:已取消)
$amount_total_sum = OrderInquiry::getOrderInquiryBetweenTimeAmountTotalSum($params, $reception_time, $inquiry_status_params);
return $amount_total_sum ?: 0;
}
/**
* 获取医生当日已完成未结束的订单金额
* 状态:已完成
* @param string $doctor_id
* @param string $date
* @return float
*/
public function getDoctorDayCompletedAmountTotal(string $doctor_id, string $date): 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:已取消)
$amount_total_sum = OrderInquiry::getOrderInquiryBetweenTimeAmountTotalSum($params, $reception_time, $inquiry_status_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 $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)
{
// 获取订单数据
$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
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function cancelUnpayInquiryOrder(string|int $order_no, string|int $cancel_reason, string|int $cancel_remarks): array
{
$result = array();
$result['status'] = 1;
$result['message'] = "成功";
// 获取订单数据
$params = array();
$params['inquiry_no'] = $order_no;
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
$result['status'] = 0;
$result['message'] = "取消未支付的问诊订单失败:未查询到对应订单数据";
return $result;
}
// 检测订单状态
if ($order_inquiry['inquiry_status'] == 7) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$result['status'] = 2;
$result['message'] = "取消未支付的问诊订单:订单已取消";
return $result;
}
if ($order_inquiry['inquiry_status'] != 1) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$result['status'] = 0;
$result['message'] = "取消未支付的问诊订单:订单状态为" . $order_inquiry['inquiry_status'] . "无法执行";
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'] = 2;
$result['message'] = "取消未支付的问诊订单:订单已支付";
return $result;
}
// 检测订单删除状态
if ($order_inquiry['is_delete'] == 1) {
// 删除状态0:否 1:是)
$result['status'] = 2;
$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']);
}
}
}
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 * 5);
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;
}
}