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 的核心是资源 (
bookableresource
) 实体。预订 (
bookableresourcebooking
) 记录在创建时,将与资源记录关联。
将通过属性或与其他实体之间的关系为资源记录及其关联的约束建模。
要求
Universal Resource Scheduling 中的另一个重要实体是资源要求 (
msdyn_resourcerequirement
) 实体。资源要求记录要完成工作需要满足的要求。对于每个工作订单,系统都会创建一个相关要求。 一个工作订单可以有多个要求,或者有包含多个要求的要求组
要求会继承工作订单的属性,如名称、位置、持续时间等。 更新工作订单属性将更新要求属性。 也可以在进行安排之前手动编辑要求
资源约束表示为要求实体的属性或与其他实体之间的关系
约束
Universal Resource Scheduling 中自带的约束
约束匹配的工作方式
1)约束实体
某些约束直接被指定为资源实体的属性,其他则通过关系定义。
约束应用第二个主实体时,需要关系。
2)约束属性包
用户在“筛选器”面板中选择值并选择“搜索”按钮后,将把这些值发送给资源匹配 API。 对于多值约束,“筛选器”面板中显示来自主实体区域和特征的数据,并将所选值包含到约束属性包中
3)汇总资源匹配流
手动筛选。 “筛选器”面板 > 资源匹配 API
- 用户在“筛选”面板中添加约束
- 约束发送给资源匹配 API
- 将显示筛选后的资源列表
要求筛选。 检索要求约束 API >“筛选器”面板 > 资源匹配 API
- 用户查找要求记录的可用性(从日程安排板内部或通过功能区中的“预订”按钮)。
- 将通过检索要求约束 API 检索约束并在“筛选器”面板中显示。
- 约束发送给资源匹配 API
- 将显示筛选后的资源列表
自定义约束
举例:
对于资源而言,资源隶属于某个区域,但更多情况下,区域下还有分支,在调派资源时,我们往往需要根据资源隶属于某个分支来进行派工。
接下来,将以"售后分支"作为示例方案,根据售后分支捕获要求记录。
主实体--售后分支
多对多关系---【售后分支-- 资源】
扩展性要点
根据上面介绍的资源匹配流,下面是需要修改,自定义约束才能生效的扩展性要点:
①检索要求约束 API
该 API 需要读取我们的售后分支属性,这样当用户查找要求的可用性时,将检索我们的新约束
②“筛选器”面板用户应该可以从“筛选器”面板中的语言记录列表中进行选择,以便筛选匹配的资源。
③资源匹配 API此 API 将把新的售后分支约束作为输入;它需要仅返回使用所选售后分支的资源
可扩展查询
在内部,检索要求约束(上面的①)和资源匹配 API(上面的 ③)使用 FetchXML 从 Dynamics 365 查询数据。 检索要求约束 API 发出多个查询以检索要求记录及其子约束(如要求特征等)。资源匹配 API 根据作为输入传递给它的资源约束动态构造正确的 FetchXML 查询,这样将从 Dynamics 365 仅返回匹配指定的 FetchXML 条件的资源记录。
为了支持可扩展的资源匹配,引入了通用FetchXml(UFX),UFX 向 FetchXML 添加了两项重要功能:
1) 多个结果集,即一个 UFX 查询可从多个实体返回结果
2) 动态 FetchXML,即一个 UFX 查询可根据输入数据动态构造 FetchXML
可扩展筛选器布局和资源模板
自定义约束和 Universal Resource Scheduling 自带的约束一样,作为输入传递到资源匹配 API。
资源单元格通过可自定义的 Handlebars.js 模板呈现。 将把资源匹配 API 的结果提供给该模板。 因此,通过自定义资源匹配 API 执行的查询,可以在资源单元格中呈现自定义数据。
示例:使用自定义售后分支约束扩展 Universal Resource Scheduling
新建发布商
新建解决方案
创建售后分支实体
创建从资源到售后分支实体的多对多关系
创建从要求实体到售后分支实体的关系
将现有资源要求实体添加到解决方案(如果显示“缺少必需组件”对话框,请勿包含必需组件。)
添加售后分支关联字段
更新要求主窗体
在资源要求实体中,将现有信息窗体添加到实体的子组件中(如果显示“缺少必需组件”对话框,请勿包含必需组件。)
自定义日程安排板
筛选器布局配置
control
元素将向“筛选器”面板添加一个新控件。 下面是每个属性的说明:
account desc type
筛选器控件的类型。 combo
控件显示一个下拉列表,其中包含可供选择的值source
下拉控件的值的源。 entity
源显示下拉列表中的实体记录key
用于将所选值存储到约束属性包中的密钥。 inactive-state
此实体的已停用 statecode
。 这用于从下拉列表中排除已停用的记录label-id
用于此控件的已本地化标签 entity
将在下拉列表中显示此实体的记录 multi
配置下拉列表,以便允许选择一条记录或多条记录
检索资源查询配置
“检索资源查询”配置是资源匹配 API 使用的一种UFX查询。 它将“筛选器”面板中输入的值作为输入采用,并自动构造正确的 FetchXML 以查找匹配的资源。
添加从bookableresource
到 vg_branch的联接
<!-- vg_branch join -->
<link-entity name="msdyn_resourceterritory" from="msdyn_resource" to="bookableresourceid" alias="vg_branch" link-type="outer" ufx:if="$input/vg_branches/bag">
<filter>
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="vg_branchid" operator="not-null" />
</filter>
</link-entity>
<filter type="or">
<condition ufx:if="$input/UnspecifiedBranch[. = 'true']" entityname="vg_branch" attribute="vg_branchid" operator="null" />
<condition ufx:if="$input/vg_branches/bag" entityname="vg_branch" attribute="vg_branchid" operator="in">
<ufx:apply select="$input/vg_branches/bag">
<value>
<ufx:value select="@ufx-id" />
</value>
</ufx:apply>
</condition>
</filter>
下面是每个
element
和attribute
的说明:
account desc link-entity
创建到资源与语言实体之间的多对多关系的联接 ufx:if
仅当此属性中的 XPath 表达式返回值,才发出此 FetchXML 元素 ( link-entity
)attribute
返回匹配的售后分支 filter
和condition
筛选多对多关系,以便仅显示匹配指定的售后分支 ID 的项 ufx:value
和select
输出 select
属性中的 XPath 表达式的结果ufx:apply
和select
为 select
属性中的 XPath 表达式返回的每个结果发出子 FetchXML 元素value
包含售后分支记录的 ID
lang_order
在名称为 lang_order
的 FetchXML 查询返回的每个资源中创建一个新属性。ufx:select 将此属性中的 XPath 表达式的结果分配给 lang_order
属性。 查询中前面检索的lang_primary
和lang_secondary
属性和 XPath iif 函数一起用于确定资源匹配顺序。Resources
重新分派 Resources
属性
更新日程安排助理筛选器布局
检索约束查询配置
“检索约束查询”配置是检索要求约束 API 使用的一种UFX查询。它将( UI 中选择的)要求记录的 ID 作为输入采用,并返回要求记录及其所有子记录。