From ffc2562aea6c05924772d79d80262f3aabdee2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= <华佗@gentronhealth.com> Date: Sun, 10 May 2026 11:16:48 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#505:=20=E3=80=90=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=BC=BA=E9=99=B7=E3=80=91=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E5=8C=BB=E5=98=B1=E5=B7=B2=E7=94=B1=E8=8D=AF=E6=88=BF=E5=8F=91?= =?UTF-8?q?=E8=8D=AF=EF=BC=8C=E6=8A=A4=E5=A3=AB=E4=BB=8D=E8=83=BD=E5=9C=A8?= =?UTF-8?q?"=E5=8C=BB=E5=98=B1=E6=A0=A1=E5=AF=B9"=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=89=A7=E8=A1=8C"=E9=80=80=E5=9B=9E"=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前后端双重校验防止已发药医嘱被退回: 1. 后端 InpatientAdviceDto 新增 dispenseStatus 字段,Mapper SQL LEFT JOIN med_medication_dispense 获取发药状态 2. 后端 adviceReject 方法增加前置校验,已发药(COMPLETED)的医嘱直接拒绝退回 3. 前端 prescriptionList.vue handleCancel 方法增加 dispenseStatus 校验,已发药医嘱点击退回时弹窗提示 --- .../impl/AdviceProcessAppServiceImpl.java | 13 +++++++++++++ .../dto/InpatientAdviceDto.java | 4 ++++ .../AdviceProcessAppMapper.xml | 12 +++++++++--- .../components/prescriptionList.vue | 6 ++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java index 95061f5f..7aa6c437 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java @@ -206,6 +206,8 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { e.setTherapyEnum_enumText(EnumUtils.getInfoByValue(TherapyTimeType.class, e.getTherapyEnum())); // 请求状态 e.setRequestStatus_enumText(EnumUtils.getInfoByValue(RequestStatus.class, e.getRequestStatus())); + // 发药状态 + e.setDispenseStatus_enumText(EnumUtils.getInfoByValue(DispenseStatus.class, e.getDispenseStatus())); // 性别枚举 e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum())); // 计算年龄 @@ -356,6 +358,17 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { medRequestList.add(item); } } + // 校验药品医嘱是否已发药,已发药的医嘱不允许退回 + if (!medRequestList.isEmpty()) { + List medReqIds = medRequestList.stream().map(PerformInfoDto::getRequestId).toList(); + List dispenseList = medicationDispenseService.list( + new LambdaQueryWrapper() + .in(MedicationDispense::getMedReqId, medReqIds) + .eq(MedicationDispense::getStatusEnum, DispenseStatus.COMPLETED.getValue())); + if (!dispenseList.isEmpty()) { + return R.fail("该医嘱已发药,无法退回"); + } + } Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId(); Date checkDate = new Date(); if (!serviceRequestList.isEmpty()) { diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/InpatientAdviceDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/InpatientAdviceDto.java index be06f1bd..c923652f 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/InpatientAdviceDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/InpatientAdviceDto.java @@ -255,4 +255,8 @@ public class InpatientAdviceDto { /** 总价 */ private BigDecimal totalPrice; + + /** 发药状态 */ + private Integer dispenseStatus; + private String dispenseStatus_enumText; } diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml index 15aa547c..3aa27ecb 100755 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml @@ -153,7 +153,8 @@ ii.balance_amount AS balance_amount, ii.account_id AS account_id, ii.performer_check_id, - ii.category_code + ii.category_code, + ii.dispense_status FROM (( SELECT T1.encounter_id, T1.tenant_id, #{medMedicationRequest} AS advice_table, @@ -197,7 +198,8 @@ pra."name" AS admitting_doctor_name, personal_account.balance_amount, personal_account.id AS account_id, - T2.category_code + T2.category_code, + mmd.status_enum AS dispense_status FROM med_medication_request AS T1 LEFT JOIN med_medication_definition AS T2 ON T2.id = T1.medication_id @@ -278,6 +280,9 @@ aa.balance_amount ) AS personal_account ON personal_account.encounter_id = ae.id + LEFT JOIN med_medication_dispense mmd + ON mmd.med_req_id = T1.id + AND mmd.delete_flag = '0' WHERE T1.delete_flag = '0' AND T1.refund_medicine_id IS NULL AND T1.generate_source_enum = #{doctorPrescription} @@ -331,7 +336,8 @@ pra."name" AS admitting_doctor_name, personal_account.balance_amount, personal_account.id AS account_id, - T2.category_code + T2.category_code, + NULL AS dispense_status FROM wor_service_request AS T1 LEFT JOIN wor_activity_definition AS T2 ON T2.id = T1.activity_id diff --git a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue index d34d0961..d666fd61 100755 --- a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/prescriptionList.vue @@ -288,6 +288,12 @@ function handleCheck() { function handleCancel() { let list = getSelectRows(); if (list.length > 0) { + // 校验已发药的医嘱不允许退回 + let dispensedItems = list.filter(item => item.dispenseStatus === 4); + if (dispensedItems.length > 0) { + proxy.$message.error('该医嘱已发药,无法退回'); + return; + } cancel(list).then((res) => { if (res.code == 200) { proxy.$modal.msgSuccess(res.msg);