本文章是由機器翻譯。

SharePoint 開發

建置 SharePoint Online 工作流程解決方案

Chris Mayo

下載代碼示例

許多組織都採用了 SharePoint,以此促進組織內資訊工作者之間的協作。這些組織常常使用 SharePoint 將資訊存儲在清單中以及文件庫中,以支援人工業務流程。將這些資訊存儲在 SharePoint 中確實可以更方便、更高效地這些圍繞資訊進行協作,不過,如果在 SharePoint 中以 SharePoint 工作流的形式自動執行這些業務流程將會大大提高資訊工作者的工作效率。

隨著 Office 365 的發佈,SharePoint Online 為組織提供許多原來可由 SharePoint 提供的協作優勢,同時具備基於雲的軟體即服務優勢。SharePoint Online 通過聲明性工作流支援工作流,聲明性工作流是在 SharePoint Designer 2010 中構建並通過沙箱解決方案部署的。如果內置的工作流操作不能滿足工作流解決方案的要求,可使用 Visual Studio 2010 構建自訂工作流操作,然後通過沙箱解決方案部署到 SharePoint Online。

本文將概述 SharePoint Online 中的工作流支援,使用 SharePoint Designer 2010 構建一個聲明性工作流,通過自訂操作擴展該工作流,然後在 SharePoint Online 中將該工作流作為沙箱解決方案部署到雲中運行。

有關 SharePoint Online 開發與 SharePoint 2010 開發之間的異同的資訊,請參閱我 2011 年 3 月在 MSDN 雜誌 (bit.ly/spodevmsdn) 中發表的文章“通過 SharePoint Online 實現基於雲的協作”。有關 SharePoint Online 和 Office 365 的詳細資訊(包括如何註冊試用帳戶),請訪問office365.com

SharePoint Online 開發概述

