邁開的第一步,至少證明已然開始。
這還只是以個pre-alpha的版本,意味着,它目前就根本沒有多少功能,它也許只還有那一點點尚未搭建完成的骨頭架子,但它會慢慢成長。
…..
哈哈,廢話真多。步入正題吧。
1. Qoss Flow Engine是什么?
Qoss其實它的定位是一個開源的BPM(Business Process Management,業務流程管理) ,現在說它是個BPM,就說大了,其實,它現在就還只是個控制流程流轉的類庫而已。在一個BPM系統中需要很多完善的功能,而它目前根本沒有實現。
對Qoss的期望是一個完整的BPM系統,它的alpha版應該包含的功能應該有:
表單引擎 流程引擎 流程設計引擎
而現在Qoss Flow Engine項目,將是BPM中流程引擎的pre-alpha版本。
2 、希望Qoss Flow Engine能做什么
總的來說,引擎主要關注四個方面的問題:
(1) 流程定義問題:不是說如何圖形化的定義流程,而是如何用一套定義對象,來詮釋所定義的流程。
(2) 流程調度問題:提供什么的機制,可以確保流程能夠處理復雜的“流程圖結構”,諸如串行、並行、分支、聚合等等,並在這復雜結構中確保流程從一個節點運行到另一個節點。
(3) 流程執行問題:當流程運行到某個節點的時候,需要一套機制來解決:是否執行此節點,並如何執行此節點的問題,並維持節點狀態生命周期。
(4) 流程實例對象:需要一整套流程實例對象來描述流程實例運行的狀態和結果。
3、Qoss Flow Engine 做了什么
1、 能夠通過xml文件描述一個復雜的業務流程,是開發人員能夠輕松快捷的配置復雜流程[在bpm系統中通過可視化的流程設計引擎設置生成xml文件]。
2、 提供了可擴展的Event-Action機制,來輔助擴展處理流程流轉控制
3、 提供了靈活的條件表達式機制,來輔助條件解析、腳本計算的處理。
4、 節點的類型和擴展,可以通過定義自己的Node節點對象,來補充節點對象,滿足流程對業務邏輯的控制需求
4、 Qoss Flow Engine 目前能做什么?
1、 流程的定義流轉,支持普通節點(多任務單人處理),多任務並行
2、 靈活的條件判斷,允許配置與表單數據相關的流轉條件
<nextNode> <code>OPLeaderApproval</code> <condition> <key>MutilExecutor</key> <expression>{Monney}>99999 && {opiniontype}=1</expression> </condition> </nextNode>
<plugin> <key>Notice</key> <config>{Roles:"role1,role2",Users:"user1,user2"}</config> </plugin>
4、插件式任務適配器模式,允許自定義任務的實現
5、Qoss Flow Engine 怎么用
對於pre-alpha版本而言,如何用還不是重點,更何況它現在都還沒有一個完整的運行環境(當然,我自己搭了一套集成環境,包括用戶組織機構,授權等應用)。
在發布pre-alpha版本中,已經可以實現以下圖表中的流程實現了,當然了只有流程引擎部分的實現。
由於目前測試程序的代碼依托於商業項目的基礎環境,因此暫時不能發布測試項目的代碼給大家。
這里簡單的給出項目中關於流程引擎的調用代碼,在下一篇的博文中將詳細介紹如何用pre-alpha版本實現上述流程的流轉,同時也將整理出Qoss Flow Engine的源代碼提供大家下載。
IFlowEngine flowEngine = FlowFactory.GetFlowEngine(); //new FlowEngine(); var currentUser = new UserWrapper() { Account = "administrator", MainOrg = "Org", Name = "超級管理員", Orgs = new List<string>(){ "Org1","Org2" }, Posts = new List<string>(){ "administrator", "admin"}, Roles = new List<string>(){"administrator","admin"}, UnitCode = "Qoss.BPM" }; FormDataDictionary formData = new FormDataDictionary(); formData.Add("Title", "here is the title"); var instance = flowEngine.CreateInstance("TestFlow", currentUser, formData); //啟動流程並流轉至下一個節點 //這一系列操作均是在用戶提交數據后處理 instance.Start(currentUser, formData); //獲取下個節點 var nextNodeList = instance.GetNextNodes(); var node = nextNodeList.FirstOrDefault(); instance.ProcessNext(new ProcessInfo() { NextNode = node, Operator = new List<UserWrapper>() { currentUser } }); Assert.AreEqual(instance.Context.TransferInfo.CurrentNodeCode,node.Code); //由於web應用此步驟是分開的 //context上下文是需要重新獲取的 //對於客戶端能保持的數據有: //任務Id,flowCode,當前用戶,實例id(instanceid) var taskId = "Node1"; var newContext = flowEngine.GetInstance(taskId, currentUser, formData); nextNodeList = newContext.GetNextNodes(); node = nextNodeList.FirstOrDefault(); newContext.ProcessNext(new ProcessInfo() { NextNode = node, Operator = new List<UserWrapper>() { currentUser } }); Assert.AreEqual(newContext.Context.TransferInfo.CurrentNodeCode , "Node2");