检测是否可以接诊

This commit is contained in:
wucongxing 2023-02-27 18:02:41 +08:00
parent 9b137d16f5
commit 5825138b7f
12 changed files with 357 additions and 48 deletions

View File

@ -4,9 +4,8 @@ namespace App\Controller;
use App\Constants\HttpEnumCode; use App\Constants\HttpEnumCode;
use App\Request\OrderInquiryRequest; use App\Request\OrderInquiryRequest;
use App\Request\PublicRequest; use App\Request\UserPatientRequest;
use App\Services\OrderInquiryService; use App\Services\OrderInquiryService;
use App\Services\PublicService;
use Hyperf\Di\Annotation\Inject; use Hyperf\Di\Annotation\Inject;
use Hyperf\Validation\Contract\ValidatorFactoryInterface; use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;

View File

@ -2,7 +2,9 @@
namespace App\Controller; namespace App\Controller;
use App\Request\OrderInquiryRequest;
use App\Request\PatientDoctorRequest; use App\Request\PatientDoctorRequest;
use App\Services\OrderInquiryService;
use App\Services\PatientDoctorService; use App\Services\PatientDoctorService;
use App\Services\UserDoctorService; use App\Services\UserDoctorService;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
@ -52,4 +54,20 @@ class PatientDoctorController extends AbstractController
$data = $PatientDoctorService->getDoctorProfile(); $data = $PatientDoctorService->getDoctorProfile();
return $this->response->json($data); 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);
}
} }

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use App\Request\UserPatientRequest;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Http\Message\ResponseInterface;
/**
* 患者
*/
class UserPatientController extends AbstractController
{
}

View File

@ -6,6 +6,8 @@ namespace App\Model;
use Hyperf\Database\Model\Collection;
use Hyperf\Database\Model\Relations\HasOne;
use Hyperf\Snowflake\Concern\Snowflake; use Hyperf\Snowflake\Concern\Snowflake;
/** /**
@ -59,10 +61,18 @@ class OrderInquiry extends Model
/** /**
* The attributes that should be cast to native types. * The attributes that should be cast to native types.
*/ */
protected array $casts = ['order_inquiry_id' => '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"; protected string $primaryKey = "order_inquiry_id";
/**
* 关联医生表
*/
public function UserDoctor(): HasOne
{
return $this->hasOne(UserDoctor::class, 'doctor_id','doctor_id');
}
/** /**
* 获取问诊订单-单条 * 获取问诊订单-单条
* @param array $params * @param array $params
@ -172,4 +182,23 @@ class OrderInquiry extends Model
->orderBy('reception_time') ->orderBy('reception_time')
->sum("amount_total"); ->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);
}
} }

View File

@ -277,4 +277,14 @@ class UserDoctor extends Model
return $data; return $data;
} }
/**
* 获取是否存在
* @param array $params
* @return bool
*/
public static function getExists(array $params): bool
{
return self::where($params)->exists();
}
} }

View File

@ -29,10 +29,6 @@ class OrderInquiryRequest extends FormRequest
'inquiry_type', // 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) 'inquiry_type', // 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
'inquiry_mode', // 订单问诊方式1:图文 2:视频 3:语音 4:电话 5:会员) '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 public function rules(): array
{ {
return [ 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', 'inquiry_mode' => 'required|integer|min:1|max:5',
'patient_id' => 'required', 'patient_id' => 'required',
'family_id' => 'required', 'family_id' => 'required',

View File

@ -11,6 +11,11 @@ class PatientDoctorRequest extends FormRequest
{ {
protected array $scenes = [ protected array $scenes = [
'getInquiryDoctorList' => ['expertise_id','province_id','city_id','sort_order','keyword'], '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 [ return [
'sort_order' => 'sometimes|integer|min:1|max:5', '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.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR),
'sort_order.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), 'sort_order.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR),
'sort_order.max' => 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),
]; ];
} }
} }

View File

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace App\Request;
use App\Constants\HttpEnumCode;
use Hyperf\Validation\Request\FormRequest;
class UserPatientRequest extends FormRequest
{
protected array $scenes = [
];
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*/
public function rules(): array
{
return [
];
}
/**
* 获取已定义验证规则的错误消息.
*/
public function messages(): array
{
return [
];
}
}

View File

@ -11,6 +11,8 @@ use App\Model\OrderEvaluation;
use App\Model\OrderInquiry; use App\Model\OrderInquiry;
use App\Model\PatientFollow; use App\Model\PatientFollow;
use App\Model\PatientHistoryInquiry as PatientHistoryInquiryModel; use App\Model\PatientHistoryInquiry as PatientHistoryInquiryModel;
use App\Model\SystemInquiryConfig;
use App\Model\SystemInquiryTime;
use App\Model\UserDoctor; use App\Model\UserDoctor;
class PatientDoctorService extends BaseService class PatientDoctorService extends BaseService
@ -326,4 +328,119 @@ class PatientDoctorService extends BaseService
return success($user_doctor); 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();
}
} }

View File

@ -771,5 +771,70 @@ class UserDoctorService extends BaseService
return true; 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();
}
} }

View File

@ -2,9 +2,9 @@
namespace App\Services; namespace App\Services;
use App\Model\PatientHistoryInquiry as PatientHistoryInquiryModel; /**
* 患者
*/
class UserPatientService extends BaseService class UserPatientService extends BaseService
{ {
} }

View File

@ -26,6 +26,7 @@ use App\Controller\SafeController;
use App\Controller\SystemController; use App\Controller\SystemController;
use App\Controller\UserController; use App\Controller\UserController;
use App\Controller\UserDoctorController; use App\Controller\UserDoctorController;
use App\Controller\UserPatientController;
use App\Services\SafeService; use App\Services\SafeService;
use Hyperf\HttpServer\Router\Router; use Hyperf\HttpServer\Router\Router;
@ -179,8 +180,8 @@ Router::addGroup('/patient', function () {
Router::post('', [OrderInquiryController::class, 'addInquiryOrder']); Router::post('', [OrderInquiryController::class, 'addInquiryOrder']);
}); });
// 检测是否存在进行中的问诊订单 // 检测是否可以接诊
Router::post('/check', [OrderInquiryController::class, 'addInquiryOrder']); Router::get('/check', [PatientDoctorController::class, 'getDoctorInquiryCheck']);
}); });
// 医生数据 // 医生数据