From 7dc76d7b59d03dd1147be23687635b7a2b767964 Mon Sep 17 00:00:00 2001 From: chenqi Date: Fri, 13 Mar 2026 12:08:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(advice):=20=E4=BF=AE=E5=A4=8D=E7=A6=85?= =?UTF-8?q?=E9=81=93=20Bug=20#147=20-=20=E6=B7=BB=E5=8A=A0=E8=80=97?= =?UTF-8?q?=E6=9D=90=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 saveRegAdvice 方法中添加耗材列表过滤 - 添加 handDevice 方法调用处理耗材请求 - 实现完整的 handDevice 方法处理耗材的保存、签发和删除操作 - 添加必要的导入:ActivityDefinition、DeviceRequest、IDeviceRequestService、IDeviceDispenseService --- .../impl/AdviceManageAppServiceImpl.java | 165 +++++++++++++++++- 1 file changed, 163 insertions(+), 2 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java index c87deb98..200ab054 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java @@ -29,9 +29,12 @@ import com.openhis.web.regdoctorstation.appservice.IAdviceManageAppService; import com.openhis.web.regdoctorstation.dto.*; import com.openhis.web.regdoctorstation.mapper.AdviceManageAppMapper; import com.openhis.web.regdoctorstation.utils.RegPrescriptionUtils; -import com.openhis.workflow.domain.ActivityDefinition; +import com.openhis.workflow.domain.DeviceRequest; import com.openhis.workflow.domain.ServiceRequest; import com.openhis.workflow.service.IActivityDefinitionService; +import com.openhis.workflow.domain.ActivityDefinition; +import com.openhis.workflow.service.IDeviceDispenseService; +import com.openhis.workflow.service.IDeviceRequestService; import com.openhis.workflow.service.IServiceRequestService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -76,6 +79,12 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { @Resource IActivityDefinitionService iActivityDefinitionService; + @Resource + IDeviceRequestService iDeviceRequestService; + + @Resource + IDeviceDispenseService iDeviceDispenseService; + /** * 查询住院患者信息 * @@ -167,13 +176,16 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { Long organizationId = regAdviceSaveParam.getOrganizationId(); // 医嘱分类信息 List regAdviceSaveList = regAdviceSaveParam.getRegAdviceSaveList(); - + // 药品 List medicineList = regAdviceSaveList.stream() .filter(e -> ItemType.MEDICINE.getValue().equals(e.getAdviceType())).collect(Collectors.toList()); // 诊疗活动 List activityList = regAdviceSaveList.stream() .filter(e -> ItemType.ACTIVITY.getValue().equals(e.getAdviceType())).collect(Collectors.toList()); + // 耗材 🔧 Bug #147 修复 + List deviceList = regAdviceSaveList.stream() + .filter(e -> ItemType.DEVICE.getValue().equals(e.getAdviceType())).collect(Collectors.toList()); // 保存时,校验临时医嘱库存 if (AdviceOpType.SAVE_ADVICE.getCode().equals(adviceOpType)) { @@ -210,6 +222,11 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { */ this.handService(activityList, startTime, authoredTime, curDate, adviceOpType, organizationId, signCode); + /** + * 🔧 Bug #147 修复:处理耗材请求 + */ + this.handDevice(deviceList, startTime, authoredTime, curDate, adviceOpType, organizationId, signCode); + // 签发时,把草稿状态的账单更新为待收费 if (AdviceOpType.SIGN_ADVICE.getCode().equals(adviceOpType) && !regAdviceSaveList.isEmpty()) { // 签发的医嘱id集合 @@ -594,6 +611,150 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { } + /** + * 🔧 Bug #147 修复:处理耗材 + */ + private void handDevice(List deviceList, Date startTime, Date authoredTime, Date curDate, + String adviceOpType, Long organizationId, String signCode) { + // 当前登录账号的科室id + Long orgId = SecurityUtils.getLoginUser().getOrgId(); + // 获取当前登录用户的tenantId + Integer tenantId = SecurityUtils.getLoginUser().getTenantId(); + // 保存操作 + boolean is_save = AdviceOpType.SAVE_ADVICE.getCode().equals(adviceOpType); + // 签发操作 + boolean is_sign = AdviceOpType.SIGN_ADVICE.getCode().equals(adviceOpType); + + // 删除 + List deleteList = deviceList.stream() + .filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList()); + for (RegAdviceSaveDto regAdviceSaveDto : deleteList) { + iDeviceRequestService.removeById(regAdviceSaveDto.getRequestId()); + // 删除已经产生的耗材发放信息 + iDeviceDispenseService.deleteDeviceDispense(regAdviceSaveDto.getRequestId()); + // 删除费用项 + iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.WOR_DEVICE_REQUEST, + regAdviceSaveDto.getRequestId()); + } + + // 声明耗材请求 + DeviceRequest deviceRequest; + // 声明费用项 + ChargeItem chargeItem; + + // 新增 + 修改 (长期医嘱) + List longInsertOrUpdateList = deviceList.stream().filter(e -> TherapyTimeType.LONG_TERM + .getValue().equals(e.getTherapyEnum()) + && (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()))) + .collect(Collectors.toList()); + + for (RegAdviceSaveDto regAdviceSaveDto : longInsertOrUpdateList) { + deviceRequest = new DeviceRequest(); + deviceRequest.setId(regAdviceSaveDto.getRequestId()); // 主键id + deviceRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态 + deviceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID + if (is_sign) { + deviceRequest.setReqAuthoredTime(authoredTime); // 医嘱签发时间 + } + // 保存时处理的字段属性 + if (is_save) { + deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); + deviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + deviceRequest.setQuantity(regAdviceSaveDto.getQuantity()); // 请求数量 + deviceRequest.setUnitCode(regAdviceSaveDto.getUnitCode()); // 请求单位编码 + deviceRequest.setLotNumber(regAdviceSaveDto.getLotNumber()); // 产品批号 + deviceRequest.setCategoryEnum(regAdviceSaveDto.getCategoryEnum()); // 请求类型 + deviceRequest.setDeviceDefId(regAdviceSaveDto.getAdviceDefinitionId());// 耗材定义id + deviceRequest.setPatientId(regAdviceSaveDto.getPatientId()); // 患者 + deviceRequest.setRequesterId(regAdviceSaveDto.getPractitionerId()); // 开方医生 + deviceRequest.setOrgId(regAdviceSaveDto.getFounderOrgId()); // 开方人科室 + deviceRequest.setReqAuthoredTime(startTime); // 医嘱开始时间 + deviceRequest.setPerformLocation(regAdviceSaveDto.getLocationId()); // 发放科室 + deviceRequest.setEncounterId(regAdviceSaveDto.getEncounterId()); // 就诊id + deviceRequest.setPackageId(regAdviceSaveDto.getPackageId()); // 组套id + deviceRequest.setContentJson(regAdviceSaveDto.getContentJson()); // 请求内容json + deviceRequest.setYbClassEnum(regAdviceSaveDto.getYbClassEnum());// 类别医保编码 + deviceRequest.setConditionId(regAdviceSaveDto.getConditionId()); // 诊断id + deviceRequest.setEncounterDiagnosisId(regAdviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id + } + iDeviceRequestService.saveOrUpdate(deviceRequest); + } + + // 新增 + 修改 (临时医嘱) + List tempInsertOrUpdateList = deviceList.stream().filter(e -> TherapyTimeType.TEMPORARY + .getValue().equals(e.getTherapyEnum()) + && (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()))) + .collect(Collectors.toList()); + for (RegAdviceSaveDto regAdviceSaveDto : tempInsertOrUpdateList) { + deviceRequest = new DeviceRequest(); + deviceRequest.setId(regAdviceSaveDto.getRequestId()); // 主键id + deviceRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态 + deviceRequest.setTenantId(SecurityUtils.getLoginUser().getTenantId()); // 显式设置租户ID + if (is_sign) { + deviceRequest.setReqAuthoredTime(authoredTime); // 医嘱签发时间 + } + // 保存时处理的字段属性 + if (is_save) { + deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); + deviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + deviceRequest.setQuantity(regAdviceSaveDto.getQuantity()); // 请求数量 + deviceRequest.setUnitCode(regAdviceSaveDto.getUnitCode()); // 请求单位编码 + deviceRequest.setLotNumber(regAdviceSaveDto.getLotNumber()); // 产品批号 + deviceRequest.setCategoryEnum(regAdviceSaveDto.getCategoryEnum()); // 请求类型 + deviceRequest.setDeviceDefId(regAdviceSaveDto.getAdviceDefinitionId());// 耗材定义id + deviceRequest.setPatientId(regAdviceSaveDto.getPatientId()); // 患者 + deviceRequest.setRequesterId(regAdviceSaveDto.getPractitionerId()); // 开方医生 + deviceRequest.setOrgId(regAdviceSaveDto.getFounderOrgId()); // 开方人科室 + deviceRequest.setReqAuthoredTime(startTime); // 医嘱开始时间 + deviceRequest.setPerformLocation(regAdviceSaveDto.getLocationId()); // 发放科室 + deviceRequest.setEncounterId(regAdviceSaveDto.getEncounterId()); // 就诊id + deviceRequest.setPackageId(regAdviceSaveDto.getPackageId()); // 组套id + deviceRequest.setContentJson(regAdviceSaveDto.getContentJson()); // 请求内容json + deviceRequest.setYbClassEnum(regAdviceSaveDto.getYbClassEnum());// 类别医保编码 + deviceRequest.setConditionId(regAdviceSaveDto.getConditionId()); // 诊断id + deviceRequest.setEncounterDiagnosisId(regAdviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id + } + iDeviceRequestService.saveOrUpdate(deviceRequest); + + // 保存时,保存耗材费用项 + if (is_save) { + // 处理耗材发放 + Long dispenseId = iDeviceDispenseService.handleDeviceDispense(deviceRequest, + regAdviceSaveDto.getDbOpType()); + + // 保存耗材费用项 + chargeItem = new ChargeItem(); + chargeItem.setId(regAdviceSaveDto.getChargeItemId()); // 费用项id + chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 收费状态 + chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(deviceRequest.getBusNo())); + chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源 + chargeItem.setPatientId(regAdviceSaveDto.getPatientId()); // 患者 + chargeItem.setContextEnum(regAdviceSaveDto.getAdviceType()); // 类型 + chargeItem.setEncounterId(regAdviceSaveDto.getEncounterId()); // 就诊id + chargeItem.setDefinitionId(regAdviceSaveDto.getDefinitionId()); // 费用定价ID + chargeItem.setDefDetailId(regAdviceSaveDto.getDefinitionDetailId()); // 定价子表主键 + chargeItem.setEntererId(regAdviceSaveDto.getPractitionerId());// 开立人ID + chargeItem.setEnteredDate(curDate); // 开立时间 + chargeItem.setServiceTable(CommonConstants.TableName.WOR_DEVICE_REQUEST);// 医疗服务类型 + chargeItem.setServiceId(deviceRequest.getId()); // 医疗服务ID + chargeItem.setProductTable(regAdviceSaveDto.getAdviceTableName());// 产品所在表 + chargeItem.setProductId(regAdviceSaveDto.getAdviceDefinitionId());// 收费项id + chargeItem.setAccountId(regAdviceSaveDto.getAccountId());// 关联账户ID + chargeItem.setRequestingOrgId(orgId); // 开立科室 + chargeItem.setConditionId(regAdviceSaveDto.getConditionId()); // 诊断id + chargeItem.setEncounterDiagnosisId(regAdviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id + chargeItem.setDispenseId(dispenseId); // 发放ID + + chargeItem.setQuantityValue(regAdviceSaveDto.getQuantity()); // 数量 + chargeItem.setQuantityUnit(regAdviceSaveDto.getUnitCode()); // 单位 + chargeItem.setUnitPrice(regAdviceSaveDto.getUnitPrice()); // 单价 + chargeItem.setTotalPrice(regAdviceSaveDto.getTotalPrice()); // 总价 + + iChargeItemService.saveOrUpdate(chargeItem); + } + } + } + /** * 查询住院医嘱请求数据 *