Commit 58ab96d5 by 刘鑫

refactor(工作队容量): 修改为单技能

1 parent 4f138650
...@@ -503,8 +503,6 @@ public class DateUtil { ...@@ -503,8 +503,6 @@ public class DateUtil {
/** /**
* 按照分钟切割时间区间 * 按照分钟切割时间区间
*
*
*/ */
public static List<DateSplit> splitByMinute(Date startTime, Date endTime, int intervalMinutes) { public static List<DateSplit> splitByMinute(Date startTime, Date endTime, int intervalMinutes) {
if (endTime.getTime() <= startTime.getTime()) { if (endTime.getTime() <= startTime.getTime()) {
...@@ -539,13 +537,19 @@ public class DateUtil { ...@@ -539,13 +537,19 @@ public class DateUtil {
/** /**
* 按照小时切割时间区间 * 按照小时切割时间区间
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param intervalHours 时间片大小 (小时)
* @param splitAdjacency 相邻时间片间隔(小时),此值必须小于等于 'intervalHours' 值且大于等于0
* @return 返回对应的时间片
*/ */
public static List<DateSplit> splitByHour(Date startTime, Date endTime, int intervalHours) { public static List<DateSplit> splitByHour(Date startTime, Date endTime, int intervalHours, int splitAdjacency) {
if (endTime.getTime() <= startTime.getTime()) { if (endTime.getTime() <= startTime.getTime()) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<DateSplit> dateSplits = new ArrayList<>(24); List<DateSplit> dateSplits = new ArrayList<>(60);
DateSplit param = new DateSplit(); DateSplit param = new DateSplit();
param.setStartDateTime(startTime); param.setStartDateTime(startTime);
...@@ -561,7 +565,7 @@ public class DateUtil { ...@@ -561,7 +565,7 @@ public class DateUtil {
dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime())); dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime()));
startTime = addHours(startTime, intervalHours); startTime = addHours(startTime, splitAdjacency);
if (startTime.getTime() >= endTime.getTime()) { if (startTime.getTime() >= endTime.getTime()) {
break; break;
} }
...@@ -575,9 +579,11 @@ public class DateUtil { ...@@ -575,9 +579,11 @@ public class DateUtil {
private static Date addMinute(Date date, int minute) { private static Date addMinute(Date date, int minute) {
return add(date, Calendar.MINUTE, minute); return add(date, Calendar.MINUTE, minute);
} }
private static Date addHours(Date date, int hours) { private static Date addHours(Date date, int hours) {
return add(date, Calendar.HOUR_OF_DAY, hours); return add(date, Calendar.HOUR_OF_DAY, hours);
} }
private static Date add(final Date date, final int calendarField, final int amount) { private static Date add(final Date date, final int calendarField, final int amount) {
final Calendar c = Calendar.getInstance(); final Calendar c = Calendar.getInstance();
c.setTime(date); c.setTime(date);
......
...@@ -28,13 +28,13 @@ public interface CapacityQueryService { ...@@ -28,13 +28,13 @@ public interface CapacityQueryService {
* 根据工作队,时间段,技能、品牌,服务类型查容量 * 根据工作队,时间段,技能、品牌,服务类型查容量
* *
* @param teamId 工作队 * @param teamId 工作队
* @param services 服务技能信息, 包含品牌, 产品类型, 服务技能--汉字 * @param service 服务技能信息, 包含品牌, 产品类型, 服务技能--汉字
* @param targetDate 时间段对应的日期 * @param targetDate 时间段对应的日期
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @return 日期对应时间段工作队容量 * @return 日期对应时间段工作队容量
*/ */
CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, List<CapacityQueryDTO.Service> services, LocalDate targetDate, CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, CapacityQueryDTO.Service service, LocalDate targetDate,
LocalTime startTime, LocalTime endTime); LocalTime startTime, LocalTime endTime);
/** /**
...@@ -45,7 +45,7 @@ public interface CapacityQueryService { ...@@ -45,7 +45,7 @@ public interface CapacityQueryService {
* @param targetDate 查询容量的日期 * @param targetDate 查询容量的日期
* @return 工作队指定日期的容量 * @return 工作队指定日期的容量
*/ */
CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, List<CapacityQueryDTO.Service> services, LocalDate targetDate); CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, CapacityQueryDTO.Service service, LocalDate targetDate);
/** /**
* 查询单个工程师指定日期的容量状态 * 查询单个工程师指定日期的容量状态
......
...@@ -3,6 +3,7 @@ package com.dituhui.pea.order.service.impl; ...@@ -3,6 +3,7 @@ package com.dituhui.pea.order.service.impl;
import com.dituhui.pea.common.Result; import com.dituhui.pea.common.Result;
import com.dituhui.pea.enums.StatusCodeEnum; import com.dituhui.pea.enums.StatusCodeEnum;
import com.dituhui.pea.order.common.CapacityUtils; import com.dituhui.pea.order.common.CapacityUtils;
import com.dituhui.pea.order.common.DateSplit;
import com.dituhui.pea.order.common.DateUtils; import com.dituhui.pea.order.common.DateUtils;
import com.dituhui.pea.order.common.EngineerUtils; import com.dituhui.pea.order.common.EngineerUtils;
import com.dituhui.pea.order.common.SaasUtils; import com.dituhui.pea.order.common.SaasUtils;
...@@ -43,6 +44,7 @@ import java.time.LocalDateTime; ...@@ -43,6 +44,7 @@ import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.OptionalLong; import java.util.OptionalLong;
...@@ -211,71 +213,36 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -211,71 +213,36 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
} }
@Override @Override
public CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, List<CapacityQueryDTO.Service> services, public CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, CapacityQueryDTO.Service service,
LocalDate targetDate, LocalTime startTime, LocalTime endTime) { LocalDate targetDate, LocalTime startTime, LocalTime endTime) {
List<SkillInfoEntity> querySkillGroup = new ArrayList<>();
Set<EngineerInfoEntity> allFulfillEngineer = Sets.newConcurrentHashSet();
for (CapacityQueryDTO.Service service : services) {
Set<EngineerInfoEntity> engineerInfoEntities = engineerInfoDao.listByBrandAndTypeAndSkillAndTeamId(service.getBrand(), Set<EngineerInfoEntity> engineerInfoEntities = engineerInfoDao.listByBrandAndTypeAndSkillAndTeamId(service.getBrand(),
service.getProductType(), service.getServiceType(), teamId); service.getProductType(), service.getServiceType(), teamId);
//查询对应的技能信息 //查询对应的技能信息
SkillInfoEntity skillInfo = skillInfoDao.getByBrandAndTypeAndSkill(service.getBrand(), SkillInfoEntity skillInfo = skillInfoDao.getByBrandAndTypeAndSkill(service.getBrand(),
service.getProductType(), service.getServiceType()); service.getProductType(), service.getServiceType());
querySkillGroup.add(skillInfo);
allFulfillEngineer.addAll(engineerInfoEntities);
}
List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new ArrayList<>(); List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new ArrayList<>();
for (EngineerInfoEntity engineerInfo : allFulfillEngineer) { for (EngineerInfoEntity engineerInfo : engineerInfoEntities) {
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao
.findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(targetDate), engineerInfo.getEngineerCode()); .findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(targetDate), engineerInfo.getEngineerCode());
allEngineerTimeSlice.addAll(engineerTimeSlice); allEngineerTimeSlice.addAll(engineerTimeSlice);
} }
log.info("[matchCapacityData]【符合技能要求的工程师总数为:{} 个】", allFulfillEngineer.size()); log.info("[matchCapacityData]【符合技能要求的工程师总数为:{} 个】", engineerInfoEntities.size());
//计算所有查询技能的所需耗时 (querySkillGroup)
final int totalTakeTime = querySkillGroup.stream()
.mapToInt(SkillInfoEntity::getTakeTime)
.sum();
return caculateTargetTimeSlice(totalTakeTime, "时间段", allEngineerTimeSlice, startTime, endTime, targetDate); return caculateTargetTimeSlice(skillInfo.getTakeTime(), "时间段", allEngineerTimeSlice, startTime, endTime, targetDate);
} }
@Override @Override
public CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, List<CapacityQueryDTO.Service> services, LocalDate targetDate) { public CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, CapacityQueryDTO.Service service, LocalDate targetDate) {
List<SkillInfoEntity> querySkillGroup = new ArrayList<>();
Set<EngineerInfoEntity> allFulfillEngineer = Sets.newConcurrentHashSet();
for (CapacityQueryDTO.Service service : services) {
Set<EngineerInfoEntity> engineerInfoEntities = engineerInfoDao.listByBrandAndTypeAndSkillAndTeamId(service.getBrand(),
service.getProductType(), service.getServiceType(), teamId);
//查询对应的技能信息
SkillInfoEntity skillInfo = skillInfoDao.getByBrandAndTypeAndSkill(service.getBrand(),
service.getProductType(), service.getServiceType());
querySkillGroup.add(skillInfo);
allFulfillEngineer.addAll(engineerInfoEntities);
}
List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new ArrayList<>();
for (EngineerInfoEntity engineerInfo : allFulfillEngineer) {
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao
.findByWorkdayAndEngineerCode(DateTimeUtil.formatDate(targetDate), engineerInfo.getEngineerCode());
allEngineerTimeSlice.addAll(engineerTimeSlice);
}
log.info("[matchCapacityData]【符合技能要求的工程师总数为:{} 个】", allFulfillEngineer.size());
//计算所有查询技能的所需耗时 (querySkillGroup)
final int totalTakeTime = querySkillGroup.stream()
.mapToInt(SkillInfoEntity::getTakeTime)
.sum();
//获取工作队信息 //获取工作队信息
OrgTeamEntity team = orgTeamDao.getByTeamId(teamId); OrgTeamEntity team = orgTeamDao.getByTeamId(teamId);
String workOn = String.format("%s:00", team.getWorkOn()); String workOn = String.format("%s:00", team.getWorkOn());
String workOff = String.format("%s:00", team.getWorkOff()); String workOff = String.format("%s:00", team.getWorkOff());
LocalTime startTime = LocalTime.parse(workOn, DateUtil.TIME_FORMATTER); LocalTime startTime = LocalTime.parse(workOn, DateUtil.TIME_FORMATTER);
LocalTime endTime = LocalTime.parse(workOff, DateUtil.TIME_FORMATTER); LocalTime endTime = LocalTime.parse(workOff, DateUtil.TIME_FORMATTER);
return queryCapacityByTeam(teamId, service, targetDate, startTime, endTime);
return caculateTargetTimeSlice(totalTakeTime, "时间段", allEngineerTimeSlice, startTime, endTime, targetDate);
} }
@Override @Override
...@@ -423,4 +390,18 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -423,4 +390,18 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
return brand; return brand;
} }
} }
/**
* 进行时间切片工作
*
* @return 返回相邻间隔的时间段, 相邻时间片跨度一小时, 时间片跨度自定义
*/
private List<TimeSliceEntity> sliceTime(LocalDate date, LocalTime startTime, LocalTime endTime) {
LocalDateTime start = LocalDateTime.of(date, startTime);
LocalDateTime end = LocalDateTime.of(date, endTime);
List<DateSplit> dateSplits = DateUtil.splitByHour(DateUtil.toDate(start), DateUtil.toDate(end), 2, 1);
return Collections.emptyList();
}
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!