2943 lines
113 KiB
PHP
2943 lines
113 KiB
PHP
<?php
|
||
|
||
namespace App\Services;
|
||
|
||
use App\Amqp\Producer\AssignPharmacistProducer;
|
||
use App\Amqp\Producer\AutoCompleteInquiryDelayDirectProducer;
|
||
use App\Amqp\Producer\AutoFinishInquiryDelayDirectProducer;
|
||
use App\Amqp\Producer\AutoPharmacistCaVerifyDelayDirectProducer;
|
||
use App\Constants\DoctorTitleCode;
|
||
use App\Constants\HttpEnumCode;
|
||
use App\Exception\BusinessException;
|
||
use App\Model\BasicBank;
|
||
use App\Model\BasicWord;
|
||
use App\Model\DiseaseClassExpertise;
|
||
use App\Model\DiseaseClassIcd;
|
||
use App\Model\DoctorAccount;
|
||
use App\Model\DoctorBankCard;
|
||
use App\Model\DoctorConfigDifficultConsultation;
|
||
use App\Model\DoctorConfigFollowPackage;
|
||
use App\Model\DoctorConfigFollowPackageItem;
|
||
use App\Model\DoctorConfigHealthPackage;
|
||
use App\Model\DoctorExpertise;
|
||
use App\Model\DoctorInquiryConfig;
|
||
use App\Model\DoctorInquiryConfig as DoctorInquiryConfigModel;
|
||
use App\Model\DoctorInquiryTime;
|
||
use App\Model\DoctorWord;
|
||
use App\Model\Hospital;
|
||
use App\Model\InquiryCaseProduct;
|
||
use App\Model\OrderEvaluation;
|
||
use App\Model\OrderInquiry;
|
||
use App\Model\OrderInquiryCase;
|
||
use App\Model\OrderPrescription;
|
||
use App\Model\OrderPrescriptionFile;
|
||
use App\Model\OrderPrescriptionIcd;
|
||
use App\Model\OrderPrescriptionProduct;
|
||
use App\Model\OrderProductItem;
|
||
use App\Model\OrderServicePackage;
|
||
use App\Model\OrderServicePackageDetail;
|
||
use App\Model\OrderServicePackageInquiry;
|
||
use App\Model\PatientFollow;
|
||
use App\Model\PatientHistoryInquiry;
|
||
use App\Model\PatientHistoryInquiry as PatientHistoryInquiryModel;
|
||
use App\Model\Popup;
|
||
use App\Model\Product;
|
||
use App\Model\ProductPlatformAmount;
|
||
use App\Model\SystemConfig;
|
||
use App\Model\SystemInquiryConfig;
|
||
use App\Model\SystemInquiryTime;
|
||
use App\Model\User;
|
||
use App\Model\UserDoctor;
|
||
use App\Model\UserDoctorInfo;
|
||
use App\Model\UserPharmacist;
|
||
use App\Utils\Log;
|
||
use App\Utils\Mask;
|
||
use Extend\Alibaba\Oss;
|
||
use Extend\VerifyDun\BankCard;
|
||
use Extend\Wechat\Wechat;
|
||
use GuzzleHttp\Exception\GuzzleException;
|
||
use Hyperf\Amqp\Producer;
|
||
use Hyperf\DbConnection\Db;
|
||
use Hyperf\Redis\Redis;
|
||
use Hyperf\Snowflake\IdGeneratorInterface;
|
||
use Hyperf\Utils\ApplicationContext;
|
||
use Psr\Container\ContainerExceptionInterface;
|
||
use Psr\Container\NotFoundExceptionInterface;
|
||
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
|
||
use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
|
||
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
|
||
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
|
||
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
||
|
||
class UserDoctorService extends BaseService
|
||
{
|
||
/**
|
||
* 获取医生专长列表
|
||
* 身份认证
|
||
* @return array
|
||
*/
|
||
public function getAuthDoctorExpertise(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
// 获取医生已选择专长
|
||
$doctor_selected_expertise = $this->getDoctorSelectedExpertise($user_info['client_user_id']);
|
||
|
||
$expertise_ids = [];
|
||
|
||
if (!empty($doctor_selected_expertise)) {
|
||
$expertise_ids = array_column($doctor_selected_expertise, 'expertise_id');
|
||
}
|
||
|
||
// 获取全部专长
|
||
$fields = [
|
||
'expertise_id',
|
||
'expertise_name',
|
||
'expertise_sort',
|
||
];
|
||
$disease_class_expertise = DiseaseClassExpertise::getOrderList([], $fields);
|
||
|
||
foreach ($disease_class_expertise as &$item) {
|
||
$item['is_selected'] = 0;
|
||
if (in_array($item['expertise_id'], $expertise_ids)) {
|
||
$item['is_selected'] = 1;
|
||
}
|
||
}
|
||
|
||
return success($disease_class_expertise);
|
||
}
|
||
|
||
/**
|
||
* 获取医生已选择专长
|
||
* @param string $doctor_id
|
||
* @return array
|
||
*/
|
||
public function getDoctorSelectedExpertise(string $doctor_id): array
|
||
{
|
||
if (empty($doctor_id)) {
|
||
throw new BusinessException("缺少医生id");
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$doctor_expertise = DoctorExpertise::getDiseaseClassExpertiseList($params);
|
||
if (!empty($doctor_expertise)) {
|
||
foreach ($doctor_expertise as &$data) {
|
||
if (!empty($data['DiseaseClassExpertise'])) {
|
||
$data['expertise_name'] = $data['DiseaseClassExpertise']['expertise_name'];
|
||
}
|
||
unset($data['DiseaseClassExpertise']);
|
||
}
|
||
}
|
||
|
||
return $doctor_expertise->toArray();
|
||
}
|
||
|
||
/**
|
||
* 获取医生银行卡
|
||
* @return array
|
||
*/
|
||
public function getDoctorBankCard(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$doctor_bank_card = DoctorBankCard::getWithBankOne($params);
|
||
if (empty($doctor_bank_card)) {
|
||
return success();
|
||
}
|
||
|
||
$data = array();
|
||
$data['bank_card_id'] = $doctor_bank_card['bank_card_id'];
|
||
$data['bank_img_path'] = addAliyunOssWebsite($doctor_bank_card['BasicBank']['bank_img_path']);
|
||
$data['bank_name'] = $doctor_bank_card['BasicBank']['bank_name'];
|
||
$data['bank_card_code_mask'] = $doctor_bank_card['bank_card_code_mask'];
|
||
|
||
unset($doctor_bank_card);
|
||
|
||
return success($data);
|
||
}
|
||
|
||
/**
|
||
* 获取医生银行卡详情信息
|
||
* @return array
|
||
*/
|
||
public function getDoctorBankCardInfo(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$bank_card_id = $this->request->input('bank_card_id');// 医生银行卡id
|
||
|
||
// 获取医生详情数据
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_info_id',
|
||
'doctor_id',
|
||
'card_name',
|
||
'card_num_mask',
|
||
];
|
||
$user_doctor_info = UserDoctorInfo::getOne($params, $fields);
|
||
if (empty($user_doctor_info)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
|
||
}
|
||
|
||
$result = array();
|
||
$result['info'] = array();
|
||
$result['bank'] = array();
|
||
|
||
$info = array();
|
||
$info['card_name'] = $user_doctor_info['card_name'];
|
||
$info['card_num_mask'] = $user_doctor_info['card_num_mask'];
|
||
|
||
if (!empty($bank_card_id)) {
|
||
// 获取添加的银行卡信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['bank_card_id'] = $bank_card_id;
|
||
$doctor_bank_card = DoctorBankCard::getWithBankOne($params);
|
||
if (empty($doctor_bank_card)) {
|
||
return fail();
|
||
}
|
||
|
||
$bank = array();
|
||
$bank['bank_card_id'] = $doctor_bank_card['bank_card_id'];
|
||
$bank['bank_id'] = $doctor_bank_card['bank_id'];
|
||
$bank['bank_name'] = $doctor_bank_card['BasicBank']['bank_name'];
|
||
$bank['bank_card_code'] = $doctor_bank_card['bank_card_code'];// 银行卡号
|
||
$bank['province_id'] = $doctor_bank_card['province_id'];
|
||
$bank['province'] = $doctor_bank_card['province'];
|
||
$bank['city_id'] = $doctor_bank_card['city_id'];
|
||
$bank['city'] = $doctor_bank_card['city'];
|
||
$bank['county_id'] = $doctor_bank_card['county_id'];
|
||
$bank['county'] = $doctor_bank_card['county'];
|
||
}
|
||
|
||
$result['info'] = $info;// 用户数据
|
||
$result['bank'] = $bank ?? [];// 银行卡数据
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 新增绑定医生银行卡
|
||
* @return array
|
||
* @throws GuzzleException
|
||
*/
|
||
public function addDoctorBankCard(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$bank_id = $this->request->input('bank_id');
|
||
$bank_card_code = $this->request->input('bank_card_code');
|
||
$province_id = $this->request->input('province_id');
|
||
$city_id = $this->request->input('city_id');
|
||
$county_id = $this->request->input('county_id');
|
||
|
||
// 验证银行
|
||
$params = array();
|
||
$params['bank_id'] = $bank_id;
|
||
$basic_bank = BasicBank::getOne($params);
|
||
if (empty($basic_bank)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "开户行错误");
|
||
}
|
||
|
||
// 验证省市区
|
||
$areaService = new AreaService();
|
||
$area = $areaService->getAreaById($province_id, $city_id, $county_id);
|
||
if (empty($area)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "地区选择错误");
|
||
}
|
||
|
||
// 获取医生银行卡
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$doctor_bank_card = DoctorBankCard::getOne($params);
|
||
if (!empty($doctor_bank_card)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "已绑定银行卡");
|
||
}
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'is_bind_bank',
|
||
'iden_auth_status',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
if ($user_doctor['is_bind_bank'] == 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "已绑定银行卡");
|
||
}
|
||
|
||
if ($user_doctor['iden_auth_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先身份认证");
|
||
}
|
||
|
||
// 获取医生详情数据
|
||
$params = array();
|
||
$params['doctor_id'] = $user_doctor['doctor_id'];
|
||
$user_doctor_info = UserDoctorInfo::getOne($params);
|
||
if (empty($user_doctor_info)){
|
||
return fail(HttpEnumCode::HTTP_ERROR,"医生详情错误");
|
||
}
|
||
|
||
// 处理银行卡掩码
|
||
$bank_card_code_mask = Mask::maskBankCard($bank_card_code);
|
||
|
||
$app_env = config('app_env','dev');
|
||
if ($app_env != "dev"){
|
||
// 验证银行卡
|
||
$BankCard = new BankCard();
|
||
|
||
$params = array();
|
||
$params['bankCardNo'] = $bank_card_code;
|
||
$params['name'] = $user_doctor_info['card_name'];
|
||
$params['idCardNo'] = $user_doctor_info['card_num'];
|
||
$res = $BankCard->checkBankCard($params);
|
||
if (!empty($res)){
|
||
return fail(HttpEnumCode::HTTP_ERROR,$res);
|
||
}
|
||
}
|
||
|
||
Db::beginTransaction();
|
||
|
||
try {
|
||
// 新增医生银行卡
|
||
$data = array();
|
||
$data['doctor_id'] = $user_info['client_user_id'];
|
||
$data['bank_id'] = $bank_id;
|
||
$data['bank_card_code'] = $bank_card_code;
|
||
$data['bank_card_code_mask'] = $bank_card_code_mask;
|
||
$data['province_id'] = $province_id;
|
||
$data['province'] = $area['province']['area_name'];
|
||
$data['city_id'] = $city_id;
|
||
$data['city'] = $area['city']['area_name'];
|
||
$data['county_id'] = $county_id;
|
||
$data['county'] = $area['county']['area_name'];
|
||
$doctor_bank_card = DoctorBankCard::addDoctorBankCard($data);
|
||
if (empty($doctor_bank_card)) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR);
|
||
}
|
||
|
||
// 修改医生表绑定银行卡状态
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$data = array();
|
||
$data['is_bind_bank'] = 1;
|
||
UserDoctor::editUserDoctor($params, $data);
|
||
|
||
// 新增弹窗表
|
||
$data = array();
|
||
$data['user_id'] = $user_info['user_id'];
|
||
$data['app_type'] = 1;
|
||
$data['client_type'] = 2;
|
||
$data['popup_type'] = 1;
|
||
$data['popup_title'] = "温馨提示";
|
||
$data['popup_content'] = "快速了解在线问诊、公益问诊和快速问诊";
|
||
$data['popup_link'] = "/Pages/yishi/manual_detail/index?manual_id=1"; // 跳转地址
|
||
$popup = Popup::addPopup($data);
|
||
if (empty($popup)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR);
|
||
}
|
||
|
||
Db::commit();
|
||
} catch (\Exception $e) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
|
||
}
|
||
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 更换医生银行卡
|
||
* @return array
|
||
* @throws GuzzleException
|
||
*/
|
||
public function putDoctorBankCard(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$bank_card_id = $this->request->route('bank_card_id');
|
||
$bank_id = $this->request->input('bank_id');
|
||
$bank_card_code = $this->request->input('bank_card_code');
|
||
$province_id = $this->request->input('province_id');
|
||
$city_id = $this->request->input('city_id');
|
||
$county_id = $this->request->input('county_id');
|
||
|
||
// 获取医生银行卡
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['bank_card_id'] = $bank_card_id;
|
||
$doctor_bank_card = DoctorBankCard::getOne($params);
|
||
if (empty($doctor_bank_card)) {
|
||
return fail();
|
||
}
|
||
|
||
// 检测上次修改时间
|
||
$updated_at = strtotime($doctor_bank_card['updated_at']);
|
||
$moonth_start = strtotime(date("Y-m-01")); // 当月开始时间
|
||
$moonth_end = strtotime(date("Y-m-t")); // 当月结束时间
|
||
|
||
if ($updated_at >= $moonth_start && $updated_at <= $moonth_end) {
|
||
// 银行卡一月只能修改一次
|
||
return fail(HttpEnumCode::HTTP_ERROR, "银行卡每月只能修改一次");
|
||
}
|
||
|
||
// 验证银行
|
||
$params = array();
|
||
$params['bank_id'] = $bank_id;
|
||
$basic_bank = BasicBank::getOne($params);
|
||
if (empty($basic_bank)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "开户行错误");
|
||
}
|
||
|
||
// 验证省市区
|
||
$areaService = new AreaService();
|
||
$area = $areaService->getAreaById($province_id, $city_id, $county_id);
|
||
if (empty($area)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "地区选择错误");
|
||
}
|
||
|
||
// 处理银行卡掩码
|
||
$bank_card_code_mask = Mask::maskBankCard($bank_card_code);;
|
||
|
||
// 获取医生详情数据
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$user_doctor_info = UserDoctorInfo::getOne($params);
|
||
if (empty($user_doctor_info)){
|
||
return fail();
|
||
}
|
||
|
||
// 验证银行卡
|
||
$BankCard = new BankCard();
|
||
|
||
$params = array();
|
||
$params['bankCardNo'] = $bank_card_code;
|
||
$params['name'] = $user_doctor_info['card_name'];
|
||
$params['idCardNo'] = $user_doctor_info['card_num'];
|
||
$res = $BankCard->checkBankCard($params);
|
||
if (!empty($res)){
|
||
return fail(HttpEnumCode::HTTP_ERROR,$res);
|
||
}
|
||
|
||
// 修改银行卡
|
||
$params = array();
|
||
$params['bank_card_id'] = $bank_card_id;
|
||
|
||
$data = array();
|
||
$data['bank_id'] = $bank_id;
|
||
$data['bank_card_code'] = $bank_card_code;
|
||
$data['bank_card_code_mask'] = $bank_card_code_mask;
|
||
$data['province_id'] = $province_id;
|
||
$data['province'] = $area['province']['area_name'];
|
||
$data['city_id'] = $city_id;
|
||
$data['city'] = $area['city']['area_name'];
|
||
$data['county_id'] = $county_id;
|
||
$data['county'] = $area['county']['area_name'];
|
||
$data['updated_at'] = date('Y-m-d H:i:s', time());
|
||
DoctorBankCard::editDoctorBankCard($params, $data);
|
||
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 获取处方列表
|
||
* @return array
|
||
*/
|
||
public function getPrescriptionList(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$pharmacist_audit_status = $this->request->input('pharmacist_audit_status');
|
||
$page = $this->request->input('page', 1);
|
||
$per_page = $this->request->input('per_page', 10);
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'iden_auth_status',
|
||
'idcard_status',
|
||
'multi_point_status',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
if ($user_doctor['iden_auth_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成身份认证");
|
||
}
|
||
|
||
if ($user_doctor['idcard_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成实名认证");
|
||
}
|
||
|
||
if ($user_doctor['multi_point_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成多点执业认证");
|
||
}
|
||
|
||
// 获取处方数据
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['pharmacist_audit_status'] = $pharmacist_audit_status;
|
||
$params['is_delete'] = 0;
|
||
|
||
if ($pharmacist_audit_status == 1){
|
||
// 审核通过
|
||
$params['platform_audit_status'] = 1;
|
||
}
|
||
|
||
$order_prescriptions = OrderPrescription::getWithIcdPage($params,['*'],$page,$per_page);
|
||
if (empty($order_prescriptions)) {
|
||
return success($order_prescriptions);
|
||
}
|
||
|
||
// 处理数据
|
||
$result = array();
|
||
|
||
foreach ($order_prescriptions['data'] as $order_prescription) {
|
||
$data = array();
|
||
$data['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
$data['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
|
||
$data['patient_name'] = $order_prescription['patient_name'];
|
||
$data['patient_sex'] = $order_prescription['patient_sex'];
|
||
$data['patient_age'] = $order_prescription['patient_age'];
|
||
$data['created_at'] = date('Y-m-d H:i:s',strtotime($order_prescription['created_at'])); // 开方时间
|
||
$data['pharmacist_audit_status'] = $order_prescription['pharmacist_audit_status'];// 药师审核状态(0:审核中 1:审核成功 2:审核驳回)
|
||
$data['pharmacist_fail_reason'] = $order_prescription['pharmacist_fail_reason'];// 驳回原因
|
||
$data['platform_audit_status'] = $order_prescription['platform_audit_status'];// 处方平台审核状态(0:审核中 1:审核成功 2:审核驳回)
|
||
$data['platform_fail_reason'] = $order_prescription['platform_fail_reason'];// 处方平台驳回原因
|
||
|
||
// 获取病例信息
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
|
||
$params['status'] = 1;
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params);
|
||
if (empty($order_inquiry_case)) {
|
||
return fail(HttpEnumCode::SERVER_ERROR);
|
||
}
|
||
|
||
// 病情描述
|
||
$data['disease_desc'] = $order_inquiry_case['disease_desc'];
|
||
|
||
// 患病时长
|
||
if (empty($order_inquiry_case['diagnosis_date'])) {
|
||
$data['diagnosis_date'] = "";
|
||
} else {
|
||
$data['diagnosis_date'] = date('Y-m-d', strtotime($order_inquiry_case['diagnosis_date']));
|
||
}
|
||
|
||
// 疾病信息
|
||
$data['order_prescription_icd'] = $order_prescription['OrderPrescriptionIcd'] ?? [];
|
||
|
||
// 患者id
|
||
$data['patient_id'] = $order_inquiry_case['patient_id'];
|
||
|
||
// 医生id
|
||
$data['doctor_id'] = $order_prescription['doctor_id'];
|
||
|
||
$result[] = $data;
|
||
}
|
||
|
||
unset($order_prescriptions['data']);
|
||
$order_prescriptions['data'] = $result;
|
||
|
||
return success($order_prescriptions);
|
||
}
|
||
|
||
/**
|
||
* 获取医生个人中心数据
|
||
* @return array
|
||
*/
|
||
public function getDoctorCenter(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'user_name',
|
||
'iden_auth_status',
|
||
'idcard_status',
|
||
'multi_point_status',
|
||
'is_bind_bank',
|
||
'avatar',
|
||
'doctor_title',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
if ($user_doctor['iden_auth_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成身份认证");
|
||
}
|
||
|
||
if ($user_doctor['idcard_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成实名认证");
|
||
}
|
||
|
||
if ($user_doctor['is_bind_bank'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先绑定结算银行卡");
|
||
}
|
||
|
||
$user_doctor = $user_doctor->toArray();
|
||
|
||
// 获取医生账户余额-未提现金额
|
||
// $DoctorAccountService = new DoctorAccountService();
|
||
// $balance_account = $DoctorAccountService->getDoctorBalanceAccount($user_info['client_user_id']);
|
||
// if ($balance_account > 0) {
|
||
// $balance_account = floor($balance_account * 100) / 100;
|
||
// }
|
||
//
|
||
// // 获取医生当日接诊的订单金额
|
||
// $InquiryService = new InquiryService();
|
||
// $estimate_income = $InquiryService->getDoctorDayAmountTotal($user_info['client_user_id'], date('Y-m-d', time()));
|
||
// if (!empty($estimate_income)) {
|
||
// $estimate_income = floor($estimate_income * 0.75 * 100) / 100;
|
||
// }
|
||
|
||
$user_doctor['avatar'] = addAliyunOssWebsite($user_doctor['avatar']);
|
||
// $user_doctor['balance_account'] = $balance_account;
|
||
// $user_doctor['estimate_income'] = $estimate_income;
|
||
|
||
$user_doctor['doctor_title'] = DoctorTitleCode::getMessage($user_doctor['doctor_title']);
|
||
return success($user_doctor);
|
||
}
|
||
|
||
/**
|
||
* 获取常用语列表
|
||
* @return array
|
||
*/
|
||
public function getDoctorWords(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$words_type = $this->request->input('words_type');
|
||
|
||
$result = array();
|
||
|
||
// 获取系统常用语
|
||
$params = array();
|
||
$params['basics_words_type'] = $words_type;
|
||
$params['basics_words_status'] = 1;
|
||
$basic_words = BasicWord::getList($params);
|
||
if (!empty($basic_words)) {
|
||
foreach ($basic_words as $item) {
|
||
$data = array();
|
||
$data['words'] = $item['basics_words'];
|
||
$data['doctor_words_id'] = "";
|
||
$data['is_system'] = 1;
|
||
$result[] = $data;
|
||
}
|
||
}
|
||
|
||
// 获取医生自定义常用语
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['words_type'] = $words_type;
|
||
$params['words_status'] = 1;
|
||
$doctor_words = DoctorWord::getList($params);
|
||
if (!empty($doctor_words)) {
|
||
foreach ($doctor_words as $item) {
|
||
$data = array();
|
||
$data['words'] = $item['words'];
|
||
$data['doctor_words_id'] = $item['doctor_words_id'];
|
||
$data['is_system'] = 0;
|
||
$result[] = $data;
|
||
}
|
||
}
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 新增常用语列表
|
||
* @return array
|
||
*/
|
||
public function addDoctorWords(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$words = $this->request->input('words');
|
||
$words_type = $this->request->input('words_type');
|
||
|
||
// 查询是否重复
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['words_type'] = $words_type;
|
||
$params['words'] = $words;
|
||
$doctor_words = DoctorWord::getOne($params);
|
||
if (!empty($doctor_words)) {
|
||
if ($doctor_words['words_status'] == 0) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "此常用语已被禁用");
|
||
} else {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请勿重复添加");
|
||
}
|
||
}
|
||
|
||
$data = array();
|
||
$data['doctor_id'] = $user_info['client_user_id'];
|
||
$data['words_type'] = $words_type;
|
||
$data['words_status'] = 1;
|
||
$data['sort'] = 0;
|
||
$data['words'] = $words;
|
||
|
||
$doctor_words = DoctorWord::addDoctorWord($data);
|
||
if (empty($doctor_words)) {
|
||
return fail(HttpEnumCode::SERVER_ERROR);
|
||
}
|
||
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 删除常用语
|
||
* @return array
|
||
*/
|
||
public function deleteDoctorWords(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$doctor_words_id = $this->request->route('doctor_words_id');
|
||
|
||
// 查询是否重复
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['doctor_words_id'] = $doctor_words_id;
|
||
$doctor_words = DoctorWord::getOne($params);
|
||
if (empty($doctor_words)) {
|
||
return fail();
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_words_id'] = $doctor_words['doctor_words_id'];
|
||
DoctorWord::deleteDoctorWord($params);
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 获取医生评价
|
||
* @return array
|
||
*/
|
||
public function getDoctorEvaluationList(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$doctor_id = $this->request->input('doctor_id');
|
||
$evaluation_type = $this->request->input('evaluation_type', 1);
|
||
$page = $this->request->input('page', 1);
|
||
$per_page = $this->request->input('per_page', 10);
|
||
|
||
if (empty($user_info)) {
|
||
return fail();
|
||
}
|
||
|
||
// 4-5分为好评、3分为中评、2-1分为差评
|
||
if ($evaluation_type == 1) {
|
||
// 全部
|
||
$avg_score_params = [0, 100];
|
||
} elseif ($evaluation_type == 2) {
|
||
// 好评
|
||
$avg_score_params = [80, 100];
|
||
} elseif ($evaluation_type == 3) {
|
||
// 中/差评
|
||
$avg_score_params = [0, 79];
|
||
} else {
|
||
return fail();
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$order_evaluation = OrderEvaluation::getScorePage($params, $avg_score_params,['*'],$page,$per_page);
|
||
if (!empty($order_evaluation['data'])) {
|
||
foreach ($order_evaluation['data'] as &$item) {
|
||
$item['avg_score'] = floor($item['avg_score'] * 0.05);
|
||
$item['inquiry_type'] = $item['OrderInquiry']['inquiry_type'];
|
||
$item['inquiry_mode'] = $item['OrderInquiry']['inquiry_mode'];
|
||
|
||
// 获取问诊病例
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $item['OrderInquiry']['order_inquiry_id'];
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params);
|
||
if (!empty($order_inquiry_case)){
|
||
$item['disease_class_name'] = $order_inquiry_case['disease_class_name'];
|
||
}
|
||
|
||
unset($item['OrderInquiry']);
|
||
}
|
||
}
|
||
|
||
// 获取其他类型评论总数
|
||
if ($evaluation_type == 1) {
|
||
// 好评
|
||
$avg_score_params = [80, 100];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$good_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
|
||
// 中/差评
|
||
$avg_score_params = [0, 79];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$bad_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
}
|
||
|
||
if ($evaluation_type == 2) {
|
||
// 全部+
|
||
$avg_score_params = [0, 100];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$total_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
|
||
// 中/差评
|
||
$avg_score_params = [0, 79];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$bad_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
|
||
}
|
||
|
||
if ($evaluation_type == 3) {
|
||
// 全部+
|
||
$avg_score_params = [0, 100];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$total_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
|
||
// 好评
|
||
$avg_score_params = [80, 100];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$good_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params);
|
||
}
|
||
|
||
$order_evaluation['total_quantity'] = $total_quantity ?? $order_evaluation['total'];
|
||
$order_evaluation['good_quantity'] = $good_quantity ?? $order_evaluation['total'];
|
||
$order_evaluation['bad_quantity'] = $bad_quantity ?? $order_evaluation['total'];
|
||
|
||
return success($order_evaluation);
|
||
}
|
||
|
||
/**
|
||
* 获取医生信息
|
||
* @return array
|
||
*/
|
||
public function getDoctorCenterInfo(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'user_name',
|
||
'iden_auth_status',
|
||
'idcard_status',
|
||
'multi_point_status',
|
||
'brief_introduction',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
// 获取医生详情
|
||
$fields = [
|
||
'card_name',
|
||
'card_num_mask',
|
||
];
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$user_doctor_info = UserDoctorInfo::getOne($params, $fields);
|
||
if (empty($user_doctor_info)) {
|
||
$user_doctor['card_name'] = "";
|
||
$user_doctor['card_num_mask'] = "";
|
||
} else {
|
||
$user_doctor['card_name'] = $user_doctor_info['card_name'];
|
||
$user_doctor['card_num_mask'] = $user_doctor_info['card_num_mask'];
|
||
}
|
||
|
||
return success($user_doctor->toArray());
|
||
}
|
||
|
||
/**
|
||
* 获取医生证书信息
|
||
* @return array
|
||
*/
|
||
public function getDoctorCret(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'iden_auth_status',
|
||
'idcard_status',
|
||
'multi_point_status',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
$res = $this->checkDoctorAuth($user_doctor,true,true,false);
|
||
if ($res !== true) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, $res);
|
||
}
|
||
|
||
// 获取医生详情
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$user_doctor_info = UserDoctorInfo::getOne($params);
|
||
if (empty($user_doctor_info)) {
|
||
return success();
|
||
}
|
||
|
||
$result = array();
|
||
|
||
// 医师执业证
|
||
if (!empty($user_doctor_info['license_cert'])) {
|
||
$license_cert = explode(',', $user_doctor_info['license_cert']);
|
||
foreach ($license_cert as &$item) {
|
||
$item = addAliyunOssWebsite($item);
|
||
}
|
||
$result['license_cert'] = $license_cert;
|
||
}
|
||
|
||
// 医师职称证
|
||
if (!empty($user_doctor_info['qualification_cert'])) {
|
||
$qualification_cert = explode(',', $user_doctor_info['qualification_cert']);
|
||
foreach ($qualification_cert as &$item) {
|
||
$item = addAliyunOssWebsite($item);
|
||
}
|
||
$result['qualification_cert'] = $qualification_cert;
|
||
}
|
||
|
||
// 医师资格证
|
||
if (!empty($user_doctor_info['work_cert'])) {
|
||
$work_cert = explode(',', $user_doctor_info['work_cert']);
|
||
foreach ($work_cert as &$item) {
|
||
$item = addAliyunOssWebsite($item);
|
||
}
|
||
$result['work_cert'] = $work_cert;
|
||
}
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 获取处方详情
|
||
* @return array
|
||
*/
|
||
public function getPrescriptionInfo(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$order_inquiry_id = $this->request->input('order_inquiry_id');
|
||
$order_prescription_id = $this->request->input('order_prescription_id');
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'iden_auth_status',
|
||
'idcard_status',
|
||
'multi_point_status',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
$res = $this->checkDoctorAuth($user_doctor);
|
||
if ($res !== true) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, $res);
|
||
}
|
||
|
||
// 获取患者病例表
|
||
$fields = [
|
||
'inquiry_case_id',
|
||
'name',
|
||
'sex',
|
||
'age',
|
||
'disease_desc',
|
||
];
|
||
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry_id;
|
||
$params['status'] = 1;
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params, $fields);
|
||
if (empty($order_inquiry_case)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "患者病例信息错误");
|
||
}
|
||
|
||
// 获取用药意向
|
||
$CaseService = new CaseService();
|
||
$inquiry_case_product = $CaseService->getCaseProductlist($order_inquiry_case['inquiry_case_id']);
|
||
|
||
if (!empty($order_prescription_id)) {
|
||
// 获取处方数据
|
||
$params = array();
|
||
$params['order_prescription_id'] = $order_prescription_id;
|
||
$order_prescription = OrderPrescription::getOne($params);
|
||
if (empty($order_prescription)) {
|
||
return fail();
|
||
}
|
||
|
||
// 订单-商品订单列表
|
||
$OrderPrescriptionService = new OrderPrescriptionService();
|
||
$order_prescription_product = $OrderPrescriptionService->getproductList($order_prescription_id);
|
||
|
||
// 获取处方关联疾病表
|
||
$fields = [
|
||
'prescription_icd_id',
|
||
'icd_id',
|
||
'icd_name',
|
||
];
|
||
$params = array();
|
||
$params['order_prescription_id'] = $order_prescription_id;
|
||
$order_prescription_icd = OrderPrescriptionIcd::getList($params, $fields);
|
||
}
|
||
|
||
$result = array();
|
||
$result['inquiry_case_product'] = $inquiry_case_product;// 用药意向
|
||
$result['prescription_product'] = $order_prescription_product ?? [];// 开方药品
|
||
$result['case'] = $order_inquiry_case;// 病例数据
|
||
$result['prescription_icd'] = $order_prescription_icd ?? [];// 处方诊断疾病
|
||
$result['prescription']['doctor_advice'] = $order_prescription['doctor_advice'] ?? "";// 医嘱
|
||
$result['prescription']['prescription_status'] = $order_prescription['prescription_status'] ?? "";// 处方状态(1:待审核 2:待使用 3:已失效 4:已使用)
|
||
$result['prescription']['pharmacist_audit_status'] = $order_prescription['pharmacist_audit_status'] ?? "";// 药师审核状态(0:审核中 1:审核成功 2:审核驳回)
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 检测是否可以开具处方
|
||
* @return array
|
||
*/
|
||
public function checkOpenPrescription(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$order_inquiry_id = $this->request->input('order_inquiry_id');
|
||
|
||
$result = array();
|
||
$result['status'] = 1;
|
||
$result['message'] = "成功";
|
||
$result['data'] = [];
|
||
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry_id;
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$order_prescription = OrderPrescription::getOne($params);
|
||
if (empty($order_prescription)){
|
||
return success($result);
|
||
}
|
||
|
||
if ($order_prescription['prescription_status'] == 1){
|
||
$result['status'] = 2;
|
||
$result['message'] = "处方审核中,请勿重复开具";
|
||
$result['data']['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
$result['data']['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
|
||
return success($result);
|
||
}
|
||
|
||
if ($order_prescription['prescription_status'] == 2){
|
||
$result['status'] = 2;
|
||
$result['message'] = "您已为患者开具处方,请勿重复开具";
|
||
$result['data']['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
$result['data']['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
|
||
return success($result);
|
||
}
|
||
|
||
$result['status'] = 2;
|
||
$result['message'] = "您已为患者开具处方,请勿重复开具";
|
||
$result['data']['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
$result['data']['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 修改处方
|
||
* 暂时去除修改处方
|
||
* @return array
|
||
*/
|
||
public function putPrescription(): array
|
||
{
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "操作失败");
|
||
//
|
||
// $user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
//
|
||
// $order_prescription_id = $this->request->input('order_prescription_id');
|
||
// $prescription_icd = $this->request->input('prescription_icd');
|
||
// $doctor_advice = $this->request->input('doctor_advice');
|
||
// $prescription_product = $this->request->input('prescription_product');
|
||
//
|
||
// // 获取医生信息
|
||
// $params = array();
|
||
// $params['doctor_id'] = $user_info['client_user_id'];
|
||
//
|
||
// $user_doctor = UserDoctor::getOne($params);
|
||
// if (empty($user_doctor)) {
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
// }
|
||
//
|
||
// $res = $this->checkDoctorAuth($user_doctor);
|
||
// if ($res !== true) {
|
||
// return fail(HttpEnumCode::HTTP_ERROR, $res);
|
||
// }
|
||
//
|
||
// // 获取处方数据
|
||
// $params = array();
|
||
// $params['order_prescription_id'] = $order_prescription_id;
|
||
// $params['doctor_id'] = $user_info['client_user_id'];
|
||
// $order_prescription = OrderPrescription::getOne($params);
|
||
// if (empty($order_prescription)) {
|
||
// return fail();
|
||
// }
|
||
//
|
||
// // 检测处方状态
|
||
// if ($order_prescription['prescription_status'] == 4) {
|
||
// // 已使用
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "处方已使用,无法更改");
|
||
// }
|
||
//
|
||
// if ($order_prescription['is_delete'] == 1) {
|
||
// // 已使用
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "处方已删除,无法更改");
|
||
// }
|
||
//
|
||
// if ($order_prescription['prescription_status'] == 1 && $order_prescription['pharmacist_audit_status'] == 0) {
|
||
// // 已使用
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "处方审核中,不允许修改");
|
||
// }
|
||
//
|
||
// // 获取处方订单数据
|
||
// $params = array();
|
||
// $params['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
|
||
// $order_inquiry = OrderInquiry::getOne($params);
|
||
// if (empty($order_inquiry)){
|
||
// return fail(HttpEnumCode::SERVER_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,"问诊已取消,无法重开处方");
|
||
// }
|
||
//
|
||
// if ($order_inquiry['inquiry_status'] != 4){
|
||
// return fail(HttpEnumCode::HTTP_ERROR,"问诊状态错误,无法重开处方");
|
||
// }
|
||
//
|
||
// Db::beginTransaction();
|
||
//
|
||
// try {
|
||
// // 删除订单-处方关联疾病表
|
||
// $params = array();
|
||
// $params['order_prescription_id'] = $order_prescription_id;
|
||
// OrderPrescriptionIcd::deleteOrderPrescriptionIcd($params);
|
||
//
|
||
// // 处方疾病数据
|
||
// foreach ($prescription_icd as $item) {
|
||
// // 获取疾病信息
|
||
// $params = array();
|
||
// $params['icd_id'] = $item;
|
||
// $disease_class_icd = DiseaseClassIcd::getOne($params);
|
||
// if (empty($disease_class_icd)) {
|
||
// Db::rollBack();
|
||
// return fail();
|
||
// }
|
||
//
|
||
// // 新增处方疾病
|
||
// $data = array();
|
||
// $data['order_prescription_id'] = $order_prescription_id;
|
||
// $data['icd_id'] = $item;
|
||
// $data['icd_name'] = $disease_class_icd['icd_name'];
|
||
// $data['icd_code'] = $disease_class_icd['icd_code'];
|
||
// $order_prescription_icd = OrderPrescriptionIcd::addOrderPrescriptionIcd($data);
|
||
// if (empty($order_prescription_icd)) {
|
||
// Db::rollBack();
|
||
// return fail();
|
||
// }
|
||
//
|
||
// unset($disease_class_icd);
|
||
// }
|
||
//
|
||
// // 删除订单-处方药品表
|
||
// $params = array();
|
||
// $params['order_prescription_id'] = $order_prescription_id;
|
||
// OrderPrescriptionProduct::deleteOrderPrescriptionProduct($params);
|
||
//
|
||
// // 处方商品数据
|
||
// $product_name = "";
|
||
// foreach ($prescription_product as $item) {
|
||
// // 获取商品数据
|
||
// $params = array();
|
||
// $params['product_id'] = $item['product_id'];
|
||
// $product = Product::getWithAmountOne($params);
|
||
// if (empty($product)) {
|
||
// Db::rollBack();
|
||
// return fail();
|
||
// }
|
||
//
|
||
// if (empty($product['ProductPlatformAmount'])) {
|
||
// // 无药品库存数据
|
||
// Db::rollBack();
|
||
// return fail();
|
||
// }
|
||
//
|
||
// // 检测药品库存数据
|
||
// if ($item['prescription_product_num'] > $product['ProductPlatformAmount']['stock']) {
|
||
// // 库存不足
|
||
// Db::rollBack();
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "药品" . $product['product_name'] . "库存不足");
|
||
// }
|
||
//
|
||
// // 新增订单-处方药品表
|
||
// $data = array();
|
||
// $data['order_prescription_id'] = $order_prescription_id;
|
||
// $data['product_id'] = $item['product_id'];
|
||
// $data['prescription_product_num'] = $item['prescription_product_num'];
|
||
// $data['product_name'] = $product['product_name'];
|
||
// $data['product_spec'] = $product['product_spec'];
|
||
// $data['license_number'] = $product['license_number'];
|
||
// $data['manufacturer'] = $product['manufacturer'];
|
||
// $data['single_unit'] = $item['single_unit'] ?? $product['single_unit'];
|
||
// $data['single_use'] = $item['single_use'] ?? $product['single_use'];
|
||
// $data['packaging_unit'] = $item['packaging_unit'] ?? $product['packaging_unit'];
|
||
// $data['frequency_use'] = $item['frequency_use'] ?? $product['frequency_use'];
|
||
// $data['available_days'] = $item['available_days'] ?? $product['available_days'];
|
||
// $order_prescription_product = OrderPrescriptionProduct::addOrderPrescriptionProduct($data);
|
||
// if (empty($order_prescription_product)) {
|
||
// Db::rollBack();
|
||
// return fail();
|
||
// }
|
||
//
|
||
// $product_name = $product_name . ";" . $product['product_name'];
|
||
// unset($product);
|
||
// }
|
||
//
|
||
// $OrderPrescriptionService = new OrderPrescriptionService();
|
||
// $prescription_open_result = $OrderPrescriptionService->openPrescription($order_prescription->order_prescription_id,$user_info['user_id']);
|
||
// if (empty($prescription_open_result['prescription_img_url'])){
|
||
// Db::rollBack();
|
||
// return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
// }
|
||
//
|
||
// // 修改处方表
|
||
// $data = array();
|
||
// $data['prescription_img'] = $prescription_open_result['prescription_img_url'];
|
||
// $data['doctor_created_time'] = date('Y-m-d H:i:s',time());
|
||
// $data['prescription_status'] = 1; // 处方状态(1:待审核 3:待使用 4:已失效 5:已使用)
|
||
// $data['pharmacist_audit_status'] = 0; // 药师审核驳回原因
|
||
// $data['pharmacist_fail_reason'] = ""; // 药师审核驳回原因
|
||
// $data['platform_audit_status'] = 0; // 处方平台审核状态(0:审核中 1:审核成功 2:审核驳回)
|
||
// $data['platform_fail_reason'] = ""; // 处方平台驳回原因
|
||
// $data['doctor_created_time'] = date('Y-m-d H:i:s',time());
|
||
// if ($order_prescription['doctor_advice'] != $doctor_advice) {
|
||
// $data['doctor_advice'] = $doctor_advice; // 医嘱
|
||
// }
|
||
//
|
||
// $params = array();
|
||
// $params['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
// OrderPrescription::edit($params,$data);
|
||
//
|
||
// // 发送IM消息-处方已开具
|
||
// $imService = new ImService();
|
||
// $imService->prescriptionIssued($order_inquiry,$user_doctor['user_id'],$order_inquiry['user_id'],$product_name,(string)$order_prescription['order_prescription_id'],6);
|
||
//
|
||
// // 加入分配药师队列
|
||
// $data = array();
|
||
// $data['order_prescription_id'] = $order_prescription_id;
|
||
//
|
||
// $message = new AssignPharmacistProducer($data);
|
||
// $producer = ApplicationContext::getContainer()->get(Producer::class);
|
||
// $result = $producer->produce($message);
|
||
// if (!$result) {
|
||
// Db::rollBack();
|
||
// return fail(HttpEnumCode::SERVER_ERROR);
|
||
// }
|
||
//
|
||
// Db::commit();
|
||
// } catch (\Exception $e) {
|
||
// Db::rollBack();
|
||
// return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
|
||
// }
|
||
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 新增处方
|
||
* @return array
|
||
* @throws ContainerExceptionInterface
|
||
* @throws NotFoundExceptionInterface
|
||
*/
|
||
public function addPrescription(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$order_inquiry_id = $this->request->input('order_inquiry_id');
|
||
$prescription_icd = $this->request->input('prescription_icd');
|
||
$doctor_advice = $this->request->input('doctor_advice');
|
||
$prescription_product = $this->request->input('prescription_product');
|
||
$disease_desc = $this->request->input('disease_desc'); // 病情主诉
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$user_doctor = UserDoctor::getOne($params);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
$res = $this->checkDoctorAuth($user_doctor);
|
||
if ($res !== true) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, $res);
|
||
}
|
||
|
||
if ($user_doctor['multi_point_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成多点执业认证");
|
||
}
|
||
|
||
// 获取医生问诊配置-问诊购药
|
||
$params = array();
|
||
$params['doctor_id'] = $user_doctor['doctor_id'];
|
||
$params['inquiry_type'] = 4;
|
||
$params['inquiry_mode'] = 1;
|
||
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
|
||
if (empty($doctor_inquiry_config)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请联系客服开启问诊购药服务");
|
||
}
|
||
|
||
if ($doctor_inquiry_config['is_enable'] == 0){
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请联系客服开启问诊购药服务");
|
||
}
|
||
|
||
// 获取问诊订单数据
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['order_inquiry_id'] = $order_inquiry_id;
|
||
$order_inquiry = OrderInquiry::getOne($params);
|
||
if (empty($order_inquiry)) {
|
||
return fail();
|
||
}
|
||
|
||
if (in_array($order_inquiry['inquiry_status'], [1, 2, 3,5, 6, 7])) {
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return fail(HttpEnumCode::HTTP_ERROR, "订单无法开具处方");
|
||
}
|
||
|
||
// 检测处方是否重复开具
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$order_prescription = OrderPrescription::getList($params);
|
||
if (!empty($order_prescription)) {
|
||
// 药师审核状态(0:审核中 1:审核成功 2:审核驳回)
|
||
foreach ($order_prescription as $item){
|
||
if ($item['pharmacist_audit_status'] == 0){
|
||
return fail(HttpEnumCode::HTTP_ERROR, "处方正在审核中,请耐心等待");
|
||
}
|
||
|
||
if ($item['pharmacist_audit_status'] == 1){
|
||
return fail(HttpEnumCode::HTTP_ERROR, "您已开具处方,请勿重复开具");
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取患者问诊病例
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params);
|
||
if (empty($order_inquiry_case)){
|
||
return fail(HttpEnumCode::HTTP_ERROR, "患者病例数据错误");
|
||
}
|
||
|
||
if (empty($order_inquiry_case['disease_desc']) && empty($disease_desc)){
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请填写病情主诉");
|
||
}
|
||
|
||
Db::beginTransaction();
|
||
$generator = $this->container->get(IdGeneratorInterface::class);
|
||
|
||
try {
|
||
// 修改问诊病例表
|
||
if (empty($order_inquiry_case['disease_desc'])){
|
||
$data = array();
|
||
$data['disease_desc'] = $disease_desc;
|
||
|
||
$params = array();
|
||
$params['inquiry_case_id'] = $order_inquiry_case['inquiry_case_id'];
|
||
OrderInquiryCase::edit($params,$data);
|
||
}
|
||
|
||
// 新增处方表
|
||
$data = array();
|
||
$data['order_inquiry_id'] = $order_inquiry_id;
|
||
$data['doctor_id'] = $user_info['client_user_id'];
|
||
$data['patient_id'] = $order_inquiry['patient_id'];
|
||
$data['family_id'] = $order_inquiry['family_id'];
|
||
$data['prescription_status'] = 1;
|
||
$data['doctor_created_time'] = date('Y-m-d H:i:s',time());
|
||
$data['prescription_code'] = $generator->generate(); // 处方编号
|
||
$data['doctor_name'] = $user_doctor['user_name']; // 医生名称
|
||
$data['patient_name'] = $order_inquiry['patient_name'];
|
||
$data['patient_sex'] = $order_inquiry['patient_sex'];
|
||
$data['patient_age'] = $order_inquiry['patient_age'];
|
||
$data['doctor_advice'] = $doctor_advice;
|
||
$order_prescription = OrderPrescription::addOrderPrescription($data);
|
||
if (empty($order_prescription)) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
}
|
||
|
||
// 疾病数据
|
||
foreach ($prescription_icd as $item) {
|
||
// 获取疾病信息
|
||
$params = array();
|
||
$params['icd_id'] = $item;
|
||
$disease_class_icd = DiseaseClassIcd::getOne($params);
|
||
if (empty($disease_class_icd)) {
|
||
Db::rollBack();
|
||
return fail();
|
||
}
|
||
|
||
// 新增处方疾病
|
||
$data = array();
|
||
$data['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
$data['icd_id'] = $item;
|
||
$data['icd_name'] = $disease_class_icd['icd_name'];
|
||
$data['icd_code'] = $disease_class_icd['icd_code'];
|
||
$order_prescription_icd = OrderPrescriptionIcd::addOrderPrescriptionIcd($data);
|
||
if (empty($order_prescription_icd)) {
|
||
Db::rollBack();
|
||
return fail();
|
||
}
|
||
|
||
unset($disease_class_icd);
|
||
}
|
||
|
||
// 商品数据
|
||
$product_name = "";
|
||
foreach ($prescription_product as $item) {
|
||
// 获取商品数据
|
||
$params =array();
|
||
$params['product_id'] = $item['product_id'];
|
||
$product = Product::getOne($params);
|
||
if (empty($product)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR,"商品错误");
|
||
}
|
||
|
||
if ($product['product_status'] == 2){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR,"药品" . $product['product_name'] . "已下架");
|
||
}
|
||
|
||
if ($product['is_delete'] == 1){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR,"药品" . $product['product_name'] . "已被删除,无法开具");
|
||
}
|
||
|
||
// 检测药品是否超出最大可开数
|
||
if ($item['prescription_product_num'] > $product['prescription_num']) {
|
||
// 库存不足
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "药品" . $product['product_name'] . "超出最大可开方数");
|
||
}
|
||
|
||
// 获取商品库存
|
||
$params =array();
|
||
$params['product_platform_id'] = $product['product_platform_id'];
|
||
$product_platform_amount = ProductPlatformAmount::getOne($params);
|
||
if (empty($product_platform_amount)) {
|
||
// 无药品库存数据
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR,"无药品库存数据");
|
||
}
|
||
|
||
if ($product_platform_amount['stock'] <= 0){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR,"商品库存不足");
|
||
}
|
||
|
||
|
||
|
||
// 检测药品库存数据
|
||
if ($item['prescription_product_num'] > $product['ProductPlatformAmount']['stock']) {
|
||
// 库存不足
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "药品" . $product['product_name'] . "库存不足");
|
||
}
|
||
|
||
// 新增订单-处方药品表
|
||
$data = array();
|
||
$data['order_prescription_id'] = $order_prescription['order_prescription_id'];
|
||
$data['product_id'] = $item['product_id'];
|
||
$data['prescription_product_num'] = $item['prescription_product_num'];
|
||
$data['product_name'] = $product['product_name'];
|
||
$data['product_spec'] = $product['product_spec'];
|
||
$data['license_number'] = $product['license_number'];
|
||
$data['manufacturer'] = $product['manufacturer'];
|
||
$data['single_unit'] = $item['single_unit'] ?? $product['single_unit'];
|
||
$data['single_use'] = $item['single_use'] ?? $product['single_use'];
|
||
$data['packaging_unit'] = $item['packaging_unit'] ?? $product['packaging_unit'];
|
||
$data['frequency_use'] = $item['frequency_use'] ?? $product['frequency_use'];
|
||
$data['available_days'] = $item['available_days'] ?? $product['available_days'];
|
||
$order_prescription_product = OrderPrescriptionProduct::addOrderPrescriptionProduct($data);
|
||
if (empty($order_prescription_product)) {
|
||
Db::rollBack();
|
||
return fail();
|
||
}
|
||
|
||
if (empty($product_name)){
|
||
$product_name = $product['product_name'];
|
||
}else{
|
||
$product_name = $product_name . ";" . $product['product_name'];
|
||
}
|
||
|
||
unset($product);
|
||
}
|
||
|
||
// 开具处方
|
||
$OrderPrescriptionService = new OrderPrescriptionService();
|
||
dump($user_info['user_id']);
|
||
$prescription_open_result = $OrderPrescriptionService->openPrescription($order_prescription->order_prescription_id,2,$user_info['user_id']);
|
||
if (empty($prescription_open_result['prescription_img_oss_path']) || empty($prescription_open_result['file_id'])){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
}
|
||
|
||
// 获取系统配置
|
||
$params = array();
|
||
$params['system_config_id'] = 1;
|
||
$system_config = SystemConfig::getOne($params);
|
||
if (empty($system_config)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
}
|
||
|
||
// 获取药师数据
|
||
$params = array();
|
||
$user_pharmacist = UserPharmacist::getOne($params);
|
||
if (empty($user_pharmacist)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
}
|
||
|
||
// 修改处方表
|
||
$data = array();
|
||
$data['pharmacist_id'] = $user_pharmacist['pharmacist_id']; // 药师id 现固定为此用户,后续可以考虑开启队列
|
||
$data['is_auto_phar_verify'] = $system_config['is_auto_phar_verify_prescription'];// 是否药师自动审核(0:否 1:是)
|
||
$data['doctor_created_time'] = date('Y-m-d H:i:s',time());
|
||
|
||
$params = array();
|
||
$params['order_prescription_id'] = $order_prescription->order_prescription_id;
|
||
OrderPrescription::edit($params,$data);
|
||
|
||
// 保存至ca处方文件表
|
||
$data = array();
|
||
$data['order_prescription_id'] = $order_prescription->order_prescription_id;
|
||
$data['doctor_ca_file_id'] = $prescription_open_result['file_id'];
|
||
$data['prescription_img_oss_path'] = $prescription_open_result['prescription_img_oss_path'];
|
||
$order_prescription_file = OrderPrescriptionFile::addOrderPrescriptionFile($data);
|
||
if (empty($order_prescription_file)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
}
|
||
|
||
// 检测药师自动审核配置开启状态
|
||
if ($system_config['is_auto_phar_verify_prescription'] == 1){
|
||
// 添加药师自动签章审核队列
|
||
$data = array();
|
||
$data['prescription_file_id'] = (string)$order_prescription_file->prescription_file_id;
|
||
$data['order_prescription_id'] = (string)$order_prescription->order_prescription_id;
|
||
|
||
$message = new AutoPharmacistCaVerifyDelayDirectProducer($data);
|
||
|
||
$message->setDelayMs(1000 * 10);
|
||
$producer = $this->container->get(Producer::class);
|
||
$result = $producer->produce($message);
|
||
if (!$result) {
|
||
// 处方开具成功,添加自动签章审核队列失败
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "处方开具失败");
|
||
}
|
||
}
|
||
|
||
Db::commit();
|
||
} catch (\Throwable $e) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
|
||
}
|
||
|
||
try {
|
||
// 发送消息-药师审核中
|
||
$ImService = new ImService();
|
||
$ImService->pharmacistVerify($order_inquiry,(string)$order_prescription->order_prescription_id,$product_name,$user_doctor['user_id'],$order_inquiry['user_id']);
|
||
}catch (\Throwable $e){
|
||
return success([],HttpEnumCode::HTTP_SUCCESS,"消息发送失败");
|
||
}
|
||
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 获取医生名片
|
||
* @throws NotFoundExceptionInterface
|
||
* @throws RedirectionExceptionInterface
|
||
* @throws ContainerExceptionInterface
|
||
* @throws DecodingExceptionInterface
|
||
* @throws ClientExceptionInterface
|
||
* @throws TransportExceptionInterface
|
||
* @throws ServerExceptionInterface
|
||
*/
|
||
public function getDoctorInfoCard(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
// 获取医生信息
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
|
||
$fields = [
|
||
'doctor_id',
|
||
'user_name',
|
||
'avatar',
|
||
'doctor_title',
|
||
'department_custom_name',
|
||
'iden_auth_status',
|
||
'idcard_status',
|
||
'multi_point_status',
|
||
'hospital_id',
|
||
'qr_code',
|
||
'is_bind_bank',
|
||
];
|
||
$user_doctor = UserDoctor::getOne($params, $fields);
|
||
if (empty($user_doctor)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
|
||
}
|
||
|
||
if ($user_doctor['iden_auth_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成身份认证");
|
||
}
|
||
|
||
if ($user_doctor['idcard_status'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先完成实名认证");
|
||
}
|
||
|
||
if ($user_doctor['is_bind_bank'] != 1) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请先绑定结算银行卡");
|
||
}
|
||
|
||
// 获取医生医院
|
||
$params = array();
|
||
$params['hospital_id'] = $user_doctor['hospital_id'];
|
||
$hospital = Hospital::getOne($params);
|
||
if (empty($hospital)) {
|
||
return fail();
|
||
}
|
||
|
||
// 获取医生分享二维码
|
||
$qr_code = $user_doctor['qr_code'];
|
||
if (empty($qr_code)){
|
||
$weChat = new Wechat(1);
|
||
|
||
$env_version = "release";
|
||
$app_env = \Hyperf\Support\env("APP_ENV",'dev');
|
||
if ($app_env == "dev"){
|
||
$env_version = "trial";
|
||
}
|
||
|
||
$options = [
|
||
"scene" => "doctor_id=" . $user_doctor['doctor_id'],// query 参数
|
||
"page" => "pages/expertDetail/expertDetail",
|
||
"check_path" => false,
|
||
"env_version" => $env_version,
|
||
];
|
||
|
||
$img_buffer = $weChat->getUnlimitedQRCode($options);
|
||
|
||
$oss = new Oss();
|
||
|
||
$filename = "applet/doctor/card/" . $user_doctor['doctor_id'] . '.' . 'jpg';
|
||
|
||
$qr_code = $oss->putObject($filename, $img_buffer);
|
||
|
||
// 存储至医生表
|
||
$params = array();
|
||
$params['doctor_id'] = $user_doctor['doctor_id'];
|
||
|
||
$data = array();
|
||
$data['qr_code'] = "/" . $qr_code;
|
||
UserDoctor::editUserDoctor($params,$data);
|
||
}
|
||
|
||
$result = array();
|
||
$result['user_name'] = $user_doctor['user_name'];
|
||
$result['doctor_title'] = DoctorTitleCode::getMessage($user_doctor['doctor_title']);
|
||
$result['avatar'] = addAliyunOssWebsite($user_doctor['avatar']);
|
||
$result['department_custom_name'] = $user_doctor['department_custom_name'];
|
||
$result['hospital_name'] = $hospital['hospital_name'];
|
||
$result['qr_code_url'] = addAliyunOssWebsite($user_doctor['qr_code'] ?: "/" . $qr_code);
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 获取医生问诊消息列表
|
||
* @return array
|
||
* @throws ContainerExceptionInterface
|
||
* @throws NotFoundExceptionInterface
|
||
*/
|
||
public function getDoctorMessageList(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$message_inquiry_type = $this->request->input('message_inquiry_type');
|
||
|
||
$redis_key = "recentContact" . $user_info['client_user_id'] . $message_inquiry_type;
|
||
|
||
$redis = $this->container->get(Redis::class);
|
||
$result = $redis->hVals($redis_key);
|
||
if (empty($result)){
|
||
return success();
|
||
}
|
||
|
||
foreach ($result as &$item){
|
||
$item = json_decode($item,true);
|
||
}
|
||
|
||
// 获取 message_send_time 和 message_seq 两个字段的值,分别存储在不同的数组中
|
||
foreach ($result as $key => $row) {
|
||
$messageSendTime[$key] = $row['message_send_time'];
|
||
$messageSeq[$key] = $row['message_seq'];
|
||
}
|
||
|
||
// 通过 array_multisort 函数对两个字段进行排序
|
||
// 优先按照 message_send_time 排序,如果 message_send_time 相同,则按照 message_seq 排序
|
||
array_multisort($messageSendTime, SORT_DESC, $messageSeq, SORT_DESC, $result);
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 获取医生问诊消息用户属性
|
||
* @return array
|
||
*/
|
||
public function getDoctorMessageAttrList(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$order_inquiry_ids = $this->request->input('order_inquiry_ids');
|
||
if (empty($order_inquiry_ids)){
|
||
return success();
|
||
}
|
||
|
||
$order_inquiry_ids = explode(',',$order_inquiry_ids);
|
||
|
||
$fields = [
|
||
'order_inquiry_id',
|
||
'patient_name',
|
||
'patient_sex',
|
||
'patient_age',
|
||
'inquiry_status',
|
||
'inquiry_type',
|
||
'inquiry_mode',
|
||
'inquiry_no',
|
||
];
|
||
|
||
$params =array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$order_inquirys = OrderInquiry::getInList($params,$order_inquiry_ids,$fields);
|
||
if (empty($order_inquirys)){
|
||
return success();
|
||
}
|
||
|
||
foreach ($order_inquirys as &$order_inquiry){
|
||
// 处理未接诊取消时间
|
||
if ($order_inquiry['inquiry_status'] == 3){
|
||
if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3){
|
||
$order_inquiry['no_inquiry_cancel_time'] = 24 * 60;
|
||
|
||
// 服务包特殊处理
|
||
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){
|
||
// 检测问诊是否服务包首次问诊
|
||
$OrderServicePackageService = new OrderServicePackageService();
|
||
|
||
// 获取服务包订单编号-通过问诊订单id
|
||
$order_service_no = $OrderServicePackageService->getOrderServiceNoByOrderInquiryId($order_inquiry['inquiry_no']);
|
||
|
||
$is_first = $OrderServicePackageService->isFirstInquiryServicePackage($order_service_no);
|
||
if ($is_first){
|
||
$order_inquiry['no_inquiry_cancel_time'] = 60 * 24 * 3;
|
||
}else{
|
||
$order_inquiry['no_inquiry_cancel_time'] = 60 * 24;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
if ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4){
|
||
$order_inquiry['no_inquiry_cancel_time'] = 10;
|
||
}
|
||
}
|
||
}
|
||
|
||
return success($order_inquirys->toArray());
|
||
}
|
||
|
||
/**
|
||
* 新增医生接诊
|
||
* @return array
|
||
* @throws ContainerExceptionInterface
|
||
* @throws NotFoundExceptionInterface
|
||
*/
|
||
public function addDoctorInquiry(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
$order_inquiry_id = $this->request->route('order_inquiry_id');
|
||
|
||
// 获取问诊订单数据
|
||
$params = array();
|
||
$params['doctor_id'] = $user_info['client_user_id'];
|
||
$params['order_inquiry_id'] = $order_inquiry_id;
|
||
$order_inquiry = OrderInquiry::getOne($params);
|
||
if (empty($order_inquiry)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
|
||
if ($order_inquiry['inquiry_status'] == 4) {
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return success();
|
||
}
|
||
|
||
if ($order_inquiry['inquiry_status'] == 5) {
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return fail(HttpEnumCode::HTTP_ERROR, "订单已完成");
|
||
}
|
||
|
||
if ($order_inquiry['inquiry_status'] == 6) {
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return fail(HttpEnumCode::HTTP_ERROR, "订单已结束");
|
||
}
|
||
|
||
if ($order_inquiry['inquiry_status'] == 7) {
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return fail(HttpEnumCode::HTTP_ERROR, "订单已取消");
|
||
}
|
||
|
||
if ($order_inquiry['inquiry_status'] != 3) {
|
||
// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return fail(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
|
||
// 订单退款状态
|
||
if (!in_array($order_inquiry['inquiry_refund_status'],[0,4,5])){
|
||
// 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
|
||
return fail(HttpEnumCode::HTTP_ERROR, "订单正在退款,无法接诊");
|
||
}
|
||
|
||
// 订单支付状态
|
||
if ($order_inquiry['inquiry_pay_status'] != 2){
|
||
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(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
|
||
Db::beginTransaction();
|
||
|
||
try {
|
||
$data = array();
|
||
$data['inquiry_status'] = 4;
|
||
$data['reception_time'] = date('Y-m-d H:i:s',time());
|
||
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry_id;
|
||
OrderInquiry::edit($params,$data);
|
||
|
||
// 处理服务包订单
|
||
if ($order_inquiry['inquiry_type'] == 1){
|
||
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){
|
||
// 获取关联服务包订单
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$order_service_package_inquiry = OrderServicePackageInquiry::getOne($params);
|
||
if (empty($order_service_package_inquiry)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
|
||
// 获取服务包订单详情
|
||
$params = array();
|
||
$params['order_service_no'] = $order_service_package_inquiry['order_service_no'];
|
||
$order_service_package_detail = OrderServicePackageDetail::getOne($params);
|
||
if (empty($order_service_package_detail)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
|
||
// 开始服务时间
|
||
$start_time = date('Y-m-d H:i:s',time());
|
||
|
||
// 结束服务时间
|
||
$finish_time = date('Y-m-d H:i:s', strtotime("+{$order_service_package_detail['service_period']} days", strtotime($start_time)));
|
||
|
||
// 修改服务包
|
||
$data = array();
|
||
$data['order_service_status'] = 3; // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)
|
||
$data['start_time'] = $start_time;
|
||
$data['finish_time'] = $finish_time;
|
||
|
||
$params = array();
|
||
$params['order_service_id'] = $order_service_package_inquiry['order_service_id'];
|
||
OrderServicePackage::edit($params,$data);
|
||
|
||
// 健康包订单发放优惠卷
|
||
if ($order_inquiry['inquiry_mode'] == 8){
|
||
// 检测问诊次数
|
||
$OrderServicePackageService = new OrderServicePackageService();
|
||
$is_first = $OrderServicePackageService->isFirstInquiryServicePackage($order_service_package_inquiry['order_service_no']);
|
||
if ($is_first){
|
||
// 发放优惠卷
|
||
$CouponService = new CouponService();
|
||
$res = $CouponService->GrantBuyOrderServicePackageCoupon($order_inquiry['user_id']);
|
||
if (!$res) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取订单持续时长
|
||
if ($order_inquiry['inquiry_type'] == 1 && $order_inquiry['inquiry_mode'] == 6){
|
||
// 疑难问诊为自己配置周期。
|
||
$params = array();
|
||
$params['doctor_id'] = $order_inquiry['doctor_id'];
|
||
$doctor_config_difficult_consultation = DoctorConfigDifficultConsultation::getOne($params);
|
||
if(empty($doctor_config_difficult_consultation)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "接诊失败");
|
||
}
|
||
|
||
$time = $doctor_config_difficult_consultation['service_period'] * 24 * 60 * 60;
|
||
}else{
|
||
$time = $system_inquiry_config['duration'] * 60;
|
||
}
|
||
|
||
// 添加自动结束队列
|
||
$data = array();
|
||
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$message = new AutoCompleteInquiryDelayDirectProducer($data);
|
||
$message->setDelayMs(1000 * $time);
|
||
$producer = $this->container->get(Producer::class);
|
||
$res = $producer->produce($message);
|
||
if (!$res) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "接诊失败");
|
||
}
|
||
|
||
Db::commit();
|
||
} catch (\Exception $e) {
|
||
Db::rollBack();
|
||
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)) {
|
||
Log::getInstance('UserDoctorService-addDoctorInquiry')->error("医生数据错误");
|
||
return success();
|
||
}
|
||
|
||
// 获取病例数据
|
||
$params = array();
|
||
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params);
|
||
if (empty($order_inquiry_case)){
|
||
Log::getInstance('UserDoctorService-addDoctorInquiry')->error("患者病例错误");
|
||
return success();
|
||
}
|
||
|
||
// 发送IM消息-医生接诊
|
||
$imService = new ImService();
|
||
$imService->doctorInquiry($order_inquiry,$user_info['user_id'],$order_inquiry['user_id'],$time);
|
||
|
||
// 发送IM消息-患者病例
|
||
$imService->patientCase($order_inquiry,$user_doctor['user_id'],$order_inquiry_case['disease_desc']);
|
||
|
||
// 处理可处方字段
|
||
$userDoctorService = new UserDoctorService();
|
||
$multi_point_enable = $userDoctorService->getDoctorMultiPointEnable($user_doctor["doctor_id"]);
|
||
|
||
// 多点医生接诊后,自动回复消息
|
||
if ($user_doctor['multi_point_status'] == 1 && $multi_point_enable == 1){
|
||
$imService->multiPointDoctorInquiryAutoReply($order_inquiry,$user_doctor['user_id'],$order_inquiry['user_id']);
|
||
}
|
||
|
||
// 处理服务包情况
|
||
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){
|
||
$OrderServicePackageService = new OrderServicePackageService();
|
||
|
||
// 获取服务包订单编号-通过问诊订单id
|
||
$order_service_no = $OrderServicePackageService->getOrderServiceNoByOrderInquiryId($order_inquiry['inquiry_no']);
|
||
|
||
// 获取服务包订单
|
||
$params = array();
|
||
$params['order_service_no'] = $order_service_no;
|
||
$order_service_package = OrderServicePackage::getOne($params);
|
||
if (empty($order_service_package)){
|
||
Log::getInstance('UserDoctorService-addDoctorInquiry')->error("服务包订单错误");
|
||
return success();
|
||
}
|
||
|
||
// 获取服务包订单详情
|
||
$params = array();
|
||
$params['order_service_id'] = $order_service_package['order_service_id'];
|
||
$order_service_package_detail = OrderServicePackageDetail::getOne($params);
|
||
if (empty($order_service_package_detail)){
|
||
Log::getInstance('UserDoctorService-addDoctorInquiry')->error("服务包订单详情错误");
|
||
return success();
|
||
}
|
||
|
||
// 检测问诊是否服务包首次问诊
|
||
$is_first = $OrderServicePackageService->isFirstInquiryServicePackage($order_service_no);
|
||
if ($is_first){
|
||
// 患者-通知患者医生已接受服务包服务
|
||
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_service_package['order_service_no']);
|
||
$MessagePush->patientAcceptedServicePackage();
|
||
}else{
|
||
// 患者-通知患者医生已接诊服务包相关问诊订单
|
||
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_inquiry['inquiry_no']);
|
||
$MessagePush->patientAcceptedServicePackageInquiry();
|
||
|
||
if ($order_service_package['order_service_type'] == 1){
|
||
$remaining_quantity = 0;
|
||
|
||
// 获取服务包内所有药品
|
||
$health_package_products = $OrderServicePackageService->getOrderServiceProduct($order_service_package_detail['package_id']);
|
||
foreach ($health_package_products as $health_package_product) {
|
||
// 获取服务包内某一药品的剩余数量
|
||
$remaining_quantity = $OrderServicePackageService->getOrderServiceProductCanUseQuantity($order_service_package['order_service_id'],$health_package_product['product_id'],$health_package_product['quantity']);
|
||
}
|
||
|
||
if ($remaining_quantity > 0){
|
||
// 患者-通知患者服务包药品未使用完
|
||
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_inquiry['inquiry_no']);
|
||
$MessagePush->patientServicePackageHaveProduct($remaining_quantity);
|
||
}
|
||
}
|
||
}
|
||
}else{
|
||
// 发送站内、订阅、短信消息-医生已接诊
|
||
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_inquiry['inquiry_no']);
|
||
$MessagePush->patientAcceptedInquiry();
|
||
}
|
||
}catch(\Exception $e){
|
||
Log::getInstance('UserDoctorService-addDoctorInquiry')->error($e->getMessage());
|
||
return success();
|
||
}
|
||
|
||
return success();
|
||
}
|
||
|
||
/**
|
||
* 获取医生问诊详情
|
||
* @return array
|
||
*/
|
||
public function getDoctorInquiryInfo(): array
|
||
{
|
||
$doctor_id = $this->request->route('doctor_id');
|
||
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
if (empty($user_info)){
|
||
return fail(HttpEnumCode::HTTP_SUCCESS, "请登录");
|
||
}
|
||
|
||
$result = array();
|
||
$result['hospital'] = [];
|
||
$result['days'] = 0;
|
||
$result['doctor_inquiry_config'] = [];
|
||
$result['is_online'] = 0;
|
||
|
||
$fields = [
|
||
"doctor_id",
|
||
"user_id",
|
||
"user_name",
|
||
"iden_auth_status",
|
||
"multi_point_status",
|
||
"avatar",
|
||
"doctor_title",
|
||
"department_custom_id",
|
||
"department_custom_name",
|
||
"hospital_id",
|
||
"served_patients_num",
|
||
"praise_rate",
|
||
"avg_response_time",
|
||
"number_of_fans",
|
||
"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::HTTP_SUCCESS, "医生错误");
|
||
}
|
||
|
||
$result = $user_doctor->toArray();
|
||
|
||
$result['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)) {
|
||
$result['hospital'] = $hospital;
|
||
}
|
||
|
||
// 患者
|
||
if ($user_info['user_type'] == 1){
|
||
// 获取服务天数
|
||
$params = array();
|
||
$params['patient_id'] = $user_info['client_user_id'];
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['history_status'] = 1;
|
||
$patient_history_doctor = PatientHistoryInquiryModel::getOrderOne($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);
|
||
}
|
||
|
||
// 获取医生问诊配置-问诊购药
|
||
$result['multi_point_enable'] = 0;
|
||
|
||
$inquiryService = new InquiryService();
|
||
|
||
// 获取问诊价格
|
||
// 专家-公益
|
||
$params = array();
|
||
$params[] = ['doctor_id', '=', $doctor_id];
|
||
$params[] = ['inquiry_mode', '=', 1];// 接诊方式(1:图文 2:视频 3:语音 4:电话 5:会员)
|
||
$doctor_inquiry_config = DoctorInquiryConfigModel::getInquiryConfigListByInquiryType($params,['*'],[1,3,4]);
|
||
if (!empty($doctor_inquiry_config)) {
|
||
foreach ($doctor_inquiry_config as &$value) {
|
||
// 获取医生当日有效问诊数量
|
||
$value['order_inquiry_count'] = $inquiryService->getDoctorDayInquiryCount($doctor_id, $value['inquiry_type']);
|
||
|
||
// 获取系统问诊配置
|
||
$fields = [
|
||
'system_inquiry_config_id',
|
||
'times_number',
|
||
'duration',
|
||
];
|
||
|
||
$params = array();
|
||
$params['inquiry_type'] = $value['inquiry_type'];
|
||
$params['inquiry_mode'] = $value['inquiry_mode'];
|
||
$system_inquiry_config = SystemInquiryConfig::getOne($params,$fields);
|
||
if (empty($system_inquiry_config)){
|
||
return fail();
|
||
}
|
||
|
||
$value['times_number'] = $system_inquiry_config['times_number'];
|
||
$value['duration'] = $system_inquiry_config['duration'];
|
||
|
||
if ($value['is_enable'] == 1 && $value['inquiry_type'] == 4 && $value['inquiry_mode'] == 1){
|
||
$result['multi_point_enable'] = 1;
|
||
}
|
||
unset($system_inquiry_config);
|
||
}
|
||
$result['doctor_inquiry_config'] = $doctor_inquiry_config;
|
||
}
|
||
|
||
// 获取医生已选择专长
|
||
$UserDoctorService = new UserDoctorService();
|
||
$result['doctor_expertise'] = $UserDoctorService->getDoctorSelectedExpertise($user_doctor['doctor_id']);
|
||
|
||
// 好评率-超过5个已结束的订单后展示
|
||
$result['praise_rate'] = floor($user_doctor['praise_rate'] * 0.05 * 100) / 100;
|
||
|
||
// 响应时间-超过5个已结束的订单后展示
|
||
$result['avg_response_time'] = floor($user_doctor['avg_response_time'] * 10) / 10;
|
||
|
||
$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']);
|
||
|
||
// 获取用户数据
|
||
$params = array();
|
||
$params['user_id'] = $user_doctor['user_id'];
|
||
$user = User::getOne($params);
|
||
if (!empty($user)){
|
||
$result['is_online'] = $user['is_online'];
|
||
}
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 获取医生详情-问诊
|
||
* @return array
|
||
*/
|
||
public function getDoctorInfoInquiry(): array
|
||
{
|
||
$doctor_id = $this->request->route('doctor_id');
|
||
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
if (empty($user_info)){
|
||
return fail(HttpEnumCode::HTTP_SUCCESS, "请登录");
|
||
}
|
||
|
||
$result = array();
|
||
$result['hospital'] = [];
|
||
$result['days'] = 0;
|
||
$result['doctor_inquiry_config'] = [];
|
||
$result['is_online'] = 0;
|
||
|
||
$fields = [
|
||
"doctor_id",
|
||
"user_id",
|
||
"user_name",
|
||
"iden_auth_status",
|
||
"multi_point_status",
|
||
"avatar",
|
||
"doctor_title",
|
||
"department_custom_id",
|
||
"department_custom_name",
|
||
"hospital_id",
|
||
"served_patients_num",
|
||
"praise_rate",
|
||
"avg_response_time",
|
||
"number_of_fans",
|
||
"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::HTTP_SUCCESS, "医生错误");
|
||
}
|
||
|
||
$result = $user_doctor->toArray();
|
||
|
||
$result['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)) {
|
||
$result['hospital'] = $hospital;
|
||
}
|
||
|
||
// 患者
|
||
if ($user_info['user_type'] == 1){
|
||
// 获取服务天数
|
||
$params = array();
|
||
$params['patient_id'] = $user_info['client_user_id'];
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['history_status'] = 1;
|
||
$patient_history_doctor = PatientHistoryInquiryModel::getOrderOne($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);
|
||
}
|
||
|
||
// 获取医生已选择专长
|
||
$UserDoctorService = new UserDoctorService();
|
||
$result['doctor_expertise'] = $UserDoctorService->getDoctorSelectedExpertise($user_doctor['doctor_id']);
|
||
|
||
// 好评率-超过5个已结束的订单后展示
|
||
$result['praise_rate'] = floor($user_doctor['praise_rate'] * 0.05 * 100) / 100;
|
||
|
||
// 响应时间-超过5个已结束的订单后展示
|
||
$result['avg_response_time'] = floor($user_doctor['avg_response_time'] * 10) / 10;
|
||
|
||
$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']);
|
||
|
||
// 获取用户数据
|
||
$params = array();
|
||
$params['user_id'] = $user_doctor['user_id'];
|
||
$user = User::getOne($params);
|
||
if (!empty($user)){
|
||
$result['is_online'] = $user['is_online'];
|
||
}
|
||
|
||
// 处理可处方字段
|
||
$userDoctorService = new UserDoctorService();
|
||
$result['multi_point_enable'] = $userDoctorService->getDoctorMultiPointEnable($doctor_id);
|
||
|
||
// 获取医生详情数据
|
||
$result['register_cert'] = "";
|
||
$params = array();
|
||
$params['doctor_id'] = $user_doctor['doctor_id'];
|
||
$user_doctor_info = UserDoctorInfo::getOne($params);
|
||
if (!empty($user_doctor_info)){
|
||
if (!empty($user_doctor_info["register_cert"])){
|
||
$result['register_cert'] = addAliyunOssWebsite($user_doctor_info["register_cert"]);
|
||
}
|
||
}
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 获取医生开启的服务
|
||
* @return array
|
||
*/
|
||
public function getDoctorOpenInquiryService(): array
|
||
{
|
||
$doctor_id = $this->request->route('doctor_id');
|
||
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
|
||
if (empty($user_info)){
|
||
return fail(HttpEnumCode::HTTP_SUCCESS, "请登录");
|
||
}
|
||
|
||
$fields = [
|
||
"doctor_id",
|
||
"user_id",
|
||
"user_name",
|
||
"iden_auth_status",
|
||
"multi_point_status",
|
||
"avatar",
|
||
"doctor_title",
|
||
"department_custom_id",
|
||
"department_custom_name",
|
||
"hospital_id",
|
||
"served_patients_num",
|
||
"praise_rate",
|
||
"avg_response_time",
|
||
"number_of_fans",
|
||
"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::HTTP_SUCCESS, "医生错误");
|
||
}
|
||
|
||
$inquiryService = new InquiryService();
|
||
|
||
// 获取问诊配置
|
||
$params = array();
|
||
$params[] = ['doctor_id', '=', $doctor_id];
|
||
$doctor_inquiry_config = DoctorInquiryConfigModel::getInquiryConfigListByInquiryType($params,['*'],[1,3,4]);
|
||
if (!empty($doctor_inquiry_config)) {
|
||
foreach ($doctor_inquiry_config as &$value) {
|
||
// 获取医生当日有效问诊数量
|
||
$value['order_inquiry_count'] = $inquiryService->getDoctorDayInquiryCount($doctor_id, $value['inquiry_type']);
|
||
|
||
// 获取回合数以及问诊时间
|
||
if ($value['inquiry_mode'] == 6){
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$doctor_config_difficult_consultation = DoctorConfigDifficultConsultation::getOne($params);
|
||
if (!empty($doctor_config_difficult_consultation)){
|
||
$value['times_number'] = $doctor_config_difficult_consultation['service_rounds']; // 服务回合数(0表示不限次)
|
||
$value['duration'] = $doctor_config_difficult_consultation['service_period']; // 服务周期(天,不存在0的情况)
|
||
$value['service_content'] = $doctor_config_difficult_consultation['service_content'];// 服务内容
|
||
$value['service_process'] = $doctor_config_difficult_consultation['service_process'];// 服务流程
|
||
|
||
unset($doctor_config_difficult_consultation);
|
||
}
|
||
}else{
|
||
// 获取系统问诊配置
|
||
$fields = [
|
||
'system_inquiry_config_id',
|
||
'times_number',
|
||
'duration',
|
||
];
|
||
|
||
$params = array();
|
||
$params['inquiry_type'] = $value['inquiry_type'];
|
||
$params['inquiry_mode'] = $value['inquiry_mode'];
|
||
$system_inquiry_config = SystemInquiryConfig::getOne($params,$fields);
|
||
if (empty($system_inquiry_config)){
|
||
return fail();
|
||
}
|
||
|
||
$value['times_number'] = $system_inquiry_config['times_number'];// 沟通次数(0为不限制次数)
|
||
$value['duration'] = $system_inquiry_config['duration'];// 沟通时长(分钟,0为不限制时长)
|
||
|
||
unset($system_inquiry_config);
|
||
}
|
||
|
||
// 随访包
|
||
if ($value['inquiry_type'] == 1 && $value['inquiry_mode'] == 9){
|
||
$params = array();
|
||
$params['doctor_id'] = $value['doctor_id'];
|
||
$doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params);
|
||
if (!empty($doctor_config_follow_package)) {
|
||
$params = array();
|
||
$params['follow_package_id'] = $doctor_config_follow_package['follow_package_id'];
|
||
$doctor_config_follow_package_items = DoctorConfigFollowPackageItem::getList($params);
|
||
if (!empty($doctor_config_follow_package_items)) {
|
||
foreach ($doctor_config_follow_package_items as $k => $doctor_config_follow_package_item){
|
||
if ($k == 0){
|
||
$value['inquiry_price'] = $doctor_config_follow_package_item['service_price'];
|
||
continue;
|
||
}
|
||
|
||
if ($doctor_config_follow_package_item['service_price'] < $value['inquiry_price']){
|
||
$value['inquiry_price'] = $doctor_config_follow_package_item['service_price'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 健康包
|
||
if ($value['inquiry_type'] == 1 && $value['inquiry_mode'] == 8){
|
||
$params = array();
|
||
$params['doctor_id'] = $value['doctor_id'];
|
||
$doctor_config_health_package = DoctorConfigHealthPackage::getOne($params);
|
||
if (!empty($doctor_config_health_package)){
|
||
$value['inquiry_price'] = $doctor_config_health_package['service_price'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return success($doctor_inquiry_config->toArray());
|
||
}
|
||
|
||
/**
|
||
* 检测医生身份认证
|
||
* @param object|array $user_doctor 医生表数据
|
||
* @param bool $is_iden_auth 是否检测身份认证
|
||
* @param bool $is_idcard 是否检测实名认证
|
||
* @param bool $is_multi_point 是否检测多点执业认证
|
||
* @return bool|string string:错误信息 bool:通过
|
||
*/
|
||
public function checkDoctorAuth(object|array $user_doctor, bool $is_iden_auth = true, bool $is_idcard = true, bool $is_multi_point = true): bool|string
|
||
{
|
||
if (empty($user_doctor)) {
|
||
throw new BusinessException();
|
||
}
|
||
|
||
if ($is_iden_auth) {
|
||
if ($user_doctor['iden_auth_status'] != 1) {
|
||
return "请先完成身份认证";
|
||
}
|
||
}
|
||
|
||
if ($is_idcard) {
|
||
if ($user_doctor['idcard_status'] != 1) {
|
||
return "请先完成实名认证";
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 获取当前时间N分钟前接诊中的医生
|
||
* @param string|int $minute 分钟
|
||
* @param int|string $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
|
||
* @param array $not_doctor_ids 不可选择的医生id数组
|
||
* @return array
|
||
*/
|
||
public function getBeforeCurrentTimeDoctor(string|int $minute, int|string $inquiry_type,array $not_doctor_ids = []): 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 = [4, 5];// 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
$order_inquirys = OrderInquiry::getInquiryStatusWithDoctorNotInList($params, $inquiry_status_params,$not_doctor_ids);
|
||
if (empty($order_inquirys)) {
|
||
return [];
|
||
}
|
||
|
||
$order_inquirys = $order_inquirys->toArray();
|
||
$result = [];
|
||
foreach ($order_inquirys as $item){
|
||
$result[] = $item['UserDoctor'];
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 获取快速、购药问诊可分配医生
|
||
* @param string $inquiry_type
|
||
* @param string $patient_id
|
||
* @param bool $is_system_time_pass 是否系统坐班时间 0:否 1:是
|
||
* @return string
|
||
*/
|
||
public function getInquiryAssignDoctor(string $inquiry_type,string $patient_id,bool $is_system_time_pass): string
|
||
{
|
||
// 不可选择的医生id数组
|
||
$not_doctor_ids = [];
|
||
|
||
if ($is_system_time_pass){
|
||
// 获取坐班时间包含当前时间的深度合作医生
|
||
$doctor_ids = $this->getNowTimePlatDeepCooperationDoctorId($inquiry_type,time(),$not_doctor_ids);
|
||
Log::getInstance()->info("获取坐班时间包含当前时间的深度合作医生:" ,$doctor_ids);
|
||
|
||
// 检测医生是否可被分配
|
||
$result = $this->checkDoctorCanBeAssigned($doctor_ids,$patient_id,1,$inquiry_type);
|
||
Log::getInstance()->info("检测医生是否可被分配:" ,$result);
|
||
|
||
if (!empty($result['doctor_id'])){
|
||
return $result['doctor_id'];
|
||
}
|
||
|
||
if (!empty($result['not_doctor_ids'])){
|
||
$not_doctor_ids = array_merge($not_doctor_ids,$result['not_doctor_ids']);
|
||
}
|
||
|
||
// 问诊购药情况特殊,第一次未匹配到直接返回失败
|
||
if($inquiry_type == 4){
|
||
return "";
|
||
}
|
||
|
||
// 检测当前时间5分钟后,坐班时间包含某时间的平台深度合作医生
|
||
$doctor_ids = $this->getNowTimePlatDeepCooperationDoctorId($inquiry_type,strtotime ("+5 minute"),$not_doctor_ids);
|
||
if (!empty($doctor_ids)){
|
||
Log::getInstance()->info("检测当前时间5分钟后,坐班时间包含某时间的平台深度合作医生:" ,$doctor_ids);
|
||
|
||
// 检测医生是否可被分配
|
||
$result = $this->checkDoctorCanBeAssigned($doctor_ids,$patient_id,1,$inquiry_type);
|
||
Log::getInstance()->info("检测医生是否可被分配:" ,$result);
|
||
if (!empty($result['doctor_id'])){
|
||
return $result['doctor_id'];
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检测当前时间5分钟后,坐班时间包含某时间的平台深度合作医生
|
||
$doctor_ids = $this->getNowTimePlatDeepCooperationDoctorId($inquiry_type,strtotime ("+5 minute"),$not_doctor_ids);
|
||
if (!empty($doctor_ids)){
|
||
Log::getInstance()->info("检测当前时间5分钟后,坐班时间包含某时间的平台深度合作医生:" ,$doctor_ids);
|
||
|
||
// 检测医生是否可被分配
|
||
$result = $this->checkDoctorCanBeAssigned($doctor_ids,$patient_id,1,$inquiry_type);
|
||
Log::getInstance()->info("检测医生是否可被分配:" ,$result);
|
||
if (!empty($result['doctor_id'])){
|
||
return $result['doctor_id'];
|
||
}
|
||
}
|
||
|
||
// 获取自由注册医生
|
||
$user_doctor = $this->getOnlineDoctor($inquiry_type,$not_doctor_ids);
|
||
if (!empty($user_doctor)){
|
||
$doctor_ids = array_column($user_doctor,'doctor_id');
|
||
Log::getInstance()->info("获取在线的自由注册医生:" ,$doctor_ids);
|
||
|
||
// 检测医生是否可被分配
|
||
$result = $this->checkDoctorCanBeAssigned($doctor_ids,$patient_id,1,$inquiry_type);
|
||
Log::getInstance()->info("检测医生是否可被分配:" ,$result);
|
||
if (!empty($result['doctor_id'])){
|
||
return $result['doctor_id'];
|
||
}
|
||
|
||
if (!empty($result['not_doctor_ids'])){
|
||
$not_doctor_ids = array_merge($not_doctor_ids,$result['not_doctor_ids']);
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/**
|
||
* 获取坐班时间包含某时间的平台深度合作医生
|
||
* @param string $inquiry_type
|
||
* @param string $time 时间戳
|
||
* @param array $not_doctor_ids 不可选择的医生id数组
|
||
* @return array 医生id
|
||
*/
|
||
public function getNowTimePlatDeepCooperationDoctorId(string $inquiry_type,string $time,array $not_doctor_ids = []): array
|
||
{
|
||
$doctor_ids = [];
|
||
|
||
$params = array();
|
||
$params[] = ['inquiry_type','=',$inquiry_type];
|
||
$params[] = ['inquiry_mode','=',1];
|
||
$params[] = ['start_time','<',date('H',$time) . date('i',$time)];
|
||
$params[] = ['end_time','>',date('H',$time) . date('i',$time)];
|
||
|
||
$user_doctor_params = array();
|
||
$user_doctor_params['is_platform_deep_cooperation'] = 1;
|
||
|
||
// 问诊购药
|
||
if ($inquiry_type == 4){
|
||
$user_doctor_params['multi_point_status'] = 1;
|
||
}
|
||
|
||
// 问诊配置
|
||
$doctor_inquiry_config_params = array();
|
||
$doctor_inquiry_config_params['inquiry_type'] = $inquiry_type;
|
||
$doctor_inquiry_config_params['inquiry_mode'] = 1;
|
||
$doctor_inquiry_config_params['is_enable'] = 1;
|
||
|
||
$doctor_inquiry_times = DoctorInquiryTime::getMinPlatDeepCooperationDoctor($params,$user_doctor_params,$not_doctor_ids,$doctor_inquiry_config_params);
|
||
if (!empty($doctor_inquiry_times)){
|
||
foreach ($doctor_inquiry_times as $item){
|
||
// 检测是否存在日期
|
||
if (!empty($item['inquiry_date'])){
|
||
// 获取当前日期
|
||
$now_day = date('Y-m-d',time());
|
||
if ($item['inquiry_date'] == $now_day){
|
||
$doctor_ids[] = $item['doctor_id'];
|
||
}
|
||
}else{
|
||
$doctor_ids[] = $item['doctor_id'];
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!empty($doctor_ids)){
|
||
$doctor_ids = array_unique($doctor_ids);
|
||
$doctor_ids = array_values($doctor_ids);
|
||
}
|
||
|
||
return $doctor_ids;
|
||
}
|
||
|
||
/**
|
||
* 获取医生每日最大接诊数量
|
||
* @param string $doctor_id
|
||
* @param string|int $inquiry_type
|
||
* @param string|int $inquiry_mode
|
||
* @return int
|
||
*/
|
||
public function getDoctorInquiryDayMaxNum(string $doctor_id,string|int $inquiry_type,string|int $inquiry_mode): int
|
||
{
|
||
$max_work_num_day = 0;
|
||
if ($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 $system_inquiry_config['max_work_num_day'];
|
||
}
|
||
}
|
||
|
||
// 健康包
|
||
if ($inquiry_type == 1 && $inquiry_mode == 9){
|
||
return 9999;
|
||
}
|
||
|
||
// 随访包
|
||
if ($inquiry_type == 1 && $inquiry_mode == 8){
|
||
return 9999;
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_type'] = $inquiry_type;
|
||
$params['inquiry_mode'] = $inquiry_mode;
|
||
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
|
||
if (!empty($doctor_inquiry_config)){
|
||
return $doctor_inquiry_config['work_num_day'];
|
||
}
|
||
|
||
return $max_work_num_day;
|
||
}
|
||
|
||
/**
|
||
* 获取医生未接诊订单数量(包含未接诊、未支付、已接诊)
|
||
* @param string $doctor_id
|
||
* @param string|int $inquiry_type
|
||
* @param string|int $inquiry_mode
|
||
* @return int
|
||
*/
|
||
public function getDoctorUnInquiryOrderNum(string $doctor_id,string|int $inquiry_type,string|int $inquiry_mode): int
|
||
{
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_type'] = $inquiry_type;
|
||
$params['inquiry_mode'] = $inquiry_mode;
|
||
$params['inquiry_refund_status'] = 0;
|
||
|
||
$inquiry_status_params = [1,3,4]; // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
return OrderInquiry::getInquiryStatusCount($params,$inquiry_status_params);
|
||
}
|
||
|
||
/**
|
||
* 获取深度合作的在线医生
|
||
* @param string $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
|
||
* @param array $not_doctor_ids 不可选择的医生id数组
|
||
* @return array
|
||
*/
|
||
public function getOnlineDeepDoctor(string $inquiry_type,array $not_doctor_ids): array
|
||
{
|
||
// 获取深度合作的在线医生x
|
||
$params = array();
|
||
$params['status'] = 1;
|
||
$params['idcard_status'] = 1;
|
||
$params['iden_auth_status'] = 1;
|
||
$params['is_bind_bank'] = 1;
|
||
$params['is_online'] = 1;
|
||
|
||
// 问诊购药
|
||
if ($inquiry_type == 4){
|
||
$params['multi_point_status'] = 1;
|
||
}
|
||
|
||
$doctor_inquiry_config_params = array();
|
||
$doctor_inquiry_config_params['inquiry_type'] = $inquiry_type;
|
||
$doctor_inquiry_config_params['inquiry_mode'] = 1;
|
||
$doctor_inquiry_config_params['is_enable'] = 1;
|
||
|
||
$params['is_platform_deep_cooperation'] = 1;
|
||
|
||
$user_doctor = UserDoctor::getListWithConfig($params,$not_doctor_ids,$doctor_inquiry_config_params);
|
||
return $user_doctor->toArray();
|
||
}
|
||
|
||
/**
|
||
* 获取在线的自由注册医生
|
||
* @param string $inquiry_type
|
||
* @param array $not_doctor_ids
|
||
* @return array
|
||
*/
|
||
public function getOnlineDoctor(string $inquiry_type,array $not_doctor_ids): array
|
||
{
|
||
$params = array();
|
||
$params['status'] = 1;
|
||
$params['idcard_status'] = 1;
|
||
$params['iden_auth_status'] = 1;
|
||
$params['is_bind_bank'] = 1;
|
||
|
||
// 问诊购药
|
||
if ($inquiry_type == 4){
|
||
$params['multi_point_status'] = 1;
|
||
}
|
||
|
||
$doctor_inquiry_config_params = array();
|
||
$doctor_inquiry_config_params['inquiry_type'] = $inquiry_type;
|
||
$doctor_inquiry_config_params['inquiry_mode'] = 1;
|
||
$doctor_inquiry_config_params['is_enable'] = 1;
|
||
|
||
$params['is_platform_deep_cooperation'] = 0;
|
||
$user_doctor = UserDoctor::getListWithConfig($params,$not_doctor_ids,$doctor_inquiry_config_params);
|
||
return $user_doctor->toArray();
|
||
}
|
||
|
||
/**
|
||
* 检测医生是否可被分配
|
||
* @param array $doctor_ids
|
||
* @param string $patient_id
|
||
* @param string|int $is_check_inquiry_num 是否检测问诊数量 0:否 1:是
|
||
* @param string $inquiry_type
|
||
* @return array
|
||
*/
|
||
public function checkDoctorCanBeAssigned(array $doctor_ids,string $patient_id,string|int $is_check_inquiry_num,string $inquiry_type): array
|
||
{
|
||
$result = array();
|
||
$result['not_doctor_ids'] = [];
|
||
$result['doctor_id'] = [];
|
||
|
||
if (empty($doctor_ids)){
|
||
return $result;
|
||
}
|
||
|
||
$doctor = [];
|
||
foreach ($doctor_ids as $item){
|
||
// 检测当前医生是否和患者存在未完成问诊订单
|
||
$InquiryService = new InquiryService();
|
||
$order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($patient_id,$item);
|
||
if (!empty($order_inquiry)){
|
||
// 存在未完成问诊订单,记录该医生id,重新分配
|
||
$result['not_doctor_ids'][] = $order_inquiry['doctor_id'];
|
||
continue;
|
||
}
|
||
|
||
$UserDoctorService = new UserDoctorService();
|
||
|
||
// 检测接诊数量
|
||
$order_inquiry_count = 0;
|
||
if ($is_check_inquiry_num){
|
||
// 获取医生每日最大接诊数量
|
||
$max_work_num_day = $UserDoctorService->getDoctorInquiryDayMaxNum($item,$inquiry_type,1);
|
||
|
||
// 获取医生当日有效问诊数量
|
||
$inquiryService = new InquiryService();
|
||
$order_inquiry_count = $inquiryService->getDoctorDayInquiryCount($item, $inquiry_type);
|
||
|
||
// 计算剩余未接诊数量 = 最大数量-
|
||
$access_inquiry_num = $max_work_num_day - $order_inquiry_count;
|
||
|
||
if ($access_inquiry_num <= 0){
|
||
// 分配的医生无问诊次数,重新分配
|
||
$result['not_doctor_ids'][] = $item;
|
||
continue;
|
||
}
|
||
}
|
||
|
||
$data = array();
|
||
$data['doctor_id'] = $item;
|
||
$data['order_inquiry_count'] = $order_inquiry_count;
|
||
$doctor[] = $data;
|
||
}
|
||
|
||
if (!empty($doctor)){
|
||
$order_inquiry_counts = array_column($doctor,'order_inquiry_count');
|
||
array_multisort($order_inquiry_counts,SORT_ASC,$doctor);
|
||
}
|
||
|
||
if (isset($doctor[0])){
|
||
$result['doctor_id'] = $doctor[0]['doctor_id'];
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 获取医生是否可处方图标展示状态
|
||
* @param string $doctor_id 医生id
|
||
* @param array|object $doctor_inquiry_configs 医生问诊配置
|
||
* @return int
|
||
*/
|
||
public function getDoctorMultiPointEnable(string $doctor_id = "",array|object $doctor_inquiry_configs = []): int
|
||
{
|
||
$multi_point_enable = 0; // 是否开启问诊购药
|
||
if (!empty($doctor_inquiry_configs)){
|
||
foreach ($doctor_inquiry_configs as $doctor_inquiry_config ){
|
||
if ($doctor_inquiry_config['inquiry_type'] == 4 && $doctor_inquiry_config['inquiry_mode'] == 1 && $doctor_inquiry_config['is_enable'] == 1){
|
||
$multi_point_enable = 1;
|
||
}
|
||
}
|
||
} else {
|
||
if (empty($doctor_id)){
|
||
return $multi_point_enable;
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_type'] = 4;
|
||
$params['inquiry_mode'] = 1;
|
||
$params['is_enable'] = 1;
|
||
$result = DoctorInquiryConfig::getOne($params);
|
||
if (!empty($result)){
|
||
$multi_point_enable = 1; // 是否开启问诊购药
|
||
}
|
||
}
|
||
|
||
return $multi_point_enable;
|
||
}
|
||
} |