K2工作流引擎Demo


     以前的工作都是電商網站形式的,從未接觸過工作流相關工作,新公司是傳統制造業行業,我進的這個組又是做工作流這塊相關工作的,所以避免不了和工作流打交道。

     這邊工作流主要用K2來做,我呢也是初次使用K2工作流引擎,今天就簡單記錄下創建K2工作流的過程,以后再慢慢補充更深一點的內容。

准備工作:

1.K2客戶端要安裝好,我這邊是公司直接給的K2安裝包,外面下載不到,據說這玩意收費的。

2.我這個K2客戶端只能在VS2010上創建項目,所以還要配合K2裝一個VS2010

3.以上兩項准備工作就緒后,基本就要開工了,接下來要做的流程圖大概長成這樣,上張圖看下

大致介紹下,該流程有2個節點Supplier和QS兩個審批節點,有3個操作、同意、拒絕、關閉,這個流程也相對簡單一點

 

1.需要用VS2010新建工作流項目,打開VS2010

文件》新建》項目:如下所示:

K2客戶端安裝后,左側已安裝的項目就會有K2的模板,創建項目的時候要選擇“K2 Workflow Project”項目,然后輸入項目名稱、位置、解決方案名稱,點擊確定即可。

默認是有一個開始節點的,這個節點沒有任何操作。

接下來我們做一個,發起申請,供應商收到通知上傳,質量部門審批(同意、拒絕、關閉)

1.新增節點》打開工具箱》Event Wizards》選擇“Default Server Event(Code)”》拖拽到設計面板,默認就剩生成左側框內節點。默認會帶一個事件。那么接下來,我們再把另外幾個節點拖拽出來,最后在去關聯。

 

 2.所有節點以及拖拽完成,如下所示,拖拽過程中對每個節點進行了重命名,直接在每個節點上右鍵》Properties》

 

 

 

 3.這一步就是使用線把這幾個流程節點給關聯起來。工具箱》Line Wizards》選擇:Default Line  線即可。這一步主要用於關聯開始節點和Supplier兩個節點,這兩個節點之間沒有任何審批操作。

選擇這個線之后,鼠標指針放到起始節點,划線到Supplier節點即可

 

發起流程的時候其實是有代碼來通知K2,流程已經發起,下一步通知Supplier節點進行審批,代碼大致粘貼下。流程創建好之后,回返回一個ProcInstID ,K2自動生成的,后續和K2的交互就要依賴這個ID。

 QSSampleReportWorkflow workflow = new QSSampleReportWorkflow(
                          item.ID,
                          string.Empty,
                          User.Identity.Name,
                          hdEmployeeName.Value,
                          "供應商樣品報告"
                          );
                        item.ProcInstID = workflow.StartNewProcessInstance();

 

 所有參數及方法都在QSSampleReportWorkflow這個類里邊,

public sealed class QSSampleReportWorkflow
    {
        string processFullName = @"Com.WorkFlows\QSSampleReport";//審批流文件名
        string originator;//發起人帳號
        string nickName;//昵稱
        string viewURL;
        string ApprovalURL;
        string WebServiceURL;

        System.Collections.Hashtable hsDataFields = new System.Collections.Hashtable();
        string title;
        string folioName;
        public QSSampleReportWorkflow(int formID, string appliNo, string userAccount, string userName, string projecteName)
        {
            originator = userAccount;//賬號
            nickName = userName;
            string rootURL = ConfigurationManager.AppSettings["SiteRoot"];//當前Web站點地址
            WebServiceURL = string.Format("{0}/Suppliers/QSSampleReport.asmx", rootURL);//WebService地址
            ApprovalURL = string.Format("{0}/Suppliers/SupplierApplyView.aspx", rootURL);//申請頁
            viewURL = string.Format("{0}/Suppliers/SupplierApplyView.aspx?RequestID={1}&PDK={2}", rootURL, formID, EncryptHelper.GetPDK(formID.ToString()));//查看頁
            title = string.Format("QSSampleReport_{0}_{1}", projecteName, formID);
            folioName = string.Format("QSSampleReport_{0}", formID);
            hsDataFields.Add("RequestID", formID);
            hsDataFields.Add("WebServiceURL", WebServiceURL);
            hsDataFields.Add("ApproveURL", ApprovalURL);
            hsDataFields.Add("Title", title);
            hsDataFields.Add("FullName", nickName);
            //hsDataFields.Add("EnableToCheckFinal", false);
        }

        public QSSampleReportWorkflow()
        {
        }
        public int StartNewProcessInstance()
        {
            return Com.Kion.CommonProjects.WorkflowHelper.K2Helper
                  .StartNewProcessInstanceAndLogOnWorkflowPlatform(processFullName, hsDataFields, folioName, originator, viewURL, "");
        }
        /// <summary>
        /// 審批
        /// </summary>
        /// <param name="sn">審批時自動生產成的參數</param>
        /// <param name="approvalResult">審批結果</param>
        /// <param name="nodeName">審批節點名稱</param>
        /// <param name="approver">審批人</param>
        /// <param name="remark">批備注</param>
        public void Approval(string sn, ApplyState approvalResult, string nodeName, string approver, string remark)
        {
            try
            {
                K2Helper.ApprovalProcessInstanceAndLogOnWorkflowPlatform(sn, approvalResult.ToString().Trim()
                    , nodeName, false
                    , approver
                    , remark);
            }
            catch (Exception ex)
            {

            }

        }
    }

 

