From cc51d0b345bdbbb57799c3ee68cf4f6f258d3e67 Mon Sep 17 00:00:00 2001 From: chenqi Date: Mon, 23 Mar 2026 19:31:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(doctorstation):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=80=97=E6=9D=90=E6=97=A0=E5=BA=93=E5=AD=98=E6=97=B6=E4=BB=B7?= =?UTF-8?q?=E6=A0=BC=E8=AE=BE=E7=BD=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端组件中确保覆盖后端可能冲突的字段并强制设置耗材类型 - 后端服务中修复库存为空时无法获取价格的问题,直接从定价主表获取统一零售价 - 数据库查询中使用COALESCE函数优先从多个来源获取零售价,提高价格获取准确性 - 优化价格获取逻辑,支持从adm_charge_item_definition和adm_charge_item_def_detail表中按优先级获取价格 - 添加按批次售价的价格匹配机制,确保不同定价策略的正确应用 --- .../DoctorStationAdviceAppServiceImpl.java | 49 ++++++++++++------- .../datadictionary/DeviceManageMapper.xml | 29 ++++++++++- .../components/adviceBaseList.vue | 16 ++++++ 3 files changed, 74 insertions(+), 20 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 748e1876..0cbd3d1e 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 @@ -389,28 +389,41 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp unitCode = baseDto.getUnitCode(); chargeItemDefinitionId = baseDto.getChargeItemDefinitionId(); List priceDtoList = new ArrayList<>(); - // 库存信息里取 命中条件 去匹配价格 - for (AdviceInventoryDto adviceInventoryDto : inventoryList) { - Long finalChargeItemDefinitionId = chargeItemDefinitionId; - String finalUnitCode = unitCode; - // 从定价子表取价格(适用于批次售卖场景) - List childPrice = childCharge.stream() - .filter(e -> e.getDefinitionId() != null && finalChargeItemDefinitionId != null - && e.getDefinitionId().equals(finalChargeItemDefinitionId) - && e.getConditionValue() != null && adviceInventoryDto.getLotNumber() != null - && e.getConditionValue().equals(adviceInventoryDto.getLotNumber())) - .peek(e -> e.setUnitCode(finalUnitCode)) // 设置 unitCode - .collect(Collectors.toList()); - // 从定价主表取价格(适用于统一零售价场景) + + // 🔧 Bug #220 修复:耗材无库存时也需要设置价格 + if (inventoryList.isEmpty()) { + // 库存为空时,直接从定价主表获取统一零售价 + String finalUnitCode = unitCode; // 创建final变量用于lambda List mainPrice = mainCharge.stream() .filter(e -> baseDto.getChargeItemDefinitionId() != null && e.getDefinitionId() != null && baseDto.getChargeItemDefinitionId().equals(e.getDefinitionId())) + .peek(e -> e.setUnitCode(finalUnitCode)) // 设置 unitCode .collect(Collectors.toList()); - // 按批次售价 - if (OrderPricingSource.BATCH_SELLING_PRICE.getCode().equals(orderPricingSource)) { - priceDtoList.addAll(childPrice); - } else { - priceDtoList.addAll(mainPrice); + priceDtoList.addAll(mainPrice); + } else { + // 库存信息里取 命中条件 去匹配价格 + for (AdviceInventoryDto adviceInventoryDto : inventoryList) { + Long finalChargeItemDefinitionId = chargeItemDefinitionId; + String finalUnitCode = unitCode; + // 从定价子表取价格(适用于批次售卖场景) + List childPrice = childCharge.stream() + .filter(e -> e.getDefinitionId() != null && finalChargeItemDefinitionId != null + && e.getDefinitionId().equals(finalChargeItemDefinitionId) + && e.getConditionValue() != null && adviceInventoryDto.getLotNumber() != null + && e.getConditionValue().equals(adviceInventoryDto.getLotNumber())) + .peek(e -> e.setUnitCode(finalUnitCode)) // 设置 unitCode + .collect(Collectors.toList()); + // 从定价主表取价格(适用于统一零售价场景) + List mainPrice = mainCharge.stream() + .filter(e -> baseDto.getChargeItemDefinitionId() != null && e.getDefinitionId() != null + && baseDto.getChargeItemDefinitionId().equals(e.getDefinitionId())) + .collect(Collectors.toList()); + // 按批次售价 + if (OrderPricingSource.BATCH_SELLING_PRICE.getCode().equals(orderPricingSource)) { + priceDtoList.addAll(childPrice); + } else { + priceDtoList.addAll(mainPrice); + } } } // 价格信息 diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/DeviceManageMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/DeviceManageMapper.xml index 38baa0a5..e4d776d9 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/DeviceManageMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/DeviceManageMapper.xml @@ -81,7 +81,20 @@ T1.chrgitm_lv,--医保等级 T2.type_code as item_type_code, T2.yb_type, - T2.price as retail_price,--零售价, + -- 🔧 Bug #220 修复:使用COALESCE优先从多个来源获取零售价 + -- 优先顺序:1. adm_charge_item_definition.price 2. adm_charge_item_def_detail.amount (condition_code='3') + COALESCE( + T2.price, + (SELECT T4.amount + FROM adm_charge_item_definition T5 + LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id + WHERE T4.condition_code = '3' + AND T5.instance_id = T1.id + AND T5.instance_table = 'adm_device_definition' + AND T4.delete_flag = '0' + ORDER BY T4.create_time DESC + LIMIT 1) + ) as retail_price,--零售价, ( SELECT T4.amount FROM adm_charge_item_definition T5 LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id @@ -152,7 +165,19 @@ T1.item_max_quantity, T2.type_code as item_type_code, T2.yb_type, - T2.price as retail_price,--零售价, + -- 🔧 Bug #220 修复:使用COALESCE优先从多个来源获取零售价 + COALESCE( + T2.price, + (SELECT T4.amount + FROM adm_charge_item_definition T5 + LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id + WHERE T4.condition_code = '3' + AND T5.instance_id = T1.id + AND T5.instance_table = 'adm_device_definition' + AND T4.delete_flag = '0' + ORDER BY T4.create_time DESC + LIMIT 1) + ) as retail_price,--零售价, ( SELECT T4.amount FROM adm_charge_item_definition T5 LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id diff --git a/openhis-ui-vue3/src/views/doctorstation/components/adviceBaseList.vue b/openhis-ui-vue3/src/views/doctorstation/components/adviceBaseList.vue index e8616383..f8d3a33e 100644 --- a/openhis-ui-vue3/src/views/doctorstation/components/adviceBaseList.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/adviceBaseList.vue @@ -293,7 +293,23 @@ function fetchFromApi(searchKey) { categoryCode: item.categoryCode || '', deviceId: item.id, deviceName: item.name, + // 🔧 Bug Fix: ...item 展开放在前面,然后用前端字段覆盖 ...item, + // 确保前端覆盖后端可能冲突的字段 + adviceName: item.name || item.busNo, + adviceType: 4, // 强制设置为前端耗材类型 + unitCode: item.unitCode || '', + unitCode_dictText: item.unitCode_dictText || '', + minUnitCode: item.minUnitCode || item.unitCode || '', + minUnitCode_dictText: item.minUnitCode_dictText || item.unitCode_dictText || '', + volume: item.size || item.totalVolume || '', + partPercent: item.partPercent || 1, + // 价格字段优先使用retailPrice + priceList: (item.retailPrice !== undefined && item.retailPrice !== null) + ? [{ price: item.retailPrice }] + : ((item.price !== undefined && item.price !== null) + ? [{ price: item.price }] + : []), }; }); nextTick(() => {