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,28 +389,41 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
unitCode = baseDto.getUnitCode();
chargeItemDefinitionId = baseDto.getChargeItemDefinitionId();
List<AdvicePriceDto> priceDtoList = new ArrayList<>();
// 库存信息里取 命中条件 去匹配价格
for (AdviceInventoryDto adviceInventoryDto : inventoryList) {
Long finalChargeItemDefinitionId = chargeItemDefinitionId;
String finalUnitCode = unitCode;
// 从定价子表取价格(适用于批次售卖场景)
List<AdvicePriceDto> 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<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());
// 按批次售价
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<AdvicePriceDto> 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<AdvicePriceDto> 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);
}
}
}
// 价格信息

View File

@@ -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