From 56e8a8e8f6c90faf8240a5a05d64a6da441888ab Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期二, 18 八月 2026 09:50:23 +0800
Subject: [PATCH] feat(mes): add task assignee implementation

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 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 d6ebc52..d13aa2c 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
@@ -58,6 +58,8 @@
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskPauseRecordDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskPauseRecordMapper;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskAssigneeDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskAssigneeMapper;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPauseReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskResumeReqVO;
 
@@ -78,6 +80,9 @@
 
     @Resource
     private MesProTaskPauseRecordMapper taskPauseRecordMapper;
+
+    @Resource
+    private MesProTaskAssigneeMapper taskAssigneeMapper;
 
     @Resource
     @Lazy
@@ -141,6 +146,10 @@
         }
         // 2.2 鎻掑叆
         taskMapper.insert(task);
+        
+        // 2.3 淇濆瓨鎸囧畾鎶ュ伐浜哄憳
+        updateTaskAssignees(task.getId(), createReqVO.getAssigneeUserIds());
+        
         return task.getId();
     }
 
@@ -173,6 +182,34 @@
         MesProTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesProTaskDO.class)
                 .setName(buildTaskName(item, quantity));
         taskMapper.updateById(updateObj);
+        
+        // 3. 鏇存柊鎸囧畾鎶ュ伐浜哄憳锛堟瘮瀵规洿鏂帮級
+        updateTaskAssignees(task.getId(), updateReqVO.getAssigneeUserIds());
+    }
+
+    private void updateTaskAssignees(Long taskId, List<Long> assigneeUserIds) {
+        if (assigneeUserIds == null) {
+            assigneeUserIds = Collections.emptyList();
+        }
+        // 1. 鏌ヨ鏁版嵁搴撲腑鍘熸湁鐨�
+        List<MesProTaskAssigneeDO> oldAssignees = taskAssigneeMapper.selectListByTaskId(taskId);
+        Set<Long> oldUserIds = convertSet(oldAssignees, MesProTaskAssigneeDO::getUserId);
+        Set<Long> newUserIds = new java.util.HashSet<>(assigneeUserIds);
+
+        // 2. 璁$畻闇�瑕佹柊澧炵殑鍜岄渶瑕佸垹闄ょ殑
+        Set<Long> toAddUserIds = newUserIds.stream().filter(id -> !oldUserIds.contains(id)).collect(java.util.stream.Collectors.toSet());
+        Set<Long> toRemoveUserIds = oldUserIds.stream().filter(id -> !newUserIds.contains(id)).collect(java.util.stream.Collectors.toSet());
+
+        // 3. 鏂板
+        if (CollUtil.isNotEmpty(toAddUserIds)) {
+            List<MesProTaskAssigneeDO> addList = convertList(toAddUserIds, userId -> new MesProTaskAssigneeDO().setTaskId(taskId).setUserId(userId));
+            taskAssigneeMapper.insertBatch(addList);
+        }
+
+        // 4. 鍒犻櫎
+        if (CollUtil.isNotEmpty(toRemoveUserIds)) {
+            taskAssigneeMapper.deleteByTaskIdAndUserIds(taskId, toRemoveUserIds);
+        }
     }
 
     /**
@@ -245,8 +282,10 @@
         if (feedbackMapper.selectCountByTaskId(id) > 0) {
             throw exception(PRO_TASK_HAS_FEEDBACK);
         }
-        // 3. 鍒犻櫎
+        // 3. 鍒犻櫎浠诲姟涓昏〃
         taskMapper.deleteById(id);
+        // 4. 鍒犻櫎鍏宠仈鐨勪汉鍛�
+        taskAssigneeMapper.deleteByTaskId(id);
     }
 
     @Override
@@ -273,6 +312,14 @@
     }
 
     @Override
+    public List<MesProTaskAssigneeDO> getTaskAssigneeListByTaskIds(Collection<Long> taskIds) {
+        if (CollUtil.isEmpty(taskIds)) {
+            return Collections.emptyList();
+        }
+        return taskAssigneeMapper.selectListByTaskIds(taskIds);
+    }
+
+    @Override
     public MesProTaskDO validateTaskExists(Long id) {
         MesProTaskDO task = taskMapper.selectById(id);
         if (task == null) {

--
Gitblit v1.9.3