Commit 58ab96d5 by 刘鑫

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

1 parent 4f138650
......@@ -503,8 +503,6 @@ public class DateUtil {
/**
* 按照分钟切割时间区间
*
*
*/
public static List<DateSplit> splitByMinute(Date startTime, Date endTime, int intervalMinutes) {
if (endTime.getTime() <= startTime.getTime()) {
......@@ -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()) {
return Collections.emptyList();
}
List<DateSplit> dateSplits = new ArrayList<>(24);
List<DateSplit> dateSplits = new ArrayList<>(60);
DateSplit param = new DateSplit();
param.setStartDateTime(startTime);
......@@ -561,7 +565,7 @@ public class DateUtil {
dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime()));
startTime = addHours(startTime, intervalHours);
startTime = addHours(startTime, splitAdjacency);
if (startTime.getTime() >= endTime.getTime()) {
break;
}
......@@ -575,9 +579,11 @@ public class DateUtil {
private static Date addMinute(Date date, int minute) {
return add(date, Calendar.MINUTE, minute);
}
private static Date addHours(Date date, int hours) {
return add(date, Calendar.HOUR_OF_DAY, hours);
}
private static Date add(final Date date, final int calendarField, final int amount) {
final Calendar c = Calendar.getInstance();
c.setTime(date);
......
......@@ -28,13 +28,13 @@ public interface CapacityQueryService {
* 根据工作队,时间段,技能、品牌,服务类型查容量
*
* @param teamId 工作队
* @param services 服务技能信息, 包含品牌, 产品类型, 服务技能--汉字
* @param service 服务技能信息, 包含品牌, 产品类型, 服务技能--汉字
* @param targetDate 时间段对应的日期
* @param startTime 开始时间
* @param endTime 结束时间
* @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);
/**
......@@ -45,7 +45,7 @@ public interface CapacityQueryService {
* @param targetDate 查询容量的日期
* @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;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.enums.StatusCodeEnum;
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.EngineerUtils;
import com.dituhui.pea.order.common.SaasUtils;
......@@ -43,6 +44,7 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.OptionalLong;
......@@ -211,71 +213,36 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
}
@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) {
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);
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);
}
//查询对应的技能信息
SkillInfoEntity skillInfo = skillInfoDao.getByBrandAndTypeAndSkill(service.getBrand(),
service.getProductType(), service.getServiceType());
List<CapacityEngineerSliceUsedEntity> allEngineerTimeSlice = new ArrayList<>();
for (EngineerInfoEntity engineerInfo : allFulfillEngineer) {
for (EngineerInfoEntity engineerInfo : engineerInfoEntities) {
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();
log.info("[matchCapacityData]【符合技能要求的工程师总数为:{} 个】", engineerInfoEntities.size());
return caculateTargetTimeSlice(totalTakeTime, "时间段", allEngineerTimeSlice, startTime, endTime, targetDate);
return caculateTargetTimeSlice(skillInfo.getTakeTime(), "时间段", allEngineerTimeSlice, startTime, endTime, targetDate);
}
@Override
public CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, List<CapacityQueryDTO.Service> services, 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();
public CapacityQueryDTO.Segment queryCapacityByTeam(String teamId, CapacityQueryDTO.Service service, LocalDate targetDate) {
//获取工作队信息
OrgTeamEntity team = orgTeamDao.getByTeamId(teamId);
String workOn = String.format("%s:00", team.getWorkOn());
String workOff = String.format("%s:00", team.getWorkOff());
LocalTime startTime = LocalTime.parse(workOn, DateUtil.TIME_FORMATTER);
LocalTime endTime = LocalTime.parse(workOff, DateUtil.TIME_FORMATTER);
return caculateTargetTimeSlice(totalTakeTime, "时间段", allEngineerTimeSlice, startTime, endTime, targetDate);
return queryCapacityByTeam(teamId, service, targetDate, startTime, endTime);
}
@Override
......@@ -423,4 +390,18 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
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!