sharepoint高效率工作流開發(fā)_第1頁
sharepoint高效率工作流開發(fā)_第2頁
sharepoint高效率工作流開發(fā)_第3頁
sharepoint高效率工作流開發(fā)_第4頁
sharepoint高效率工作流開發(fā)_第5頁
已閱讀5頁,還剩169頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、本章要緊闡述SharePoint Designer 2007(SPD)的工作流應(yīng)用及利用WF對SharePoint Designer工作流組件(動作和條件)進(jìn)行擴展,講解利用WF和Visual Studio 2008開發(fā)工作流模板的方法。本章提供視頻教程:采納SPD設(shè)計工作流的默認(rèn)方式和定制后的方式。本章包括:n 工作流開發(fā)概述n 采納SharePoint Designer設(shè)計工作流n SharePoint Designer工作流的擴展n 采納Visual Studio 2008 開發(fā)工作流模板7.1 工作流開發(fā)概述SharePoint基于WF(Window Workflow Foundati

2、on)構(gòu)建了它的工作流功能。WF是SharePoint工作流框架的基礎(chǔ),要深入了解SharePoint工作流的開發(fā),首先應(yīng)該了解WF的一些基礎(chǔ)知識,本章對WF的技術(shù)細(xì)節(jié)并可不能過多講解。本節(jié)將講述SharePoint工作流的基礎(chǔ)知識,并介紹系統(tǒng)自帶的工作流模板的使用和默認(rèn)的工作流任務(wù)操作方式。7.1.1 工作流開發(fā)環(huán)境的搭建假如使用Visual Studio 2005開發(fā)SharePoint工作流應(yīng)用,首先需要安裝Visual Studio 2005的WF擴展Visual Studio 2005 Extensions for Windows Workflow Foundation ,能夠在以下

3、地址下載:/downloads/details.aspx?familyid= 5D61409E-1FA3-48CF- 8023-E8F38E709BA6&displaylang=zh-cn。然后安裝Office SharePoint Server 2007 SDK。采納Visual Studio 2005開發(fā)SharePoint工作流,不管是開發(fā)環(huán)境的搭建依舊開發(fā)時調(diào)試和測試,都比較煩瑣。Visual Studio 2008差不多公布正式版了,VS 2008提供了對SharePoint工作流開發(fā)更好的支持,直接集成了開發(fā)、部署和調(diào)試。本章的示例將采納VS 2008來進(jìn)行。為了便于調(diào)試和測試工作

4、流,選擇直接在SharePoint服務(wù)器環(huán)境下開發(fā),因此VS 2008要直接安裝在SharePoint服務(wù)器上。7.1.2 SharePoint工作流的差不多概念SharePoint工作流是一個預(yù)先定義好的對列表項或文檔庫文檔的處理流程。一個工作流實例跟一個列表項或文檔進(jìn)行關(guān)聯(lián),工作流實例不能脫離列表項存在。當(dāng)需要用戶處理數(shù)據(jù)的時候,比如進(jìn)行審批操作,系統(tǒng)會創(chuàng)建一個任務(wù)到某個任務(wù)列表中,審批用戶操作列表中的任務(wù)來實現(xiàn)跟流程實例的交互。工作流實例能夠在列表新建、修改時自動啟動,或者能夠由用戶手動啟動。MOSS支持兩種工作流的開發(fā)方式。l 利用SharePoint Designer能夠設(shè)計簡單的無

5、代碼順序工作流。在SharePoint Designer中,能夠直接創(chuàng)建跟某個列表或文檔庫關(guān)聯(lián)的工作流,在工作流中,能夠直接訪問列表項的字段,獵取字段的值作邏輯推斷或者給字段賦值,給用戶分配審批任務(wù)并動態(tài)生成審批界面。SharePoint Designer設(shè)計的工作流只能跟一個列表(或文檔庫)關(guān)聯(lián),單個工作流無法用于多個列表,不同列表(或文檔庫)的工作流處理邏輯即使一樣,也只能分不進(jìn)行設(shè)計。 采納SharePoint Designer設(shè)計工作流的優(yōu)點是操作簡單,無須編譯和部署,缺點是只能實現(xiàn)順序操作邏輯,無法實現(xiàn)退回等循環(huán)邏輯,審批界面自動生成,也無法實現(xiàn)一些復(fù)雜的操作。7.2節(jié)將演示采納Sh

6、arePoint Designer設(shè)計工作流的步驟。l 利用Visual Studio能夠開發(fā)復(fù)雜的順序或狀態(tài)機工作流。在Visual Studio 2008中,能夠直接在WF設(shè)計器中開發(fā)工作流,工作流開發(fā)好后,編譯成DLL,然后采納Feature部署到SharePoint服務(wù)器,在網(wǎng)站中將Feature激活后,工作流即可使用了,能夠把這種工作流關(guān)聯(lián)到多個列表。因此又稱Visual Studio 2008設(shè)計的工作流為工作流模板。Visual Studio 2008開發(fā)工作流的優(yōu)點是能實現(xiàn)專門復(fù)雜的流程邏輯,開發(fā)出來的工作流模板能夠供多個網(wǎng)站、多個列表使用。流程任務(wù)的操作界面能夠采納infop

