activiti的網關(GateWay)


在介紹activiti的基礎的時候說到了工作流的使用場景之請假,請假的天數不同,可能需要不同的領導簽字,本篇文章講介紹工作流的網關實現這類場景。

 

activiti中的網關包含以下幾種,這里只做下簡單的介紹,具體的細節信息可以參考網上資料。

(1)ParallelGeteway:並行網關/異或網關 (多人會簽完成,才能啟動下一流程)

(2)ExclusiveGateway排他網關(多人之中只能有一個人進行審批,哪個條件為true,則走對應的邏輯)

(3)InclusiveGateway包含網關(集成了並行與排他網關)

(4)EventGateway事件網關(只能連接中間捕獲事件)

 

話不多說,開始案例。步驟還是和我上一篇的文章一樣,繪畫流程圖、配置屬性--->部署流程--->啟動流程--->執行任務

繪畫流程圖:相信只要你有點流程圖的基礎,都能看懂流程走向

 配置(重要)

(1)每個節點配置辦理人,我這邊從上到下,從左到右,分別配置的張三、李四、王二、麻子四個人。

(2)事件到底走哪個分支,這個是需要我們配置的,點擊連線,properties下面的main config,找到condition,如圖所示,在里面配置條件。注意:這里面是個條件表達式,這個day是可以自行定義的,你也可以取別的參數,在你完成請假申請的時候,傳這個參數值就可以了。用專業術語來說,就是配置參數變量的值。

 同樣的,另外兩條線,也需要配置下Condition的值,最后點擊空白處,給該流程起個key和name。我這里起的key是applyLeave,就不做截圖展示了。

 

接下來部署流程和啟動流程我就一起上代碼了。

@Test
    public void ExclusiveGateWay(){
        //發布流程
        Deployment deployment = processEngine.getRepositoryService()
                        .createDeployment()
                        .name("排他網關")        
                        .addClasspathResource("diagrams/exclusiveWay.bpmn")
                        .addClasspathResource("diagrams/exclusiveWay.png")
                        .deploy();
        System.out.println("部署ID:"+deployment.getId());  
        System.out.println("部署名稱:"+deployment.getName());
       //啟動流程
       ProcessInstance pi =    processEngine.getRuntimeService()
                      .startProcessInstanceByKey("applyLeave");
                     
    }

查詢任務

public void MyPersonalTask(){
        String assignee = "張三";
        List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
                        .createTaskQuery()//創建任務查詢對象
                        /**排序*/
                        .orderByTaskCreateTime().asc()//使用創建時間的升序排列
                        /**返回結果集*/
                        .list();//返回列表
            for(Task task:list){
                System.out.println("任務ID:"+task.getId());
                System.out.println("任務名稱:"+task.getName());
                System.out.println("任務的辦理人:"+task.getAssignee());
                System.out.println("流程實例ID:"+task.getProcessInstanceId());
                System.out.println("執行對象ID:"+task.getExecutionId());
                System.out.println("流程定義ID:"+task.getProcessDefinitionId());
            }
    }

完成任務

@Test
    public void completeeTask() {
        TaskService taskService = processEngine.getTaskService();
        String taskId = "2408";  //這里的id就是我們上一步通過查看任務,獲取的任務id
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("day", 7);  //這里設置我們剛才配置參數對應的值,這里設置的7,那么應該到總經理審批
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .singleResult();
        taskService.addComment(taskId, task.getProcessInstanceId(), "7天假期審核通過"); //在這里我們可以對任務添加評論
        taskService.complete(taskId, variables);
                    
                     
    }

測試:先是張三提交了7天的申請,現在我們來驗證接下來是否到總經理審批,通過截圖,證明了我們流程中的排他網關是成功的。

 

並行網關我就不做測試了,感興趣的朋友可以自己畫圖配置測試看看,其實通過這篇和上一篇的案例我們可以發現到,工作流只要你流程畫好了,配置好了,剩下的都是一樣的操作了,部署啟動流程,查看任務,完成流程等。

 

最后做下補充:關於上面提到的變量

在實際過程中,我們常常會運用到變量的配置以及值獲取等問題。可以通過runtimeService或者taskService來設置變量和獲取變量,變量可以設置一個或者多個。對應的表act_ru_variable:正在執行的流程變量表  ;   act_hi_varinst:流程變量歷史表

runtimeService.setVariable(executionId, variableName, value)//表示使用執行對象ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值)
//    runtimeService.setVariables(executionId, variables)//表示使用執行對象ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值)
        
//    taskService.setVariable(taskId, variableName, value)//表示使用任務ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值)
//    taskService.setVariables(taskId, variables)//表示使用任務ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值)
   runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//啟動流程實例的同時,可以設置流程變量,用Map集合

流程變量的賦值:可以在啟動流程的時候賦值,也可以在某個節點完成任務的時候賦值,這個都是可以的,具體情況看你的業務需求。

 

下一篇我們會講到另一個常用的點-->監聽器。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM