怎么做一個(gè)電商網(wǎng)站網(wǎng)站流量指標(biāo)有哪些
本章將分享的是camunda流程設(shè)計(jì)器--Camunda Modeler的基本使用(對(duì)應(yīng)camunda版本是7.19),包括bpmn流程圖畫法,各種控件使用以及一些日常業(yè)務(wù)場(chǎng)景的流程圖的實(shí)現(xiàn)
參考資料:
Camunda BPMN 基礎(chǔ)組件-CSDN博客
Camunda: ExecutionListener執(zhí)行監(jiān)聽器和TaskListener任務(wù)監(jiān)聽器-CSDN博客
snail-camunda: Camunda二次封裝以及相關(guān)功能使用介紹。 中國(guó)式工作流解決方案。
文章目錄
- 一、常用控件
- 1.事件(Event)
- 2.任務(wù)(Task)
- 3.網(wǎng)關(guān)(Gateway)
- 二、流程設(shè)計(jì)器使用
- 1.新建模型
- 2.命名流程圖
- 3.拖拽控件畫圖
- 4.監(jiān)聽器配置
- 5.網(wǎng)關(guān)配置
- 6.子流程
- 1.內(nèi)部子流程
- 2.外部子流程(活動(dòng)調(diào)用)
- 三、實(shí)戰(zhàn)演示
一、常用控件
1.事件(Event)
事件是BPMN2.0中一個(gè)非常重要的概念,是流程運(yùn)行過(guò)程中發(fā)生的事情,而這些事情的發(fā)生會(huì)影響到流程的流轉(zhuǎn)。對(duì)每個(gè)事件而言,一般會(huì)包含兩個(gè)要素,分別是觸發(fā)這個(gè)事件的原因,以及由此導(dǎo)致的結(jié)果。
以下是一些常用的事件類型
-
(空白)開始事件
如下圖所示,開始事件是流程圖里必須要有的元素,同時(shí)一個(gè)流程圖只能有且僅有一個(gè)空白開始事件
-
結(jié)束事件
標(biāo)志流程的一個(gè)實(shí)例或一個(gè)分支走向結(jié)束,在一個(gè)流程圖里可以存在多個(gè)結(jié)束事件節(jié)點(diǎn);結(jié)束事件不會(huì)影響其他并行路徑的執(zhí)行,只是結(jié)束它所在的特定路徑。
-
終止事件
終止事件是 BPMN 2.0 引入的一種特殊類型的結(jié)束事件。它會(huì)導(dǎo)致整個(gè)流程(包括所有并行路徑)立即終止。
-
流程立即終止:終止事件會(huì)導(dǎo)致整個(gè)流程立即終止,無(wú)論是否有其他并行路徑正在執(zhí)行。
-
單一實(shí)例:一個(gè)流程中只能有一個(gè)終止事件。如果有多個(gè)終止事件,流程引擎將不知道該執(zhí)行哪個(gè)。
-
影響所有路徑:終止事件會(huì)影響整個(gè)流程的所有并行路徑,不僅僅是一個(gè)分支。
-
計(jì)時(shí)器事件
計(jì)時(shí)器事件可以用作啟動(dòng)事件、中間事件或邊界事件。邊界事件可以中斷,也可以不中斷。
下圖里的是邊界中斷事件,表示的是10秒后還在該節(jié)點(diǎn)則判定超時(shí),會(huì)中斷流程走向下面的路線
-
錯(cuò)誤事件
錯(cuò)誤事件分為 錯(cuò)誤啟動(dòng)事件 和 錯(cuò)誤邊界事件
-
錯(cuò)誤啟動(dòng)事件
如下圖,錯(cuò)誤結(jié)束節(jié)點(diǎn)后會(huì)觸發(fā)下面的事件子流程,由事件子流程中的錯(cuò)誤啟動(dòng)事件進(jìn)行處理
只能用于觸發(fā)事件子流程,而不能用于啟動(dòng)流程實(shí)例。錯(cuò)誤啟動(dòng)事件始終處于中斷狀態(tài)
-
注意選擇相同的錯(cuò)誤定義,這樣才能被捕獲
-
錯(cuò)誤邊界事件
邊界事件可以捕獲中間錯(cuò)誤,中斷流程并重新控制流程走向,如下圖所示,由于系統(tǒng)任務(wù)執(zhí)行主動(dòng)拋出了BpmnError異常,然后就被錯(cuò)誤邊界事件捕獲處理了。
2.任務(wù)(Task)
任務(wù)表示流程中的工作單位,需要人工或系統(tǒng)執(zhí)行特定的動(dòng)作。
-
系統(tǒng)任務(wù)
即不需要人工處理,而是由系統(tǒng)自動(dòng)處理的任務(wù)。通常調(diào)用外部服務(wù)或腳本??梢耘渲?Java 類、表達(dá)式或外部任務(wù)來(lái)實(shí)現(xiàn)任務(wù)邏輯。
由于項(xiàng)目中我用到系統(tǒng)任務(wù)的不多,這里只展示配置java類的方式。
如下圖,type選擇java class,然后配置java類的全路徑
java類如下,實(shí)現(xiàn)JavaDelegate接口
execution對(duì)象里可以獲取到流程實(shí)例的各種信息,也可以對(duì)流程實(shí)例進(jìn)行操作,如下面的設(shè)置流程變量等
public class TestCalculateErrorDelegate implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) throws Exception {Integer numerator = 0;Integer denominator = 0;try {int result = numerator / denominator;execution.setVariable("result", result);} catch (Exception e) {execution.setVariable("calculateErrorCode", "4098");execution.setVariable("calculateErrorMsg", "除數(shù)不能為0");throw new BpmnError("4098", "除數(shù)不能為0");}}
}
-
用戶任務(wù)
用戶任務(wù)即需要人工參與者完成的任務(wù)。當(dāng)流程執(zhí)行到用戶任務(wù)節(jié)點(diǎn)時(shí),將會(huì)給這個(gè)節(jié)點(diǎn)分配的用戶創(chuàng)建待辦任務(wù)。
如下圖所示,分配該用戶任務(wù)節(jié)點(diǎn)給了admin
這里的assignee在真實(shí)業(yè)務(wù)場(chǎng)景中,一般會(huì)設(shè)置成流程變量,進(jìn)行動(dòng)態(tài)的賦值,如下圖
${assignee}代表這里取值是取流程實(shí)例中的assignee變量,這樣就可以結(jié)合具體業(yè)務(wù)動(dòng)態(tài)地給這個(gè)地方賦值了
多實(shí)例用戶任務(wù)
一個(gè)用戶任務(wù)節(jié)點(diǎn)也可以是多個(gè)參與者,同時(shí)又分為 并行 和 串行 2種類型
如下圖,通過(guò)點(diǎn)擊修改屬性按鈕,可以看到右上角有兩個(gè)類型選項(xiàng),第一個(gè)是并行,第二個(gè)串行
-
并行
并行又分為或簽(一個(gè)人通過(guò)即通過(guò))、比例簽(通過(guò)人數(shù)達(dá)到總?cè)藬?shù)XX比例即通過(guò))還有會(huì)簽(需要全部人都通過(guò)才通過(guò))
如下圖是或簽,配置與單實(shí)例任務(wù)有所不同
第一行是固定寫法,同理的還有:
//比例簽,需要滿足0.3比例通過(guò) ${nrOfCompletedInstances/nrOfInstances > 0.3 } //會(huì)簽,需要全部通過(guò) ${nrOfCompletedInstances == nrOfInstances}
-
串行
串行即多個(gè)人依次審批,待辦任務(wù)也是只有當(dāng)?shù)阶约簩徟臅r(shí)候才會(huì)創(chuàng)建。配置邏輯和并行的基本同理。
3.網(wǎng)關(guān)(Gateway)
在流程中,需要根據(jù)條件分叉或合并路線的時(shí)候,就需要用到網(wǎng)關(guān)。
-
排他網(wǎng)關(guān)
會(huì)依次判斷所有的路徑,然后走符合條件的第一條路徑
如下圖所示
-
并行網(wǎng)關(guān)
允許同時(shí)走多個(gè)分叉路徑,都走完后合并后再走后面的節(jié)點(diǎn)
并行網(wǎng)關(guān)是沒(méi)有條件限制的
如下圖所示
-
包含網(wǎng)關(guān)
與并行網(wǎng)關(guān)類似,區(qū)別在于可以設(shè)置條件限制,滿足條件的路徑就會(huì)走
如下圖所示的請(qǐng)假流程,當(dāng)請(qǐng)假天數(shù)大于3天,既會(huì)走經(jīng)理審批,同時(shí)也會(huì)走老板審批,兩個(gè)都審批好后再匯集走下個(gè)節(jié)點(diǎn)
二、流程設(shè)計(jì)器使用
這里我們以camunda7.19為例,講解流程設(shè)計(jì)器的基本使用
1.新建模型
如下圖所示,新建的時(shí)候選擇camunda 7版本,并且左下角再選擇小版本號(hào)為7.19
2.命名流程圖
創(chuàng)建新文件后,默認(rèn)會(huì)有一個(gè)開始節(jié)點(diǎn),然后我們需要先點(diǎn)擊下空白處,然后在右邊的窗口里輸入流程的名字和流程的ID(流程定義key)
Name可以在后面作為流程名稱(流程類型)來(lái)使用,而流程定義key(表里是PROC_DEF_KEY_ ) 則是該流程圖的唯一標(biāo)識(shí)
區(qū)別于流程定義id,即表里的PROC_INST_ID_, 每次修改了圖重新部署都會(huì)變,對(duì)應(yīng)的是這個(gè)圖的某個(gè)版本;流程定義key則圖修改重新部署后不會(huì)變
3.拖拽控件畫圖
從左邊的控件欄選擇后拖拽到畫板即可,這里常用的控件上面已經(jīng)介紹過(guò)。
4.監(jiān)聽器配置
在流程中,我們經(jīng)常要在節(jié)點(diǎn)前或節(jié)點(diǎn)后去做一些操作,這時(shí)候我們就可以使用監(jiān)聽器來(lái)實(shí)現(xiàn)。
執(zhí)行監(jiān)聽器 ExecutionListener觸發(fā)事件有:start、end、take;
其中節(jié)點(diǎn)有start、end兩種事件,而連線則有take事件。
任務(wù)監(jiān)聽器TaskListener觸發(fā)事件有:create, assignment, update, complete, delete or timeout。
-
執(zhí)行監(jiān)聽器 ExecutionListener
如下圖,就是在開始節(jié)點(diǎn)配置了執(zhí)行監(jiān)聽器,start時(shí)觸發(fā)
監(jiān)聽器類型是java類,即會(huì)執(zhí)行下面的java方法
這里的java類實(shí)現(xiàn)ExecutionListener接口,如下所示
public class ProcessStartExecutionListener implements ExecutionListener {@Overridepublic void notify(DelegateExecution execution) throws Exception {//初始化狀態(tài)為審批中execution.setVariable("approveState", 0);log.info("初始化狀態(tài)為審批中---------------approveState=0");}}
監(jiān)聽器除了用java類,常用的還有腳本片段,如下圖所示
注意:
腳本使用的是groovy語(yǔ)言,需要先在springboot項(xiàng)目中引入groovy依賴,否則會(huì)報(bào)錯(cuò)找不到引擎
<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-jsr223</artifactId><version>3.0.15</version><scope>runtime</scope>
</dependency>
-
任務(wù)監(jiān)聽器 TaskListener
如下圖,任務(wù)節(jié)點(diǎn)create的時(shí)候,會(huì)執(zhí)行監(jiān)聽器邏輯,同樣可以配置java類或腳本片段
java類參考下面,實(shí)現(xiàn)TaskListener接口
public class ProcessReturnTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {// 設(shè)置變量variable1值為1delegateTask.setVariable("variable1", 1);log.info("流程退回變量初始化值為1成功, taskId:{}, variableName:{}", delegateTask.getId(), variableName);}}
}
-
監(jiān)聽器執(zhí)行順序
下圖為例
執(zhí)行順序:1. 開始節(jié)點(diǎn):start -》 end2. 連線:take3. 任務(wù)節(jié)點(diǎn)ExecutionListener: start4. 任務(wù)節(jié)點(diǎn)TaskListener:create -》 assignment -》 complete5. 任務(wù)節(jié)點(diǎn)ExecutionListener: end6. 連線:take7. 結(jié)束節(jié)點(diǎn):start - 》 end
5.網(wǎng)關(guān)配置
當(dāng)我們的業(yè)務(wù)需要根據(jù)條件來(lái)判斷不同走向的時(shí)候,就需要配置網(wǎng)關(guān)
如下圖,實(shí)現(xiàn)的是流程變量t0等于1則走向admin審批,t0等于0時(shí)則直接走向結(jié)束
需要在網(wǎng)關(guān)后的兩條連線配置條件,如下
也可以使用groovy腳本,如下
6.子流程
有的時(shí)候某個(gè)節(jié)點(diǎn)需要走一套流程來(lái)實(shí)現(xiàn)業(yè)務(wù),例如某個(gè)多實(shí)例并行節(jié)點(diǎn),在節(jié)點(diǎn)中有需要有自己的審批、退回等操作,這個(gè)時(shí)候就可以用到子流程來(lái)實(shí)現(xiàn)。子流程又分為 內(nèi)部子流程和外部子流程(活動(dòng)調(diào)用)
1.內(nèi)部子流程
如下圖所示
要注意的是,圖里子流程的t1變量是針對(duì)整個(gè)(父)流程的,也就是如果其中一個(gè)子流程賦值了t1變量,其他子流程里的t1變量也會(huì)受影響,在真實(shí)業(yè)務(wù)中需要注意這點(diǎn)。
2.外部子流程(活動(dòng)調(diào)用)
如下圖所示
外部子流程即觸發(fā)另一個(gè)流程圖的流程,在數(shù)據(jù)表里也是會(huì)新增另一個(gè)流程定義key的數(shù)據(jù)(內(nèi)部子流程不會(huì),還是只是父流程定義key的數(shù)據(jù))
下圖右邊欄里的called element配置的就是子流程圖的定義key
父流程
子流程
采用外部子流程,則子流程里的變量是針對(duì)子流程實(shí)例的,所以不同子流程的變量不會(huì)互相影響
三、實(shí)戰(zhàn)演示
關(guān)于流程圖的示例,可以學(xué)習(xí):
snail-camunda: Camunda二次封裝以及相關(guān)功能使用介紹。 中國(guó)式工作流解決方案。