Fix Bug #481: [住院护士站-医嘱执行] 药品"注射用头孢哌酮钠舒巴坦钠"库存充足,但执行医嘱时提示库存不足

根因:AdviceUtils.checkExeMedInventory() 中使用 findFirst() 只匹配单个批次库存进行校验,
但同一药品在同一库房可能有多个批次(如66瓶+200瓶=266瓶),导致只校验了第一个批次的库存量。
修复:改用 collect(Collectors.toList()) 收集所有匹配批次的库存,累加总量后再与需求量比较。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
赵云
2026-05-11 00:18:33 +08:00
parent f250399383
commit eb0ae8e12a

View File

@@ -175,25 +175,31 @@ public class AdviceUtils {
// 预减库存
List<AdviceInventoryDto> adviceInventory
= this.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
// 生命提示信息集合
// 提示信息集合
List<String> tipsList = new ArrayList<>();
for (MedicationRequestUseExe medicationRequestUseExe : medUseExeList) {
Optional<AdviceInventoryDto> matchedInventory = adviceInventory.stream()
// 汇总同一地点该药品的所有批次库存总量
List<AdviceInventoryDto> matchedInventories = adviceInventory.stream()
.filter(inventoryDto -> medicationRequestUseExe.getMedicationId().equals(inventoryDto.getItemId())
&& CommonConstants.TableName.MED_MEDICATION_DEFINITION.equals(inventoryDto.getItemTable())
&& medicationRequestUseExe.getPerformLocation().equals(inventoryDto.getLocationId())
// 如果选择了具体的批次号,校验库存时需要加上批次号的匹配条件
&& (StringUtils.isEmpty(medicationRequestUseExe.getLotNumber())
|| medicationRequestUseExe.getLotNumber().equals(inventoryDto.getLotNumber())))
.findFirst();
.collect(Collectors.toList());
// 匹配到库存信息
if (matchedInventory.isPresent()) {
AdviceInventoryDto inventoryDto = matchedInventory.get();
if ((medicationRequestUseExe.getExecuteTimesNum()
.multiply(medicationRequestUseExe.getMinUnitQuantity()))
.compareTo(inventoryDto.getQuantity()) > 0) {
if (!matchedInventories.isEmpty()) {
// 计算总可用库存
BigDecimal totalAvailableQuantity = matchedInventories.stream()
.map(AdviceInventoryDto::getQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalRequiredQuantity = medicationRequestUseExe.getExecuteTimesNum()
.multiply(medicationRequestUseExe.getMinUnitQuantity());
if (totalRequiredQuantity.compareTo(totalAvailableQuantity) > 0) {
// 取第一个匹配的位置名称用于提示
String locationName = matchedInventories.get(0).getLocationName();
tipsList
.add("" + medicationRequestUseExe.getBusNo() + "】在" + inventoryDto.getLocationName() + "库存不足");
.add("" + medicationRequestUseExe.getBusNo() + "】在" + locationName + "库存不足");
}
} else {
tipsList.add("" + medicationRequestUseExe.getBusNo() + "】未匹配到库存信息");