diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java index 611c04fdc..55ec4c0df 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java @@ -655,6 +655,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { * @return 操作结果 */ @Override + @Transactional(rollbackFor = Exception.class) public R adviceCancel(AdviceExecuteParam adviceExecuteParam) { // 获取当前执行时间 Date exeDate = DateUtils.getNowDate(); @@ -701,6 +702,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { longMedDispensedList.add(medicationDispense); } else if (DispenseStatus.EXECUTED.getValue().equals(medicationDispense.getStatusEnum()) || DispenseStatus.SUBMITTED.getValue().equals(medicationDispense.getStatusEnum())) { + longMedDispensedList.add(medicationDispense); longMedUndispenseList.add(medicationDispense); } } @@ -729,6 +731,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { tempMedDispensedList.add(medicationDispense); } else if (DispenseStatus.EXECUTED.getValue().equals(medicationDispense.getStatusEnum()) || DispenseStatus.SUBMITTED.getValue().equals(medicationDispense.getStatusEnum())) { + tempMedDispensedList.add(medicationDispense); tempMedUndispenseList.add(medicationDispense); } } @@ -876,7 +879,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { if (!longMedUndispenseList.isEmpty()) { // 排除已汇总的药品 List medicationDispenseList - = tempMedUndispenseList.stream().filter(x -> x.getSummaryNo() == null).toList(); + = longMedUndispenseList.stream().filter(x -> x.getSummaryNo() == null).toList(); medicationDispenseService .removeByIds(medicationDispenseList.stream().map(MedicationDispense::getId).toList()); } diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/pharmacymanage/appservice/impl/InHospitalReturnMedicineAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/pharmacymanage/appservice/impl/InHospitalReturnMedicineAppServiceImpl.java index 3e2f8bc4f..ee62e19a2 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/pharmacymanage/appservice/impl/InHospitalReturnMedicineAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/pharmacymanage/appservice/impl/InHospitalReturnMedicineAppServiceImpl.java @@ -13,6 +13,7 @@ import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.tuple.Pair; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -227,6 +228,7 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn * @return 处理结果 */ @Override + @Transactional(rollbackFor = Exception.class) public R medicineReturn(List medicineReturnList) { if (medicineReturnList == null || medicineReturnList.isEmpty()) { return R.ok(); @@ -249,6 +251,10 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn // 进销存参数 List supplyItemDetailList = new ArrayList<>(); + // 记录未发药(无库存变动)的发药单ID + Set noInventoryUpdateMedIds = new HashSet<>(); + Set noInventoryUpdateDevIds = new HashSet<>(); + // 处理退药 // 获取药品退药id列表 List medReturnIdList = new ArrayList<>(); @@ -278,6 +284,14 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn throw new ServiceException("药品已退药,请勿重复退药"); } + // 在更新退药单状态前,统计出实际没有发药(已发药数量为0/空)的退药单,避免后续加回库存和报错 + for (MedicationDispense medicationDispense : refundMedList) { + if (medicationDispense.getDispenseQuantity() == null + || medicationDispense.getDispenseQuantity().compareTo(BigDecimal.ZERO) == 0) { + noInventoryUpdateMedIds.add(medicationDispense.getId()); + } + } + // 更新退药单 for (MedicationDispense medicationDispense : refundMedList) { // 退药状态 @@ -291,20 +305,22 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn // 退药人 medicationDispense.setPractitionerId(SecurityUtils.getLoginUser().getPractitionerId()); - // 设置库存变更参数 - SupplyItemDetailDto supplyItemDetailDto = new SupplyItemDetailDto(); - for (MedicationRequest medicationRequest : refundMedRequestList) { - // 根据退药id查询退药请求id(用于医保关联) - if (medicationDispense.getMedReqId().equals(medicationRequest.getId())) { - supplyItemDetailDto.setRequestId(medicationRequest.getRefundMedicineId()); + // 设置库存变更参数(仅针对实际发过药的药品) + if (!noInventoryUpdateMedIds.contains(medicationDispense.getId())) { + SupplyItemDetailDto supplyItemDetailDto = new SupplyItemDetailDto(); + for (MedicationRequest medicationRequest : refundMedRequestList) { + // 根据退药id查询退药请求id(用于医保关联) + if (medicationDispense.getMedReqId().equals(medicationRequest.getId())) { + supplyItemDetailDto.setRequestId(medicationRequest.getRefundMedicineId()); + } } + supplyItemDetailDto.setItemTable(CommonConstants.TableName.MED_MEDICATION_DEFINITION) + .setItemId(medicationDispense.getMedicationId()).setLotNumber(medicationDispense.getLotNumber()); + supplyItemDetailList.add(supplyItemDetailDto); } - supplyItemDetailDto.setItemTable(CommonConstants.TableName.MED_MEDICATION_DEFINITION) - .setItemId(medicationDispense.getMedicationId()).setLotNumber(medicationDispense.getLotNumber()); - supplyItemDetailList.add(supplyItemDetailDto); - // 追溯码表相关处理 - if (medicationDispense.getTraceNo() != null) { + // 追溯码表相关处理(仅针对实际发过药的药品) + if (!noInventoryUpdateMedIds.contains(medicationDispense.getId()) && medicationDispense.getTraceNo() != null) { // 使用逗号分割追溯码并转换为List String[] traceNoList = medicationDispense.getTraceNo().split(CommonConstants.Common.COMMA); for (String item : traceNoList) { @@ -345,7 +361,7 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn devReturnIdList = returnDeviceList.stream().map(ReturnMedicineDto::getDispenseId).collect(Collectors.toList()); // 获取退耗材请求id列表 - List devRequestIdList = returnDeviceList.stream().map(ReturnMedicineDto::getRequestId).toList(); + List devRequestIdList = returnDeviceList.stream().map(ReturnMedicineDto::getRequestId).collect(Collectors.toList()); if (devReturnIdList.isEmpty()) { throw new ServiceException("请选择要退的耗材"); } @@ -362,6 +378,15 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn .anyMatch(x -> x.equals(DispenseStatus.REFUNDED.getValue()))) { throw new ServiceException("耗材已退,请勿重复操作"); } + + // 在更新退耗材单状态前,统计出实际没有发放(已发放数量为0/空)的退耗材单 + for (DeviceDispense deviceDispense : refundDevList) { + if (deviceDispense.getDispenseQuantity() == null + || deviceDispense.getDispenseQuantity().compareTo(BigDecimal.ZERO) == 0) { + noInventoryUpdateDevIds.add(deviceDispense.getId()); + } + } + // 更新退耗材单状态 for (DeviceDispense deviceDispense : refundDevList) { // 退药时间 @@ -370,40 +395,20 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn deviceDispense.setDispenseQuantity(deviceDispense.getQuantity()); // 退药状态 deviceDispense.setStatusEnum(DispenseStatus.REFUNDED.getValue()); - // 设置库存变更参数 - supplyItemDetailList - .add(new SupplyItemDetailDto().setItemTable(CommonConstants.TableName.ADM_DEVICE_DEFINITION) - .setItemId(deviceDispense.getDeviceDefId()).setLotNumber(deviceDispense.getLotNumber())); - // // 使用逗号分割追溯码并转换为List - // String[] traceNoList = deviceDispense.getTraceNo().split(CommonConstants.Common.COMMA); - // for (String item : traceNoList) { - // traceNoManage = new TraceNoManage(); - // // 追溯码处理 - // traceNoManage.setItemTable(CommonConstants.TableName.ADM_DEVICE_DEFINITION) - // // 项目id - // .setItemId(deviceDispense.getDeviceDefId()) - // // 仓库类型 - // .setLocationTypeEnum(LocationForm.PHARMACY.getValue()) - // // 仓库 - // .setLocationId(deviceDispense.getLocationId()) - // // 产品批号 - // .setLotNumber(deviceDispense.getLotNumber()) - // // 追溯码 - // .setTraceNo(item) - // // 追溯码状态 - // .setStatusEnum(TraceNoStatus.IN.getValue()) - // // 追溯码单位 - // .setUnitCode(deviceDispense.getUnitCode()) - // // 操作类型 - // .setOperationType(SupplyType.RETURN_MEDICATION.getValue()); - // traceNoManageList.add(traceNoManage); - // } + // 设置库存变更参数(仅针对实际发放过的耗材) + if (!noInventoryUpdateDevIds.contains(deviceDispense.getId())) { + supplyItemDetailList + .add(new SupplyItemDetailDto().setItemTable(CommonConstants.TableName.ADM_DEVICE_DEFINITION) + .setItemId(deviceDispense.getDeviceDefId()).setLotNumber(deviceDispense.getLotNumber())); + } } deviceDispenseService.updateBatchById(refundDevList); } // 追溯码管理表数据追加 - traceNoManageService.saveBatch(traceNoManageList); + if (!traceNoManageList.isEmpty()) { + traceNoManageService.saveBatch(traceNoManageList); + } // 处理退库存 // 获取库存信息 @@ -424,6 +429,11 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn BigDecimal minQuantity = BigDecimal.ZERO; for (UnDispenseInventoryDto unDispenseInventoryDto : inventoryList) { + // 过滤未实际发药/发耗材的项目,其库存不加回 + if (noInventoryUpdateMedIds.contains(unDispenseInventoryDto.getDispenseId()) + || noInventoryUpdateDevIds.contains(unDispenseInventoryDto.getDispenseId())) { + continue; + } BigDecimal quantity = unDispenseInventoryDto.getQuantity(); if (!unDispenseInventoryDto.getDispenseUnit() .equals(unDispenseInventoryDto.getInventoryUnitCode())) { @@ -433,14 +443,19 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn } minQuantity = minQuantity.add(quantity); } - // 理论上不出bug的情况下以项目id,批号,仓库进行分组处理库存一定唯一所以get(0) - // 设置待更新的库存信息 - inventoryItemList.add(new InventoryItem().setId(inventoryList.get(0).getInventoryId()) - .setQuantity(inventoryList.get(0).getInventoryQuantity().add(minQuantity))); + // 只有当有需要恢复库存的药品/器材时才加回库存 + if (minQuantity.compareTo(BigDecimal.ZERO) > 0) { + // 理论上不出bug的情况下以项目id,批号,仓库进行分组处理库存一定唯一所以get(0) + // 设置待更新的库存信息 + inventoryItemList.add(new InventoryItem().setId(inventoryList.get(0).getInventoryId()) + .setQuantity(inventoryList.get(0).getInventoryQuantity().add(minQuantity))); + } } } // 库存更新 - iInventoryItemService.updateBatchById(inventoryItemList); + if (!inventoryItemList.isEmpty()) { + iInventoryItemService.updateBatchById(inventoryItemList); + } } else { throw new ServiceException("请检查库存信息"); } @@ -497,13 +512,26 @@ public class InHospitalReturnMedicineAppServiceImpl implements IInHospitalReturn } } } - uploadFailedNoList = this.ybReturnIntegrated(medReturnIdList, null); - uploadFailedNoList = receiptApprovalAppService.ybInventoryIntegrated(supplyItemDetailList, - YbInvChgType.OTHER_OUT, DateUtils.getNowDate(), true); - if (uploadFailedNoList != null) { - returnMsg = "3506商品销售退货上传错误,错误项目编码" + uploadFailedNoList; - } else { - returnMsg = "3506商品销售退货上传成功"; + + // 仅对实际发过药(生成了收费记录且计费的)调用医保退货接口 + List medReturnIdsForYb = medReturnIdList.stream() + .filter(id -> !noInventoryUpdateMedIds.contains(id)) + .collect(Collectors.toList()); + if (!medReturnIdsForYb.isEmpty()) { + uploadFailedNoList = this.ybReturnIntegrated(medReturnIdsForYb, null); + if (uploadFailedNoList != null) { + returnMsg = "3506商品销售退货上传错误,错误项目编码" + uploadFailedNoList; + } else { + returnMsg = "3506商品销售退货上传成功"; + } + } + + if (!supplyItemDetailList.isEmpty()) { + uploadFailedNoList = receiptApprovalAppService.ybInventoryIntegrated(supplyItemDetailList, + YbInvChgType.OTHER_OUT, DateUtils.getNowDate(), true); + if (uploadFailedNoList != null) { + returnMsg = (returnMsg != null ? returnMsg + ";" : "") + "医保进销存集成上传错误: " + uploadFailedNoList; + } } } // 返回退药成功信息 diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/pharmacymanage/InHospitalReturnMedicineAppMapper.xml b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/pharmacymanage/InHospitalReturnMedicineAppMapper.xml index fc584ca84..4889a0762 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/pharmacymanage/InHospitalReturnMedicineAppMapper.xml +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/pharmacymanage/InHospitalReturnMedicineAppMapper.xml @@ -2,11 +2,11 @@