從0到1構(gòu)建工作流引擎(一)

8 評論 7361 瀏覽 76 收藏 13 分鐘

一個完整的工作流引擎,應(yīng)該具備哪些功能模塊?這篇文章里,作者嘗試結(jié)合實(shí)際工作經(jīng)驗(yàn)和實(shí)際案例,對構(gòu)建工作流引擎這件事兒進(jìn)行了總結(jié),并對工作流引擎的功能模塊進(jìn)行了大概講述,一起來看。

最近我做了工作流引擎系統(tǒng),借鑒了市面上的一些成熟工作流引擎,將其做了一些簡化以更適用于實(shí)際情況,同時在復(fù)盤的時候發(fā)現(xiàn)當(dāng)初踩了一些坑。所以希望以文章的形式寫出來構(gòu)建一個完整的工作流引擎應(yīng)該有哪些功能模塊,哪些功能邏輯,可以抽象哪些業(yè)務(wù)邏輯,有哪些思考的點(diǎn)。希望對需要的同學(xué)有所幫助,也和大家一起討論改進(jìn)。

文章分為兩篇,由4個板塊組成:

  1. 工作流引擎簡介;
  2. 從案例出發(fā)推演功能;
  3. 功能模塊概覽;
  4. 功能與邏輯詳解。

本文包括前三個板塊。

一、工作流引擎簡介

1. 工作流是什么?

為了完成某一項(xiàng)工作,而需要有多個環(huán)節(jié)、多個人員來分工、配合共同完成;而每個環(huán)節(jié)和每個人員的處理操作是有先后順序的,所以有流向性的特征,也就稱之為“工作流”。

常見的工作流簡單的有如請假流程、離職流程,較為復(fù)雜的有采購流程、立項(xiàng)流程等。

大家經(jīng)歷過就會知道一個工作流會有多個操作節(jié)點(diǎn),也就對應(yīng)多操作人員;比如請假需要部門領(lǐng)導(dǎo)通過、人事經(jīng)理通過等,比如采購需要領(lǐng)導(dǎo)驗(yàn)收合同、財(cái)務(wù)付款等(工作流和審批流的概念本文就不展開)。

2. 工作流引擎主要是用來做什么的?

工作流引擎是一個為實(shí)現(xiàn)工作流程的定制化,并驅(qū)動工作流程完整進(jìn)行的工具。其特點(diǎn)在于可以實(shí)現(xiàn)隨著公司實(shí)際業(yè)務(wù)的發(fā)展(如組織架構(gòu)的改動、業(yè)務(wù)邏輯的改動),而能快速做出靈活響應(yīng)更改工作流,減少重復(fù)性的開發(fā)成本。

  • 比如一開始公司只有10個工作流,隨著業(yè)務(wù)發(fā)展需要20個,多出來的這10個不用寫死在代碼里,直接可以在工作流引擎內(nèi)配置;
  • 比如公司有人事變動,需要更改某些工作的審批人,也可以直接配置;
  • 公司的業(yè)務(wù)發(fā)生了一些改變,原來的審批節(jié)點(diǎn)只有5個,現(xiàn)在要增加到10個,等等情況都可配置。

3. 工作流引擎的邊界是什么?

工作流引擎主要只配置工作流,所以需要與業(yè)務(wù)系統(tǒng)如ERP區(qū)隔開,并需與業(yè)務(wù)系統(tǒng)通過接口對接,以此業(yè)務(wù)系統(tǒng)方可發(fā)起流程、審批流程、完成流程。

也就是說工作流引擎和業(yè)務(wù)系統(tǒng)是相互獨(dú)立但又通過接口對接的兩個系統(tǒng),一個工作流引擎可以對接多個業(yè)務(wù)系統(tǒng),為其配置工作流。

所以操作邏輯應(yīng)該是:先在業(yè)務(wù)系統(tǒng)定義有哪些流程,然后在工作流引擎中配置具體流程,再在業(yè)務(wù)系統(tǒng)中發(fā)起/處理流程,并在工作流引擎中可以對已發(fā)起流程進(jìn)行管理;當(dāng)公司的各類業(yè)務(wù)系統(tǒng)較多時,不用每個業(yè)務(wù)系統(tǒng)都去開發(fā)自己的工作流管理模塊,這樣可以較大地也提高了開發(fā)和維護(hù)效率,減少了開發(fā)成本。

