296 lines
12 KiB
PHP
296 lines
12 KiB
PHP
<?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']);
|
||
}
|
||
} |