From bf5f52656e128f578ed42c7979c31cf4b476ce46 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 31 十月 2026 19:04:40 +0800
Subject: [PATCH] feat: 优化业务导入及工艺流程管理

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java |   48 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 46 insertions(+), 2 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 018b633..b723f98 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
@@ -2,6 +2,10 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import cn.iocoder.yudao.module.mes.service.pd.processparamtemplate.MesPdProcessParamTemplateService;
+import cn.iocoder.yudao.module.mes.service.pro.feedback.dto.MesTaskParamSnapshot;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskAutoGeneratePreviewRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskAutoGenerateReqVO;
@@ -76,6 +80,8 @@
 
     @Resource
     private MesProTaskMapper taskMapper;
+    @Resource
+    private MesPdProcessParamTemplateService paramTemplateService;
 
     @Resource
     private MesProFeedbackMapper feedbackMapper;
@@ -116,6 +122,7 @@
     private MesCalTeamService teamService;
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createTask(MesProTaskSaveReqVO createReqVO) {
         // 1. 鏍¢獙鍏宠仈鏁版嵁瀛樺湪
         MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId());
@@ -143,14 +150,17 @@
             task.setClientId(workOrder.getClientId());
         }
         // 2.2 鎻掑叆
+        freezeTaskParamConfig(task);
         taskMapper.insert(task);
         return task.getId();
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateTask(MesProTaskSaveReqVO updateReqVO) {
-        // 1.1 鏍¢獙瀛樺湪
-        MesProTaskDO task = validateTaskExists(updateReqVO.getId());
+        MesProTaskDO task = taskMapper.selectOne(new LambdaQueryWrapperX<MesProTaskDO>()
+                .eq(MesProTaskDO::getId, updateReqVO.getId()).last("FOR UPDATE"));
+        if (task == null) throw exception(PRO_TASK_NOT_EXISTS);
         // 1.2 鏍¢獙鍏宠仈鏁版嵁瀛樺湪
         if (updateReqVO.getWorkOrderId() != null) {
             workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId());
@@ -176,7 +186,40 @@
         // 2. 鏇存柊
         MesProTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesProTaskDO.class)
                 .setName(buildTaskName(item, quantity));
+        if (updateReqVO.getProcessId() != null && !updateReqVO.getProcessId().equals(task.getProcessId())) {
+            if (feedbackMapper.selectCountByTaskId(task.getId()) > 0) throw exception(PRO_TASK_HAS_FEEDBACK);
+            freezeTaskParamConfig(updateObj);
+        }
         taskMapper.updateById(updateObj);
+    }
+
+    /** 浠庡伐搴忓拰妯℃澘澶嶅埗瀹氫箟锛屽悗缁ā鏉跨淮鎶や笉鏀瑰彉宸叉帓浜т换鍔°�� */
+    private void freezeTaskParamConfig(MesProTaskDO task) {
+        var process = processService.getProcess(task.getProcessId());
+        if (process == null) throw exception(cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_PROCESS_NOT_EXISTS);
+        int mode = process.getParamCollectMode() == null ? 0 : process.getParamCollectMode();
+        task.setParamCollectMode(mode);
+        task.setParamTemplateSnapshot("");
+        task.setParamSharedSnapshot("");
+        if (mode == 0) return;
+        if ((mode != 1 && mode != 2) || process.getParamTemplateId() == null)
+            throw exception(cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_PROCESS_PARAM_CONFIG_INVALID);
+        var template = paramTemplateService.validateProcessParamTemplateExists(process.getParamTemplateId());
+        var details = paramTemplateService.getProcessParamTemplateDetailListByTemplateId(template.getId());
+        if (CollUtil.isEmpty(details)) throw exception(cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_WORK_ORDER_PARAM_RECORD_TEMPLATE_NO_DETAIL);
+        MesTaskParamSnapshot snapshot = new MesTaskParamSnapshot();
+        snapshot.setTemplateId(template.getId());
+        snapshot.setTemplateCode(template.getTemplateCode());
+        snapshot.setTemplateName(template.getTemplateName());
+        List<MesTaskParamSnapshot.Detail> frozenDetails = BeanUtils.toBean(details, MesTaskParamSnapshot.Detail.class);
+        for (MesTaskParamSnapshot.Detail detail : frozenDetails) {
+            if (detail.getUnitMeasureId() != null) {
+                var unit = unitMeasureService.getUnitMeasure(detail.getUnitMeasureId());
+                if (unit != null) detail.setUnitMeasureName(unit.getName());
+            }
+        }
+        snapshot.setDetails(frozenDetails);
+        task.setParamTemplateSnapshot(JsonUtils.toJsonString(snapshot));
     }
 
     /**
@@ -492,6 +535,7 @@
                     .setStatus(MesProTaskStatusEnum.PREPARE.getStatus())
                     .setClientId(workOrder.getClientId())
                     .setColorCode(rp.getColorCode());
+            freezeTaskParamConfig(task);
             taskMapper.insert(task);
             taskIds.add(task.getId());
         }

--
Gitblit v1.9.3