From 5825138b7fa7f715eda6c07bf080ad42dd8b24ab Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Mon, 27 Feb 2023 18:02:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=98=AF=E5=90=A6=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=8E=A5=E8=AF=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/OrderInquiryController.php | 3 +- app/Controller/PatientDoctorController.php | 18 ++ app/Controller/UserPatientController.php | 16 ++ app/Model/OrderInquiry.php | 31 +++- app/Model/UserDoctor.php | 10 ++ app/Request/OrderInquiryRequest.php | 6 +- app/Request/PatientDoctorRequest.php | 15 ++ app/Request/UserPatientRequest.php | 43 +++++ app/Services/PatientDoctorService.php | 187 +++++++++++++++++---- app/Services/UserDoctorService.php | 65 +++++++ app/Services/UserPatientService.php | 6 +- config/routes.php | 5 +- 12 files changed, 357 insertions(+), 48 deletions(-) create mode 100644 app/Controller/UserPatientController.php create mode 100644 app/Request/UserPatientRequest.php diff --git a/app/Controller/OrderInquiryController.php b/app/Controller/OrderInquiryController.php index e4c345a..1387620 100644 --- a/app/Controller/OrderInquiryController.php +++ b/app/Controller/OrderInquiryController.php @@ -4,9 +4,8 @@ namespace App\Controller; use App\Constants\HttpEnumCode; use App\Request\OrderInquiryRequest; -use App\Request\PublicRequest; +use App\Request\UserPatientRequest; use App\Services\OrderInquiryService; -use App\Services\PublicService; use Hyperf\Di\Annotation\Inject; use Hyperf\Validation\Contract\ValidatorFactoryInterface; use Psr\Container\ContainerExceptionInterface; diff --git a/app/Controller/PatientDoctorController.php b/app/Controller/PatientDoctorController.php index e489684..14ac252 100644 --- a/app/Controller/PatientDoctorController.php +++ b/app/Controller/PatientDoctorController.php @@ -2,7 +2,9 @@ namespace App\Controller; +use App\Request\OrderInquiryRequest; use App\Request\PatientDoctorRequest; +use App\Services\OrderInquiryService; use App\Services\PatientDoctorService; use App\Services\UserDoctorService; use Psr\Container\ContainerExceptionInterface; @@ -52,4 +54,20 @@ class PatientDoctorController extends AbstractController $data = $PatientDoctorService->getDoctorProfile(); return $this->response->json($data); } + + /** + * 检测是否可以接诊 + * @return ResponseInterface + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function getDoctorInquiryCheck(): ResponseInterface + { + $request = $this->container->get(PatientDoctorRequest::class); + $request->scene('getDoctorInquiryCheck')->validateResolved(); + + $PatientDoctorService = new PatientDoctorService(); + $data = $PatientDoctorService->getDoctorInquiryCheck(); + return $this->response->json($data); + } } \ No newline at end of file diff --git a/app/Controller/UserPatientController.php b/app/Controller/UserPatientController.php new file mode 100644 index 0000000..52b74c7 --- /dev/null +++ b/app/Controller/UserPatientController.php @@ -0,0 +1,16 @@ + 'integer', 'user_id' => 'integer', 'patient_id' => 'integer', 'doctor_id' => 'integer', 'family_id' => 'integer', 'inquiry_type' => 'integer', 'inquiry_mode' => 'integer', 'inquiry_status' => 'integer', 'is_delete' => 'integer', 'inquiry_refund_status' => 'integer', 'inquiry_pay_channel' => 'integer', 'inquiry_pay_status' => 'integer', 'inquiry_no' => 'integer', 'settlement_status' => 'integer', 'cancel_reason' => 'integer', 'patient_sex' => 'integer', 'patient_age' => 'integer', 'created_at' => 'datetime', 'updated_at' => 'datetime']; + protected array $casts = ['order_inquiry_id' => 'string', 'user_id' => 'string', 'patient_id' => 'string', 'doctor_id' => 'string', 'family_id' => 'string', 'inquiry_type' => 'integer', 'inquiry_mode' => 'integer', 'inquiry_status' => 'integer', 'is_delete' => 'integer', 'inquiry_refund_status' => 'integer', 'inquiry_pay_channel' => 'integer', 'inquiry_pay_status' => 'integer', 'inquiry_no' => 'integer', 'settlement_status' => 'integer', 'cancel_reason' => 'integer', 'patient_sex' => 'integer', 'patient_age' => 'integer', 'created_at' => 'datetime', 'updated_at' => 'datetime']; protected string $primaryKey = "order_inquiry_id"; + /** + * 关联医生表 + */ + public function UserDoctor(): HasOne + { + return $this->hasOne(UserDoctor::class, 'doctor_id','doctor_id'); + } + /** * 获取问诊订单-单条 * @param array $params @@ -172,4 +182,23 @@ class OrderInquiry extends Model ->orderBy('reception_time') ->sum("amount_total"); } + + /** + * 获取某种状态的所有订单 + * @param array $params + * @param array $inquiry_status_params + * @param array $fields + * @return Collection|array + */ + public static function getInquiryStatusList(array $params,array $inquiry_status_params,array $fields = ["*"]): Collection|array + { + return self::with([ + 'UserDoctor' => function ($query){ + $query->orderBy('is_platform_deep_cooperation', 'desc'); + } + ]) + ->where($params) + ->whereIn('inquiry_status',$inquiry_status_params) + ->get($fields); + } } diff --git a/app/Model/UserDoctor.php b/app/Model/UserDoctor.php index fb982a3..b0b7a8e 100644 --- a/app/Model/UserDoctor.php +++ b/app/Model/UserDoctor.php @@ -277,4 +277,14 @@ class UserDoctor extends Model return $data; } + + /** + * 获取是否存在 + * @param array $params + * @return bool + */ + public static function getExists(array $params): bool + { + return self::where($params)->exists(); + } } diff --git a/app/Request/OrderInquiryRequest.php b/app/Request/OrderInquiryRequest.php index 70b4cc4..f790851 100644 --- a/app/Request/OrderInquiryRequest.php +++ b/app/Request/OrderInquiryRequest.php @@ -29,10 +29,6 @@ class OrderInquiryRequest extends FormRequest 'inquiry_type', // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) 'inquiry_mode', // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) ], - 'getInquiryConfigTime' => [ // 获取系统问诊时间 - 'inquiry_type', // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) - 'inquiry_mode', // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) - ], ]; /** @@ -49,7 +45,7 @@ class OrderInquiryRequest extends FormRequest public function rules(): array { return [ - 'inquiry_type' => 'required|integer|min:1|max:3', + 'inquiry_type' => 'required|integer|min:1|max:4', 'inquiry_mode' => 'required|integer|min:1|max:5', 'patient_id' => 'required', 'family_id' => 'required', diff --git a/app/Request/PatientDoctorRequest.php b/app/Request/PatientDoctorRequest.php index 3846b5e..9e8b29f 100644 --- a/app/Request/PatientDoctorRequest.php +++ b/app/Request/PatientDoctorRequest.php @@ -11,6 +11,11 @@ class PatientDoctorRequest extends FormRequest { protected array $scenes = [ 'getInquiryDoctorList' => ['expertise_id','province_id','city_id','sort_order','keyword'], + 'getDoctorInquiryCheck' => [ // 检测是否可以接诊 + 'inquiry_type', // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + 'inquiry_mode', // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) + 'doctor_id', // 医生id(非必需) + ], ]; /** @@ -28,6 +33,8 @@ class PatientDoctorRequest extends FormRequest { return [ 'sort_order' => 'sometimes|integer|min:1|max:5', + 'inquiry_type' => 'required|integer|min:1|max:4', + 'inquiry_mode' => 'required|integer|min:1|max:5', ]; } @@ -40,6 +47,14 @@ class PatientDoctorRequest extends FormRequest 'sort_order.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'sort_order.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'sort_order.max' => 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), ]; } } diff --git a/app/Request/UserPatientRequest.php b/app/Request/UserPatientRequest.php new file mode 100644 index 0000000..4651460 --- /dev/null +++ b/app/Request/UserPatientRequest.php @@ -0,0 +1,43 @@ +toArray(); @@ -206,8 +208,8 @@ class PatientDoctorService extends BaseService $params = array(); $params['hospital_id'] = $user_doctor['hospital_id']; - $hospital = Hospital::getOne($params,$fields); - if (!empty($hospital)){ + $hospital = Hospital::getOne($params, $fields); + if (!empty($hospital)) { $result['hospital'] = $hospital; } @@ -231,18 +233,18 @@ class PatientDoctorService extends BaseService // 获取问诊价格 // 专家-公益 $params = array(); - $params[] = ['doctor_id','=',$doctor_id]; - $params[] = ['inquiry_mode','=',1];// 接诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) + $params[] = ['doctor_id', '=', $doctor_id]; + $params[] = ['inquiry_mode', '=', 1];// 接诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) $doctor_inquiry_config = DoctorInquiryConfigModel::getInquiryConfigList($params); - if (!empty($doctor_inquiry_config)){ - foreach ($doctor_inquiry_config as &$value){ + if (!empty($doctor_inquiry_config)) { + foreach ($doctor_inquiry_config as &$value) { // 获取医生当日已付款的全部订单 $params = array(); - $params[] = ['doctor_id','=',$doctor_id]; - $params[] = ['inquiry_type','=',$value['inquiry_type']]; - $params[] = ['inquiry_mode','=',1]; - $params[] = ['inquiry_status','=',3]; - $params[] = ['inquiry_refund_status','=',0]; + $params[] = ['doctor_id', '=', $doctor_id]; + $params[] = ['inquiry_type', '=', $value['inquiry_type']]; + $params[] = ['inquiry_mode', '=', 1]; + $params[] = ['inquiry_status', '=', 3]; + $params[] = ['inquiry_refund_status', '=', 0]; $value['order_inquiry_count'] = OrderInquiry::getCount($params); } $result['doctor_inquiry_config'] = $doctor_inquiry_config; @@ -257,9 +259,9 @@ class PatientDoctorService extends BaseService $params['doctor_id'] = $user_doctor['doctor_id']; $params['inquiry_status'] = 6; // 已结束 $inquiry_order_count = OrderInquiry::getCount($params); - if (empty($inquiry_order_count) || $inquiry_order_count == 0){ + if (empty($inquiry_order_count) || $inquiry_order_count == 0) { $result['is_display_score'] = false; - }else{ + } else { $result['is_display_score'] = true; } @@ -297,8 +299,8 @@ class PatientDoctorService extends BaseService $params['doctor_id'] = $doctor_id; $params['status'] = 1; // 状态(0:禁用 1:正常 2:删除) $params["iden_auth_status"] = 1;// 身份认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) - $user_doctor = UserDoctor::getOne($params,$fields); - if (empty($user_doctor)){ + $user_doctor = UserDoctor::getOne($params, $fields); + if (empty($user_doctor)) { return fail(HttpEnumCode::CLIENT_HTTP_ERROR); } @@ -315,8 +317,8 @@ class PatientDoctorService extends BaseService $params = array(); $params['hospital_id'] = $user_doctor['hospital_id']; - $hospital = Hospital::getOne($params,$fields); - if (!empty($hospital)){ + $hospital = Hospital::getOne($params, $fields); + if (!empty($hospital)) { $user_doctor['hospital'] = $hospital; } @@ -326,4 +328,119 @@ class PatientDoctorService extends BaseService return success($user_doctor); } + + /** + * 检测是否可以接诊 + * @return array + */ + public function getDoctorInquiryCheck(): array + { + $user_info = $this->request->getAttribute("userInfo") ?? []; + + $inquiry_type = $this->request->input('inquiry_type'); + $inquiry_mode = $this->request->input('inquiry_mode'); + $doctor_id = $this->request->input('doctor_id',''); + + // 检测是否存在未完成的问诊订单 + $params = array(); + $params['patient_id'] = $user_info['client_user_id']; + $params['inquiry_type'] = $inquiry_type; + $params['inquiry_mode'] = $inquiry_mode; + $order_inquiry = OrderInquiry::getOne($params); + if (!empty($order_inquiry)) { + // 1:待支付 2:待分配 3:待接诊 4:已接诊 + if (in_array($order_inquiry['inquiry_status'], [1, 2, 3, 4])) { + return fail(HttpEnumCode::HTTP_ERROR,"当前有未完成服务,不允许再次购买",[$order_inquiry['order_inquiry_id']]); + } + } + + if (!empty($doctor_id)){ + // 获取医生信息 + $params = array(); + $params['doctor_id'] = $user_info['client_user_id']; + + $fields = [ + 'doctor_id', + 'user_name', + 'iden_auth_status', + 'idcard_status', + 'multi_point_status', + 'avatar', + 'is_bind_bank', + ]; + $user_doctor = UserDoctor::getOne($params, $fields); + if (empty($user_doctor)) { + return fail(HttpEnumCode::HTTP_ERROR, "非法医生"); + } + + // 检测医生身份认证 + $UserDoctorService = new UserDoctorService(); + $res = $UserDoctorService->checkDoctorAuth($user_doctor); + if ($res !== true) { + return fail(); + } + + if ($user_doctor['is_img_expert_reception'] != 1) { + return fail(HttpEnumCode::HTTP_ERROR, "医生未开通在线问诊服务"); + } + } + + if ($inquiry_type == 2 || $inquiry_type == 4){ + // 快速问诊-问诊购药 + // 获取问诊配置 + $params = array(); + $params['inquiry_type'] = $inquiry_type; + $params['inquiry_mode'] = $inquiry_mode; + $system_inquiry_config = SystemInquiryConfig::getOne($params); + if (empty($system_inquiry_config)){ + return fail(HttpEnumCode::SERVER_ERROR); + } + + // 获取系统工作时间 + $params = array(); + $params['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id']; + $system_inquiry_time = SystemInquiryTime::getList($params); + if (empty($system_inquiry_time)){ + return fail(HttpEnumCode::SERVER_ERROR); + } + + // 检测当前是否坐班时间 + $is_time_pass = false; + + foreach ($system_inquiry_time as $item){ + $start_time = strtotime(date('Y-m-d') . ' ' .$item['start_time']); + $end_time = strtotime(date('Y-m-d') . ' ' .$item['end_time']); + if ($start_time < time() && $end_time > time()){ + // 符合当前时间区间 + $is_time_pass = true; + } + } + + if (!$is_time_pass){ + // 非坐班时间 + // 检测是否存在对应问诊的在线医生 + $UserDoctorService = new UserDoctorService(); + $is_online = $UserDoctorService->checkDoctorOnline($inquiry_type); + if (!$is_online){ + $UserDoctorService = new UserDoctorService(); + + // 获取当前时间10分钟前接诊中的医生 + $doctors = $UserDoctorService->getBeforeCurrentTimeDoctor(10,$inquiry_type); + if (empty($doctors)){ + // 获取当前时间30分钟前接诊中的医生 + $doctors = $UserDoctorService->getBeforeCurrentTimeDoctor(30,$inquiry_type); + if (empty($doctors)){ + return fail(HttpEnumCode::HTTP_ERROR,'当前不再就诊时间范围内,请您选择其它问诊服务'); + } + } + } + }else{ + // 坐班时间,检测全部医生接诊是否达到上限-暂不处理 + // 获取符合条件医生 + // 获取当前医生接诊订单数 + } + } + + return success(); + } } \ No newline at end of file diff --git a/app/Services/UserDoctorService.php b/app/Services/UserDoctorService.php index 6803b53..dda5364 100644 --- a/app/Services/UserDoctorService.php +++ b/app/Services/UserDoctorService.php @@ -771,5 +771,70 @@ class UserDoctorService extends BaseService return true; } + /** + * 检测是否存在对应问诊的在线医生 + * @param int|string $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + * @return bool + */ + public function checkDoctorOnline(int|string $inquiry_type): bool + { + $params = array(); + $params['status'] = 1; // 状态 + $params['idcard_status'] = 1; // 实名认证状态 + $params['iden_auth_status'] = 1;// 身份认证状态 + if ($inquiry_type == 4){ + // 问诊购药 + $params['multi_point_status'] = 1;// 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) + } + + $params['is_online'] = 1;// 是否在线(0:不在线 1:在线) + + switch ($inquiry_type) { + case 1: + // 专家 + $params['is_img_expert_reception'] = 1;// 是否参加专家图文接诊(0:否 1:是) + break; + case 2: + // 快速 + $params['is_img_quick_reception'] = 1;// 是否参加快速图文接诊(0:否 1:是) + break; + case 3: + // 公益 + $params['is_img_welfare_reception'] = 1;// 是否参加公益图文问诊(0:否 1:是) + break; + + default: + throw new BusinessException(); + break; + } + + return UserDoctor::getExists($params); + } + + /** + * 获取当前时间N分钟前接诊中的医生 + * @param string|int $minute 分钟 + * @param int|string $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + * @return array + */ + public function getBeforeCurrentTimeDoctor(string|int $minute,int|string $inquiry_type): array + { + // 获取当前时间n分钟前时间 + $date = date('Y-m-d H:i:s',time() - $minute * 60); + + $params = array(); + $params[] = ['inquiry_type','=',$inquiry_type]; // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + $params[] = ['inquiry_mode','=',1]; + $params[] = ['reception_time','>',$date]; + + $inquiry_status_params = array(); + $inquiry_status_params = [4,5]; + $order_inquiry = OrderInquiry::getInquiryStatusList($params,$inquiry_status_params); + if (empty($order_inquiry)){ + return []; + } + + return $order_inquiry->toArray(); + } } \ No newline at end of file diff --git a/app/Services/UserPatientService.php b/app/Services/UserPatientService.php index 5c74521..7ca1bb5 100644 --- a/app/Services/UserPatientService.php +++ b/app/Services/UserPatientService.php @@ -2,9 +2,9 @@ namespace App\Services; -use App\Model\PatientHistoryInquiry as PatientHistoryInquiryModel; - +/** + * 患者 + */ class UserPatientService extends BaseService { - } \ No newline at end of file diff --git a/config/routes.php b/config/routes.php index f909923..89195cb 100644 --- a/config/routes.php +++ b/config/routes.php @@ -26,6 +26,7 @@ use App\Controller\SafeController; use App\Controller\SystemController; use App\Controller\UserController; use App\Controller\UserDoctorController; +use App\Controller\UserPatientController; use App\Services\SafeService; use Hyperf\HttpServer\Router\Router; @@ -179,8 +180,8 @@ Router::addGroup('/patient', function () { Router::post('', [OrderInquiryController::class, 'addInquiryOrder']); }); - // 检测是否存在进行中的问诊订单 - Router::post('/check', [OrderInquiryController::class, 'addInquiryOrder']); + // 检测是否可以接诊 + Router::get('/check', [PatientDoctorController::class, 'getDoctorInquiryCheck']); }); // 医生数据