基于camunda开源流程引擎如何实现会签及会签原理解析
一、背景
市場上比較有名的開源流程引擎有osworkflow、jbpm、activiti、flowable、camunda。由于jbpm、activiti、flowable這幾個流程引擎出現的比較早,國內人用的比較多,大家對camunda流程引擎認識的不多,實際上camunda在功能上、穩定性、性能、輕量化方面均比jbpm、activiti、flowable優秀。中國人使用業務流程,“會簽”是一個最常用的流程操作,那么如何基于camunda實現會簽流程,會簽背后的流程引擎執行原理是什么,筆者希望通過這篇文章給正在研究camunda的同學參考,拋磚引玉。
二、什么是會簽
會簽: 在流程業務管理中,任務是通常都是由一個人去處理的,而多個人同時處理一個任務,這種任務我們稱之為會簽任務。
1、按照會簽執行的順序:
a)串行會簽:串行會簽也叫順序會簽,指按照提交流程處理人的次序user1、user2、user3依次接收待辦任務,并按順序處理流程。
b) 并行會簽:指user1、user2、user3同時接收到流程待辦任務,并行處理。
2、按照會簽通過的比例:
a) 全部通過:會簽人全部審批通過表決后,會簽通過。
b) 按數量通過:達到一定數量的通過表決后,會簽通過。
c) 按比例通過:達到一定比例的通過表決后,會簽通過。
d) 一票通過:只要有一個表決通過的,會簽通過。
e) 一票否決:只要有一個表決時否定的,會簽通過。
以下介紹基于camunda流程引擎如何實現會簽,并詳細解析流程引擎運行的原理。
三、安裝camunda BPM
首先完成camunda流程引擎的部署和camunda流程設計器的部署,并新建三個用戶user1、user2、user3,為設計會簽流程準備。詳細操作見:《Camunda流程引擎快速入門——Hello World示例》,https://lowcode.blog.csdn.net/article/details/117518828
四、設計會簽流程圖
1、畫流程圖,設置一個會簽節點
Camunda實現會簽是基于多實例任務,將節點設置成多實例,主要通過在UserTask節點的屬性上配置。選則一個用戶任務在下面的屬性中選擇Multil instance,可以看到有兩種圖標,分別表示串行會簽和并行會簽。
2、會簽參數設置
主要參數配置說明:
設置完成后,會簽節點的代碼片段:
<bpmn:userTask id="Activity_1udxyrq" name="會簽" camunda:assignee="${assignee}"><bpmn:incoming>Flow_1258z36</bpmn:incoming><bpmn:outgoing>Flow_0248t03</bpmn:outgoing><bpmn:multiInstanceLoopCharacteristics camunda:collection="assigneeList" camunda:elementVariable="assignee" /> </bpmn:userTask>3、配置流程處理人
需要注意的是,右側的Assignee,Candidate Users,Candidate Groups,分別表示按照負責人/候選用戶/候選組。
采用Assignee,填寫上一步中的Element Variable字段的內容,即可獲取當前審批人,注意是動態變量,${}格式,即會簽人Collection中遍歷的每一個人賦值給該變量。
4、配置流程監聽事件
為了更好的實現會簽可以結合流程節點監聽功能Listener處理,監聽種類有Java class、Expression、Delegate expression、script,文本為了簡單,使用script配置會簽處理人。
如何使用groovy script,詳細請參考camunda官方文檔:https://docs.camunda.org/manual/latest/user-guide/process-engine/scripting/
設置完成后,executionListener的配置片段如下:
點擊并拖拽以移動
<bpmn:extensionElements><camunda:executionListener event="start"><camunda:script scriptFormat="groovy">def userList = ['user1', 'user2', 'user3'];execution.setVariable("assigneeList", userList);</camunda:script></camunda:executionListener></bpmn:extensionElements>5、完整的BPMN流程文件
完整的BPMN流程模型文件:
<?xml version="1.0" encoding="UTF-8"?> <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1lsa7z1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.8.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0"><bpmn:process id="Process_1n6xfcx" name="測試驗證流程1" isExecutable="true" camunda:versionTag="1.0"><bpmn:startEvent id="StartEvent_1"><bpmn:outgoing>Flow_153mh25</bpmn:outgoing></bpmn:startEvent><bpmn:sequenceFlow id="Flow_153mh25" sourceRef="StartEvent_1" targetRef="Activity_18krv16" /><bpmn:sequenceFlow id="Flow_1258z36" sourceRef="Activity_18krv16" targetRef="Activity_1udxyrq" /><bpmn:sequenceFlow id="Flow_0248t03" sourceRef="Activity_1udxyrq" targetRef="Activity_0neq0ra" /><bpmn:endEvent id="Event_00b1j9n"><bpmn:incoming>Flow_0ucs2b7</bpmn:incoming></bpmn:endEvent><bpmn:sequenceFlow id="Flow_0ucs2b7" sourceRef="Activity_0neq0ra" targetRef="Event_00b1j9n" /><bpmn:userTask id="Activity_18krv16" name="申請"><bpmn:extensionElements><camunda:executionListener event="start"><camunda:script scriptFormat="groovy">def userList = ['user1', 'user2', 'user3'];execution.setVariable("assigneeList", userList);</camunda:script></camunda:executionListener></bpmn:extensionElements><bpmn:incoming>Flow_153mh25</bpmn:incoming><bpmn:outgoing>Flow_1258z36</bpmn:outgoing></bpmn:userTask><bpmn:userTask id="Activity_1udxyrq" name="會簽" camunda:assignee="${assignee}"><bpmn:incoming>Flow_1258z36</bpmn:incoming><bpmn:outgoing>Flow_0248t03</bpmn:outgoing><bpmn:multiInstanceLoopCharacteristics camunda:collection="assigneeList" camunda:elementVariable="assignee" /></bpmn:userTask><bpmn:userTask id="Activity_0neq0ra" name="審批" camunda:assignee="user2"><bpmn:incoming>Flow_0248t03</bpmn:incoming><bpmn:outgoing>Flow_0ucs2b7</bpmn:outgoing></bpmn:userTask></bpmn:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1n6xfcx"><bpmndi:BPMNEdge id="Flow_0ucs2b7_di" bpmnElement="Flow_0ucs2b7"><di:waypoint x="690" y="117" /><di:waypoint x="752" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0248t03_di" bpmnElement="Flow_0248t03"><di:waypoint x="530" y="117" /><di:waypoint x="590" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_1258z36_di" bpmnElement="Flow_1258z36"><di:waypoint x="370" y="117" /><di:waypoint x="430" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_153mh25_di" bpmnElement="Flow_153mh25"><di:waypoint x="215" y="117" /><di:waypoint x="270" y="117" /></bpmndi:BPMNEdge><bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"><dc:Bounds x="179" y="99" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_00b1j9n_di" bpmnElement="Event_00b1j9n"><dc:Bounds x="752" y="99" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_068boyx_di" bpmnElement="Activity_18krv16"><dc:Bounds x="270" y="77" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_10kl1f8_di" bpmnElement="Activity_1udxyrq"><dc:Bounds x="430" y="77" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_1duyn2a_di" bpmnElement="Activity_0neq0ra"><dc:Bounds x="590" y="77" width="100" height="80" /></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </bpmn:definitions>6、發布流程
填寫流程模型名稱,設置Camunda REST服務地址,發布流程。
7、配置groovy解析包
給camunda流程引擎設置配置groovy解析包。找到camunda安裝目錄camunda-bpm-run-7.15.0\configuration\userlib,放置一個groovy-all-2.4.13.jar,否則流程引擎運行過程會報錯,提示無法解析groovy腳本。Groovy包下載地址:https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all
8、開啟java序列化
給camunda流程引擎開啟java序列化,出于安全性考慮,camunda默認是關閉java序列化的,本示例涉及到會簽集合流程變量的存儲和解析,實際上是一個ArrayList,所以需要開啟java序列化。
詳細請參考camunda官方網站介紹:https://docs.camunda.org/manual/latest/reference/deployment-descriptors/tags/process-engine/#javaSerializationFormatEnabled
配置完成后,重啟camunda流程引擎。
五、會簽流程運行解析
1、登錄camunda BPM
默認地址:http://127.0.0.1:8080/camunda/app/tasklist/default/#/login
默認密碼: demo / demo
2、啟動流程
點擊“Start process”按鈕,彈出流程模板選擇框,點擊要啟動的流程名稱。
流程啟動后,默認在申請節點,點擊Complete按鈕,提交到下一步會簽節點。
3、會簽審批
(a)User1 登錄,看到流程已經提交到會簽節點了。
(b)通過界面查看流程變量
處于會簽節點時,該task會自動生成以下幾個流程變量:
條件${nrOfInstances == nrOfCompletedInstances}表示所有人員審批完成后會簽結束。
條件${ nrOfCompletedInstances == 1}表示一個人完成審批。
(c)填寫審批意見
每個會簽人都可以填寫流程意見。先填寫流程意見,再提交流程,即完成會簽操作。(d)此時查看數據庫表
查看act_ru_execution表,當前活動的實例有3條
查看act_ru_task表,當前待辦任務有3條
查看act_ru_variable表,查看當前流程變量, 可以看出此時的活動實例的總數為3,未完成的實例為3,已完成的為0。
(e)user1提交流程,完成會簽,提交給user2。
第一個會簽處理完成后,流程變量nrOfActiviteInstances、loopCounter 、nrOfInstances、nrOfCompletedInstances的值均發生了變化。
(f)此時查看數據庫表
查看act_ru_execution表,當前活動的實例有2條
查看act_ru_task表,當前待辦任務有2條,user1的待辦已經消失了。
查看act_ru_variable表,查看當前流程變量, 可以看出此時的活動實例的總數為3,未完成的實例為2,已完成的為1。
(g)按照如上操作,user1、user2、user3全部完成會簽,流程即流轉到了下一個節點。
(h)通過界面查詢流程變量,跟會簽控制相關流程變量全部消失了。
(i)查看數據庫表記錄
查看act_ru_execution表,會簽活動實例全部消失了。
查看act_ru_task表,會簽的待辦任務全部消失了。
查看act_ru_variable表,查看當前流程變量, 跟會簽狀態控制相關的流程變量全部消失了。
查看act_hi_taskinst表,該表記錄的是待辦任務歷史記錄,可以看到有3條跟會簽相關的歷史待辦任務。
查看act_hi_varinst表,該表記錄的是流程變量歷史記錄。
查看act_hi_comment表,該表記錄流程審批意見,可以看到user1、user2、user3三個人的審批意見均記錄到該表了。
六、總結
以上是基于camunda流程引擎開源版本實現的會簽功能,沒有進行任何二次開發,目標是讓讀者在不寫代碼的情況下,快速運行和驗證camunda流程引擎。在實際的業務場景中,這些是遠遠不夠的,需要對camunda進行二次封裝和擴展,包括跟企業組織用戶集成,流程處理人配置,流程審批頁面美化,還有流程退回、撤銷、取回、跳轉、加簽、轉辦、傳閱等中國特色流程功能的實現。
(END)
總結
以上是生活随笔為你收集整理的基于camunda开源流程引擎如何实现会签及会签原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebRTC回声抵消模块简要分析
- 下一篇: Atlas:手淘Native容器化框架和