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'] = $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 */ 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', ]; $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, "已绑定银行卡"); } // 处理银行卡掩码 $bank_card_code_mask = Mask::maskBankCard($bank_card_code); // 验证银行卡 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); Db::commit(); } catch (\Exception $e) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage()); } return success(); } /** * 更换医生银行卡 * @return array */ 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['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['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") ?? []; $prescription_status = $this->request->input('prescription_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'] = $prescription_status; $params['is_delete'] = 0; $order_prescriptions = OrderPrescription::getWithIcdPage($params); if (empty($order_prescriptions)) { return success($order_prescriptions); } // 处理数据 $result = array(); foreach ($order_prescriptions['data'] as $order_prescription) { $data = array(); $data['patient_name'] = $order_prescription['patient_name']; $data['patient_sex'] = $order_prescription['patient_sex']; $data['patient_age'] = $order_prescription['patient_age']; $data['created_at'] = $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'] ?? []; $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', 'avatar', ]; $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, "请先完成多点执业认证"); } $user_doctor = $user_doctor->toArray(); // 获取医生账户余额-未提现金额 $DoctorAccountService = new DoctorAccountService(); $balance_account = $DoctorAccountService->getDoctorBalanceAccount($user_info['client_user_id']); if ($balance_account > 0) { $balance_account = $balance_account * 0.75; } // 获取医生当日接诊的订单金额 $InquiryService = new InquiryService(); $estimate_income = $InquiryService->getDoctorDayAmountTotal($user_info['client_user_id'], date('Y-m-d', time())); if (!empty($estimate_income)) { $estimate_income = $estimate_income * 0.75; } $user_doctor['avatar'] = addAliyunOssWebsite($user_doctor['avatar']); $user_doctor['balance_account'] = $balance_account; $user_doctor['estimate_income'] = $estimate_income; 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']; $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']; $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 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(); } $params = array(); $params['doctor_id'] = $doctor_id; // 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, 80]; } else { return fail(); } $order_evaluation = OrderEvaluation::getScorePage($params, $avg_score_params); if (!empty($order_evaluation['data'])) { foreach ($order_evaluation['data'] as &$item) { $item['avg_score'] = floor($item['avg_score'] * 0.05); } } // 获取其他类型评论总数 if ($evaluation_type != 1) { // 好评 $avg_score_params = [80, 100]; $good_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params); // 中/差评 $avg_score_params = [0, 80]; $bad_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params); } if ($evaluation_type != 2) { // 全部+ $avg_score_params = [0, 100]; $total_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params); // 中/差评 $avg_score_params = [0, 80]; $bad_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params); } if ($evaluation_type != 3) { // 全部+ $avg_score_params = [0, 100]; $total_quantity = OrderEvaluation::getScoreCount($params, $avg_score_params); // 好评 $avg_score_params = [80, 100]; $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', 'avatar', 'brief_introduction', ]; $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 = [ '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']; } $user_doctor['avatar'] = addAliyunOssWebsite($user_doctor['avatar']); 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); 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_inquiry_id, $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'] ?? "";// 医嘱 return success($result); } /** * 修改处方 * @return array * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function putPrescription(): array { $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']; $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); } // 获取处方数据 $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'] == 5) { // 已使用 return fail(HttpEnumCode::HTTP_ERROR, "处方已使用,无法更改"); } if ($order_prescription['is_delete'] == 1) { // 已使用 return fail(HttpEnumCode::HTTP_ERROR, "处方已删除,无法更改"); } Db::beginTransaction(); try { // 修改订单-处方表 $params = array(); $params['order_prescription_id'] = $order_prescription_id; $data = array(); $data['prescription_status'] = 1; // 处方状态(1:待审核 3:待使用 4:已失效 5:已使用) $data['pharmacist_fail_reason'] = ""; // 药师审核驳回原因 $data['platform_audit_status'] = 0; // 处方平台审核状态(0:审核中 1:审核成功 2:审核驳回) $data['platform_fail_reason'] = ""; // 处方平台驳回原因 if ($order_prescription['doctor_advice'] != $doctor_advice) { $data['doctor_advice'] = $doctor_advice; // 医嘱 } OrderPrescription::edit($params, $data); // 删除订单-处方关联疾病表 $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); 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']['real_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(); } unset($product); } // 加入分配药师队列 $data = array(); $data['order_prescription_id'] = $order_prescription_id; $message = new PrescriptionDistributePhProducer($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'); // 获取医生信息 $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); } // 获取问诊订单数据 $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, 6, 7])) { // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) return fail(HttpEnumCode::HTTP_ERROR, "订单无法开具处方"); } // 检测处方是否重复开具 $params = array(); $params['order_prescription_id'] = $order_inquiry['order_inquiry_id']; $params['doctor_id'] = $user_info['client_user_id']; $order_prescription = OrderPrescription::getOne($params); if (!empty($order_prescription)) { return fail(HttpEnumCode::HTTP_ERROR, "订单已开具处方,无法重复开具"); } Db::beginTransaction(); $generator = $this->container->get(IdGeneratorInterface::class); try { // 新增处方表 $data = array(); $data['order_inquiry_id'] = $order_inquiry_id; $data['doctor_id'] = $user_info['client_user_id']; $data['prescription_status'] = 1; $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); } 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']['real_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(); } unset($product); } // 加入分配药师队列 $data = array(); $data['order_prescription_id'] = $order_prescription['order_prescription_id']; $message = new PrescriptionDistributePhProducer($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(); } /** * 获取医生名片 * @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', ]; $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); } // 获取医生医院 $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); $options = [ "scene" => "doctor_id=" . $user_doctor['doctor_id'],// query 参数 "page" => "", "check_path" => false, "env_version" => "develop", ]; $img_buffer = $weChat->getUnlimitedQRCode($options); $oss = new Oss(); $filename = $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); } /** * 检测医生身份认证 * @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 (isset($user_doctor['iden_auth_status'])) { if ($user_doctor['iden_auth_status'] != 1) { return "请先完成身份认证"; } } if (isset($user_doctor['idcard_status'])) { if ($user_doctor['idcard_status'] != 1) { return "请先完成实名认证"; } } if (isset($user_doctor['multi_point_status'])) { if ($user_doctor['multi_point_status'] != 1) { return "请先完成多点执业认证"; } } return true; } /** * 检测是否存在对应问诊的在线医生 * @param int|string $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) * @return bool */ public function checkDoctorOnline(int|string $inquiry_type): bool { $params = array(); $params['status'] = 1; // 状态 $params['idcard_status'] = 1; // 实名认证状态 $params['iden_auth_status'] = 1;// 身份认证状态 if ($inquiry_type == 4) { // 问诊购药 $params['multi_point_status'] = 1;// 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) } $params['is_online'] = 1;// 是否在线(0:不在线 1:在线) switch ($inquiry_type) { case 1: // 专家 $params['is_img_expert_reception'] = 1;// 是否参加专家图文接诊(0:否 1:是) break; case 2: // 快速 $params['is_img_quick_reception'] = 1;// 是否参加快速图文接诊(0:否 1:是) break; case 3: // 公益 $params['is_img_welfare_reception'] = 1;// 是否参加公益图文问诊(0:否 1:是) break; default: throw new BusinessException(); break; } return UserDoctor::getExists($params); } /** * 获取当前时间N分钟前接诊中的医生 * @param string|int $minute 分钟 * @param int|string $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) * @return array */ public function getBeforeCurrentTimeDoctor(string|int $minute, int|string $inquiry_type): 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 = array(); $inquiry_status_params = [4, 5]; $order_inquiry = OrderInquiry::getInquiryStatusList($params, $inquiry_status_params); if (empty($order_inquiry)) { return []; } return $order_inquiry->toArray(); } }