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

617 lines
26 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_no'] = $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_no'] = $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'] = $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_no'] = $order_service_package['order_service_no'];
return success($result);
}
}
// 未超出当月问诊次数或次数无限制
$result['status'] = 5;
$result['message'] = "已购买,未超出当月问诊次数";
$result['data']['order_no'] = $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']; // 家族病史描述
}
}
}
// 是否备孕、妊娠、哺乳期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:是)
}
}
$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);
}
/**
* 取消未支付检测订单
* @param string|int $order_no
* @param string|int $cancel_reason 取消订单原因1:主动取消 2:客服取消 3:支付超时)
* @param string|int $cancel_remarks 取消备注
* @return array
*/
public function cancelUnpayServiceOrder(string|int $order_no, string|int $cancel_reason, string|int $cancel_remarks): array
{
$result = array();
$result['status'] = 1;
$result['message'] = "成功";
// 获取检测订单数据
$params = array();
$params['order_service_no'] = $order_no;
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
$result['status'] = 0;
$result['message'] = "未查询到对应订单数据";
return $result;
}
// 检测订单状态
if ($order_service_package['order_service_status'] == 5) {
// 订单状态1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)
$result['status'] = 0;
$result['message'] = "订单已取消";
return $result;
}
if ($order_service_package['order_service_status'] != 1) {
// 订单状态1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)
$result['status'] = 0;
$result['message'] = "订单取消失败";
return $result;
}
// 检测订单退款状态
if (!in_array($order_service_package['refund_status'], [0, 4, 5])) {
// 检测订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
$result['status'] = 0;
$result['message'] = "订单正在退款中";
return $result;
}
// 检测订单支付状态
if ($order_service_package['pay_status'] == 2) {
// 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$result['status'] = 0;
$result['message'] = "订单已支付";
return $result;
}
// 检测订单删除状态
if ($order_service_package['is_delete'] == 1) {
// 删除状态0:否 1:是)
$result['status'] = 2;
$result['message'] = "订单已被删除";
return $result;
}
// 取消检测订单
$data = array();
$data['order_service_status'] = 5; // 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消)
if ($cancel_reason == 3) {
$data['pay_status'] = 5; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
}
$data['cancel_time'] = date("Y-m-d H:i:s", time());
$data['cancel_remarks'] = $cancel_remarks; // 取消订单备注
$data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_service_id'] = $order_service_package['order_service_id'];
OrderServicePackage::edit($params, $data);
return $result;
}
}