Commit 528a7d76 by 刘鑫

refactor(容量对外接口): 添加多线程执行单日任务

1 parent 4517df72
...@@ -20,6 +20,9 @@ import java.util.ArrayList; ...@@ -20,6 +20,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.OptionalLong; import java.util.OptionalLong;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
...@@ -72,17 +75,23 @@ public class CapacityUtils { ...@@ -72,17 +75,23 @@ public class CapacityUtils {
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice, List<CapacityEngineerSliceUsedEntity> engineerTimeSlice,
LocalDate date, int totalTakeTime) { LocalDate date, int totalTakeTime) {
ArrayList<CapacityQueryDTO.Segment> segments = new ArrayList<>(); ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
//半天容量 //容量
ForkJoinTask<List<CapacityQueryDTO.Segment>> fork = forkJoinPool.submit(() -> typeTimeSlice.parallelStream()
for (TimeSliceEntity targetTimeSlice : typeTimeSlice) { .map(targetTimeSlice -> {
final LocalTime targetStartTime = LocalTime.parse(targetTimeSlice.getStart(), DateUtil.TIME_FORMATTER); final LocalTime targetStartTime = LocalTime.parse(targetTimeSlice.getStart(), DateUtil.TIME_FORMATTER);
final LocalTime targetEndTime = LocalTime.parse(targetTimeSlice.getEnd(), DateUtil.TIME_FORMATTER); final LocalTime targetEndTime = LocalTime.parse(targetTimeSlice.getEnd(), DateUtil.TIME_FORMATTER);
CapacityQueryDTO.Segment segment = caculateTargetTimeSlice(totalTakeTime, targetTimeSlice.getName(), return caculateTargetTimeSlice(totalTakeTime, targetTimeSlice.getName(),
engineerTimeSlice, targetStartTime, targetEndTime, date); engineerTimeSlice, targetStartTime, targetEndTime, date);
segments.add(segment); }).collect(Collectors.toList())).fork();
try {
return fork.get();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
} finally {
forkJoinPool.shutdown();
} }
return segments;
} }
public static CapacityQueryDTO.Segment caculateTargetTimeSlice(int totalTakeTime, String timeSliceName, public static CapacityQueryDTO.Segment caculateTargetTimeSlice(int totalTakeTime, String timeSliceName,
...@@ -90,7 +99,7 @@ public class CapacityUtils { ...@@ -90,7 +99,7 @@ public class CapacityUtils {
LocalTime targetStartTime, LocalTime targetStartTime,
LocalTime targetEndTime, LocalDate targetDate) { LocalTime targetEndTime, LocalDate targetDate) {
List<CapacityEngineerSliceUsedEntity> collect = engineerTimeSlice.stream().filter(t -> { List<CapacityEngineerSliceUsedEntity> collect = engineerTimeSlice.parallelStream().filter(t -> {
TimeSliceEntity timeSlice = t.getTimmeSlice(); TimeSliceEntity timeSlice = t.getTimmeSlice();
LocalTime sliceStartHour = LocalTime.parse(timeSlice.getStart(), DateUtil.TIME_FORMATTER); LocalTime sliceStartHour = LocalTime.parse(timeSlice.getStart(), DateUtil.TIME_FORMATTER);
LocalTime sliceEndHour = LocalTime.parse(timeSlice.getEnd(), DateUtil.TIME_FORMATTER); LocalTime sliceEndHour = LocalTime.parse(timeSlice.getEnd(), DateUtil.TIME_FORMATTER);
......
...@@ -33,6 +33,7 @@ import java.util.ArrayList; ...@@ -33,6 +33,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -123,7 +124,12 @@ public class CalcEngineerCapacityScheduler { ...@@ -123,7 +124,12 @@ public class CalcEngineerCapacityScheduler {
final TimeSliceEntity timeSlice = sliceCap.getTimmeSlice(); final TimeSliceEntity timeSlice = sliceCap.getTimmeSlice();
LocalTime sliceStartLocalTime = LocalTime.parse(timeSlice.getStart(), DateUtil.TIME_FORMATTER); LocalTime sliceStartLocalTime = LocalTime.parse(timeSlice.getStart(), DateUtil.TIME_FORMATTER);
LocalTime sliceEndLocalTime = LocalTime.parse(timeSlice.getEnd(), DateUtil.TIME_FORMATTER); LocalTime sliceEndLocalTime = LocalTime.parse(timeSlice.getEnd(), DateUtil.TIME_FORMATTER);
long lengthOfLeave = sliceCap.getCapTotal(); if (Objects.isNull(sliceCap.getCapTotal()) || 0 == sliceCap.getCapTotal()) {
log.info("-----------------》工程师{}的时间片总容量为0, 跳过容量计算", engineerCode);
continue;
}
long totalUseTime = 0;
long maxDuration = 0;
for (OrderInfoEntity order : orders) { for (OrderInfoEntity order : orders) {
LocalTime planStartTime = order.getPlanStartTime().toLocalTime(); LocalTime planStartTime = order.getPlanStartTime().toLocalTime();
LocalTime planEndTime = order.getPlanEndTime().toLocalTime(); LocalTime planEndTime = order.getPlanEndTime().toLocalTime();
...@@ -135,22 +141,26 @@ public class CalcEngineerCapacityScheduler { ...@@ -135,22 +141,26 @@ public class CalcEngineerCapacityScheduler {
boolean contains = ss.contains(order.getOrderStatus()); boolean contains = ss.contains(order.getOrderStatus());
//请假时间仅落在当前时间段内, 当前时间段请假时长为 请假结束时间- 请假开始时间 //请假时间仅落在当前时间段内, 当前时间段请假时长为 请假结束时间- 请假开始时间
if (startIn && DateTimeUtil.isIn(planEndTime, sliceStartLocalTime, sliceEndLocalTime)) { if (startIn && DateTimeUtil.isIn(planEndTime, sliceStartLocalTime, sliceEndLocalTime)) {
lengthOfLeave = contains long useTime = DateTimeUtil.betweenTwoTime(planStartTime, planEndTime, TimeUnit.MINUTES);
? lengthOfLeave - DateTimeUtil.betweenTwoTime(planStartTime, planEndTime, TimeUnit.MINUTES) : totalUseTime = contains
lengthOfLeave + DateTimeUtil.betweenTwoTime(planStartTime, planEndTime, TimeUnit.MINUTES); ? totalUseTime + useTime : totalUseTime - useTime;
} else if (startIn && endAfter) { } else if (startIn && endAfter) {
//落在当前时间段和下一个时间段 //落在当前时间段和下一个时间段
lengthOfLeave = contains long useTime = DateTimeUtil.betweenTwoTime(planStartTime, sliceEndLocalTime, TimeUnit.MINUTES);
? lengthOfLeave - DateTimeUtil.betweenTwoTime(planStartTime, sliceEndLocalTime, TimeUnit.MINUTES) totalUseTime = contains
: lengthOfLeave +DateTimeUtil.betweenTwoTime(planStartTime, sliceEndLocalTime, TimeUnit.MINUTES); ? totalUseTime + useTime : totalUseTime - useTime;
} else if (planStartTime.isBefore(sliceStartLocalTime) && endAfter) { } else if (planStartTime.isBefore(sliceStartLocalTime) && endAfter) {
lengthOfLeave = contains long usedTime = DateTimeUtil.betweenTwoTime(sliceStartLocalTime, sliceEndLocalTime, TimeUnit.MINUTES);
? lengthOfLeave - DateTimeUtil.betweenTwoTime(sliceStartLocalTime, sliceEndLocalTime, TimeUnit.MINUTES): totalUseTime = contains
lengthOfLeave + DateTimeUtil.betweenTwoTime(sliceStartLocalTime, sliceEndLocalTime, TimeUnit.MINUTES); ? totalUseTime + usedTime : totalUseTime - usedTime;
} }
} }
sliceCap.setCapLeft(lengthOfLeave); if (totalUseTime < 0) {
totalUseTime = 0;
}
sliceCap.setCapLeft(sliceCap.getCapTotal() - totalUseTime);
sliceCap.setMaxDuration(sliceCap.getCapTotal() - totalUseTime);
} }
engineerSliceUsedCapacityDao.saveAll(engineerTimeSlice); engineerSliceUsedCapacityDao.saveAll(engineerTimeSlice);
} }
......
...@@ -52,6 +52,7 @@ import java.util.Objects; ...@@ -52,6 +52,7 @@ import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
...@@ -134,10 +135,11 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -134,10 +135,11 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
.mapToInt(SkillInfoEntity::getTakeTime) .mapToInt(SkillInfoEntity::getTakeTime)
.sum(); .sum();
//查询单个工程师日期范围内的技能容量信息 后加和汇总 //查询单个工程师日期范围内的技能容量信息 后加和汇总
List<TimeSliceEntity> halfDayTypeTimeSlice = timeSliceDao.findByType("HALF_DAY"); CopyOnWriteArrayList<TimeSliceEntity> halfDayTypeTimeSlice = new CopyOnWriteArrayList<>(timeSliceDao.findByType("HALF_DAY"));
List<TimeSliceEntity> allDayTypeTimeSlice = timeSliceDao.findByType("ALL_DAY"); CopyOnWriteArrayList<TimeSliceEntity> allDayTypeTimeSlice = new CopyOnWriteArrayList<>(timeSliceDao.findByType("ALL_DAY"));
List<TimeSliceEntity> timeSliceEntities = sliceTime(LocalDate.now(), LocalTime.of(8, 0), CopyOnWriteArrayList<TimeSliceEntity> timeSliceEntities = new CopyOnWriteArrayList<>(sliceTime(LocalDate.now(),
LocalTime.of(18, 0)); LocalTime.of(8, 0),
LocalTime.of(18, 0)));
LocalDate currentDate = beginDate; LocalDate currentDate = beginDate;
//定义返回值 //定义返回值
...@@ -187,7 +189,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -187,7 +189,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
SkillInfoEntity skillInfo = skillInfoDao.getByBrandAndTypeAndSkill(service.getBrand(), SkillInfoEntity skillInfo = skillInfoDao.getByBrandAndTypeAndSkill(service.getBrand(),
service.getProductType(), service.getServiceType()); service.getProductType(), service.getServiceType());
List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new ArrayList<>(); List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new CopyOnWriteArrayList<>();
for (EngineerInfoEntity engineerInfo : engineerInfoEntities) { for (EngineerInfoEntity engineerInfo : engineerInfoEntities) {
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao
.findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(targetDate), engineerInfo.getEngineerCode()); .findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(targetDate), engineerInfo.getEngineerCode());
...@@ -225,7 +227,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -225,7 +227,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
service.getProductType(), service.getServiceType()); service.getProductType(), service.getServiceType());
return CapacityUtils.caculateTargetTimeSlice(skillInfo.getTakeTime(), "时间段", return CapacityUtils.caculateTargetTimeSlice(skillInfo.getTakeTime(), "时间段",
engineerTimeSlice, startTime, endTime, date); new CopyOnWriteArrayList<>(engineerTimeSlice), startTime, endTime, date);
} }
@Override @Override
...@@ -309,10 +311,10 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -309,10 +311,10 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
class Task implements Callable<CapacityQueryDTO.Data> { class Task implements Callable<CapacityQueryDTO.Data> {
private Set<EngineerInfoEntity> allFulfillEngineer; private Set<EngineerInfoEntity> allFulfillEngineer;
private LocalDate currentDate; private LocalDate currentDate;
private List<TimeSliceEntity> halfDayTypeTimeSlice; private CopyOnWriteArrayList<TimeSliceEntity> halfDayTypeTimeSlice;
private int totalTakeTime; private int totalTakeTime;
private List<TimeSliceEntity> allDayTypeTimeSlice; private CopyOnWriteArrayList<TimeSliceEntity> allDayTypeTimeSlice;
private List<TimeSliceEntity> timeSliceEntities; private CopyOnWriteArrayList<TimeSliceEntity> timeSliceEntities;
private Semaphore semaphore; private Semaphore semaphore;
@Override @Override
...@@ -334,7 +336,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -334,7 +336,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
List<TimeSliceEntity> halfDayTypeTimeSlice, int totalTakeTime, List<TimeSliceEntity> halfDayTypeTimeSlice, int totalTakeTime,
List<TimeSliceEntity> allDayTypeTimeSlice, List<TimeSliceEntity> allDayTypeTimeSlice,
List<TimeSliceEntity> timeSliceEntities) { List<TimeSliceEntity> timeSliceEntities) {
List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new ArrayList<>(); List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new CopyOnWriteArrayList<>();
for (EngineerInfoEntity engineerInfo : allFulfillEngineer) { for (EngineerInfoEntity engineerInfo : allFulfillEngineer) {
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao
.findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(currentDate), engineerInfo.getEngineerCode()); .findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(currentDate), engineerInfo.getEngineerCode());
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!