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; } }