fix(#718): 停嘱流程优化 — 医嘱状态流转与护士站同步

由 AI Agent (zhaoyun) 自动修复
This commit is contained in:
2026-06-10 09:00:12 +08:00
committed by 华佗
parent af6fdbf7d6
commit 7b1777a91e
6 changed files with 83 additions and 22 deletions

View File

@@ -189,13 +189,18 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
QueryWrapper<InpatientAdviceParam> queryWrapper
= HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null, null, null);
// 手动拼接requestStatus条件COMPLETED(3)时同时包含CHECK_VERIFIED(10)和PENDING_RECEIVE(11)
// 手动拼接requestStatus条件
// COMPLETED(3)时同时包含CHECK_VERIFIED(10)和PENDING_RECEIVE(11)
// ACTIVE(2)时同时包含PENDING_STOP(13),以便护士核对停嘱医嘱
// UNION查询外层列名为request_statusT1.status_enum AS request_status不是status_enum
if (requestStatus != null) {
if (RequestStatus.COMPLETED.getValue().equals(requestStatus)) {
queryWrapper.in("request_status",
RequestStatus.COMPLETED.getValue(), RequestStatus.CHECK_VERIFIED.getValue(),
RequestStatus.PENDING_RECEIVE.getValue());
} else if (RequestStatus.ACTIVE.getValue().equals(requestStatus)) {
queryWrapper.in("request_status",
RequestStatus.ACTIVE.getValue(), RequestStatus.PENDING_STOP.getValue());
} else {
queryWrapper.eq("request_status", requestStatus);
}
@@ -404,10 +409,29 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
List<Long> serviceReqIds = serviceRequestList.stream().map(PerformInfoDto::getRequestId).toList();
// 先查询服务请求,按 categoryEnum 分流:检查类(23)走 CHECK_VERIFIED其余走 COMPLETED
List<ServiceRequest> allServiceRequests = serviceRequestService.listByIds(serviceReqIds);
List<Long> checkReqIds = allServiceRequests.stream()
// 分离已停嘱(PENDING_STOP)的订单,护士核对后变为已停止(STOPPED)
List<ServiceRequest> pendingStopRequests = allServiceRequests.stream()
.filter(sr -> RequestStatus.PENDING_STOP.getValue().equals(sr.getStatusEnum()))
.toList();
List<ServiceRequest> normalRequests = allServiceRequests.stream()
.filter(sr -> !RequestStatus.PENDING_STOP.getValue().equals(sr.getStatusEnum()))
.toList();
// 已停嘱订单 → 已停止(STOPPED)
if (!pendingStopRequests.isEmpty()) {
List<Long> pendingStopIds = pendingStopRequests.stream().map(ServiceRequest::getId).toList();
serviceRequestService.update(new LambdaUpdateWrapper<ServiceRequest>()
.in(ServiceRequest::getId, pendingStopIds)
.set(ServiceRequest::getStatusEnum, RequestStatus.STOPPED.getValue())
.set(ServiceRequest::getUpdateBy, SecurityUtils.getNickName()));
}
// 正常订单:检查类 → 已校对CHECK_VERIFIED=10其余 → 已完成COMPLETED=3
List<Long> checkReqIds = normalRequests.stream()
.filter(sr -> ActivityDefCategory.TEST.getValue().equals(sr.getCategoryEnum()))
.map(ServiceRequest::getId).toList();
List<Long> otherReqIds = allServiceRequests.stream()
List<Long> otherReqIds = normalRequests.stream()
.filter(sr -> !ActivityDefCategory.TEST.getValue().equals(sr.getCategoryEnum()))
.map(ServiceRequest::getId).toList();
// 检查类 → 已校对CHECK_VERIFIED=10
@@ -419,7 +443,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
serviceRequestService.updateCompleteRequestStatus(otherReqIds, practitionerId, checkDate);
}
// 处理转科/出院等特殊医嘱
for (ServiceRequest serviceRequest : allServiceRequests) {
for (ServiceRequest serviceRequest : normalRequests) {
if (ActivityDefCategory.TRANSFER.getValue().equals(serviceRequest.getCategoryEnum())) {
encounterService.updateEncounterStatus(serviceRequest.getEncounterId(),
EncounterZyStatus.PENDING_TRANSFER.getValue());
@@ -430,9 +454,30 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
}
}
if (!medRequestList.isEmpty()) {
// 更新药品请求状态已完成
medicationRequestService.updateCompletedStatusBatch(
medRequestList.stream().map(PerformInfoDto::getRequestId).toList(), practitionerId, checkDate);
List<Long> medReqIds = medRequestList.stream().map(PerformInfoDto::getRequestId).toList();
// 查询药品请求,分离已停嘱(PENDING_STOP)的订单
List<MedicationRequest> allMedRequests = medicationRequestService.list(
new LambdaQueryWrapper<MedicationRequest>()
.select(MedicationRequest::getId, MedicationRequest::getStatusEnum)
.in(MedicationRequest::getId, medReqIds));
List<Long> pendingStopMedIds = allMedRequests.stream()
.filter(mr -> RequestStatus.PENDING_STOP.getValue().equals(mr.getStatusEnum()))
.map(MedicationRequest::getId).toList();
List<Long> normalMedIds = allMedRequests.stream()
.filter(mr -> !RequestStatus.PENDING_STOP.getValue().equals(mr.getStatusEnum()))
.map(MedicationRequest::getId).toList();
// 已停嘱订单 → 已停止(STOPPED)
if (!pendingStopMedIds.isEmpty()) {
medicationRequestService.update(new LambdaUpdateWrapper<MedicationRequest>()
.in(MedicationRequest::getId, pendingStopMedIds)
.set(MedicationRequest::getStatusEnum, RequestStatus.STOPPED.getValue())
.set(MedicationRequest::getUpdateBy, SecurityUtils.getNickName()));
}
// 正常订单 → 已完成(COMPLETED)
if (!normalMedIds.isEmpty()) {
medicationRequestService.updateCompletedStatusBatch(normalMedIds, practitionerId, checkDate);
}
}
return R.ok(null, "校对成功");
}

