diff --git a/app/Controller/InquiryController.php b/app/Controller/InquiryController.php index d6a99ab..f9cf9d1 100644 --- a/app/Controller/InquiryController.php +++ b/app/Controller/InquiryController.php @@ -163,4 +163,20 @@ class InquiryController extends AbstractController $data = $InquiryService->addDoctorGiveInquiryOrder(); return $this->response->json($data); } + + /** + * 医生设置视频预约时间 + * @return ResponseInterface + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function addVideoReservationDate(): ResponseInterface + { + $request = $this->container->get(InquiryRequest::class); + $request->scene('addVideoReservationDate')->validateResolved(); + + $InquiryService = new InquiryService(); + $data = $InquiryService->addVideoReservationDate(); + return $this->response->json($data); + } } \ No newline at end of file diff --git a/app/Model/OrderInquiryVideo.php b/app/Model/OrderInquiryVideo.php index a4275b8..cdd71f9 100644 --- a/app/Model/OrderInquiryVideo.php +++ b/app/Model/OrderInquiryVideo.php @@ -14,8 +14,7 @@ use Hyperf\Snowflake\Concern\Snowflake; * @property string $reservation_time 预约时间 * @property int $is_send_reservation_notice 是否已发送预约通知(0:否 1:是) * @property int $is_video 是否已开视频(0:否 1:是) - * @property string $start_time 开始时间 - * @property string $end_time 结束时间 + * @property int $update_number 修改次数 * @property \Carbon\Carbon $created_at 创建时间 * @property \Carbon\Carbon $updated_at 修改时间 */ @@ -31,7 +30,7 @@ class OrderInquiryVideo extends Model /** * The attributes that are mass assignable. */ - protected array $fillable = ['inquiry_video_id', 'order_inquiry_id', 'reservation_time', 'is_send_reservation_notice', 'is_video', 'start_time', 'end_time', 'created_at', 'updated_at']; + protected array $fillable = ['inquiry_video_id', 'order_inquiry_id', 'reservation_time', 'is_send_reservation_notice', 'is_video', 'update_number', 'created_at', 'updated_at']; protected string $primaryKey = "inquiry_video_id"; @@ -56,4 +55,19 @@ class OrderInquiryVideo extends Model { return self::where($params)->get($fields); } + + /** + * 新增-批量 + * @param array $data 新增数据 + * @return \Hyperf\Database\Model\Model|OrderInquiryVideo + */ + public static function addOrderInquiryVideo(array $data): \Hyperf\Database\Model\Model|OrderInquiryVideo + { + return self::create($data); + } + + public static function edit(array $params = [], array $data = []): int + { + return self::where($params)->update($data); + } } diff --git a/app/Request/InquiryRequest.php b/app/Request/InquiryRequest.php index 29e6795..1e3c3b3 100644 --- a/app/Request/InquiryRequest.php +++ b/app/Request/InquiryRequest.php @@ -49,6 +49,10 @@ class InquiryRequest extends FormRequest 'times_number', // 沟通次数(0为不限制次数) 'duration', // 沟通时长(分钟,0为不限制时长) ], + 'addVideoReservationDate' => [ // 医生设置视频预约时间 + 'order_inquiry_id', + 'reservation_time', // 预约时间 + ], ]; /** @@ -87,6 +91,7 @@ class InquiryRequest extends FormRequest 'inquiry_status' => 'required|integer|min:0|max:4', 'times_number' => "required|min:0|max:999|numeric", 'duration' => "required|min:0|max:21600|numeric", + 'reservation_time' => "required", ]; } @@ -123,6 +128,7 @@ class InquiryRequest extends FormRequest 'inquiry_status.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'inquiry_status.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'order_inquiry_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'reservation_time.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), ]; } } diff --git a/app/Services/InquiryService.php b/app/Services/InquiryService.php index 44dcce4..a0cfddf 100644 --- a/app/Services/InquiryService.php +++ b/app/Services/InquiryService.php @@ -886,7 +886,6 @@ class InquiryService extends BaseService $follow = false; // 关注状态 $is_evaluation = false; // 评价状态 - $is_reservation_video = false; // 预约视频状态 // 获取医生问诊配置-问诊购药 $multi_point_enable = 0; @@ -917,14 +916,6 @@ class InquiryService extends BaseService $is_evaluation = OrderEvaluation::getExists($params); } - // 获取视频数据 - $params = array(); - $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - $order_inquiry_video = OrderInquiryVideo::getOne($params); - if (!empty($order_inquiry_video)){ - $is_reservation_video = true; - } - $result = array(); $result['doctor_user_id'] = $user_doctor['user_id']; $result['patient_user_id'] = $order_inquiry['user_id']; @@ -945,7 +936,6 @@ class InquiryService extends BaseService $result['reception_time'] = $order_inquiry['reception_time'] ?: null; // 接诊时间 $result['multi_point_status'] = $user_doctor['multi_point_status'] ?: null;// 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) $result['multi_point_enable'] = $multi_point_enable;// 医生问诊购药是否开启 - $result['is_reservation_video'] = $is_reservation_video;// 预约视频状态 return success($result); } @@ -1321,6 +1311,156 @@ class InquiryService extends BaseService return success($result); } + /** + * 医生设置视频预约时间 + * @return array + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function addVideoReservationDate(): array + { + $user_info = $this->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 (time() >= $complete_time){ + return fail(HttpEnumCode::HTTP_ERROR, "已无法设置/修改视频时间,可立即发起视频"); + } + + // 获取是否已经预约 + $params = array(); + $params['order_inquiry_id'] = $order_inquiry_id; + $order_inquiry_video = OrderInquiryVideo::getOne($params); + if (!empty($order_inquiry_video)){ + // 检测是否已开过视频 + if ($order_inquiry_video['is_video'] == 1){ + return fail(HttpEnumCode::HTTP_ERROR, "已开过视频时间,无需再修改预约时间"); + } + + // 检测预约时间修改次数 + if ($order_inquiry_video['update_number'] >= 1){ + return fail(HttpEnumCode::HTTP_ERROR, "已无法设置/修改视频时间,可立即发起视频"); + } + } + + // 创建订单 + Db::beginTransaction(); + + $generator = $this->container->get(IdGeneratorInterface::class); + + try { + if (empty($order_inquiry_video)){ + // 创建视频预约数据 + $data = array(); + $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $data['reservation_time'] = $reservation_time; + $order_inquiry_video = OrderInquiryVideo::addOrderInquiryVideo($data); + if (empty($order_inquiry_video)){ + 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['inquiry_video_id']; + $res = OrderInquiryVideo::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, "赠送失败"); + } + + // 发送im消息 + $imService = new ImService(); + + + // 发送短信-患者-视频预约成功 + + + + // 成功预约视频问诊时间 + // 成功修改视频问诊时间 + + + // 赠送回合数消息 + $imService->giveFreeRounds($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id'],$times_number,$give_expiration_time); + + // 发送站内、订阅失败发送短信消息-患者-赠送回合数 + $MessagePush = new MessagePush($order_inquiry['user_id'], $order_inquiry['order_inquiry_id']); + $MessagePush->doctorGiveFreeRounds($times_number,$give_expiration_time); + }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); + } + /** * 获取医生未接诊订单数量 * @param string $doctor_id 医生id