Activiti-jump to the specified node, roll back

This blog post refers to the author's blog post
[Workflow Activiti7] 3. Activiti7 rollback and countersignature

1. Jump to the specified node java code

No need for activiti history to participate, but you have to remember the TaskDefinitionKey that needs to jump to the node

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 parameter description

It is the id in the red box
insert image description here

Guess you like

Origin blog.csdn.net/qq407995680/article/details/132674148