7、ath或者直接采納aspx頁面,如此就能夠?qū)崿F(xiàn)較復(fù)雜的頁面操作。缺點確實是開發(fā)部署比較復(fù)雜,對開發(fā)人員要求較高。7.1.3 SharePoint工作流的操作方式SharePoint的工作流的默認(rèn)操作方式并不適合用戶的操作適應(yīng),一般來講其他工作流產(chǎn)品的操作方式是用戶在一個頁面上完成所有操作,包括查看業(yè)務(wù)數(shù)據(jù)(被審批數(shù)據(jù))、填寫審批意見等。而SharePoint工作流的操作方式是:業(yè)務(wù)數(shù)據(jù)跟審批數(shù)據(jù)分離,業(yè)務(wù)數(shù)據(jù)能夠用列表項或文檔庫中的文檔來表示,用戶審批的時候默認(rèn)只看到審批頁面,只有單擊鏈接才能查看業(yè)務(wù)數(shù)據(jù),這種操作方式對文檔審批依舊講的過去的,然而對列表數(shù)據(jù)的審批操作就有點“不夠人性化”了。在

8、實際的項目中,需要對用戶的操作適應(yīng)進(jìn)行引導(dǎo)。SharePoint默認(rèn)提供了專門多工作流模板,這些工作流模板跟采納VS 2008開發(fā)的工作流模板操作上是一樣的。下面看一下系統(tǒng)自帶的“審批”工作流模板的使用。要在SharePoint中使用一個工作流模板,首先需要將工作流模板跟文檔庫或列表關(guān)聯(lián),操作步驟如下。Step1 在文檔庫的設(shè)置頁面單擊“工作流設(shè)置”鏈接,如圖7-1所示。圖7-1 工作流設(shè)置Step2 在添加工作流頁面中,選擇工作流模板為“審批”,輸入工作流名稱為“文檔審批”,單擊“下一步”,如圖7-2所示。圖7-2 添加工作流任務(wù)列表是用戶存放工作流給審批用戶分配的任務(wù)列表項的列表,可選擇系

9、統(tǒng)差不多存在的任務(wù)列表或者新建一個任務(wù)列表。歷史記錄列表用戶存放工作流運行工程中產(chǎn)生的日志信息。Step3 在工作流參數(shù)設(shè)置頁面中,選擇任務(wù)分配對象為“串行”,輸入兩個用戶作為審批者,選擇“文檔被拒絕”時取消工作流,選擇“工作流完成后”為“更新審批狀態(tài)”,如圖7-3所示。單擊“確定”按鈕完成設(shè)置。圖7-3 設(shè)置工作流參數(shù)設(shè)置工作流參數(shù)頁面又叫做工作流關(guān)聯(lián)界面,本示例中的關(guān)聯(lián)界面是采納InfoPath表單開發(fā)的,那個表單叫做工作流關(guān)聯(lián)表單,7.4.7節(jié)將講述工作流關(guān)聯(lián)表單的開發(fā)。Step4 為了方便審批用戶的操作,需要將用戶任務(wù)WebPart添加到網(wǎng)站的首頁,如圖7-4所示。圖7-4 添加用戶任

10、務(wù)WebPart工作流的配置操作差不多完成,下面我們看一下那個工作流的使用。Step1 在文檔庫中新建或上傳一個文檔,然后在下拉列表中選擇“工作流”選項,如圖7-5所示。圖7-5 選擇“工作流”選項Step2 單擊“文檔審批”工作流,如圖7-6所示。圖7-6 選擇工作流Step3 在接下來的配置審批參數(shù)頁面中,能夠輸入審批信息,如圖7-7所示。再單擊“啟動”按鈕。圖7-7 配置審批參數(shù)那個配置審批參數(shù)的頁面在工作流啟動(初始化)的時候出現(xiàn),因此叫做初始化表單,能夠采納infopath開發(fā),在7.4.8節(jié)將具體講述工作流初始化表單的開發(fā)?,F(xiàn)在文檔審批工作流差不多啟動,返回到文檔庫頁面,能夠看到文

11、檔庫上多出來一個“文檔審批”欄,如圖7-8所示。通過“文檔審批”欄中的鏈接能夠鏈接到工作流監(jiān)控和治理頁面,如圖7-9所示。通過工作流監(jiān)控和治理頁面,能夠查看工作流任務(wù)的分配和完成情況,強制終止工作流。圖7-8 文檔庫中工作流鏈接圖7-9 工作流監(jiān)控頁面用第一個審批用戶的賬號登錄系統(tǒng),能夠在用戶任務(wù)Web部件中看到需要操作的任務(wù),如圖7-10所示。圖7-10 工作流任務(wù)單擊任務(wù)鏈接,在接下來的任務(wù)操作頁面中能夠通過鏈接查看被審批的文檔,通過下方的“批準(zhǔn)”和“拒絕”按鈕進(jìn)行審批,如圖7-11所示。圖7-11 任務(wù)頁面任務(wù)操作頁面又稱為任務(wù)表單,能夠采納infopath開發(fā),在7.4.4節(jié)將具體講述

