為什么使用activiti
狀態(tài)-------------------------------------------------->引擎engin(業(yè)務(wù)變動(dòng)不影響程序的進(jìn)行)
每個(gè)人只能看到個(gè)人負(fù)責(zé)的,流程變更困難 bpmn建模語(yǔ)言
activiti流程步驟
步驟:
1、部署流程
2、定義流程
3、部署流程定義:使用activiti中的API把流程定義存儲(chǔ),在Acitivti執(zhí)行過(guò)程匯總可以查詢定義的內(nèi)容,通過(guò)數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)業(yè)務(wù)流程
4、啟動(dòng)流程實(shí)例:ProcessInstance,啟動(dòng)流程實(shí)例代表開(kāi)始一次業(yè)務(wù)流程的運(yùn)作?!咎峤荒硞€(gè)申請(qǐng)后-開(kāi)啟流程-推動(dòng)審批進(jìn)行】
5、用戶查詢待辦任務(wù)(task):系統(tǒng)業(yè)務(wù)已經(jīng)交給了activiti管理,通過(guò)activiti就可以查詢當(dāng)前流程執(zhí)行到哪個(gè)步驟,
6、用戶辦理任務(wù):用戶查到待辦任務(wù)后,辦理某個(gè)業(yè)務(wù)【如果業(yè)務(wù)辦理還需要其他用戶辦理,就可以由activiti幫我們把工作流程往后面推動(dòng)】
7、流程結(jié)束:任務(wù)辦理沒(méi)有下一個(gè)任務(wù)節(jié)點(diǎn)后,流程實(shí)例就執(zhí)行完成了。
表結(jié)構(gòu)分四種:
表結(jié)構(gòu):
re:流程定義,流程靜態(tài)資源
ru:runtime任務(wù)
hi:歷史信息
ge:通用屬性
//示例:
SELECT * FROM act_re_deployment #流程定義部署表,記錄流程部署信息
SELECT * FROM act_re_procdef #流程定義表,記錄流程定義信息
SELECT * FROM act_ge_bytearray #資源表 (文件存儲(chǔ)地方)
四個(gè)重要的服務(wù)類
ProcessEngine:HistoryService,RepostoryService,RuntimeService,TaskService,ManagementService(開(kāi)發(fā)維護(hù)使用)
bpmn設(shè)計(jì):id(定義的文件后綴前的東西) name assignee(審批人) 流程設(shè)計(jì) id name
bpmn文件:definnitions配置—>process(多個(gè)也可,正常一個(gè))定義的工作流程---->bpmndi畫(huà)布圖形
圖png
流程定義:ProcessDefinition是BPMN文件定義的一個(gè)具體的業(yè)務(wù)流程,
流程實(shí)例:ProcessInstance則是指一個(gè)具體的業(yè)務(wù)流程
某人發(fā)起什么就會(huì)實(shí)例化什么 不同流程實(shí)例之間按時(shí)互相不影響的 【定義部署后就形成了流程實(shí)例,數(shù)據(jù)庫(kù)就存在了】
BusinessKey
BusinessKey:在ru_execution表中----------> 【綁定業(yè)務(wù)ID】
流程發(fā)起后,審批人在此之前要知道相關(guān)審批單信息【請(qǐng)假時(shí)間、請(qǐng)假理由】是如何綁定到流程中呢?
掛起
掛起:就是說(shuō)每月最后一天不處理出差申請(qǐng),這個(gè)流程暫停至此
流程定義掛起,該流程下就不能啟動(dòng)新的流程定義
如果是激活狀態(tài),改為掛起狀態(tài)。參數(shù)一:流程定義id 參數(shù)2:是否暫停 參數(shù)3:暫停的時(shí)間
repositoryService.suspendProcessDefinitionById( , , );
流程實(shí)例掛起,則此流程不再執(zhí)行,如果進(jìn)行完成操作將報(bào)錯(cuò)
runtimeService.suspendProcessInstanceById( instanceId );
概念:
之前我們已經(jīng)測(cè)試了如何刪除一個(gè)流程,有很多時(shí)候,我們只是需要暫時(shí)停止一個(gè)流程,過(guò)一段時(shí)間就要恢復(fù)。
例如月底不接受報(bào)銷審批流程,年底不接受借貸審批流程,或者非工作日不接受售后報(bào)銷流程等,這個(gè)時(shí)候,就可以將流程進(jìn)行掛起操作。
掛起后的流程就不會(huì)再繼續(xù)執(zhí)行。
掛起任務(wù)?不可以
流程變量:
之前定義的請(qǐng)假流程并沒(méi)有用到流程變量,每個(gè)步驟都是非常固定的,但是當(dāng)我們需要實(shí)現(xiàn)一些復(fù)雜的業(yè)務(wù)流程,
比如請(qǐng)假3天以內(nèi)由部門經(jīng)理審批,3天以上需要增加總經(jīng)理審批這樣的流程時(shí),就需要用到流程變量
注意:
【和之前介紹的業(yè)務(wù)關(guān)鍵字有些相似,都可以攜帶業(yè)務(wù)信息,并且可以通過(guò)activiti的api查詢出來(lái)。但在使用中應(yīng)減少流程變量中的業(yè)務(wù)信息】
流程變量的類型是Map<String,Object>。
所以,流程變量比業(yè)務(wù)關(guān)鍵字要強(qiáng)大很多。變量值不僅僅是字符串,也可以是POJO對(duì)象。
但是當(dāng)需要將一個(gè)POJO對(duì)象放入流程變量時(shí),要注意這個(gè)對(duì)象必須要實(shí)現(xiàn)序列化接口serializable
Map<String,Object> variables = new HashMap<>();
流程變量作用域:Global和Local兩種 使用:${ 流程變量 } ${ 流程變量<3 }
-
Global變量:
這個(gè)是流程變量的默認(rèn)作用域,表示是一個(gè)完整的流程實(shí)例。(定義一個(gè)變量,在這整個(gè)流程中會(huì)傳遞下去)
Global變量中變量名不能重復(fù),如果設(shè)置了相同的變量名,后面設(shè)置的值會(huì)直接覆蓋前面設(shè)置的變量值。- 啟動(dòng)流程時(shí)設(shè)置變量
在啟動(dòng)流程實(shí)例時(shí)設(shè)置流程變量,這時(shí)流程變量的作用域是整個(gè)流程實(shí)例。相當(dāng)于是Global作用域。核心代碼:
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map); - 任務(wù)辦理時(shí)設(shè)置變量
在完成任務(wù)時(shí)設(shè)置流程變量,該流程變量只有在該任務(wù)完成后其它結(jié)點(diǎn)才可使用該變量,
它的作用域是整個(gè)流程實(shí)例,如果設(shè)置的流程變量的key在流程實(shí)例中已存在相同的名字則后設(shè)置的變量替換前邊設(shè)置的變量。
核心代碼:taskService.complete(task.getId(), map); 任務(wù)完成交給的下一個(gè)人
注意:這種方式設(shè)置流程變量,如果當(dāng)前執(zhí)行的任務(wù)ID不存在,則會(huì)拋出異常,流程變量也會(huì)設(shè)置失敗。 - 通過(guò)當(dāng)前流程實(shí)例 設(shè)置………………
- 啟動(dòng)流程時(shí)設(shè)置變量
-
Local變量:
Local變量的作用域只針對(duì)一個(gè)任務(wù)或一個(gè)執(zhí)行實(shí)例的范圍,沒(méi)有流程實(shí)例大。
Local變量由于作用在不同的任務(wù)或不同的執(zhí)行實(shí)例中,所以不同變量的作用域是互不影響的,變量名可以相同。
Local變量名也可以和Global變量名相同,不會(huì)有影響。………………
網(wǎng)關(guān):精細(xì)控制流程走向
線條聯(lián)系已將無(wú)法支持,復(fù)雜流程需要用網(wǎng)關(guān)【排他網(wǎng)關(guān),并行網(wǎng)關(guān),包含網(wǎng)關(guān),事務(wù)網(wǎng)關(guān)】
-
ExlusiveGateway排他網(wǎng)關(guān):決定接下來(lái)走哪一條線,如果從網(wǎng)關(guān)出去的線所有條件都不滿足系統(tǒng)則拋出異常。
所有條件滿足的話,會(huì)選擇“id”小的那一條去走 -
ParallelGateway并行網(wǎng)關(guān):允許將流程分成多條分支,也可以把分支匯聚到一起,并行網(wǎng)關(guān)的功能是基于進(jìn)入和外出順序流的。
fork分支:并行后的所有外出順序流,為每個(gè)順序流都創(chuàng)建一個(gè)并發(fā)分支
join匯聚:所有到達(dá)并行網(wǎng)關(guān),在此等待的進(jìn)入分支,直到所有進(jìn)入順序流的分支都到達(dá)以后,流程就會(huì)通過(guò)匯聚網(wǎng)關(guān)。
注意:每一條分支都會(huì)走,條件會(huì)被忽略,技術(shù)經(jīng)理和財(cái)務(wù)經(jīng)理都會(huì)執(zhí)行,會(huì)匯聚,才會(huì)完成后續(xù)的流程 -
InclusiveGateway包含網(wǎng)關(guān):可以看作是排他和并行的結(jié)合體
-
事務(wù)網(wǎng)關(guān):不常用
組任務(wù)分配:
- 多個(gè)經(jīng)理找哪個(gè)經(jīng)理批(在候選人中任選一個(gè))
taskService.claim(taskId, candidateUser_定 義任務(wù)領(lǐng)取人) //拾取任務(wù) - 退還任務(wù):把負(fù)責(zé)人設(shè)置為null
taskService.setAssigine(taskId,null)
抄送:
抄送:抄送是指將你的審批抄送給【需要了解審批內(nèi)容但不具備決定權(quán)】的人。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-588067.html
activiti工作流獲取流程定義中所有的節(jié)點(diǎn):
將xml定義文件解析成BpmnModel對(duì)象,使用BpmnModel的 getMainProcess()獲取一個(gè)Process對(duì)象,
該對(duì)象實(shí)際是一個(gè)繼承自BaseElement、FlowElementContainer的節(jié)點(diǎn)容器,通過(guò) getFlowElements()獲取當(dāng)前流程定義文件中所有的節(jié)點(diǎn)對(duì)象文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-588067.html
到了這里,關(guān)于【activiti】工作流入門基礎(chǔ)概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!