diff --git a/app/Model/OrderServicePackage.php b/app/Model/OrderServicePackage.php index 27acad7..c56a902 100644 --- a/app/Model/OrderServicePackage.php +++ b/app/Model/OrderServicePackage.php @@ -8,7 +8,6 @@ namespace App\Model; use Carbon\Carbon; use Hyperf\Database\Model\Collection; -use Hyperf\Database\Model\Model; use Hyperf\Snowflake\Concern\Snowflake; /** @@ -82,9 +81,9 @@ class OrderServicePackage extends Model /** * 新增 * @param array $data - * @return OrderServicePackage|Model + * @return OrderServicePackage|\Hyperf\Database\Model\Model */ - public static function addOrderServicePackage(array $data): Model|OrderServicePackage + public static function addOrderServicePackage(array $data): \Hyperf\Database\Model\Model|OrderServicePackage { return self::create($data); } diff --git a/app/Model/OrderServicePackageCase.php b/app/Model/OrderServicePackageCase.php new file mode 100644 index 0000000..78228b1 --- /dev/null +++ b/app/Model/OrderServicePackageCase.php @@ -0,0 +1,95 @@ +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 OrderServicePackageCase|\Hyperf\Database\Model\Model + */ + public static function addOrderServicePackageCase(array $data): \Hyperf\Database\Model\Model|OrderServicePackageCase + { + 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/OrderServicePackageService.php b/app/Services/OrderServicePackageService.php index d93b413..eddc101 100644 --- a/app/Services/OrderServicePackageService.php +++ b/app/Services/OrderServicePackageService.php @@ -6,7 +6,9 @@ use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Constants\HttpEnumCode; use App\Model\DiseaseClass; +use App\Model\DoctorConfigFollowPackage; use App\Model\DoctorConfigFollowPackageItem; +use App\Model\DoctorConfigHealthPackage; use App\Model\InquiryCaseProduct; use App\Model\Order; use App\Model\OrderCoupon; @@ -14,6 +16,7 @@ use App\Model\OrderInquiry; use App\Model\OrderInquiryCase; use App\Model\OrderInquiryCoupon; use App\Model\OrderServicePackage; +use App\Model\OrderServicePackageCase; use App\Model\OrderServicePackageDetail; use App\Model\PatientFamily; use App\Model\PatientFamilyHealth; @@ -147,9 +150,12 @@ class OrderServicePackageService extends BaseService return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误"); } - if ($order_service_package_detail['service_period'] != $doctor_config_follow_package_item['service_period']){ - $result['message'] = "未购买"; - return success($result); + $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,"随访包选择错误"); } } @@ -207,7 +213,6 @@ class OrderServicePackageService extends BaseService $result['message'] = "成功"; $result['data'] = [ "order_no" => "", - "order_id" => "", ]; $user_info = $this->request->getAttribute("userInfo") ?? []; @@ -223,16 +228,6 @@ class OrderServicePackageService extends BaseService 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']); @@ -245,10 +240,19 @@ class OrderServicePackageService extends BaseService return fail(HttpEnumCode::SERVER_ERROR); } - $result['status'] = 2; + $result['status'] = 4; $result['message'] = "当前患者存在进行中的问诊订单"; $result['data']['order_no'] = $order_inquiry['inquiry_no']; - $result['data']['order_id'] = $order_inquiry['order_id']; + 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); } @@ -277,23 +281,14 @@ class OrderServicePackageService extends BaseService 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; + }else{ + return fail(HttpEnumCode::HTTP_ERROR, "支付方式错误"); } // 处理复诊凭证 @@ -312,15 +307,105 @@ class OrderServicePackageService extends BaseService 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 { - $inquiry_price = 0; $coupon_amount_total = 0; // 实际付款金额 - $payment_amount_total = bcsub($inquiry_price, $coupon_amount_total, 2); + $payment_amount_total = bcsub($service_price, $coupon_amount_total, 2); if ($payment_amount_total < 0) { $payment_amount_total = 0; } @@ -329,16 +414,12 @@ class OrderServicePackageService extends BaseService $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['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'] = "I" . $generator->generate();// 订单编号 - $data['amount_total'] = $inquiry_price;// 订单金额 + $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); @@ -347,43 +428,36 @@ class OrderServicePackageService extends BaseService 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['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['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['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)) { + $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_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊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']; // 患者名称 @@ -393,81 +467,10 @@ class OrderServicePackageService extends BaseService $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) { @@ -488,97 +491,12 @@ class OrderServicePackageService extends BaseService } } - // 是否备孕、妊娠、哺乳期(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)) { + $order_service_package_case = OrderServicePackageCase::addOrderServicePackageCase($data); + if (empty($order_service_package_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"){ @@ -586,8 +504,8 @@ class OrderServicePackageService extends BaseService } $data = array(); - $data['order_no'] = $order_inquiry['inquiry_no']; - $data['order_type'] = 1; + $data['order_no'] = $order_service_package['inquiry_no']; + $data['order_type'] = 4; $message = new CancelUnpayOrdersDelayDirectProducer($data); $message->setDelayMs(1000 * $time); @@ -598,37 +516,14 @@ class OrderServicePackageService extends BaseService 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()); + return fail(HttpEnumCode::SERVER_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']; // 订单编号 + $result['data']['order_no'] = (string)$order['order_no']; + return success($result); } } \ No newline at end of file