Добавить параметр ограничения для минимального количества часов между сменами в расписании сотрудников.

Вопрос или проблема

Я пытаюсь изменить ограничение в примере быстрого старта по составлению расписания сотрудников, чтобы поддерживать параметры, но, похоже, это не работает.

Я изменил код так, не уверен, почему это не работает.

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 сменами");
}

Ответ или решение

Понять, почему ваш код может не работать, возможно, связано с несколькими факторами. Давайте проанализируем ваш код и исправим проблемы, чтобы обеспечить корректную реализацию ограничения для минимального времени между сменами в расписании сотрудников.

Ваша цель – установить обязательное условие, которое требует, чтобы между сменами сотрудников было не менее определенного количества часов. Следуя вашей логике, давайте разберем код:

  1. Вы правильно используете forEach, чтобы рассматривать каждую смену.
  2. Вы соединяете смены с помощью join, основываясь на том, что они принадлежат одному и тому же сотруднику, и проверяете, что время окончания первой смены меньше или равно времени начала второй смены.
  3. Использование 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 сменами");
}

Дополнительные рекомендации:

  1. Инициализация параметров: Убедитесь, что ConstraintParameters правильно инициализируется и доступен в области видимости, где используется это ограничение. Возможно, вам нужно будет передать его как часть контекста или конфигурации.

  2. Тестирование кода: После внесения изменений обязательно протестируйте ваше ограничение с различными сценариями, чтобы убедиться, что оно работает должным образом.

  3. Логирование: Возможно, добавление логирования внутри фильтров и штрафов может помочь выявить, что именно идет не так.

Следуя этим рекомендациям и исправлениям, вы сможете достичь необходимого функционирования в системе планирования смен. Удачи в ваших разработках!

Оцените материал
Добавить комментарий

Капча загружается...