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 角色的用户登录。

流程

  1. MenuDesignProjectsAdd Project 在 Business Central 中创建一个新项目。
  2. Add Project 窗口中填写以下字段:

    • 名称:employee-rostering
    • 描述(可选):使用 OptaPlanner 提升问题优化。分配员工以根据其领导进行过渡。

    (可选)单击 Configure Advanced Options 以填充 组 ID工件 ID 和版本信息。

    • 组 IDemployeerostering
    • 工件 IDemployeerostering
    • Version:1.0.0-SNAPSHOT
  3. 单击 Add,将项目添加到 Business Central 项目存储库。

6.2.2. 问题事实和计划实体

员工规划问题中的每个域类被归类为以下之一:

  • 不相关的类:没有被任何分数约束使用。从计划角度来说,这些数据已过时。
  • 问题事实 类:由分数限制使用,但在规划过程中不会改变(只要问题保持不变),例如 ShiftEmployee。问题事实类的所有属性都是问题属性。
  • 计划实体 类:由分数约束使用,并在规划过程中更改,例如 ShiftAssignment。规划期间更改的属性是 规划变量。其他属性是问题属性。

    请询问以下问题:

  • 规划过程中发生了什么类变化?
  • 哪个类有我希望更改 Solver 的变量?

    该类是计划实体。

    规划实体类需要使用 @PlanningEntity 注释进行注解,或使用在域设计器中的 OptaPlanner dock 在 Business Central 中定义。

    每个计划实体类都有一个或多个 规划变量,还必须具有一个或多个定义属性。

    大多数用例都只有一个计划实体类,每个计划实体类只能有一个规划变量。

6.2.3. 为员工项目创建数据模型

使用本节创建在 Business Central 中运行员工示例项目所需的数据对象。

先决条件

流程

  1. 使用新项目,点项目视角中的 Data Object,或者点击 Add AssetData Object 来创建新项目对象。
  2. 命名第一个数据对象 Timeslot,然后选择 employeerostering.employeerostering 作为 Package

    确定

  3. Data Objects 视角中,点 +add 字段Timeslot 数据对象添加字段。
  4. id 字段中,键入 endTime
  5. 单击 Type 旁边的下拉菜单,再选择 LocalDateTime
  6. Create and continue 添加另一个字段。
  7. 添加另一个字段,其 id startTimeType LocalDateTime
  8. Create
  9. 点右上角的 Save,以保存 Timeslot 数据对象。
  10. 点右上角的 x 关闭 Data Objects 视角,并返回到 Assets 菜单。
  11. 使用前面的步骤,创建以下数据对象及其属性:

    表 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 数据对象定义为员工的计划实体。

先决条件

流程

  1. 在项目 资产 菜单中,打开 ShiftAssignment 数据对象。
  2. Data Objects 视角中,点右侧的 OptaPlanner icon 来打开 OptaPlanner dock。
  3. 选择 Planning Entity
  4. ShiftAssignment 数据对象下的字段列表中选择 employee
  5. 在 OptaPlanner dock 中,选择 Planning Variable

    Value Range Id 输入字段中,键入 employeeRange。这会在规划实体中添加 @ValueRangeProvider 注释,您可以通过单击设计器中的 Source 选项卡来查看该注释。

    规划变量的值范围通过 @ValueRangeProvider 注释定义。@ValueRangeProvider 注释始终具有属性 id,它由 @PlanningVariable 属性 valueRangeProviderRefs 引用。

  6. 关闭 dock 并点 Save 保存数据对象。

6.2.3.2. 创建员工 roster 规划解决方案

员工的 roster 问题依赖于定义的规划解决方案。规划解决方案在使用 Red Hat build of OptaPlanner dock 中提供的属性在域设计器中定义。

先决条件

流程

  1. 使用标识符 EmployeeRoster 创建新数据对象。
  2. 创建以下字段:

    表 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]

  3. Data Objects 视角中,点右侧的 OptaPlanner icon 来打开 OptaPlanner dock。
  4. 选择规划解决方案
  5. 将默认的 Hard soft score 保留为 Solution Score Type。这会在 EmployeeRoster 数据对象中自动生成 score 字段,其解决方案分数作为类型。
  6. 使用以下属性添加新字段:

    id类型

    employeeList

    employeerostering.employeerostering.Employee[List]

  7. 选择 employeeList 字段后,打开 OptaPlanner dock 并选择 Planning Value Range Provider 复选框。

    id 字段中,键入 employeeRange。关闭 dock。

  8. 点右上角的 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 小时的转换。

