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

440 lines
16 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\Constants\DoctorTitleCode;
use App\Constants\HttpEnumCode;
use App\Model\DoctorExpertise;
use App\Model\DoctorInquiryConfig as DoctorInquiryConfigModel;
use App\Model\Hospital;
use App\Model\OrderEvaluation;
use App\Model\OrderInquiry;
use App\Model\PatientFollow;
use App\Model\PatientHistoryInquiry as PatientHistoryInquiryModel;
use App\Model\SystemInquiryConfig;
use App\Model\SystemInquiryTime;
use App\Model\UserDoctor;
class PatientDoctorService extends BaseService
{
/**
* 获取问诊医生列表
* 专家问诊-公益问诊共用
* @return array
*/
public function getInquiryDoctorList(): array
{
$expertise_id = $this->request->input('expertise_id');
$province_id = $this->request->input('province_id');
$city_id = $this->request->input('city_id');
$sort_order = $this->request->input('sort_order');
$keyword = $this->request->input('keyword');
// 组合条件
$hospital_params = array();// 医院搜索
$doctor_params = array();// 医生搜索
$doctor_expertise_params = array();// 医生专长搜索
// 省市区
if (!empty($province_id)) {
if (empty($city_id)) {
// 省份存在时需和城市在一块
return fail(HttpEnumCode::CLIENT_HTTP_ERROR);
}
$hospital_params[] = ['province_id', '=', $province_id];
$hospital_params[] = ['city_id', '=', $city_id];
}
// 医生专长
if (!empty($expertise_id)) {
$doctor_expertise_params['expertise_id'] = $expertise_id;
}
// 固定医生查询条件
$doctor_params['status'] = 1; // 状态0:禁用 1:正常 2:删除)
$doctor_params["iden_auth_status"] = 1;// 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
$doctor_params["is_online"] = 1;// 是否在线0:不在线 1:在线)
$doctor_params["is_img_expert_reception"] = 1;// 是否参加专家图文接诊0:否 1:是)
$fields = [
"doctor_id",
"user_id",
"user_name",
"multi_point_status",
"is_bind_bank",
"is_recommend",
"sex",
"age",
"avatar",
"doctor_title",
"department_custom_id",
"department_custom_name",
"hospital_id",
"served_patients_num",
"praise_rate",
"avg_response_time",
"number_of_fans",
"is_online",
"is_img_expert_reception",
"is_img_welfare_reception",
"is_platform_deep_cooperation",
"be_good_at",
];
$user_doctors = UserDoctor::getInquiryDoctorPage($keyword, $hospital_params, $doctor_params, $doctor_expertise_params, $sort_order, $fields);
// 处理数据
if (!empty($user_doctors['data'])) {
foreach ($user_doctors['data'] as &$user_doctor) {
$user_doctor['doctor_title_name'] = empty($user_doctor['doctor_title']) ? "" : DoctorTitleCode::getMessage($user_doctor['doctor_title']);
// 医生专长
if (!empty($user_doctor['DoctorExpertise'])) {
foreach ($user_doctor['DoctorExpertise'] as &$data) {
if (!empty($data['DiseaseClassExpertise'])) {
$data['expertise_name'] = $data['DiseaseClassExpertise']['expertise_name'];
}
unset($data['DiseaseClassExpertise']);
}
}
// 问诊价格
$user_doctor['price'] = 0;
$user_doctor['free_clinic_price'] = 0;
if (!empty($user_doctor['DoctorInquiryConfig'])) {
foreach ($user_doctor['DoctorInquiryConfig'] as $doctor_inquiry_config) {
if ($doctor_inquiry_config['inquiry_mode'] == 1) {
if ($doctor_inquiry_config['inquiry_type'] == 1) {
// 专家
$user_doctor['price'] = $doctor_inquiry_config['inquiry_price'] ?? 0;
}
if ($doctor_inquiry_config['inquiry_type'] == 3) {
// 公益
$user_doctor['free_clinic_price'] = $doctor_inquiry_config['inquiry_price'];
}
}
}
unset($user_doctor['DoctorInquiryConfig']);
}
// 好评率-超过5个已结束的订单后展示
$user_doctor['praise_rate'] = ceil($user_doctor['praise_rate'] * 0.05 * 100) / 100;
// 响应时间-超过5个已结束的订单后展示
$user_doctor['avg_response_time'] = ceil($user_doctor['avg_response_time'] * 0.05 * 100) / 100 * 60;
// 获取医生订单数
$params = array();
$params['doctor_id'] = $user_doctor['doctor_id'];
$params['inquiry_status'] = 6; // 已结束
$inquiry_order_count = OrderInquiry::getCount($params);
if (empty($inquiry_order_count) || $inquiry_order_count == 0) {
$user_doctor['is_display_score'] = false;
} else {
$user_doctor['is_display_score'] = true;
}
// 头像
$user_doctor['avatar'] = addAliyunOssWebsite($user_doctor['avatar']);
}
}
return success($user_doctors);
}
/**
* 获取问诊医生详情
* @return array
*/
public function getInquiryDoctorInfo(): array
{
$doctor_id = $this->request->route('doctor_id');
$user_info = $this->request->getAttribute("userInfo") ?? [];
$result = array();
$result['hospital'] = [];
$result['days'] = 0;
$result['doctor_inquiry_config'] = [];
$fields = [
"doctor_id",
"user_id",
"user_name",
"iden_auth_status",
"multi_point_status",
"sex",
"age",
"avatar",
"doctor_title",
"department_custom_id",
"department_custom_name",
"hospital_id",
"served_patients_num",
"praise_rate",
"avg_response_time",
"number_of_fans",
"is_online",
"is_img_expert_reception",
"is_img_welfare_reception",
"is_platform_deep_cooperation",
"be_good_at",
];
$params = array();
$params['doctor_id'] = $doctor_id;
$params['status'] = 1; // 状态0:禁用 1:正常 2:删除)
$params["iden_auth_status"] = 1;// 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
$user_doctor = UserDoctor::getOne($params, $fields);
if (empty($user_doctor)) {
return fail(HttpEnumCode::HTTP_SUCCESS, "医生错误");
}
$result = $user_doctor->toArray();
$result['doctor_title_name'] = empty($user_doctor['doctor_title']) ? "" : DoctorTitleCode::getMessage($user_doctor['doctor_title']);
$result['hospital'] = [];
$result['days'] = 0;
$result['doctor_inquiry_config'] = 0;
// 获取医生医院数据
$fields = [
'hospital_id',
'hospital_name',
'hospital_level_name',
];
$params = array();
$params['hospital_id'] = $user_doctor['hospital_id'];
$hospital = Hospital::getOne($params, $fields);
if (!empty($hospital)) {
$result['hospital'] = $hospital;
}
// 获取服务天数
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$params['doctor_id'] = $doctor_id;
$params['history_status'] = 1;
$patient_history_doctor = PatientHistoryInquiryModel::getOne($params);
// 按照天来计算当日为1前一天为2 未服务过为0
if (!empty($patient_history_doctor['created_at'])) {
$result['days'] = ceil((strtotime(date('Y-m-d', strtotime('+1 day'))) - strtotime($patient_history_doctor['created_at'])) / 86400);
}
// 获取关注状态
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$params['doctor_id'] = $doctor_id;
$result['follow'] = PatientFollow::getExists($params);
// 获取问诊价格
// 专家-公益
$params = array();
$params[] = ['doctor_id', '=', $doctor_id];
$params[] = ['inquiry_mode', '=', 1];// 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员)
$doctor_inquiry_config = DoctorInquiryConfigModel::getInquiryConfigList($params);
if (!empty($doctor_inquiry_config)) {
foreach ($doctor_inquiry_config as &$value) {
// 获取医生当日已付款的全部订单
$params = array();
$params[] = ['doctor_id', '=', $doctor_id];
$params[] = ['inquiry_type', '=', $value['inquiry_type']];
$params[] = ['inquiry_mode', '=', 1];
$params[] = ['inquiry_status', '=', 3];
$params[] = ['inquiry_refund_status', '=', 0];
$value['order_inquiry_count'] = OrderInquiry::getCount($params);
}
$result['doctor_inquiry_config'] = $doctor_inquiry_config;
}
// 好评率-超过5个已结束的订单后展示
$result['praise_rate'] = ceil($user_doctor['praise_rate'] * 0.05 * 100) / 100;
// 响应时间-超过5个已结束的订单后展示
$result['avg_response_time'] = ceil($user_doctor['avg_response_time'] * 0.05 * 100) / 100 * 60;
$params = array();
$params['doctor_id'] = $user_doctor['doctor_id'];
$params['inquiry_status'] = 6; // 已结束
$inquiry_order_count = OrderInquiry::getCount($params);
if (empty($inquiry_order_count) || $inquiry_order_count == 0) {
$result['is_display_score'] = false;
} else {
$result['is_display_score'] = true;
}
// 头像
$result['avatar'] = addAliyunOssWebsite($user_doctor['avatar']);
return success($result);
}
/**
* 医生详情简介-详情中的简介
* @return array
*/
public function getDoctorProfile(): array
{
$doctor_id = $this->request->route('doctor_id');
$user_info = $this->request->getAttribute("userInfo") ?? [];
$fields = [
"doctor_id",
"user_id",
"user_name",
"status",
"iden_auth_status",
"avatar",
"doctor_title",
"department_custom_name",
"hospital_id",
"be_good_at",
"brief_introduction",
];
$params = array();
$params['doctor_id'] = $doctor_id;
$params['status'] = 1; // 状态0:禁用 1:正常 2:删除)
$params["iden_auth_status"] = 1;// 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
$user_doctor = UserDoctor::getOne($params, $fields);
if (empty($user_doctor)) {
return fail(HttpEnumCode::CLIENT_HTTP_ERROR);
}
$user_doctor = $user_doctor->toArray();
$user_doctor['doctor_title_name'] = empty($user_doctor['doctor_title']) ? "" : DoctorTitleCode::getMessage($user_doctor['doctor_title']);
// 获取医生医院数据
$fields = [
'hospital_id',
'hospital_name',
'hospital_level_name',
];
$params = array();
$params['hospital_id'] = $user_doctor['hospital_id'];
$hospital = Hospital::getOne($params, $fields);
if (!empty($hospital)) {
$user_doctor['hospital'] = $hospital;
}
// 获取医生已选择专长
$UserDoctorService = new UserDoctorService();
$user_doctor['doctor_expertise'] = $UserDoctorService->getDoctorSelectedExpertise($doctor_id);
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','');
// 检测是否存在未完成的问诊订单
$UserPatientService = new UserPatientService();
$res = $UserPatientService->getNotFinishedOrdeInquiry($user_info['client_user_id']);
if (!empty($res)){
return fail(HttpEnumCode::HTTP_ERROR,"当前有未完成服务,不允许再次购买",[$res]);
}
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();
}
}