fix(doctorstation): 解决医嘱删除时的空指针异常和费用项处理问题

- 添加了对EMR详情中的contextJson字段进行空值检查,避免解析空值导致异常
- 优化了医嘱删除时的patientId和encounterId补全逻辑,支持从药品、耗材、诊疗医嘱记录中获取缺失信息
- 修复了删除不同类型医嘱时费用项过滤问题,确保只处理对应类型的费用项目
- 简化了费用项删除逻辑,移除冗余的查询验证步骤,直接执行删除操作
- 增强了日志记录,便于追踪医嘱删除过程中的关键操作和状态变化
This commit is contained in:
2026-03-24 13:27:31 +08:00
parent 9f6e94da4b
commit c2b1d7d9d9
2 changed files with 70 additions and 39 deletions

View File

@@ -486,11 +486,46 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 医嘱分类信息 // 医嘱分类信息
List<AdviceSaveDto> adviceSaveList = adviceSaveParam.getAdviceSaveList(); List<AdviceSaveDto> adviceSaveList = adviceSaveParam.getAdviceSaveList();
// 🔧 Bug Fix: 校验并补全patientId如果为null从encounter查询获取) // 🔧 Bug Fix: 校验并补全patientId和encounterId如果为null尝试从医嘱记录获取)
for (AdviceSaveDto adviceSaveDto : adviceSaveList) { for (AdviceSaveDto adviceSaveDto : adviceSaveList) {
// 对于删除操作如果encounterId为null尝试从医嘱记录获取
if (adviceSaveDto.getEncounterId() == null && DbOpType.DELETE.getCode().equals(adviceSaveDto.getDbOpType())) {
// 尝试从各类医嘱记录中获取encounterId
Long requestId = adviceSaveDto.getRequestId();
if (requestId != null) {
// 尝试从药品医嘱获取
MedicationRequest medRequest = iMedicationRequestService.getById(requestId);
if (medRequest != null && medRequest.getEncounterId() != null) {
adviceSaveDto.setEncounterId(medRequest.getEncounterId());
adviceSaveDto.setPatientId(medRequest.getPatientId());
log.info("BugFix: 删除药品医嘱时自动补全encounterId和patientId: requestId={}, encounterId={}, patientId={}",
requestId, medRequest.getEncounterId(), medRequest.getPatientId());
} else {
// 尝试从耗材医嘱获取
DeviceRequest devRequest = iDeviceRequestService.getById(requestId);
if (devRequest != null && devRequest.getEncounterId() != null) {
adviceSaveDto.setEncounterId(devRequest.getEncounterId());
adviceSaveDto.setPatientId(devRequest.getPatientId());
log.info("BugFix: 删除耗材医嘱时自动补全encounterId和patientId: requestId={}, encounterId={}, patientId={}",
requestId, devRequest.getEncounterId(), devRequest.getPatientId());
} else {
// 尝试从诊疗医嘱获取
ServiceRequest srvRequest = iServiceRequestService.getById(requestId);
if (srvRequest != null && srvRequest.getEncounterId() != null) {
adviceSaveDto.setEncounterId(srvRequest.getEncounterId());
adviceSaveDto.setPatientId(srvRequest.getPatientId());
log.info("BugFix: 删除诊疗医嘱时自动补全encounterId和patientId: requestId={}, encounterId={}, patientId={}",
requestId, srvRequest.getEncounterId(), srvRequest.getPatientId());
}
}
}
}
}
// 首先检查encounterId是否为null // 首先检查encounterId是否为null
if (adviceSaveDto.getEncounterId() == null) { if (adviceSaveDto.getEncounterId() == null) {
log.error("encounterId为null无法保存医嘱"); log.error("encounterId为null无法保存医嘱, dbOpType={}, requestId={}, adviceType={}",
adviceSaveDto.getDbOpType(), adviceSaveDto.getRequestId(), adviceSaveDto.getAdviceType());
return R.fail(null, "就诊信息不完整,请重新选择患者后再试"); return R.fail(null, "就诊信息不完整,请重新选择患者后再试");
} }
@@ -634,6 +669,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList()); List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) { if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList); List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
// 🔧 BugFix#219: 过滤只保留药品类型的费用项
if (chargeItemList != null && !chargeItemList.isEmpty()) {
chargeItemList = chargeItemList.stream()
.filter(ci -> CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(ci.getServiceTable()))
.collect(Collectors.toList());
}
if (chargeItemList != null && !chargeItemList.isEmpty()) { if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) { for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) { if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
@@ -646,20 +687,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
iMedicationRequestService.removeById(adviceSaveDto.getRequestId()); iMedicationRequestService.removeById(adviceSaveDto.getRequestId());
// 删除已经产生的药品发放信息 // 删除已经产生的药品发放信息
iMedicationDispenseService.deleteMedicationDispense(adviceSaveDto.getRequestId()); iMedicationDispenseService.deleteMedicationDispense(adviceSaveDto.getRequestId());
// 🔧 Bug Fix #219: 删除费用项前查询确认 // 🔧 Bug Fix #219: 删除费用项
Long requestId = adviceSaveDto.getRequestId(); Long requestId = adviceSaveDto.getRequestId();
String serviceTable = CommonConstants.TableName.MED_MEDICATION_REQUEST; String serviceTable = CommonConstants.TableName.MED_MEDICATION_REQUEST;
// 先查询费用项是否存在 // 直接删除费用项
List<ChargeItem> existingChargeItems = iChargeItemService.getChargeItemInfoByReqId(Arrays.asList(requestId));
if (existingChargeItems == null || existingChargeItems.isEmpty()) {
log.warn("BugFix#219: 删除药品医嘱时未找到费用项, requestId={}, serviceTable={}", requestId, serviceTable);
} else {
log.info("BugFix#219: 找到 {} 个费用项, 准备删除, requestId={}, serviceTable={}",
existingChargeItems.size(), requestId, serviceTable);
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(serviceTable, requestId); iChargeItemService.deleteByServiceTableAndId(serviceTable, requestId);
log.info("BugFix#219: 费用项删除完成, requestId={}", requestId); log.info("BugFix#219: 药品医嘱删除完成, requestId={}, serviceTable={}", requestId, serviceTable);
}
// 删除基于这个药品生成的需要执行的诊疗请求 // 删除基于这个药品生成的需要执行的诊疗请求
iServiceRequestService.remove( iServiceRequestService.remove(
new LambdaQueryWrapper<ServiceRequest>() new LambdaQueryWrapper<ServiceRequest>()
@@ -924,6 +957,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList()); List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) { if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList); List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
// 🔧 BugFix#219: 过滤只保留耗材类型的费用项
if (chargeItemList != null && !chargeItemList.isEmpty()) {
chargeItemList = chargeItemList.stream()
.filter(ci -> CommonConstants.TableName.WOR_DEVICE_REQUEST.equals(ci.getServiceTable()))
.collect(Collectors.toList());
}
if (chargeItemList != null && !chargeItemList.isEmpty()) { if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) { for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) { if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
@@ -936,20 +975,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
iDeviceRequestService.removeById(adviceSaveDto.getRequestId()); iDeviceRequestService.removeById(adviceSaveDto.getRequestId());
// 删除已经产生的耗材发放信息 // 删除已经产生的耗材发放信息
iDeviceDispenseService.deleteDeviceDispense(adviceSaveDto.getRequestId()); iDeviceDispenseService.deleteDeviceDispense(adviceSaveDto.getRequestId());
// 🔧 Bug Fix #219: 删除费用项前查询确认 // 🔧 Bug Fix #219: 删除费用项
Long requestId = adviceSaveDto.getRequestId(); Long requestId = adviceSaveDto.getRequestId();
String serviceTable = CommonConstants.TableName.WOR_DEVICE_REQUEST; String serviceTable = CommonConstants.TableName.WOR_DEVICE_REQUEST;
// 先查询费用项是否存在 // 直接删除费用项使用serviceTable和serviceId作为条件
List<ChargeItem> existingChargeItems = iChargeItemService.getChargeItemInfoByReqId(Arrays.asList(requestId));
if (existingChargeItems == null || existingChargeItems.isEmpty()) {
log.warn("BugFix#219: 删除耗材医嘱时未找到费用项, requestId={}, serviceTable={}", requestId, serviceTable);
} else {
log.info("BugFix#219: 找到 {} 个费用项, 准备删除, requestId={}, serviceTable={}",
existingChargeItems.size(), requestId, serviceTable);
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(serviceTable, requestId); iChargeItemService.deleteByServiceTableAndId(serviceTable, requestId);
log.info("BugFix#219: 费用项删除完成, requestId={}", requestId); log.info("BugFix#219: 耗材医嘱删除完成, requestId={}, serviceTable={}", requestId, serviceTable);
}
} }
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) { for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
@@ -1087,6 +1118,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList()); List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) { if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList); List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
// 🔧 BugFix#219: 过滤只保留诊疗类型的费用项
if (chargeItemList != null && !chargeItemList.isEmpty()) {
chargeItemList = chargeItemList.stream()
.filter(ci -> CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(ci.getServiceTable()))
.collect(Collectors.toList());
}
if (chargeItemList != null && !chargeItemList.isEmpty()) { if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) { for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) { if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
@@ -1100,20 +1137,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
iServiceRequestService.remove( iServiceRequestService.remove(
new LambdaQueryWrapper<ServiceRequest>().eq(ServiceRequest::getParentId, new LambdaQueryWrapper<ServiceRequest>().eq(ServiceRequest::getParentId,
adviceSaveDto.getRequestId()));// 删除诊疗套餐对应的子项 adviceSaveDto.getRequestId()));// 删除诊疗套餐对应的子项
// 🔧 Bug Fix #219: 删除费用项前查询确认 // 🔧 Bug Fix #219: 删除费用项
Long requestId = adviceSaveDto.getRequestId(); Long requestId = adviceSaveDto.getRequestId();
String serviceTable = CommonConstants.TableName.WOR_SERVICE_REQUEST; String serviceTable = CommonConstants.TableName.WOR_SERVICE_REQUEST;
// 先查询费用项是否存在 // 直接删除费用项
List<ChargeItem> existingChargeItems = iChargeItemService.getChargeItemInfoByReqId(Arrays.asList(requestId));
if (existingChargeItems == null || existingChargeItems.isEmpty()) {
log.warn("BugFix#219: 删除诊疗医嘱时未找到费用项, requestId={}, serviceTable={}", requestId, serviceTable);
} else {
log.info("BugFix#219: 找到 {} 个费用项, 准备删除, requestId={}, serviceTable={}",
existingChargeItems.size(), requestId, serviceTable);
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(serviceTable, requestId); iChargeItemService.deleteByServiceTableAndId(serviceTable, requestId);
log.info("BugFix#219: 费用项删除完成, requestId={}", requestId); log.info("BugFix#219: 诊疗医嘱删除完成, requestId={}, serviceTable={}", requestId, serviceTable);
}
} }
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) { for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {

View File

@@ -2340,11 +2340,13 @@ function handleEmrTreatment() {
} }
}); });
getEmrDetail(props.patientInfo.encounterId).then((res) => { getEmrDetail(props.patientInfo.encounterId).then((res) => {
// 🔧 BugFix#219: 添加空值检查
const contextJson = res.data?.contextJson ? JSON.parse(res.data.contextJson) : {};
saveEmr({ saveEmr({
patientId: props.patientInfo.patientId, patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId, encounterId: props.patientInfo.encounterId,
contextJson: { contextJson: {
...JSON.parse(res.data.contextJson), ...contextJson,
treatment: treatment, treatment: treatment,
}, },
}); });