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; } }