【Activiti】跳轉到工作流的任意節點(本例用跳轉到上一節點講解即流程回退)
阿新 • • 發佈:2019-01-04
所有用到的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<ExecutionEntity>{
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方法就可以實現所有流程節點的跳轉。