Вопрос или проблема
Я пытаюсь изменить ограничение в примере быстрого старта по составлению расписания сотрудников, чтобы поддерживать параметры, но, похоже, это не работает.
Я изменил код так, не уверен, почему это не работает.
Constraint atLeast10HoursBetweenTwoShifts(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Shift.class)
.join(Shift.class, equal(Shift::getEmployee), lessThanOrEqual(Shift::getEnd, Shift::getStart))
.join(ConstraintParameters.class)
.filter((firstShift,
secondShift, constraintParameters) -> {
return Duration.between(firstShift.getEnd(), secondShift.getStart()).toHours() < constraintParameters.minRestHours();
})
.penalize(HardSoftBigDecimalScore.ONE_HARD,
(firstShift, secondShift, constraintParameters) -> {
int breakLength = (int) Duration.between(firstShift.getEnd(), secondShift.getStart()).toMinutes();
return (constraintParameters.minRestHours() * 60) - breakLength;
})
.asConstraint("Не менее 10 часов между 2 сменами");
}
Ответ или решение
Понять, почему ваш код может не работать, возможно, связано с несколькими факторами. Давайте проанализируем ваш код и исправим проблемы, чтобы обеспечить корректную реализацию ограничения для минимального времени между сменами в расписании сотрудников.
Ваша цель – установить обязательное условие, которое требует, чтобы между сменами сотрудников было не менее определенного количества часов. Следуя вашей логике, давайте разберем код:
- Вы правильно используете
forEach
, чтобы рассматривать каждую смену. - Вы соединяете смены с помощью
join
, основываясь на том, что они принадлежат одному и тому же сотруднику, и проверяете, что время окончания первой смены меньше или равно времени начала второй смены. - Использование
ConstraintParameters
является хорошей идеей для передачи параметров, но вы, похоже, не инициализируете этот объект должным образом.
Важный момент, который следовало бы уточнить: нужно убедиться, что ConstraintParameters
корректно передается и инициализируется в вашей зависимости.
Исправленный код
Давайте я предложу вам исправленный вариант вашего кода:
Constraint atLeastMinHoursBetweenTwoShifts(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Shift.class)
.join(Shift.class,
equal(Shift::getEmployee),
lessThanOrEqual(Shift::getEnd, Shift::getStart))
.filter((firstShift, secondShift) -> {
// Добавляем проверку на ненулевой параметр
// Если параметр не инициализирован, возвращаем False
if (constraintParameters == null) {
return false;
}
return Duration.between(firstShift.getEnd(), secondShift.getStart()).toHours() < constraintParameters.minRestHours();
})
.penalize(HardSoftBigDecimalScore.ONE_HARD,
(firstShift, secondShift) -> {
// Здесь мы вычисляем штраф, если время между сменами меньше минимально необходимого
long breakLength = Duration.between(firstShift.getEnd(), secondShift.getStart()).toMinutes();
return (constraintParameters.minRestHours() * 60) - breakLength;
})
.asConstraint("Минимум 10 часов между 2 сменами");
}
Дополнительные рекомендации:
-
Инициализация параметров: Убедитесь, что
ConstraintParameters
правильно инициализируется и доступен в области видимости, где используется это ограничение. Возможно, вам нужно будет передать его как часть контекста или конфигурации. -
Тестирование кода: После внесения изменений обязательно протестируйте ваше ограничение с различными сценариями, чтобы убедиться, что оно работает должным образом.
-
Логирование: Возможно, добавление логирования внутри фильтров и штрафов может помочь выявить, что именно идет не так.
Следуя этим рекомендациям и исправлениям, вы сможете достичь необходимого функционирования в системе планирования смен. Удачи в ваших разработках!