From 75737cf95c6344ba7f36ac00f76a822ee1d14426 Mon Sep 17 00:00:00 2001 From: chenqi Date: Wed, 11 Mar 2026 16:21:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(doctorstation):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=8E=A5=E8=AF=8A=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在医生工作站界面添加取消接诊按钮 - 实现取消接诊的前端处理逻辑和确认对话框 - 添加计算属性控制取消接诊按钮的禁用状态 - 完善后端取消接诊服务的安全性检查和异常处理 - 优化取消接诊时的业务数据验证流程 - 添加详细的错误提示和用户反馈机制 --- .../impl/DoctorStationMainAppServiceImpl.java | 78 +++++++++++++------ .../src/views/doctorstation/index.vue | 40 ++++++++++ 2 files changed, 95 insertions(+), 23 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java index fae8b8e4..5d022053 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java @@ -230,35 +230,67 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer */ @Override public R cancelEncounter(Long encounterId) { - //1.判断是否已经产生业务,如医生已经开有病历、处方、诊断、检验检查或相关项目已收费、执行等, - //如果有则提示:需要医生删除、作废、退费才能【取消接诊】。 - //1.1病历 - Object emrDetailResult = iDoctorStationEmrAppService.getEmrDetail(encounterId).getData(); + try { + //1.判断是否已经产生业务,如医生已经开有病历、处方、诊断、检验检查或相关项目已收费、执行等, + //如果有则提示:需要医生删除、作废、退费才能【取消接诊】。 + + //1.1病历 + Object emrDetailResult = null; + try { + emrDetailResult = iDoctorStationEmrAppService.getEmrDetail(encounterId).getData(); + } catch (Exception e) { + log.debug("获取病历信息失败: {}", e.getMessage()); + } - //1.2诊断 - Object diagnosisResult = iDoctorStationDiagnosisAppService.getEncounterDiagnosis(encounterId).getData(); + //1.2诊断 + Object diagnosisResult = null; + try { + diagnosisResult = iDoctorStationDiagnosisAppService.getEncounterDiagnosis(encounterId).getData(); + } catch (Exception e) { + log.debug("获取诊断信息失败: {}", e.getMessage()); + } - //1.3处方 - Object adviceResult = iDoctorStationAdviceAppService.getRequestBaseInfo(encounterId).getData(); + //1.3处方 + Object adviceResult = null; + try { + adviceResult = iDoctorStationAdviceAppService.getRequestBaseInfo(encounterId).getData(); + } catch (Exception e) { + log.debug("获取处方信息失败: {}", e.getMessage()); + } - //1.4中医诊断、处方 - Map tcmDiagnosisResult = (Map) iDoctorStationChineseMedicalAppService.getTcmEncounterDiagnosis(encounterId).getData(); - Object symptom = tcmDiagnosisResult.get("symptom"); - Object illness = tcmDiagnosisResult.get("illness"); - Object tcmPrescriptionResult = iDoctorStationChineseMedicalAppService.getTcmRequestBaseInfo(encounterId).getData(); + //1.4中医诊断、处方 + Object symptom = null; + Object illness = null; + Object tcmPrescriptionResult = null; + + try { + Map tcmDiagnosisResult = (Map) iDoctorStationChineseMedicalAppService.getTcmEncounterDiagnosis(encounterId).getData(); + if (tcmDiagnosisResult != null) { + symptom = tcmDiagnosisResult.get("symptom"); + illness = tcmDiagnosisResult.get("illness"); + } + tcmPrescriptionResult = iDoctorStationChineseMedicalAppService.getTcmRequestBaseInfo(encounterId).getData(); + } catch (Exception e) { + // 中医模块可能未启用或返回异常,忽略 + log.debug("获取中医信息失败,可能未配置中医模块: {}", e.getMessage()); + } - boolean isEmpty = ObjectUtil.isAllEmpty(emrDetailResult, diagnosisResult, adviceResult, symptom,illness, tcmPrescriptionResult); + boolean isEmpty = ObjectUtil.isAllEmpty(emrDetailResult, diagnosisResult, adviceResult, symptom, illness, tcmPrescriptionResult); - if (!isEmpty) { - return R.fail(); + if (!isEmpty) { + return R.fail("该患者已产生业务数据(病历、诊断、处方等),无法直接取消接诊。请先删除相关数据后再操作。"); + } + + //2.取消接诊,患者重新回到患者队列待诊中 + int update = encounterMapper.update(null, + new LambdaUpdateWrapper().eq(Encounter::getId, encounterId) + .set(Encounter::getStatusEnum, EncounterStatus.PLANNED.getValue()) + .set(Encounter::getSubjectStatusEnum, EncounterSubjectStatus.TRIAGED.getValue())); + return update > 0 ? R.ok("取消接诊成功") : R.fail("取消接诊失败,请刷新后重试"); + } catch (Exception e) { + log.error("取消接诊时发生错误,encounterId={}", encounterId, e); + return R.fail("取消接诊失败:" + e.getMessage()); } - - //2.取消接诊,患者重新回到患者队列待诊中 - int update = encounterMapper.update(null, - new LambdaUpdateWrapper().eq(Encounter::getId, encounterId) - .set(Encounter::getStatusEnum, EncounterStatus.PLANNED.getValue()) - .set(Encounter::getSubjectStatusEnum, EncounterSubjectStatus.TRIAGED.getValue())); - return update > 0 ? R.ok() : R.fail(); } /** diff --git a/openhis-ui-vue3/src/views/doctorstation/index.vue b/openhis-ui-vue3/src/views/doctorstation/index.vue index 73d2f009..b7cc09ac 100644 --- a/openhis-ui-vue3/src/views/doctorstation/index.vue +++ b/openhis-ui-vue3/src/views/doctorstation/index.vue @@ -102,6 +102,7 @@ 完诊 暂离 + 取消接诊 退费 处方单 办理住院 @@ -193,6 +194,7 @@ import { getList, isHospitalization, leaveEncounter, + cancelEncounter, } from './components/api.js'; import prescriptionlist from './components/prescription/prescriptionlist.vue'; import RefundListDialog from './components/prescription/refundListDialog.vue'; @@ -282,6 +284,16 @@ const isHospitalizationButtonDisabled = computed(() => { patientInfo.value.encounterId === undefined; }); +// 计算属性:确定取消接诊按钮是否应被禁用 +const isCancelButtonDisabled = computed(() => { + return !patientInfo.value || + typeof patientInfo.value !== 'object' || + !patientInfo.value.encounterId || + patientInfo.value.encounterId === '' || + patientInfo.value.encounterId === null || + patientInfo.value.encounterId === undefined; +}); + // 计算属性:确定退费按钮是否应被禁用(与住院按钮使用相同的逻辑) const isRefundButtonDisabled = computed(() => { return !patientInfo.value || @@ -628,6 +640,34 @@ function handleLeave(encounterId) { }); } +function handleCancel(encounterId) { + if (!encounterId) { + ElMessage.warning('请先选择患者后再进行取消接诊操作'); + return; + } + ElMessageBox.confirm('确定要取消接诊该患者吗?取消后患者将回到待诊状态。', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + cancelEncounter(encounterId).then((res) => { + if (res.code == 200) { + proxy.$modal.msgSuccess('取消接诊成功'); + patientInfo.value = {}; + getPatientList(); + getWaitPatient(); + } else { + proxy.$modal.msgError(res.msg || '取消接诊失败'); + } + }).catch((error) => { + console.error('取消接诊失败:', error); + proxy.$modal.msgError('取消接诊失败'); + }); + }).catch(() => { + // 用户取消操作,不做处理 + }); +} + async function handleFinish(encounterId) { // 完诊前验证诊断信息 try {