Commit 23fe6c5a by 刘鑫

Merge branch 'develop-16542' into 'develop'

容量  交集并集运算

See merge request !364
2 parents d5ab6e90 e24874d9
......@@ -213,7 +213,10 @@ public class CapacityUtils {
TimeSliceEntity timeSlice = t.getTimmeSlice();
LocalTime sliceStartHour = LocalTime.parse(timeSlice.getStart(), DateUtil.TIME_FORMATTER);
LocalTime sliceEndHour = LocalTime.parse(timeSlice.getEnd(), DateUtil.TIME_FORMATTER);
return !(targetStartTime.isAfter(sliceEndHour) || targetEndTime.isBefore(sliceStartHour));
LocalTime maxStart = targetStartTime.isAfter(sliceStartHour) ? targetStartTime : sliceStartHour;
LocalTime minEnd = targetEndTime.isAfter(sliceEndHour) ? sliceEndHour : targetEndTime;
return maxStart.isBefore(minEnd);
}).collect(Collectors.toList());
CapacityQueryDTO.Segment segment = new CapacityQueryDTO.Segment();
......@@ -228,8 +231,13 @@ public class CapacityUtils {
//计算最大空闲时间
List<Long> engineerMaxDurationList = new ArrayList<>();
engineerSliceMap.forEach((engineerCode, t) -> {
long engineerMaxDuration = t.stream().map(CapacityEngineerSliceUsedEntity::getDurationTime)
.flatMap(Collection::stream)
List<OccupyInfoDetail> timeSlots = t.stream().map(CapacityEngineerSliceUsedEntity::getDurationTime)
.flatMap(Collection::stream).collect(Collectors.toList());
timeSlots = calculateUnion(timeSlots);
long engineerMaxDuration = Optional.ofNullable(timeSlots).orElse(Collections.emptyList())
.stream()
.mapToLong(OccupyInfoDetail::getDuration)
.sum();
engineerMaxDurationList.add(engineerMaxDuration);
......
......@@ -6,8 +6,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
......@@ -31,8 +29,11 @@ public class OccupyInfoDetail extends OccupyInfo implements Comparable<OccupyInf
// 判断两个时间片是否有交集
public boolean overlaps(OccupyInfoDetail other) {
// 如果一个时间片的开始时间在另一个时间片的结束时间之后,或者一个时间片的结束时间在另一个时间片的开始时间之前,那么他们没有交集
return !(this.beginTime.isAfter(other.endTime) || this.endTime.isBefore(other.beginTime));
LocalDateTime maxStart = this.beginTime.isAfter(other.beginTime) ? this.beginTime : other.beginTime;
LocalDateTime minEnd = this.endTime.isAfter(other.endTime) ? other.endTime : this.endTime;
return maxStart.isBefore(minEnd);
}
// 计算两个时间片的交集
public OccupyInfoDetail intersection(OccupyInfoDetail other) {
// 如果两个时间片没有交集,返回null
......
......@@ -145,8 +145,8 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
.mapToInt(SkillInfoEntity::getTakeTime)
.sum();
//查询单个工程师日期范围内的技能容量信息 后加和汇总
CopyOnWriteArrayList<TimeSliceEntity> halfDayTypeTimeSlice = new CopyOnWriteArrayList<>(timeSliceDao.findByType("HALF_DAY"));
CopyOnWriteArrayList<TimeSliceEntity> allDayTypeTimeSlice = new CopyOnWriteArrayList<>(timeSliceDao.findByType("ALL_DAY"));
CopyOnWriteArrayList<TimeSliceEntity> halfDayTypeTimeSlice = new CopyOnWriteArrayList<>();//timeSliceDao.findByType("HALF_DAY"));
CopyOnWriteArrayList<TimeSliceEntity> allDayTypeTimeSlice = new CopyOnWriteArrayList<>();//timeSliceDao.findByType("ALL_DAY"));
CopyOnWriteArrayList<TimeSliceEntity> timeSliceEntities = new CopyOnWriteArrayList<>(sliceTime(LocalDate.now(),
LocalTime.of(8, 0),
LocalTime.of(18, 0)));
......
......@@ -81,5 +81,29 @@ public class CapacityUtilsTest {
Assertions.assertEquals(2, occupyInfoDetails1.size());
}
@Test
public void testOverlaps() {
OccupyInfoDetail fixedTime = new OccupyInfoDetail(LocalDateTime.of(LocalDate.now(), LocalTime.of(9, 0)
), LocalDateTime.of(LocalDate.now(), LocalTime.of(11, 0)));
OccupyInfoDetail dynaTime = new OccupyInfoDetail(LocalDateTime.of(LocalDate.now(), LocalTime.of(9, 0)
), LocalDateTime.of(LocalDate.now(), LocalTime.of(11, 0)));
Assertions.assertTrue(fixedTime.overlaps(dynaTime));
dynaTime = new OccupyInfoDetail(LocalDateTime.of(LocalDate.now(), LocalTime.of(10, 0)
), LocalDateTime.of(LocalDate.now(), LocalTime.of(11, 0)));
Assertions.assertTrue(fixedTime.overlaps(dynaTime));
dynaTime = new OccupyInfoDetail(LocalDateTime.of(LocalDate.now(), LocalTime.of(11, 0)
), LocalDateTime.of(LocalDate.now(), LocalTime.of(12, 0)));
Assertions.assertFalse(fixedTime.overlaps(dynaTime));
dynaTime = new OccupyInfoDetail(LocalDateTime.of(LocalDate.now(), LocalTime.of(8, 0)
), LocalDateTime.of(LocalDate.now(), LocalTime.of(9, 0)));
Assertions.assertFalse(fixedTime.overlaps(dynaTime));
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!