diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/IAdviceManageAppService.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/IAdviceManageAppService.java index 5c493e092..d74e99c7f 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/IAdviceManageAppService.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/IAdviceManageAppService.java @@ -69,4 +69,12 @@ public interface IAdviceManageAppService { */ R stopRegAdvice(List paramList); + /** + * 住院医嘱取消停嘱(恢复) + * + * @param paramList 恢复参数 + * @return 结果 + */ + R cancelStopRegAdvice(List paramList); + } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java index a301cf2e7..f82249eee 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java @@ -18,6 +18,7 @@ import com.openhis.common.constant.PromptMsgConstant; import com.openhis.common.enums.*; import com.openhis.common.utils.EnumUtils; import com.openhis.common.utils.HisQueryUtils; +import com.openhis.medication.domain.MedicationDispense; import com.openhis.medication.domain.MedicationRequest; import com.openhis.medication.service.IMedicationDispenseService; import com.openhis.medication.service.IMedicationRequestService; @@ -1123,4 +1124,96 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { } + /** + * 住院医嘱取消停嘱(恢复) + * + * 核心业务逻辑: + * 1. 护士站校验:护士站尚未对该医嘱的停止进行"停止核对/确认"(即 dispense 状态未进入已发药/完成状态) + * 2. 药房端校验:药房尚未对该停嘱单进行退药接收/退费入库确认 + * 3. 若校验通过,将医嘱状态复原为"已签发";清空停嘱时间与停嘱医生字段; + * 同时自动作废已生成的待发药退回/退药申请 + * + * @param paramList 恢复参数 + * @return 结果 + */ + @Override + public R cancelStopRegAdvice(List paramList) { + // 药品 + List medicineList = paramList.stream() + .filter(e -> ItemType.MEDICINE.getValue().equals(e.getAdviceType())).collect(Collectors.toList()); + List medicineRequestIds + = medicineList.stream().map(AdviceBatchOpParam::getRequestId).collect(Collectors.toList()); + // 诊疗(包含护理adviceType=26) + List activityList = paramList.stream() + .filter(e -> ItemType.ACTIVITY.getValue().equals(e.getAdviceType()) + || (e.getAdviceType() != null && e.getAdviceType() == 26)) + .collect(Collectors.toList()); + List activityRequestIds + = activityList.stream().map(AdviceBatchOpParam::getRequestId).collect(Collectors.toList()); + + // ============ 前置校验 ============ + // 1. 护士站校验:查询药品发放记录,确认护士站是否已执行停止核对(发药) + if (!medicineRequestIds.isEmpty()) { + List dispenseList = iMedicationDispenseService.selectByRequestIdList(medicineRequestIds); + for (MedicationDispense dispense : dispenseList) { + // 如果发放状态 >= COMPLETED(4),说明护士站已发药/已确认停止 + if (dispense.getStatusEnum() != null && dispense.getStatusEnum() >= DispenseStatus.COMPLETED.getValue() + && !DispenseStatus.ON_HOLD.getValue().equals(dispense.getStatusEnum()) + && !DispenseStatus.STOPPED.getValue().equals(dispense.getStatusEnum()) + && !DispenseStatus.CANCELLED.getValue().equals(dispense.getStatusEnum())) { + throw new ServiceException("护士站已确认停止该医嘱,无法取消停嘱!"); + } + // 2. 药房端校验:如果已有退药/退费记录,说明药房已处理 + if (DispenseStatus.RETURNED.getValue().equals(dispense.getStatusEnum()) + || DispenseStatus.REFUNDED.getValue().equals(dispense.getStatusEnum()) + || DispenseStatus.PART_REFUND.getValue().equals(dispense.getStatusEnum())) { + throw new ServiceException("药房已完成退药处理,无法取消停嘱!"); + } + } + } + + // ============ 执行恢复 ============ + if (!medicineRequestIds.isEmpty()) { + // 恢复药品请求状态为"已发送"(ACTIVE=2),清空停嘱时间和更新人 + iMedicationRequestService.update(new LambdaUpdateWrapper() + .in(MedicationRequest::getId, medicineRequestIds) + .set(MedicationRequest::getStatusEnum, RequestStatus.ACTIVE.getValue()) + .set(MedicationRequest::getEffectiveDoseEnd, null) + .set(MedicationRequest::getUpdateBy, null)); + + // 作废/删除与这些药品请求相关的待退药发放记录 + List relatedDispenseList = iMedicationDispenseService.selectByRequestIdList(medicineRequestIds); + for (MedicationDispense dispense : relatedDispenseList) { + if (DispenseStatus.PENDING_REFUND.getValue().equals(dispense.getStatusEnum()) + || DispenseStatus.CANCELLED.getValue().equals(dispense.getStatusEnum()) + || DispenseStatus.ON_HOLD.getValue().equals(dispense.getStatusEnum())) { + // 将待退药/暂停/撤回的记录标记为草稿,或删除 + iMedicationDispenseService.update(new LambdaUpdateWrapper() + .eq(MedicationDispense::getId, dispense.getId()) + .set(MedicationDispense::getStatusEnum, DispenseStatus.DRAFT.getValue()) + .set(MedicationDispense::getStatusChangedTime, new Date())); + } + // 如果 dispense 已处于 STOPPED(6) 状态,也恢复为草稿以重新触发配药流程 + if (DispenseStatus.STOPPED.getValue().equals(dispense.getStatusEnum())) { + iMedicationDispenseService.update(new LambdaUpdateWrapper() + .eq(MedicationDispense::getId, dispense.getId()) + .set(MedicationDispense::getStatusEnum, DispenseStatus.PREPARATION.getValue()) + .set(MedicationDispense::getStatusChangedTime, new Date())); + } + } + } + + if (!activityRequestIds.isEmpty()) { + // 恢复诊疗请求状态为"已发送"(ACTIVE=2),清空停嘱时间和更新人 + iServiceRequestService.update(new LambdaUpdateWrapper() + .in(ServiceRequest::getId, activityRequestIds) + .set(ServiceRequest::getStatusEnum, RequestStatus.ACTIVE.getValue()) + .set(ServiceRequest::getOccurrenceEndTime, null) + .set(ServiceRequest::getUpdateBy, null)); + } + + return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"医嘱恢复"})); + + } + } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/AdviceManageController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/AdviceManageController.java index f41c9ce29..3648dd909 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/AdviceManageController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/AdviceManageController.java @@ -143,4 +143,15 @@ public class AdviceManageController { return iAdviceManageAppService.stopRegAdvice(paramList); } + /** + * 住院医嘱取消停嘱(恢复) + * + * @param paramList 恢复参数 + * @return 结果 + */ + @PostMapping(value = "/cancel-stop-reg-advice") + public R cancelStopRegAdvice(@RequestBody List paramList) { + return iAdviceManageAppService.cancelStopRegAdvice(paramList); + } + } diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/api.js b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/api.js index 853562ed4..3ff7d99c9 100755 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/api.js +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/api.js @@ -226,6 +226,17 @@ export function stopAdvice(data) { data: data, }); } + +/** + * 取消停嘱(恢复) + */ +export function cancelStopAdvice(data) { + return request({ + url: '/reg-doctorstation/advice-manage/cancel-stop-reg-advice', + method: 'post', + data: data, + }); +} /** * 获取患者本次就诊处方 */ diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue index d0be0856f..b1602908c 100755 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue @@ -31,6 +31,9 @@ 停嘱 + + 恢复 + 删除 诊断: @@ -402,6 +405,7 @@ import { savePrescriptionSign, singOut, stopAdvice, + cancelStopAdvice, updateGroupId, getConfiguredCategories, } from '../api'; @@ -2071,10 +2075,71 @@ function confirmStopAdvice() { getListInfo(false); } }); +} +// 恢复(取消停嘱) +function handleResumeAdvice() { + let selectRows = prescriptionRef.value.getSelectionRows(); + console.log('handleResumeAdvice selectRows======>', JSON.stringify(selectRows)); + if ((selectRows || []).length <= 0) { + ElMessage({ + type: 'error', + message: '请选择数据', + }); + return; + } + // 校验:只有状态为"停止"(statusEnum=6)的医嘱才能恢复 + let hasStopOrder = false; + for (let index = 0; index < selectRows.length; index++) { + const item = selectRows[index]; + if (item.statusEnum == 6) { + hasStopOrder = true; + break; + } + } + if (!hasStopOrder) { + ElMessage({ + type: 'error', + message: '请选择已停止的医嘱进行恢复', + }); + return; + } + // 校验:选择的医嘱中不能包含非停止状态的医嘱 + let allStop = true; + for (let index = 0; index < selectRows.length; index++) { + const item = selectRows[index]; + if (item.statusEnum != 6) { + allStop = false; + break; + } + } + if (!allStop) { + ElMessage({ + type: 'error', + message: '恢复操作只能选择已停止的医嘱,请重新选择', + }); + return; + } + ElMessageBox.confirm('确定要恢复选中的已停止医嘱吗?', '恢复确认', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + const requestIdList = selectRows.map((item) => ({ + requestId: item.requestId, + adviceType: item.adviceType, + })); + cancelStopAdvice(requestIdList).then((res) => { + if (res.code == 200) { + proxy.$modal.msgSuccess('操作成功'); + getListInfo(false); + } + }); + prescriptionRef.value.clearSelection(); + }).catch(() => {}); +} function handleGroupId(paramList) { updateGroupId(paramList); } -} // 组合 function combination() {