From 3edf8c4fc07f9784e2d04ee7a98692bb457749eb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 26 十月 2026 16:28:10 +0800
Subject: [PATCH] feat(mes): 新增工艺路线完整导入功能并优化相关验证

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java |   66 ++++++++++++++++++++++++++++++++-
 1 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
index 9ee4e74..2364935 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
@@ -7,12 +7,15 @@
 import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderProcessMapper;
 import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
 import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
+import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -24,6 +27,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -31,7 +35,7 @@
 /**
  * MES 鐢熶骇宸ュ崟宸ュ簭 Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 @Validated
@@ -48,6 +52,10 @@
     @Resource
     private MesProRouteProcessService routeProcessService;
     @Resource
+    private MesProRouteProductService routeProductService;
+    @Resource
+    private MesWmWarehouseAreaService warehouseAreaService;
+    @Resource
     @Lazy
     private MesProWorkOrderBomService workOrderBomService;
     @Resource
@@ -60,6 +68,12 @@
 
         // 2. 鎻掑叆鏁版嵁
         MesProWorkOrderProcessDO workOrderProcess = BeanUtils.toBean(createReqVO, MesProWorkOrderProcessDO.class);
+        if (CollUtil.isNotEmpty(createReqVO.getOutputItemIds())) {
+            workOrderProcess.setOutputItemId(
+                createReqVO.getOutputItemIds().stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(",")));
+        }
         workOrderProcessMapper.insert(workOrderProcess);
 
         // 3. 閲嶅缓宸ュ簭閾�
@@ -75,7 +89,16 @@
 
         // 2. 鏇存柊鏁版嵁
         MesProWorkOrderProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProWorkOrderProcessDO.class);
+        if (CollUtil.isNotEmpty(updateReqVO.getOutputItemIds())) {
+            updateObj.setOutputItemId(
+                updateReqVO.getOutputItemIds().stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(",")));
+        }
         workOrderProcessMapper.updateById(updateObj);
+        // 鎶ュ伐浠撳簱鍏佽缃┖锛屽崟鐙洿鏂�
+        workOrderProcessMapper.updateWarehouseById(updateReqVO.getId(), updateReqVO.getWarehouseId(),
+                updateReqVO.getLocationId(), updateReqVO.getAreaId());
 
         // 3. 閲嶅缓宸ュ簭閾�
         rebuildProcessChain(updateReqVO.getWorkOrderId());
@@ -109,6 +132,24 @@
     }
 
     @Override
+    public MesProWorkOrderProcessDO getWorkOrderProcessByWorkOrderIdAndProcessId(Long workOrderId, Long processId) {
+        return workOrderProcessMapper.selectByWorkOrderIdAndProcessId(workOrderId, processId);
+    }
+
+    @Override
+    public MesProWorkOrderProcessDO getLastWorkOrderProcessByWorkOrderId(Long workOrderId) {
+        return workOrderProcessMapper.selectLastByWorkOrderId(workOrderId);
+    }
+
+    @Override
+    public List<MesProWorkOrderProcessDO> getWorkOrderProcessListByWorkOrderIds(java.util.Collection<Long> workOrderIds) {
+        if (CollUtil.isEmpty(workOrderIds)) {
+            return Collections.emptyList();
+        }
+        return workOrderProcessMapper.selectListByWorkOrderIds(workOrderIds);
+    }
+
+    @Override
     public void deleteWorkOrderProcessByWorkOrderId(Long workOrderId) {
         workOrderProcessMapper.deleteByWorkOrderId(workOrderId);
     }
@@ -120,11 +161,15 @@
         if (CollUtil.isEmpty(routeProcessList)) {
             return Collections.emptyList();
         }
+        // 宸ヨ壓璺嚎浜у搧涓婇厤缃殑鎶ュ伐浠撳簱浣滀负宸ュ簭榛樿鍊硷紝涓嬪崟鏃跺彲鍐嶄慨鏀�
+        MesProRouteProductDO routeProduct = routeProductService.getRouteProductByItemId(productId);
         // 杞崲涓哄伐鍗曞伐搴� DO锛堜笉璁剧疆 workOrderId锛屽墠绔繚瀛樻椂鍐嶈缃級
         List<MesProWorkOrderProcessDO> processList = new ArrayList<>(routeProcessList.size());
         for (MesProRouteProcessDO routeProcess : routeProcessList) {
             processList.add(MesProWorkOrderProcessDO.builder()
                     .processId(routeProcess.getProcessId())
+                    .paramTemplateId(routeProcess.getParamTemplateId())
+                    .yieldRate(routeProcess.getYieldRate())
                     .sort(routeProcess.getSort())
                     .nextProcessId(routeProcess.getNextProcessId())
                     .linkType(routeProcess.getLinkType())
@@ -135,6 +180,9 @@
                     .checkFlag(routeProcess.getCheckFlag())
                     .backflushFlag(routeProcess.getBackflushFlag())
                     .outputItemId(routeProcess.getOutputItemId())
+                    .warehouseId(routeProduct != null ? routeProduct.getWarehouseId() : null)
+                    .locationId(routeProduct != null ? routeProduct.getLocationId() : null)
+                    .areaId(routeProduct != null ? routeProduct.getAreaId() : null)
                     .remark(routeProcess.getRemark())
                     .build());
         }
@@ -175,11 +223,20 @@
             if (item.getId() == null) {
                 // 鏂板
                 MesProWorkOrderProcessDO process = BeanUtils.toBean(item, MesProWorkOrderProcessDO.class);
+                if (CollUtil.isNotEmpty(item.getOutputItemIds())) {
+                    process.setOutputItemId(item.getOutputItemIds().stream().map(String::valueOf).collect(Collectors.joining(",")));
+                }
                 workOrderProcessMapper.insert(process);
             } else {
                 // 鏇存柊
                 MesProWorkOrderProcessDO updateObj = BeanUtils.toBean(item, MesProWorkOrderProcessDO.class);
+                if (CollUtil.isNotEmpty(item.getOutputItemIds())) {
+                    updateObj.setOutputItemId(item.getOutputItemIds().stream().map(String::valueOf).collect(Collectors.joining(",")));
+                }
                 workOrderProcessMapper.updateById(updateObj);
+                // 鎶ュ伐浠撳簱鍏佽缃┖锛屽崟鐙洿鏂�
+                workOrderProcessMapper.updateWarehouseById(item.getId(), item.getWarehouseId(),
+                        item.getLocationId(), item.getAreaId());
             }
         }
 
@@ -245,7 +302,12 @@
                 throw exception(PRO_WORK_ORDER_PROCESS_DUPLICATE);
             }
         }
-        // 4. 鏍¢獙鍏抽敭宸ュ簭鍞竴
+        // 4. 鏍¢獙鎶ュ伐浠撳簱灞傜骇锛堜粨搴�/搴撳尯/搴撲綅鍚屾椂濉啓鏃舵牎楠屽綊灞炲叧绯伙級
+        if (reqVO.getWarehouseId() != null && reqVO.getLocationId() != null && reqVO.getAreaId() != null) {
+            warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(),
+                    reqVO.getLocationId(), reqVO.getAreaId());
+        }
+        // 5. 鏍¢獙鍏抽敭宸ュ簭鍞竴
         if (Boolean.TRUE.equals(reqVO.getKeyFlag())) {
             for (MesProWorkOrderProcessDO process : list) {
                 if (reqVO.getId() != null && reqVO.getId().equals(process.getId())) {

--
Gitblit v1.9.3