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