日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全网最全面工作流引擎Flowable完整教程之多实例会签

發布時間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全网最全面工作流引擎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多實例流程設計


從流程圖中我們可以看到,這個流程有四個節點,分別是開始節點、多實例任務節點、普通的用戶節點以及結束節點.。

<!--上述流程Bpmn文件:多實例會簽.bpmn20.xml 文件內容--> <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef"><process id="Multi-instanceCountersigning" name="多實例會簽" isExecutable="true"><documentation>勿刪除</documentation><startEvent id="startEvent1"></startEvent><userTask id="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C" name="多實例任務UserTask"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><[CDATA[false]]></modeler:initiator-can-complete></extensionElements><multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee"><loopCardinality>5</loopCardinality><completionCondition>${nrOfCompletedInstances/nrOfInstances &gt;= 0.50}</completionCondition></multiInstanceLoopCharacteristics></userTask><sequenceFlow id="sid-436F11E8-B070-4857-B5A6-A3CB94D4F138" sourceRef="startEvent1" targetRef="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C"></sequenceFlow><userTask id="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36" name="普通UserTask"></userTask><sequenceFlow id="sid-8F6E3D87-82DA-487E-8C71-53E983BD255A" sourceRef="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C" targetRef="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36"></sequenceFlow><endEvent id="sid-613CA134-8467-4145-A6B3-3995AD7332A3"></endEvent><sequenceFlow id="sid-7AD7B298-FAEC-40AA-B5E8-CFB919A72B92" sourceRef="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36" targetRef="sid-613CA134-8467-4145-A6B3-3995AD7332A3"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_Multi-instanceCountersigning"><bpmndi:BPMNPlane bpmnElement="Multi-instanceCountersigning" id="BPMNPlane_Multi-instanceCountersigning"><bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1"><omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C" id="BPMNShape_sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C"><omgdc:Bounds height="80.0" width="99.99999999999997" x="205.04945732883417" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36" id="BPMNShape_sid-E1E11E67-991E-40E5-950A-86A4C94F1C36"><omgdc:Bounds height="80.0" width="100.0" x="441.6449850159505" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-613CA134-8467-4145-A6B3-3995AD7332A3" id="BPMNShape_sid-613CA134-8467-4145-A6B3-3995AD7332A3"><omgdc:Bounds height="28.0" width="28.0" x="630.9214071656436" y="164.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="sid-436F11E8-B070-4857-B5A6-A3CB94D4F138" id="BPMNEdge_sid-436F11E8-B070-4857-B5A6-A3CB94D4F138"><omgdi:waypoint x="129.94999906825288" y="178.0"></omgdi:waypoint><omgdi:waypoint x="205.04945732883417" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-7AD7B298-FAEC-40AA-B5E8-CFB919A72B92" id="BPMNEdge_sid-7AD7B298-FAEC-40AA-B5E8-CFB919A72B92"><omgdi:waypoint x="541.5949850158808" y="178.0"></omgdi:waypoint><omgdi:waypoint x="630.9214071656436" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-8F6E3D87-82DA-487E-8C71-53E983BD255A" id="BPMNEdge_sid-8F6E3D87-82DA-487E-8C71-53E983BD255A"><omgdi:waypoint x="304.99945732876284" y="178.0"></omgdi:waypoint><omgdi:waypoint x="441.6449850159505" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </definitions>

會簽的場景是多人參與的場景,意味著這是一個多實例任務,什么是多實例任務?就是這個任務會產生多少實例,可以理解成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 &gt;= 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完整教程之多实例会签的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。