484 [住院护士站] 医嘱执行报“库存不足”后,发药明细单仍错误产生待发药记录(数据一致性缺陷)

This commit is contained in:
Ranyunqiao
2026-05-09 14:21:54 +08:00
parent b48ca4fb4a
commit 1c93227fad

View File

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.transaction.annotation.Transactional;
import com.core.common.core.domain.R;
import com.core.common.enums.TenantOptionDict;
import com.core.common.exception.ServiceException;
@@ -377,6 +378,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
* @return 操作结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> adviceExecute(AdviceExecuteParam adviceExecuteParam) {
// 实际执行时间
Date exeDate = adviceExecuteParam.getExeDate();
@@ -804,12 +806,6 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
chargeItemService.saveOrUpdate(chargeItem);
} else {
// 批次售卖情况
// 需要的药品数量(小单位)
BigDecimal minUnitQuantity = medicationRequestUseExe.getMinUnitQuantity();
if (minUnitQuantity == null || minUnitQuantity.compareTo(BigDecimal.ZERO) <= 0) {
throw new RuntimeException("药品执行数量异常medicationId: "
+ finalLongMedicationRequest.getMedicationId());
}
// 库存集合
List<AdviceInventoryDto> inventoryList = advice.getInventoryList();
if (inventoryList == null || inventoryList.isEmpty()) {
@@ -822,6 +818,20 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
throw new RuntimeException("未找到药品匹配的定价信息: "
+ finalLongMedicationRequest.getMedicationId());
}
// 需要的药品数量(小单位)
BigDecimal minUnitQuantity = medicationRequestUseExe.getMinUnitQuantity();
if (minUnitQuantity == null || minUnitQuantity.compareTo(BigDecimal.ZERO) <= 0) {
throw new RuntimeException("药品执行数量异常medicationId: "
+ finalLongMedicationRequest.getMedicationId());
}
// 【修复】预先计算总可用库存,确保在写入任何数据前进行校验
BigDecimal totalAvailableQuantity = inventoryList.stream()
.map(AdviceInventoryDto::getQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (totalAvailableQuantity.compareTo(minUnitQuantity) < 0) {
throw new RuntimeException("药品库存不足medicationId: "
+ finalLongMedicationRequest.getMedicationId());
}
// 剩余需要分配的数量
BigDecimal remainingQuantity = minUnitQuantity;
@@ -927,11 +937,6 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
chargeItem.setTotalPrice(totalPrice); // 总价
chargeItemService.saveOrUpdate(chargeItem);
}
if (remainingQuantity.compareTo(BigDecimal.ZERO) > 0) {
throw new RuntimeException("药品库存不足medicationId: "
+ finalLongMedicationRequest.getMedicationId());
}
}
}