二、從案例出發(fā)推演功能

了解了工作流引擎是干嘛的,我們就可以來看看其應(yīng)該包含哪些內(nèi)容。但是如果我一來直接就從某個功能開始講,大家肯定是比較抽象的。

所以我們先從一個審批案例著手,從0開始為完成這個案例我們該配置哪些數(shù)據(jù)?這樣更有助于大家能先有一個全局的認(rèn)識,然后再來講一個個的功能,這樣大家可能更容易接受。

前提條件:

某公司有甲、乙、丙、丁4個部門:

  • 條件1:每個部門各有1個部門負(fù)責(zé)人a、b、c、d
  • 條件2:甲/乙部門的分管領(lǐng)導(dǎo)是e,丙/丁部門的分管領(lǐng)導(dǎo)是f
  • 條件3:東南區(qū)域的總監(jiān)是g,西南區(qū)域的總監(jiān)是h

假設(shè)成立項(xiàng)目也就是立項(xiàng)需要走流程,不同類型的項(xiàng)目走的流程肯定不一樣,假設(shè)關(guān)于項(xiàng)目的維度有項(xiàng)目等級(包括一級、二級),項(xiàng)目區(qū)域(包括東南,西南)。通過排列組合,我們可以得到以下4類項(xiàng)目:

  • 項(xiàng)目1:一級項(xiàng)目,東南
  • 項(xiàng)目2:二級項(xiàng)目,東南
  • 項(xiàng)目3:一級項(xiàng)目,西南
  • 項(xiàng)目4:二級項(xiàng)目,西南

有了前提條件,我們再分場景來看,不同部門的人員發(fā)起不同類型的項(xiàng)目,流程會怎樣走。

場景1

如果一級項(xiàng)目由分管領(lǐng)導(dǎo)審批,二級項(xiàng)目由部門負(fù)責(zé)人審批,不管哪個區(qū)域的項(xiàng)目都要由區(qū)域總監(jiān)審批。根據(jù)這個前提我們就可以得到下面這個流程圖:

先解釋一下流程的構(gòu)成元素,如上圖:

  • 有操作節(jié)點(diǎn),比如提交、分管領(lǐng)導(dǎo)、部門負(fù)責(zé)人;
  • 有網(wǎng)關(guān),如菱形帶×這個是互斥網(wǎng)關(guān);
  • 有流轉(zhuǎn)條件,如圖內(nèi)的一級項(xiàng)目、二級項(xiàng)目,流轉(zhuǎn)條件是和互斥網(wǎng)關(guān)是一起使用,通過流轉(zhuǎn)條件來判斷不同的工作流數(shù)據(jù)該流向哪個操作節(jié)點(diǎn)。

如果從0開始,這個時候系統(tǒng)里什么數(shù)據(jù)都沒有,那我們是不是要先錄入部門、人員等組織架構(gòu)信息?所以就會得到如下圖簡化的表單信息:

但是注意,這上圖只是組織架構(gòu)信息,并不是該人員在流程中的實(shí)際角色。

再回頭看一下流程圖,我們在流程中只會有部門負(fù)責(zé)人、分管領(lǐng)導(dǎo)、區(qū)域總監(jiān)這3個角色,并沒有指定這個3個角色具體是誰進(jìn)行審批?因?yàn)閍是部門負(fù)責(zé)人,b也是,g是區(qū)域總監(jiān),h也是。

所以這個時候我們需要引入用戶矩陣這個概念來解決這個問題,也就需要再錄入一個表單來記錄流程中的實(shí)際角色,如下圖:

先說為什么要這樣一張表來記錄這些信息?為什么不直接用組織架構(gòu)表?這樣做主要達(dá)到2個目的:

  1. 為了解決多個人員擔(dān)任同一角色,但又存在變量的情況(比如部門、區(qū)域不同),這樣在流程中只需要配置一個角色就行了,不用每個人員都配置一次(具體后面演示);比如同樣是部門負(fù)責(zé)人,a管理甲部門,b管理乙部門。
  2. 為了將組織結(jié)構(gòu)中的職位與流程中的角色進(jìn)行解耦;同時調(diào)整更靈活,比如在公司中叫部門負(fù)責(zé)人,在流程中可以叫部門老大,如圖3所示。

