fix(doctorstation): 修复耗材无库存时价格设置问题
- 前端组件中确保覆盖后端可能冲突的字段并强制设置耗材类型 - 后端服务中修复库存为空时无法获取价格的问题,直接从定价主表获取统一零售价 - 数据库查询中使用COALESCE函数优先从多个来源获取零售价,提高价格获取准确性 - 优化价格获取逻辑,支持从adm_charge_item_definition和adm_charge_item_def_detail表中按优先级获取价格 - 添加按批次售价的价格匹配机制,确保不同定价策略的正确应用
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 价格信息
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user