hospital-applets-api/app/Services/VideoService.php

296 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Services;
use App\Amqp\Producer\SendVideoNoticeDelayDirectProducer;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\OrderInquiry;
use App\Model\OrderInquiryVideoRecord;
use App\Model\OrderInquiryVideoReservation;
use App\Model\SystemInquiryConfig;
use App\Model\User;
use App\Model\UserDoctor;
use App\Utils\Log;
use Extend\TencentVideo\Safe as VideoSafe;
use Hyperf\Amqp\Producer;
use Hyperf\DbConnection\Db;
/**
* 视频
*/
class VideoService extends BaseService
{
/**
* 医生设置视频预约时间
* @return array
*/
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 (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_record = OrderInquiryVideoRecord::getOne($params);
if (!empty($order_inquiry_video_record)) {
return fail(HttpEnumCode::HTTP_ERROR, "已开过视频,无需再修改预约时间");
}
$is_reservation = true;
}
Db::beginTransaction();
try {
if (empty($order_inquiry_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['reservation_id'] = $order_inquiry_video_reservation['reservation_id'];
$res = OrderInquiryVideoReservation::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_record = OrderInquiryVideoRecord::addOrderInquiryVideoRecord($data);
if (empty($order_inquiry_video_record)) {
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']);
}
}