1. 程式人生 > >activiti之並行閘道器,駁回

activiti之並行閘道器,駁回

這裡寫圖片描述
並行閘道器官方並不支援實現駁回功能
但是有方法
思路:先將所有並行的任務-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);
    }