12、。用第2個審批用戶的賬號登錄系統(tǒng),進(jìn)行批準(zhǔn)操作。兩個審批用戶都批準(zhǔn)之后,返回到文檔庫頁面,能夠看到文檔審批的狀態(tài)差不多變成“已批準(zhǔn)”,如圖7-12所示。圖7-12 文檔庫7.2 采納SharePoint Designer設(shè)計工作流SharePoint Designer能夠設(shè)計無代碼的工作流,對列表項或文檔啟用處理邏輯。SharePoint Designer只能設(shè)計出簡單的順序工作流,本節(jié)了解一下具體的操作方法。7.2.1 列表項流程示例本節(jié)演示一個職員請假流程的設(shè)計:職員提交請假單,由審批人進(jìn)行審批,審批人批準(zhǔn)之后,自動添加一個日程到日歷列表中,假如不批準(zhǔn),則郵件通知提交人。具體的操作步驟如下

13、。Step1 創(chuàng)建列表。新建一個自定義列表,名稱為“職員請假”,添加如圖7-13所示的欄。圖7-13 創(chuàng)建列表Step2 啟用列表的內(nèi)容審批。通過“列表設(shè)置”“版本操縱設(shè)置”,啟用列表的內(nèi)容審批。設(shè)置“僅限可批準(zhǔn)項目的用戶”能夠查看列表中的草稿項目,如圖7-14所示。圖7-14 啟用內(nèi)容審批Step3 新建工作流。用SharePoint Designer 打開站點,選擇“文件”“新建”“工作流”命令,如圖7-15所示。圖7-15 新建工作流Step4 指定工作流名稱和啟動方式。在定義新工作流界面中,輸入工作流名稱為“職員請假流程”,選擇附加到“職員請假”列表,再選擇“同意從項目中手工啟動此工作

14、流”,如圖7-16所示。圖7-16 定義新工作流界面Step5 添加審批步驟。將步驟名稱改為“經(jīng)理審批”,在操作中,選擇“從用戶處收集數(shù)據(jù)”,單擊“此用戶”鏈接,在彈出的對話框中選擇一個審批人,如圖7-17和圖7-18所示。圖7-17 添加審批步驟圖圖7-18 選擇審批用戶Step6 設(shè)計審批步驟需要采集的數(shù)據(jù)。單擊“數(shù)據(jù)”鏈接,在自定義任務(wù)向?qū)е休斎肴蝿?wù)名稱為“請假審批”,如圖7-19所示,再單擊“下一步”按鈕。圖7-19 添加“請假申請”添加一個名稱為“審批意見”的多行域,如圖7-20所示。添加一個名稱為“是否同意”的選項類型域,選項為“批準(zhǔn)和拒絕”,如圖7-21所示。圖7-20 添加“審

15、批意見”域 圖7-21 添加“是否同意”域以上的操作實際上是創(chuàng)建了一個任務(wù)內(nèi)容類型,同時創(chuàng)建了其編輯表單,如圖7-22所示。圖7-22 請假審批內(nèi)容類型Step7 修改審批任務(wù)ID變量名。通過添加“從用戶處收集數(shù)據(jù)”動作創(chuàng)建了一個任務(wù)內(nèi)容類型,在工作流運行的時候,會創(chuàng)建一個任務(wù)列表項,那個列表項的ID會被放到流程的變量中,以便從工作流中能夠訪問任務(wù)數(shù)據(jù)。我們把存放那個任務(wù)列表項ID的變量名修改為“請假審批任務(wù)ID”,如圖7-23和圖7-24所示。圖7-23 修改工作流變量名圖7-24 重新選擇任務(wù)ID綁定到的變量Step8 添加審批完成后的處理邏輯。再添加一個工作流步驟,名稱為“審批完成”,如

16、圖7-25所示。圖7-25 添加審批完成步驟Step9 添加推斷條件。經(jīng)理審批同意時需要批準(zhǔn)列表項,同時將請假休息添加進(jìn)日程列表中,首先需要添加推斷經(jīng)理審批是否同意的條件,查找到審批任務(wù)列表項的是否同意字段,進(jìn)行推斷即可。從“條件”菜單中選擇“比較任意數(shù)據(jù)源”,如圖7-26和圖7-27所示。圖7-26 添加比較任意數(shù)據(jù)源條件圖7-27 比較任意數(shù)據(jù)源比較任意數(shù)據(jù)源條件是“假如值等于值”的形式,第一個值能夠綁定到當(dāng)前列表項的任意字段,或者是其他列表項的字段。那個地點我們要把它綁定到任務(wù)列表的“是否同意”字段。單擊“值”,再單擊“綁定”圖標(biāo),在定義工作流查找窗口中,選擇數(shù)據(jù)源為“任務(wù)”,選擇域為“

