2322 lines
98 KiB
PHP
2322 lines
98 KiB
PHP
<?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;
|
||
}
|
||
} |