446 lines
17 KiB
PHP
446 lines
17 KiB
PHP
<?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','');
|
||
|
||
// 检测是否存在未完成的问诊订单
|
||
$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();
|
||
}
|
||
} |