使用自定义资源约束扩展 Universal Resource Scheduling
Universal Resource Scheduling 是计划引擎底层 Dynamics 365 Field Service 和 Project Service Automation,其自带丰富的资源匹配功能,可为作业预订适合的资源。 由于 Universal Resource Scheduling 解决方案自带 Field and Project Service,所以 Universal Resource Scheduling 可用于在 Dynamics 365 中计划任何工作流。 本文中,将了解如何实施内置的资源约束和如何使用自定义的资源约束来自定义 Universal Resource Scheduling。
资源、要求和约束
资源
Universal Resource Scheduling 的核心是资源 (bookableresource
) 实体。 预订 (bookableresourcebooking
) 记录在创建时,将与资源记录关联。 为了确保选择正确的资源,Universal Resource Scheduling 自带了大量内置筛选器和约束来充当资源的分类依据。 例如:资源类型(用于指示资源是否是用户、联系人、客户、设备等)、特征(用于按资源精通的技能筛选资源)、区域(用于将资源分配给特定区域)、部门(用于为组织层次结构建模)等等。
将通过属性或与其他实体之间的关系为资源记录及其关联的约束建模。 例如,“名称”和“资源类型”是资源实体的属性。 资源特征和资源区域是子关系,因为一个资源可以与多个实体关联。 这些实体同时是资源实体和特征/区域实体的子关系。 部门是资源实体到部门实体的查找属性。
要求
Universal Resource Scheduling 中的另一个重要实体是资源要求 (msdyn_resourcerequirement
) 实体。 资源要求记录要完成工作需要满足的要求。 它捕获有关需要执行的工作的参数,如“开始日期”和“结束日期”字段,用于限制可完成工作的时间段,“持续时间”字段,用于指定预计作业需要多长时间,以及“工作位置”,用于指示执行所需工作的位置。 要求实体还捕获资源约束,以限制哪些资源可完成且可供此要求预订。 与资源实体一样,资源约束表示为要求实体的属性或与其他实体之间的关系。 区域是从要求实体到区域实体的查找属性,用于指示要完成工作的区域,因此,必须在同一个区域中查找资源。 要求特征是一种子关系,用于将要求与特征实体关联来表示完成作业所需技能,incident,只能将要求与具有匹配的技能的资源匹配。
Universal Resource Scheduling 中自带的约束
下面是 Universal Resource Scheduling 自带的约束列表:
- 特征 - 可用于为资源拥有的技能建模。 还支持可选等级值,用于为资源掌握各项技能的熟练程度评级
- 类别 - 可将资源关联到类别
- 区域 - 将资源分配给区域
- 部门 - 为组织层次结构建模
- 资源类型 - 定义资源的类型
- 团队 - 资源所属团队
- 业务部门 - 资源所属业务部门
日程安排板中的筛选
日程安排板显示资源列表和为资源分配的预订。 日程安排板中的“筛选器”面板用于按资源的约束筛选资源列表,例如,如果在“资源类型”下拉列表中选择资源类型“用户”,将把资源列表筛选为仅包含类型为“用户”的资源。 同样,可以按匹配特征或区域筛选资源。
可以通过使用“筛选器”面板筛选资源来查找匹配的资源。 若要手动显示匹配一组特定约束的资源列表,请使用此方法。
使用日程安排助理查找可用资源
日程安排板底部是要求记录列表。 可选择其中一个记录和选择查找可用性。 此操作将打开日程安排助理。 日程安排助理使用为所选要求记录捕获的约束查找可供预订的匹配资源。 板中仅显示匹配要求约束的资源和为要求指定的请求时间段中的可用资源。
可通过 Dynamics 365 列表视图或窗体中的要求实体和其他可计划实体上的可用“预订”功能区按钮实现类似体验。 如果单击“预订”,将打开日程安排助理,其中显示匹配所选要求记录的约束的资源。
在前面介绍的日程安排板模式下,使用“筛选器”面板手动筛选资源,而在日程安排助理模式下则不同,“筛选器”面板自动填写要求记录中的资源约束,并且仅显示匹配的资源。
约束匹配的工作方式
约束实体
某些约束直接被指定为资源实体的属性,其他则通过关系定义。 约束应用第二个主实体时,需要关系。
假设有一个资源记录及其关联的区域约束和特征约束。
首先是主记录。 我们将区域存储到区域实体中:
区域 |
---|
纽约 |
新泽西 |
西雅图 |
特征实体中也有实体:
特征 |
---|
项目经理 |
设计器 |
财务分析师 |
部门实体:
部门 |
---|
Contoso US |
Contoso EU |
最后是资源实体:
资源 | 资源类型 | 部门 |
---|---|---|
Jorge Galt | User | Contoso US |
Abraham McCormick | 联系人 | Contoso EU |
而单个资源记录即可捕获单值约束,如上面的资源类型和部门。 如果要将一个资源关联到多个区域或特征记录,则必须使用第三个实体,即多对多 (N:N) 关系,来存储这些关联。
我们使用资源区域实体关联一个资源的多个区域。
资源区域记录:
资源 | 区域 |
---|---|
Jorge Galt | 纽约 |
Jorge Galt | 新泽西 |
Abraham McCormick | 西雅图 |
和资源特征实体,用于存储一个资源的多个特征。
资源特征记录:
资源 | 特征 |
---|---|
Jorge Galt | 设计器 |
Abraham McCormick | 项目经理 |
Abraham McCormick | 财务分析师 |
与资源类似,要求记录用于捕获单值约束和,而子记录则存储多值约束。
下面是要求实体:
要求 | 持续时间 | 区域 |
---|---|---|
作业 1 | 1 小时 | 纽约 |
作业 2 | 1 小时 | 西雅图 |
要求特征实体:
要求特征记录:
要求 | 特征 |
---|---|
作业 1 | 设计器 |
作业 2 | 项目经理 |
作业 2 | 财务分析师 |
要求有时将约束建模为查找属性,而资源可能在 N:N 表中存储匹配属性。 例如,对于要求,区域约束是区域实体的查找属性。 要求捕获对工作和将完成工作的区域的需求。 但是,一个资源记录可以关联到多个区域记录。
约束属性包
用户在“筛选器”面板中选择值并选择“搜索”按钮后,将把这些值发送给资源匹配 API。 对于多值约束,“筛选器”面板中显示来自主实体区域和特征的数据,并将所选值包含到约束属性包中。
下面是将约束发送给了资源匹配 API 的示例属性包:
姓名 | Value |
---|---|
ResourceType |
User |
Territories |
纽约 新泽西 |
这将通知资源匹配 API 查找与纽约或新泽西区域关联的“用户”类型的资源。
而在日程安排助理中,首先通过检索要求约束 API 从要求记录检索约束。 然后将检索到的约束预先填写到“筛选器”面板中,并发送给资源匹配 API。
检索要求约束 API 查询要求记录和所有相关子约束(如要求特征)。 它通过约束属性包(表示为所选要求捕获到的所有资源约束)进行响应。
下面是检索要求约束 API 的示例响应:
姓名 | Value |
---|---|
Requirement |
作业 2 |
Duration |
1 小时 |
Territories |
西雅图 |
Characteristics |
项目经理 财务分析师 |
资源匹配 API 将约束属性包作为输入接收,并查询匹配的资源。 然后在日程安排板或日程安排助理中显示匹配的资源。
汇总用于资源匹配的实体
- 示例主实体
- 区域 - 称为约束
- 特征 - 称为约束
- 资源 - 分配给预订
- 资源区域 - 将资源与区域关联
- 资源特征 - 将资源与特征关联
- 示例事务实体
- 要求 - 捕获对工作的需求和引用区域
- 要求特征 - 将要求与特征关联
汇总资源匹配流
手动筛选。 “筛选器”面板 > 资源匹配 API
- 用户在“筛选”面板中添加约束
- 约束发送给资源匹配 API
- 将显示筛选后的资源列表
要求筛选。 检索要求约束 API >“筛选器”面板 > 资源匹配 API
- 用户查找要求记录的可用性(从日程安排板内部或通过功能区中的“预订”按钮)。
- 将通过检索要求约束 API 检索约束并在“筛选器”面板中显示。
- 约束发送给资源匹配 API
- 将显示筛选后的资源列表
使用自定义约束扩展 Universal Resource Scheduling
可使用自定义资源约束扩展 Universal Resource Scheduling。 扩展约束的方法与 Universal Resource Scheduling 中的内置约束相同,它们在 Dynamics 365 中建模为属性和关系。
扩展 Universal Resource Scheduling:按语言查找资源 - 分步指南中介绍了一个分步指南,其中包含每个步骤所需代码示例
自定义约束
将以“语言”作为示例方案。 一个组织希望按照他们所用语言筛选资源。 他们还希望根据作业所需语言捕获要求记录。 此项约束采用的模式类似内置区域约束。 新的主实体“语言”中存储某个资源所用不同语言。 然后可通过多对多关系实体将一个资源记录与多个语言关联。 在要求实体中,我们将创建两个新的查找属性:Required Language
和 Secondary Language
。 查找要求的可用资源时,将仅显示与 Required Language
或 Secondary Language
关联的资源。
下面将介绍自定义语言约束。 首先,有一个新的语言实体:
Language |
---|
英语 |
西班牙语 |
和新的资源语言多对多子实体:
资源 | Language |
---|---|
Jorge Galt | 英语 |
Abraham McCormick | 英语 |
Abraham McCormick | 西班牙语 |
这里是有我们的两个属性(所需语言和辅助语言)的要求实体,这两个属性表示要匹配此要求,资源需要使用的语言:
要求 | 持续时间 | 区域 | 所需语言 | 辅助语言 |
---|---|---|---|---|
作业 1 | 1 小时 | 纽约 | 英语 | --- |
作业 2 | 1 小时 | 西雅图 | 西班牙语 | 英语 |
扩展性要点
根据上面介绍的资源匹配流,下面是需要修改,自定义约束才能生效的扩展性要点:
检索要求约束 API
该 API 需要读取我们的新所需语言和辅助语言属性,这样当用户查找要求的可用性时,将检索我们的新约束。
“筛选器”面板
用户应该可以从“筛选器”面板中的语言记录列表中进行选择,以便筛选匹配的资源。 查找要求的可用性时,“筛选器”面板应在语言列表中显示提前选择的要求记录中的所需语言和辅助语言。
资源匹配 API
此 API 将把新的语言约束作为输入;它需要仅返回使用所选语言的资源。
可扩展查询
在内部,检索要求约束(上面的 #1)和资源匹配 API(上面的 #3)使用 FetchXML 从 Dynamics 365 查询数据。 检索要求约束 API 发出多个查询以检索要求记录及其子约束(如要求特征等)。资源匹配 API 根据作为输入传递给它的资源约束动态构造正确的 FetchXML 查询,这样将从 Dynamics 365 仅返回匹配指定的 FetchXML 条件的资源记录。
在 Universal Resource Scheduling 的 2017 年 7 月更新中,为了支持可扩展的资源匹配,引入了通用 FetchXML (UFX)。 UFX 向 FetchXML 添加了两项重要功能:1) 多个结果集,即一个 UFX 查询可从多个实体返回结果,以及 2) 动态 FetchXML,即一个 UFX 查询可根据输入数据动态构造 FetchXML。
通过 UFX,构造一个查询即查询某个要求记录及其所有子记录。 检索要求约束 API 执行可自定义的 UFX 查询以检索要求及其子约束。 可将查询自定义为也检索自定义约束记录。
将把从检索要求约束 API 返回的约束属性包作为输入传递给资源匹配 API。 该 API 执行可自定义的 UFX 查询。 通过 UFX,查询使用输入约束动态构造正确的 FetchXML 以查找匹配的资源。 也可以将此 UFX 查询修改为构造正确的 FetchXML 以仅返回匹配自定义约束的资源。
可扩展筛选器布局和资源模板
在 Universal Resource Scheduling 的 2017 年 7 月更新中,已将“筛选器”面板(上面的 #2)更新为支持通过 XML 布局定义进行自定义。 新布局支持下拉控件,因此可以显示主实体的记录列表和典型的 number
、datetime
和 checkbox
控件。 还可以将布局修改为允许用户从自定义约束实体选择记录。 然后,自定义约束和 Universal Resource Scheduling 自带的约束一样,作为输入传递到资源匹配 API。
2017 年 7 月更新中推出的另一项客户端扩展性要点是资源单元格。 资源单元格通过可自定义的 Handlebars.js 模板呈现。 将把资源匹配 API 的结果提供给该模板。 因此,通过自定义资源匹配 API 执行的查询,可以在资源单元格中呈现自定义数据。
扩展 Universal Resource Scheduling:按语言查找资源 - 分步指南中介绍了一个分步指南,其中包含每个步骤所需代码示例
其他说明
- 当前无法在可计划实体使用关联的要求组(而不是资源要求)时配置筛选器布局。