全网最全面工作流引擎Flowable完整教程之多实例会签
Flowable完整教程之多實例會簽
- 前言
- 1、BladeX流程設計器
- 1.1、BladeX工作流設計
- 1.2、parallel多實例流程設計
- 1.3、 BladeX多實例任務節點參數設置
- 2、部署測試
- 2.1、部署流程定義
- 2.2、測試流程定義是否部署成功
- 2.3、啟動流程實例
- 2.4、完成任務
- 2.5、任務查詢
- 2.6 流程跟蹤
前言
以下內容皆是本人原創,創作不易,感謝幫忙點贊、轉發,我是愛寫代碼的成成呀
首先要理解什么是會簽?比如一個任務需要多人審批,比如需要5個人審批,都審批通過就算通過,一人反對則不通過;再比如多人審批,只要經理審批通過或者其他成員9成審批通過,就算通過,這就是會簽。
提示:以下是本篇文章正文內容,下面案例可供參考
1、BladeX流程設計器
1.1、BladeX工作流設計
配置多實例類型:sequential 串行 parallel 并行 ,這里我們先研究parallel 。
1.2、parallel多實例流程設計
從流程圖中我們可以看到,這個流程有四個節點,分別是開始節點、多實例任務節點、普通的用戶節點以及結束節點.。
會簽的場景是多人參與的場景,意味著這是一個多實例任務,什么是多實例任務?就是這個任務會產生多少實例,可以理解成Java類和對象的關系。這里實例指的是執行實例,你想要多少的執行實例,可以通過配置參數,來決定執行任務時會產生多少個一樣任務的實例,然后給每個指定的人執行,再把結果匯總,最后會根據匯總的結果來根據條件判斷是否通過。
<!--通過loopCardinality決定產生多少實例--> <loopCardinality>5</loopCardinality> <!--該屬性表示將任務分配給誰,這里用的是EL表達式 ,而且我們可能把5個任務分給5個不同的人,這里是不可預見的,是運行時確定--> flowable:assignee="${assignee}"<!--false 表示并行 true 表示串行--> <!--并行就是上面5個任務可以同時執行,并行就是5個任務一個個輪著輪著執行--> isSequential="false" <!--這里是一個運行時的變量的名字 ,舉個例子我們運行時變量里面必須有個變量名字叫assigneeList--> flowable:collection="assigneeList" <!--這里的assignee對應于上面的assigneeList, 如果 assigneeList是一個集合類型, 那么assignee就對應于集合中的一個單元,然后上面的EL表達式${assignee} 對應的就是這些單元。 類似于Mybatis中的foreach標簽--> flowable:elementVariable="assignee" <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee"><!--配置5個任務實例--><!--loopCardinality 代表該屬性循環的基數是多少,這個任務就是多實例任務,這個屬性就是設置有多少實例的地方!--><!--為什么叫循環基數?如果我們需要3個實例通過的,那可能3個實例就滿足條件,到下一環節了--><loopCardinality>5</loopCardinality><!-- nr代表 number 這里指 完成的實例數量/全部實例數 >= 0.50 即可--><!-- 這里的變量nrOfCompletedInstances和nrOfInstances是系統自動生成的,要是你需要設置自己的變量嗎,可以自己控制。--><!-- 當然也可以設置別的條件,通過EL表達式進行設置--><completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.50}</completionCondition> </multiInstanceLoopCharacteristics>1.3、 BladeX多實例任務節點參數設置
對應bpmn文件,配置如下
2、部署測試
2.1、部署流程定義
部署成功,流程定義ID=Multi-instanceCountersigning:1:387494
2.2、測試流程定義是否部署成功
@Test public void testDeployQuery() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();ProcessDefinition processDefinition = processDefinitionQuery.deploymentId("387491").singleResult();System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId());System.out.println("processDefinition.getName() = " + processDefinition.getName());System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription());System.out.println("processDefinition.getId() = " + processDefinition.getId());}控制臺打印結果如下,說明部署成功。
2.3、啟動流程實例
/*** 啟動流程實例*/ @Test public void testRunProcess() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();// 我們需要runtimeService來啟動流程實例RuntimeService runtimeService = processEngine.getRuntimeService();// 構建流程變量Map<String, Object> varivales = new HashMap<>();ArrayList<String> assigneeList = new ArrayList<>();assigneeList.add("u1");assigneeList.add("u2");assigneeList.add("u3");assigneeList.add("u4");assigneeList.add("u5");varivales.put("assigneeList", assigneeList);// 啟動流程實例ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("Multi-instanceCountersigning", varivales);System.out.println("Multi-instanceCountersigning.getProcessDefinitionId() = " + holidayRequest.getProcessDefinitionId());System.out.println("Multi-instanceCountersigning.getName() = " + holidayRequest.getName());System.out.println("Multi-instanceCountersigning.getActivityId() = " + holidayRequest.getActivityId());System.out.println("Multi-instanceCountersigning.getId() = " + holidayRequest.getId()); }啟動流程實例,控制臺輸入如下,流程實例Id:542501
進入到多實例任務節點之后,根據實例ID,我們看一下ACT_RU_TASK數據庫表的數據變化。
我們可以看到上面自動生成了5個任務實例,assignee也是我們代碼中傳入的數據。
再看下工作流流程變量表 ACT_RU_VARIABLE
發現除了我們自己傳入的assigneeList、assignee,還會自動生成一些屬性。
2.4、完成任務
我們設置的多實例任務的判斷條件是,完成人數大于50%到下一節點,也就是說,5人通過3人即可。
2.5、任務查詢
/*** 測試任務查詢*/ @Test public void testQueryTask() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();TaskService taskService = processEngine.getTaskService();List<Task> list = taskService.createTaskQuery()// 指定查詢的流程key.processDefinitionKey("Multi-instanceCountersigning")// 查詢這個任務的處理人.taskAssignee("u1").list();for (Task task : list) {System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());System.out.println("task.getAssignee() = " + task.getAssignee());System.out.println("task.getName() = " + task.getName());System.out.println("task.getDescription() = " + task.getDescription());} }// 控制臺打印結果如下 /** task.getProcessDefinitionId() = Multi-instanceCountersigning:3:540004 task.getAssignee() = u1 task.getName() = 多實例任務UserTask task.getDescription() = null */接下來執行任務。
@Test public void testCompleteTask() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery()// 指定查詢的任務key = task.getName().processDefinitionKey("多實例任務UserTask").taskAssignee("u1").singleResult();// 創建流程變量Map<String, Object> map = new HashMap<>();map.put("approved", true);// 完成任務taskService.complete(task.getId(), map); }u1用戶已經完成這個任務,我們再看下數據庫。
u1數據消失了,再看下ACT_RU_VARIABLE數據庫表,nrOfCompletedInstances屬性=1了。
接著提交兩個實例,任務結束,ACT_RU_TASK多實例任務節點數據全部清空。
2.6 流程跟蹤
總結
以上是生活随笔為你收集整理的全网最全面工作流引擎Flowable完整教程之多实例会签的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓开发本地视频播放器——扫描本地视频文
- 下一篇: 这5个“减压”小妙招,在你负重前行的路上