From cde261be5df4be382ad1b5c223f9c2253a8dcb3f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 12 Apr 2024 09:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=9C=8D=E5=8A=A1=E5=8C=85?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=96=B0=E5=A2=9E=E6=98=AF=E5=90=A6=E6=80=80?= =?UTF-8?q?=E5=AD=95,=E5=8F=96=E6=B6=88=E4=B8=BA=E6=8E=A5=E8=AF=8A?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=A2=9E=E5=8A=A0=E6=9C=8D=E5=8A=A1=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E8=AF=8A=E8=AE=A2=E5=8D=95=E5=A4=84=E7=90=86=E3=80=81?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E9=80=80=E6=AC=BE=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ncelUnInquiryOrdersDelayDirectConsumer.php | 25 +- .../CancelUnpayOrdersDelayDirectConsumer.php | 3 +- app/Controller/CallBackController.php | 7 + .../OrderServicePackageController.php | 2 +- app/Model/OrderServicePackageInquiry.php | 81 +++ app/Services/InquiryService.php | 2 +- app/Services/OrderService.php | 81 ++- app/Services/OrderServicePackageService.php | 550 +++++++++++++++--- 8 files changed, 675 insertions(+), 76 deletions(-) create mode 100644 app/Model/OrderServicePackageInquiry.php diff --git a/app/Amqp/Consumer/CancelUnInquiryOrdersDelayDirectConsumer.php b/app/Amqp/Consumer/CancelUnInquiryOrdersDelayDirectConsumer.php index 8dacc25..37b0da8 100644 --- a/app/Amqp/Consumer/CancelUnInquiryOrdersDelayDirectConsumer.php +++ b/app/Amqp/Consumer/CancelUnInquiryOrdersDelayDirectConsumer.php @@ -8,6 +8,7 @@ use App\Constants\HttpEnumCode; use App\Model\Order; use App\Model\OrderInquiry; use App\Model\OrderInquiryCoupon; +use App\Model\OrderServicePackageInquiry; use App\Model\UserCoupon; use App\Model\UserDoctor; use App\Services\ImService; @@ -61,10 +62,11 @@ class CancelUnInquiryOrdersDelayDirectConsumer extends ConsumerMessage $res = $Utils->checkHandleNumber($redis_key); if (!$res) { Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大执行次数或检测错误"); + return Result::ACK; } }catch (\Throwable $e){ Log::getInstance("queue-CancelUnInquiryOrders")->error($e->getMessage()); - return Result::ACK; + return Result::REQUEUE; } Db::beginTransaction(); @@ -147,6 +149,27 @@ class CancelUnInquiryOrdersDelayDirectConsumer extends ConsumerMessage $OrderService->orderRefund($order_inquiry['inquiry_no'], "医生未接诊"); } + // 服务包问诊订单处理 + if ($order_inquiry['inquiry_type'] == 1){ + if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){ + // 获取服务包订单数据 + $params = array(); + $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $order_service_package_inquiry = OrderServicePackageInquiry::getList($params); + if (empty($order_service_package_inquiry)){ + Db::rollBack(); + Log::getInstance("queue-CancelUnInquiryOrders")->error("获取服务包订单数据失败"); + return Result::ACK; + } + + if (count($order_service_package_inquiry) == 1){ + // 首单服务包问诊订单,但问诊订单未接诊,执行服务包退款 + $OrderService = new OrderService(); + $OrderService->orderRefund($order_service_package_inquiry['order_service_no'], "医生未接诊"); + } + } + } + Db::commit(); } catch (\Exception $e) { Db::rollBack(); diff --git a/app/Amqp/Consumer/CancelUnpayOrdersDelayDirectConsumer.php b/app/Amqp/Consumer/CancelUnpayOrdersDelayDirectConsumer.php index 2fbd2ba..064dc92 100644 --- a/app/Amqp/Consumer/CancelUnpayOrdersDelayDirectConsumer.php +++ b/app/Amqp/Consumer/CancelUnpayOrdersDelayDirectConsumer.php @@ -60,11 +60,12 @@ class CancelUnpayOrdersDelayDirectConsumer extends ConsumerMessage $res = $Utils->checkHandleNumber($redis_key); if (!$res) { Log::getInstance("queue-CancelUnpayOrders")->error("超出最大执行次数或检测错误"); + return Result::ACK; } }catch (\Throwable $e){ Log::getInstance("queue-CancelUnpayOrders")->error($e->getMessage()); - return Result::ACK; + return Result::REQUEUE; } Db::beginTransaction(); diff --git a/app/Controller/CallBackController.php b/app/Controller/CallBackController.php index e0b44c5..d85887a 100644 --- a/app/Controller/CallBackController.php +++ b/app/Controller/CallBackController.php @@ -2690,6 +2690,13 @@ class CallBackController extends AbstractController } } + // 是否备孕、妊娠、哺乳期(0:否 1:是) + if (array_key_exists("is_pregnant", $order_service_package_case)) { + if ($order_service_package_case['is_pregnant'] !== null) { + $data['is_pregnant'] = $order_service_package_case['is_pregnant']; // 是否备孕、妊娠、哺乳期(0:否 1:是) + } + } + $order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data); if (empty($order_inquiry_case)) { Db::rollBack(); diff --git a/app/Controller/OrderServicePackageController.php b/app/Controller/OrderServicePackageController.php index 0802839..ec51334 100644 --- a/app/Controller/OrderServicePackageController.php +++ b/app/Controller/OrderServicePackageController.php @@ -58,7 +58,7 @@ class OrderServicePackageController extends AbstractController $request->scene('addServiceInquiryOrder')->validateResolved(); $OrderServicePackageService = new OrderServicePackageService(); - $data = $OrderServicePackageService->addPatientServiceOrder(); + $data = $OrderServicePackageService->addServiceInquiryOrder(); return $this->response->json($data); } diff --git a/app/Model/OrderServicePackageInquiry.php b/app/Model/OrderServicePackageInquiry.php new file mode 100644 index 0000000..5d06ccd --- /dev/null +++ b/app/Model/OrderServicePackageInquiry.php @@ -0,0 +1,81 @@ +first($fields); + } + + /** + * 多条 + * @param array $params + * @param array $fields + * @return Collection|array + */ + public static function getList(array $params, array $fields = ['*']): Collection|array + { + return self::where($params)->get($fields); + } + + /** + * 新增 + * @param array $data + * @return OrderServicePackageInquiry|\Hyperf\Database\Model\Model + */ + public static function addOrderServicePackageInquiry(array $data): \Hyperf\Database\Model\Model|OrderServicePackageInquiry + { + return self::create($data); + } + + /** + * 修改 + * @param array $params + * @param array $data + * @return int + */ + public static function edit(array $params = [], array $data = []): int + { + return self::where($params)->update($data); + } +} diff --git a/app/Services/InquiryService.php b/app/Services/InquiryService.php index f31070b..2e55966 100644 --- a/app/Services/InquiryService.php +++ b/app/Services/InquiryService.php @@ -2127,7 +2127,7 @@ class InquiryService extends BaseService /** * 获取患者在某一时间段的服务包问诊订单-创建时间 - * @param string|int $order_service_type + * @param string|int $order_service_type 服务包类型(1:健康包 2:随访包) * @param string $patient_id * @param string $doctor_id * @param string $start_date diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index e388fe3..5d81e2a 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -97,9 +97,13 @@ class OrderService extends BaseService $result = $OrderProductService->cancelUnpayProductOrder($order['order_no'], $cancel_reason, $cancel_remarks); } elseif ($order['order_type'] == 3) { // 检测订单 + $DetectionService = new DetectionService(); + $result = $DetectionService->cancelUnpayDetectionOrder($order['order_no'], $cancel_reason, $cancel_remarks); + } elseif ($order['order_type'] == 4 ||$order['order_type'] == 5 ) { + // 服务包订单 $OrderServicePackageService = new OrderServicePackageService(); $result = $OrderServicePackageService->cancelUnpayServiceOrder($order['order_no'], $cancel_reason, $cancel_remarks); - }else{ + } else{ $result['status'] = 0; $result['message'] = "订单类型错误"; } @@ -162,6 +166,9 @@ class OrderService extends BaseService } elseif ($order['order_type'] == 3) { // 检测检测订单可退款状态 $this->checkOrderDetectionStatusForRefund($order['order_no']); + } elseif ($order['order_type'] == 4 || $order['order_type'] == 5) { + // 检测服务包订单可退款状态 + $this->checkOrderServiceStatusForRefund($order['order_no']); } else { throw new BusinessException("订单类型错误"); } @@ -375,11 +382,46 @@ class OrderService extends BaseService $params['order_detection_id'] = $order_detection['order_detection_id']; OrderDetection::editOrderDetection($params, $data); + break; + case 4: // 服务包订单 + // 获取订单数据 + $params = array(); + $params['order_service_no'] = $order_no; + $order_service_package = OrderServicePackage::getOne($params); + if (empty($order_service_package)) { + throw new BusinessException("订单数据为空"); + } + + // 新增退款表 + $data = array(); + $data['patient_id'] = $order['patient_id']; + $data['order_service_id'] = $order_service_package['order_service_id']; + $data['order_service_no'] = $order_service_package['order_service_no']; + $data['service_refund_no'] = $refund_no; + $data['refund_id'] = $refund_id; + $data['detection_refund_status'] = $refund_status; + $data['refund_total'] = $order_service_package['payment_amount_total']; + $data['refund_reason'] = $refund_reason; + if ($refund_status == 3 && !empty($success_time)) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间 + } + $order_service_package_refund = OrderServicePackageRefund::addOrderServicePackageRefund($data); + if (empty($order_service_package_refund)) { + throw new BusinessException("添加退款表失败"); + } + + // 修改问诊订单表状态 + $data = array(); + $data['refund_status'] = $refund_status; + + $params = array(); + $params['order_service_id'] = $order_service_package['order_service_id']; + OrderServicePackage::edit($params, $data); + break; default: throw new BusinessException("订单类型错误"); } - } catch (\Throwable $e) { throw new BusinessException($e->getMessage()); } @@ -637,7 +679,7 @@ class OrderService extends BaseService } // 检测问诊订单状态 - if (!in_array($order_detection['detection_status'], [2, 5])) { + if (!in_array($order_detection['detection_status'], [2, 3])) { // 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消) throw new BusinessException("订单状态错误"); } @@ -654,4 +696,37 @@ class OrderService extends BaseService throw new BusinessException("订单支付状态错误"); } } + + /** + * 检测服务包订单可退款状态 + * @param string $order_no + */ + public function checkOrderServiceStatusForRefund(string $order_no): void + { + // 获取订单数据 + $params = array(); + $params['order_service_no'] = $order_no; + $order_service_package = OrderServicePackage::getOne($params); + if (empty($order_service_package)) { + throw new BusinessException("订单数据为空"); + } + + // 检测问诊订单状态 + if (!in_array($order_service_package['order_service_status'], [2, 3])) { + // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + throw new BusinessException("订单状态错误"); + } + + // 检测订单退款状态 + if (in_array($order_service_package['refund_status'], [2, 3, 5, 6])) { + // 检测订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + throw new BusinessException("订单退款状态错误"); + } + + // 检测支付状态 + if ($order_service_package['pay_status'] != 2) { + // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + throw new BusinessException("订单支付状态错误"); + } + } } \ No newline at end of file diff --git a/app/Services/OrderServicePackageService.php b/app/Services/OrderServicePackageService.php index 4e3e8e1..4854f8e 100644 --- a/app/Services/OrderServicePackageService.php +++ b/app/Services/OrderServicePackageService.php @@ -5,10 +5,13 @@ namespace App\Services; use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Constants\HttpEnumCode; +use App\Exception\BusinessException; use App\Model\DiseaseClass; use App\Model\DoctorConfigFollowPackage; use App\Model\DoctorConfigFollowPackageItem; use App\Model\DoctorConfigHealthPackage; +use App\Model\DoctorInquiryConfig; +use App\Model\HealthPackage; use App\Model\InquiryCaseProduct; use App\Model\Order; use App\Model\OrderCoupon; @@ -48,8 +51,8 @@ class OrderServicePackageService extends BaseService $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)){ + if ($service_type == 2) { + if (empty($follow_package_item_id)) { return fail(); } } @@ -69,20 +72,21 @@ class OrderServicePackageService extends BaseService return fail(HttpEnumCode::HTTP_ERROR, "患者信息错误"); } - if ($service_type == 1){ + if ($service_type == 1) { $inquiry_mode = 8; - }else{ + } else { $inquiry_mode = 9; } + // 检测是否存在同类型未完成的问诊订单 $PatientOrderService = new PatientOrderService(); - $order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry(1,$inquiry_mode,$user_info['client_user_id']); + $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)){ + if (empty($order_inquiry)) { return fail(HttpEnumCode::SERVER_ERROR); } @@ -110,22 +114,22 @@ class OrderServicePackageService extends BaseService $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)){ + $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){ + 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){ + if ($order_service_package['order_service_status'] == 2) { $result['status'] = 2; $result['message'] = "您已购买该服务包,请耐心等待医生接诊"; $result['data']['order_no'] = $order_service_package['order_service_no']; @@ -136,32 +140,32 @@ class OrderServicePackageService extends BaseService $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)){ + if (empty($order_service_package_detail)) { return fail(HttpEnumCode::SERVER_ERROR); } // 检测随访包 - if ($service_type == 2){ + 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,"随访包选择错误"); + 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,"随访包选择错误"); + if (empty($doctor_config_follow_package)) { + return fail(HttpEnumCode::HTTP_ERROR, "随访包选择错误"); } } // 处理问诊次数 // 3.5号购买,每月2次问诊次数。今天5.3,属于第几个月,这个月的开始时间和结束时间 - if ($order_service_package_detail['monthly_frequency'] != 0){ + if ($order_service_package_detail['monthly_frequency'] != 0) { $month_inquiry_count = 0; // 当前所属月问诊次数 // 获取当月问诊次数 @@ -179,12 +183,12 @@ class OrderServicePackageService extends BaseService $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)){ + $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']){ + if ($month_inquiry_count >= $order_service_package_detail['monthly_frequency']) { // 超出当月问诊次数 $result['status'] = 3; $result['message'] = "超出服务包所包含的当月问诊次数"; @@ -218,6 +222,12 @@ class OrderServicePackageService extends BaseService $user_info = $this->request->getAttribute("userInfo") ?? []; $request_params = $this->request->all(); + // 检测参数 + if ($request_params['service_type'] == 2) { + if (empty($request_params['follow_package_item_id'])) { + return fail(HttpEnumCode::CLIENT_HTTP_ERROR); + } + } // 检测家庭成员是否存在 $params = array(); $params['family_id'] = $request_params['family_id']; @@ -230,13 +240,13 @@ class OrderServicePackageService extends BaseService // 检测是否存在同类型未完成的问诊订单 $PatientOrderService = new PatientOrderService(); - $order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry($request_params['inquiry_type'],$request_params['inquiry_mode'],$user_info['client_user_id']); + $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)){ + if (empty($order_inquiry)) { return fail(HttpEnumCode::SERVER_ERROR); } @@ -287,7 +297,7 @@ class OrderServicePackageService extends BaseService $inquiry_pay_channel = 1; } elseif ($request_params['client_type'] == 2) { $inquiry_pay_channel = 2; - }else{ + } else { return fail(HttpEnumCode::HTTP_ERROR, "支付方式错误"); } @@ -315,18 +325,18 @@ class OrderServicePackageService extends BaseService $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)){ + $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){ + 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){ + if ($order_service_package['order_service_status'] == 2) { $result['status'] = 2; $result['message'] = "您已购买该服务包,请耐心等待医生接诊"; $result['data']['order_no'] = (string)$order_service_package['order_service_no']; @@ -334,68 +344,113 @@ class OrderServicePackageService extends BaseService } } - // 检测随访包是否存在 - if ($request_params['service_type'] == 2){ - if (empty($request_params['follow_package_item_id'])){ - return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); + // 获取医生图文问诊价格 + $params = array(); + $params['doctor_id'] = $order_service_package['doctor_id']; + $params['inquiry_type'] = 1; + $params['inquiry_mode'] = 1; + $doctor_inquiry_config = DoctorInquiryConfig::getOne($params); + if (empty($doctor_inquiry_config)){ + return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败"); + } + + $service_price = 0; // 订单金额 + $service_period = null; // 服务周期(天) + $service_count = null; // 总服务次数(0表示不限次) + $monthly_frequency = null; // 每月次数(0表示不限次) + $single_inquiry_price = null; // 单次图文问诊价格 + + // 健康包 + 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, "订单创建失败"); } + $params = array(); + $params['package_id'] = $doctor_config_health_package['package_id']; + $health_package = HealthPackage::getOne($params); + if (empty($health_package)){ + throw new BusinessException("创建订单失败"); + } + + // 订单金额 + $service_price = $doctor_config_health_package['service_price']; + + // 服务周期(天) + $service_period = 90; + + // 总服务次数(0表示不限次) + $service_count = $health_package['service_count']; + + // 每月次数(0表示不限次) + $monthly_frequency = $health_package['monthly_frequency']; + + // 单次图文问诊价格 + $single_inquiry_price = $doctor_inquiry_config['inquiry_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,"随访包选择错误"); + 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,"随访包选择错误"); + if (empty($doctor_config_follow_package)) { + return fail(HttpEnumCode::HTTP_ERROR, "随访包选择错误"); } + // 订单金额 $service_price = $doctor_config_follow_package_item['service_price']; + + // 服务周期(天) + $service_period = $doctor_config_follow_package_item['service_period']; + + // 总服务次数(0表示不限次) + if ($doctor_config_follow_package['monthly_frequency'] != 0){ + $service_count = $service_period / 30 * $doctor_config_follow_package['monthly_frequency']; + }else{ + $service_count = $doctor_config_follow_package['service_count']; + } + + // 每月次数(0表示不限次) + $monthly_frequency = $doctor_config_follow_package['monthly_frequency']; + + // 单次图文问诊价格 + $single_inquiry_price = $doctor_inquiry_config['inquiry_price']; } - if ($service_price <= 0){ - return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败"); + // 判断数据 + if ($service_price <= 0) { + return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败"); } - // 订单类型 + if ($service_period === null || $service_count === null || $monthly_frequency === null || $single_inquiry_price === null){ + return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败"); + } + + // 处理订单类型 $order_type = ""; - if ($request_params['service_type'] == 1){ + if ($request_params['service_type'] == 1) { $order_type = 5; } - if ($request_params['service_type'] == 2){ + if ($request_params['service_type'] == 2) { $order_type = 4; } - if (empty($order_type)){ - return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败"); + if (empty($order_type)) { + return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败"); } Db::beginTransaction(); @@ -447,7 +502,23 @@ class OrderServicePackageService extends BaseService $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)){ + if (empty($order_service_package)) { + Db::rollBack(); + return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); + } + + // 生成服务包订单详情 + $data = array(); + $data['order_service_id'] = $order_service_package['order_service_id']; + $data['order_id'] = $order_service_package['order_id']; + $data['order_service_no'] = $order_service_package['order_service_no']; + $data['service_period'] = $service_period; // 服务周期(天) + $data['service_count'] = $service_count; // 总服务次数(0表示不限次) + $data['monthly_frequency'] = $monthly_frequency; // 每月次数(0表示不限次) + $data['single_inquiry_price'] = $single_inquiry_price; // 单次图文问诊价格 + $data['service_price'] = $service_price; // 总服务价格 + $order_service_package_detail = OrderServicePackageDetail::addOrderServicePackageDetail($data); + if (empty($order_service_package_detail)){ Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); } @@ -506,7 +577,7 @@ class OrderServicePackageService extends BaseService // 增加至未支付取消订单延迟队列 $time = 60 * 30; - if (\Hyperf\Config\config('app_env') == "dev"){ + if (\Hyperf\Config\config('app_env') == "dev") { $time = 60 * 5; } @@ -534,6 +605,348 @@ class OrderServicePackageService extends BaseService return success($result); } + /** + * 创建服务包问诊订单 + * @return array + */ + public function addServiceInquiryOrder(): array + { + $user_info = $this->request->getAttribute("userInfo") ?? []; + $order_no = $this->request->input("order_no"); + + try { + // 检测患者是否购买服务包 + $params = array(); + $params['user_id'] = $user_info['user_id']; + $params['patient_id'] = $user_info['client_user_id']; + $params['order_service_no'] = $order_no; + $order_service_package = OrderServicePackage::getOne($params); + if (empty($order_service_package)) { + return fail(HttpEnumCode::HTTP_ERROR, "患者未购买该服务包"); + } + + // 检测服务包订单订单状态 + if ($order_service_package['order_service_status'] == 1) { + return fail(HttpEnumCode::HTTP_ERROR); + } + + if ($order_service_package['order_service_status'] == 2) { + return fail(HttpEnumCode::HTTP_ERROR); + } + + // 获取服务包订单详情 + $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 ($order_service_package['order_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)) { + return fail(HttpEnumCode::HTTP_ERROR, "存在进行中的问诊订单,无法再次创建"); + } + + // 检测当前医生是否和患者存在未完成问诊订单 + $InquiryService = new InquiryService(); + $order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($user_info['client_user_id'], $order_service_package['doctor_id']); + if (!empty($order_inquiry)) { + 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($order_service_package['order_service_type'], $user_info['client_user_id'], $order_service_package['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']) { + return fail(HttpEnumCode::HTTP_ERROR, "超出服务包所包含的当月问诊次数"); + } + } + + // 获取患者家庭成员信息表 + $params = array(); + $params['family_id'] = $order_service_package['family_id']; + $params['patient_id'] = $order_service_package['patient_id']; + $patient_family = PatientFamily::getOne($params); + if (empty($patient_family)) { + return fail(HttpEnumCode::HTTP_ERROR, "家庭成员数据错误"); + } + + // 获取患者家庭成员信息表-健康情况 + $params = array(); + $params['family_id'] = $order_service_package['family_id']; + $patient_family_health = PatientFamilyHealth::getOne($params); + + // 获取患者家庭成员信息表-个人情况 + $params = array(); + $params['family_id'] = $order_service_package['family_id']; + $patient_family_personal = PatientFamilyPersonal::getOne($params); + + // 检测医生状态 + $params = array(); + $params['doctor_id'] = $order_service_package['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, "当前医生无法接诊,请重新选择"); + } + + // 获取检测病例数据 + $params = array(); + $params['order_service_id'] = $order_service_package['order_service_id']; + $order_service_package_case = OrderServicePackageCase::getOne($params); + if (empty($order_service_package_case)) { + return fail(HttpEnumCode::HTTP_ERROR, "问诊病例数据错误"); + } + $order_service_package_case = $order_service_package_case->toArray(); + }catch (\Throwable $e){ + return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage()); + } + + Db::beginTransaction(); + try { + $generator = $this->container->get(IdGeneratorInterface::class); + + // 新增订单表 + $data = array(); + $data['user_id'] = $order_service_package['user_id']; + $data['patient_id'] = $order_service_package['client_user_id']; + $data['doctor_id'] = $order_service_package['doctor_id']; + if ($order_service_package['order_service_type'] == 1){ + $data['order_type'] = 5; // 订单类型(1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单) + }else{ + $data['order_type'] = 4; // 订单类型(1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单) + } + $data['inquiry_pay_channel'] = 3; // 支付渠道(1:小程序支付 2:微信扫码支付) + $data['pay_status'] = 2; // 1:待支付 + $data['order_no'] = "I" . $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::HTTP_ERROR, "订单创建失败"); + } + + // 新增问诊订单 + $data = array(); + $data['user_id'] = $order_service_package['user_id']; + $data['patient_id'] = $order_service_package['patient_id']; + $data['doctor_id'] = $order_service_package['doctor_id']; + $data['family_id'] = $order_service_package['family_id']; + $data['inquiry_type'] = 1; // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) + if ($order_service_package['order_service_type'] == 1){ + $data['inquiry_mode'] = 8; // 接诊方式(1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包) + }else{ + $data['inquiry_mode'] = 9; // 接诊方式(1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包) + } + $data['inquiry_status'] = 3; // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + $data['inquiry_pay_channel'] = 3; // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + $data['inquiry_pay_status'] = 2; // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + $data['inquiry_no'] = $order['order_no'];// 订单编号 + $data['escrow_trade_no'] = "GD" . $generator->generate(); // 第三方支付流水号 + $data['amount_total'] = 0;// 订单金额 + $data['coupon_amount_total'] = 0;// 优惠卷总金额 + $data['payment_amount_total'] = 0;// 实际付款金额 + $data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间 + $data['reception_time'] = date('Y-m-d H:i:s', time());// 接诊时间 + $data['patient_name'] = $patient_family['card_name'];// 患者姓名-就诊人 + $data['patient_name_mask'] = $patient_family['card_name_mask'];// 患者姓名-就诊人(掩码) + $data['patient_sex'] = $patient_family['sex'];// 患者性别-就诊人(0:未知 1:男 2:女) + $data['patient_age'] = $patient_family['age'];// 患者年龄-就诊人 + $order_inquiry = OrderInquiry::addOrderInquiry($data); + if (empty($order_inquiry)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败"); + } + + // 新增问诊订单病例 + $data = array(); + $data['user_id'] = $order_service_package['user_id']; + $data['patient_id'] = $order_service_package['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'] = $order_service_package_case['disease_class_id']; // 疾病分类id-系统 + $data['disease_class_name'] = $order_service_package_case['disease_class_name']; // 疾病名称-系统 + $data['diagnosis_date'] = $order_service_package_case['diagnosis_date']; // 确诊日期 + $data['disease_desc'] = $order_service_package_case['disease_desc']; // 病情描述(主诉) + $data['diagnose_images'] = $order_service_package_case['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", $order_service_package_case)) { + if ($order_service_package_case['is_allergy_history'] !== null) { + $data['is_allergy_history'] = $order_service_package_case['is_allergy_history']; // 是否存在过敏史(0:否 1:是) + if ($order_service_package_case['allergy_history'] != "") { + $data['allergy_history'] = $order_service_package_case['allergy_history']; // 过敏史描述 + } + } + } + + // 家族病史 + if (array_key_exists("is_family_history", $order_service_package_case)) { + if ($order_service_package_case['is_family_history'] !== null) { + $data['is_family_history'] = $order_service_package_case['is_family_history']; // 是否存在家族病史(0:否 1:是) + if ($order_service_package_case['family_history'] != "") { + $data['family_history'] = $order_service_package_case['family_history']; // 家族病史描述 + } + } + } + + // 是否备孕、妊娠、哺乳期(0:否 1:是) + if (array_key_exists("is_pregnant", $order_service_package_case)) { + if ($order_service_package_case['is_pregnant'] !== null) { + $data['is_pregnant'] = $order_service_package_case['is_pregnant']; // 是否备孕、妊娠、哺乳期(0:否 1:是) + } + } + + $order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data); + if (empty($order_inquiry_case)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败"); + } + + // 加入未接诊取消订单延迟队列 + $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::HTTP_ERROR, "订单创建失败"); + } + + Db::commit(); + }catch (\Throwable $e){ + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage()); + } + + return success(); + } + /** * 取消未支付检测订单 * @param string|int $order_no @@ -613,5 +1026,4 @@ class OrderServicePackageService extends BaseService return $result; } - } \ No newline at end of file