然后解釋一下為什么要條件變量和變量值?是因?yàn)椴煌捻?xiàng)目會流向不同的操作節(jié)點(diǎn),系統(tǒng)就需要通過條件變量來判斷,而哪種項(xiàng)目要走哪條流程,是由其變量值來確定的。

根據(jù)以上變量值,再結(jié)合之前的流程圖,我們就可以得到下圖:

有了流程的相關(guān)數(shù)據(jù),我們再來看流程會怎樣走。假設(shè)張三是丙部門的人員,他來走立項(xiàng)流程,不同的項(xiàng)目屬性會經(jīng)歷下列審批人:

流程的配置大概就是這些,但有1個思考的點(diǎn):如果沒有用戶矩陣這張表,我們的流程會配置成什么樣?

如圖所示,我們需要把每個參與到人員都配置到流程中去,也就是一個人員就要占一個審批節(jié)點(diǎn);并且只能通過流轉(zhuǎn)條件來控制該項(xiàng)目需要走到哪個審批節(jié)點(diǎn)。這樣流程將會非常龐大且臃腫。

場景2

基于場景1,我把這些元素打亂了再重新排一下來設(shè)定場景:如果甲/乙部門的項(xiàng)目由分管領(lǐng)導(dǎo)審批(e負(fù)責(zé)一級項(xiàng)目,f負(fù)責(zé)二級項(xiàng)目),丙/丁部門的項(xiàng)目由區(qū)域總監(jiān)審批(g負(fù)責(zé)東南,h負(fù)責(zé)西南),最后再統(tǒng)一由部門負(fù)責(zé)人審批。所以得到如下流程圖:

組織架構(gòu)的表單我們已經(jīng)有了,就不再贅述了。然后第二步我們需要往用戶矩陣表里添加信息:

第三步就能得到這個帶有用戶矩陣的流程圖:

所以可以得到以下結(jié)論:

  • 假設(shè)張三是丙部門員工,發(fā)起一個一級、東南區(qū)域項(xiàng)目立項(xiàng),會走g和c的審批;
  • 假設(shè)李四是甲部門員工,發(fā)起一個一級、東南區(qū)域項(xiàng)目立項(xiàng),會走e和a的審批。

為什么我會舉場景2這個例子?

通過場景1和場景2,大家可以看出條件變量有很多,包括人員所屬部門、項(xiàng)目所屬區(qū)域、項(xiàng)目等級,而對比這兩個場景大家可以發(fā)現(xiàn),這些條件變量都是可以放到操作節(jié)點(diǎn)或流轉(zhuǎn)條件里去配置的。

比如場景1中不同的項(xiàng)目等級走不同的順序流,場景2中的項(xiàng)目等級是放到操作節(jié)點(diǎn)里,不同的等級經(jīng)過不同的人審批,而這個審批的角色都叫分管領(lǐng)導(dǎo)。

三、功能模塊概覽

經(jīng)過上面的例子,我們知道了一個完整的流程應(yīng)該包含哪些元素:組織架構(gòu)、用戶矩陣、條件變量等,有了這些數(shù)據(jù)才能配置到流程內(nèi)。

所以我們就可以看到一個工作流引擎應(yīng)該由以下功能來組成:

下一篇接著講工作流引擎具體的功能與邏輯。

本文由 @橘鉆 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自 Unsplash,基于 CC0 協(xié)議

該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 天啊,分析得好好!感覺圖片已經(jīng)分析得很詳細(xì)了,好清晰的思路!太厲害啦!

    來自廣東 回復(fù)
  2. 請問市面上有哪些成熟的工作量引擎系統(tǒng)呢?

    來自廣東 回復(fù)
    1. 國產(chǎn)工作流: 開源的馳騁工作流引擎 ,.net,.netcore版本ccflow, java版本JFlow.
      國外的: flowable.

      來自山東 回復(fù)
  3. 好6?。。。?/p>

    來自上海 回復(fù)
  4. 后面有點(diǎn)看不懂了

    來自陜西 回復(fù)
    1. 你跟著把兩個流程圖照著畫一下就懂了,是有點(diǎn)繞

      來自重慶 回復(fù)
  5. 專業(yè)

    來自中國 回復(fù)
    1. 謝謝

      來自重慶 回復(fù)