6.2. 重新创建员工示例项目
employee rostering 示例项目是在 Business Central 中预先配置的项目。您可以在 第 6.1 节 “在 Business Central 中部署员工示例项目” 中了解如何部署此项目。
您可以创建员工示例"从 scratch"示例。您可以使用本示例中的工作流在 Business Central 中创建您自己的类似的项目。
6.2.1. 设置员工漏洞项目
要在 Business Central 中开始开发一个问题,您必须设置项目。
先决条件
- Red Hat Process Automation Manager 已下载并安装。
-
您已部署了 Business Central,并使用具有
admin
角色的用户登录。
流程
- 点 Menu → Design → Projects → Add Project 在 Business Central 中创建一个新项目。
在 Add Project 窗口中填写以下字段:
-
名称:
employee-rostering
- 描述(可选):使用 OptaPlanner 提升问题优化。分配员工以根据其领导进行过渡。
(可选)单击 Configure Advanced Options 以填充
组 ID
、工件 ID
和版本信息。-
组 ID :
employeerostering
-
工件 ID :
employeerostering
-
Version:
1.0.0-SNAPSHOT
-
名称:
- 单击 Add,将项目添加到 Business Central 项目存储库。
6.2.2. 问题事实和计划实体
员工规划问题中的每个域类被归类为以下之一:
- 不相关的类:没有被任何分数约束使用。从计划角度来说,这些数据已过时。
-
问题事实 类:由分数限制使用,但在规划过程中不会改变(只要问题保持不变),例如
Shift
和Employee
。问题事实类的所有属性都是问题属性。 计划实体 类:由分数约束使用,并在规划过程中更改,例如
ShiftAssignment
。规划期间更改的属性是 规划变量。其他属性是问题属性。请询问以下问题:
- 规划过程中发生了什么类变化?
哪个类有我希望更改
Solver
的变量?该类是计划实体。
规划实体类需要使用
@PlanningEntity
注释进行注解,或使用在域设计器中的 OptaPlanner dock 在 Business Central 中定义。每个计划实体类都有一个或多个 规划变量,还必须具有一个或多个定义属性。
大多数用例都只有一个计划实体类,每个计划实体类只能有一个规划变量。
6.2.3. 为员工项目创建数据模型
使用本节创建在 Business Central 中运行员工示例项目所需的数据对象。
先决条件
- 您已完成了 第 6.2.1 节 “设置员工漏洞项目” 中描述的项目设置。
流程
- 使用新项目,点项目视角中的 Data Object,或者点击 Add Asset → Data Object 来创建新项目对象。
命名第一个数据对象
Timeslot
,然后选择employeerostering.employeerostering
作为 Package。点 确定。
-
在 Data Objects 视角中,点 +add 字段 向
Timeslot
数据对象添加字段。 -
在 id 字段中,键入
endTime
。 -
单击 Type 旁边的下拉菜单,再选择
LocalDateTime
。 - 点 Create and continue 添加另一个字段。
-
添加另一个字段,其 id
startTime
和 TypeLocalDateTime
。 - 点 Create。
-
点右上角的 Save,以保存
Timeslot
数据对象。 - 点右上角的 x 关闭 Data Objects 视角,并返回到 Assets 菜单。
使用前面的步骤,创建以下数据对象及其属性:
表 6.1. 领导
id 类型 name
字符串
表 6.2. employee
id 类型 name
字符串
知识
employeerostering.employeerostering.Skill[List]
表 6.3. 移动
id 类型 requiredSkill
employeerostering.employeerostering.Skill
timeslot
employeerostering.employeerostering.Timeslot
表 6.4. DayOffRequest
id 类型 date
LocalDate
employee
employeerostering.employeerostering.Employee
表 6.5. ShiftAssignment
id 类型 employee
employeerostering.employeerostering.Employee
shift
employeerostering.employeerostering.Shift
有关创建数据对象的更多示例,请参阅开始使用决策服务。
6.2.3.1. 创建员工 roster 计划实体
为了解决员工的规划问题,您必须创建一个规划实体和解决方案。规划实体使用 Red Hat build of OptaPlanner dock 中提供的属性在域设计器中定义。
使用以下步骤将 ShiftAssignment
数据对象定义为员工的计划实体。
先决条件
- 您已通过完成 第 6.2.3 节 “为员工项目创建数据模型” 中的步骤创建了相关的数据对象和计划实体来运行员工示例。
流程
-
在项目 资产 菜单中,打开
ShiftAssignment
数据对象。 - 在 Data Objects 视角中,点右侧的 来打开 OptaPlanner dock。
- 选择 Planning Entity。
-
从
ShiftAssignment
数据对象下的字段列表中选择employee
。 在 OptaPlanner dock 中,选择 Planning Variable。
在 Value Range Id 输入字段中,键入
employeeRange
。这会在规划实体中添加@ValueRangeProvider
注释,您可以通过单击设计器中的Source
选项卡来查看该注释。规划变量的值范围通过
@ValueRangeProvider
注释定义。@ValueRangeProvider
注释始终具有属性id
,它由@PlanningVariable
属性valueRangeProviderRefs
引用。- 关闭 dock 并点 Save 保存数据对象。
6.2.3.2. 创建员工 roster 规划解决方案
员工的 roster 问题依赖于定义的规划解决方案。规划解决方案在使用 Red Hat build of OptaPlanner dock 中提供的属性在域设计器中定义。
先决条件
- 您已通过完成 第 6.2.3 节 “为员工项目创建数据模型” 和 第 6.2.3.1 节 “创建员工 roster 计划实体” 中的步骤,创建了相关的数据对象和计划实体来运行员工示例。
流程
-
使用标识符
EmployeeRoster
创建新数据对象。 创建以下字段:
表 6.6. EmployeeRoster
id 类型 dayOffRequestList
employeerostering.employeerostering.DayOffRequest[List]
shiftAssignmentList
employeerostering.employeerostering.ShiftAssignment[List]
shiftList
employeerostering.employeerostering.Shift[List]
skillList
employeerostering.employeerostering.Skill[List]
timeslotList
employeerostering.employeerostering.Timeslot[List]
- 在 Data Objects 视角中,点右侧的 来打开 OptaPlanner dock。
- 选择规划解决方案。
-
将默认的
Hard soft score
保留为 Solution Score Type。这会在EmployeeRoster
数据对象中自动生成score
字段,其解决方案分数作为类型。 使用以下属性添加新字段:
id 类型 employeeList
employeerostering.employeerostering.Employee[List]
选择
employeeList
字段后,打开 OptaPlanner dock 并选择 Planning Value Range Provider 复选框。在 id 字段中,键入
employeeRange
。关闭 dock。- 点右上角的 Save 保存资产。
6.2.4. 员工距离限制
员工障碍是一个规划问题。所有规划问题包括必须满足的限制才能找到最佳解决方案。
Business Central 中的 employee rostering 示例项目包括以下硬和软限制:
- 硬约束
- 员工每天仅分配一个转换。
- 需要特定员工的改变均会成为具有该特定领导员工的员工。
- 软限制
- 所有员工都会被分配一个转换。
- 如果员工要求一天关闭,则他们的转换将重新分配给其他员工。
硬和软限制在 Business Central 中定义,可使用自由格式的 DRL 设计程序或使用指导规则。
6.2.4.1. DRL (Drools Rule Language)规则
DRL (Drools Rule Language)规则是在 .drl
文本文件中直接定义的警报规则。这些 DRL 文件是最终呈现 Business Central 中所有其他规则资产的源。您可以在 Business Central 界面中创建和管理 DRL 文件,或使用 Red Hat CodeReady Studio 或其他集成开发环境(IDE)在外部创建它们。DRL 文件可以包含一个或多个规则,这些规则至少定义规则条件(when
)和操作(then
)。Business Central 中的 DRL 设计程序提供了 Java、DRL 和 XML 的语法突出显示。
DRL 文件由以下组件组成:
DRL 文件中的组件
package import function // Optional query // Optional declare // Optional global // Optional rule "rule name" // Attributes when // Conditions then // Actions end rule "rule2 name" ...
以下示例 DRL 规则决定 loan 应用程序决策服务的年龄限制:
loan 应用程序年龄限制的规则示例
rule "Underage" salience 15 agenda-group "applicationGroup" when $application : LoanApplication() Applicant( age < 21 ) then $application.setApproved( false ); $application.setExplanation( "Underage" ); end
DRL 文件可以包含单个或多个规则、查询和功能,并可定义资源声明,如导入、全局和属性,这些属性由您的规则和查询分配和使用。DRL 软件包必须在 DRL 文件的顶部列出,规则通常最后列出。所有其他 DRL 组件都可以遵循任何顺序。
每个规则都必须在 rule 软件包中具有唯一名称。如果您在软件包中的任何 DRL 文件中使用相同的规则名称多次,则规则无法编译。始终使用双引号括起规则名称(规则"规则名称"),
以防止可能编译错误,特别是在规则名称中使用空格时。
与 DRL 规则相关的所有数据对象都必须与 Business Central 中的 DRL 文件位于同一个项目中。默认情况下导入同一软件包中的资产。其他软件包中的现有资产可以使用 DRL 规则导入。
6.2.4.2. 使用 DRL 设计程序为员工定义限制
您可以使用 Business Central 中的自由格式 DRL 设计程序为员工创建约束定义。
使用这个流程创建一个 硬约束,其中没有分配在之前转换结束时开始 10 小时的转换。
流程
- 在 Business Central 中,进入 Menu → Design → Projects,然后点击项目名称。
- 点 Add Asset → DRL file。
-
在 DRL 文件名 字段中,键入
ComplexScoreRules
。 -
选择
employeerostering.employeerostering
软件包。 - 单击 +Ok 以创建 DRL 文件。
在 DRL 设计器的 Model 选项卡中,将
Employee10HourShiftSpace
规则定义为 DRL 文件:package employeerostering.employeerostering; rule "Employee10HourShiftSpace" when $shiftAssignment : ShiftAssignment( $employee : employee != null, $shiftEndDateTime : shift.timeslot.endTime) ShiftAssignment( this != $shiftAssignment, $employee == employee, $shiftEndDateTime <= shift.timeslot.endTime, $shiftEndDateTime.until(shift.timeslot.startTime, java.time.temporal.ChronoUnit.HOURS) <10) then scoreHolder.addHardConstraintMatch(kcontext, -1); end
- 点 Save 保存 DRL 文件。
有关创建 DRL 文件的更多信息,请参阅使用 DRL 规则设计决策服务。
6.2.5. 使用指导规则为员工创建规则
您可以使用 Business Central 中的指导规则设计器,创建用于员工的硬和软限制的规则。
6.2.5.1. 指导规则
指导规则是您在 Business Central 中基于 UI 的指导规则设计人员创建的新规则,可帮助您完成规则创建过程。指导规则设计器根据所定义的规则的数据对象,为可接受的输入提供字段和选项。您定义的指导规则被编译到 drools 规则中,与其他规则资产一样。
与指导规则相关的所有数据对象都必须与指导规则位于同一个项目中。默认情况下导入同一软件包中的资产。创建必要的数据对象和指导规则后,您可以使用指导规则设计器的 Data Objects 选项卡来验证所有必需的数据对象是否已列出,或通过添加新 项目 来导入其他现有数据对象。
6.2.5.2. 创建指导规则以平衡员工移动号
BalanceEmployeesShiftNumber
指南规则会创建一个软约束,以确保以尽可能均匀地平衡为员工。它通过创建一个在转换分发较少时增加的分数损失来达到此目标。规则实施的分数公式使 Solver 以更均衡的方式分发转换。
流程
- 在 Business Central 中,进入 Menu → Design → Projects,然后点击项目名称。
- 点 Add Asset → Datacenter Rule。
-
输入
BalanceEmployeesShiftNumber
作为 指导规则 名称,然后选择employeerostering.employeerostering
Package。 - 点 Ok 创建规则资产。
- 点 WHEN 字段中的 来添加 WHEN 条件。
-
在 Add a condition to the rule 窗口中选择
Employee
。单击 +Ok。 -
点
Employee
条件来修改约束,并添加变量名称$employee
。 从 Accumulate
添加 WHEN 条件。-
在
From Accumulate
条件之上 ,单击 Click to add mode,然后从下拉列表中选择Number
作为事实类型。 -
将变量名称
$shiftCount
添加到Number
条件。 -
在
From Accumulate
条件下 ,单击 Click to add mode,然后从下拉列表中选择ShiftAssignment
fact 类型。 -
将变量名称
$shiftAssignment
添加到ShiftAssignment
事实类型。 -
再次点
ShiftAssignment
条件,然后从 Add a limit on a field 下拉列表中选择employee
。 -
从
employee
约束旁边的下拉列表中,选择equal 等于
。 - 点击下拉按钮旁的 图标添加变量,然后点击 Field value 窗口中的 Bound 变量。
-
从下拉列表中选择
$employee
。 -
在 Function 框中,键入
count ($shiftAssignment)
。
-
在
- 点 wordpress N 字段中的 来添加 wordpressN 条件。
在 Add a new action 窗口中选择
Modify Soft Score
。单击 +Ok。-
在框中键入以下表达式:
-($shiftCount.intValue () 39)$shiftCount.intValue ())
-
在框中键入以下表达式:
- 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
- 点 Save 保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
6.2.5.3. 创建一个指导规则,每天不多于一个
OneEmployeeShiftPerDay
指南规则会创建一个硬约束,员工每天不会分配多个迁移。在 employee rostering 示例中,此约束是使用指导规则设计器创建的。
流程
- 在 Business Central 中,进入 Menu → Design → Projects,然后点击项目名称。
- 点 Add Asset → Datacenter Rule。
-
输入
OneEmployeeShiftPerDay
作为 指导规则 名称,然后选择employeerostering.employeerostering
Package。 - 点 Ok 创建规则资产。
- 点 WHEN 字段中的 来添加 WHEN 条件。
- 从 Add a condition to the rule 窗口中选择 Free form DRL。
在自由形式 DRL 框中键入以下条件:
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )
此条件指出无法将转换分配给同一天已有另一个转换分配的员工。
- 点 wordpress N 字段中的 来添加 wordpressN 条件。
- 从 Add a new action 窗口中选择 Add free form DRL。
在自由形式 DRL 框中键入以下条件:
scoreHolder.addHardConstraintMatch(kcontext, -1);
- 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
- 点 Save 保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
6.2.5.4. 创建指导规则以匹配与迁移要求相关的问题
ShiftReqiredSkillsAreMet
指导规则会创建一个硬约束,以确保所有转换均被分配一个具有正确学习集的员工。在 employee rostering 示例中,此约束是使用指导规则设计器创建的。
流程
- 在 Business Central 中,进入 Menu → Design → Projects,然后点击项目名称。
- 点 Add Asset → Datacenter Rule。
-
输入
ShiftReqiredSkillsAreMet
作为 指导规则 名称,然后选择employeerostering.employeerostering
Package。 - 点 Ok 创建规则资产。
- 点 WHEN 字段中的 来添加 WHEN 条件。
-
在规则窗口中选择
ShiftAssignment
。单击 +Ok。 -
点
ShiftAssignment
条件,然后从 Add a limits on a field 下拉列表中选择employee
。 -
在设计人员中,单击
employee
旁边的下拉列表,然后选择不是 null
。 点
ShiftAssignment
条件,然后点 Expression 编辑器。-
在设计人员中,单击
[not bound]
以打开 Expression 编辑器,并将表达式绑定到变量$requiredSkill
。点 Set。 -
在设计人员中,在
$requiredSkill
旁边,从第一个下拉列表中选择 move,然后从下一个下拉列表中选择requiredSkill
。
-
在设计人员中,单击
点
ShiftAssignment
条件,然后点 Expression 编辑器。-
在设计人员中,在
[not bound]
旁边,从第一个下拉列表中选择employee
,然后从下一下拉列表中选择skills
。 -
接下来的下拉列表保留为
Choose
。 -
在下一个下拉菜单中,将
please choose
改为excludes
。 -
点击
排除
的 图标,在 Field value 窗口中点击 New formula 按钮。 -
在公式框中输入
$requiredSkill
。
-
在设计人员中,在
- 点 wordpress N 字段中的 来添加 wordpressN 条件。
-
在 Add a new action 窗口中选择
Modify Hard Score
。单击 +Ok。 -
在 score 操作框中键入
-1
。 - 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
- 点 Save 保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
6.2.5.5. 创建指导规则来管理第二天请求
DayOffRequest
指导规则创建一个软限制。如果最初分配了转换的员工,这个约束允许被重新分配给另一员工。在 employee rostering 示例中,此约束是使用指导规则设计器创建的。
流程
- 在 Business Central 中,进入 Menu → Design → Projects,然后点击项目名称。
- 点 Add Asset → Datacenter Rule。
-
输入
DayOffRequest
作为 指导规则 名称,然后选择employeerostering.employeerostering
Package。 - 点 Ok 创建规则资产。
- 点 WHEN 字段中的 来添加 WHEN 条件。
- 从 Add a condition to the rule 窗口中选择 Free form DRL。
在自由形式 DRL 框中键入以下条件:
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )
此条件指出,如果将过渡分配给发出一天的员工,则员工就有可能被取消分配这个变化。
- 点 wordpress N 字段中的 来添加 wordpressN 条件。
- 从 Add a new action 窗口中选择 Add free form DRL。
在自由形式 DRL 框中键入以下条件:
scoreHolder.addSoftConstraintMatch(kcontext, -100);
- 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
- 点 Save 保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
6.2.6. 为员工创建 solver 配置
您可以在 Business Central 中创建和编辑 Solver 配置。Solver 配置设计器会创建一个解析器配置,可在项目部署后运行。
先决条件
- Red Hat Process Automation Manager 已下载并安装。
- 您已为员工创建并配置了所有相关资产。
流程
- 在 Business Central 中,点击 Menu → Projects,然后点击您的项目打开它。
- 在 Assets 视角中,点 Add Asset → Solver configuration
在 Create new Solver 配置 窗口中,为您的 Solver 输入名称
EmployeeRosteringSolverConfig
并点 Ok。这将打开 Solver 配置 设计器。
在 Score Director Factory 配置部分中,定义包含评分规则定义的 KIE 基础。员工示例项目使用
defaultKieBase
。-
选择 KIE 基础中定义的 KIE 会话之一。员工示例项目使用
defaultKieSession
。
-
选择 KIE 基础中定义的 KIE 会话之一。员工示例项目使用
- 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,请解决错误消息中描述的任何问题,然后重试验证直到配置通过为止。
- 点 Save 保存 Solver 配置。
6.2.7. 为员工排班项目配置 Solver 终止
您可以将 Solver 配置为在指定时间后终止。默认情况下,计划引擎被授予无限时间来解决问题实例。
employee rostering 示例项目被设置为运行 30 秒。
先决条件
-
您已为员工 rostering 项目创建了所有相关资产,并在 Business Central 中创建
EmployeeRosteringSolverConfig
resolver 配置,如 第 6.2.6 节 “为员工创建 solver 配置” 所述。
流程
-
从 Assets 视角打开
EmployeeRosteringSolverConfig
。这将打开 Solver 配置 设计器。 - 在 Termination 部分中,点 Add 在所选逻辑组中创建新的 termination 元素。
-
从下拉列表中选择
Time
consumed 终止类型。这在终止配置中作为输入字段添加。 - 使用 time 元素旁的箭头来调整到 30 秒的时间。
- 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,请解决错误消息中描述的任何问题,然后重试验证直到配置通过为止。
- 点 Save 保存 Solver 配置。