在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图
当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以使用下面的代码获取到下一个节点信息直接跳转到下一个节点。
/**
* 获取当前流程的下一个节点
* @param procInstanceId
* @return
*/
public static String getNextNode(String procInstanceId){
// 1、首先是根据流程ID获取当前任务:
List<Task> tasks = processEngine.getTaskService().createTaskQuery().processInstanceId(procInstanceId).list();
String nextId = "";
for (Task task : tasks) {
RepositoryService rs = processEngine.getRepositoryService();
// 2、然后根据当前任务获取当前流程的流程定义,然后根据流程定义获得所有的节点:
ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) rs)
.getDeployedProcessDefinition(task.getProcessDefinitionId());
List<ActivityImpl> activitiList = def.getActivities(); // rs是指RepositoryService的实例
// 3、根据任务获取当前流程执行ID,执行实例以及当前流程节点的ID:
String excId = task.getExecutionId();
RuntimeService runtimeService = processEngine.getRuntimeService();
ExecutionEntity execution = (ExecutionEntity) runtimeService.createExecutionQuery().executionId(excId)
.singleResult();
String activitiId = execution.getActivityId();
// 4、然后循环activitiList
// 并判断出当前流程所处节点,然后得到当前节点实例,根据节点实例获取所有从当前节点出发的路径,然后根据路径获得下一个节点实例:
for (ActivityImpl activityImpl : activitiList) {
String id = activityImpl.getId();
if (activitiId.equals(id)) {
logger.debug("当前任务:" + activityImpl.getProperty("name")); // 输出某个节点的某种属性
List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();// 获取从某个节点出来的所有线路
for (PvmTransition tr : outTransitions) {
PvmActivity ac = tr.getDestination(); // 获取线路的终点节点
logger.debug("下一步任务任务:" + ac.getProperty("name"));
nextId = ac.getId();
}
break;
}
}
}
return nextId;
}
如果流程中存在很多GateWay请看下一遍博文activiti根据当前节点获取下一个UseTask节点