flowable实战(九)flowable数据库表中流程实例、活动实例、任务实例三者之间关系分析
場景模擬(請假流程):
員工申請請假
部門領(lǐng)導(dǎo)審批
人事審批
員工銷假
本文用次例介紹在工作流中出現(xiàn)的幾個(gè)對象及其之間的關(guān)系,以及在Activiti中各個(gè)對象是如何關(guān)聯(lián)的。
在線演示實(shí)例:http://aws.kafeitu.me:8080/kft-activiti-demo
在開始之前先看看下圖,對整個(gè)對象結(jié)構(gòu)有個(gè)了解,再結(jié)合下面的詳細(xì)介紹理解。
圖1 Activiti中幾個(gè)對象之間的關(guān)系
1.ProcessInstance
員工開始申請請假流程,通過runtimeService.startProcessInstance()方法啟動,引擎會創(chuàng)建一個(gè)流程實(shí)例(ProcessInstance)。
簡單來說流程實(shí)例就是根據(jù)一次(一條)業(yè)務(wù)數(shù)據(jù)用流程驅(qū)動的入口,兩者之間是一對一的關(guān)系。
擎會創(chuàng)建一條數(shù)據(jù)到ACT_RU_EXECUTION表,同時(shí)也會根據(jù)history的級別決定是否查詢相同的歷史數(shù)據(jù)到ACT_HI_PROCINST表。
啟動完流程之后業(yè)務(wù)和流程已經(jīng)建立了關(guān)聯(lián)關(guān)系,第一步結(jié)束。
啟動流程和業(yè)務(wù)關(guān)聯(lián)區(qū)別:
對于自定義表單來說啟動的時(shí)候會傳入businessKey作為業(yè)務(wù)和流程的關(guān)聯(lián)屬性
對于動態(tài)表單來說不需要使用businessKey關(guān)聯(lián),因?yàn)樗械臄?shù)據(jù)都保存在引擎的表中
對于外部表單來說businessKey是可選的,但是一般不會為空,和自定義表單類似
關(guān)于各種表單之間的區(qū)別請參考:比較Activiti中三種不同的表單及其應(yīng)用
2.Execution
初學(xué)者最搞不懂的就是ProcessInstance與Execution之間的關(guān)系,要分兩種情況說明。
Execution的含義就是一個(gè)流程實(shí)例(ProcessInstance)具體要執(zhí)行的過程對象。
不過在說明之前先聲明兩者的對象映射關(guān)系:
ProcessInstance(1)—>Execution(N),其中N >= 1。
值相等的情況:
除了在流程中啟動的子流程之外,流程啟動之后在表ACT_RU_EXECUTION中的字段ID_和PROC_INST_ID_字段值是相同的。
圖2 ID_和PROC_INST_ID_相等
值不相等的情況:
不相等的情況目前只會出現(xiàn)在子流程中(包含:嵌套、引入),例如一個(gè)購物流程中除了下單、出庫節(jié)點(diǎn)之外可能還有一個(gè)付款子流程,在實(shí)際企業(yè)應(yīng)用中付款流程通常是作為公用的,所以使用子流程作為主流程(購物流程)的一部分。
當(dāng)任務(wù)到達(dá)子流程時(shí)引擎會自動創(chuàng)建一個(gè)付款流程,但是這個(gè)流程有一個(gè)特殊的地方,在數(shù)據(jù)庫可以直觀體現(xiàn),如下圖。
圖3 ID_和PROC_INST_ID_不相等
上圖中有兩條數(shù)據(jù),第二條數(shù)據(jù)(嵌入的子流程)的PARENT_ID_等于第一條數(shù)據(jù)的ID_和PROC_INST_ID_,并且兩條數(shù)據(jù)的PROC_INST_ID_相同。
上圖還有一點(diǎn)特殊的地方,字段IS_ACTIVE_的值一個(gè)是0一個(gè)是1,說明正在執(zhí)行子流程主流程掛起。
3.Task
剛剛說了ProcessInstance是和業(yè)務(wù)一對一關(guān)聯(lián)的,和業(yè)務(wù)數(shù)據(jù)最親密;Task是和用戶最親密的(UserTask),用戶每天的待辦事項(xiàng)就是一個(gè)個(gè)的Task對象。
從圖1中看得出Execution和Task是一對多關(guān)系,Task可以是任何類型的Task實(shí)現(xiàn),可以是用戶任務(wù)(UserTask)、Java服務(wù)(ServiceTask)等,在實(shí)際流程運(yùn)行中只不過面向?qū)ο蟛煌?#xff0c;用戶任務(wù)需要有人完成(complete),Java服務(wù)需要有系統(tǒng)自動執(zhí)行(execution)。
圖4 表ACT_RU_TASK
Task是在流程定義中看到的最大單位,每當(dāng)一個(gè)task完成的(complete)時(shí)候會引擎把當(dāng)前的任務(wù)移動到歷史中,然后插入下一個(gè)任務(wù)插入到ACT_RU_TASK中。
從圖4中可以看出
結(jié)合請假流程來說就是讓用戶點(diǎn)擊“完成”按鈕提交當(dāng)前任務(wù)是的動作,引擎自動根據(jù)任務(wù)的順序流或者排他分支判斷走向。
4.Activity
Activity——活動。
圖5 表ACT_HI_ACTINST
Activity包含了流程中所有的活動數(shù)據(jù),例如開始事件(圖5中的第1條)、各種分支(排他、并行等,圖5中的第2條數(shù)據(jù))、以及剛剛提到的Task執(zhí)行記錄(如圖5中的第3、4條數(shù)據(jù))。
有些人認(rèn)為Activity和Task是多對一關(guān)系,其實(shí)不是,從上圖中可以看出來根本沒有Task相關(guān)的字段。
結(jié)合請假流程來說如Task中提到的當(dāng)完成流程的時(shí)候所有下一步要執(zhí)行的任務(wù)(包括各種分支)都會創(chuàng)建一個(gè)Activity記錄到數(shù)據(jù)庫,例如領(lǐng)導(dǎo)審核節(jié)點(diǎn)點(diǎn)擊“同意”按鈕就會流轉(zhuǎn)到人事審批節(jié)點(diǎn),如果“駁回”那就流轉(zhuǎn)到調(diào)整請假內(nèi)容節(jié)點(diǎn),每一次操作的task背后實(shí)際記錄更詳細(xì)的活動。
總結(jié)
以上是生活随笔為你收集整理的flowable实战(九)flowable数据库表中流程实例、活动实例、任务实例三者之间关系分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zTree笔记,设置无法勾选父节点(禁用
- 下一篇: JFinalOA导出Excel