fix(doctorstation): 修复耗材无库存时价格设置问题

- 前端组件中确保覆盖后端可能冲突的字段并强制设置耗材类型
- 后端服务中修复库存为空时无法获取价格的问题,直接从定价主表获取统一零售价
- 数据库查询中使用COALESCE函数优先从多个来源获取零售价,提高价格获取准确性
- 优化价格获取逻辑,支持从adm_charge_item_definition和adm_charge_item_def_detail表中按优先级获取价格
- 添加按批次售价的价格匹配机制,确保不同定价策略的正确应用
This commit is contained in:
2026-03-23 19:31:04 +08:00
parent bedad38ca3
commit cc51d0b345
3 changed files with 74 additions and 20 deletions

View File

@@ -389,6 +389,18 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
unitCode = baseDto.getUnitCode(); unitCode = baseDto.getUnitCode();
chargeItemDefinitionId = baseDto.getChargeItemDefinitionId(); chargeItemDefinitionId = baseDto.getChargeItemDefinitionId();
List<AdvicePriceDto> priceDtoList = new ArrayList<>(); List<AdvicePriceDto> priceDtoList = new ArrayList<>();
// 🔧 Bug #220 修复:耗材无库存时也需要设置价格
if (inventoryList.isEmpty()) {
// 库存为空时,直接从定价主表获取统一零售价
String finalUnitCode = unitCode; // 创建final变量用于lambda
List<AdvicePriceDto> 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());
priceDtoList.addAll(mainPrice);
} else {
// 库存信息里取 命中条件 去匹配价格 // 库存信息里取 命中条件 去匹配价格
for (AdviceInventoryDto adviceInventoryDto : inventoryList) { for (AdviceInventoryDto adviceInventoryDto : inventoryList) {
Long finalChargeItemDefinitionId = chargeItemDefinitionId; Long finalChargeItemDefinitionId = chargeItemDefinitionId;
@@ -413,6 +425,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
priceDtoList.addAll(mainPrice); priceDtoList.addAll(mainPrice);
} }
} }
}
// 价格信息 // 价格信息
baseDto.setPriceList(priceDtoList); baseDto.setPriceList(priceDtoList);
} else if (CommonConstants.TableName.WOR_ACTIVITY_DEFINITION.equals(tableName)) { // 诊疗 } else if (CommonConstants.TableName.WOR_ACTIVITY_DEFINITION.equals(tableName)) { // 诊疗

View File

@@ -81,7 +81,20 @@
T1.chrgitm_lv,--医保等级 T1.chrgitm_lv,--医保等级
T2.type_code as item_type_code, T2.type_code as item_type_code,
T2.yb_type, 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 ( SELECT T4.amount
FROM adm_charge_item_definition T5 FROM adm_charge_item_definition T5
LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id
@@ -152,7 +165,19 @@
T1.item_max_quantity, T1.item_max_quantity,
T2.type_code as item_type_code, T2.type_code as item_type_code,
T2.yb_type, 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 ( SELECT T4.amount
FROM adm_charge_item_definition T5 FROM adm_charge_item_definition T5
LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id

View File

@@ -293,7 +293,23 @@ function fetchFromApi(searchKey) {
categoryCode: item.categoryCode || '', categoryCode: item.categoryCode || '',
deviceId: item.id, deviceId: item.id,
deviceName: item.name, deviceName: item.name,
// 🔧 Bug Fix: ...item 展开放在前面,然后用前端字段覆盖
...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(() => { nextTick(() => {