View File

@@ -1122,14 +1122,14 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
iMedicationRequestService.update(new LambdaUpdateWrapper<MedicationRequest>()
.in(MedicationRequest::getId, medicineRequestIds)
.set(MedicationRequest::getEffectiveDoseEnd, stopTime)
.set(MedicationRequest::getStatusEnum, RequestStatus.STOPPED.getValue())
.set(MedicationRequest::getStatusEnum, RequestStatus.PENDING_STOP.getValue())
.set(MedicationRequest::getUpdateBy, stopUserName));
}
if (!activityRequestIds.isEmpty()) {
iServiceRequestService.update(new LambdaUpdateWrapper<ServiceRequest>()
.in(ServiceRequest::getId, activityRequestIds)
.set(ServiceRequest::getOccurrenceEndTime, stopTime)
.set(ServiceRequest::getStatusEnum, RequestStatus.STOPPED.getValue())
.set(ServiceRequest::getStatusEnum, RequestStatus.PENDING_STOP.getValue())
.set(ServiceRequest::getUpdateBy, stopUserName));
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"医嘱停止"}));
@@ -1173,7 +1173,8 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
.select(MedicationRequest::getId, MedicationRequest::getStatusEnum)
.in(MedicationRequest::getId, medicineRequestIds));
for (MedicationRequest mr : medicineRequestList) {
if (!RequestStatus.STOPPED.getValue().equals(mr.getStatusEnum())) {
if (!RequestStatus.STOPPED.getValue().equals(mr.getStatusEnum())
&& !RequestStatus.PENDING_STOP.getValue().equals(mr.getStatusEnum())) {
throw new ServiceException("护士站已确认停止该医嘱,无法取消停嘱!");
}
}
@@ -1184,7 +1185,8 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
.select(ServiceRequest::getId, ServiceRequest::getStatusEnum)
.in(ServiceRequest::getId, activityRequestIds));
for (ServiceRequest sr : activityRequestList) {
if (!RequestStatus.STOPPED.getValue().equals(sr.getStatusEnum())) {
if (!RequestStatus.STOPPED.getValue().equals(sr.getStatusEnum())
&& !RequestStatus.PENDING_STOP.getValue().equals(sr.getStatusEnum())) {
throw new ServiceException("护士站已确认停止该医嘱,无法取消停嘱!");
}
}

View File

@@ -74,6 +74,11 @@ public enum RequestStatus implements HisEnumInterface {
*/
CHECK_RECEIVED(12, "check_received", "已接收"),
/**
* 已停嘱(医生停嘱,等待护士核对)
*/
PENDING_STOP(13, "pending_stop", "已停嘱"),
/**
* 已完成(药品发药完成)
*/

View File

@@ -40,6 +40,8 @@ export const RequestStatus = {
PENDING_RECEIVE: 11,
/** 已接收(检查申请:医技科室已接单) */
CHECK_RECEIVED: 12,
/** 已停嘱(医生停嘱,等待护士核对) */
PENDING_STOP: 13,
/** 已完成(药品发药完成) */
DISPENSE_COMPLETED: 20,
};
@@ -59,6 +61,7 @@ export const RequestStatusDescriptions = {
10: '已校对',
11: '待接收',
12: '已接收',
13: '已停嘱',
20: '已完成',
};

View File

@@ -268,6 +268,7 @@
<el-tag v-else-if="scope.row.statusEnum == 10" type="primary">已校对</el-tag>
<el-tag v-else-if="scope.row.statusEnum == 11" type="primary">待接收</el-tag>
<el-tag v-else-if="scope.row.statusEnum == 3" type="success">已校对</el-tag>
<el-tag v-else-if="scope.row.statusEnum == 13" type="warning">已停嘱</el-tag>
<el-tag v-else-if="scope.row.statusEnum == 6" type="danger">停止</el-tag>
<el-tag v-else-if="scope.row.statusEnum == 20" type="success">已完成</el-tag>
<el-tag v-else type="info">{{ scope.row.chargeStatus_enumText }}</el-tag>
@@ -638,6 +639,10 @@ const statusOption = [
label: '已签发',
value: 2,
},
{
label: '已停嘱',
value: 13,
},
{
label: '停止',
value: 6,
@@ -2235,10 +2240,10 @@ function handleStopAdvice() {
break;
}
}
// 找出停嘱的
// 找出停嘱的(已停止=6 或 已停嘱=13 的不允许再停)
for (let index = 0; index < selectRows.length; index++) {
const item = selectRows[index];
if (item.statusEnum == 6) {
if (item.statusEnum == 6 || item.statusEnum == 13) {
isStop = false;
break;
}
@@ -2342,11 +2347,11 @@ function handleResumeAdvice() {
});
return;
}
// 校验:只有状态为"停止"(statusEnum=6)的医嘱才能恢复
// 校验:只有状态为"停止"(statusEnum=6)或"已停嘱"(statusEnum=13)的医嘱才能恢复
let hasStopOrder = false;
for (let index = 0; index < selectRows.length; index++) {
const item = selectRows[index];
if (item.statusEnum == 6) {
if (item.statusEnum == 6 || item.statusEnum == 13) {
hasStopOrder = true;
break;
}
@@ -2354,7 +2359,7 @@ function handleResumeAdvice() {
if (!hasStopOrder) {
ElMessage({
type: 'error',
message: '请选择已停止的医嘱进行恢复',
message: '请选择已停止或已停嘱的医嘱进行恢复',
});
return;
}
@@ -2362,7 +2367,7 @@ function handleResumeAdvice() {
let allStop = true;
for (let index = 0; index < selectRows.length; index++) {
const item = selectRows[index];
if (item.statusEnum != 6) {
if (item.statusEnum != 6 && item.statusEnum != 13) {
allStop = false;
break;
}
@@ -2370,7 +2375,7 @@ function handleResumeAdvice() {
if (!allStop) {
ElMessage({
type: 'error',
message: '恢复操作只能选择已停止的医嘱,请重新选择',
message: '恢复操作只能选择已停止或已停嘱的医嘱,请重新选择',
});
return;
}
@@ -2416,10 +2421,10 @@ function combination() {
break;
}
}
// 找出停嘱的
// 找出停嘱的(已停止或已停嘱的不允许组合)
for (let index = 0; index < selectRows.length; index++) {
const item = selectRows[index];
if (item.statusEnum == RequestStatus.STOPPED) {
if (item.statusEnum == RequestStatus.STOPPED || item.statusEnum == RequestStatus.PENDING_STOP) {
isStop = false;
break;
}
@@ -2516,10 +2521,10 @@ function split() {
break;
}
}
// 找出停嘱的
// 找出停嘱的(已停止或已停嘱的不允许拆组)
for (let index = 0; index < selectRows.length; index++) {
const item = selectRows[index];
if (item.statusEnum == RequestStatus.STOPPED) {
if (item.statusEnum == RequestStatus.STOPPED || item.statusEnum == RequestStatus.PENDING_STOP) {
isStop = false;
break;
}

View File

@@ -407,6 +407,7 @@ const getStatusType = (status) => {
[RequestStatus.COMPLETED]: 'success',
[RequestStatus.ON_HOLD]: 'warning',
[RequestStatus.CANCELLED]: 'danger',
[RequestStatus.PENDING_STOP]: 'warning',
[RequestStatus.STOPPED]: 'danger',
[RequestStatus.ENDED]: 'info',
};