activiti之並行閘道器,駁回
阿新 • • 發佈:2019-02-20
並行閘道器官方並不支援實現駁回功能
但是有方法
思路:先將所有並行的任務-1直接走到end狀態,然後留一條駁回,即可
主要程式碼,將任務走到end狀態
ActivityImpl endActivity = findActivitiImpl(taskId, "end");
commitProcess(taskId, null, endActivity.getId());
/**
* 根據任務ID和節點ID獲取活動節點
*
* @param taskId
* 任務ID
* @param activityId
* 活動節點ID 如果為null或"",則預設查詢當前活動節點 如果為"end",則查詢結束節點
*
* @return
* @throws Exception
*/
private ActivityImpl findActivitiImpl(String taskId, String activityId) throws Exception {
// 取得流程定義
ProcessDefinitionEntity processDefinition = findProcessDefinitionEntityByTaskId(taskId);
// 獲取當前活動節點ID
if (activityId == null) {
activityId = findTaskById(taskId).getTaskDefinitionKey();
}
// 根據流程定義,獲取該流程例項的結束節點
if (activityId.toUpperCase().equals("END")) {
for (ActivityImpl activityImpl : processDefinition.getActivities()) {
List pvmTransitionList = activityImpl.getOutgoingTransitions();
if (pvmTransitionList.isEmpty()) {
return activityImpl;
}
}
}
// 根據節點ID,獲取對應的活動節點
ActivityImpl activityImpl = ((ProcessDefinitionImpl) processDefinition).findActivity(activityId);
return activityImpl;
}
/**
* @param taskId
* 當前任務ID
* @param variables
* 流程變數
* @param activityId
* 流程轉向執行任務節點ID 此引數為空,預設為提交操作
* @throws Exception
*/
private void commitProcess(String taskId, Map<String, Object> variables, String activityId) throws Exception {
if (variables == null) {
variables = new HashMap<String, Object>();
}
// 跳轉節點為空,預設提交操作
if (activityId == null) {
engine.getTaskService().complete(taskId, variables);
} else {// 流程轉向操作
turnTransition(taskId, activityId, variables);
}
}
/**
* 流程轉向操作
*
* @param taskId
* 當前任務ID
* @param activityId
* 目標節點任務ID
* @param variables
* 流程變數
* @throws Exception
*/
private void turnTransition(String taskId, String activityId, Map<String, Object> variables) throws Exception {
// 當前節點
ActivityImpl currActivity = findActivitiImpl(taskId, null);
// 清空當前流向
List oriPvmTransitionList = clearTransition(currActivity);
// 建立新流向
TransitionImpl newTransition = currActivity.createOutgoingTransition();
// 目標節點
ActivityImpl pointActivity = findActivitiImpl(taskId, activityId);
// 設定新流向的目標節點
newTransition.setDestination(pointActivity);
// 執行轉向任務
engine.getTaskService().complete(taskId, variables);
// 刪除目標節點新流入
pointActivity.getIncomingTransitions().remove(newTransition);
// 還原以前流向
restoreTransition(currActivity, oriPvmTransitionList);
}