Activiti框架常用-流程节点撤回
在工作中会用到Activiti框架来走流程,会有一些信息填写异常等状况,我们可以将节点撤回到指定节点。
创建测试类,引入测试用到的配置文件
private final String key = "groupTaskDelegate";//key值
private final int version = 1;//版本号
//Service接口的父类,可以直接获取下边的Service
private ProcessEngine processEngine;
//Activiti的七大Service类
private RepositoryService repositoryService;
private RuntimeService runtimeService;
private HistoryService historyService;
private ManagementService managementService;
private TaskService taskService;
private IdentityService identityService;
private FormService formService;
@Before
public void init() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-activiti.xml");
processEngine = ProcessEngines.getDefaultProcessEngine();
repositoryService = (RepositoryService) context.getBean("repositoryService");
runtimeService = (RuntimeService) context.getBean("runtimeService");
historyService = (HistoryService) context.getBean("historyService");
managementService = (ManagementService) context.getBean("managementService");
identityService = (IdentityService) context.getBean("identityService");
formService = (FormService) context.getBean("formService");
taskService = processEngine.getTaskService();
System.out.println("========== 初始化完成 ==========");
}
撤回到指定节点
@Test
public void test(){
rollBackToAssignWoekFlow("5001","usertask2");
}
/**
* 撤回
* @param processInstanceId
* @param destTaskkey
*/
public void rollBackToAssignWoekFlow(String processInstanceId,String destTaskkey){
// 取得当前任务.当前任务节点
destTaskkey ="usertask2";
// HistoricTaskInstance currTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
Map<String, Object> variables;
ExecutionEntity entity = (ExecutionEntity) runtimeService.createExecutionQuery().executionId(processInstanceId).singleResult();
ProcessDefinitionEntity definition = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService)
.getDeployedProcessDefinition(entity.getProcessDefinitionId());
variables = entity.getProcessVariables();
//当前活动环节
ActivityImpl currActivityImpl = definition.findActivity(entity.getActivityId());
//目标活动节点
ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition).findActivity(destTaskkey);
if(currActivityImpl !=null){
//所有的出口集合
List<PvmTransition> pvmTransitions = currActivityImpl.getOutgoingTransitions();
List<PvmTransition> oriPvmTransitions = new ArrayList<PvmTransition>();
for(PvmTransition transition : pvmTransitions){
oriPvmTransitions.add(transition);
}
//清除所有出口
pvmTransitions.clear();
//建立新的出口
List<TransitionImpl> transitionImpls = new ArrayList<TransitionImpl>();
TransitionImpl tImpl = currActivityImpl.createOutgoingTransition();
tImpl.setDestination(nextActivityImpl);
transitionImpls.add(tImpl);
List<Task> list = taskService.createTaskQuery().processInstanceId(entity.getProcessInstanceId())
.taskDefinitionKey(entity.getActivityId()).list();
for(Task task:list){
taskService.complete(task.getId(), variables);
historyService.deleteHistoricTaskInstance(task.getId());
}
for(TransitionImpl transitionImpl:transitionImpls){
currActivityImpl.getOutgoingTransitions().remove(transitionImpl);
}
for(PvmTransition pvmTransition:oriPvmTransitions){
pvmTransitions.add(pvmTransition);
}
}
}