以前的工作都是電商網站形式的,從未接觸過工作流相關工作,新公司是傳統制造業行業,我進的這個組又是做工作流這塊相關工作的,所以避免不了和工作流打交道。
這邊工作流主要用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端就是處理業務數據,根據自己業務場景寫即可。