5.2. 重新创建员工示例项目
员工示例项目是 Business Central 中提供的预配置项目。您可以在 第 5.1 节 “在 Business Central 中部署员工漫长示例项目” 中了解如何部署此项目。
您可以创建员工对示例"从零开始"。您可以使用本例中的工作流在 Business Central 中创建您自己的类似项目。
5.2.1. 设置员工漫长项目 复制链接链接已复制到粘贴板!
要在 Business Central 中开始开发解决者,您必须设置该项目。
先决条件
- Red Hat Decision Manager 已下载并安装。
-
您已部署了 Business Central,并使用具有
admin角色的用户登录。
流程
-
点 Menu
Design Projects Add Project,在 Business Central 中创建一个新项目。 在 Add Project 窗口中填写以下字段:
-
名称 :
employee-rostering - 描述(可选):使用 OptaPlanner 扩大问题优化。根据自身技能,分配员工进行转变。
可选:点 Configure Advanced Options 来填充
组 ID、Artifact ID和Version信息。-
组 ID
:员工 -
工件 ID
:员工 -
Version:
1.0.0-SNAPSHOT
-
名称 :
- 单击 Add,将项目添加到 Business Central 项目存储库中。
5.2.2. 问题事实和规划实体 复制链接链接已复制到粘贴板!
员工规划问题中的每个域类都归类为以下之一:
- 一个不相关的类:不被分数限制使用。从规划的角度来看,这个数据已过时。
-
问题事实 类:分数约束使用但在规划过程中不会改变(只要问题保持不变),例如
Shift和Employee。问题类的所有属性都是问题属性。 计划实体类:在规划 过程中分数约束和更改使用,例如
ShiftAssignment。计划期间更改的属性正在 规划变量。其他属性是问题属性。请您提出以下问题:
- 计划期间发生了哪些类变化?
哪个类具有我想要
更改的变量?该类是计划实体。
计划实体类需要使用
@PlanningEntity注释标注,或者在 Business Central 中定义,并在域设计程序中使用红帽构建 OptaPlanner dock。每个计划实体类均有一个或多个 计划变量,并且必须具有一个或多个定义属性。
大多数用例只有一个规划实体类,每个计划实体类都只有一个计划变量。
5.2.3. 为员工漫长项目创建数据模型 复制链接链接已复制到粘贴板!
使用本节创建在 Business Central 中运行员工名录示例项目所需的数据对象。
先决条件
- 您已完成了 第 5.2.1 节 “设置员工漫长项目” 中描述的项目设置。
流程
-
使用新项目,点项目视角中的 Data Object,或者点击 Add Asset
Data Object 来创建新数据对象。 将第一个数据对象 time
slot 命名为,然后选择employeerostering.employeerostering作为 软件包。点 确定。
-
在 Data Objects 视角中,点 +add 字段 向
Timeslotdata 对象添加字段。 -
在 id 字段中,键入
endTime。 -
单击 Type 旁边的下拉菜单,再选择
LocalDateTime。 - 点 Create 并继续 添加另一个字段。
-
使用 id
startTime和 TypeLocalDateTime添加另一个字段。 - 点 Create。
-
单击右上角的 Save,以保存
Timeslotdata 对象。 - 单击右上角的 x 以关闭 Data Objects 透视图,并返回到 Assets 菜单。
使用前面的步骤,创建以下数据对象及其属性:
Expand 表 5.1. 技能 id 类型 name字符串Expand 表 5.2. 员工 id 类型 name字符串skillsemployeerostering.employeerostering.Skill[List]Expand 表 5.3. 变动 id 类型 requiredSkillemployeerostering.employeerostering.Skilltimeslotemployeerostering.employeerostering.TimeslotExpand 表 5.4. DayOffRequest id 类型 dateLocalDateemployeeemployeerostering.employeerostering.EmployeeExpand 表 5.5. ShiftAssignment id 类型 employeeemployeerostering.employeerostering.Employeeshiftemployeerostering.employeerostering.Shift
有关创建数据对象的更多示例,请参阅开始使用决策服务。
5.2.3.1. 创建员工规划实体 复制链接链接已复制到粘贴板!
为了解决员工对规划问题,您必须创建一个规划实体和解决者。计划实体使用红帽构建的 OptaPlanner dock 中提供的属性在域设计人员中定义。
使用以下步骤将 ShiftAssignment 数据对象定义为员工 rostering 的规划实体。
先决条件
- 您已通过完成 第 5.2.3 节 “为员工漫长项目创建数据模型” 中的步骤创建了相关的数据对象和规划实体来运行员工感应示例。
流程
-
在项目 资产 菜单中,打开
ShiftAssignmentdata 对象。 -
在 Data Objects 视角中,点右侧的
来打开 OptaPlanner dock。
- 选择 规划实体。
-
从
ShiftAssignmentdata 对象下的字段列表中选择employee。 在 OptaPlanner dock 中,选择 planning Variable。
在 Value Range Id 输入字段中,键入
employeeRange。这会将@ValueRangeProvider注释添加到计划实体,您可以通过单击设计程序中的Source选项卡来查看该注释。计划变量的值范围通过
@ValueRangeProvider注释来定义。@ValueRangeProvider注释始终具有属性id,它被@PlanningVariable属性valueRangeProviderRefs引用。- 关闭 dock 并点 Save 保存数据对象。
5.2.3.2. 创建员工规划解决方案 复制链接链接已复制到粘贴板!
员工 roster 问题依赖于定义的规划解决方案。计划解决方案通过使用红帽构建的 OptaPlanner dock 中提供的属性在域设计人员中定义。
先决条件
- 您已通过完成 第 5.2.3 节 “为员工漫长项目创建数据模型” 和 第 5.2.3.1 节 “创建员工规划实体” 中的步骤,创建了相关的数据对象和规划运行员工示例所需的数据对象。
流程
-
使用标识符
EmployeeRoster创建新数据对象。 创建以下字段:
Expand 表 5.6. EmployeeRoster id 类型 dayOffRequestListemployeerostering.employeerostering.DayOffRequest[List]shiftAssignmentListemployeerostering.employeerostering.ShiftAssignment[List]shiftListemployeerostering.employeerostering.Shift[List]skillListemployeerostering.employeerostering.Skill[List]timeslotListemployeerostering.employeerostering.Timeslot[List]-
在 Data Objects 视角中,点右侧的
来打开 OptaPlanner dock。
- 选择 规划解决方案。
-
将默认的硬
软分数保留为 解决方案分数类型。这会在EmployeeRoster数据对象中自动生成分数字段,其解决方案分数作为类型。 使用以下属性添加新字段:
Expand id 类型 employeeListemployeerostering.employeerostering.Employee[List]选择
employeeList字段后,打开 OptaPlanner dock,然后选择 planning Value Range Provider 框。在 id 字段中,键入
employeeRange。关闭 dock。- 单击右上角的 Save 以保存资产。
5.2.4. 员工划分限制 复制链接链接已复制到粘贴板!
员工名列是规划问题。所有规划问题均包括必须满足的约束才能找到最佳解决方案。
Business Central 中的员工漫长示例项目包括以下硬和软限制:
- 硬约束
- 每天仅分配一次变化。
- 所有需要特定员工技能的改变都被分配了具有该特定技能的员工。
- 软限制
- 所有员工都分配有变化。
- 如果员工每天没有请求,则会将其转移重新分配给另一个员工。
使用自由格式 DRL 设计程序或使用指导规则在 Business Central 中定义硬和软限制。
5.2.4.1. DRL (Drools 规则语言)规则 复制链接链接已复制到粘贴板!
DRL (Drools 规则语言)规则是您直接在 .drl 文本文件中定义的业务规则。这些 DRL 文件是最终呈现 Business Central 中所有其他规则资产的源。您可以在 Business Central 界面中创建和管理 DRL 文件,或使用 Red Hat CodeReady Studio 或其他集成开发环境(IDE)作为 Maven 或 Java 项目的一部分创建它们。DRL 文件可以包含一个或多个规则,它们至少定义规则条件(何时)和操作(然后)。Business Central 中的 DRL 设计程序提供了 Java、DRL 和 XML 的语法高亮显示。
DRL 文件由以下组件组成:
DRL 文件中的组件
以下示例 DRL 规则决定了 loan 应用程序决策服务中的年龄限制:
loan 应用程序年龄限制的规则示例
DRL 文件可包含一个或多个规则、查询和功能,并可定义您的规则和查询分配的资源声明,如导入、全局和属性。DRL 软件包必须列在 DRL 文件的顶部,并且规则通常会最后一个列出。所有其他 DRL 组件都可以遵循任何顺序。
每个规则必须在规则软件包中都有一个唯一名称。如果您在软件包中的任何 DRL 文件中使用相同的规则名称多次,则规则无法编译。始终使用双引号(规则"rule name")括起规则名称以防止可能的编译错误,特别是在规则名称中使用空格。
与 DRL 规则相关的所有数据对象都必须与 Business Central 中的 DRL 文件位于同一个项目中。默认情况下,同一软件包中的资产会导入。其他软件包中现有的资产可使用 DRL 规则导入。
5.2.4.2. 使用 DRL 设计程序定义员工的约束 复制链接链接已复制到粘贴板!
您可以使用 Business Central 中的自由格式 DRL 设计程序为员工漫长示例创建约束定义。
使用这个流程创建一个 硬约束,其中没有员工被分配时间超过 10 小时的改变。
流程
-
在 Business Central 中,前往 Menu
Design Projects,再单击项目名称。 -
点 Add Asset
DRL 文件。 -
在 DRL file name 字段中,键入
ComplexScoreRules。 -
选择
employeerostering.employeerostering软件包。 - 单击 +Ok 以创建 DRL 文件。
在 DRL 设计器的 Model 选项卡中,将
Employee10HourShiftSpace规则定义为 DRL 文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Save 保存 DRL 文件。
有关创建 DRL 文件的更多信息,请参阅使用 DRL 规则设计决策服务。
5.2.5. 使用指导规则为员工划分创建规则 复制链接链接已复制到粘贴板!
您可以使用 Business Central 中的指导规则设计人员创建硬和软约束。
5.2.5.1. 指导规则 复制链接链接已复制到粘贴板!
指导规则是在 Business Central 中的基于 UI 的引导规则设计程序中创建的业务规则,引导您通过规则创建流程。指导规则设计程序根据所定义的规则的数据对象提供可接受的输入字段和选项。您定义的指导规则被编译到 Drools 规则语言(DRL)规则中,与所有其他规则资产一样。
与指导规则相关的所有数据对象都必须与指导规则位于同一个项目中。默认情况下,同一软件包中的资产会导入。创建必要的数据对象和指导规则后,您可以使用指导规则设计器的 Data Objects 选项卡来验证所有所需的数据对象是否都已列出或导入其他现有 的数据对象。
5.2.5.2. 创建指导规则来平衡员工的改变数字 复制链接链接已复制到粘贴板!
BalanceEmployeesShiftNumber 指导规则创建一个软约束,以确保按尽可能平均平衡的方式分配到员工。它通过创建一个在变换发行版时增加的分数损失来达到此目的。分数公式由规则实施,以更均衡的方式替换 Solver 分发变化。
流程
-
在 Business Central 中,前往 Menu
Design Projects,再单击项目名称。 -
点 Add Asset
Guided Rule。 -
输入
BalanceEmployeesShiftNumber作为" 指导规则名称",然后选择employeerostering.employeerosteringPackage。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
-
在 Add a condition to the rule 窗口中选择
Employee。单击 +Ok。 -
点
Employee条件来修改约束,并添加变量名称$employee。 从 累积 中添加
WHEN 条件。-
在 From Aumulate 条件 上方,单击添加模式,然后从下拉列表中选择Number作为事实类型。 -
将变量名称
$shiftCount添加到Number条件。 -
在
From Accumulate条件下,单击添加模式,然后从下拉列表中选择ShiftAssignment事实类型。 -
将变量名称
$shiftAssignment添加到ShiftAssignment类型。 -
再次单击
ShiftAssignment条件,然后从 字段下拉列表中的 Add a limit,选择employee。 -
从
员工约束旁边的下拉列表中,选择等于。 -
点击下拉按钮旁的
图标添加变量,然后点击 Field value 窗口中的 Bound 变量。
-
从下拉列表中选择
$employee。 -
在 Function 框中,类型
count ($shiftAssignment)。
-
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
在 Add a new action 窗口中选择
Modify Soft Score。单击 +Ok。-
在框中键入以下表达式:
-($shiftCount.intValue ()*$shiftCount.intValue ())
-
在框中键入以下表达式:
- 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后再次尝试验证规则,直到规则通过为止。
- 单击 Save 以保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.5.3. 为每天不多的改变创建指导规则 复制链接链接已复制到粘贴板!
OneEmployeeShiftPerDay 指导规则创建硬约束,使员工不会每天分配多个变化。在 employee rostering 示例中,这个约束使用指导规则设计程序创建。
流程
-
在 Business Central 中,前往 Menu
Design Projects,再单击项目名称。 -
点 Add Asset
Guided Rule。 -
输入
OneEmployeeShiftPerDay作为" 指导规则名称",然后选择employeerostering.employeerosteringPackage。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
- 从 Add a condition to the rule 窗口中选择 Free form DRL。
在 free 表单 DRL 框中,输入以下条件:
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此条件指出,无法分配给已经在同一天有另一个转移的员工。
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
- 从 Add a new action 窗口中选择 Add free form DRL。
在 free 表单 DRL 框中,输入以下条件:
scoreHolder.addHardConstraintMatch(kcontext, -1);
scoreHolder.addHardConstraintMatch(kcontext, -1);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后再次尝试验证规则,直到规则通过为止。
- 单击 Save 以保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.5.4. 创建指导规则来匹配转换要求 复制链接链接已复制到粘贴板!
ShiftReqiredSkillsAreMet 指导规则会创建一个硬约束,确保为员工分配有正确技能集的员工。在 employee rostering 示例中,这个约束使用指导规则设计程序创建。
流程
-
在 Business Central 中,前往 Menu
Design Projects,再单击项目名称。 -
点 Add Asset
Guided Rule。 -
输入
ShiftReqiredSkillsAreMet作为 指导规则 名称,然后选择employeerostering.employeerosteringPackage。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
-
在 Add a condition to the rule 窗口中选择
ShiftAssignment。单击 +Ok。 -
单击
ShiftAssignment条件,然后从Add a limits on a field 下拉列表中选择 employee。 -
在设计人员中,单击
员工旁边的下拉列表,然后选择is not null。 单击
ShiftAssignment条件,然后单击 Expression 编辑器。-
在设计人员中,单击
[not bound]以打开 Expression 编辑器,并将表达式绑定到变量$requiredSkill。点 Set。 -
在设计过程中,在
$requiredSkill旁边,从第一个下拉列表中选择切换,然后从下一个下拉列表中选择requiredSkill。
-
在设计人员中,单击
单击
ShiftAssignment条件,然后单击 Expression 编辑器。-
在设计人员中,
[not bound]旁边,从第一个下拉列表中选择员工,然后从下一下拉列表中选择员工。 -
将下一个下拉列表保留为
Choose。 -
在下一个下拉菜单中,请更改
。以排除 -
点击
排除的
图标,在 Field value 窗口中点击 New formula 按钮。
-
在公式框中键入
$requiredSkill。
-
在设计人员中,
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
-
在 Add a new action 窗口中选择
Modify Hard Score。单击 +Ok。 -
在分数操作框中键入
-1。 - 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后再次尝试验证规则,直到规则通过为止。
- 单击 Save 以保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.5.5. 创建指导规则来管理一天 复制链接链接已复制到粘贴板!
DayOffRequest 指导规则创建一个软约束。通过这个约束,当最初分配该转换的员工不再能够工作时,可以将转换重新分配给另一个员工。在 employee rostering 示例中,这个约束使用指导规则设计程序创建。
流程
-
在 Business Central 中,前往 Menu
Design Projects,再单击项目名称。 -
点 Add Asset
Guided Rule。 -
输入
DayOffRequest作为" 指导规则名称",然后选择employeerostering.employeerostering软件包。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
- 从 Add a condition to the rule 窗口中选择 Free form DRL。
在 free 表单 DRL 框中,输入以下条件:
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此条件表示,如果将转换分配给制定一天的员工,则员工可以取消分配该日期的转变。
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
- 从 Add a new action 窗口中选择 Add free form DRL。
在 free 表单 DRL 框中,输入以下条件:
scoreHolder.addSoftConstraintMatch(kcontext, -100);
scoreHolder.addSoftConstraintMatch(kcontext, -100);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后再次尝试验证规则,直到规则通过为止。
- 单击 Save 以保存规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.6. 为员工名电创建解决者配置 复制链接链接已复制到粘贴板!
您可以在 Business Central 中创建和编辑 Solver 配置。Solver 配置设计程序会创建一个解析器配置,可在部署项目后运行。
先决条件
- Red Hat Decision Manager 已下载并安装。
- 您已为员工漫长示例创建并配置了所有相关资产。
流程
-
在 Business Central 中,点 Menu
Projects,然后点击您的项目来打开它。 -
在 Assets 视角中,点 Add Asset
Solver configuration 在 Create new Solver configuration 窗口中,为您的 Solver 输入名称
EmployeeRosteringSolverConfig,然后点 Ok。这将打开 Solv er 配置设计 程序。
在 Score Director Factory 配置部分中,定义一个包含 scoring 规则定义的 KIE 基础。员工示例项目使用
defaultKieBase。-
选择在 KIE 库中定义的 KIE 会话之一。员工漫长示例项目使用
defaultKieSession。
-
选择在 KIE 库中定义的 KIE 会话之一。员工漫长示例项目使用
- 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,请解决错误消息中描述的任何问题,然后重试验证,直到配置通过为止。
- 点 Save 保存 Solver 配置。
5.2.7. 为员工名电项目配置 Solver 终止 复制链接链接已复制到粘贴板!
您可以在指定时间后将 Solver 配置为终止。默认情况下,计划引擎会提供无限时间段来解决问题实例。
员工示例项目设置为运行 30 秒。
先决条件
-
您已为员工漫长项目创建了所有相关资产,并在 Business Central 中创建了
EmployeeRosteringSolverConfigsolver 配置,如 第 5.2.6 节 “为员工名电创建解决者配置” 所述。
流程
-
从 Assets 视角打开
EmployeeRosteringSolverConfig。这将打开 Solv er 配置设计 程序。 - 在 Termination 部分中,单击 Add 在所选逻辑组中创建新的 termination 元素。
-
从下拉列表中选择所用的终止类型。这在终止配置中作为输入字段添加。 - 使用时间元素旁边的箭头将时间调整为 30 秒。
- 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,请解决错误消息中描述的任何问题,然后重试验证,直到配置通过为止。
- 点 Save 保存 Solver 配置。