向 SharePoint 托管的 SharePoint 加载项添加工作流
这是关于开发 SharePoint 托管的 SharePoint 外接程序的基础知识系列文章中的第 6 篇文章。你应该首先熟悉SharePoint 外接程序以及本系列中之前的文章,可在开始创建 SharePoint 托管的 SharePoint 外接程序 | 后续步骤中找到相关内容。
注意
建议将 Microsoft Power Automate 用于应用和流程自动化。 从 Visual Studio 2022 开始,工作流模板已从 SharePoint 外接程序项目中删除。 有关详细信息,请参阅指南:从经典工作流迁移到 SharePoint 中的 Power Automate 流
提示
如果已完成有关 SharePoint 托管加载项的本系列文章之一,便已生成 Visual Studio 解决方案,可以在继续阅读本主题的过程中使用。 也可以从 SharePoint_SP-hosted_Add Ins_Tutorials 下载存储库,再打开 BeforeWorkflow.sln 文件。
本文将介绍如何向“员工入职培训”SharePoint 加载项添加工作流,以通知人力资源 (HR) 部门有新员工已准备好填写 HR 书面材料。
向加载项添加工作流
在“解决方案资源管理器”中,右键单击项目,再依次选择“添加”>“新文件夹”。 将文件夹命名为“工作流”。
右键单击新文件夹,再依次选择“添加”>“新项”。 此时,“添加新项”对话框打开,并展开“Office/SharePoint”节点。
选择“工作流”,并将它命名为“HR_Intake”。 如果向导提示选择工作流类型,请依次选择“列表工作流”和“下一步”。
在向导的下一页上,启用“是,关联...”选项,并将下拉控件设置为下列值:
- 要与工作流关联的库或列表:西雅图新员工
- 历史记录列表:
<create new>
- 任务列表:
<create new>
选择“下一步”。
在向导的最后一页上,仅启用在某项更改时自动启动工作流的选项。
选择“完成”。
然后,Visual Studio 的 Office 开发人员工具执行下列操作:
- 在“工作流”文件夹中创建“HR_Intake”工作流,以及在工作流设计器中打开的子 Workflow.xaml 文件。
- 创建“WorkflowTaskList”列表实例(在其中创建和更新工作流任务)。
- 创建“WorkflowHistoryList”列表实例,其中记录了每次执行工作流时发生的各个步骤。
设计工作流
工作流会发送电子邮件,通知 HR 人员新员工已完成入职培训的“了解如何构建”阶段,并已准备好填写 HR 新聘员工书面材料。 如果“西雅图新员工”列表中的现有项发生任何变化,都会触发此工作流,但只有当列表项的“入职培训阶段”字段设置为“HR 书面材料”时,此工作流才会执行操作。 如果是,将会向 HR 人员发送电子邮件,并将相应员工的任务添加到“WorkflowTaskList”中。
注意
在设计工作流时的不同时间,带有感叹号的蓝色菱形符号 (带有 。) 将显示在工作流设计器中的一个或多个项上。 这些表示出现临时错误。 (将光标悬停在符号上以查看简短消息,或在 Visual Studio 错误列表中 查看详细信息。) 这些是工作流不完整的副作用。 完成此过程时,这些符号应该会全部消失。
在 Visual Studio 中,打开“工具箱”窗格,展开“SP - 列表”节点,再将“LookupSPListItem”拖到设计器的“序列”中。
选择“LookupSPListItem”,让它的属性出现在 Visual Studio 的“属性”窗格中。 将下图中的属性设置为下列值:
- ItemID:(当前项)
- ListId:(当前列表)
- DisplayName:LookupCurrentNewEmployee
此时,“属性”窗格应如下所示:
图 1. LookupSPListItem 的“属性”窗格
选择窗格外的任意位置,以保存更改。 此时,设计器图面应如下所示:
图 2. 工作流设计器中的序列
选择设计器中(重新命名的)“LookupCurrentNewEmployee”活动内的“获取属性”链接。 这会将“GetDynamicValueProperties”活动添加到序列中。
在 GetDynamicValueProperties 活动中选择“定义...”文本。 这会打开“属性”对话框。
将“实体类型”设置为“列表项”list_instance_name,其中list_instance_name为“西雅图的新员工”。
在“路径”列中,选择最上面的单元格,再从下拉列表中选择“入职培训阶段”。
选择它下面的单元格,再从下拉列表中选择“员工”。
选择“填充变量”。 这会创建名为“OrientationStage”和“Title”的变量,并分配“西雅图新员工”列表中当前项内相应字段的各个值。 此时,“属性”对话框应如下所示:
选择“确定”。 此时,设计器图面应如下所示:
图 4. 工作流设计器
在 Visual Studio 中,打开“工具箱”窗格,展开“控制流”节点,再将“If”拖到“GetDynamicValueProperties”下方的“序列”底部。
在“If”的“条件”框中,输入“OrientationStage=="HR paperwork"”。
在 Visual Studio 中,打开“工具箱”窗格,展开“SP - 实用工具”节点,再将“Email”拖到“If”活动的“Then”框中。
选择“Email”活动。 在“属性”窗格中,设置“Body”、“Subject”和“To”属性的值。 在每种情况下,选择属性的标注按钮 .. .. ,并使用打开的 表达式编辑器 设置属性的值,如下表所示。 由于这些是 C# 字符串表达式,因此请严格按照下表所示使用引号。 此处的
Title
是之前分配给列表项的“Title”字段的变量(包含员工姓名)。- 身体:
Title + " is waiting in the lobby to fill out benefits and employment forms."
- 主题:
Title + " is ready for HR paperwork"
- 自:
new System.Collections.ObjectModel.Collection<string>() {"your_O365_email"}
将占位符 your_O365_email 替换为登录 Office 365 开发人员帐户时使用的标识(如
*alias*@*O365domain*.sharepoint.com
)。 由于这是 C# 字符串,因此两边必须有引号。- 身体:
在 Visual Studio 中,打开“工具箱”窗格,展开“运行时”节点,再将“TerminateWorkflow”拖到“If”活动的“Else”框中。
选择“TerminateWorkflow”活动,并在“属性”窗格中将“Reason”设置为
"Not at HR paperwork stage."
(含引号)。 此时,设计器应如下所示:图 5. 工作流完成时的工作流设计器
运行并测试加载项
使用 F5 键部署并运行外接程序。 Visual Studio 在测试 SharePoint 网站上临时安装并立即运行此加载项。 工作流管理器的“测试服务主机”控制台也随即打开。
在加载项的默认页面打开后,打开某一项进行编辑,并将“入职培训阶段”的值设置为“HR 书面材料”。
“测试服务主机”控制台中指明工作流已启动。 很快就又指明工作流已完成。 示例如下:
图 6. 测试服务主机控制台
注意
如果“测试服务主机”控制台未打开,您可能需要启用工作流调试。 右键单击“解决方案资源管理器”中的项目名称,再选择“属性”。 打开“属性”窗格上的“SharePoint”选项卡,再选中“启用工作流调试”复选框。
转到 Office 365 开发人员帐户的电子邮件收件箱 (Outlook)。 其中有一封主题为“员工已准备好填写 HR 书面材料”的电子邮件(其中,员工是已编辑其项的员工姓名)。 电子邮件正文显示“员工 正在大厅等待填写福利和就业表单。下面是一个示例:
图 7. 工作流发送的电子邮件
提示
如果工作流开始而永未完成,则不会发送电子邮件。请尝试结束调试会话,并再按 F5 几次,然后才能确定代码是否有错。 有时,问题会出在 SharePoint Online 上。 如果问题仍未解决,请尝试向 schema.xml 文件的“ContentTypes”部分添加“ListFieldsContentType”内容类型(如果还没有的话)。 下面的示例展示了标记:
<ContentType ID="0x0100781dd48170b94fdc9706313c82b3d04c" Name="ListFieldsContentType" Hidden="TRUE"></ContentType>
将“NewEmployee”内容类型的整个“FieldRefs”部分复制到这一新内容类型。 保存项目,然后撤回并再按 F5。
若要结束调试会话,请关闭浏览器窗口或停止在 Visual Studio 中进行调试。 每次按 F5,Visual Studio 都会撤回旧版加载项并安装最新版本。
将在其他文章中使用此加载项和 Visual Studio 解决方案,因此最好在使用一段时间后,再最后撤回一次加载项。 在“解决方案资源管理器”中,右键单击此项目,再选择“撤回”。
后续步骤
本系列的下一篇文章将介绍如何向 SharePoint 托管 SharePoint 加载项添加自定义页面和样式。