From 74ad846852f42b4e2258bfddd5c2a33cc1ce9847 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 29 八月 2026 18:03:46 +0800
Subject: [PATCH] feat(mes): 新增工序等待时长和报工数量配置功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java |   56 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 49 insertions(+), 7 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 5f82736..a38e19e 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
@@ -12,6 +12,8 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationMachineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
@@ -24,6 +26,7 @@
 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationMachineService;
 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
 import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessParamService;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
@@ -50,11 +53,13 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_FEEDBACK_CANNOT_CREATE_WHEN_PAUSED;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_ALREADY_FINISHED;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_CANNOT_PAUSE;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_HAS_FEEDBACK;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_NOT_EXISTS;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_NOT_PAUSED;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_WAIT_NOT_CONFIGURED;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskPauseRecordDO;
@@ -111,6 +116,9 @@
     @Lazy
     private MesProWorkOrderParamRecordService workOrderParamRecordService;
     @Resource
+    @Lazy
+    private MesProProcessParamService processParamService;
+    @Resource
     private MesMdAutoCodeRecordService autoCodeRecordService;
     @Resource
     private MesMdWorkstationMachineService workstationMachineService;
@@ -150,14 +158,28 @@
         }
         // 2.2 鎻掑叆
         taskMapper.insert(task);
-        if (task.getParamTemplateId() != null) {
-            workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId());
-        }
+        // 2.2.1 鍙傛暟蹇収锛氫紭鍏堜娇鐢ㄦā鏉匡紱鏃犳ā鏉挎椂鍥為��鍒板伐搴忎富鏁版嵁缁戝畾鐨勫伐鑹哄弬鏁�
+        createTaskParamRecordWithFallback(task);
 
         // 2.3 淇濆瓨鎸囧畾鎶ュ伐浜哄憳
         updateTaskAssignees(task.getId(), createReqVO.getAssigneeUserIds());
-        
+
         return task.getId();
+    }
+
+    /**
+     * 涓轰换鍔″浐鍖栧弬鏁板揩鐓э細浼樺厛浣跨敤璺嚎/宸ュ崟宸ュ簭缁戝畾鐨勫弬鏁版ā鏉匡紱鏃犳ā鏉挎椂鍥為��鍒板伐搴忎富鏁版嵁缁戝畾鐨勫伐鑹哄弬鏁�
+     */
+    private void createTaskParamRecordWithFallback(MesProTaskDO task) {
+        if (task.getParamTemplateId() != null) {
+            workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId());
+            return;
+        }
+        // 鏃犳ā鏉匡細浠庡伐搴忎富鏁版嵁瑙f瀽缁戝畾鐨勫伐鑹哄弬鏁�
+        List<MesProProcessParamDO> processParams = processParamService.getProcessParamListByProcessId(task.getProcessId());
+        if (CollUtil.isNotEmpty(processParams)) {
+            workOrderParamRecordService.createTaskParamRecordFromProcessParams(task.getId(), processParams);
+        }
     }
 
     @Override
@@ -498,9 +520,8 @@
                     .setClientId(workOrder.getClientId())
                     .setColorCode(rp.getColorCode());
             taskMapper.insert(task);
-            if (task.getParamTemplateId() != null) {
-                workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId());
-            }
+            // 鍙傛暟蹇収锛氫紭鍏堜娇鐢ㄦā鏉匡紱鏃犳ā鏉挎椂鍥為��鍒板伐搴忎富鏁版嵁缁戝畾鐨勫伐鑹哄弬鏁�
+            createTaskParamRecordWithFallback(task);
             taskIds.add(task.getId());
         }
         // 7. 鏇存柊宸ュ崟宸叉帓浜ф暟閲�
@@ -556,4 +577,25 @@
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public LocalDateTime startWaitCountdown(Long taskId) {
+        // 1. 鏍¢獙浠诲姟瀛樺湪涓旀湭缁堟��
+        MesProTaskDO task = validateTaskNotFinished(taskId);
+        // 2. 鏍¢獙鍋滃伐鐘舵�佷笉鑳芥姤宸�
+        if (!MesProTaskStatusEnum.canFeedback(task.getStatus())) {
+            throw exception(PRO_FEEDBACK_CANNOT_CREATE_WHEN_PAUSED);
+        }
+        // 3. 鏍¢獙宸ュ簭閰嶇疆浜嗙瓑寰呮椂闀�
+        MesProProcessDO process = processService.getProcess(task.getProcessId());
+        if (process == null || process.getWaitDuration() == null
+                || process.getWaitDuration().compareTo(BigDecimal.ZERO) <= 0) {
+            throw exception(PRO_TASK_WAIT_NOT_CONFIGURED);
+        }
+        // 4. 璁板綍鍊掕鏃跺紑濮嬫椂闂达紙閲嶅鐐瑰嚮閲嶇疆锛�
+        LocalDateTime now = LocalDateTime.now();
+        taskMapper.updateById(new MesProTaskDO().setId(taskId).setWaitStartTime(now));
+        return now;
+    }
+
 }

--
Gitblit v1.9.3