hospital-applets-api/app/Services/UserDoctorService.php
wucongxing8150 bde4ef5a0f
Some checks failed
Build Docker / build (push) Has been cancelled
新增了字段返回
2025-09-04 13:01:00 +08:00

2943 lines
113 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Services;
use App\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;
}
}