From fe1b02a121c173e9b2d56bbe5a1982e0e69e0548 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 28 四月 2026 18:06:08 +0800
Subject: [PATCH] feat(production): 新增生产工单管理功能 - 创建 ProductionOperationTask 实体类定义工单数据结构 - 实现 ProductionOperationTaskController 提供工单的增删改查接口 - 开发 ProductionOperationTaskService 和实现类处理业务逻辑 - 配置 ProductionOperationTaskMapper 及 XML 文件实现数据库操作 - 添加 ProductionOperationTaskVo 视图对象用于数据展示 - 扩展 ProductionOrder 实体类增加生产订单相关属性 - 更新 ProductionOrderMapper.xml 完善订单查询映射配置 - 优化 ProductionOrderPickRecordMapper.xml 记录物料领取明细 - 新增 ProductionOrderRoutingOperationParam 参数配置实体 - 完善 工序参数处理逻辑

---
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java |   49 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 30 insertions(+), 19 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 31affd2..f994bb6 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -242,7 +242,7 @@
             productionOrderRoutingOperationMapper.insert(targetOperation);
 
             ProductionOperationTask task = new ProductionOperationTask();
-            task.setTechnologyRoutingOperationId(targetOperation.getId());
+            task.setProductionOrderRoutingOperationId(targetOperation.getId());
             task.setProductionOrderId(productionOrder.getId());
             task.setPlanQuantity(defaultDecimal(productionOrder.getQuantity()));
             task.setCompleteQuantity(BigDecimal.ZERO);
@@ -450,6 +450,12 @@
         if (productionPlans.size() != planIds.size()) {
             throw new ServiceException("閮ㄥ垎鐢熶骇璁″垝涓嶅瓨鍦�");
         }
+        Map<Long, ProductionPlan> planMap = productionPlans.stream()
+                .collect(Collectors.toMap(ProductionPlan::getId, item -> item, (left, right) -> left));
+        ProductionPlan mainPlan = planMap.get(planIds.get(0));
+        if (mainPlan == null) {
+            throw new ServiceException("涓荤敓浜ц鍒掍笉瀛樺湪");
+        }
         Set<Long> productModelIds = productionPlans.stream()
                 .map(ProductionPlan::getProductModelId)
                 .collect(Collectors.toSet());
@@ -459,7 +465,7 @@
         if (productionPlans.stream().anyMatch(item -> item.getStatus() != null && item.getStatus() == 2)) {
             throw new ServiceException("鎵�閫夌敓浜ц鍒掑凡涓嬪彂");
         }
-        ProductionPlan firstPlan = productionPlans.get(0);
+        ProductionPlan firstPlan = mainPlan;
         if (productionOrder.getProductModelId() == null) {
             productionOrder.setProductModelId(firstPlan.getProductModelId());
         } else if (!Objects.equals(productionOrder.getProductModelId(), firstPlan.getProductModelId())) {
@@ -698,28 +704,33 @@
             }
         }
 
-        List<ProductionOrderPickVo> result = new ArrayList<>(bomStructureList.size());
+        Map<String, ProductionOrderPickVo> mergedPickMap = new LinkedHashMap<>();
         for (ProductionBomStructureVo structure : bomStructureList) {
             if (structure == null || structure.getProductModelId() == null) {
                 continue;
             }
             Long productModelId = structure.getProductModelId();
-            ProductionOrderPickVo vo = new ProductionOrderPickVo();
-            vo.setProductModelId(productModelId);
-            vo.setOperationName(structure.getOperationName());
-            vo.setTechnologyOperationId(structure.getTechnologyOperationId());
-            vo.setProductName(structure.getProductName());
-            vo.setModel(structure.getModel());
-            vo.setDemandedQuantity(defaultDecimal(structure.getDemandedQuantity()));
-            vo.setUnit(structure.getUnit());
-            List<String> batchNoList = stockBatchNoMap.get(productModelId) == null
-                    ? Collections.emptyList()
-                    : new ArrayList<>(stockBatchNoMap.get(productModelId));
-            vo.setBatchNoList(batchNoList);
-            vo.setStockQuantity(stockQuantityMap.getOrDefault(productModelId, BigDecimal.ZERO));
-            vo.setBom(true);
-            result.add(vo);
+            String mergeKey = String.valueOf(structure.getTechnologyOperationId()) + "#" + productModelId;
+            ProductionOrderPickVo vo = mergedPickMap.get(mergeKey);
+            if (vo == null) {
+                vo = new ProductionOrderPickVo();
+                vo.setProductModelId(productModelId);
+                vo.setOperationName(structure.getOperationName());
+                vo.setTechnologyOperationId(structure.getTechnologyOperationId());
+                vo.setProductName(structure.getProductName());
+                vo.setModel(structure.getModel());
+                vo.setDemandedQuantity(BigDecimal.ZERO);
+                vo.setUnit(structure.getUnit());
+                List<String> batchNoList = stockBatchNoMap.get(productModelId) == null
+                        ? Collections.emptyList()
+                        : new ArrayList<>(stockBatchNoMap.get(productModelId));
+                vo.setBatchNoList(batchNoList);
+                vo.setStockQuantity(stockQuantityMap.getOrDefault(productModelId, BigDecimal.ZERO));
+                vo.setBom(true);
+                mergedPickMap.put(mergeKey, vo);
+            }
+            vo.setDemandedQuantity(defaultDecimal(vo.getDemandedQuantity()).add(defaultDecimal(structure.getDemandedQuantity())));
         }
-        return result;
+        return new ArrayList<>(mergedPickMap.values());
     }
 }

--
Gitblit v1.9.3