From 2d7dcb4aeb0ee0e3cdb3d9845de8009eb738a095 Mon Sep 17 00:00:00 2001 From: chenqi Date: Thu, 2 Apr 2026 08:15:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(inpatient):=20=E8=A7=A3=E5=86=B3=E6=89=8B?= =?UTF-8?q?=E6=9C=AF=E7=94=B3=E8=AF=B7=E5=8D=95=E6=95=B0=E6=8D=AE=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=92=8C=E5=91=BD=E5=90=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在应用表单底部按钮中添加延迟刷新机制,确保后端数据提交完成后再触发刷新事件 - 在手术组件中添加诊疗定义名称字段,完善手术项目信息传递 - 优化手术医嘱生成功能,添加详细的调试日志以便追踪问题 - 修复手术项目名称获取逻辑,优先使用activityList中的手术项目名称 - 完善手术收费项目生成流程,添加异常处理和日志记录 - 在控制器中添加手术申请单保存的日志输出,便于问题排查 --- .../impl/RequestFormManageAppServiceImpl.java | 304 ++++++++++-------- .../RequestFormManageController.java | 1 + .../applicationFormBottomBtn.vue | 5 +- .../order/applicationForm/surgery.vue | 1 + 4 files changed, 183 insertions(+), 128 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java index fa9d9871..7a822870 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java @@ -216,136 +216,186 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer } // 如果是手术申请单,需要额外生成手术医嘱 - if (ActivityDefCategory.PROCEDURE.getCode().equals(typeCode)) { - log.info("开始生成手术医嘱,encounterId={}, patientId={}, typeCode={}", encounterId, patientId, typeCode); - // 从 descJson 中解析手术信息 - String descJson = requestFormSaveDto.getDescJson(); - Map descMap = null; - if (descJson != null && !descJson.isEmpty()) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - descMap = objectMapper.readValue(descJson, Map.class); - } catch (Exception e) { - log.error("解析手术申请单 descJson 失败", e); - } - } - - // 获取手术信息 - String surgeryName = descMap != null ? (String) descMap.get("surgeryName") : null; - String surgeryCode = descMap != null ? (String) descMap.get("surgeryCode") : null; - String surgeryFee = descMap != null ? (String) descMap.get("surgeryFee") : null; - String anesthesiaFee = descMap != null ? (String) descMap.get("anesthesiaFee") : null; - String plannedTime = descMap != null ? (String) descMap.get("plannedTime") : null; - String surgeryIndication = descMap != null ? (String) descMap.get("surgeryIndication") : null; - String preoperativeDiagnosis = descMap != null ? (String) descMap.get("preoperativeDiagnosis") : null; - - // 生成手术医嘱 - ServiceRequest surgeryServiceRequest = new ServiceRequest(); - surgeryServiceRequest.setStatusEnum(RequestStatus.DRAFT.getValue()); - surgeryServiceRequest.setBusNo(String.format("%04d", (int) (Math.random() * 10000))); - surgeryServiceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); - surgeryServiceRequest.setPrescriptionNo(prescriptionNo); - surgeryServiceRequest.setTherapyEnum(TherapyTimeType.TEMPORARY.getValue()); - surgeryServiceRequest.setQuantity(BigDecimal.valueOf(1)); - surgeryServiceRequest.setUnitCode("次"); - surgeryServiceRequest.setCategoryEnum(4); // 4-手术 - // 优先从 activityList 获取手术 ID,如果为空则从 descJson 获取 - if (!activityList.isEmpty()) { - surgeryServiceRequest.setActivityId(activityList.get(0).getAdviceDefinitionId()); - } - surgeryServiceRequest.setPatientId(patientId); - surgeryServiceRequest.setRequesterId(practitionerId); - surgeryServiceRequest.setEncounterId(encounterId); - surgeryServiceRequest.setAuthoredTime(curDate); - surgeryServiceRequest.setOrgId(orgId); - // 设置手术相关信息到 contentJson 字段 - Map contentMap = new java.util.HashMap<>(); - if (surgeryName != null && !surgeryName.isEmpty()) { - contentMap.put("surgeryName", surgeryName); - } - if (surgeryCode != null && !surgeryCode.isEmpty()) { - contentMap.put("surgeryCode", surgeryCode); - } - if (plannedTime != null && !plannedTime.isEmpty()) { - contentMap.put("plannedTime", plannedTime); - } - if (surgeryIndication != null && !surgeryIndication.isEmpty()) { - contentMap.put("surgeryIndication", surgeryIndication); - } - if (preoperativeDiagnosis != null && !preoperativeDiagnosis.isEmpty()) { - contentMap.put("preoperativeDiagnosis", preoperativeDiagnosis); - } - if (!contentMap.isEmpty()) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - surgeryServiceRequest.setContentJson(objectMapper.writeValueAsString(contentMap)); - } catch (Exception e) { - log.error("序列化手术信息失败", e); - } - } - iServiceRequestService.save(surgeryServiceRequest); - log.info("手术医嘱生成成功,serviceRequestId={}, prescriptionNo={}", surgeryServiceRequest.getId(), prescriptionNo); - - // 生成手术收费项目 - ChargeItem surgeryChargeItem = new ChargeItem(); - surgeryChargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); - surgeryChargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(surgeryServiceRequest.getBusNo())); - surgeryChargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); - surgeryChargeItem.setPatientId(patientId); - surgeryChargeItem.setContextEnum(6); // 6-手术 - surgeryChargeItem.setEncounterId(encounterId); - surgeryChargeItem.setEntererId(practitionerId); - surgeryChargeItem.setEnteredDate(curDate); - surgeryChargeItem.setServiceTable(CommonConstants.TableName.WOR_SERVICE_REQUEST); - surgeryChargeItem.setServiceId(surgeryServiceRequest.getId()); - surgeryChargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION); - // 优先从 activityList 获取 productId,如果为空则不设置 - if (!activityList.isEmpty()) { - surgeryChargeItem.setProductId(activityList.get(0).getAdviceDefinitionId()); - } - surgeryChargeItem.setAccountId(activityList.isEmpty() ? null : activityList.get(0).getAccountId()); - surgeryChargeItem.setRequestingOrgId(orgId); - surgeryChargeItem.setQuantityValue(BigDecimal.valueOf(1)); - surgeryChargeItem.setQuantityUnit("次"); - // 设置手术费用 - if (surgeryFee != null && !surgeryFee.isEmpty()) { - try { - surgeryChargeItem.setUnitPrice(new BigDecimal(surgeryFee)); - surgeryChargeItem.setTotalPrice(new BigDecimal(surgeryFee)); - } catch (NumberFormatException e) { - log.warn("手术费用格式不正确:{}", surgeryFee); - } - } - iChargeItemService.save(surgeryChargeItem); - - // 如果存在麻醉费用,生成麻醉收费项目 - if (anesthesiaFee != null && !anesthesiaFee.isEmpty()) { - try { - BigDecimal anesthesiaFeeAmount = new BigDecimal(anesthesiaFee); - if (anesthesiaFeeAmount.compareTo(BigDecimal.ZERO) > 0) { - ChargeItem anesthesiaChargeItem = new ChargeItem(); - anesthesiaChargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); - anesthesiaChargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(surgeryServiceRequest.getBusNo())); - anesthesiaChargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); - anesthesiaChargeItem.setPatientId(patientId); - anesthesiaChargeItem.setContextEnum(3); // 3-诊疗 - anesthesiaChargeItem.setEncounterId(encounterId); - anesthesiaChargeItem.setEntererId(practitionerId); - anesthesiaChargeItem.setEnteredDate(curDate); - anesthesiaChargeItem.setServiceTable(CommonConstants.TableName.WOR_SERVICE_REQUEST); - anesthesiaChargeItem.setServiceId(surgeryServiceRequest.getId()); - anesthesiaChargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION); - anesthesiaChargeItem.setRequestingOrgId(orgId); - anesthesiaChargeItem.setQuantityValue(BigDecimal.valueOf(1)); - anesthesiaChargeItem.setQuantityUnit("次"); - anesthesiaChargeItem.setUnitPrice(anesthesiaFeeAmount); - anesthesiaChargeItem.setTotalPrice(anesthesiaFeeAmount); - iChargeItemService.save(anesthesiaChargeItem); + log.info("【调试】判断手术医嘱生成条件: typeCode={}, PROCEDURE.code={}, typeCode类型={}, PROCEDURE.code类型={}", + typeCode, ActivityDefCategory.PROCEDURE.getCode(), + typeCode != null ? typeCode.getClass().getName() : "null", + ActivityDefCategory.PROCEDURE.getCode().getClass().getName()); + boolean isProcedure = ActivityDefCategory.PROCEDURE.getCode().equals(typeCode); + log.info("【调试】判断结果: isProcedure={}, typeCode字符串={}, PROCEDURE.code字符串={}", + isProcedure, + typeCode != null ? "'" + typeCode + "'" : "null", + "'" + ActivityDefCategory.PROCEDURE.getCode() + "'"); + if (isProcedure) { + log.info("开始生成手术医嘱,encounterId={}, patientId={}, typeCode={}, activityListSize={}", + encounterId, patientId, typeCode, activityList != null ? activityList.size() : 0); + try { + // 从 descJson 中解析手术信息 + String descJson = requestFormSaveDto.getDescJson(); + Map descMap = null; + if (descJson != null && !descJson.isEmpty()) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + descMap = objectMapper.readValue(descJson, Map.class); + log.info("解析手术申请单 descJson 成功: {}", descMap); + } catch (Exception e) { + log.error("解析手术申请单 descJson 失败: {}", descJson, e); } - } catch (NumberFormatException e) { - log.warn("麻醉费用格式不正确:{}", anesthesiaFee); + } else { + log.warn("手术申请单 descJson 为空"); } + + // 获取手术信息 + String surgeryName = descMap != null ? (String) descMap.get("surgeryName") : null; + String surgeryCode = descMap != null ? (String) descMap.get("surgeryCode") : null; + String surgeryFee = descMap != null ? (String) descMap.get("surgeryFee") : null; + String anesthesiaFee = descMap != null ? (String) descMap.get("anesthesiaFee") : null; + String plannedTime = descMap != null ? (String) descMap.get("plannedTime") : null; + String surgeryIndication = descMap != null ? (String) descMap.get("surgeryIndication") : null; + String preoperativeDiagnosis = descMap != null ? (String) descMap.get("preoperativeDiagnosis") : null; + + // 🔧 BugFix#318: 从 activityList 获取手术项目名称 + String adviceDefinitionName = null; + if (activityList != null && !activityList.isEmpty()) { + adviceDefinitionName = activityList.get(0).getAdviceDefinitionName(); + log.info("从 activityList 获取手术项目名称: {}", adviceDefinitionName); + } + + log.info("手术信息: surgeryName={}, surgeryCode={}, surgeryFee={}, anesthesiaFee={}, adviceDefinitionName={}", + surgeryName, surgeryCode, surgeryFee, anesthesiaFee, adviceDefinitionName); + + // 生成手术医嘱 + ServiceRequest surgeryServiceRequest = new ServiceRequest(); + surgeryServiceRequest.setStatusEnum(RequestStatus.DRAFT.getValue()); + surgeryServiceRequest.setBusNo(String.format("%04d", (int) (Math.random() * 10000))); + surgeryServiceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); + surgeryServiceRequest.setPrescriptionNo(prescriptionNo); + surgeryServiceRequest.setTherapyEnum(TherapyTimeType.TEMPORARY.getValue()); + surgeryServiceRequest.setQuantity(BigDecimal.valueOf(1)); + surgeryServiceRequest.setUnitCode("次"); + surgeryServiceRequest.setCategoryEnum(4); // 4-手术 + // 优先从 activityList 获取手术 ID + if (activityList != null && !activityList.isEmpty()) { + Long activityId = activityList.get(0).getAdviceDefinitionId(); + surgeryServiceRequest.setActivityId(activityId); + log.info("从 activityList 获取手术ID: {}", activityId); + } else { + log.warn("activityList 为空,无法获取手术ID"); + } + surgeryServiceRequest.setPatientId(patientId); + surgeryServiceRequest.setRequesterId(practitionerId); + surgeryServiceRequest.setEncounterId(encounterId); + surgeryServiceRequest.setAuthoredTime(curDate); + surgeryServiceRequest.setOrgId(orgId); + + // 设置手术相关信息到 contentJson 字段 + Map contentMap = new java.util.HashMap<>(); + // 🔧 BugFix#318: 优先使用 activityList 中的手术项目名称 + if (adviceDefinitionName != null && !adviceDefinitionName.isEmpty()) { + contentMap.put("surgeryName", adviceDefinitionName); + } else if (surgeryName != null && !surgeryName.isEmpty()) { + contentMap.put("surgeryName", surgeryName); + } + if (surgeryCode != null && !surgeryCode.isEmpty()) { + contentMap.put("surgeryCode", surgeryCode); + } + if (plannedTime != null && !plannedTime.isEmpty()) { + contentMap.put("plannedTime", plannedTime); + } + if (surgeryIndication != null && !surgeryIndication.isEmpty()) { + contentMap.put("surgeryIndication", surgeryIndication); + } + if (preoperativeDiagnosis != null && !preoperativeDiagnosis.isEmpty()) { + contentMap.put("preoperativeDiagnosis", preoperativeDiagnosis); + } + if (!contentMap.isEmpty()) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + surgeryServiceRequest.setContentJson(objectMapper.writeValueAsString(contentMap)); + } catch (Exception e) { + log.error("序列化手术信息失败", e); + } + } + try { + iServiceRequestService.save(surgeryServiceRequest); + log.info("手术医嘱生成成功,serviceRequestId={}, prescriptionNo={}", surgeryServiceRequest.getId(), prescriptionNo); + } catch (Exception e) { + log.error("保存手术医嘱失败", e); + throw new ServiceException("保存手术医嘱失败: " + e.getMessage()); + } + + // 生成手术收费项目 + try { + ChargeItem surgeryChargeItem = new ChargeItem(); + surgeryChargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); + surgeryChargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(surgeryServiceRequest.getBusNo())); + surgeryChargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); + surgeryChargeItem.setPatientId(patientId); + surgeryChargeItem.setContextEnum(6); // 6-手术 + surgeryChargeItem.setEncounterId(encounterId); + surgeryChargeItem.setEntererId(practitionerId); + surgeryChargeItem.setEnteredDate(curDate); + surgeryChargeItem.setServiceTable(CommonConstants.TableName.WOR_SERVICE_REQUEST); + surgeryChargeItem.setServiceId(surgeryServiceRequest.getId()); + surgeryChargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION); + // 优先从 activityList 获取 productId + if (activityList != null && !activityList.isEmpty()) { + surgeryChargeItem.setProductId(activityList.get(0).getAdviceDefinitionId()); + surgeryChargeItem.setAccountId(activityList.get(0).getAccountId()); + } + surgeryChargeItem.setRequestingOrgId(orgId); + surgeryChargeItem.setQuantityValue(BigDecimal.valueOf(1)); + surgeryChargeItem.setQuantityUnit("次"); + // 设置手术费用 + if (surgeryFee != null && !surgeryFee.isEmpty()) { + try { + surgeryChargeItem.setUnitPrice(new BigDecimal(surgeryFee)); + surgeryChargeItem.setTotalPrice(new BigDecimal(surgeryFee)); + } catch (NumberFormatException e) { + log.warn("手术费用格式不正确:{}", surgeryFee); + } + } + iChargeItemService.save(surgeryChargeItem); + log.info("手术收费项目生成成功,chargeItemId={}", surgeryChargeItem.getId()); + } catch (Exception e) { + log.error("生成手术收费项目失败", e); + throw new ServiceException("生成手术收费项目失败: " + e.getMessage()); + } + + // 如果存在麻醉费用,生成麻醉收费项目 + if (anesthesiaFee != null && !anesthesiaFee.isEmpty()) { + try { + BigDecimal anesthesiaFeeAmount = new BigDecimal(anesthesiaFee); + if (anesthesiaFeeAmount.compareTo(BigDecimal.ZERO) > 0) { + ChargeItem anesthesiaChargeItem = new ChargeItem(); + anesthesiaChargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); + anesthesiaChargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(surgeryServiceRequest.getBusNo())); + anesthesiaChargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); + anesthesiaChargeItem.setPatientId(patientId); + anesthesiaChargeItem.setContextEnum(3); // 3-诊疗 + anesthesiaChargeItem.setEncounterId(encounterId); + anesthesiaChargeItem.setEntererId(practitionerId); + anesthesiaChargeItem.setEnteredDate(curDate); + anesthesiaChargeItem.setServiceTable(CommonConstants.TableName.WOR_SERVICE_REQUEST); + anesthesiaChargeItem.setServiceId(surgeryServiceRequest.getId()); + anesthesiaChargeItem.setProductTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION); + anesthesiaChargeItem.setRequestingOrgId(orgId); + anesthesiaChargeItem.setQuantityValue(BigDecimal.valueOf(1)); + anesthesiaChargeItem.setQuantityUnit("次"); + anesthesiaChargeItem.setUnitPrice(anesthesiaFeeAmount); + anesthesiaChargeItem.setTotalPrice(anesthesiaFeeAmount); + iChargeItemService.save(anesthesiaChargeItem); + log.info("麻醉收费项目生成成功"); + } + } catch (NumberFormatException e) { + log.warn("麻醉费用格式不正确:{}", anesthesiaFee); + } + } + } catch (Exception e) { + log.error("生成手术医嘱过程中发生异常", e); + throw e; } + } else { + log.info("不是手术申请单,跳过手术医嘱生成,typeCode={}", typeCode); } return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"申请单"})); diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/RequestFormManageController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/RequestFormManageController.java index c2d2a015..c9a7fcea 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/RequestFormManageController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/controller/RequestFormManageController.java @@ -72,6 +72,7 @@ public class RequestFormManageController { */ @PostMapping(value = "/save-surgery") public R saveSurgeryRequestForm(@RequestBody RequestFormSaveDto requestFormSaveDto) { + log.info("【Controller】保存手术申请单,typeCode={}", ActivityDefCategory.PROCEDURE.getCode()); return iRequestFormManageAppService.saveRequestForm(requestFormSaveDto, ActivityDefCategory.PROCEDURE.getCode()); } diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/applicationFormBottomBtn.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/applicationFormBottomBtn.vue index 7b779ec9..29bcaeac 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/applicationFormBottomBtn.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/applicationFormBottomBtn.vue @@ -141,7 +141,10 @@ const submitApplicationForm = () => { const submitOk = () => { applicationFormDialogVisible.value = false; applicationFormName.value = null; - emits('refResh'); + // 🔧 BugFix#318: 延迟刷新,确保后端数据已提交 + setTimeout(() => { + emits('refResh'); + }, 500); }; defineExpose({ state }); diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/surgery.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/surgery.vue index 3f14e913..7710de64 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/surgery.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/surgery.vue @@ -215,6 +215,7 @@ const submit = () => { applicationListAllFilter = applicationListAllFilter.map((item) => { return { adviceDefinitionId: item.adviceDefinitionId /** 诊疗定义id */, + adviceDefinitionName: item.adviceDefinitionName /** 诊疗定义名称(手术项目名称) */, quantity: 1, // /** 请求数量 */ unitCode: item.priceList[0].unitCode /** 请求单位编码 */, unitPrice: item.priceList[0].price /** 单价 */,