From a3650aa38620fd6d9ed0055c612f69501cd1d438 Mon Sep 17 00:00:00 2001 From: chenqi Date: Wed, 18 Mar 2026 12:33:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(doctorstation):=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=8C=BB=E5=98=B1=E7=AD=BE=E5=8F=91=E6=97=B6=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=BC=BA=E5=A4=B1=E9=97=AE=E9=A2=98=20bug#18?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 处理前端体征字段中的 null 值转换为空字符串 - 移除后端保存和签发逻辑中的条件判断,确保关键字段始终被设置 - 修复 BUG #181 中医嘱签发时缺少必要业务字段的问题 - 统一保存和签发流程中的字段赋值逻辑 - 保持业务编号在签发时的一致性处理 --- .../DoctorStationAdviceAppServiceImpl.java | 169 +++++++++--------- .../inOut/components/transferInDialog.vue | 3 +- 2 files changed, 88 insertions(+), 84 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java index c67203b7..413f8e9a 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java @@ -634,38 +634,40 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp if (is_sign) { medicationRequest.setSignCode(signCode); } - // 保存时,处理数据(请求,发放,账单) + // 🔧 Bug Fix: 签发时也需要设置关键字段(修复BUG #181) + // 保存时生成业务编号,签发时沿用已有编号 if (is_save) { medicationRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4)); - medicationRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 - medicationRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量 - medicationRequest.setExecuteNum(adviceSaveDto.getExecuteNum()); // 执行次数 - medicationRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码 - medicationRequest.setLotNumber(adviceSaveDto.getLotNumber()); // 产品批号 - medicationRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); // 请求类型 - medicationRequest.setMedicationId(adviceSaveDto.getAdviceDefinitionId());// 医嘱定义id - medicationRequest.setPatientId(adviceSaveDto.getPatientId()); // 患者 - medicationRequest.setPractitionerId(adviceSaveDto.getPractitionerId()); // 开方医生 - medicationRequest.setOrgId(adviceSaveDto.getFounderOrgId()); // 开方人科室 - medicationRequest.setReqAuthoredTime(curDate); // 请求开始时间 - // 发放药房 - medicationRequest.setPerformLocation(adviceSaveDto.getLocationId()); - medicationRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id - medicationRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id - medicationRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id - medicationRequest.setTherapyEnum(adviceSaveDto.getTherapyEnum()); // 治疗类型,默认-临时 - medicationRequest.setMethodCode(adviceSaveDto.getMethodCode()); // 用法 - medicationRequest.setRateCode(adviceSaveDto.getRateCode()); // 用药频次 - medicationRequest.setDose(adviceSaveDto.getDose()); // 单次剂量 - medicationRequest.setDoseUnitCode(adviceSaveDto.getDoseUnitCode()); // 剂量单位 - medicationRequest.setDispensePerDuration(adviceSaveDto.getDispensePerDuration()); // 每次发药供应天数 - medicationRequest.setPackageId(adviceSaveDto.getPackageId()); // 组套id - medicationRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json - medicationRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 - medicationRequest.setSkinTestFlag(adviceSaveDto.getSkinTestFlag()); // 皮试标志 - medicationRequest.setInfusionFlag(adviceSaveDto.getInjectFlag()); // 输液标志 - medicationRequest.setSortNumber(adviceSaveDto.getSortNumber()); // 排序号 } + medicationRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + medicationRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量 + medicationRequest.setExecuteNum(adviceSaveDto.getExecuteNum()); // 执行次数 + medicationRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码 + medicationRequest.setLotNumber(adviceSaveDto.getLotNumber()); // 产品批号 + medicationRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); // 请求类型 + medicationRequest.setMedicationId(adviceSaveDto.getAdviceDefinitionId());// 医嘱定义id + medicationRequest.setPatientId(adviceSaveDto.getPatientId()); // 患者 + medicationRequest.setPractitionerId(adviceSaveDto.getPractitionerId()); // 开方医生 + medicationRequest.setOrgId(adviceSaveDto.getFounderOrgId()); // 开方人科室 + medicationRequest.setReqAuthoredTime(curDate); // 请求开始时间 + // 发放药房 + medicationRequest.setPerformLocation(adviceSaveDto.getLocationId()); + medicationRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id + medicationRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id + medicationRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id + medicationRequest.setTherapyEnum(adviceSaveDto.getTherapyEnum()); // 治疗类型,默认-临时 + medicationRequest.setMethodCode(adviceSaveDto.getMethodCode()); // 用法 + medicationRequest.setRateCode(adviceSaveDto.getRateCode()); // 用药频次 + medicationRequest.setDose(adviceSaveDto.getDose()); // 单次剂量 + medicationRequest.setDoseUnitCode(adviceSaveDto.getDoseUnitCode()); // 剂量单位 + medicationRequest.setDispensePerDuration(adviceSaveDto.getDispensePerDuration()); // 每次发药供应天数 + medicationRequest.setPackageId(adviceSaveDto.getPackageId()); // 组套id + medicationRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json + medicationRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 + medicationRequest.setSkinTestFlag(adviceSaveDto.getSkinTestFlag()); // 皮试标志 + medicationRequest.setInfusionFlag(adviceSaveDto.getInjectFlag()); // 输液标志 + medicationRequest.setSortNumber(adviceSaveDto.getSortNumber()); // 排序号 + if (medicationRequest.getId() == null) { firstTimeSave = true; } @@ -896,31 +898,32 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp deviceRequest.setCreateBy(currentUsername); // 设置创建人 deviceRequest.setCreateTime(curDate); // 设置创建时间 - // 保存时,处理数据(请求,发放,账单) + // 🔧 Bug Fix: 签发时也需要设置关键字段(修复BUG #181) + // 保存时生成业务编号,签发时沿用已有编号 if (is_save) { deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); - deviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 - deviceRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量 - deviceRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码 - deviceRequest.setLotNumber(adviceSaveDto.getLotNumber());// 产品批号 - - deviceRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); // 请求类型 - deviceRequest.setDeviceDefId(adviceSaveDto.getAdviceDefinitionId());// 耗材定义id - deviceRequest.setPatientId(adviceSaveDto.getPatientId()); // 患者 - deviceRequest.setRequesterId(adviceSaveDto.getPractitionerId()); // 开方医生 - deviceRequest.setOrgId(adviceSaveDto.getFounderOrgId());// 开方人科室 - deviceRequest.setReqAuthoredTime(curDate); // 请求开始时间 - // 发放耗材房 - deviceRequest.setPerformLocation(adviceSaveDto.getLocationId()); - deviceRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id - deviceRequest.setPackageId(adviceSaveDto.getPackageId()); // 组套id - // deviceRequest.setActivityId(adviceSaveDto.getActivityId()); - deviceRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json - deviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 - deviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id - deviceRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id - } + deviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + deviceRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量 + deviceRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码 + deviceRequest.setLotNumber(adviceSaveDto.getLotNumber());// 产品批号 + + deviceRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); // 请求类型 + deviceRequest.setDeviceDefId(adviceSaveDto.getAdviceDefinitionId());// 耗材定义id + deviceRequest.setPatientId(adviceSaveDto.getPatientId()); // 患者 + deviceRequest.setRequesterId(adviceSaveDto.getPractitionerId()); // 开方医生 + deviceRequest.setOrgId(adviceSaveDto.getFounderOrgId());// 开方人科室 + deviceRequest.setReqAuthoredTime(curDate); // 请求开始时间 + // 发放耗材房 + deviceRequest.setPerformLocation(adviceSaveDto.getLocationId()); + deviceRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id + deviceRequest.setPackageId(adviceSaveDto.getPackageId()); // 组套id + // deviceRequest.setActivityId(adviceSaveDto.getActivityId()); + deviceRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json + deviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 + deviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id + deviceRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id + iDeviceRequestService.saveOrUpdate(deviceRequest); if (is_save) { // 处理耗材发放 @@ -1047,42 +1050,42 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp if (is_sign) { serviceRequest.setSignCode(signCode); } - // 只有保存时才处理的字段属性 + // 🔧 Bug Fix: 签发时也需要设置关键字段(修复BUG #181) + // 保存时生成业务编号,签发时沿用已有编号 if (is_save) { serviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4)); - serviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 - serviceRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量 - serviceRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码 + } + serviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + serviceRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量 + serviceRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码 - // 🎯 判断是否为会诊医嘱:如果categoryEnum为31,则为会诊类型 - Integer categoryEnum = adviceSaveDto.getCategoryEnum(); - if (categoryEnum != null && categoryEnum == 31) { - // 会诊医嘱:category_enum设置为31 - serviceRequest.setCategoryEnum(31); - log.info("保存会诊医嘱,category_enum=31"); - } else { - // 普通诊疗医嘱 - serviceRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); - } - - serviceRequest.setActivityId(adviceSaveDto.getAdviceDefinitionId());// 诊疗定义id - serviceRequest.setPatientId(adviceSaveDto.getPatientId()); // 患者 - serviceRequest.setRequesterId(adviceSaveDto.getPractitionerId()); // 开方医生 - serviceRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id - serviceRequest.setAuthoredTime(curDate); // 请求签发时间 - // 执行科室 - serviceRequest.setOrgId(adviceSaveDto.getPositionId()); - serviceRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json - serviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 - serviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id - serviceRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id - - // 基于皮试药品生成的皮试检查 - if (adviceSaveDto.getBasedOnId() != null) { - serviceRequest.setBasedOnId(adviceSaveDto.getBasedOnId()); - serviceRequest.setBasedOnTable(CommonConstants.TableName.MED_MEDICATION_REQUEST); - } + // 🎯 判断是否为会诊医嘱:如果categoryEnum为31,则为会诊类型 + Integer categoryEnum = adviceSaveDto.getCategoryEnum(); + if (categoryEnum != null && categoryEnum == 31) { + // 会诊医嘱:category_enum设置为31 + serviceRequest.setCategoryEnum(31); + log.info("保存会诊医嘱,category_enum=31"); + } else { + // 普通诊疗医嘱 + serviceRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); + } + + serviceRequest.setActivityId(adviceSaveDto.getAdviceDefinitionId());// 诊疗定义id + serviceRequest.setPatientId(adviceSaveDto.getPatientId()); // 患者 + serviceRequest.setRequesterId(adviceSaveDto.getPractitionerId()); // 开方医生 + serviceRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id + serviceRequest.setAuthoredTime(curDate); // 请求签发时间 + // 执行科室 + serviceRequest.setOrgId(adviceSaveDto.getPositionId()); + serviceRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json + serviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 + serviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id + serviceRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id + // 基于皮试药品生成的皮试检查 + if (adviceSaveDto.getBasedOnId() != null) { + serviceRequest.setBasedOnId(adviceSaveDto.getBasedOnId()); + serviceRequest.setBasedOnTable(CommonConstants.TableName.MED_MEDICATION_REQUEST); } iServiceRequestService.saveOrUpdate(serviceRequest); diff --git a/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferInDialog.vue b/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferInDialog.vue index 307fc995..f2f75e39 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferInDialog.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferInDialog.vue @@ -575,7 +575,8 @@ const handleSubmit = async () => { const vitalSignFields = ['height', 'weight', 'temperature', 'hertRate', 'pulse', 'endBloodPressure', 'highBloodPressure']; if (vitalSignFields.includes(key)) { // 体征字段:提交所有值,包括空字符串(用于清除数据) - formData[key] = value === undefined ? '' : value; + // 处理 undefined 和 null 都转为空字符串 + formData[key] = (value === undefined || value === null) ? '' : String(value); } else if (value !== '' && value !== null && value !== undefined) { // 其他字段:只保留非空值 formData[key] = value;