17、是否同意”,設(shè)置匹配值為任務(wù)ID匹配工作流變量中的“請假審批任務(wù)ID”,如圖7-28所示。圖7-28 綁定到是否同意字段設(shè)置條件為任務(wù)的“是否同意”字段值等于“批準(zhǔn)”,如圖7-29所示。圖7-29 設(shè)置推斷條件為“批準(zhǔn)”Step10 添加列表項審批操作。在“操作”中選擇“設(shè)置內(nèi)容審批狀態(tài)”,并將內(nèi)容審批狀態(tài)設(shè)置為“已批準(zhǔn)”,如圖7-30所示。圖7-30 添加審批操作Step11 創(chuàng)建日歷信息。添加一個“創(chuàng)建列表項”操作,選擇列表為“個人日歷”(若不存在,則先創(chuàng)建此日歷列表),將日歷的標(biāo)題設(shè)置為“請假”,將開始時刻和結(jié)束時刻綁定到當(dāng)前列表項的相應(yīng)字段,如圖7-31所示。圖7-31 創(chuàng)建日歷項St

18、ep12 添加批準(zhǔn)未通過的操作。添加一個Else If條件分支,添加設(shè)置內(nèi)容審批狀態(tài)操作,將內(nèi)容審批狀態(tài)設(shè)置為“已拒絕”,添加一個發(fā)送郵件操作,給啟動流程的用戶發(fā)送一封提醒郵件,如圖7-32所示。圖7-32 添加內(nèi)容審批為“拒絕”和發(fā)送郵件操作SharePoint Designer設(shè)計的工作流的使用和7.1.3節(jié)描述的操作方式差不多是一樣的。不同的是,單擊任務(wù)鏈接首先進(jìn)入的任務(wù)查看頁面,在任務(wù)查看頁面中單擊“編輯項目”鏈接后才會轉(zhuǎn)到任務(wù)編輯頁面,如圖7-33,圖7-34和圖7-35所示。圖7-33 任務(wù)列表圖7-34 任務(wù)查看頁面圖7-35 任務(wù)編輯7.2.2 SharePoint Desig

19、ner工作流的遷移SharePoint Designer設(shè)計工作流的功能是提供給最終用戶使用的,就如同用SPD定制站點頁面一樣,并沒有提供專門的流程遷移工具。最終用戶能夠直接在生產(chǎn)環(huán)境中設(shè)計流程。對開發(fā)人員來講,假如在開發(fā)環(huán)境中設(shè)計好了一個比較復(fù)雜的流程,需要遷移到生產(chǎn)環(huán)境,必須手工操作,能夠參考如下步驟。Step1 確保生產(chǎn)環(huán)境差不多建好了相應(yīng)的列表,并確保列表的配置跟開發(fā)環(huán)境完全一致,包括列表名稱、列表的所有欄。Step2 用SharePoint Designer打開生產(chǎn)環(huán)境的站點,新建一個與開發(fā)環(huán)境名稱一樣的流程,綁定到同名稱的列表,直接保存。Step3 SharePoint Desig

20、ner打開開發(fā)環(huán)境的站點,將工作流的所有文件復(fù)制到生產(chǎn)環(huán)境。Step4 打開所有工作流的文件,將其中所有的列表項ID替換成生產(chǎn)環(huán)境相應(yīng)的列表項ID。7.3 SharePoint Designer工作流的擴展SharePoint Designer提供了常用的專門多條件和活動,然而這些條件和活動并不能滿足所有需要。本節(jié)就來講述SPD動作和條件的擴展。7.3.1 動作的擴展SPD工作流的動作是一個一般的WF活動類。WF活動類開發(fā)好以后,部署到GAC中,然后修改SPD工作流的配置文件,注冊新開發(fā)的活動。SPD工作流配置文件路徑為C:Program FilesCommon FilesMicrosoft

21、Sharedweb server extensions12TEMPLATE2052Workflow,2052表示中文語言,英文語言的配置文件路徑為C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATE1033 Workflow,在那個路徑下,有個WSS.ACTIONS文件,這是一個XML文件,那個文件里面配置了所有系統(tǒng)自帶的動作和條件。WSS.ACTIONS在Actions節(jié)點下聲明了所有的動作。SDP工作流是基于規(guī)則來定義的。在ACTIONS配置文件中,將動作類的屬性與各種規(guī)則設(shè)計器關(guān)聯(lián)。以下是“從

22、用戶處收集數(shù)據(jù)”動作的聲明。 以下是對配置文件中要緊元素的講明。l ClassName和Assembly分不是動作類的全名和所在的程序集。l AppliesTo指定動作是應(yīng)用到文檔庫依舊列表,同意的值為list和all。l CreatesTask指定是否需要創(chuàng)建任務(wù)項。l Parameters節(jié)點中聲明了WF活動類需要跟上下文數(shù)據(jù)進(jìn)行綁定或進(jìn)行設(shè)置的屬性。在Parameter節(jié)點中,Name為WF活動類的屬性名,Type為屬性的類型,Direction聲明屬性是需要賦值的依舊對外提供值,有3個可選值:In、Out、Optional,指定In時必須給屬性賦值,指定Out時必須將屬性跟某個工作流變

23、量進(jìn)行綁定,Optional表示可選項,指定Optional時能夠不對屬性進(jìn)行操作。以下為3個專門的Parameter。l _Context:當(dāng)Action類需要訪問工作流數(shù)據(jù)時,必須聲明此屬性,類型是Microsoft.SharePoint.WorkflowActions.WorkflowContext。l _ListId:當(dāng)需要訪問工作流關(guān)聯(lián)的列表時,需要指定此屬性。l _ItemID:當(dāng)需要訪問工作流關(guān)聯(lián)的列表項時,需要指定此屬性。以上的3個屬性定義在Action類中,然后聲明在配置文件中,工作流運行時引擎會自動為其賦值。RuleDesigner節(jié)點聲明了對Action類屬性的設(shè)計規(guī)則。