流程

  1. 在 Business Central 中,进入 MenuDesignProjects,然后点击项目名称。
  2. Add AssetDRL file
  3. DRL 文件名 字段中,键入 ComplexScoreRules
  4. 选择 employeerostering.employeerostering 软件包。
  5. 单击 +Ok 以创建 DRL 文件。
  6. 在 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
  7. 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 以更均衡的方式分发转换。

BalanceEmployeesShiftNumber 指导规则

流程

  1. 在 Business Central 中,进入 MenuDesignProjects,然后点击项目名称。
  2. Add AssetDatacenter Rule
  3. 输入 BalanceEmployeesShiftNumber 作为 指导规则 名称,然后选择 employeerostering.employeerostering Package
  4. Ok 创建规则资产。
  5. WHEN 字段中的 5686 来添加 WHEN 条件。
  6. Add a condition to the rule 窗口中选择 Employee。单击 +Ok
  7. Employee 条件来修改约束,并添加变量名称 $employee
  8. 从 Accumulate 添加 WHEN 条件。

    1. From Accumulate 条件之上 ,单击 Click to add mode,然后从下拉列表中选择 Number 作为事实类型。
    2. 将变量名称 $shiftCount 添加到 Number 条件。
    3. From Accumulate 条件下 ,单击 Click to add mode,然后从下拉列表中选择 ShiftAssignment fact 类型。
    4. 将变量名称 $shiftAssignment 添加到 ShiftAssignment 事实类型。
    5. 再次点 ShiftAssignment 条件,然后从 Add a limit on a field 下拉列表中选择 employee
    6. employee 约束旁边的下拉列表中,选择 equal 等于
    7. 点击下拉按钮旁的 edit 图标添加变量,然后点击 Field value 窗口中的 Bound 变量
    8. 从下拉列表中选择 $employee
    9. Function 框中,键入 count ($shiftAssignment)
  9. wordpress N 字段中的 5686 来添加 wordpressN 条件。
  10. Add a new action 窗口中选择 Modify Soft Score。单击 +Ok

    1. 在框中键入以下表达式: -($shiftCount.intValue () 39)$shiftCount.intValue ())
  11. 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
  12. Save 保存规则。

有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务

6.2.5.3. 创建一个指导规则,每天不多于一个

OneEmployeeShiftPerDay 指南规则会创建一个硬约束,员工每天不会分配多个迁移。在 employee rostering 示例中,此约束是使用指导规则设计器创建的。

OneEmployeeShiftPerDay 专家规则

流程

  1. 在 Business Central 中,进入 MenuDesignProjects,然后点击项目名称。
  2. Add AssetDatacenter Rule
  3. 输入 OneEmployeeShiftPerDay 作为 指导规则 名称,然后选择 employeerostering.employeerostering Package
  4. Ok 创建规则资产。
  5. WHEN 字段中的 5686 来添加 WHEN 条件。
  6. Add a condition to the rule 窗口中选择 Free form DRL
  7. 在自由形式 DRL 框中键入以下条件:

    $shiftAssignment : ShiftAssignment( employee != null )
    		ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )

    此条件指出无法将转换分配给同一天已有另一个转换分配的员工。

  8. wordpress N 字段中的 5686 来添加 wordpressN 条件。
  9. Add a new action 窗口中选择 Add free form DRL
  10. 在自由形式 DRL 框中键入以下条件:

    scoreHolder.addHardConstraintMatch(kcontext, -1);
  11. 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
  12. Save 保存规则。

有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务

6.2.5.4. 创建指导规则以匹配与迁移要求相关的问题

ShiftReqiredSkillsAreMet 指导规则会创建一个硬约束,以确保所有转换均被分配一个具有正确学习集的员工。在 employee rostering 示例中,此约束是使用指导规则设计器创建的。

ShiftRequiredSkillsAreMet 指导规则

