【Activiti】跳转到工作流的任意节点(本例用跳转到上一节点讲解即流程回退)

所有用到的service以及实现类都是工作流(Activiti)本身的。

public String taskRollback(String taskId){
	//根据要跳转的任务ID获取其任务
	HistoricTaskInstance hisTask = historyService
                .createHistoricTaskInstanceQuery().taskId(taskId)
                .singleResult();
    //进而获取流程实例
    ProcessInstance instance = runtimeService
                .createProcessInstanceQuery()
                .processInstanceId(hisTask.getProcessInstanceId())
                .singleResult();
    //取得流程定义
    ProcessDefinitionEntity definition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(hisTask.getProcessDefinitionId());
    //获取历史任务的Activity
    ActivityImpl hisActivity = definition.findActivity(hisTask.getTaskDefinitionKey());
    //实现跳转
    managementService.executeCommand(new JumpCmd(instance.getId(), hisActivity.getId()));
}

public class JumpCmd implements Command{

    private String processInstanceId;
    private String activityId;
    public static final String REASION_DELETE = "deleted";
    
    public JumpCmd(String processInstanceId, String activityId) {
        this.processInstanceId = processInstanceId;
        this.activityId = activityId;
    }
    
    @Override
    public ExecutionEntity execute(CommandContext commandContext) {
        ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findExecutionById(processInstanceId);
        
        executionEntity.destroyScope(REASION_DELETE);
        ProcessDefinitionImpl processDefinition = executionEntity.getProcessDefinition();
        ActivityImpl activity = processDefinition.findActivity(activityId);
        executionEntity.executeActivity(activity);
        
        return executionEntity;
    }

}

用这个JumpCmd方法就可以实现所有流程节点的跳转。

你可能感兴趣的:(Activiti,Java)