最近,公司里要做一個(gè)管理型的功能性?xún)炔烤W(wǎng)站。
其中,數據流轉部分,我設計了一個(gè)簡(jiǎn)單的工作流引擎,說(shuō)簡(jiǎn)單是因為我沒(méi)有在服務(wù)器中對每個(gè)任務(wù)建立自己的實(shí)例,也不涉及到分布式的應用程序。因為這些對我們的要求來(lái)說(shuō),是不太必要的。
我的想法是,
首先,一個(gè)任務(wù)是由多個(gè)節點(diǎn)組成,節點(diǎn)之間是有條件地流動(dòng)的。每個(gè)節點(diǎn)中都定義使用者范圍、附件和相關(guān)的子任務(wù)。其實(shí)任務(wù)就是一個(gè)節點(diǎn)集,從事務(wù)的導航上來(lái)說(shuō),任務(wù)其實(shí)是沒(méi)有必要的,只是為了對事務(wù)進(jìn)行考評,才人為地把一系列節點(diǎn)劃歸一個(gè)任務(wù)。節點(diǎn)間不是一個(gè)線(xiàn)性的關(guān)系,而是一個(gè)網(wǎng)格狀的關(guān)系。
具體的實(shí)現是,在數據庫中,建立一個(gè)任務(wù)模板庫,在這個(gè)庫里,將任務(wù)按類(lèi)型進(jìn)行定義,定義其相對應的屬性,然后定義一個(gè)節點(diǎn)流轉關(guān)系庫,將節點(diǎn)的流轉順序和相對應的條件寫(xiě)入。每一個(gè)節點(diǎn),都有一個(gè)對應的操作角色,可以是一個(gè)人也可以是一群人,這里的“一群人”其實(shí)是指“一群人中的任何一人”,是“或”的關(guān)系。對于一個(gè)節點(diǎn)來(lái)說(shuō),在建立下一個(gè)節點(diǎn)時(shí),定義的下一節點(diǎn)操作角色如是“群組”則該角色中的人都是“與”的關(guān)系,因為,如果是“且”關(guān)系,就自動(dòng)產(chǎn)生多個(gè)節點(diǎn)了。而對于一個(gè)被產(chǎn)生的節點(diǎn)來(lái)說(shuō),只要定義其“如果其有未完成前驅?zhuān)瑒t等待”,這樣可以保證所有的條件都滿(mǎn)足時(shí)才會(huì )被產(chǎn)生。
還要再定義一個(gè)節點(diǎn)庫,在這個(gè)庫里記錄每個(gè)節點(diǎn)角色中的操作和附件條件,比如“至少有一個(gè)文檔”或者“最多建立3個(gè)子任務(wù)”等等。
上面的結構只一個(gè)任務(wù)的模板,而具體的業(yè)務(wù)內容,則在另外的數據表中體現。所以在任務(wù)模板庫中,有關(guān)分支條件,只是一個(gè)條件分類(lèi),而不是具體的內容,因為對于不同的業(yè)務(wù)過(guò)程,具體的條件變量是千差萬(wàn)別的。
在實(shí)際應用時(shí),傳入用戶(hù)名、任務(wù)號和條件,就可以自動(dòng)導航到正確的節點(diǎn)。然后讀出這個(gè)節點(diǎn)的操作要求和對應的表單進(jìn)行數據的操作。當不傳入條件時(shí),就用默認的條件導航。
這樣,只要做一個(gè)可視化的界面,將流程的定義轉化為數據模板格式保存到數據庫中,就可以讓上面的庫起到一個(gè)導航和提醒的功能。而將任務(wù)的流轉控制和具體的業(yè)務(wù)數據分離開(kāi)來(lái),這樣的話(huà)有一個(gè)好處,就是可以把現有的業(yè)務(wù)系統,集成到這個(gè)引擎上來(lái)。
事實(shí)上,這個(gè)數據庫就成了一個(gè)大的實(shí)例庫,實(shí)例運行的狀態(tài)都保存在數據庫中。這種方法在實(shí)現中應該是比較簡(jiǎn)單和有效的,但是其效率可能有點(diǎn)問(wèn)題,但對于一般企業(yè)ERP應用是絕對不成問(wèn)題的。
聯(lián)系客服