24、Sentence指定了設(shè)計時顯示的提示信息,其中的占位符號與RuleDesigner中的FieldBind的ID屬性配置,F(xiàn)ieldBind定義了對某個屬性的設(shè)計規(guī)則。Field為屬性的名字,Text為占位符處顯示的文本,ID跟占位符前的數(shù)字對應(yīng)。DesignerType指定了對屬性應(yīng)用的設(shè)計器,系統(tǒng)支持如下的設(shè)計器。l Survey:生成收集數(shù)據(jù)的表單,表單對應(yīng)的內(nèi)容類型ID和標(biāo)題需要分不映射到兩個屬性中。l SinglePerson:單個用戶或用戶組。l Person:多個用戶或用戶組。l ParameterNames:工作流變量。l StringBuilder:生成能夠跟當(dāng)前工作流數(shù)據(jù)混

25、合的字符串。l Operator:選項,用Option指定可選值。如: l fieldNames:列表欄,采納此設(shè)計器將工作流關(guān)聯(lián)列表的某個欄和Action類的屬性綁定。l E-mail:郵件設(shè)計器,設(shè)計郵件的標(biāo)題、內(nèi)容和收件人等,需要將收件人、抄送人、標(biāo)題、內(nèi)容4個屬性分不綁定,如: 7.3.2 動作擴展示例自定義E-mail活動系統(tǒng)默認(rèn)的發(fā)送郵件動作只能發(fā)送簡單的文本,專門多時候,用戶希望審批任務(wù)的提醒郵件中帶一個鏈接,能夠直接鏈接到任務(wù)操作頁面。本節(jié)我開發(fā)一個能夠發(fā)送任務(wù)鏈接的E-mail活動,那個E-mail活動具有系統(tǒng)發(fā)送郵件動作的所有功能,能夠動態(tài)綁定收件人、指定主題等,如圖7-3

26、6所示。唯一跟系統(tǒng)默認(rèn)功能的區(qū)不確實是:在發(fā)送出去的郵件內(nèi)容中帶有任務(wù)操作鏈接。圖7-36 發(fā)送郵件動作Step1 新建一個工作流活動項目,如圖7-37所示。將默認(rèn)產(chǎn)生的Activity1類改名為“MailWithTaskLinkActivity”。圖7-37 新建工作流活動項目Step2 添加Microsoft.SharePoint.dll和microsoft.sharepoint.WorkflowActions.dll兩個程序集的引用。這兩個程序集位于服務(wù)器上的C:Program FilesCommon FilesMicrosoft Sharedweb server extensions1

27、2ISAPI目錄中。Step3 切換到代碼視圖,將MailWithTaskLinkActivity的基類由SequenceActivity改為Activity。復(fù)核活動能夠從SequenceActivity類繼承,然而MailWithTaskLinkActivity并不需要使用子活動(也確實是不是一個復(fù)核活動),所有應(yīng)該從差不多的Activity類繼承。Step4 添加對SharePoint API要緊名稱空間的引用,代碼如下所示。using Microsoft.SharePoint;using Microsoft.SharePoint.Utilities;using Microsoft.Sh

28、arePoint.Workflow;using Microsoft.SharePoint.WorkflowActions;namespace CodeArt.SharePoint.WorkflowActions public class MailWithTaskLinkActivity : Activity public MailWithTaskLinkActivity() Step5 希望MailWithTaskLinkActivity部署成SharePoint Designer的動作之后,依舊具有系統(tǒng)自帶的發(fā)送郵件活動的功能能夠動態(tài)綁定到收件人、指定郵件主題等,因此需要給MailWithT

