1,JumpTaskCmd.javajava
public class JumpTaskCmd implements Command<Comment> { protected List<String> executionIds; protected String activityId; public JumpTaskCmd(List<String> executionIds, String activityId) { this.executionIds = executionIds; this.activityId = activityId; } public Comment execute(CommandContext commandContext) { for (String executionId : executionIds) { for (TaskEntity taskEntity : Context.getCommandContext().getTaskEntityManager() .findTasksByExecutionId(executionId)) { Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "jump", false); } } ExecutionEntity executionEntity = Context.getCommandContext().getExecutionEntityManager() .findExecutionById(executionIds.get(0)); ProcessDefinitionImpl processDefinition = executionEntity.getProcessDefinition(); ActivityImpl activity = processDefinition.findActivity(activityId); executionEntity.executeActivity(activity); return null; } }
2,回退的實現方法示例app
@Override public void updateTaskJumpByAssignee(String procInsId, String activityId, String userId) { List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(procInsId).list(); if (executions.size() > 0) { String executionId = executions.get(0).getId(); List<String> executionIds = new ArrayList<>(); for (Execution execution : executions) { executionIds.add(execution.getId()); } TaskServiceImpl taskServiceImpl = (TaskServiceImpl) taskService; taskServiceImpl.getCommandExecutor().execute(new JumpTaskCmd(executionIds, activityId)); for (Task task : taskService.createTaskQuery().executionId(executionId).list()) { taskService.setAssignee(task.getId(), userId); } } else { throw new OperationException("流程實例id{" + procInsId + "}沒有執行中任務實例!"); } } @Override public boolean updateTaskTurnBackByAssignee(String taskId, String procInstId, String approvers, String type, String message) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); if (null == task) { throw new RuntimeException("任務ID:" + taskId + "沒有查詢到任務信息!"); } // 查詢最近的非退回的任務,退回的任務在catagory字段標示爲IS_RETURN_BACK_TASK List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery() .processInstanceId(procInstId).orderByHistoricTaskInstanceEndTime().desc().list(); HistoricTaskInstance turnBackTask = null; for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) { String catagory = historicTaskInstance.getCategory(); if (IS_RETURN_BACK_TASK.equals(catagory) || historicTaskInstance.getId().equals(taskId) || historicTaskInstance.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())) { continue; } else { turnBackTask = historicTaskInstance; break; } } if (null == turnBackTask) { throw new RuntimeException("沒有可退回的任務!"); } else { task.setCategory(IS_RETURN_BACK_TASK); taskService.saveTask(task); // 獲取上一步審批人 if (StringUtil.isEmpty(approvers)) { approvers = ""; List<HistoricIdentityLink> historicIdentityLinks = historyService .getHistoricIdentityLinksForTask(turnBackTask.getId()); for (HistoricIdentityLink historicIdentityLink : historicIdentityLinks) { approvers += historicIdentityLink.getUserId() + ","; } if (approvers.length() > 0) { approvers = approvers.substring(0, approvers.length() - 1); } } if (StringUtil.isEmpty(approvers)) { throw new OperationException("獲取不到退回的審批人!"); } try { this.updateTaskJumpByAssignee(procInstId, turnBackTask.getTaskDefinitionKey(), approvers); } catch (Exception e) { logger.error("WorkflowTaskService.updateTaskTurnBackByAssignee: " + e.getMessage(), e); throw new OperationException(e.getMessage()); } } return true; }