流程

  1. 在 Business Central 中,进入 MenuDesignProjects,然后点击项目名称。
  2. Add AssetDatacenter Rule
  3. 输入 ShiftReqiredSkillsAreMet 作为 指导规则 名称,然后选择 employeerostering.employeerostering Package
  4. Ok 创建规则资产。
  5. WHEN 字段中的 5686 来添加 WHEN 条件。
  6. 在规则窗口中选择 ShiftAssignment。单击 +Ok
  7. ShiftAssignment 条件,然后从 Add a limits on a field 下拉列表中选择 employee
  8. 在设计人员中,单击 employee 旁边的下拉列表,然后选择 不是 null
  9. ShiftAssignment 条件,然后点 Expression 编辑器

    1. 在设计人员中,单击 [not bound] 以打开 Expression 编辑器,并将表达式绑定到变量 $requiredSkill。点 Set
    2. 在设计人员中,在 $requiredSkill 旁边,从第一个下拉列表中选择 move,然后从下一个下拉列表中选择 requiredSkill
  10. ShiftAssignment 条件,然后点 Expression 编辑器

    1. 在设计人员中,在 [not bound] 旁边,从第一个下拉列表中选择 employee,然后从下一下拉列表中选择 skills
    2. 接下来的下拉列表保留为 Choose
    3. 在下一个下拉菜单中,将 please choose 改为 excludes
    4. 点击 排除edit 图标,在 Field value 窗口中点击 New formula 按钮。
    5. 在公式框中输入 $requiredSkill
  11. wordpress N 字段中的 5686 来添加 wordpressN 条件。
  12. Add a new action 窗口中选择 Modify Hard Score。单击 +Ok
  13. 在 score 操作框中键入 -1
  14. 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
  15. Save 保存规则。

有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务

6.2.5.5. 创建指导规则来管理第二天请求

DayOffRequest 指导规则创建一个软限制。如果最初分配了转换的员工,这个约束允许被重新分配给另一员工。在 employee rostering 示例中,此约束是使用指导规则设计器创建的。

DayOffRequest 指导规则

流程

  1. 在 Business Central 中,进入 MenuDesignProjects,然后点击项目名称。
  2. Add AssetDatacenter Rule
  3. 输入 DayOffRequest 作为 指导规则 名称,然后选择 employeerostering.employeerostering Package
  4. Ok 创建规则资产。
  5. WHEN 字段中的 5686 来添加 WHEN 条件。
  6. Add a condition to the rule 窗口中选择 Free form DRL
  7. 在自由形式 DRL 框中键入以下条件:

    $dayOffRequest : DayOffRequest( )
    		ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )

    此条件指出,如果将过渡分配给发出一天的员工,则员工就有可能被取消分配这个变化。

  8. wordpress N 字段中的 5686 来添加 wordpressN 条件。
  9. Add a new action 窗口中选择 Add free form DRL
  10. 在自由形式 DRL 框中键入以下条件:

    scoreHolder.addSoftConstraintMatch(kcontext, -100);
  11. 单击右上角的 Validate,以检查所有规则条件是否有效。如果规则验证失败,请解决错误消息中描述的任何问题,检查规则中的所有组件,然后重试验证规则直到规则通过为止。
  12. Save 保存规则。

有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务

6.2.6. 为员工创建 solver 配置

您可以在 Business Central 中创建和编辑 Solver 配置。Solver 配置设计器会创建一个解析器配置,可在项目部署后运行。

先决条件

  • Red Hat Process Automation Manager 已下载并安装。
  • 您已为员工创建并配置了所有相关资产。

流程

  1. 在 Business Central 中,点击 MenuProjects,然后点击您的项目打开它。
  2. Assets 视角中,点 Add AssetSolver configuration
  3. Create new Solver 配置 窗口中,为您的 Solver 输入名称 EmployeeRosteringSolverConfig 并点 Ok

    这将打开 Solver 配置 设计器。

  4. Score Director Factory 配置部分中,定义包含评分规则定义的 KIE 基础。员工示例项目使用 defaultKieBase

    1. 选择 KIE 基础中定义的 KIE 会话之一。员工示例项目使用 defaultKieSession
  5. 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,请解决错误消息中描述的任何问题,然后重试验证直到配置通过为止。
  6. Save 保存 Solver 配置。

6.2.7. 为员工排班项目配置 Solver 终止

您可以将 Solver 配置为在指定时间后终止。默认情况下,计划引擎被授予无限时间来解决问题实例。

employee rostering 示例项目被设置为运行 30 秒。

先决条件

流程

  1. Assets 视角打开 EmployeeRosteringSolverConfig。这将打开 Solver 配置 设计器。
  2. Termination 部分中,点 Add 在所选逻辑组中创建新的 termination 元素。
  3. 从下拉列表中选择 Time consumed 终止类型。这在终止配置中作为输入字段添加。
  4. 使用 time 元素旁的箭头来调整到 30 秒的时间。
  5. 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,请解决错误消息中描述的任何问题,然后重试验证直到配置通过为止。
  6. Save 保存 Solver 配置。