这是一个能够直接使用的方法可能之后会用到记录下
参数:
taskId:流程id
destTaskKey:目标节点taskName是由流程图中节点的taskName定义的
使用到的activiti服务:
historyService
runtimeService
taskService
/**
* @param taskId act_ru_task.id
* @param destTaskkey 要回退到的目标taskName
*/
private void rollbackMoreLeader(String taskId, String destTaskkey) {
try {
Map<String, Object> variables;
HistoricTaskInstance currTask = historyService
.createHistoricTaskInstanceQuery()
.taskId(taskId).singleResult();
if (currTask != null) {
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
.processInstanceId(currTask.getProcessInstanceId()).singleResult();
if (instance == null) {
System.out.println("流程结束!");
} else {
variables = instance.getProcessVariables();
ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(currTask.getProcessDefinitionId());
if (definition == null) {
System.out.println("流程定义未找到!");
} else {
//获取当前节点
ActivityImpl currActivity = ((ProcessDefinitionImpl) definition)
.findActivity(currTask.getTaskDefinitionKey());
System.out.println("currentActivity: " + currActivity);
//取得上一个节点的activity
List<PvmTransition> nextTransitionList = currActivity.getIncomingTransitions();
//清空当前activity的出口
List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
//新建节点连线关系集合
List<PvmTransition> pvmTransitionList = currActivity.getOutgoingTransitions();
for (PvmTransition pvmTransition : pvmTransitionList) {
oriPvmTransitionList.add(pvmTransition);
}
pvmTransitionList.clear();
//建立新出口
List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>();
for (PvmTransition nextTransition : nextTransitionList) {
PvmActivity nextActivity = nextTransition.getSource();
System.out.println("nextActivity: " + nextActivity);
System.out.println("ProcessDefinition" + nextActivity.getProcessDefinition());
if (nextActivity.toString().contains(destTaskkey)) {
ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition)
.findActivity(destTaskkey);
TransitionImpl newTranstion = currActivity.createOutgoingTransition();
newTranstion.setDestination(nextActivityImpl);
newTransitions.add(newTranstion);
} else {
continue;
}
}
//完成任务
List<Task> tasks = taskService.createTaskQuery()
.processInstanceId(instance.getId())
.taskDefinitionKey(currTask.getTaskDefinitionKey()).list();
for (Task task : tasks) {
taskService.complete(task.getId(), variables);
historyService.deleteHistoricTaskInstance(task.getId());
}
//恢复方向
for (TransitionImpl transitionImpl : newTransitions) {
currActivity.getOutgoingTransitions().remove(transitionImpl);
}
for (PvmTransition pvmTransition : oriPvmTransitionList) {
pvmTransitionList.add(pvmTransition);
}
System.out.println("撤回到" + destTaskkey);
}
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}