逐步完成使用 Microsoft Visual Studio 2012 创建工作流 SharePoint 外接程序的过程。
注意
自 2020 年 8 月 1 日起,SharePoint 2010 工作流已对新租户停用,并于 2020 年 11 月 1 日从现有租户中删除。 如果你使用的是 SharePoint 2010 工作流,我们建议迁移到 Power Automate 或其他支持的解决方案。 有关详细信息,请参阅 SharePoint 2010 工作流停用。
先决条件
若要使用此开发方案,需要已安装并配对 SharePoint 场和工作流管理器 1.0 场。 这两个场可以位于相同或不同的服务器计算机上。 若要使用此开发方案,还需要远程执行工作流开发(即在与上述两个服务器计算机不同的计算机上执行),并使用 Microsoft Visual Studio 2012 或更高版本。
- 在服务器平台上:
- Windows Server 2008 R2。
- Microsoft SharePoint
- 工作流管理器 1.0
- 开发平台:
Microsoft Visual Studio 2012 或更高版本。
Visual Studio 2013 的 Office 开发人员工具。
注意
仅在使用 Visual Studio 2012 时,才需要使用 Visual Studio 2013 的 Office 开发人员工具。 更高版本的 Visual Studio 随附 Office 开发人员工具。
若要了解如何设置和配置 SharePoint 工作流开发环境,请参阅以下内容:
入门
业务设置中的一种常见工作流应用场景是文档审阅和审批流程。 在此演练中,我们创建了 SharePoint 外接程序,可使用 SharePoint 工作流自动化文档的传送、通知和批准(或拒绝)。 我们在 Microsoft Visual Studio 2012 中使用 SharePoint 工作流设计器创建此工作流。
以下是一个流程图,描述了我们将创建的工作流的过程。
图 1. 显示文档审批工作流的流程图。
总的来说,工作流执行以下操作:
- 与特定文档库相关的文档更改事件启动工作流实例。
- 如果文档状态设置为"可供审阅",工作流会向预先安排的审阅者分配一项任务,然后向审阅者发送关于任务的电子邮件通知。
- 如果审阅者未能批准文档,文档文件将保留在草稿文档库中;但是,文档状态会设置为“已拒绝”。
- 如果审阅者批准了文档,工作流会将文档复制到已发布文档库中。 原始文件保留在草稿文档库中,但状态设置为"已发布"。
重要
启动此演练之前,请确保正确安装并配置了工作流开发环境。 有关详细信息,请参阅 准备设置和配置 SharePoint 工作流开发环境。 此外,还请确保有可以对其开发工作流的 SharePoint 实例。 有关详细信息,请参阅 安装 SharePoint。
准备环境
第一步是为我们的 SharePoint 网站准备工作流将使用的文档库。
启动 Visual Studio 2012,并使用“SharePoint 相关应用”模板新建项目,如图 2 所示。
注意
在此演练中,解决方案文件的名称为“DocApprovalWorkflow1”。 建议您使用相同的名称。 但是,如果您将解决方案命名为不同名称,请务必遵循指示进行必要的调整。
图 2. 在 Visual Studio 2012 中创建新项目
在您的相关 SharePoint 网站上,通过执行以下操作创建两个新文档库:
- 在"解决方案资源管理器"中,右键单击"DocApprovalWorkflow1"图标,然后依次选择"添加">"新项目"和"列表"。
- 在生成的“SharePoint 自定义向导”中,在名称字段中输入“草稿文档”;然后,在第一个单选按钮下的下拉菜单中选择“文档库”,如图 3 所示。
- 单击"下一步",采用默认设置,然后单击"完成"。
图 3. 列表设置的 SharePoint 自定义向导。
使用如上所述的相同步骤创建第二个文档库,但将此第二个库命名为“已发布文档”。
向创建的 两个 新文档库添加两个自定义列:
- 创建名称为"审批者"的自定义列,并将其设置为"用户或用户组"列表列类型。
- 创建名为“文档状态”的自定义列,并将它设置为“选项列表”列类型(见图 4)。
在“文档状态”列中,通过展开属性网格中的Type 属性添加 5 个选项,然后单击 Items 属性上的省略号按钮(…)。 Enter the choice values in the dialog box that appears, as shown in Figure 4.
- 正在创作草稿
- 可供审阅
- 已批准发布
- 已拒绝
- 已发布
创建基本工作流
现在,我们准备好创建工作流本身。
在 Visual Studio 中,右键单击"DocApprovalWorkflow1"图标(在"解决方案资源管理器"中),选择"添加">"新项目",然后选择"工作流",以创建新工作流(参见图 5)。
图 5. “添加新项 > 工作流”向导。
提示后,将工作流命名为"DocumentApprovalWorkflow",并选择"列表工作流"作为工作流类型(参见图 6)。
图 6. 指定工作流名称和类型。
在"SharePoint 自定义向导"中,将新工作流与草稿文档库相关联;然后,选择创建新历史记录列表和新工作流任务列表,如图 7 所示。 然后单击下一步。
图 7. 为新工作流完成 SharePoint 自定义向导。
将工作流设置为在草稿文档库中的项发生变化时自动启动。 您也可以将手动启动工作流的复选框保留选中状态;这样,您无需更改文档即可轻松测试工作流。 请参见图 8。
图 8. 设置工作流的激活参数。
注意
可以结合使用属性网格和“解决方案资源管理器”中的选定工作流(见图 9),在创建工作流后更改工作流关联类型。 然后,单击“完成”。
图 9. 工作流属性网格。
最后,将 SharePoint Server 配置为使用 SMTP 服务管理传出电子邮件。 有关说明,请参阅 为 SharePoint 场配置传出电子邮件。 若要允许工作流发送与工作流任务相关的电子邮件通知,则需要执行此操作。
实现工作流逻辑
现在,我们已设置 SharePoint Server 并创建基本工作流,可以开始设计工作流逻辑。
通过双击"解决方案资源管理器"中的工作流项目项,打开工作流设计器。 你将看到工作流设计器界面(和工作流工具箱);设计器中填充了一个名为 Sequence 的初始工作流程阶段。
Our first step is to grab the LookupSPListItem activity from the toolbox (see Figure 10) and drop it in the Sequence stage on the designer surface. We use this activity to get the status of the document at any given time, which the LookupSPListItem activity returns as a DynamicValue object that contains a set of SharePoint list item properties as key-value pairs.
图 10. LookupSPListItem 活动选择器。
若要配置"LookupSPListItem"活动,首先在设计器中单击该活动以进行选择。 此操作会激活活动的属性网格。
使用属性网格中的组合框配置"LookupSPListItem"活动,以使用" 当前项目"作为"ItemId"及使用"当前列表"作为"ListId",如图 11 所示。
图 11. 配置 LookupSPListItem 属性。
在"LookupSPListItem"活动图块中,单击"获取属性"链接。 此操作会为您完成两个重要步骤:
- 首先,会创建一个 DynamicValue 类型的变量,并将其绑定到LookupSPListItem 活动的输出参数(名称为 Result)。 Properties of the list item are stored in this variable.
- Second, it adds a new activity named GetDynamicValueProperties (see Figure 12) and sets the newly created DynamicValue variable as the in-argument of this new activity. This activity lets you extract the list item properties from the DynamicValue variable.
在“GetDynamicValueProperties”活动中,单击“定义…”打开对话框,您可以从中选择想要提取的属性。 在选择属性过程中,请参阅图 12,其中显示了一部分与打开的“属性”对话框合并的设计器图面。
图 12. 选择想要提取的 DynamicValue 属性。
对于"实体类型",选择"草稿文档列表项"。
在数据网格的“路径”列中,单击“创建属性”以打开组合框,其中包含草稿文档库中列表项的可用属性。 从组合框选择“文档状态”。
在数据网格的下一行中,再次单击“创建属性”;这次,从组合框选择“审批者”。
现在,单击对话框中的"填充变量"链接。 此操作会为每行创建一个适当数据类型的变量,并在数据网格的"分配到"列中进行分配,如图 13 所示。
图 13. 获取文档状态和审批者属性。
我们现在已有所需的列表项值。 下一步是设置工作流以检查文档是否"可供审阅",并在文档可供审阅的情况下采取适当操作。
From the toolbox, drag the If activity onto the workflow designer surface. (You'll find the If activity in the Control Flow section of the toolbox.)
将“If”条件设置为“
DocumentStatus.Equals("Ready for Review")
”,如图 14 所示。图 14. 创建 If/Then 语句以触发任务。
Next, from the SP - Task section of the toolbox, drag a SingleTask activity and drop it in the Then box of your If activity. 实际上,已将工作流配置为,如果文档可供审阅,则完成此任务。
下一步是使用配置对话框配置刚刚创建的任务,如图 15 所示。
图 15. 任务配置对话框。
首先,我们将任务分配给审批者。 为此,单击"SingleTask"活动图块中的"配置"链接。
将"分配到:"字段设置为"审批者"。
请注意,"任务标题:"字段自动填充为"工作流任务"。
在“正文:”字段中,输入有关指示审批者的消息,如“请审阅此文档以批准发布”。
单击"确定"以保存。
Notice that at this point you have a validation error on the SingleTask activity. With the SingleTask tile selected, look at the AssignedTo property in the property grid and note that it has an error icon. Hover over the property name to see a tooltip that describes the problem. We see that the AssignedTo property expects a String value; however, the Approver variable is of Int32 data type.
若要更正此错误,请在属性网格上的“AssignedTo”行中,将“.ToString()”附加到“Approver”,将变量转换为 String 数据类型,如图 16 所示。
图 16. 在属性网格中将“审批者”变量转换为字符串数据类型。
直至此演练当前,你已创建并配置了工作流任务,该任务执行了两项操作:设置对文档进行审阅,同时向任务受理人(在本例中为“审批者”)发送了一封电子邮件,通知其任务已分派并等待进行操作。
让我们看一看"SingleTask"活动的属性网格。 滚动到属性网格的底部,注意在"输出"部分中有"Outcome"和"TaskItemId"两个属性,它们是输出参数。
Note the name of the Outcome variable: outcome_0 (or similar). We use this variable to check the outcome of the task - that is, whether the approver has approved or rejected the document.
注意
Outcome 的输出参数返回对应于结果索引的 Int32 值,即 0 表示“已批准”,1 表示“已拒绝”。 名为“任务结果”的现成 SharePoint 网站栏以默认值的形式提供这些整数。
现在,为了让工作流能够查看任务结果,需要再添加一个 If 活动,并将它置于“SingleTask”活动后,但仍位于“Then”区域内,如图 17 所示。 Setting the If condition to "
outcome_0 == 0
" tells us whether the document was approved.图 17. 添加 IF 活动以查看任务状态。
如果审批者已将任务设置为"已批准",则将文档状态更新为"已批准发布",然后将文档文件复制到已发布文档库。 相反,如果审批者拒绝了文档,则需要将文档状态设置为“已拒绝”。
在此新 If 活动中,将“UpdateListItem”活动拖到“Then”框中。
在"UpdateListItem"活动的属性网格中进行配置,从而将"ItemId"设置为"(current item)"及将"ListId"设置为"(current list)",如图 18 所示。
接下来,在选择了 UpdateListItem 活动的情况下,单击属性网格中 ListItemPropertiesDynamicValue 字段旁边的省略号按钮(…)。 此操作会打开一个对话框,您可以在对话框中指定想要更新的列表项属性。
图 18. 设置要更新的列表项属性。
在对话框中,首先使用组合框将"实体类型"设置为"草稿文档列表项"(如图 18 所示)。 然后,在数据网格中,单击“ 创建属性” ,然后从下拉列表中选择“文档状态”。然后,在 “值 ”列下,键入“已批准发布” (包括引号) 并单击“ 确定”。
在当前 If 活动的“Then”区域中,将“CopyItem” 活动拖放到“UpdateListItem”活动的正下方,如图 19 所示。
图 19. 将 CopyItem 活动添加到工作流中。
然后,在属性网格中配置“CopyItem”活动的属性,如图 20 所示。 属性值已突出显示。
图 20. 配置 CopyItem 活动。
注意
为了实现此演练的目的,我们将假定所有已发布文档来自草稿文档库;因此,我们无需担心对重复文件名称的控制。
最后,需要添加一个活动,处理审阅者拒绝文档的情况。 We do this by adding an UpdateListItem activity to the Else area of our current If activity. Configure this UpdateListItem activity just as you did the prior one in step 9(c), except that now we want to set the document status to "Rejected," as shown in Figure 21.
图 21. 为已拒绝文档配置 UpdateListItem 活动的属性。
这样就完成了"创建 SharePoint 文档审批工作流"。完整的工作流显示在图 22 中。
图 22. 完整的 SharePoint 文档审批工作流。
打包和部署工作流
以下资源提供了有关将工作流打包并部署为 SharePoint 外接程序的指南:
- 部署和安装 SharePoint 应用程序:方法和选项
- 发布 SharePoint 应用程序
- 如何:在沙盒解决方案中创建和部署声明性工作流(使用 SharePoint Designer 2013)
警告
可通过将应用程序包的 workflowmanifest.xml
文件中的以下标记更改为 true,来区分包含集成工作流(可与父 Web 上的列表相关联)的 SharePoint 外接程序与普通工作流应用程序:
<SPIntegratedWorkflow xmlns="http://schemas.microsoft.com/sharepoint/2014/app/integratedworkflow">
<IntegratedApp>true</IntegratedApp>
</SPIntegratedWorkflow>