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

529 lines
23 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\CancelUnInquiryOrdersDelayDirectProducer;
use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer;
use App\Constants\HttpEnumCode;
use App\Model\DiseaseClass;
use App\Model\DoctorConfigFollowPackage;
use App\Model\DoctorConfigFollowPackageItem;
use App\Model\DoctorConfigHealthPackage;
use App\Model\InquiryCaseProduct;
use App\Model\Order;
use App\Model\OrderCoupon;
use App\Model\OrderInquiry;
use App\Model\OrderInquiryCase;
use App\Model\OrderInquiryCoupon;
use App\Model\OrderServicePackage;
use App\Model\OrderServicePackageCase;
use App\Model\OrderServicePackageDetail;
use App\Model\PatientFamily;
use App\Model\PatientFamilyHealth;
use App\Model\PatientFamilyPersonal;
use App\Model\Product;
use App\Model\SystemInquiryConfig;
use App\Model\UserCoupon;
use App\Model\UserDoctor;
use App\Utils\Log;
use App\Utils\PcreMatch;
use Hyperf\Amqp\Producer;
use Hyperf\DbConnection\Db;
use Hyperf\Snowflake\IdGeneratorInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class OrderServicePackageService extends BaseService
{
/**
* 获取患者已购买的某医生的服务包详情
* @return array
*/
public function getPatientBuyServiceDetail(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$doctor_id = $this->request->input("doctor_id");
$family_id = $this->request->input("family_id");
$service_type = $this->request->input("service_type");// 服务包类型 1健康 2随访
$follow_package_item_id = $this->request->input("follow_package_item_id");
if ($service_type == 2){
if (empty($follow_package_item_id)){
return fail();
}
}
$result = array();
$result['status'] = 1;
$result['message'] = "";
$result['data'] = NULL;
// 检测家庭成员是否存在
$params = array();
$params['family_id'] = $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, "患者信息错误");
}
if ($service_type == 1){
$inquiry_mode = 8;
}else{
$inquiry_mode = 9;
}
// 检测是否存在同类型未完成的问诊订单
$PatientOrderService = new PatientOrderService();
$order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry(1,$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::SERVER_ERROR);
}
$result['status'] = 4;
$result['message'] = "当前患者存在进行中的问诊订单";
$result['data'] = $order_inquiry['inquiry_no'];
return success($result);
}
// 检测当前医生是否和患者存在未完成问诊订单
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($user_info['client_user_id'], $doctor_id);
if (!empty($order_inquiry)) {
$result['status'] = 4;
$result['message'] = "您和当前医生存在问诊中订单,无法够买服务包";
$result['data'] = $order_inquiry['inquiry_no'];
return success($result);
}
// 检测患者是否购买服务包
$params = array();
$params['user_id'] = $user_info['user_id'];
$params['patient_id'] = $user_info['client_user_id'];
$params['doctor_id'] = $doctor_id;
$params['family_id'] = $family_id;
$params['order_service_type'] = $service_type;
$order_service_status = ['1','2','3'];
$order_service_package = OrderServicePackage::getStatusOne($params,$order_service_status);
if (empty($order_service_package)){
$result['message'] = "未购买";
return success($result);
}
// 检测服务包订单订单状态
if ($order_service_package['order_service_status'] == 1){
$result['status'] = 2;
$result['message'] = "存在未支付订单";
$result['data'] = $order_service_package['order_service_no'];
return success($result);
}
if ($order_service_package['order_service_status'] == 2){
$result['status'] = 2;
$result['message'] = "您已购买该服务包,请耐心等待医生接诊";
$result['data'] = $order_service_package['order_service_no'];
return success($result);
}
// 获取服务包订单详情
$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 fail(HttpEnumCode::SERVER_ERROR);
}
// 检测随访包
if ($service_type == 2){
// 检测服务周期是否相同,相同表示购买的同一个随访包
$params = array();
$params['follow_package_item_id'] = $follow_package_item_id;
$doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params);
if (empty($doctor_config_follow_package_item)){
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误");
}
$params = array();
$params['follow_package_id'] = $doctor_config_follow_package_item['follow_package_id'];
$params['doctor_id'] = $doctor_id;
$doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params);
if (empty($doctor_config_follow_package)){
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误");
}
}
// 处理问诊次数
// 3.5号购买每月2次问诊次数。今天5.3,属于第几个月,这个月的开始时间和结束时间
if ($order_service_package_detail['monthly_frequency'] != 0){
$month_inquiry_count = 0; // 当前所属月问诊次数
// 获取当月问诊次数
// 获取开启服务日期和今日的相差天数
$diff = abs(time() - strtotime($order_service_package['start_time']));
$diff_days = ceil($diff / (60 * 60 * 24)); // 转换为天数
// 获取当前月次
$month_time = ceil($diff_days / 30);
$days = (int)$month_time * 30;
// 获取开始日期
$end_date = date('Y-m-d 23:59:59', strtotime($order_service_package['start_time'] . " +$days days"));
$start_date = date('Y-m-d 00:00:00', strtotime($end_date . "-30 days"));
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->getPatientServiceInquiry($service_type,$user_info['client_user_id'],$doctor_id,$start_date,$end_date);
if (!empty($order_inquiry)){
$month_inquiry_count = count($order_inquiry);
}
if ($month_inquiry_count >= $order_service_package_detail['monthly_frequency']){
// 超出当月问诊次数
$result['status'] = 3;
$result['message'] = "超出服务包所包含的当月问诊次数";
$result['data'] = $order_service_package['order_service_no'];
return success($result);
}
}
// 未超出当月问诊次数或次数无限制
$result['status'] = 5;
$result['message'] = "已购买,未超出当月问诊次数";
$result['data'] = $order_service_package['order_service_no'];
return success($result);
}
/**
* 创建服务包订单
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function addPatientServiceOrder(): array
{
$result = array();
$result['status'] = 1;
$result['message'] = "成功";
$result['data'] = [
"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, "患者信息错误");
}
// 检测是否存在同类型未完成的问诊订单
$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::SERVER_ERROR);
}
$result['status'] = 4;
$result['message'] = "当前患者存在进行中的问诊订单";
$result['data']['order_no'] = $order_inquiry['inquiry_no'];
return success($result);
}
// 检测当前医生是否和患者存在未完成问诊订单
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($user_info['client_user_id'], $request_params['doctor_id']);
if (!empty($order_inquiry)) {
$result['status'] = 4;
$result['message'] = "您和当前医生存在问诊中订单,无法够买服务包";
$result['data']['order_no'] = $order_inquiry['inquiry_no'];
return success($result);
}
// 检测所患疾病是否正确
$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, "疾病信息填写错误");
}
// 获取当前问诊医生信息
$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, "当前医生无法接诊,请重新选择");
}
// 确定支付渠道
// 支付渠道1:小程序支付 2:微信扫码支付)
if ($request_params['client_type'] == 1) {
$inquiry_pay_channel = 1;
} elseif ($request_params['client_type'] == 2) {
$inquiry_pay_channel = 2;
}else{
return fail(HttpEnumCode::HTTP_ERROR, "支付方式错误");
}
// 处理复诊凭证
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, "订单创建失败");
}
// 检测患者是否购买服务包
$params = array();
$params['user_id'] = $user_info['user_id'];
$params['patient_id'] = $user_info['client_user_id'];
$params['doctor_id'] = $request_params['doctor_id'];
$params['family_id'] = $request_params['family_id'];
$params['order_service_type'] = $request_params['service_type'];
$order_service_status = ['1','2','3'];
$order_service_package = OrderServicePackage::getStatusOne($params,$order_service_status);
if (!empty($order_service_package)){
// 检测服务包订单订单状态
if ($order_service_package['order_service_status'] == 1){
$result['status'] = 2;
$result['message'] = "存在未支付订单";
$result['data']['order_no'] = (string)$order_service_package['order_service_no'];
return success($result);
}
if ($order_service_package['order_service_status'] == 2){
$result['status'] = 2;
$result['message'] = "您已购买该服务包,请耐心等待医生接诊";
$result['data']['order_no'] = (string)$order_service_package['order_service_no'];
return success($result);
}
}
// 检测随访包是否存在
if ($request_params['service_type'] == 2){
if (empty($request_params['follow_package_item_id'])){
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
$params = array();
$params['follow_package_item_id'] = $request_params['follow_package_item_id'];
$doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params);
if (empty($doctor_config_follow_package_item)){
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误");
}
$params = array();
$params['follow_package_id'] = $doctor_config_follow_package_item['follow_package_id'];
$params['doctor_id'] = $request_params['doctor_id'];
$doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params);
if (empty($doctor_config_follow_package)){
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误");
}
}
// 处理订单金额
$service_price = 0;
if ($request_params['service_type'] == 1){
// 健康包
$params = array();
$params['doctor_id'] = $request_params['doctor_id'];
$doctor_config_health_package = DoctorConfigHealthPackage::getOne($params);
if (empty($doctor_config_health_package)){
return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败");
}
$service_price = $doctor_config_health_package['service_price'];
}
if ($request_params['service_type'] == 2){
$params = array();
$params['follow_package_item_id'] = $request_params['follow_package_item_id'];
$doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params);
if (empty($doctor_config_follow_package_item)){
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误");
}
$service_price = $doctor_config_follow_package_item['service_price'];
}
if ($service_price <= 0){
return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败");
}
// 订单类型
$order_type = "";
if ($request_params['service_type'] == 1){
$order_type = 5;
}
if ($request_params['service_type'] == 2){
$order_type = 4;
}
if (empty($order_type)){
return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败");
}
Db::beginTransaction();
$generator = $this->container->get(IdGeneratorInterface::class);
try {
$coupon_amount_total = 0;
// 实际付款金额
$payment_amount_total = bcsub($service_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'];
$data['doctor_id'] = $request_params['doctor_id'];
$data['order_type'] = $order_type; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
$data['inquiry_pay_channel'] = $inquiry_pay_channel;// 支付渠道1:小程序支付 2:微信扫码支付)
$data['pay_status'] = 1;// 1:待支付
$data['order_no'] = "S" . $generator->generate();// 订单编号
$data['amount_total'] = $service_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'];
$data['doctor_id'] = $request_params['doctor_id'];
$data['family_id'] = $request_params['family_id'];
$data['order_service_type'] = $request_params['service_type'];
$data['order_service_status'] = 1; // 订单状态1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)
$data['pay_channel'] = $inquiry_pay_channel;// 支付渠道1:小程序支付 2:微信扫码支付)
$data['order_service_no'] = $order['order_no'];// 系统订单编号
$data['amount_total'] = $service_price;// 订单金额
$data['coupon_amount_total'] = $coupon_amount_total;// 优惠卷总金额
$data['payment_amount_total'] = $payment_amount_total;// 实际付款金额
$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_service_package = OrderServicePackage::addOrderServicePackage($data);
if (empty($order_service_package)){
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_id'] = $order['order_id'];
$data['order_service_id'] = $order_service_package['order_service_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']);// 患者年龄
}
// 过敏史
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']; // 家族病史描述
}
}
}
$order_service_package_case = OrderServicePackageCase::addOrderServicePackageCase($data);
if (empty($order_service_package_case)) {
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_service_package['inquiry_no'];
$data['order_type'] = 4;
$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, "订单创建失败");
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
$result['data']['order_no'] = (string)$order['order_no'];
return success($result);
}
}