如何通过日期设置累计轮班时间

问题描述 投票:0回答:1

我有一个轮班课程,它返回轮班的信息。

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
,它将包含一个日期。使用此日期值,我们必须将与
businessDate
匹配的 Shift 集合的持续时间相加。

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");
    }
java optaplanner timefold
1个回答
0
投票

它不起作用的原因是因为你有一个

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");
    }

该列表有作用吗?它在您提供的约束中未使用。如果没有,我建议删除它。

© www.soinside.com 2019 - 2024. All rights reserved.