From a2ec946ba7838026e0db41225e0c30e851701cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Sat, 16 May 2026 19:22:44 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#504:=20=E3=80=90=E4=BD=8F=E9=99=A2?= =?UTF-8?q?=E5=8C=BB=E7=94=9F=E5=B7=A5=E4=BD=9C=E7=AB=99-=E4=B8=B4?= =?UTF-8?q?=E5=BA=8A=E5=8C=BB=E5=98=B1=E3=80=91=E6=8A=A4=E5=A3=AB=E9=80=80?= =?UTF-8?q?=E5=9B=9E=E8=8D=AF=E5=93=81=E5=8C=BB=E5=98=B1=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=8C=BB=E7=94=9F=E4=BF=AE=E6=94=B9=E5=B9=B6=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=97=B6=E6=8F=90=E7=A4=BA"=E6=9C=AA=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E5=88=B0=E5=BA=93=E5=AD=98=E4=BF=A1=E6=81=AF"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:checkInventory() 仅执行严格匹配(adviceDefinitionId + adviceTableName + locationId + lotNumber), 当退回医嘱设置了 locationId 但该药房恰好没有对应药品的库存记录时,匹配失败直接返回"未匹配到库存信息"。 而 checkExeMedInventory() 已有两步放宽匹配逻辑(先按药房匹配,失败后放宽到所有药房),checkInventory 缺失此逻辑。 修复:在 checkInventory() 中增加两步匹配: 1. 严格匹配(原有逻辑,含 locationId 条件) 2. 若严格匹配未找到且 locationId 非null,放宽 locationId 条件匹配所有药房库存 Co-Authored-By: Claude Opus 4.7 --- .../web/doctorstation/utils/AdviceUtils.java | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/utils/AdviceUtils.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/utils/AdviceUtils.java index 37b1a3cc9..a9e923666 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/utils/AdviceUtils.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/utils/AdviceUtils.java @@ -109,45 +109,74 @@ public class AdviceUtils { continue; } boolean matched = false; + boolean insufficientInventory = false; + + // 第一步:严格匹配(adviceDefinitionId + adviceTableName + locationId + lotNumber) for (AdviceInventoryDto inventoryDto : adviceInventory) { - // 匹配条件:adviceDefinitionId, adviceTableName, locationId, lotNumber 同时相等 - // 如果选择了具体的批次号,校验库存时需要加上批次号的匹配条件 - // 🔧 Bug #177 修复:添加容错处理,如果 adviceTableName 为空则跳过该项匹配 boolean lotNumberMatch = StringUtils.isEmpty(saveDto.getLotNumber()) || saveDto.getLotNumber().equals(inventoryDto.getLotNumber()); boolean tableNameMatch = StringUtils.isEmpty(saveDto.getAdviceTableName()) || inventoryDto.getItemTable().equals(saveDto.getAdviceTableName()); - // 🔧 Bug #504 修复:退回医嘱可能locationId为空,跳过location匹配 boolean locationMatch = saveDto.getLocationId() == null || inventoryDto.getLocationId().equals(saveDto.getLocationId()); if (inventoryDto.getItemId().equals(saveDto.getAdviceDefinitionId()) && tableNameMatch && locationMatch && lotNumberMatch) { matched = true; - // 检查库存是否充足 BigDecimal minUnitQuantity = saveDto.getMinUnitQuantity(); - // 🔧 Bug Fix: 对于耗材类型,如果没有设置minUnitQuantity,则使用quantity作为默认值 if (minUnitQuantity == null) { if (CommonConstants.TableName.ADM_DEVICE_DEFINITION.equals(inventoryDto.getItemTable())) { - // 耗材只有一个单位,minUnitQuantity等于quantity minUnitQuantity = saveDto.getQuantity(); } else { return saveDto.getAdviceName() + "的小单位数量不能为空"; } } - BigDecimal chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); // 中药付数 - // 中草药医嘱的情况 + BigDecimal chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); if (chineseHerbsDoseQuantity != null && chineseHerbsDoseQuantity.compareTo(BigDecimal.ZERO) > 0) { minUnitQuantity = minUnitQuantity.multiply(chineseHerbsDoseQuantity); } if (minUnitQuantity.compareTo(inventoryDto.getQuantity()) > 0) { - return saveDto.getAdviceName() + "在" + inventoryDto.getLocationName() + "库存不足"; + insufficientInventory = true; } break; } } + + // 第二步:如果严格匹配未找到,放宽location条件匹配所有药房库存 + if (!matched && saveDto.getLocationId() != null) { + for (AdviceInventoryDto inventoryDto : adviceInventory) { + boolean lotNumberMatch = StringUtils.isEmpty(saveDto.getLotNumber()) + || saveDto.getLotNumber().equals(inventoryDto.getLotNumber()); + boolean tableNameMatch = StringUtils.isEmpty(saveDto.getAdviceTableName()) + || inventoryDto.getItemTable().equals(saveDto.getAdviceTableName()); + if (inventoryDto.getItemId().equals(saveDto.getAdviceDefinitionId()) + && tableNameMatch && lotNumberMatch) { + matched = true; + BigDecimal minUnitQuantity = saveDto.getMinUnitQuantity(); + if (minUnitQuantity == null) { + if (CommonConstants.TableName.ADM_DEVICE_DEFINITION.equals(inventoryDto.getItemTable())) { + minUnitQuantity = saveDto.getQuantity(); + } else { + return saveDto.getAdviceName() + "的小单位数量不能为空"; + } + } + BigDecimal chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); + if (chineseHerbsDoseQuantity != null && chineseHerbsDoseQuantity.compareTo(BigDecimal.ZERO) > 0) { + minUnitQuantity = minUnitQuantity.multiply(chineseHerbsDoseQuantity); + } + if (minUnitQuantity.compareTo(inventoryDto.getQuantity()) > 0) { + insufficientInventory = true; + } + break; + } + } + } + // 如果没有匹配到库存 if (!matched) { + if (insufficientInventory) { + return saveDto.getAdviceName() + "库存不足"; + } return saveDto.getAdviceName() + "未匹配到库存信息"; } }