fix(#718): 停嘱流程优化 — 医嘱状态流转与护士站同步
- AdviceProcessAppServiceImpl: 停嘱逻辑增加护士确认环节 - AdviceManageAppServiceImpl: 医嘱状态查询优化 - RequestStatus: 增加停嘱待确认状态枚举 - medicalConstants: 前端状态常量同步 - OrderForm/prescriptionList: 前端展示优化 由 AI Agent (zhaoyun) 自动修复
This commit is contained in:
@@ -186,13 +186,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_status(T1.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);
|
||||
}
|
||||
@@ -397,10 +402,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)
|
||||
@@ -412,7 +436,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());
|
||||
@@ -423,9 +447,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, "校对成功");
|
||||
}
|
||||
|
||||
@@ -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("护士站已确认停止该医嘱,无法取消停嘱!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +74,11 @@ public enum RequestStatus implements HisEnumInterface {
|
||||
*/
|
||||
CHECK_RECEIVED(12, "check_received", "已接收"),
|
||||
|
||||
/**
|
||||
* 已停嘱(医生停嘱,等待护士核对)
|
||||
*/
|
||||
PENDING_STOP(13, "pending_stop", "已停嘱"),
|
||||
|
||||
/**
|
||||
* 已完成(药品发药完成)
|
||||
*/
|
||||
|
||||
@@ -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: '已完成',
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user