Activiti跳转到指定节点
该博文参考了该作者的博文
【工作流Activiti7】3、Activiti7 回退与会签
1、跳转到指定节点java代码
不需要activiti历史记录参与,不过你得记住需要跳转节点的TaskDefinitionKey
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.*;
import org.activiti.engine.task.Task;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ActivitiUtil {
/**
* 跳转到指定的任务
* @param sourceTask 当前任务
* @param targetTaskDefinitionKey 指定节点定义的id
*/
public void jumpToTask(Task sourceTask,String targetTaskDefinitionKey) {
//取得当前节点的信息
//取得指定节点的信息(TaskDefinitionKey)
//保存当前节点的流向
//新建流向,由当前节点指向新节点(指定节点)
//当前节点完成任务=流行指定节点
//将当前节点的流向还原
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
//获取该工作流的bpmn模板
BpmnModel bpmnModel = repositoryService.getBpmnModel(sourceTask.getProcessDefinitionId());
// 获取当前活动节点
FlowNode currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sourceTask.getTaskDefinitionKey());
// 获取指定活动节点
FlowNode lastFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(targetTaskDefinitionKey);
// 临时保存当前活动的原始方向 ,最后需要用到他恢复正确的方向
List<SequenceFlow> originalSequenceFlowList = new ArrayList<>();
originalSequenceFlowList.addAll(currentFlowNode.getOutgoingFlows());
// 清理当前活动方向
currentFlowNode.getOutgoingFlows().clear();
// 建立新方向
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlowId");//这个可以随机
newSequenceFlow.setSourceFlowElement(currentFlowNode);//源
newSequenceFlow.setTargetFlowElement(lastFlowNode);//目标
List<SequenceFlow> newSequenceFlowList = new ArrayList<>();
newSequenceFlowList.add(newSequenceFlow);
// 当前节点指向新的方向
currentFlowNode.setOutgoingFlows(newSequenceFlowList);
// 完成当前任务 = 跳转到指定的节点任务
taskService.complete(sourceTask.getId());
// 恢复原始方向
currentFlowNode.setOutgoingFlows(originalSequenceFlowList);
}
}
2、targetTaskDefinitionKey参数说明
就是红框中的id