代碼地址:https://gitee.com/zhangxin123150/activiti-demo
BPM(business process management),業(yè)務(wù)流程管理
BPMN(business process model and notation),業(yè)務(wù)流程模型和符號
1.?使用步驟
l?部署activiti:activiti就是一堆jar包岁歉,因此需要和業(yè)務(wù)系統(tǒng)一起部署
l?定義流程:使用activiti的建模工具定義業(yè)務(wù)流程.bpmn文件
l?部署流程定義:使用activiti提供的api把流程定義內(nèi)容存儲起來氨鹏,再activiti執(zhí)行過程匯總可以查看定義的內(nèi)容针余。Activiti是通過數(shù)據(jù)庫來存儲業(yè)務(wù)流程的票唆。
l?啟動流程實例:流程實例也叫processInstance希太,啟動一個流程實例表示開始一次業(yè)務(wù)流程的運作。
l?用戶查詢待辦任務(wù)(task):因為現(xiàn)在系統(tǒng)的業(yè)務(wù)流程都交給了activiti管理,通過activiti就可以查詢當(dāng)前流程執(zhí)行到哪個步驟了。當(dāng)前用戶需要辦理哪些業(yè)務(wù)同樣由activiti管理盖矫,不需要編寫sql進行查詢了丽惭。
l?用戶辦理任務(wù):用戶查詢到自己的待辦任務(wù)后,就可以辦理某個業(yè)務(wù)辈双,如果這個業(yè)務(wù)辦理完成還需要其他用戶辦理责掏,就可以由activiti幫我們把工作流程往后的步驟推動。
l?流程結(jié)束:當(dāng)業(yè)務(wù)辦理完成沒有下一個任務(wù)節(jié)點后湃望,這個流程實例就執(zhí)行完成了拷橘。
2.?環(huán)境搭建
Idea中安裝流程定義插件actiBPM。
3.?創(chuàng)建流程定義
1)在resource目錄下創(chuàng)建***.bpmn文件
2)構(gòu)建流程圖:注意整個流程定義的id和name喜爷,以及每個節(jié)點對象的name和assignee
3)復(fù)制***.bpmn文件,加后綴.xml萄唇,用idea的Diagrams打開檩帐,可以導(dǎo)出流程定義的png文件
4)部署流程
4.?Test
5.?流程定義與流程實例
流程定義ProcessDefinition和流程實例ProcessInstance是activiti中非常重要的兩個概念。他們的關(guān)系類似于java中類和對象的概念另萤。
流程定義是以BPMN文件定義的一個工作流程湃密,是一組工作規(guī)范。例如之前請假流程
流程實例是指一個具體的業(yè)務(wù)流程四敞。例如某個員工發(fā)起一次請假泛源,就會實例化一個請假的流程實例,并且每個不同的流程實例之間互不影響忿危。
在后臺的表結(jié)構(gòu)中达箍,有很多表都包含了流程定義和流程實例的字段。
流程定義字段通常是PROC_DEF_ID铺厨,流程實例字段通常是PROC_INST_ID缎玫。
啟動流程實例,添加businessKey
當(dāng)我們?nèi)ゲ榭磗tartProcessInstanceByKey這個方法時解滓,有好多重載的實現(xiàn)方法赃磨,可以傳一些不同的參數(shù)。
l?String processDefinitionKey:流程定義的唯一鍵洼裤,不能為空
l?String businessKey:每個流程實例上下文中關(guān)聯(lián)的唯一鍵
這是activiti提供的一個非常重要的便利邻辉,用來將activiti的工作流程與實際業(yè)務(wù)進行關(guān)聯(lián)。
例如腮鞍,當(dāng)我們需要對一個業(yè)務(wù)訂單進行審批時值骇,訂單的詳細信息并不在activiti的數(shù)據(jù)當(dāng)中,但是在審批時確實需要查看這些信息移国。
l?Map<String,Object> variables:在流程實例中傳遞的流程變量
l?String tenantId:租戶id,支持多租戶設(shè)計
6.?流程掛起與激活
有時候我們要暫停一個流程雷客,過一段時間恢復(fù)。例如月底不接受報銷審批流程桥狡,年底不接受接待審批流程搅裙,非工作日不接收售后報銷流程等皱卓,這個時候,就可以將流程進行掛起操作部逮,掛起的流程不會再繼續(xù)執(zhí)行娜汁。
掛起時有兩種操作方式
l?將整個流程定義掛起,這樣這個流程定義下所有的流程實例都掛起兄朋,無法進行執(zhí)行
l?掛起當(dāng)前實例掐禁,該實例不允許操作
7.?流程變量
流程變量也是activiti中非常重要的角色。我們之前的請假流程并沒有利用到流程變量颅和,每個步驟都是非常固定的傅事,但是,當(dāng)我們需要實現(xiàn)一些負責(zé)的業(yè)務(wù)流程峡扩,比如請假3天以內(nèi)部門經(jīng)理審批蹭越,3天以上需要增加總經(jīng)理審批這樣的流程,就需要到流程變量了教届。
l?流程變量的作用域
1.?global變量
這個是流程變量默認的作用域响鹃,作用范圍是一個完整的流程實例。
變量名不可重復(fù)案训,重復(fù)會被覆蓋
2.?local變量
Local變量的作用域只針對一個任務(wù)或者一個執(zhí)行實例的范圍买置。
變量名可以重復(fù),互不影響
l?使用流程變量
定義好流程變量后强霎,就可以在整個流程定義中使用了忿项。例如可以在某些任務(wù)屬性assignee上使用${assignee},或者在某些連線上使用${evection.num<3}城舞。
Activiti中可以使用UEL表達式來使用這些流程變量倦卖。UEL表達式可以直接獲取一個變量的值,也可以計算一個boolean結(jié)果的表達式椿争,還可以直接使用某些對象的屬性怕膛。例如之前創(chuàng)建的請假流程,如果要實現(xiàn)3天以內(nèi)部門經(jīng)理審批秦踪,3天以上增加總經(jīng)理審核褐捻,可以做如下調(diào)整:
注意事項:
1)如果UEL表達式中流程變量名不存在則報錯
2)如果UEL表達式中流程變量值為null,流程不按UEL表達式執(zhí)行椅邓,而是結(jié)束
3)如果UEL表達式都不符合條件柠逞,流程結(jié)束
4)如果連線不設(shè)置條件,會走flow序號小的那條線
5)設(shè)置流程變量會在當(dāng)前執(zhí)行流程變量表act_ru_variable中插入記錄景馁,同時也會在歷史流程變量表act_hi_varinst中插入記錄
l?
8.?網(wǎng)關(guān)
1)?排他網(wǎng)關(guān)(ExclusiveGateway)
排他網(wǎng)關(guān)板壮,用來在流程中實現(xiàn)決策。當(dāng)流程執(zhí)行到這個網(wǎng)關(guān)合住,所有分支都會判斷條件是否為true绰精,如果為true則執(zhí)行該分支撒璧。
如果網(wǎng)關(guān)有兩個分支條件為true,排他網(wǎng)關(guān)會選擇id值較小的一條分支執(zhí)行笨使。
注意:線條上也可以根據(jù)條件來實現(xiàn)流程分支選擇卿樱,與網(wǎng)關(guān)不同的地方在于,線條上的條件不滿足的話硫椰,流程結(jié)束繁调;排它網(wǎng)關(guān)的話會拋出系統(tǒng)異常。
2)?并行網(wǎng)關(guān)(ParallelGateway)
并行網(wǎng)關(guān)允許將流程分成多條分支靶草,也可以把多條分支匯聚到一起蹄胰,并行網(wǎng)關(guān)的功能是基于進入和外出順序流的。
Fork分支:并行后的所有外出順序流奕翔,為每個順序流都創(chuàng)建一個并發(fā)分支
Join匯聚:所有到達并行網(wǎng)關(guān)裕寨,在此等待的進入分支,直到所有進入順序流的分支都到達以后糠悯,流程就會通過匯聚網(wǎng)關(guān)
與其他網(wǎng)關(guān)的主要區(qū)別,并行網(wǎng)關(guān)不會解析條件妻往,即使順序流中定義了條件互艾,也會忽略
3)?包含網(wǎng)關(guān)
包含網(wǎng)關(guān)可以看作是排他網(wǎng)關(guān)和并行網(wǎng)關(guān)的結(jié)合體
和排他網(wǎng)關(guān)一樣,你可以在外出順序流上定義條件讯泣,包含網(wǎng)關(guān)會解析他們纫普。但是主要的區(qū)別是包含網(wǎng)關(guān)可以選擇多于一條順序流,和并行網(wǎng)關(guān)一樣
包含網(wǎng)關(guān)的功能是基于進入和外出順序流的
Fork分支:所有外出順序流的條件都會被解析好渠,結(jié)果為true的順序流會以并行方式繼續(xù)執(zhí)行昨稼,為每個順序流創(chuàng)建一個分支
Join匯聚:所有并行分支到達包含網(wǎng)關(guān),會進入等待狀態(tài)拳锚,直到每個包含流程token的進入順序流的分支都到達假栓。這是與并行網(wǎng)關(guān)的最大不同。換句話說霍掺,包含網(wǎng)關(guān)只會等待被選中執(zhí)行了的進入順序流匾荆,匯聚之后繼續(xù)執(zhí)行
4)?事件網(wǎng)關(guān)
事件網(wǎng)關(guān)允許根據(jù)事件判斷流向。網(wǎng)關(guān)的每個外出順序流都要連接到一個中間捕獲事件杆烁。當(dāng)流程到達一個基于事件網(wǎng)關(guān)牙丽,網(wǎng)關(guān)會進入等待狀態(tài):會暫停執(zhí)行。與此同時兔魂,會為每個外出順序流創(chuàng)建相對的事件訂閱烤芦。
事件網(wǎng)關(guān)的外出順序流和普通順序流不同,這些順序流不會真的“執(zhí)行”析校,相反他們讓流程引擎去決定執(zhí)行到事件網(wǎng)關(guān)的流程需要訂閱哪些事件构罗。要考慮以下條件:
1)事件網(wǎng)關(guān)必須有兩條或以上外出順序流
2)事件網(wǎng)關(guān)后铜涉,只能使用intermediateCarchEvent類型(activiti不支持基于事件網(wǎng)關(guān)后連接ReceiveTask)
3)連接到事件網(wǎng)關(guān)的中間捕獲事件必須只有一個入口順序流
9.?組任務(wù)分配
設(shè)置多個候選人
之前我們通過設(shè)置assignee來靈活的設(shè)定負責(zé)人。但是日常工作中绰播,還有一類常見的需求無法支持骄噪,例如某個訂單合同,需要找部門經(jīng)理級別的負責(zé)人簽字蠢箩。而公司中有多個部門經(jīng)理链蕊,業(yè)務(wù)上只需要找其中任意一個人完成審批就可以了。這種場景下谬泌,我們就無法通過設(shè)置流程變量的方式來設(shè)置負責(zé)人滔韵。這時,就需要用到activiti提供的另一個利器-任務(wù)候選人(Candidate Users)掌实。
這時陪蜻,可以給任務(wù)設(shè)置多個候選人candidate-users,多個候選人之間用逗號隔開贱鼻。