[開源]起步,這只是一個開始。開源Qoss Flow Engine項目pre-alpha版本


邁開的第一步,至少證明已然開始。

這還只是以個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) 流程實例對象:需要一整套流程實例對象來描述流程實例運行的狀態和結果。

clip_image002

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 &amp;&amp; {opiniontype}=1</expression>
        </condition>
      </nextNode>
3、 流轉事件的支持,如:節點開始,節點執行,流程開始,流程結束,都可以通過配置監聽到事件,並執行自定義邏輯實現

<plugin>
        <key>Notice</key>
        <config>{Roles:"role1,role2",Users:"user1,user2"}</config>
 </plugin>

4、插件式任務適配器模式,允許自定義任務的實現

5、Qoss Flow Engine 怎么用

對於pre-alpha版本而言,如何用還不是重點,更何況它現在都還沒有一個完整的運行環境(當然,我自己搭了一套集成環境,包括用戶組織機構,授權等應用)。

在發布pre-alpha版本中,已經可以實現以下圖表中的流程實現了,當然了只有流程引擎部分的實現。

image

由於目前測試程序的代碼依托於商業項目的基礎環境,因此暫時不能發布測試項目的代碼給大家。

這里簡單的給出項目中關於流程引擎的調用代碼,在下一篇的博文中將詳細介紹如何用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");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM