Как суммировать продолжительность смены с настройкой дня

У меня есть класс смены, который возвращает информацию о смене.

public class Shift {
    @PlanningId
    private String id;

    private LocalDateTime start;
    private LocalDateTime end;
    public Long getShiftDuration() {
        long minutes = ChronoUnit.MINUTES.between(start, end);
        
        return minutes;
    }
    
    public String getBusinessDate() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateStr = getStart().toLocalDate().format(formatter);
        return dateStr;
    }
}

Затем у меня есть класс DaySettingFlat, который содержит список дат, которые нам нужны для расчета суммы продолжительности смен. Дата, указанная в DaySettingFlat, содержит переменную businessDate, которая будет содержать дату. С помощью этого значения даты мы должны суммировать длительности коллекции Shift, соответствующие businessDate.

public class DaySettingFlat {
    String businessDate;
    Integer sumOfShiftDuration;
}

Оба класса зарегистрированы как @ProblemFactCollectionProperty. Теперь для каждой записи DaySettingFlat нам нужно суммировать продолжительность смен для даты, хранящейся в businessDate. И Shift, и DaySettingFlat используются как коллекция.

Я попробовал следующее, но это не работает, выдает ошибку компиляции:

    Constraint daySettingStandardNumberOfHours(ConstraintFactory constraintFactory) {
        return constraintFactory.forEach(DaySettingFlat.class)
                .join(Shift.class, equal(DaySettingFlat::getBusinessDate, Shift::getStartDate))
//Getting error on group by 
                .groupBy(Shift::getStartDate,
                         ConstraintCollectors.toList(),
                         ConstraintCollectors.sumLong(Shift::getShiftDuration))
                .penalize(HardMediumSoftScore.ONE_HARD, (date, list, totalDuration)->{
                    return totalDuration;
                }).asConstraint("daySettingStandardNumberOfHours");
    }

С вашей репутацией и, следовательно, опытом работы с SO вы должны знать, что фраза «это не работает» на самом деле не поможет. Можете ли вы уточнить, в чем именно это не работает?

Thomas 20.06.2024 08:03

Кроме того, я бы использовал Duration для продолжительности смены и для ее суммы, для более четкого кода, чем вы получаете с intInteger, не знаю, почему вы ввели туда объект).

Anonymous 20.06.2024 11:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина, по которой это не работает, заключается в том, что у вас есть BiConstraintStream, поэтому вам нужно предоставить функцию, которая принимает и DaySettingFlat, и Shift:

    Constraint daySettingStandardNumberOfHours(ConstraintFactory constraintFactory) {
        return constraintFactory.forEach(DaySettingFlat.class)
                .join(Shift.class, equal(DaySettingFlat::getBusinessDate, Shift::getStartDate))
                .groupBy((day, shift) -> shift.getStartDate(),
                         ConstraintCollectors.toList((day, shift) -> day),
                         ConstraintCollectors.sumLong((day, shift) -> shift.getShiftDuration()))
                .penalize(HardMediumSoftScore.ONE_HARD, (date, list, totalDuration)->{
                    return totalDuration;
                }).asConstraint("daySettingStandardNumberOfHours");
    }

Список что-нибудь делает? Он не используется в предоставленном вами ограничении. Если нет, то рекомендую удалить.

И примечание: вы можете использовать sumDuration javadoc.io/static/ai.timefold.solver/timefold-solver-core/…, если вы изменили getShiftDuration, чтобы вернуть Duration.

Christopher Chianelli 21.06.2024 03:34

Другие вопросы по теме

Почему после обновления TimeFold guiScoreDirector.getIndictmentMap() возвращает значение null
Timefold: лучшие практики использования Spring JPA в проекте школьного расписания
Организация планирования с несколькими переменными планирования не будет постоянно пробовать некоторые сценарии
Как принудительно сгруппировать уроки для одной и той же серии учеников в одном временном интервале и в одном и том же таймфолде/оптапланнере комнаты?
Timefold Solver по умолчанию применяет ограничения на основе приоритета/порядка ограничений (из ConstraintProvider)?
Какие алгоритмы используются Timefold Solver по умолчанию, если вы не предоставляете никакой конфигурации?
Временной интервал: как создать ограничение на мощность оборудования на заданиях, запланированных для сотрудников?
Как получить последовательные пары уроков (в зависимости от их временного интервала) в Timefold?
OptaPlanner — используйте groupBy для избежаниеOvertime, но только на ресурсе, создающем сверхурочную работу
Как динамически выбирать, какие ограничения следует применять к задаче оптимизации на основе входных данных внешнего интерфейса в Timefold Spring Boot?