java 如何在Optaplanner中处理定期可用性?

lhcgjxsq  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(99)

我在Optaweb(目前已停产)平台上工作,我有一个EmployeeAvailability类,我可以在其中定义startDateTimeendDateTime以及状态(以下之一):UNAVAILABLEUNDESIREDDESIRED).然而,这些都是单一事件.我想要的是为EmployeeAvailability是一个循环事件.在那里我可以定义它的循环(例如每周五),然后它自动处理时,计划转移.我怎么能做到这一点?我不是在寻找非常具体的说明,但如何做到这一点的更高层次的理解.
现在,我尝试通过在每个EmployeeAvailability上设置一个标志isRecurring来解决这个问题,然后当我计划下一周时,我运行一个函数来复制过去一周中所有的EmployeeAvailabilityisRecurring == True
理想情况下,我希望:

yjghlzjz

yjghlzjz1#

一种方法是创建一个新类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()));
}

相关问题