4.發起流程之后會到Supplier這個節點,這個節點要干的事情有以下幾項,
1.獲取節點審批人,需要在Supplier這個節點加載時初始化時寫一一段與WebService交互的代碼,先把WebServices引入

 

Process Referencess》Add》Web》如下圖所示添加引用

 2.獲取Supplier這個節點審批人,那么就要加入以下代碼,操作如下

在代碼區域,DestinationRule_ExecuteCode方法中最后一個else里邊寫入以下代碼,保存即可,

GetDynamicApprovers方法WebService那邊返回一個字符串數組存的都是賬號
K2.Destinations.Clear();
                Suppliers.QSSampleReport wsHelper = new Suppliers.QSSampleReport();
                wsHelper.Url = K2.ProcessInstance.DataFields["WebServiceURL"].Value.ToString();
                int requestID = int.Parse(K2.ProcessInstance.DataFields["RequestID"].Value.ToString());
                //獲取Supplier節點審批人
                string[] approverList = wsHelper.GetDynamicApprovers(requestID, K2.ActivityInstance.Activity.Name);

                foreach (string approver in approverList)
                {
                    K2.Destinations.Add(DestinationType.User, approver);
                }

 

2.給默認的Server Event添加事件代碼,這里主要用來發送郵件,具體操作如下圖所示

在Main方法中添加以下代碼:

 string approverList = string.Empty;
            for (int i = 0; i < K2.ActivityInstanceDestination.Destinations.Count; i++)
            {
                approverList += K2.ActivityInstanceDestination.Destinations[i].Name.Split(':')[1] + ";";
            }
            Suppliers.QSSampleReport wsHelper = new Suppliers.QSSampleReport();
            wsHelper.Url = K2.ProcessInstance.DataFields["WebServiceURL"].Value.ToString();//WebService地址
            int requestID = int.Parse(K2.ProcessInstance.DataFields["RequestID"].Value.ToString());//申請ID
            wsHelper.SendEmailToApprover(approverList, K2.SerialNumber, K2.ActivityInstanceDestination.ActivityInstance.Activity.Name, requestID);

 

3.設置QS節點,和上邊Supplier節點設置一樣,需要在初始化時拷貝獲取審批人代碼,ServerEvent節點拷貝發送郵件代碼。和Supplier區別在於,這個節點有審批人會介入,需要配置兩個操作,批准、拒絕
添加動作(審批通過、拒絕等),執行這個節點的操作(這個節點直接審批通過即可),添加一個Default client Event,具體如下圖所示

 

然后會彈出配置框,按照指示操作即可

 

 

 

大致配置了4個參數,要和WebServices那邊對應起來,配置好之后還是回到剛才界面選擇配置參數,如下所示,SN是自動生成的參數,選擇WebServiceUlr之后點擊Next然后在Back返回這個參數自動就帶上了,

這個參數是K2自動生成的一個流程ID,跟業務表單對應的,傳到業務站點之后可以根據這個流程ID獲取對應業務數據,前提是我們之前存了這個流程ID

 

 這一步配置后直接Next即可,然后配置,兩個操作,就是 審批和拒絕兩個操作。具體如下

兩個操作配置好之后,直接Next到User界面,添加用戶,這個用戶目前是寫死的,具體什么意義我還不清楚,不寫又不行,具體如下圖所示

 

 配置完之后,直接Next,直至Finish即可。這時候會出來兩條線,一個是Approve,另一個則是Decline,然后將這兩條線指向對應節點,如下圖所示

 

在Approva節點和Close節點的ServerEvent里加入以下代碼通知程序審批流結束,有點區別是這個方法同意傳true,關閉就傳false
wsHelper.EndApproval(requestID, true);//發起流程操作
Suppliers.QSSampleReport wsHelper = new Suppliers.QSSampleReport();//創建WebService對象
            wsHelper.Url = K2.ProcessInstance.DataFields["WebServiceURL"].Value.ToString();//獲取WebServiceURL
            int requestID = int.Parse(K2.ProcessInstance.DataFields["RequestID"].Value.ToString());//獲取業務表單Id
            wsHelper.EndApproval(requestID, true);//發起流程操作

 

 在WebService提供端,EndApproval方法里要寫入業務代碼,流程結束后,業務數據的操作,郵件通知,流程關閉等

 

WebService端代碼我就不貼了,有些東西是公司的,web端就是處理業務數據,根據自己業務場景寫即可。


免責聲明!

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



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