From 354ce8fa93b6b53b711c9b7245c3bc81ab384888 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期二, 21 七月 2026 16:42:53 +0800
Subject: [PATCH] feat: 优化领料只领取叶子节点的料

---
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java |   67 +++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 1 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 cd32ce4..caff402 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -22,6 +22,8 @@
 import com.ruoyi.production.bean.vo.ProductionOrderVo;
 import com.ruoyi.production.bean.vo.ProductionPlanVo;
 import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo;
+import com.ruoyi.production.bean.vo.ProcessRouteStatusVo;
+import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
 import com.ruoyi.production.enums.ProductOrderStatusEnum;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
@@ -86,6 +88,7 @@
         // 鍒嗛〉鏌ヨ鐢熶骇璁㈠崟
         Page<ProductionOrderVo> result = (Page<ProductionOrderVo>) baseMapper.pageProductionOrder(page, dto);
         fillProductImages(result.getRecords());
+        fillProcessRouteStatus(result.getRecords());
         return result;
     }
 
@@ -94,6 +97,7 @@
         // 鏌ヨ鐢熶骇璁㈠崟鍒楄〃
         List<ProductionOrderVo> records = baseMapper.listProductionOrder(dto);
         fillProductImages(records);
+        fillProcessRouteStatus(records);
         return records;
     }
 
@@ -812,6 +816,46 @@
         }
     }
 
+    private void fillProcessRouteStatus(List<ProductionOrderVo> records) {
+        if (records == null || records.isEmpty()) {
+            return;
+        }
+        List<Long> orderIds = records.stream()
+                .map(ProductionOrderVo::getId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (orderIds.isEmpty()) {
+            return;
+        }
+
+        List<ProductionOrderProcessTaskVo> tasks = productionOperationTaskMapper.listProcessStatusByOrderIds(orderIds);
+        Map<Long, List<ProcessRouteStatusVo>> statusMap = new LinkedHashMap<>();
+        if (tasks != null) {
+            for (ProductionOrderProcessTaskVo task : tasks) {
+                if (task == null || task.getProductionOrderId() == null) {
+                    continue;
+                }
+                ProcessRouteStatusVo status = new ProcessRouteStatusVo();
+                status.setName(task.getOperationName() != null && !task.getOperationName().isBlank()
+                        ? task.getOperationName()
+                        : "鏈煡宸ュ簭");
+                BigDecimal percentage = task.getCompletionStatus() == null
+                        ? BigDecimal.ZERO
+                        : task.getCompletionStatus();
+                if (percentage.compareTo(new BigDecimal("100")) > 0) {
+                    percentage = new BigDecimal("100");
+                }
+                status.setPercentage(percentage);
+                statusMap.computeIfAbsent(task.getProductionOrderId(), key -> new ArrayList<>()).add(status);
+            }
+        }
+
+        for (ProductionOrderVo record : records) {
+            record.setProcessRouteStatus(statusMap.getOrDefault(record.getId(), Collections.emptyList()));
+        }
+    }
+
     private StorageBlobVO toStorageBlobVO(StorageBlob blob) {
         // 灏嗗瓨鍌ㄦ枃浠跺璞¤浆鎹负VO
         StorageBlobVO vo = BeanUtil.copyProperties(blob, StorageBlobVO.class);
@@ -1063,9 +1107,30 @@
             }
         }
 
-        // 杩囨护鍑洪潪鏍硅妭鐐癸紙瀹為檯棰嗘枡椤癸級
+        // 鏀堕泦璁㈠崟鎴愬搧瑙勬牸ID锛氬寘鍚敓浜ц鍗曟垚鍝佽鏍间笌BOM鏍硅妭鐐硅鏍硷紝鐢ㄤ簬鎺掗櫎鈥滆嚜宸扁�濊繖涓�鐗╂枡
+        Set<Long> finishedProductModelIds = new HashSet<>();
+        if (productionOrder != null && productionOrder.getProductModelId() != null) {
+            finishedProductModelIds.add(productionOrder.getProductModelId());
+        }
+        bomStructureList.stream()
+                .filter(s -> s != null && (s.getParentId() == null || s.getParentId() == 0))
+                .map(ProductionBomStructureVo::getProductModelId)
+                .filter(Objects::nonNull)
+                .forEach(finishedProductModelIds::add);
+
+        // 鏀堕泦鎵�鏈夎寮曠敤涓虹埗绾х殑鑺傜偣ID锛欱OM浠庢渶鍚庝竴閬撳伐搴忓線閲岄厤缃墠涓�閬撳伐搴忥紝
+        // 涓棿鑺傜偣鏄笂涓�閬撳伐搴忕殑浜у嚭锛堣嚜鍒讹級锛屽彧鏈夋瘡鏉″垎鏀渶閲屽眰鐨勫彾瀛愯妭鐐规墠鏄湡姝i渶瑕侀鐢ㄧ殑鐗╂枡銆�
+        Set<Long> parentNodeIds = bomStructureList.stream()
+                .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
+                .map(ProductionBomStructureVo::getParentId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 杩囨护鍑哄彾瀛愯妭鐐癸紙瀹為檯棰嗘枡椤癸級锛氶潪鏍硅妭鐐广�侀潪涓棿鑺傜偣锛屽苟鎺掗櫎涓庤鍗曟垚鍝佸悓瑙勬牸鐨勭墿鏂欙紙鑷埗鎴愬搧鏃犻渶棰嗘枡锛�
         List<ProductionBomStructureVo> childStructureList = bomStructureList.stream()
                 .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
+                .filter(s -> s.getId() == null || !parentNodeIds.contains(s.getId()))
+                .filter(s -> s.getProductModelId() == null || !finishedProductModelIds.contains(s.getProductModelId()))
                 .collect(Collectors.toList());
 
         // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�

--
Gitblit v1.9.3