Почему Optaplanner полностью пропускает сотрудника при минимальном ограничении работы в неделю?
У меня есть решение для планирования, которое на данный момент очень похоже на пример составления списка сотрудников. Проблема возникла, когда я попытался добавить настраиваемое правило, которое добавляет ограничение на минимальное количество минут, которое сотрудник должен проработать в течение недели. В данном случае 60*40 минут.
Как видите, он выглядит примерно так же, как weeklyMinutesMustNotExceedContractMaximum.
Единственное отличие состоит в том, что символ больше, чем в последнем фильтре, изменился на символ меньше, чем.
Constraint weeklyMinutesMustNotFallBelowContractMinimum(ConstraintFactory constraintFactory) {
return constraintFactory.from(RosterConstraintConfiguration.class).join(User.class)
.filter((config, user) -> user.getContract().getMinPerWeek() != null)
.join(Shift.class, equal((config, user) -> user, Shift::getUser))
.groupBy((config, user, shift) -> user,
(config, user, shift) -> extractFirstDayOfWeek(config.getWeekStartDay(),
shift.getStartDateTime()),
sumDuration((config, user, shift) -> between(shift.getStartDateTime(),
shift.getEndDateTime())))
.filter((user, firstDayOfWeek,
totalWorkingTime) -> totalWorkingTime.toMinutes() < user.getContract()
.getMinPerWeek())
.penalizeConfigurableLong(CONSTRAINT_WEEKLY_MINUTES_MUST_NOT_BE_BELOW_CONTRACT_MINIMUM,
(user, firstDayofWeek, totalWorkingTime) -> {
return user.getContract().getMinPerWeek().longValue()
- totalWorkingTime.toMinutes();
});
}
По какой-то причине optaplanner полностью игнорирует указанное выше ограничение и вообще не назначает смену пользователю (см. Рисунок ниже UserId 5 теперь имеет ограничение минимум 800 минут в неделю).
Есть ли какие-то базовые функции, которые мне не хватает? Поскольку это правило сопоставлено с жестким ограничением, это должно быть наказано, верно?