From 0f73332bfd9a33eff7e03db7017ef9c3c3d94150 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 10 Apr 2024 17:35:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96=E6=82=A3?= =?UTF-8?q?=E8=80=85=E5=B7=B2=E8=B4=AD=E4=B9=B0=E7=9A=84=E6=9F=90=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E7=9A=84=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderServicePackageController.php | 48 ++ app/Controller/PatientOrderController.php | 2 + app/Controller/UserPatientController.php | 1 + app/Model/OrderInquiry.php | 17 + app/Model/OrderServicePackage.php | 126 ++++ app/Model/OrderServicePackageDetail.php | 85 +++ app/Request/OrderServicePackageRequest.php | 105 +++ app/Request/PatientOrderRequest.php | 10 +- app/Request/UserPatientRequest.php | 16 + app/Services/DetectionService.php | 2 +- app/Services/InquiryService.php | 40 ++ app/Services/OrderService.php | 1 - app/Services/OrderServicePackageService.php | 634 ++++++++++++++++++ app/Services/PatientOrderService.php | 8 + app/Services/UserPatientService.php | 3 + config/routes.php | 15 +- 16 files changed, 1104 insertions(+), 9 deletions(-) create mode 100644 app/Controller/OrderServicePackageController.php create mode 100644 app/Model/OrderServicePackage.php create mode 100644 app/Model/OrderServicePackageDetail.php create mode 100644 app/Request/OrderServicePackageRequest.php create mode 100644 app/Services/OrderServicePackageService.php diff --git a/app/Controller/OrderServicePackageController.php b/app/Controller/OrderServicePackageController.php new file mode 100644 index 0000000..b668706 --- /dev/null +++ b/app/Controller/OrderServicePackageController.php @@ -0,0 +1,48 @@ +container->get(OrderServicePackageRequest::class); + $request->scene('getPatientBuyServiceDetail')->validateResolved(); + + $OrderServicePackageService = new OrderServicePackageService(); + $data = $OrderServicePackageService->getPatientBuyServiceDetail(); + return $this->response->json($data); + } + + /** + * 创建服务包订单 + * @return ResponseInterface + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function addPatientServiceOrder(): ResponseInterface + { + $request = $this->container->get(OrderServicePackageRequest::class); + $request->scene('addPatientServiceOrder')->validateResolved(); + + $OrderServicePackageService = new OrderServicePackageService(); + $data = $OrderServicePackageService->addPatientServiceOrder(); + return $this->response->json($data); + } +} \ No newline at end of file diff --git a/app/Controller/PatientOrderController.php b/app/Controller/PatientOrderController.php index 85414de..a7c1523 100644 --- a/app/Controller/PatientOrderController.php +++ b/app/Controller/PatientOrderController.php @@ -296,4 +296,6 @@ class PatientOrderController extends AbstractController $data = $PatientOrderService->putPatientDetectionOrderCancelPay(); return $this->response->json($data); } + + } \ No newline at end of file diff --git a/app/Controller/UserPatientController.php b/app/Controller/UserPatientController.php index d3b6a54..0604c53 100644 --- a/app/Controller/UserPatientController.php +++ b/app/Controller/UserPatientController.php @@ -94,4 +94,5 @@ class UserPatientController extends AbstractController return $this->response->json($data); } + } \ No newline at end of file diff --git a/app/Model/OrderInquiry.php b/app/Model/OrderInquiry.php index ff96fe8..52a38f8 100644 --- a/app/Model/OrderInquiry.php +++ b/app/Model/OrderInquiry.php @@ -307,6 +307,7 @@ class OrderInquiry extends Model * @param array $params * @param array $reception_time 接诊时间区间 * @param array $inquiry_status_params inquiry_status字段搜索条件 + * @param array $inquiry_type_not_params * @return int|mixed|string */ public static function getCooperationDoctorAmountTotal(array $params, array $reception_time, array $inquiry_status_params,array $inquiry_type_not_params = []): mixed @@ -612,4 +613,20 @@ class OrderInquiry extends Model ->latest() ->first($fields); } + + /** + * 获取患者某一时间段问诊订单-创建时间 + * @param array $params + * @param array $created_at 接诊时间区间 + * @param array $inquiry_status_params inquiry_status字段搜索条件 + * @return Collection|array + */ + public static function getInquiryWithCreateTime(array $params, array $created_at, array $inquiry_status_params): Collection|array + { + return self::where($params) + ->whereIn('inquiry_status', $inquiry_status_params) + ->whereBetween('created_at', $created_at) + ->orderBy('created_at') + ->get(); + } } diff --git a/app/Model/OrderServicePackage.php b/app/Model/OrderServicePackage.php new file mode 100644 index 0000000..27acad7 --- /dev/null +++ b/app/Model/OrderServicePackage.php @@ -0,0 +1,126 @@ +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 OrderServicePackage|Model + */ + public static function addOrderServicePackage(array $data): Model|OrderServicePackage + { + 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); + } + + /** + * 获取某一状态下的订单-多条 + * @param array $params + * @param array $order_service_status + * @param array $fields + * @return Collection|array + */ + public static function getStatusList(array $params = [],array $order_service_status = [], array $fields = ['*']): Collection|array + { + return self::where($params)->whereIn('order_service_status',$order_service_status)->get($fields); + } + + /** + * 获取某一状态下的订单-单条 + * @param array $params + * @param array $order_service_status + * @param array $fields + * @return object|null + */ + public static function getStatusOne(array $params = [],array $order_service_status = [], array $fields = ['*']): object|null + { + return self::where($params)->whereIn('order_service_status',$order_service_status)->first($fields); + } +} diff --git a/app/Model/OrderServicePackageDetail.php b/app/Model/OrderServicePackageDetail.php new file mode 100644 index 0000000..3a43bfd --- /dev/null +++ b/app/Model/OrderServicePackageDetail.php @@ -0,0 +1,85 @@ +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 OrderServicePackageDetail|\Hyperf\Database\Model\Model + */ + public static function addOrderServicePackageDetail(array $data): \Hyperf\Database\Model\Model|OrderServicePackageDetail + { + 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/Request/OrderServicePackageRequest.php b/app/Request/OrderServicePackageRequest.php new file mode 100644 index 0000000..f2b6861 --- /dev/null +++ b/app/Request/OrderServicePackageRequest.php @@ -0,0 +1,105 @@ + [ // 获取患者已购买的某医生的服务包详情 + 'doctor_id', + 'family_id', + 'service_type', // 服务包类型(1:健康 2:随访) + 'follow_package_item_id', + ], + 'addPatientServiceOrder' => [ // 创建服务包订单 + 'doctor_id', + 'service_type', + 'follow_package_item_id', + 'patient_id', + 'family_id', + 'disease_class_id', + 'diagnosis_date', + 'disease_desc', + 'is_allergy_history',// 过敏史 + 'is_family_history', // 家族病史 + 'inquiry_type', // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + 'inquiry_mode', // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) + 'client_type', // 客户端类型(1:手机 2:电脑) + ], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'inquiry_type' => 'required|integer|min:1|max:5', + 'inquiry_mode' => 'required|integer|min:1|max:9', + 'patient_id' => 'required', + 'family_id' => 'required', + 'disease_class_id' => 'required', + 'diagnosis_date' => 'date', + 'disease_desc' => 'required', + 'is_allergy_history' => ['sometimes','numeric','min:0','max:1'], + 'is_family_history' => ['sometimes','numeric','min:0','max:1'], + 'is_pregnant' => ['sometimes','numeric','min:0','max:1'], + 'client_type' => 'required|integer|min:1|max:2', + 'service_type' => ['required','integer',Rule::in([1,2])], + 'doctor_id' => 'required', + ]; + } + + /** + * 获取已定义验证规则的错误消息. + */ + public function messages(): array + { + return [ + 'doctor_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'patient_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'family_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'disease_class_id.required' => "请您选择疾病", + 'diagnosis_date.date' => HttpEnumCode::getMessage(HttpEnumCode::DATE_FORMAT_ERROR), + 'disease_desc.required' => "请您输入病情主诉", + 'is_allergy_history.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_allergy_history.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_allergy_history.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_family_history.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_family_history.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_family_history.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_pregnant.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_pregnant.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_pregnant.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.in' => "服务包类型错误", + ]; + } +} diff --git a/app/Request/PatientOrderRequest.php b/app/Request/PatientOrderRequest.php index e162d12..e862d9a 100644 --- a/app/Request/PatientOrderRequest.php +++ b/app/Request/PatientOrderRequest.php @@ -6,6 +6,7 @@ namespace App\Request; use App\Constants\HttpEnumCode; use Hyperf\Validation\Request\FormRequest; +use Hyperf\Validation\Rule; class PatientOrderRequest extends FormRequest { @@ -53,8 +54,8 @@ class PatientOrderRequest extends FormRequest public function rules(): array { return [ - 'inquiry_type' => 'required|integer|min:1|max:4', - 'inquiry_mode' => 'required|integer|min:1|max:5', + 'inquiry_type' => 'required|integer|min:1|max:5', + 'inquiry_mode' => 'required|integer|min:1|max:9', 'patient_id' => 'required', 'family_id' => 'required', 'disease_class_id' => 'required', @@ -64,6 +65,7 @@ class PatientOrderRequest extends FormRequest 'is_family_history' => ['sometimes','numeric','min:0','max:1'], 'is_pregnant' => ['sometimes','numeric','min:0','max:1'], 'client_type' => 'required|integer|min:1|max:2', + 'service_type' => ['required','integer',Rule::in([1,2])], 'doctor_id' => 'required', 'order_inquiry_id' => 'required', @@ -89,6 +91,7 @@ class PatientOrderRequest extends FormRequest public function messages(): array { return [ + 'doctor_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'inquiry_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'inquiry_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'inquiry_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), @@ -136,6 +139,9 @@ class PatientOrderRequest extends FormRequest 'detection_status.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'detection_status.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'detection_status.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.in' => "服务包类型错误", ]; } } diff --git a/app/Request/UserPatientRequest.php b/app/Request/UserPatientRequest.php index bdea314..aad3a3a 100644 --- a/app/Request/UserPatientRequest.php +++ b/app/Request/UserPatientRequest.php @@ -6,6 +6,7 @@ namespace App\Request; use App\Constants\HttpEnumCode; use Hyperf\Validation\Request\FormRequest; +use Hyperf\Validation\Rule; class UserPatientRequest extends FormRequest { @@ -17,6 +18,12 @@ class UserPatientRequest extends FormRequest 'product_id', 'shopping_cart_num', ], + 'getPatientBuyServiceDetail' => [ // 获取患者已购买的某医生的服务包详情 + 'doctor_id', + 'family_id', + 'service_type', + 'follow_package_item_id', + ], ]; /** @@ -36,6 +43,9 @@ class UserPatientRequest extends FormRequest 'user_coupon_status' => 'required|numeric|min:0|max:3', 'product_id' => 'required', 'shopping_cart_num' => 'required|numeric|min:0|max:999', + 'doctor_id' => 'required', + 'family_id' => 'required', + 'service_type' => ['required','integer',Rule::in([1,2])], ]; } @@ -55,6 +65,12 @@ class UserPatientRequest extends FormRequest 'shopping_cart_num.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'shopping_cart_num.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'shopping_cart_num.max' => "请勿超出最大添加数量", + + 'doctor_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'family_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'service_type.integer' => "服务包类型错误", ]; } } diff --git a/app/Services/DetectionService.php b/app/Services/DetectionService.php index f8e920e..8774cc4 100644 --- a/app/Services/DetectionService.php +++ b/app/Services/DetectionService.php @@ -216,7 +216,7 @@ class DetectionService extends BaseService $result['status'] = 1; $result['message'] = "成功"; $result['data'] = [ - "inquiry_no" => "", + "order_no" => "", "order_detection_id" => "", ]; diff --git a/app/Services/InquiryService.php b/app/Services/InquiryService.php index 553b3c8..f31070b 100644 --- a/app/Services/InquiryService.php +++ b/app/Services/InquiryService.php @@ -2125,4 +2125,44 @@ class InquiryService extends BaseService return $time; } + /** + * 获取患者在某一时间段的服务包问诊订单-创建时间 + * @param string|int $order_service_type + * @param string $patient_id + * @param string $doctor_id + * @param string $start_date + * @param string $end_date + * @return array + */ + public function getPatientServiceInquiry(string|int $order_service_type,string $patient_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['patient_id'] = $patient_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(); + } + } \ No newline at end of file diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index accf11b..79dd595 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -522,7 +522,6 @@ class OrderService extends BaseService } } - /** * 检测问诊订单可退款状态 * @param string $order_no diff --git a/app/Services/OrderServicePackageService.php b/app/Services/OrderServicePackageService.php new file mode 100644 index 0000000..d93b413 --- /dev/null +++ b/app/Services/OrderServicePackageService.php @@ -0,0 +1,634 @@ +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,"随访包选择错误"); + } + + if ($order_service_package_detail['service_period'] != $doctor_config_follow_package_item['service_period']){ + $result['message'] = "未购买"; + return success($result); + } + } + + // 处理问诊次数 + // 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" => "", + "order_id" => "", + ]; + + $user_info = $this->request->getAttribute("userInfo") ?? []; + $request_params = $this->request->all(); + + // 检测家庭成员是否存在 + $params = array(); + $params['family_id'] = $request_params['family_id']; + $params['patient_id'] = $user_info['client_user_id']; + $params['status'] = 1; + $patient_family = PatientFamily::getOne($params); + if (empty($patient_family)) { + return fail(HttpEnumCode::HTTP_ERROR, "患者信息错误"); + } + + // 获取患者家庭成员信息表-健康情况 + $params = array(); + $params['family_id'] = $request_params['family_id']; + $patient_family_health = PatientFamilyHealth::getOne($params); + + // 获取患者家庭成员信息表-个人情况 + $params = array(); + $params['family_id'] = $request_params['family_id']; + $patient_family_personal = PatientFamilyPersonal::getOne($params); + + // 检测是否存在同类型未完成的问诊订单 + $PatientOrderService = new PatientOrderService(); + $order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry($request_params['inquiry_type'],$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'] = 2; + $result['message'] = "当前患者存在进行中的问诊订单"; + $result['data']['order_no'] = $order_inquiry['inquiry_no']; + $result['data']['order_id'] = $order_inquiry['order_id']; + 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, "当前医生无法接诊,请重新选择"); + } + + // 检测当前医生是否和患者存在未完成问诊订单 + $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_no'] = $order_inquiry['inquiry_no']; + $result['data']['order_id'] = $order_inquiry['order_id']; + return success($result); + } + + // 确定支付渠道 + // 支付渠道(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 { + $inquiry_price = 0; + $coupon_amount_total = 0; + // 实际付款金额 + $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']; // 订单编号 + return success($result); + } +} \ No newline at end of file diff --git a/app/Services/PatientOrderService.php b/app/Services/PatientOrderService.php index b126cbd..aaace47 100644 --- a/app/Services/PatientOrderService.php +++ b/app/Services/PatientOrderService.php @@ -3,14 +3,17 @@ namespace App\Services; use App\Amqp\Producer\AssignDoctorDelayDirectProducer; +use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Amqp\Producer\DoctorNotYetInquiryDelayDirectProducer; use App\Constants\DoctorTitleCode; use App\Constants\HttpEnumCode; use App\Model\BasicLogisticsCompany; use App\Model\DetectionProject; +use App\Model\DiseaseClass; use App\Model\DoctorInquiryConfig; use App\Model\Hospital; +use App\Model\InquiryCaseProduct; use App\Model\Order; use App\Model\OrderCoupon; use App\Model\OrderDetection; @@ -25,15 +28,20 @@ use App\Model\OrderProduct; use App\Model\OrderProductCoupon; use App\Model\OrderProductItem; use App\Model\OrderProductLogistic; +use App\Model\PatientFamily; +use App\Model\PatientFamilyHealth; +use App\Model\PatientFamilyPersonal; use App\Model\PatientFollow; use App\Model\Product; use App\Model\ProductPlatformAmount; +use App\Model\SystemInquiryConfig; use App\Model\UserCoupon; use App\Model\UserDoctor; use App\Model\UserDoctorInfo; use App\Model\UserPharmacistInfo; use App\Model\UserShipAddress; use App\Utils\Log; +use App\Utils\PcreMatch; use Extend\Prescription\Prescription; use Extend\Wechat\WechatPay; use GuzzleHttp\Exception\GuzzleException; diff --git a/app/Services/UserPatientService.php b/app/Services/UserPatientService.php index 3064ae9..092f79a 100644 --- a/app/Services/UserPatientService.php +++ b/app/Services/UserPatientService.php @@ -4,7 +4,10 @@ namespace App\Services; use App\Constants\HttpEnumCode; use App\Model\Coupon; +use App\Model\DoctorConfigFollowPackageItem; use App\Model\OrderInquiry; +use App\Model\OrderServicePackage; +use App\Model\PatientFamily; use App\Model\PatientHistoryInquiry; use App\Model\Product; use App\Model\ProductPlatformAmount; diff --git a/config/routes.php b/config/routes.php index d886aa0..ef1a2c0 100644 --- a/config/routes.php +++ b/config/routes.php @@ -22,6 +22,7 @@ use App\Controller\InquiryController; use App\Controller\LoginController; use App\Controller\CodeController; use App\Controller\MessageNoticeController; +use App\Controller\OrderServicePackageController; use App\Controller\PatientCaseController; use App\Controller\PatientDoctorController; use App\Controller\PatientFamilyController; @@ -578,6 +579,15 @@ Router::addGroup('/patient', function () { // 删除家庭成员病情记录 Router::delete('/{pathography_id:\d+}', [PatientPathographyController::class, 'deleteFamilyPathography']); }); + + // 服务包 + Router::addGroup('/service', function () { + // 获取患者已购买的某医生的服务包详情 + Router::get('/detail', [OrderServicePackageController::class, 'getPatientBuyServiceDetail']); + + // 创建服务包订单 + Router::post('', [OrderServicePackageController::class, 'addPatientServiceOrder']); + }); }); // 药师端api @@ -933,7 +943,6 @@ Router::addGroup('/doctor', function () { Router::get('/inquiry/{doctor_id:\d+}', [UserDoctorController::class, 'getDoctorInfoInquiry']); }); - // 问诊 Router::addGroup('/inquiry', function () { // 服务 @@ -947,9 +956,5 @@ Router::addGroup('/doctor', function () { Router::get('/item/{doctor_id:\d+}', [DoctorInquiryConfigController::class, 'getDoctorInquiryFollowItemConfig']); }); }); - - }); - - }); \ No newline at end of file