參考資料
1笆檀,工作流定義
2橄维,有限狀態(tài)機
思路
工作流實際上可以用數據結構中的圖表示尺铣,圖的邊代表從一個節(jié)點跳到另一個節(jié)點的動作,圖的結點代表一個流程的其中一個狀態(tài)争舞,整個圖的定義代表著一個工作流凛忿,因此,設計數據庫的時候兑障,只要能夠將圖表達出來侄非,簡單的工作流設計就很簡單了。
簡單實現
將會定義三張表流译,tb_node, tb_route, tb_history逞怨,其中tb_node是用來定義結點,tb_route用來定義邊福澡,tb_history用來記錄發(fā)生過的動作叠赦。
tb_node的表結構
node_id、node_name
tb_route的表結構
route_id革砸、route_name除秀、current_node_id、next_node_id
tb_history的表結構
history_id算利、route_id册踩、user_id、create_time效拭、update_time
其中tb_node用來定義結點暂吉,tb_route的current_node_id以及next_node_id代表有向圖邊的開始結點和結束結點
一張有向圖通過tb_node、以及tb_route定義完整缎患,例如我需要實現一個報修流程:未處理--》跟進中--》已完成--》已評價慕的,則可以定義ID分別為1到4的tb_node記錄,來表達未處理到已完成4個狀態(tài)挤渔。未處理到跟進中的操作則可以通過tb_route的一條記錄表達肮街,此時current_node_id是1,next_node_id是2判导,說明是從未處理結點到跟進中結點的一個操作嫉父。
tb_history用來記錄業(yè)務發(fā)生的時間、操作人骡楼、以及對應的動作熔号,可以實現對相關業(yè)務發(fā)生時間、操作進行跟蹤記錄鸟整。
應用
簡單工作流常常會應用到ERP系統中引镊,ERP系統中,涉及到很多流程,其中有部分流程不是固定不變的弟头,而是經常因為業(yè)務的變化而需要動態(tài)改變吩抓。假如有個業(yè)務流程原來本身是普通員工填表--》組長審核--》經理審核--》總經理審核,但是后面由于需要加快流程處理變成了普通員工填表--》經理審核赴恨,其他不必要的環(huán)節(jié)都去掉了疹娶,在這種情況下,如果系統在表達業(yè)務流程的代碼中是暴力寫死的伦连,很明顯雨饺,業(yè)務流程變了,你就需要修改你的代碼才能適應這種改變惑淳。但是如果通過工作流來實現原來的業(yè)務流程额港,那樣UI上顯示的業(yè)務流程實際上是遍歷出來的一個圖,而這個圖是可以通過修改邊以及節(jié)點來改變UI上的業(yè)務流程顯示歧焦,這樣就可以實現可配置的業(yè)務流程滿足不同情況下的應用移斩,減少了工作量,系統的應用面就更廣了绢馍。
擴展
1向瓷,其實工作流遠沒有以上講的僅僅幾張表那么簡單,一個完整的工作流還會涉及到自定義表單(實現每個節(jié)點前端應該提交的參數也可以自定義)的設計舰涌,權限的設計等等猖任,本文只是簡單的描述了一下工作流的作用,具體更加復雜的實現瓷耙,可以自行百度哈超升。
2, tb_node,tb_route還可以作為基類哺徊,增加實例表tb_node_instance,tb_route_instance,節(jié)點實例表用來保存節(jié)點執(zhí)行過程中的狀態(tài)乾闰,路由實例表用來保存節(jié)點流轉過程的狀態(tài)落追,這樣的話可以將工作流定義和工作流實際工作過程分開,就如java的類和java的對象一樣涯肩,最后還能增加一個tb_task表與tb_task_instance轿钠,用來表示該工作流代表的一個任務,從而每個工作流實例都是有和具體任務關聯的病苗,該任務可以再設置各種字段保存一段腳本疗垛,從而讓工作流能夠做更多的東西
3,復雜工作流的一些特性:工作流特性