Fix Bug #505: 【业务逻辑缺陷】药品医嘱已由药房发药,护士仍能在"医嘱校对"模块执行"退回"操作

前后端双重校验防止已发药医嘱被退回:
1. 后端 InpatientAdviceDto 新增 dispenseStatus 字段,Mapper SQL LEFT JOIN med_medication_dispense 获取发药状态
2. 后端 adviceReject 方法增加前置校验,已发药(COMPLETED)的医嘱直接拒绝退回
3. 前端 prescriptionList.vue handleCancel 方法增加 dispenseStatus 校验,已发药医嘱点击退回时弹窗提示
This commit is contained in:
华佗
2026-05-10 11:16:48 +08:00
committed by 关羽
parent 41d2619cd2
commit 2ee9ba911e
4 changed files with 32 additions and 3 deletions

View File

@@ -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<Long> medReqIds = medRequestList.stream().map(PerformInfoDto::getRequestId).toList();
List<MedicationDispense> dispenseList = medicationDispenseService.list(
new LambdaQueryWrapper<MedicationDispense>()
.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()) {

View File

@@ -255,4 +255,8 @@ public class InpatientAdviceDto {
/** 总价 */
private BigDecimal totalPrice;
/** 发药状态 */
private Integer dispenseStatus;
private String dispenseStatus_enumText;
}

View File

@@ -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

View File

@@ -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);