From 098d3347a0df808908aab8c554cd7c4febc5e6d9 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 26 八月 2024 11:43:59 +0800 Subject: [PATCH] !577 发布 5.2.2 正式版 安全性提升 Merge pull request !577 from 疯狂的狮子Li/dev --- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 236 +++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 157 insertions(+), 79 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index d5c7599..5235d12 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -7,8 +7,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.OssService; +import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -16,16 +20,14 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.common.enums.BusinessStatusEnum; +import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.ActHiTaskinst; import org.dromara.workflow.domain.WfTaskBackNode; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.*; import org.dromara.workflow.flowable.cmd.*; -import org.dromara.workflow.flowable.strategy.FlowEventStrategy; -import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; -import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; +import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.ActHiTaskinstMapper; import org.dromara.workflow.mapper.ActTaskMapper; import org.dromara.workflow.service.IActTaskService; @@ -50,6 +52,7 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.flowable.variable.api.persistence.entity.VariableInstance; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -64,21 +67,29 @@ * * @author may */ +@Slf4j @RequiredArgsConstructor @Service public class ActTaskServiceImpl implements IActTaskService { - private final RuntimeService runtimeService; - private final TaskService taskService; - private final HistoryService historyService; - private final IdentityService identityService; - private final ManagementService managementService; - private final FlowEventStrategy flowEventStrategy; + @Autowired(required = false) + private RuntimeService runtimeService; + @Autowired(required = false) + private TaskService taskService; + @Autowired(required = false) + private HistoryService historyService; + @Autowired(required = false) + private IdentityService identityService; + @Autowired(required = false) + private ManagementService managementService; private final ActTaskMapper actTaskMapper; - private final IWfTaskBackNodeService iWfTaskBackNodeService; + private final IWfTaskBackNodeService wfTaskBackNodeService; private final ActHiTaskinstMapper actHiTaskinstMapper; - private final IWfNodeConfigService iWfNodeConfigService; - private final IWfDefinitionConfigService iWfDefinitionConfigService; + private final IWfNodeConfigService wfNodeConfigService; + private final IWfDefinitionConfigService wfDefinitionConfigService; + private final FlowProcessEventHandler flowProcessEventHandler; + private final UserService userService; + private final OssService ossService; /** * 鍚姩浠诲姟 @@ -107,7 +118,7 @@ map.put("taskId", taskResult.get(0).getId()); return map; } - WfDefinitionConfigVo wfDefinitionConfigVo = iWfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); + WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName()); if (wfDefinitionConfigVo == null) { throw new ServiceException("璇峰埌娴佺▼瀹氫箟缁戝畾涓氬姟琛ㄥ悕涓庢祦绋婯EY锛�"); } @@ -156,15 +167,8 @@ @Transactional(rollbackFor = Exception.class) public boolean completeTask(CompleteTaskBo completeTaskBo) { try { - List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles(); String userId = String.valueOf(LoginHelper.getUserId()); - TaskQuery taskQuery = QueryUtils.taskQuery(); - taskQuery.taskId(completeTaskBo.getTaskId()).taskCandidateOrAssigned(userId); - if (CollUtil.isNotEmpty(roles)) { - List<String> groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); - taskQuery.taskCandidateGroupIn(groupIds); - } - Task task = taskQuery.singleResult(); + Task task = WorkflowUtils.getTaskByCurrentUser(completeTaskBo.getTaskId()); if (task == null) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -181,21 +185,17 @@ return true; } //闄勪欢涓婁紶 - AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId()); + AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId(), ossService); managementService.executeCommand(attachmentCmd); - FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); - String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); + String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey()); + //娴佺▼鎻愪氦鐩戝惉 if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { - if (processHandler != null) { - processHandler.handleProcess(processInstance.getBusinessKey(), businessStatus, true); - } + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true); } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); - String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); - FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key); - if (taskHandler != null) { - taskHandler.handleTask(task.getId(), processInstance.getBusinessKey()); - } + //鍔炵悊鐩戝惉 + flowProcessEventHandler.processTaskHandler(processInstance.getProcessDefinitionKey(), task.getTaskDefinitionKey(), + task.getId(), processInstance.getBusinessKey()); //鍔炵悊鎰忚 taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "鍚屾剰" : completeTaskBo.getMessage()); //鍔炵悊浠诲姟 @@ -206,14 +206,13 @@ taskService.complete(completeTaskBo.getTaskId()); } //璁板綍鎵ц杩囩殑娴佺▼浠诲姟鑺傜偣 - iWfTaskBackNodeService.recordExecuteNode(task); + wfTaskBackNodeService.recordExecuteNode(task); ProcessInstance pi = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); if (pi == null) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); - if (processHandler != null) { - processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false); - } + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), + BusinessStatusEnum.FINISH.getStatus(), false); } else { List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); for (Task t : list) { @@ -236,6 +235,7 @@ } return true; } catch (Exception e) { + log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } @@ -250,7 +250,7 @@ */ @Async public void sendMessage(List<Task> list, String name, List<String> messageType, String message) { - WorkflowUtils.sendMessage(list, name, messageType, message); + WorkflowUtils.sendMessage(list, name, messageType, message, userService); } /** @@ -266,7 +266,8 @@ String userId = String.valueOf(LoginHelper.getUserId()); queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId()); - queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' " + "and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN " + getInParam(roleIds) + " ) ))", userId))); + String ids = StreamUtils.join(roleIds, x -> "'" + x + "'"); + queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN (" + ids + ") ) ))", userId))); if (StringUtils.isNotBlank(taskBo.getName())) { queryWrapper.like("t.name_", taskBo.getName()); } @@ -281,10 +282,10 @@ List<TaskVo> taskList = page.getRecords(); if (CollUtil.isNotEmpty(taskList)) { List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + List<WfNodeConfigVo> wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); for (TaskVo task : taskList) { task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); @@ -293,19 +294,6 @@ } } return TableDataInfo.build(page); - } - - private String getInParam(List<String> param) { - StringBuilder sb = new StringBuilder(); - sb.append("("); - for (int i = 0; i < param.size(); i++) { - sb.append("'").append(param.get(i)).append("'"); - if (i != param.size() - 1) { - sb.append(","); - } - } - sb.append(")"); - return sb.toString(); } /** @@ -335,7 +323,7 @@ List<TaskVo> list = new ArrayList<>(); if (CollUtil.isNotEmpty(taskList)) { List<String> processDefinitionIds = StreamUtils.toList(taskList, Task::getProcessDefinitionId); - List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + List<WfNodeConfigVo> wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); for (Task task : taskList) { TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); if (CollUtil.isNotEmpty(processInstanceList)) { @@ -349,7 +337,7 @@ }); } taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); - taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId(), userService)); taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); @@ -383,7 +371,7 @@ List<TaskVo> taskList = page.getRecords(); if (CollUtil.isNotEmpty(taskList)) { List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + List<WfNodeConfigVo> wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); for (TaskVo task : taskList) { task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { @@ -419,7 +407,7 @@ List<TaskVo> taskList = page.getRecords(); if (CollUtil.isNotEmpty(taskList)) { List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + List<WfNodeConfigVo> wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); for (TaskVo task : taskList) { task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { @@ -447,7 +435,7 @@ List<TaskVo> taskList = page.getRecords(); if (CollUtil.isNotEmpty(taskList)) { List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + List<WfNodeConfigVo> wfNodeConfigVoList = wfNodeConfigService.selectByDefIds(processDefinitionIds); for (TaskVo task : taskList) { task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { @@ -467,8 +455,8 @@ @Override @Transactional(rollbackFor = Exception.class) public boolean delegateTask(DelegateBo delegateBo) { - TaskQuery query = QueryUtils.taskQuery(); - TaskEntity task = (TaskEntity) query.taskId(delegateBo.getTaskId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + Task task = WorkflowUtils.getTaskByCurrentUser(delegateBo.getTaskId()); + if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -484,7 +472,7 @@ taskService.complete(newTask.getId()); return true; } catch (Exception e) { - e.printStackTrace(); + log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } @@ -524,10 +512,9 @@ runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); } - FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); - if (processHandler != null) { - processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); - } + //娴佺▼缁堟鐩戝惉 + flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), + historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); @@ -541,7 +528,7 @@ */ @Override public boolean transferTask(TransmitBo transmitBo) { - Task task = QueryUtils.taskQuery().taskId(transmitBo.getTaskId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); + Task task = WorkflowUtils.getTaskByCurrentUser(transmitBo.getTaskId()); if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -555,7 +542,7 @@ taskService.setAssignee(task.getId(), transmitBo.getUserId()); return true; } catch (Exception e) { - e.printStackTrace(); + log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } @@ -603,7 +590,7 @@ taskService.complete(newTask.getId()); return true; } catch (Exception e) { - e.printStackTrace(); + log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } @@ -653,7 +640,7 @@ taskService.complete(newTask.getId()); return true; } catch (Exception e) { - e.printStackTrace(); + log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } @@ -666,9 +653,9 @@ @Override @Transactional(rollbackFor = Exception.class) public String backProcess(BackProcessBo backProcessBo) { - TaskQuery query = QueryUtils.taskQuery(); String userId = String.valueOf(LoginHelper.getUserId()); - Task task = query.taskId(backProcessBo.getTaskId()).taskCandidateOrAssigned(userId).singleResult(); + Task task = WorkflowUtils.getTaskByCurrentUser(backProcessBo.getTaskId()); + if (ObjectUtil.isEmpty(task)) { throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); } @@ -702,7 +689,9 @@ MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); if (multiInstance == null && taskList.size() > 1) { List<Task> tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); - actHiTaskinstMapper.deleteBatchIds(StreamUtils.toList(tasks, Task::getId)); + if (CollUtil.isNotEmpty(tasks)) { + actHiTaskinstMapper.deleteByIds(StreamUtils.toList(tasks, Task::getId)); + } } @@ -722,17 +711,16 @@ managementService.executeCommand(deleteExecutionCmd); } - WfTaskBackNode wfTaskBackNode = iWfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); + WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) { runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); - FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); - if (processHandler != null) { - processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); - } + flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), + processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); } //鍒犻櫎椹冲洖鍚庣殑娴佺▼鑺傜偣 - iWfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); + wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); } catch (Exception e) { + log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } return task.getProcessInstanceId(); @@ -753,6 +741,7 @@ taskService.setAssignee(task.getId(), userId); } } catch (Exception e) { + log.error("淇敼澶辫触锛�" + e.getMessage(), e); throw new ServiceException("淇敼澶辫触锛�" + e.getMessage()); } return true; @@ -777,4 +766,93 @@ } return variableVoList; } + + /** + * 鏌ヨ宸ヤ綔娴佷换鍔$敤鎴烽�夋嫨鍔犵浜哄憳 + * + * @param taskId 浠诲姟id + * @return + */ + @Override + @SuppressWarnings("unchecked") + public String getTaskUserIdsByAddMultiInstance(String taskId) { + Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); + if (task == null) { + throw new ServiceException("浠诲姟涓嶅瓨鍦�"); + } + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + if (multiInstance == null) { + return ""; + } + List<Long> userIds; + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + userIds = (List<Long>) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + } else { + List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); + } + return StringUtils.join(userIds, StringUtils.SEPARATOR); + } + + /** + * 鏌ヨ宸ヤ綔娴侀�夋嫨鍑忕浜哄憳 + * + * @param taskId 浠诲姟id 浠诲姟id + */ + @Override + @SuppressWarnings("unchecked") + public List<TaskVo> getListByDeleteMultiInstance(String taskId) { + Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); + List<Task> taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + List<TaskVo> taskListVo = new ArrayList<>(); + if (multiInstance == null) { + return List.of(); + } + List<Long> assigneeList = new ArrayList<>(); + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List<Object> variable = (List<Object>) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + for (Object o : variable) { + assigneeList.add(Long.valueOf(o.toString())); + } + } + + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List<Long> userIds = StreamUtils.filter(assigneeList, e -> !String.valueOf(e).equals(task.getAssignee())); + List<UserDTO> userList = userService.selectListByIds(userIds); + for (Long userId : userIds) { + TaskVo taskVo = new TaskVo(); + taskVo.setId("涓茶浼氱"); + taskVo.setExecutionId("涓茶浼氱"); + taskVo.setProcessInstanceId(task.getProcessInstanceId()); + taskVo.setName(task.getName()); + taskVo.setAssignee(userId); + if (CollUtil.isNotEmpty(userList)) { + userList.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> taskVo.setAssigneeName(u.getNickName())); + } + taskListVo.add(taskVo); + } + return taskListVo; + } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) { + List<Task> tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); + if (CollUtil.isNotEmpty(tasks)) { + List<Long> userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); + List<UserDTO> userList = userService.selectListByIds(userIds); + for (Task t : tasks) { + TaskVo taskVo = new TaskVo(); + taskVo.setId(t.getId()); + taskVo.setExecutionId(t.getExecutionId()); + taskVo.setProcessInstanceId(t.getProcessInstanceId()); + taskVo.setName(t.getName()); + taskVo.setAssignee(Long.valueOf(t.getAssignee())); + if (CollUtil.isNotEmpty(userList)) { + userList.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName())); + } + taskListVo.add(taskVo); + } + return taskListVo; + } + } + return List.of(); + } } -- Gitblit v1.9.3