我有一个轮班课程,它返回轮班的信息。
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");
}
它不起作用的原因是因为你有一个
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");
}
该列表有作用吗?它在您提供的约束中未使用。如果没有,我建议删除它。