request->getAttribute("userInfo") ?? []; $order_inquiry_id = $this->request->input('order_inquiry_id'); $reservation_time = $this->request->input('reservation_time'); // 检测预约时间 if (time() >= strtotime($reservation_time)) { return fail(HttpEnumCode::HTTP_ERROR, "预约时间须大于当前时间"); } // 获取问诊订单数据 $params = array(); $params['order_inquiry_id'] = $order_inquiry_id; $params['doctor_id'] = $user_info['client_user_id']; $order_inquiry = OrderInquiry::getOne($params); if (empty($order_inquiry)) { return fail(); } if ($order_inquiry['inquiry_type'] != 1) { return fail(); } if ($order_inquiry['inquiry_mode'] != 2) { return fail(HttpEnumCode::HTTP_ERROR, "订单类型错误"); } // 检测订单状态 if ($order_inquiry['inquiry_status'] != 4) { return fail(HttpEnumCode::HTTP_ERROR, "订单状态错误"); } // 获取系统问诊配置 $params = array(); $params['inquiry_type'] = $order_inquiry['inquiry_type']; $params['inquiry_mode'] = $order_inquiry['inquiry_mode']; $system_inquiry_config = SystemInquiryConfig::getOne($params); if (empty($system_inquiry_config)) { return fail(); } // 问诊结束时间 $complete_time = strtotime($order_inquiry['reception_time']) + $system_inquiry_config['duration'] * 60 - 10 * 60; // 检测问诊结束时间 预约时间不可超出视频问诊结束时间 if (strtotime($reservation_time) >= $complete_time) { return fail(HttpEnumCode::HTTP_ERROR, "预约时间不可超出视频问诊结束时间"); } // 获取是否已经预约 $is_reservation = false; $params = array(); $params['order_inquiry_id'] = $order_inquiry_id; $order_inquiry_video_reservation = OrderInquiryVideoReservation::getOne($params); if (!empty($order_inquiry_video_reservation)) { // 检测预约时间修改次数 if ($order_inquiry_video_reservation['update_number'] >= 1) { return fail(HttpEnumCode::HTTP_ERROR, "已无法设置/修改视频时间,可立即发起视频"); } // 检测是否已开过视频 $params = array(); $params['order_inquiry_id'] = $order_inquiry_id; $order_inquiry_video_records = OrderInquiryVideoRecord::getOne($params); if (!empty($order_inquiry_video_records)) { return fail(HttpEnumCode::HTTP_ERROR, "已开过视频,无需再修改预约时间"); } $is_reservation = true; } Db::beginTransaction(); try { if (empty($video_reservation)) { // 获取用户-医生数据 $params = array(); $params['doctor_id'] = $order_inquiry['doctor_id']; $user_doctor = UserDoctor::getOne($params); if (empty($user_doctor)) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, "设置失败"); } // 创建视频预约数据 $data = array(); $data['patient_id'] = $order_inquiry['patient_id']; $data['patient_user_id'] = $order_inquiry['user_id']; $data['doctor_id'] = $order_inquiry['doctor_id']; $data['doctor_user_id'] = $user_doctor['user_id']; $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; $data['room_id'] = substr($order_inquiry['doctor_id'], -5) . substr(time(), -4); $data['reservation_time'] = $reservation_time; $order_inquiry_video_reservation = OrderInquiryVideoReservation::addOrderInquiryVideoReservation($data); if (empty($order_inquiry_video_reservation)) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, "设置失败"); } } else { // 修改预约时间 $data = array(); $data['reservation_time'] = $reservation_time; $data['update_number'] = 1; $params = array(); $params['inquiry_video_id'] = $order_inquiry_video_reservation['inquiry_video_id']; $res = VideoReservation::edit($params, $data); if (!$res) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, "设置失败"); } } Db::commit(); } catch (\Throwable $e) { Db::rollBack(); Log::getInstance("InquiryService-addDoctorGiveInquiryOrder")->error($e->getMessage()); return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage()); } // 发送消息 try { // 获取订单医生数据 $params = array(); $params['doctor_id'] = $order_inquiry['doctor_id']; $user_doctor = UserDoctor::getOne($params); if (empty($user_doctor)) { return fail(HttpEnumCode::SERVER_ERROR, "设置失败"); } // 获取订单用户数据 $params = array(); $params['user_id'] = $order_inquiry['user_id']; $user = User::getOne($params); if (empty($user)) { return fail(HttpEnumCode::SERVER_ERROR, "设置失败"); } // 发送im消息 $imService = new ImService(); if ($is_reservation) { // 修改 // 已成功预约视频问诊时间-医生 $imService->addVideoReservationTimeToDoctor($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id'], $reservation_time); // 已成功预约视频问诊时间-患者 $imService->addVideoReservationTimeToPatient($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id'], $reservation_time); } else { // 新增 // 已成功修改视频问诊时间-医生 $imService->modifyVideoReservationTimeToDoctor($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id'], $reservation_time); // 已成功修改视频问诊时间-患者 $imService->modifyVideoReservationTimeToPatient($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id'], $reservation_time); } // 患者-通知患者视频时间 $sendSmsService = new SendSmsService($user['mobile']); $sendSmsService->noticePatientVideoTime($user_doctor['user_name'], $reservation_time); // 增加延迟队列通知-视频问诊即将开始-时间大于5分钟 $time = strtotime($reservation_time) - 5 * 60; if ($time > time()) { $data = array(); $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; $message = new SendVideoNoticeDelayDirectProducer($data); $message->setDelayMs(1000 * (strtotime($reservation_time) - time())); $producer = $this->container->get(Producer::class); $res = $producer->produce($message); if (!$res) { return fail(HttpEnumCode::SERVER_ERROR, "设置失败"); } } } catch (\Throwable $e) { Log::getInstance("InquiryService-addDoctorGiveInquiryOrder")->error($e->getMessage()); } $result = array(); $result['order_inquiry_id'] = (string)$order_inquiry['order_inquiry_id']; // 订单主键id $result['inquiry_no'] = (string)$order_inquiry['inquiry_no']; // 订单编号 return success($result); } /** * 创建音视频房间 * @return array */ public function addVideoRoom(): array { $user_info = $this->request->getAttribute("userInfo") ?? []; $order_inquiry_id = $this->request->input('order_inquiry_id'); // 获取问诊订单数据 $params = array(); $params['order_inquiry_id'] = $order_inquiry_id; $params['doctor_id'] = $user_info['client_user_id']; $order_inquiry = OrderInquiry::getOne($params); if (empty($order_inquiry)) { return fail(); } if ($order_inquiry['inquiry_type'] != 1) { return fail(); } if ($order_inquiry['inquiry_mode'] != 2) { return fail(HttpEnumCode::HTTP_ERROR, "订单类型错误"); } // 检测订单状态-问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) if ($order_inquiry['inquiry_status'] == 3) { return fail(HttpEnumCode::HTTP_ERROR, "订单未接诊,无法发起视频"); } if ($order_inquiry['inquiry_status'] == 5) { return fail(HttpEnumCode::HTTP_ERROR, "订单已完成,无法发起视频"); } if ($order_inquiry['inquiry_status'] == 6) { return fail(HttpEnumCode::HTTP_ERROR, "订单已结束,无法发起视频"); } if ($order_inquiry['inquiry_status'] == 7) { return fail(HttpEnumCode::HTTP_ERROR, "订单已取消,无法发起视频"); } $params = array(); $params['order_inquiry_id'] = $order_inquiry_id; $order_inquiry_video_reservation = OrderInquiryVideoReservation::getOne($params); if (empty($order_inquiry_video_reservation)) { return fail(HttpEnumCode::HTTP_ERROR, "您还没有和患者预约视频时间,无法发起视频"); } if (empty($order_inquiry_video_reservation['room_id'])){ // 视频房间创建错误,无房间号 return fail(HttpEnumCode::SERVER_ERROR); } Db::beginTransaction(); try { // 增加视频记录 $data = array(); $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; $data['room_id'] = $order_inquiry_video_reservation['room_id']; $data['video_status'] = 1; $data['start_video_time'] = date('Y-m-d H:i:s', time()); $order_inquiry_video_records = OrderInquiryVideoRecord::addOrderInquiryVideoRecord($data); if (empty($order_inquiry_video_records)) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, "发起视频失败"); } Db::commit(); } catch (\Throwable $e) { Db::rollBack(); Log::getInstance("VideoService-addVideoRoom")->error($e->getMessage()); return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage()); } return success($order_inquiry_video_reservation['room_id']); } }