通過 SharePoint Online,您可以使用 SharePoint 2010 開發所使用的技術和工具(包括 Visual Studio 2010、SharePoint Designer 2010、C# 或 Visual Basic,以及 SharePoint API 和 SDK)來創建協作解決方案。儘管 SharePoint 2010 解決方案開發和 SharePoint Online 解決方案開發有許多相似之處,這兩者還是有一些區別,這些區別會影響能夠構建哪些解決方案以及如何構建這些解決方案。

SharePoint Online 僅支援沙箱解決方案,這意味著無法部署基於代碼的工作流,包括使用順序工作流和狀態機工作流專案項構建的解決方案。不過,使用 SharePoint Designer 2010 構建的工作流是受支援的,因為這些工作流是聲明性工作流而不是基於代碼的工作流,可直接部署到 SharePoint Online,也可以使用套裝程式檔通過解決方案庫進行部署。此外,還可以通過 Visual Studio 2010 構建的沙箱解決方案擴展這些聲明性工作流,從而提供自訂工作流操作來支援 SharePoint Designer 2010 原本不支援的方案。

本文將以上一篇文章仲介紹的概念和解決方案為基礎。建議您閱讀這篇文章,按照其中的指南設置 SharePoint Online 開發環境,然後構建採購解決方案示例,這樣,可以深入瞭解 SharePoint Online 的開發概念。為了說明 SharePoint Online 中的工作流支援,本文將擴展該採購解決方案,使它包含一個工作流解決方案。

SharePoint Designer 2010 Overview

通過 SharePoint Designer 2010,高級使用者和開發人員無需代碼即可自訂 SharePoint 2010。SharePoint Designer 2010 也支援 SharePoint Online,唯一區別是 SharePoint 2010 與 SharePoint Online 的功能(如 BCS 和外部清單支援)有差異。SharePoint Designer 2010 是一個很好的工具,可以導航和管理 SharePoint 中的專案,可以處理資料,還可以自訂 SharePoint 網站的外觀。您還可以創建自訂工作流,然後將其部署到整個協作解決方案中。通過視頻“面向 SharePoint Online 的 SharePoint Designer 2010 簡介” (bit.ly/spdspointro),您可以瞭解有關 SharePoint Designer 2010 功能的更多資訊。SharePoint Designer 2010 可免費下載,它支援 32 位 (bit.ly/spd201032) 和 64 位版本 (bit.ly/spd201064)。

採購解決方案

在本文的示例中,我將以在上一篇文章仲介紹的虛構 Contoso Corp. 公司的採購流程為基礎,添加一個 SharePoint 工作流來自動執行採購請求審批。在某項採購請求需要審批時,使用者將啟動該工作流,為該項採購提供業務理由。該工作流將啟動審批流程,使用採購詳細資訊為“審批者”組創建任務。在批准或拒絕之後,將向請求使用者發送電子郵件,告知請求結果。然後該工作流檢查請求類型,如果是經過批准的旅行請求(如參加技術會議),則創建一個子網站供使用者填寫旅行報告和上載幻燈片。為此,我將向“Non-Standard Business Purchase Requests”添加一個 RequestType 域。

我更新了上一篇文章中的 PurchaseMgr 專案,將這個 RequestType 域包含在內。如果您已按照這篇文章所述進行操作,則可卸載以前的套裝軟體,部署隨本文提供的套裝軟體,或者向“Non-Standard Purchase Requests”清單添加一個必需域 RequestType(帶“Travel”、“Equipment”和“Service Request”等選項)。我將從此文檔中的代碼 (bit.ly/spoworkmsdncode) 開始,將其提取到我的本地電腦上的 Documents\Visual Studio 2010\Projects\SPOMSDN_Workflow 目錄中。然後,將 PurchasingMgr.wsp 部署到我的本地 SharePoint 2010 開發環境中網站集的解決方案庫中(在此例中為 http://o365dpe.contoso.com/sites/spomsdnmag),然後在我的採購網站 (http://o365dpe.contoso.com/sites/spomsdnmag/purchasing) 中啟動“Purchasing Manager–Content Types and Lists”功能。

創建工作流

為了開始開發工作流,我打開本地 SharePoint 2010 開發環境網站上的採購網站,方法是打開 SharePoint Designer 2010,選擇“檔”|“網站”|“打開網站”,然後輸入我的網站 URL (http://o365dpe.contoso.com/sites/spomsdnmag/purchasing)。在“導航”窗格中,選擇“工作流”,顯示當前發佈的工作流和“工作流”功能區,如圖 1所示。


(按一下進行縮放)

圖 1 SharePoint Designer 2010 中的工作流

SharePoint Online 支援對特定清單進行操作的清單工作流、對特定網站進行操作的網站工作流,以及可在以後綁定到清單或特定內容類別型的可重用工作流。我希望能夠將我的工作流作為整體解決方案的組成部分進行分發,因此,我將創建可重用工作流,這是唯一支援分發的工作流類型。

在 SharePoint Designer 中創建工作流的方法有很多。我可以基於內置工作流(包括“審批”、“收集回饋”或“收集簽名”)使用“複製並修改”按鈕來創建工作流,可以基於 Microsoft SharePoint 工作流範本使用“從 Visio 導入”按鈕導入 Visio 2010 圖表,也可以使用功能區的“工作流”選項卡上的“新建”組從頭創建工作流。我通過按一下功能區的“新建”組中的“可重用工作流”按鈕從頭創建工作流。在“創建可重用工作流”對話方塊中,將工作流命名為“Non-Standard Business Purchase Request Approval”,然後選擇“Purchasing Manager – Non-Standard Business Purchase Request Content Type”,將工作流與內容類別型綁定,如圖 2所示。

(按一下進行縮放)

圖 2 與內容類別型綁定的可重用工作流

下一步,通過按一下“工作流”選項卡的“管理”組中的“工作流設置”,轉到“Non-Standard Business Purchase Request Approval”工作流設置頁。

在“設置”組中,選中“在狀態頁上顯示工作流視覺化”,以便向我的使用者提供每個工作流實例的即時可視狀態。我使用“啟動選項”組使其成為由人員驅動的工作流,方法是取消選中“禁用手動啟動選項”,並選中“禁用在創建/更改專案時自動啟動選項”核取方塊。通過執行相反的操作,可以創建由電腦驅動的工作流。

在很多情況下,完成工作流所需的資訊不存儲在清單或庫中。我可以收集這些資訊並將其儲存在工作流特定的變數和列中。這是通過“工作流”功能區中的“變數”組完成的,如圖 3所示。

圖 3 工作流變數

變數類型 說明
啟動表單參數 這個參數用於存儲在啟動工作流時或將工作流與清單關聯後從使用者收集的資料。
區域變數 用於存儲在處理工作流時使用的資料的私有變數。
關聯列 為保證可重用工作流的基本列集而將工作流與清單相關聯時添加到清單中的列。

在這種情況下,我需要收集啟動該工作流時的採購業務理由,以便將該資訊提供給審批者以説明他們做出決定。為此,按一下“變數”|“啟動表單參數”|“添加…”,在“添加域”對話方塊中創建一個“Business Rationale”參數;然後按一下“下一步”和“完成”。

在 SharePoint Designer 中實現工作流

此時,已準備好開始實現該工作流,因此,在“工作流設置”選項卡的“編輯組”中選擇“編輯器”工作流按鈕。現在,進入了 SharePoint Designer 2010 工作流設計器,我可以使用“工作流”功能區的“插入”組中的“條件”、“操作”和“步驟”選項實現工作流(請參見圖 4)。

(按一下進行縮放)

圖 4 工作流設計器 —“插入”部分

通過步驟可以組織工作流中的條件和操作,以及控制這些條件和操作的執行方式,如圖 5所示。

圖 5 步驟類型

步驟類型 說明
步驟 步驟用於組織工作流中的條件和操作。在執行下一步驟之前,必須完成所有條件和操作。Can be nested.
類比步驟 工作流是在以手動或自動方式啟動工作流的使用者的許可權下運行的。類比步驟中的步驟以工作流編寫者的身份執行。類比步驟只能作為工作流中的第一個步驟。在類比步驟內可以嵌套使用步驟。
並行塊 步驟添加到並行塊中之後,它們將並行運行,而不是順序運行。

例如,在圖 6中,步驟 2 以工作流編寫者的許可權執行,同時步驟 1 以啟動該工作流(手動或自動)的使用者的身份執行。步驟 5 和 6 將並存執行,而步驟 3 和 4 將循序執行。

圖 6 步驟 — 對工作流執行的影響

我的工作流中只有一個步驟。為了對條件和操作在步驟中所執行的操作進行存檔,我通過按一下文本“步驟 1”並輸入“Request Purchase Approval”來更改標題。然後,在該步驟內按一下,使游標位於需要開始添加操作和條件的位置。

操作在工作流內執行,可能包括啟動審批流程、修改清單項、發送電子郵件等。有關所支援的操作的完整清單,請參閱 SharePoint Designer 2010 參考 (bit.ly/spd2010act)。對於此方案,需要為採購請求啟動審批流程,因此,我從功能區的“插入”部分選擇“操作”下拉清單,然後選擇“Start Approval Process”。此操作向設計器中添加一個帶超連結的句子,這樣,通過選擇每個連結並提供更多資訊可以完成該操作,如圖 7所示。

圖 7 添加啟動審批流程操作

通過按一下“Approval”連結,可以自訂審批任務,包括更改任務的處理方式和任務結果。通過按一下“後退”按鈕,可以返回到編輯器。按一下“these users”連結可以自訂任務和指定參與審批流程的人員。在“選擇任務流程參與者”對話方塊中,選擇“審批者”組作為參與者並設置任務標題,如圖 8所示。在“說明”中,需要提供有關該項和業務理由的詳細資訊,以説明審批者做出決定。例如,要包括清單項標題,則按一下“添加或更改查找”按鈕,選擇“當前項”作為資料來源,選擇“標題”作為源域。

圖 8 自訂審批任務

最後的任務如圖 9所示。

圖 9 自訂的審批任務

在工作流執行到此處時,該工作流會暫停,直到任務批准或拒絕,或者任務過期(如果提供了到期日期)。為了控制工作流,我將使用條件。

條件基於工作流變數或域中的值來控制工作流的邏輯。例如,如果該項已獲批准,則需要向請求者發送電子郵件,如果請求類型是“Travel”則創建一個網站。如果該項被拒絕,則需要發送電子郵件並將該項刪除。為此,將游標放在審批流程下麵,按一下“條件”下拉清單,然後選擇“If any value equals any value”。按一下“value”超連結,然後按一下顯示的按鈕以顯示“定義工作流查找”對話方塊。對於“資料來源”,選擇“工作流變數和參數”;對於“源中的域”,選擇“Variable: IsItemApproved.此變數將在添加“Start Approval Process”任務時添加到工作流。

然後,按一下等於連結,從顯示的下拉清單中選擇等於項。下一步,按一下值連結,從下拉清單中選擇“Yes”。我在此條件下放置一個 Else-If 塊,這樣就可以在此項被拒絕時執行操作。向每個分支添加“發送電子郵件”操作,使用字串生成器設置電子郵件標題,如圖 10所示。

圖 10 批准電子郵件

下一步,在 If 條件下添加一個“If current item field equals value”條件,使其基於 RequestType 欄位,如果請求是旅行請求則創建一個新的子網站。設計器現在如圖 11所示。

圖 11 工作流的條件流

為了針對旅行請求創建網站,需要創建一個自訂工作流操作,因為 SharePoint Designer 2010 中沒有內置此操作。為此,保存我的工作流,關閉 SharePoint Designer 2010,然後打開 Visual Studio 2010。

在 Visual Studio 2010 中構建自訂工作流操作

可以使用 Visual Studio 2010 和沙箱解決方案向 SharePoint Designer 2010 添加自訂工作流操作。這些操作可以完成可在沙箱解決方案中完成的任何任務,這為 SharePoint Online 工作流提供了很大的靈活性。

在 Visual Studio 2010 中,選擇“檔”|“新建專案”;在“新建專案”對話方塊中,選擇 SharePoint 2010 範本和“空白 SharePoint 範本”。輸入“PurchasingMgrActions”作為名稱,輸入“Documents\Visual Studio 2010\Projects\SPOMSDN_Workflow\”作為位置,然後按一下“確定”。在 SharePoint 自訂嚮導中,輸入我的本地開發網站 (http://o365dpe.contoso.com/sites/spomsdnmag/purchasing),選擇“部署為沙箱解決方案”,然後按一下“完成”。

在解決方案資源管理器中,按右鍵 PurchasingMgrActions 專案,選擇“添加”|“類…”,指定類 CreateSiteAction,然後按一下“確定”。CreateSiteAction 類提供了工作流創建新網站需要調用的方法。添加必要的 using 語句並實現 CreateSite 方法,如圖 12中的定義。

圖 12 實現 CreateSite 方法

using System;

using System.Collections;



using Microsoft.SharePoint;

using Microsoft.SharePoint.UserCode;



namespace SPDCustomWorkflowActions

{

  public class CreateSiteActivity

  {

    public Hashtable CreateSite(SPUserCodeWorkflowContext context, string siteName)

    {

      Hashtable results = new Hashtable();

      try

      {

        using (SPSite site = new SPSite(context.CurrentWebUrl))

        {

          using (SPWeb web = site.OpenWeb())

          {

            web.Webs.Add(

              siteName,

              "Trip Report: " + siteName,

              string.Empty,

              1033,

              "STS",

              false,

              false);

          }

        }

                

        results["success"] = true;

        results["exception"] = string.Empty;

      }

      catch (Exception e)

      {

        results = new Hashtable();

        results["exception"] = e.ToString();

        results["success"] = false;

      }



      return results;

    }

  }

}

CreateSite 方法遵循自訂操作的方法簽名,它傳入 SPUserCodeWorkflowContext 以提供對工作流運行上下文和所需所有其他參數(在本例中,即要創建的網站的名稱)的訪問。 該方法通過該上下文訪問網站集 (SPSite) 和網站 (SPWeb),並通過 SPWeb.Webs.Add 方法創建新網站。 結果是通過 Results Hashtable 變數返回的。

為了將 CreateSiteAction 添加到“操作”下拉清單,需要使用 My 功能部署 Elements.xml 檔,以便向 SharePoint Designer 2010 描述該操作。 將此檔添加到專案中,方法是在解決方案資源管理器中選擇 PurchasingMgrActions 專案,按右鍵並選擇“添加”|“新建項…”,然後在“已安裝的範本”下選擇 SharePoint 2010 並選擇空元素範本。 將該項命名為 CreateSiteActionDefinition,然後按一下“確定”。 通過在 WorkflowActions 元素中實現一個 Action 元素,可以完成此定義,如圖 13所示。

圖 13 通過 Elements.xml 定義創建網站操作

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <WorkflowActions>

    <Action Name="Create Site"

                      SandboxedFunction="true"

                      Assembly="$SharePoint.Project.AssemblyFullName$"

                      ClassName="PurchasingMgrActions.CreateSiteAction"

                      FunctionName="CreateSite"

                      AppliesTo="all"

                      UsesCurrentItem="true"

                      Category="Purchasing Manager Workflow Actions">

      <RuleDesigner Sentence="Create Site with name %1 (exceptions logged to %2)">

        <FieldBind Field="siteName" Text="Site Name" Id="1" DesignerType="TextBox" />

        <FieldBind Field="exception" Text="Exception" Id="2" 

          DesignerType="ParameterNames" />

      </RuleDesigner>

      <Parameters>

        <Parameter Name="__Context"

                      Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext,

                        Microsoft.SharePoint.WorkflowActions"

                      Direction="In"

                      DesignerType="Hide" />

        <Parameter Name="siteName"

                      Type="System.String, mscorlib"

                      Direction="In"

                      DesignerType="TextBox"

                      Description="Name of the site to create" />

        <Parameter Name="exception"

                      Type="System.String, mscorlib"

                      Direction="Out"

                      DesignerType="ParameterNames"

                      Description="Exception encountered"/>

      </Parameters>

    </Action>

  </WorkflowActions>

</Elements>

Action 元素及其特性描述在工作流中執行操作時將調用的程式集、類和方法。在本例中,它將調用 CreateSiteAction.CreateSite 方法。RuleDesigner 元素及其 FieldBind 元素定義將在工作流設計器中顯示的句子,以及該句中顯示為超連結的域的名稱和類型。Parameters 元素及其 Parameter 子元素定義 RuleDesigner\FieldBind 元素傳入到對 CreateSiteAction.CreateSite 的調用和從該調用傳出的方式。例如,__Context 參數的類型為 WorkflowContext,用於將該上下文傳遞到該調用中而顯示在設計器中(通過將 DesigerType 特性設置為“Hide”)。siteName 參數將接收 siteName 域綁定中的值。這是通過為域和參數指定相同名稱完成的。出於相同原因,異常將通過異常參數傳遞出來並傳遞到異常域中。

在測試自訂操作之前,打開 Feature1,為它提供標題“Purchasing Manager Workflow Actions”使其更具說明性,然後根據需要,通過自訂工作流操作將其範圍更改為“網站”。

將工作流解決方案部署到 SharePoint Online

為了測試我的自訂工作流操作,我將在解決方案資源管理器中按右鍵 PurchasingMgrActions 專案,然後選擇“打包”,將該解決方案打包。然後,將 PurchasingMgrActions.wsp 上載到本地開發網站集 (http://o365dpe.contoso.com/sites/spomsdnmag) 中的解決方案庫以部署自訂工作流操作。

現在,當我打開 SharePoint Designer 2010,在工作流編輯器中打開我的“Non-Standard Business Purchase Request Workflow Approval”工作流時,我的自訂工作流操作會顯示在“操作”下拉式功能表中的“Purchasing Manager Workflows”類別下,如圖 14所示。

圖 14 工作流設計器中的創建網站自訂操作

將 Site Name 變數設置為 Current Item:Title 後,我的工作流就完成了,並準備好進行測試(請參見圖 15)。

圖 15 已完成的工作流

為了準備進行測試,我需要將該工作流發佈到本地開發網站,將它與我的清單相關聯。發佈時,在功能區的“保存”部分選擇“發佈”。發佈完成後,導航到本地開發網站上的“Non-Standard Business Purchase Requests”清單,按一下“清單”選項卡,然後在功能區的“設置”部分選擇“工作流設置”。在“這些工作流配置為在此類型的專案上運行”下麵,選擇“Purchasing Manager – Non-Standard Business Purchase Requests”,然後選擇“添加工作流”連結。選擇“Non-Standard Business Purchase Request Approval”工作流作為範本,將該工作流命名為“Non-Standard Business Purchase Approval”,然後依次按一下“下一步”和“保存”。

此時,就可以運行工作流了。選擇清單中的第一項,在功能區的“工作流”部分選擇“工作流”,然後按一下“Non-Standard Business Purchase Approval”工作流將其啟動。然後,系統會提示輸入在 Business Rationale 啟動表單參數中指定的業務理由。

我會提供一個理由(如此處所示),然後按一下“啟動”以啟動該工作流。然後,我可以進入到該項的“工作流”頁,選擇正在運行的工作流以查看“工作流資訊”頁,此頁提供工作流的視覺化資訊。任務獲批後,圖表會進行更新,如圖 16所示。


(按一下進行縮放)

圖 16 提供視覺化資訊的“工作流資訊”頁

然後,可以轉到“網站操作”|“查看所有網站內容”,查看通過我的自訂工作流操作創建的網站。

現在,我已準備好將工作流解決方案分發到 SharePoint Online。為了獲取我的“Non-Standard Business Purchase Request”工作流的套裝程式檔,我在 SharePoint Designer 2010 中打開工作流,從功能區的“管理”部分選擇“另存為範本”選項,將工作流保存到網站資產庫。然後,可以從網站資產庫獲取套裝程式檔 PurchasingMgr.wsp(如果已部署,則可以修改現有清單)、PurchasingMgrActions.wsp 和 Non-Standard Business Purchase Request Approval.wsp,將它們上載到我的 SharePoint Online 網站集中的解決方案庫中。請注意,必須根據功能間的依賴關係,按順序啟動這些功能(可通過功能啟動依賴關係自動進行)。在我的網站中啟動該工作流功能並將工作流與我的清單相關聯後,可以按相同的步驟在 SharePoint Online 中測試該工作流。

總結

在 SharePoint Online 中通過工作流將業務流程自動化,會使協作更加有效,而不僅僅是在 SharePoint Online 中存儲資訊。在本文中,我演示了如何在 SharePoint Designer 2010 中實現一個工作流,通過一個使用 Visual Studio 開發的自訂工作流操作對該工作流加以擴展,然後通過由 SharePoint Designer 2010 和 Visual Studio 2010 創建的套裝程式檔分發該工作流。建議您深入探究 SharePoint Online 中的工作流開發。通過 SharePoint Online 工作流自動執行,容易出錯的人工業務流程會變得更加輕鬆和高效,給使用者帶來不一般的體驗。

Chris Mayo 是一位致力於研究 SharePoint Online 的技術專家,他在 Microsoft 已工作 10 年。他參與編寫了“Programming for Unified Communications with Microsoft Office Communications Server 2007 R2”(Microsoft Press, 2009)。在加入 Microsoft 之前,他曾在多家零售和金融領域的《財富》500 強企業的 IT 部門中擔任過開發人員和架構師。您可以通過 Mayo 的博客瞭解其最新消息,位址為blogs.msdn.com/b/cmayo

衷心感謝以下技術專家對本文的審閱:Mark Kashman、Keenan Newton、AJ MayGeorge Durzi