From a829dd34332bbc10c6b42ef86635ed48e34c6207 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 03 十一月 2026 10:21:50 +0800
Subject: [PATCH] fix: 原料领料批号按可用库存过滤并实现先进先出
---
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java | 32 ++++++++++++++++++++++++++++++++
1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
index f64d44f..451f26e 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -34,7 +34,9 @@
import com.ruoyi.production.service.ProductionOrderService;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockInventory;
import com.ruoyi.technology.mapper.*;
import com.ruoyi.technology.pojo.*;
@@ -70,6 +72,7 @@
private final QualityInspectFileMapper qualityInspectFileMapper;
private final ProductionPlanMapper productionPlanMapper;
private final StockInventoryMapper stockInventoryMapper;
+ private final StockInRecordMapper stockInRecordMapper;
private final StorageAttachmentMapper storageAttachmentMapper;
private final StorageBlobMapper storageBlobMapper;
private final SalesLedgerMapper salesLedgerMapper;
@@ -1144,12 +1147,41 @@
List<StockInventory> stockList = stockInventoryMapper.selectList(
Wrappers.<StockInventory>lambdaQuery()
.in(StockInventory::getProductModelId, productModelIds));
+ // 鍚勬壒娆¢娆″叆搴撴椂闂达紝鐢ㄤ簬鍏堣繘鍏堝嚭鎺掑簭锛堝巻鍙叉暟鎹鍏ユ椂搴撳瓨琛岀殑 create_time 鍙兘鐩稿悓锛�
+ Map<Long, Map<String, LocalDateTime>> firstInTimeMap = new HashMap<>();
+ List<StockInRecord> stockInRecords = stockInRecordMapper.selectList(
+ Wrappers.<StockInRecord>lambdaQuery()
+ .in(StockInRecord::getProductModelId, productModelIds)
+ .isNotNull(StockInRecord::getBatchNo));
+ for (StockInRecord stockInRecord : stockInRecords) {
+ if (stockInRecord == null || stockInRecord.getProductModelId() == null
+ || stockInRecord.getBatchNo() == null || stockInRecord.getCreateTime() == null) {
+ continue;
+ }
+ firstInTimeMap.computeIfAbsent(stockInRecord.getProductModelId(), key -> new HashMap<>())
+ .merge(stockInRecord.getBatchNo(), stockInRecord.getCreateTime(),
+ (a, b) -> a.isBefore(b) ? a : b);
+ }
+ // 搴撳瓨琛屾寜鎵�灞炴壒娆$殑棣栨鍏ュ簱鏃堕棿鍗囧簭锛屼繚璇侀鏂欎笅鎷夋鏄厛杩涘厛鍑洪『搴�
+ stockList.sort(Comparator
+ .comparing((StockInventory stockItem) -> {
+ Map<String, LocalDateTime> modelBatchTimeMap = firstInTimeMap.get(stockItem.getProductModelId());
+ return modelBatchTimeMap == null ? null : modelBatchTimeMap.get(stockItem.getBatchNo());
+ }, Comparator.nullsLast(Comparator.naturalOrder()))
+ .thenComparing(StockInventory::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder()))
+ .thenComparing(stockItem -> stockItem.getId() == null ? Long.MAX_VALUE : stockItem.getId()));
for (StockInventory stockItem : stockList) {
if (stockItem == null || stockItem.getProductModelId() == null) {
continue;
}
Long productModelId = stockItem.getProductModelId();
stockQuantityMap.merge(productModelId, defaultDecimal(stockItem.getQualitity()), BigDecimal::add);
+ // 宸叉棤鍙敤搴撳瓨锛堟暟閲忔墸瀹屾垨琚攣瀹氾級鐨勬壒娆′笉鍐嶅甫鍒伴鏂欎笅鎷夋
+ BigDecimal availableQuantity = defaultDecimal(stockItem.getQualitity())
+ .subtract(defaultDecimal(stockItem.getLockedQuantity()));
+ if (availableQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
String batchNo = stockItem.getBatchNo();
if (batchNo != null && !batchNo.trim().isEmpty()) {
stockBatchNoMap.computeIfAbsent(productModelId, key -> new LinkedHashSet<>()).add(batchNo);
--
Gitblit v1.9.3