我在 Optaweb(目前已停产)平台上工作,我有一个
EmployeeAvailability
类,我可以在其中定义一个 startDateTime
和一个 endDateTime
和状态(以下之一:UNAVAILABLE
,UNDESIRED
,DESIRED
)。然而,这些都是奇异事件。我想要的是 EmployeeAvailability
是一个重复发生的事件。我可以在哪里定义它的重复周期(例如每个星期五),然后它会在计划轮班时自动处理。我怎样才能做到这一点?我不是在寻找非常具体的说明,而是在更高层次上理解如何做到这一点。
现在,我尝试通过在每个
isRecurring
上设置一个标志EmployeeAvailability
来解决这个问题,然后当我计划下周时,我运行一个函数来复制所有EmployeeAvailability
和过去一周的isRecurring == True
.这适用于每周重复,但这是一个非常手动的过程。
理想情况下,我想要:
EmployeeAvailability
对象,而只有一个对象定义了循环模式。当需要在前端显示或需要由求解器求解时,可以将此对象转换为单独的对象?我不推荐这个:https://github.com/bmoeskau/Extensible/blob/master/recurrence-overview.md一种方法是创建一个新类,
EmployeeAvailabilityPattern
,它有一个方法,appliesToShift(Shift)
,如果 Shift 匹配可用性模式,则返回 true,否则返回 false。
那么匹配EmployeeAvailabilityPattern
的约束看起来像这样:
private static BiConstraintStream<EmployeeAvailabilityPattern, Shift> getConstraintStreamWithAvailabilityPatternIntersections(
ConstraintFactory constraintFactory, EmployeeAvailabilityState employeeAvailabilityState) {
return constraintFactory.forEach(EmployeeAvailabilityPattern.class)
.filter(pattern -> pattern.getState() == employeeAvailabilityState)
.join(Shift.class,
equal(EmployeeAvailabilityPattern::getEmployee, Shift::getEmployee))
.filter((pattern, shift) -> pattern.appliesToShift(shift));
}
Constraint unavailablePatternEmployeeTimeSlot(ConstraintFactory constraintFactory) {
return getConstraintStreamWithAvailabilityPatternIntersections(constraintFactory, UNAVAILABLE)
.penalizeConfigurableLong(CONSTRAINT_UNAVAILABLE_TIME_SLOT_FOR_AN_EMPLOYEE,
((employeeAvailability, shift) -> shift.getLengthInMinutes()));
}