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 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 107 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 2510e7a..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
@@ -50,8 +50,18 @@
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_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 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;
+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;
/**
* MES 鐢熶骇浠诲姟 Service 瀹炵幇绫�
@@ -67,6 +77,12 @@
@Resource
private MesProFeedbackMapper feedbackMapper;
+
+ @Resource
+ private MesProTaskPauseRecordMapper taskPauseRecordMapper;
+
+ @Resource
+ private MesProTaskAssigneeMapper taskAssigneeMapper;
@Resource
@Lazy
@@ -130,6 +146,10 @@
}
// 2.2 鎻掑叆
taskMapper.insert(task);
+
+ // 2.3 淇濆瓨鎸囧畾鎶ュ伐浜哄憳
+ updateTaskAssignees(task.getId(), createReqVO.getAssigneeUserIds());
+
return task.getId();
}
@@ -162,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);
+ }
}
/**
@@ -234,8 +282,10 @@
if (feedbackMapper.selectCountByTaskId(id) > 0) {
throw exception(PRO_TASK_HAS_FEEDBACK);
}
- // 3. 鍒犻櫎
+ // 3. 鍒犻櫎浠诲姟涓昏〃
taskMapper.deleteById(id);
+ // 4. 鍒犻櫎鍏宠仈鐨勪汉鍛�
+ taskAssigneeMapper.deleteByTaskId(id);
}
@Override
@@ -259,6 +309,14 @@
return Collections.emptyList();
}
return taskMapper.selectListByWorkOrderIds(workOrderIds);
+ }
+
+ @Override
+ public List<MesProTaskAssigneeDO> getTaskAssigneeListByTaskIds(Collection<Long> taskIds) {
+ if (CollUtil.isEmpty(taskIds)) {
+ return Collections.emptyList();
+ }
+ return taskAssigneeMapper.selectListByTaskIds(taskIds);
}
@Override
@@ -429,4 +487,52 @@
return taskIds;
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void pauseTask(MesProTaskPauseReqVO pauseReqVO) {
+ // 1. 鏍¢獙浠诲姟瀛樺湪
+ MesProTaskDO task = validateTaskExists(pauseReqVO.getId());
+ // 2. 鏍¢獙鐘舵�佹槸鍚﹀厑璁稿仠宸ワ紙濡傚繀椤绘槸 鐢熶骇涓� 鎴� 閮ㄥ垎瀹屾垚锛�
+ if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PREPARE.getStatus())) {
+ throw exception(PRO_TASK_CANNOT_PAUSE);
+ }
+
+ // 3. 淇敼浠诲姟鐘舵�佷负宸插仠宸�
+ taskMapper.updateById(new MesProTaskDO().setId(task.getId()).setStatus(MesProTaskStatusEnum.PAUSED.getStatus()));
+
+ // 4. 鍒涘缓鍋滃伐璁板綍
+ MesProTaskPauseRecordDO pauseRecord = new MesProTaskPauseRecordDO()
+ .setTaskId(task.getId())
+ .setWorkOrderId(task.getWorkOrderId())
+ .setWorkstationId(task.getWorkstationId())
+ .setReason(pauseReqVO.getReason())
+ .setRemark(pauseReqVO.getRemark())
+ .setPauseTime(LocalDateTime.now())
+ .setPauseUserId(SecurityFrameworkUtils.getLoginUserId());
+ taskPauseRecordMapper.insert(pauseRecord);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void resumeTask(MesProTaskResumeReqVO resumeReqVO) {
+ // 1. 鏍¢獙浠诲姟瀛樺湪
+ MesProTaskDO task = validateTaskExists(resumeReqVO.getId());
+ // 2. 鏍¢獙鐘舵�佸繀椤绘槸宸插仠宸�
+ if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PAUSED.getStatus())) {
+ throw exception(PRO_TASK_NOT_PAUSED);
+ }
+
+ // 3. 鎭㈠浠诲姟鐘舵��
+ Integer resumeStatus = MesProTaskStatusEnum.PREPARE.getStatus();
+ taskMapper.updateById(new MesProTaskDO().setId(task.getId()).setStatus(resumeStatus));
+
+ // 4. 鏇存柊鏈�鏂扮殑涓�鏉″仠宸ヨ褰�
+ MesProTaskPauseRecordDO pauseRecord = taskPauseRecordMapper.selectLastUnresumedByTaskId(task.getId());
+ if (pauseRecord != null) {
+ pauseRecord.setResumeTime(LocalDateTime.now());
+ pauseRecord.setResumeUserId(SecurityFrameworkUtils.getLoginUserId());
+ taskPauseRecordMapper.updateById(pauseRecord);
+ }
+ }
+
}
--
Gitblit v1.9.3