Commit 049f4fd0 by 刘鑫

fix(工程师时间片容量): 时间片容量存在负值情况, 修订计算订单与休息时间时进行已用时间段并集运算,避免重复时间交叉计算

1 parent ff5aa178
...@@ -93,21 +93,22 @@ public class CapacityUtils { ...@@ -93,21 +93,22 @@ public class CapacityUtils {
List<OccupyInfoDetail> configs) { List<OccupyInfoDetail> configs) {
//工作日历使用时间片 //工作日历使用时间片
List<OccupyInfo> calendar = Optional.ofNullable(configs).orElse(Collections.emptyList()) List<OccupyInfoDetail> calendar = Optional.ofNullable(configs).orElse(Collections.emptyList())
.stream() .stream()
.filter(t -> DateUtil.checkTimesHasOverlap(t.getBeginTime(), t.getEndTime(), startTime, endTime)) .filter(t -> DateUtil.checkTimesHasOverlap(t.getBeginTime(), t.getEndTime(), startTime, endTime))
.map(e -> DateUtil.timesOverlap(e.getBeginTime(), e.getEndTime(), startTime, endTime)) .map(e -> DateUtil.intersection(e.getBeginTime(), e.getEndTime(), startTime, endTime))
.collect(Collectors.toList()); .collect(Collectors.toList());
// 工单已使用的时间片 // 工单已使用的时间片
List<OccupyInfo> order = Optional.ofNullable(orders).orElse(Collections.emptyList()) List<OccupyInfoDetail> order = Optional.ofNullable(orders).orElse(Collections.emptyList())
.stream() .stream()
.filter(t -> DateUtil.checkTimesHasOverlap(t.getPlanStartTime(), t.getPlanEndTime(), startTime, endTime)) .filter(t -> DateUtil.checkTimesHasOverlap(t.getPlanStartTime(), t.getPlanEndTime(), startTime, endTime))
.map(e -> DateUtil.timesOverlap(e.getPlanStartTime(), e.getPlanEndTime(), startTime, endTime)) .map(e -> DateUtil.intersection(e.getPlanStartTime(), e.getPlanEndTime(), startTime, endTime))
.collect(Collectors.toList()); .collect(Collectors.toList());
List<OccupyInfoDetail> resultList = Stream.of(calendar, order).flatMap(Collection::stream).collect(Collectors.toList());
resultList = calculateUnion(resultList);
//存放所有的已用时间段信息 //存放所有的已用时间段信息
return Stream.of(calendar, order).flatMap(Collection::stream) return resultList.stream().sorted(Comparator.comparing(OccupyInfo::getBeginTime)).collect(Collectors.toList());
.sorted(Comparator.comparing(OccupyInfo::getBeginTime)).collect(Collectors.toList());
} }
......
...@@ -86,7 +86,7 @@ public class CalcEngineerCapacityScheduler { ...@@ -86,7 +86,7 @@ public class CalcEngineerCapacityScheduler {
} }
} }
private void calcOneEngineer(String date, String engineerCode) { public void calcOneEngineer(String date, String engineerCode) {
CapacityEngineerStatEntity statEntity = capacityEngineerStatDao.getByWorkdayAndEngineerCode(date, engineerCode); CapacityEngineerStatEntity statEntity = capacityEngineerStatDao.getByWorkdayAndEngineerCode(date, engineerCode);
if (statEntity == null) { if (statEntity == null) {
log.error("错误:日期[{}]技术员[{}]容量尚未初始化,忽略退出!", date, engineerCode); log.error("错误:日期[{}]技术员[{}]容量尚未初始化,忽略退出!", date, engineerCode);
...@@ -145,7 +145,7 @@ public class CalcEngineerCapacityScheduler { ...@@ -145,7 +145,7 @@ public class CalcEngineerCapacityScheduler {
long totalUseTime = occupyInfo.stream().mapToLong(t -> Duration.between(t.getEndTime(), t.getBeginTime()).abs().toMinutes()).sum(); long totalUseTime = occupyInfo.stream().mapToLong(t -> Duration.between(t.getEndTime(), t.getBeginTime()).abs().toMinutes()).sum();
//最大连续时长 //最大连续时长
List<OccupyInfoDetail> durationTime = CapacityUtils.getMaxRemainBlock(startTime, endTime, occupyInfo); List<OccupyInfoDetail> durationTime = CapacityUtils.getMaxRemainBlock(startTime, endTime, occupyInfo);
long maxRemainBlock = durationTime.stream().mapToLong(OccupyInfoDetail::getDuration).max().orElse(Duration.between(startTime, endTime).abs().toMinutes()); long maxRemainBlock = durationTime.stream().mapToLong(OccupyInfoDetail::getDuration).max().orElse(0L);
//剩余连续时间段 //剩余连续时间段
sliceCap.setDurationTime(durationTime); sliceCap.setDurationTime(durationTime);
sliceCap.setCapLeft(sliceCap.getCapTotal() - totalUseTime); sliceCap.setCapLeft(sliceCap.getCapTotal() - totalUseTime);
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!