如何处理 Optaplanner 中的重复可用性?

问题描述 投票:0回答:1

我在 Optaweb(目前已停产)平台上工作,我有一个

EmployeeAvailability
类,我可以在其中定义一个
startDateTime
和一个
endDateTime
和状态(以下之一:
UNAVAILABLE
UNDESIRED
DESIRED
)。然而,这些都是奇异事件。我想要的是
EmployeeAvailability
是一个重复发生的事件。我可以在哪里定义它的重复周期(例如每个星期五),然后它会在计划轮班时自动处理。我怎样才能做到这一点?我不是在寻找非常具体的说明,而是在更高层次上理解如何做到这一点。

现在,我尝试通过在每个

isRecurring
上设置一个标志
EmployeeAvailability
来解决这个问题,然后当我计划下周时,我运行一个函数来复制所有
EmployeeAvailability
和过去一周的
isRecurring == True
.这适用于每周重复,但这是一个非常手动的过程。

理想情况下,我想要:

java optaplanner recurrence
1个回答
0
投票

一种方法是创建一个新类,

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()));
}
© www.soinside.com 2019 - 2024. All rights reserved.