29、askLinkActivity添加相應(yīng)的屬性。添加一個_Context屬性,代碼如下所示。public static DependencyProperty _ContextProperty = DependencyProperty.Register(_Context, typeof(WorkflowContext), typeof(SendMail); Browsable(true), ValidationOption(ValidationOption.Required), DesignerSerializationVisibility(DesignerSerializationVisibil

30、ity.Visible), Description(Context) public WorkflowContext _Context get return (WorkflowContext)base.GetValue(_ContextProperty); set base.SetValue(_ContextProperty, value); _Context屬性用來綁定到工作流的上下文,以便獵取工作流運行環(huán)境的網(wǎng)站集、網(wǎng)站等信息。那個屬性的名稱是不能變的,后面的步驟會講述如何在配置文件中配置那個屬性。添加一個_ListId屬性,代碼如下所示。public static DependencyPr

31、operty _ListIdProperty = DependencyProperty.Register(_ListId, typeof(string), typeof(MailWithTaskLinkActivity); ValidationOption(ValidationOption.Required) public string _ListId get return (string)base.GetValue(_ListIdProperty); set base.SetValue(_ListIdProperty, value); _ListId屬性用來綁定到工作流的關(guān)聯(lián)的列表ID。添加

32、一個_ListItem屬性,代碼如下所示。public static DependencyProperty _ListItemProperty = DependencyProperty.Register(_ListItem, typeof(int), typeof(MailWithTaskLinkActivity); ValidationOption(ValidationOption.Required) public int _ListItem get return (int)base.GetValue(_ListItemProperty); set base.SetValue(_ListIt

33、emProperty, value); _ListItem屬性用來綁定到工作流的關(guān)聯(lián)的列表項ID。添加一個To屬性,代碼如下所示。public static DependencyProperty ToProperty = DependencyProperty.Register(To, typeof(ArrayList), typeof(MailWithTaskLinkActivity); ValidationOption(ValidationOption.Required) public ArrayList To get return (ArrayList)base.GetValue(ToPr

34、operty); set base.SetValue(ToProperty, value); To屬性是一個ArrayList類型的集合,在SharePoint Designer進(jìn)行設(shè)計的時候能夠直接綁定到用戶。同樣,添加郵件的抄送(CC)、暗送(BCC)、主題(Subject)、內(nèi)容(Body)4個屬性代碼如下所示。public static DependencyProperty CCProperty = DependencyProperty.Register(CC, typeof(ArrayList), typeof(MailWithTaskLinkActivity); /抄送 Valid

35、ationOption(ValidationOption.Optional) public ArrayList CC get return (ArrayList)base.GetValue(CCProperty); set base.SetValue(CCProperty, value); public static DependencyProperty BCCProperty = DependencyProperty.Register(BCC, typeof(ArrayList), typeof(MailWithTaskLinkActivity); /暗送 ValidationOption(

36、ValidationOption.Optional) public ArrayList BCC get return (ArrayList)base.GetValue(BCCProperty); set base.SetValue(BCCProperty, value); public static DependencyProperty SubjectProperty = DependencyProperty.Register(Subject, typeof(String), typeof(MailWithTaskLinkActivity); /主題 ValidationOption(Vali

37、dationOption.Required) public string Subject get return (string)base.GetValue(SubjectProperty); set base.SetValue(SubjectProperty, value); public static DependencyProperty BodyProperty = DependencyProperty.Register(Body, typeof(String), typeof(MailWithTaskLinkActivity); /郵件內(nèi)容 ValidationOption(Valida

38、tionOption.Optional) public string Body get return (string)base.GetValue(BodyProperty); set base.SetValue(BodyProperty, value); Step6 上一步把MailWithTaskLinkActivity需要的所有屬性都添加好了,下面來添加發(fā)送郵件的處理代碼。重載Execute方法,代碼如下所示。 protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider) /獵取到

39、工作流服務(wù) ISharePointService service = (ISharePointService)provider.GetService(typeof(ISharePointService); if (service = null) throw new InvalidOperationException(); try /獵取到列表 SPList list = _Context.Web.Listsnew Guid(_ListId); /獵取到列表項 SPListItem item = list.GetItemById(Convert.ToInt32(_ListItem); /計算任務(wù)

40、查看URL string url = this._Context.Web.Url + _layouts/codeArt/SPTaskRedirect.aspx?ListId= + item.ParentList.ID + &ItemId= + item.ID; /發(fā)送郵件參數(shù) StringDictionary headers = new StringDictionary(); headersto = this.ParseSendTo(this.To); headerssubject = this.Subject; if (null != this.CC) headerscc = this.Pa

41、rseSendTo(this.CC); if (null != this.BCC) headersbcc = this.ParseSendTo(this.BCC); string body = null; if (null != this.Body) Activity parent = provider.Activity; while (parent.Parent != null) parent = parent.Parent; /處理郵件內(nèi)容中的屬性綁定,Helper是系統(tǒng)自帶的類 body = Helper.ProcessStringField(this.Body, parent, thi

42、s._Context); body += 點擊此處查看或處理任務(wù); /發(fā)送郵件 service.SendEmail(base.WorkflowInstanceId, false, headers, body); return ActivityExecutionStatus.Closed; catch (Exception ex) /將異常信息記錄到日志列表 service.LogToHistoryList(base.WorkflowInstanceId, SPWorkflowHistoryEventType.WorkflowError, _Context.Web.CurrentUser.ID,

43、 TimeSpan.MinValue, MailWithTaskLinkActivity Error, ex.Message + ex.StackTrace, ); return ActivityExecutionStatus.Faulting; 發(fā)送郵件活動一般放置在從用戶處收集數(shù)據(jù)活動之前,那么在發(fā)送郵件活動執(zhí)行的時候?qū)徟蝿?wù)是沒有創(chuàng)建的,這時候無法獵取任務(wù)的路徑或ID,因此我們采納一個中轉(zhuǎn)頁面(SPTaskRedirect.aspx),將列表項的ID傳給那個頁面,SPTaskRedirect.aspx負(fù)責(zé)轉(zhuǎn)向任務(wù)操作頁面。ParseSendTo方法用來將存放郵件地址和賬號的ArraryL

44、ist轉(zhuǎn)換成合法的收件人格式,那個函數(shù)反編譯自系統(tǒng)自帶的MailActivity。Step7 編寫SPTaskRedirect.aspx頁面代碼,并將其復(fù)制到12TEMPLATELAYOUTSCodeArt目錄下。 void Page_Load(object sender , EventArgs e) /獵取到列表 SPList list = SPContext.Current.Web.Lists new Guid(Request.QueryStringListId) ; /獵取到列表項 SPListItem item = list.GetItemById(Request.QueryStrin

45、gItemID) /當(dāng)前用戶ID int useId = SPContext.Current.Web.CurrentUser.ID; Microsoft.SharePoint.Workflow.SPWorkflowTask currentTask = null; /查找當(dāng)前用戶的任務(wù) foreach (Microsoft.SharePoint.Workflow.SPWorkflowTask task in item.Tasks) if ( + taskPercentComplete = 1) continue; string assignedTo = + taskAssignedTo; if

46、(assignedTo = ) continue; SPFieldUserValue user = new SPFieldUserValue(SPContext.Current.Web, assignedTo); if (useId = user.LookupId) currentTask = task; break; if (currentTask = null) Response.Write(任務(wù)不存在或已被刪除。); return; /轉(zhuǎn)向任務(wù)編輯頁面 Response.Redirect(currentTask.ContentType.EditFormUrl + ?List= + cur

47、rentTask.ParentList.ID + &ID= + currentTask.ID);Step8 將項目進(jìn)行簽名,利用reflector找到程序集的全名,代碼如下所示。CodeArt.SharePoint.WorkflowActions, Version=, Culture=neutral, PublicKeyToken=8d0e2047bbdccb4dStep9 創(chuàng)建一個XML文件,改名為CodeArt.Actions,并將其復(fù)制到12TEMPLATE2052 Workflow目錄下。 RuleDesigner節(jié)點配置了采納E-mail設(shè)計器設(shè)計MailWithTaskLinkAc

48、tivity 類的To、CC、Subject、Body 4個屬性。在Parameters節(jié)點中,指定了相應(yīng)屬性的輸入/輸出類型。Step10 將程序集(CodeArt.SharePoint.WorkflowActions.dll)部署到GAC中,配置文件(CodeArt.Actions)添加到12TEMPLATE2052Workflow目錄中后,還需要修改應(yīng)用程序的web.config文件,在authorizedType節(jié)點下添加如下配置:配置完成后,在SharePoint Designer中設(shè)計流程的時候,就能夠選擇那個自定義的發(fā)送郵件動作了,如圖7-38所示。圖7-38 選擇自己開發(fā)的發(fā)送

49、郵件動作7.3.3 條件的擴展SPD的條件是一個一般的類靜態(tài)函數(shù),系統(tǒng)默認(rèn)的條件同樣配置在WSS.ACTIONS文件中。以下是“標(biāo)題域包含關(guān)鍵字”條件的配置。 與動作類的配置專門類似,ClassName和Assembly分不是條件方法所在的類的全名和類所在的程序集,F(xiàn)unctionName是靜態(tài)函數(shù)的函數(shù)名。實現(xiàn)條件的靜態(tài)函數(shù)必須采納如下簽名。public static bool SomeFunction(WorkflowContext context, string listId, int listItem, string var1,string var2)/其中context、listId

50、和listItem分不是工作流上下文數(shù)據(jù)、當(dāng)前列表的ID和當(dāng)前列表項的ID,這3個參數(shù)由工作流引擎來賦值。第4個以后的參數(shù)是額外的專門參數(shù),需要聲明到配置文件的Parameters節(jié)點中。Parameter節(jié)點的Name屬性表示參數(shù)的順序號,因為前3個參數(shù)是系統(tǒng)必需的,因此從第4個參數(shù)開始,順序號為1,同時要用_1_的形式。RuleDesigner中的FieldBind定義了參數(shù)的設(shè)計器,通過Field跟Parameter中聲明的參數(shù)對應(yīng)。FieldBind支持的其他屬性(如DesignerType)和動作的配置完全一樣。7.3.4 條件擴展示例自定義E-mail活動采納SharePoint

51、Designer設(shè)計審批流程的時候,專門多情況下需要按照提交人的將審批任務(wù)分配給不同的審批人,比如,一般職員的請假需要部門經(jīng)理審批,部門經(jīng)理的請假需要公司總監(jiān)來審批。本節(jié)我們就來開發(fā)如此一個條件,能夠用于推斷流程的啟動用戶是否屬于某個網(wǎng)站組。Step1 創(chuàng)建條件方法。新建一個類WorkflowConditions,添加一個靜態(tài)函數(shù)CompareOriginatorGroup,完整的代碼如下所示。namespace CodeArt.SharePoint.WorkflowActions / /條件類 / public class WorkflowConditions / /比較流程發(fā)起人所屬組 /

52、 /工作流上下文 /關(guān)聯(lián)列表ID /關(guān)聯(lián)列表項ID /組名 / public static bool CompareOriginatorGroup(WorkflowContext context, string listId, int itemId, string groupName ) /SPList list = context.Web.Listsnew Guid(listId); /獵取關(guān)聯(lián)的列表 /獵取關(guān)聯(lián)的列表項 /SPListItem item = list.GetItemById(Convert.ToInt32(itemId); /初始化工作的參數(shù) SPWorkflowActiv

53、ationProperties initProp = new SPWorkflowActivationProperties(); context.Initialize(initProp); SPGroup group = context.Web.SiteGroupsgroupName; if (group = null) throw new Exception(String.Format(組0不存在或被刪除, groupName); string userLoginName = initProp.Originator.ToLower(); /流程啟動人 /推斷流程啟動人是否屬于組 foreac

54、h (SPUser user in group.Users) if (user.LoginName.ToLower() = userLoginName) /排除系統(tǒng)治理員 return true; return false; Step2 編寫配置文件。在CodeArt.ACTIONS文件中添加如下配置。 以上配置制定了條件名稱,以及條件對象的方法。指定了采納TextArea(文本框)設(shè)計第一個額外參數(shù)(groupName)。將配置文件部署到12TEMPLATE2052Workflow中,程序集部署到GAC后,在SharePoint Designer中就能夠使用那個自定義的“比較提交人所屬組”條

55、件了,如圖7-39所示。圖7-39 自定義的條件7.4 采納Visual Studio 2008 開發(fā)工作流模板本節(jié)講述采納Visual Studio 2008開發(fā)SharePoint工作流模板的一般步驟和方法。為了使讀者更好地理解本節(jié)的內(nèi)容,本節(jié)在講述差不多原理和操作的同時會附帶講解一個實例工作流的開發(fā),那個工作流是一個文檔審批工作流:提交者上傳文檔,然后啟動工作流,最后提交給審批人審批。7.4.1 創(chuàng)建工作流項目Step1 新建項目。打開Visual Studio 2008新建項目,選擇“Workflow”中的“SharePoint 2007 Sequential Workflow”項目模

56、板,如圖7-40所示。圖7-40 新建項目Step2 指定調(diào)試工作流所用的站點路徑,如圖7-41所示。圖7-41 指定調(diào)試工作流所用的站點路徑Step3 指定工作流用來調(diào)試時附加到的列表。若列表不存在,則先到站點中創(chuàng)建,如圖7-42所示。圖7-42 制定工作流用來調(diào)試時附加到的列表Step4 指定工作流調(diào)試時的啟動方式為手工啟動,如圖7-43所示。圖7-43 指定工作流調(diào)試時的啟動方式以上操作完成之后,能夠看到VS 2008中如圖7-44所示的布局。該圖中左邊工具欄上是系統(tǒng)提供的所有活動組件,中間是工作流設(shè)計器界面,右邊是項目文件。圖7-44 操作完后的布局SharePoint 2007 Se

57、quential Workflow項目模板會自動添加一個OnWorkflowActivated活動,那個活動在工作流啟動的時候執(zhí)行,它的WorkflowProperties屬性綁定到工作流的workflowProperties字段,workflowProperties的類型是SPWorkflowActivationProperties,存放了跟工作流相關(guān)的數(shù)據(jù),如表7-1所示。表7-1 SPWorkflowActivationProperties屬性講明屬 性類 型講 明AssociationDataString工作流關(guān)聯(lián)數(shù)據(jù),通過關(guān)聯(lián)表單提供 HistoryListSPList存放工作流歷史

58、記錄的列表HistoryListIdGuid存放工作流歷史記錄的列表IDInitiationDataString工作流初始化數(shù)據(jù),通過初始化表單提供ItemSPListItem工作流附加到的列表項對象ListSPList工作流附加到的列表OriginatorString啟動工作流的用戶賬號OriginatorUserSPUser啟動工作流的用戶對象SiteSPSite工作流運行的站點集WebSPWeb工作流運行的網(wǎng)站TaskListSPList存儲工作流任務(wù)的列表7.4.2 任務(wù)的分配SharePoint工作流是任務(wù)驅(qū)動的工作流,工作流按照各種邏輯分配任務(wù)給用戶,用戶通過完成任務(wù)跟工作流進(jìn)行交

59、互,驅(qū)動流程前進(jìn)。任務(wù)分配跟以下幾個活動有關(guān)。l createTask:通過createTask活動創(chuàng)建任務(wù),工作流代碼必須處理createTask活動的MethodInvoking事件,創(chuàng)建任務(wù)ID,指定任務(wù)操作用戶。 l onTaskChanged:通過onTaskChanged活動,等待用戶完成任務(wù),并能夠處理Invoked方法,按照用戶的輸入進(jìn)行邏輯處理。l completeTask:通過completeTask活動,完成用戶的任務(wù)。一個任務(wù)的分配過程,差不多上需要以上3個活動進(jìn)行配合的。下面是具體分配任務(wù)的操作過程。 Step1 從工具欄中拖曳createTask到設(shè)計器中,如圖7-

60、45所示。Step2 指定createTask活動的CorrelationToken屬性為“task1Token”,OwnerActivityName為“Workflow1”,如圖7-46所示。圖7-45 從工具欄中拖曳CreateTask到設(shè)計器圖7-46 指定CreateTask活動的屬性Step3 綁定createTask活動的TaskId屬性到工作里的字段。單擊“TaskId”屬性的設(shè)置按鈕,在彈出的屬性綁定窗口選擇綁定到新成員標(biāo)簽,輸入名稱為“task1Id”,選擇創(chuàng)建字段,如圖7-47所示。圖7-47 綁定CreateTask活動的TaskId屬性到工作里的字段Step4 綁定cr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論