activiti根據當前節點獲取下一個節點資訊
阿新 • • 發佈:2019-02-17
在流程中使用監聽器判斷當前節點是否需要經過,否則跳轉到下一個節點,如下圖
當提交申請之後,當前提交人為部門負責人,那麼部門負責人節點就不需要走了,直接到下一個節點,但是下一個節點是什麼並不知道,就可以使用下面的程式碼獲取到下一個節點資訊直接跳轉到下一個節點。
/**
* 獲取當前流程的下一個節點
* @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;
}