簡單介紹下狀態機工作流,狀態機工作流提供了一系列的狀態。工作流從初始狀態開始,到終止狀態結束。兩個狀態之間定義行為進行過渡。通常情況下,狀態機工作流對事件作出反應,事件的發生將會使狀態發生改變。
1、新建項目,選擇SharePoint解決方案,創建空項目:
2、選擇調試站點,部署為場解決方案,如下圖:
3、添加新項,選擇“Office/SharePoint”下面的“狀態機工作流(僅場解決方案)”:
4、選擇列表工作流,修改工作流名稱為“日常報銷”:
5、選擇調試時使用的列表,並選擇任務列表和歷史記錄列表;如果項目創建完畢,想要修改調試列表,可以在工作流項目上右鍵屬性;
6、選擇工作流的啟動方式,如下圖:
7、修改Feature配置要部署的工作流:
8、然后回到開發界面,准備畫流程圖:
9、添加狀態,並設置一個為“已完成狀態”,同時右鍵重命名各個狀態,如下圖:
10、添加事件驅動並重命名,添加連接線:
11、在狀態上右鍵,添加stateInitialization(用來CreatTask):
12、創建CreatTask,重命名並修改屬性,添加Correlation Token和OwnerActivityName;
13、創建任務ID,如下圖,記得選擇創建字段,點擊確定:
14、同任務ID創建任務屬性,如下圖:
15、雙擊CreatTask進入代碼視圖,給方法添加代碼:
createJLTask_TaskId1 = Guid.NewGuid(); createJLTask_TaskProperties1.Title = "經理待審批"; createJLTask_TaskProperties1.AssignedTo = @"i:0#.w|sp\li.jing"; createJLTask_TaskProperties1.DueDate = DateTime.Now.AddDays(1.0); createJLTask_TaskProperties1.ExtendedProperties.Add("狀態", "已啟動");
如上面代碼,分別是任務ID、標題、分配人員、有效期和狀態屬性;
(createJLTask_MethodInvoking方法代碼截圖)
16、返回到設計視圖,雙擊該狀態的事件驅動,進入事件驅動的視圖:
如下圖,添加OnTaskChanged事件,監視任務變化,重命名;添加After/Before屬性,類似上面任務ID,創建字段;修改Correlation Token和OwnerActivityName,和之前Task的相同即可;修改TaskId,修改為之前任務ID。
17、雙擊OnJLTaskChanged,添加方法代碼:
onJLTaskChanged_AfterProperties1 = onJLTaskChanged.AfterProperties;
onJLTaskChanged_BeforeProperties1 = onJLTaskChanged.BeforeProperties;
(OnJLTaskChanged方法截圖)
18、添加IF…ELSE…,如下圖:
添加分支判斷的代碼條件,並為方法添加方法體:
方法如下,如果審批通過則走左側分支,否則右側分支;
public Guid TaskStatusFieldId = new Guid("55b29417-1042-47f0-9dff-ce8156667f96"); private void NextToZJL(object sender, ConditionalEventArgs e) { string strresult = onJLTaskChanged_AfterProperties1.ExtendedProperties[TaskStatusFieldId].ToString(); if (strresult == "已批准") { e.Result = true; } else { e.Result = false; } }
特:TaskStatusFieldId是ExtendedProperties的一個Key值,調試可以看到。
19、設置狀態,如下圖:
20、添加狀態字段,如下圖:
21、雙擊SetState創建方法:
private void setStateToJL_MethodInvoking(object sender, EventArgs e) { }
22、添加xml和擴展狀態代碼:
23、添加狀態的枚舉類型,如下圖:
public enum SPWorkflowStatus { 經理待審批 = 0, 經理已拒絕 = 1, 總經理待審批 = 2, 總經理已拒絕 = 3, 總裁待審批 = 4, 總裁已拒絕 = 5, 報銷審批通過 = 6, Max = 15 }
24、完成剛剛創建的setStateToJL_MethodInvoking方法
setStateToJL_State1 = (Int32)SPWorkflowStatus.Max;
25、如此方法創建ZJLstateActivity、ZCstateActivity兩個狀態,在此不一一重復了,配置好的流程圖,附后:
審批流程描述:
普通員工 – 經理審批 – 總經理審批 – 總裁審批;
經理 – 總經理審批 – 總裁審批;
總經理 – 總裁審批;
審批結果:
任意一級拒絕,工作流結束,狀態為該級別拒絕;
審批通過,可以報銷,狀態為審批通過。
流程運行過程
1、新建一條報銷;
2、 啟動新的工作流;
3、查看工作流狀態
4、 經理審批頁面,如下圖:
5、 經理審批后的狀態,如下圖:
6、 總經理審批后,總裁批准,如下圖:
7、 總裁已批准,日常報銷頁面,如下圖:
8、 總經理審批后,總裁批准,如下圖:
9、 總裁已拒絕,日常報銷頁面,如下圖:
結束語
以上,就是SharePoint 2013狀態機工作流的簡單示例,例子比較簡單,希望大家不要吐槽,也希望能夠給需要學習的人以參考。
其實,做工作流的過程,自己也經常吐槽,確實是一個痛苦的過程,接下來還想寫表單來跑工作流,不知道還有沒有耐心繼續寫下去了,呵呵,好了,不吐槽了,就這樣吧。
總 結
因為截圖比較倉促,很多地方可能介紹並不詳細,特此做一個總結。SharePoint狀態機工作流的設計過程:添加工作流狀態 – 添加事件驅動 – 勾畫流程圖 – 添加工作流初始化 – 添加任務(CreatTask) - 事件驅動里添加OnTaskChanged事件 – 設置IF..ELSE等選擇語句 – 設置流程結束狀態。基本上就是這樣一個過程,希望大家理解后再動手做。
回復一樓留言
簡單修改下流程~
IF...ELSE分支加代碼
private void IfMoneyBelow500(object sender, ConditionalEventArgs e) { if (Convert.ToInt32(workflowProperties.Item["報銷金額"].ToString()) >= 500) { e.Result = true; } else { e.Result = false; } }
結果如下圖: