练习 - 编写自定义工作流扩展
通常,需要对 Microsoft Dataverse 数据执行日期格式设置。 虽然 Power Automate 公开了本流程的一些功能,但是偶尔也可以生成自定义的工作流扩展来实现这个目标(例如,如果逻辑需要在您的环境中同步运行)。
练习 1:创建自定义活动
在本练习中,您将创建自定义活动,该活动会将日期时间转换为用户本地时间,将其格式化为“2019 年 12 月 25 日,星期一”,并将格式化后的值作为字符串发布给自定义活动的使用者。
每个练习都包括应用场景和学习目标。 应用场景描述了练习的目的,同时列出了目标并具有要点。
任务 1:创建自定义活动
启动 Visual Studio 2019。
选择文件 > 新建 > 项目。
选择类库 (.NET Framework),然后选择下一步。
在项目名称字段中输入 WorkflowActivities,在框架下拉菜单中选择 .NET Framework 4.6.2,然后选择创建。
右键单击 Class1.cs,然后选择删除。
右键单击项目,然后选择管理 NuGet 软件包。
选择浏览选项卡,搜索并选择 Microsoft.CRMSDK.CoreAssemblies,然后选择安装。
如果您同意条款,请选择我接受。
搜索并选择 Microsoft.CRMSDK.Workflow,然后选择安装。
如果您同意条款,请选择我接受。
右键单击项目,选择添加,然后选择类。
在名称字段中输入 ConvertFormatDatetime,然后选择添加。
如下所示将 using 语句添加到该类中,然后将其公开。
using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Workflow; using System.Activities;
从 CodeActivity 继承并实施抽象成员。 本操作将覆盖继承类的 Execute 方法。
将以下代码片段添加到该类中。 这将添加日期时间类型的必需输入参数和字符串类型的输出参数。
[RequiredArgument] [Input("DateTime input")] public InArgument<DateTime> DateToEvaluate { get; set; } [Output("Formatted DateTime output as string")] public OutArgument<String> FormattedDateTimeOutput { get; set; }
用以下代码片段替换 NotImplementedException。
IWorkflowContext workflowContext = context.GetExtension<IWorkflowContext>(); IOrganizationServiceFactory serviceFactory = context.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(workflowContext.UserId);
获取输入日期时间。 将以下代码片段添加到 Execute 方法中。
DateTime utcDateTime = this.DateToEvaluate.Get(context);
检查输入日期时间是否为 UTC,如果不是,将其转换为 UTC。 将以下代码片段添加到 Execute 方法中。
if (utcDateTime.Kind != DateTimeKind.Utc) { utcDateTime = utcDateTime.ToUniversalTime(); }
Execute 方法现在应该类似于下图。
任务 2:获取用户设置并将日期时间转换为用户本地日期时间
获取用户设置实体的用户 TimeZoneCode。 将以下代码片段添加到 Execute 方法中。
var settings = service.Retrieve("usersettings", workflowContext.UserId, new ColumnSet("timezonecode") );
通过提供从输入中获得的 Utc 时间和从用户设置中获得的 TimeZoneCode 来构建时区更改请求。
LocalTimeFromUtcTimeRequest timeZoneChangeRequest = new LocalTimeFromUtcTimeRequest() { UtcTime = utcDateTime, TimeZoneCode = int.Parse(settings["timezonecode"].ToString()) };
运行时区更改请求。
LocalTimeFromUtcTimeResponse timeZoneResponse = service.Execute(timeZoneChangeRequest) as LocalTimeFromUtcTimeResponse;
格式化时区响应中的 LocalTime,并将其设置为活动的输出。
this.FormattedDateTimeOutput.Set(context, String.Format("{0:f}", timeZoneResponse.LocalTime));
您的类现在应如下图所示。
右键单击该项目并选择属性。
选择签名选项卡,选择签名程序集复选框,并在选择强名称密钥文件下拉菜单中选择新建。
在密钥文件名字段中输入 contoso.snk,清除使用密码保护我的密钥文件复选框,然后选择确定。
构建项目,并确保构建成功。
练习 2:注册和使用
在本练习中,您将注册工作流活动,创建并准备解决方案,创建工作流,然后测试工作流和自定义活动。
任务 1:注册工作流活动
转到 Dynamics 365 SDK 文件夹,打开 PluginRegistration 文件夹。
双击 PluginRegistration.exe。
选择创建新连接。
选择 Microsoft 365、提供凭据,然后选择登录。
选择注册,然后选择注册新程序集。
选择浏览。
浏览到 WorkflowActivities 项目的调试文件夹,选择 WorkflowActivities.dll,然后选择打开。
选择注册所选插件。
选择确定。
任务 2:创建和准备解决方案
转到 https://make.powerapps.com并确保未选择默认环境。
选择解决方案,然后选择新建解决方案。
在显示名称字段中输入 Contoso WFA,在名称字段中输入 ContosoWFA,然后选择发布者下拉菜单。
选择+ 发布者。
在显示名称字段中输入 Contoso,在前缀字段中输入 contoso,然后选择保存并关闭。
再次选择发布者下拉菜单并选择您创建的发布者。
在版本字段中输入1.0.0.0,然后选择创建。
打开您创建的解决方案。
选择添加现有,然后选择实体。
您将使用任务实体向工作流活动发送文本。 选择任务,然后选择下一步。
选择选择组件选项。
选择窗体选项卡,选择任务窗体,然后选择添加。
再次选择添加。
选择以打开您刚刚添加到解决方案的任务实体。
选择字段选项卡,然后选择+ 添加字段。
在显示名称字段中输入格式化日期时间,从数据类型下拉菜单中选择文本,然后选择完成。
选择保存实体按钮。
选择窗体选项卡,然后选择以打开任务窗体。
将格式化的日期时间字段拖动到窗体,然后将其放到主题字段下。
选择保存。
选择发布并等待发布完成。
关闭窗体编辑器浏览器选项卡或窗口。
选择完成。
任务 3:创建工作区
选择解决方案并打开您创建的解决方案。
选择省略号 (...) 按钮并选择切换到经典。
选择流程,然后选择新建。
在流程名称字段中输入转换并格式化日期时间,从类别下拉菜单中选择工作流,从实体下拉列表中选择任务,清除在后台运行本工作流(推荐)复选框,然后选择确定。
选择作为按需流程复选框,然后从范围下拉菜单选择组织。
选择添加步骤,然后选择检查条件。
输入检查到期日是否有值作为描述,然后选择配置。
如下图所示设置条件,然后选择保存并关闭。
在条件语句下方选择。
选择添加步骤,然后选择您创建的自定义工作流活动。
提供描述,然后选择设置属性。
选择值字段,选择到期日期,然后选择添加。
选择确定。
选择保存并关闭。
选择您刚刚添加的步骤,选择添加步骤,然后选择更新记录。
提供描述,确保在更新下拉列表中为实体选择了任务,然后选择设置属性。
选择格式化日期时间字段,从查找下拉菜单中选择格式化日期时间,然后选择添加。
选择确定。
选择保存并关闭。
选择您刚刚添加的步骤,选择添加步骤,然后选择停止工作流。
选择条件步骤,选择添加步骤,然后选择默认操作。
选择下面的否则,选择添加步骤,然后选择停止工作流。
您的工作流现在应如下图所示。 选择保存。
选择激活。
确认激活。
选择关闭。
选择发布所有自定义并等待发布完成。
关闭解决方案资源管理器窗口。
任务 4:测试工作流和自定义活动
转到 https://make.powerapps.com,并确保不是在默认环境中。
选择应用,并选择以打开CRM 中心 应用程序。
选择活动,然后选择任务。
为主题输入测试任务,选择到期日期和时间,然后选择保存。
自定义工作流活动应运行并填充格式化日期时间字段。 到期日期和格式化日期时间值应相同。
选择设置,然后选择个性化设置。
将时区更改为其他时区,然后选择确定。
任务应重新加载。 到期日期字段值应自动更改为所选时区,但格式化日期时间值不应更改。
选择流,然后选择您创建的工作流。
选择确定。
选择刷新。
到期日期和格式化日期时间值现在应相同。