From 0857cf1830039d60ce73005f386f284cf575e511 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 26 十月 2026 14:00:19 +0800
Subject: [PATCH] feat(mes): 新增ERP销售订单生产状态枚举及MES工艺路线优化

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java |   61 ++++++++++++++++++++++++++----
 1 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
index 542955c..018b633 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
@@ -45,7 +45,9 @@
 import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -127,11 +129,7 @@
         if (itemId == null) {
             MesProRouteProcessDO routeProcess = routeProcessService
                     .getRouteProcessByRouteIdAndProcessId(createReqVO.getRouteId(), createReqVO.getProcessId());
-            if (routeProcess != null && routeProcess.getOutputItemId() != null) {
-                itemId = Long.valueOf(routeProcess.getOutputItemId().split(",")[0].trim());
-            } else {
-                itemId = workOrder.getProductId();
-            }
+            itemId = resolveTaskItemId(routeProcess, workOrder.getProductId());
         }
         MesMdItemDO item = itemService.validateItemExists(itemId);
 
@@ -256,6 +254,30 @@
         return routeProcesses;
     }
 
+    /**
+     * 浠诲姟浜у嚭鐗╂枡锛氫紭鍏堝彇宸ュ簭鍦ㄥ綋鍓嶄骇鍝佷笅鐨勪骇鍑猴紙鎸夊綊灞炶繃婊わ級锛屾病鏈変骇鍑烘椂鍙栧伐鍗曟垚鍝�
+     */
+    private Long resolveTaskItemId(MesProRouteProcessDO routeProcess, Long productId) {
+        if (routeProcess == null) {
+            return productId;
+        }
+        if (routeProcess.getId() != null) {
+            // 宸ヨ壓璺嚎妯℃澘锛氭寜浜у嚭褰掑睘杩囨护鍑哄綋鍓嶄骇鍝佺殑浜у嚭
+            List<Long> outputIds = routeProcessService
+                    .getOutputItemIdsByRouteProcessId(routeProcess.getId(), productId);
+            if (outputIds != null) {
+                // 鏈夊綊灞為厤缃細璇ヤ骇鍝佹棤浜у嚭鏃跺彇宸ュ崟鎴愬搧锛沶ull 琛ㄧず瀛橀噺鏃犲綊灞炴暟鎹紝缁х画璧拌仛鍚堝厹搴�
+                return CollUtil.isNotEmpty(outputIds) ? outputIds.get(0) : productId;
+            }
+        }
+        // 宸ュ崟宸ュ簭蹇収 / 瀛橀噺鏃犲綊灞炴暟鎹細浜у嚭宸叉寜浜у搧杩囨护锛屽彇绗竴涓�
+        String outputItemId = routeProcess.getOutputItemId();
+        if (outputItemId != null && !outputItemId.isBlank()) {
+            return Long.valueOf(outputItemId.split(",")[0].trim());
+        }
+        return productId;
+    }
+
     @Override
     public void deleteTask(Long id) {
         // 1. 鏍¢獙瀛樺湪涓旈潪缁堟��
@@ -274,6 +296,11 @@
     }
 
     @Override
+    public MesProTaskDO getTaskByCode(String code) {
+        return taskMapper.selectByCode(code);
+    }
+
+    @Override
     public PageResult<MesProTaskDO> getTaskPage(MesProTaskPageReqVO pageReqVO) {
         return taskMapper.selectPage(pageReqVO);
     }
@@ -281,6 +308,20 @@
     @Override
     public PageResult<MesProTaskDO> getPendingFeedbackPage(MesProTaskPageReqVO pageReqVO) {
         return taskMapper.selectPendingFeedbackPage(pageReqVO);
+    }
+
+    @Override
+    public Map<Long, Long> getPendingFeedbackCountByWorkstation() {
+        List<Map<String, Object>> rows = taskMapper.selectPendingFeedbackCountByWorkstation();
+        Map<Long, Long> result = new HashMap<>(rows.size());
+        for (Map<String, Object> row : rows) {
+            Object workstationId = row.get("workstation_id");
+            Object count = row.get("pending_count");
+            if (workstationId instanceof Number && count instanceof Number) {
+                result.put(((Number) workstationId).longValue(), ((Number) count).longValue());
+            }
+        }
+        return result;
     }
 
     @Override
@@ -438,7 +479,7 @@
         List<Long> taskIds = new java.util.ArrayList<>();
         for (MesProRouteProcessDO rp : routeProcesses) {
             cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO proc = procMap.get(rp.getProcessId());
-            Long itemId = rp.getOutputItemId() != null ? Long.valueOf(rp.getOutputItemId().split(",")[0].trim()) : workOrder.getProductId();
+            Long itemId = resolveTaskItemId(rp, workOrder.getProductId());
             cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.validateItemExists(itemId);
             MesProTaskDO task = new MesProTaskDO()
                     .setWorkOrderId(workOrder.getId())
@@ -465,7 +506,8 @@
         // 1. 鏍¢獙浠诲姟瀛樺湪
         MesProTaskDO task = validateTaskExists(pauseReqVO.getId());
         // 2. 鏍¢獙鐘舵�佹槸鍚﹀厑璁稿仠宸ワ紙濡傚繀椤绘槸 鐢熶骇涓� 鎴� 閮ㄥ垎瀹屾垚锛�
-        if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PREPARE.getStatus())) {
+        if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PRODUCING.getStatus(),
+                MesProTaskStatusEnum.PARTIAL_FINISHED.getStatus())) {
             throw exception(PRO_TASK_CANNOT_PAUSE);
         }
         
@@ -495,7 +537,10 @@
         }
 
         // 3. 鎭㈠浠诲姟鐘舵��
-        Integer resumeStatus = MesProTaskStatusEnum.PREPARE.getStatus();
+        Integer resumeStatus = task.getProducedQuantity() != null
+                && task.getProducedQuantity().signum() > 0
+                ? MesProTaskStatusEnum.PARTIAL_FINISHED.getStatus()
+                : MesProTaskStatusEnum.PRODUCING.getStatus();
         taskMapper.updateById(new MesProTaskDO().setId(task.getId()).setStatus(resumeStatus));
 
         // 4. 鏇存柊鏈�鏂扮殑涓�鏉″仠宸ヨ褰�

--
Gitblit v1.9.3