Commit 94f72061 by 刘鑫

feat(单个工程师容量): 时间切片计算以及时间切片查询

1 parent 949a10fe
package com.dituhui.pea.order.scheduler; package com.dituhui.pea.order.scheduler;
import cn.hutool.core.collection.CollectionUtil;
import com.dituhui.pea.order.common.DateUtils; import com.dituhui.pea.order.common.DateUtils;
import com.dituhui.pea.order.dao.*; import com.dituhui.pea.order.common.jackson.DateUtil;
import com.dituhui.pea.order.entity.*; import com.dituhui.pea.order.dao.CapacityEngineerCalendarDao;
import com.dituhui.pea.order.dao.CapacityEngineerStatDao;
import com.dituhui.pea.order.dao.EngineerBusinessDao;
import com.dituhui.pea.order.dao.EngineerInfoDao;
import com.dituhui.pea.order.dao.EngineerSliceUsedCapacityDao;
import com.dituhui.pea.order.dao.OrderInfoDao;
import com.dituhui.pea.order.dao.TimeSliceDao;
import com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity;
import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity;
import com.dituhui.pea.order.entity.CapacityEngineerStatEntity;
import com.dituhui.pea.order.entity.EngineerBusinessEntity;
import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.OrderInfoEntity;
import com.dituhui.pea.order.entity.TimeSliceEntity;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -14,7 +28,14 @@ import org.springframework.stereotype.Component; ...@@ -14,7 +28,14 @@ import org.springframework.stereotype.Component;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
...@@ -36,6 +57,10 @@ public class CalcEngineerCapacityScheduler { ...@@ -36,6 +57,10 @@ public class CalcEngineerCapacityScheduler {
private EngineerBusinessDao engineerBusinessDao; private EngineerBusinessDao engineerBusinessDao;
@Autowired @Autowired
private EngineerInfoDao engineerInfoDao; private EngineerInfoDao engineerInfoDao;
@Autowired
private TimeSliceDao timeSliceDao;
@Autowired
private EngineerSliceUsedCapacityDao engineerSliceUsedCapacityDao;
@Scheduled(cron = "${scheduler.calc-engineer-capacity.cron-expr}") @Scheduled(cron = "${scheduler.calc-engineer-capacity.cron-expr}")
public void run() { public void run() {
...@@ -58,9 +83,21 @@ public class CalcEngineerCapacityScheduler { ...@@ -58,9 +83,21 @@ public class CalcEngineerCapacityScheduler {
} }
private void calcOneEngineer(String date, String engineerCode) { private void calcOneEngineer(String date, String engineerCode) {
CapacityEngineerStatEntity statEntity = capacityEngineerStatDao.getByWorkdayAndEngineerCode(date, engineerCode);
if (statEntity == null) {
log.error("错误:日期[{}]技术员[{}]容量尚未初始化,忽略退出!", date, engineerCode);
return;
}
Set<String> ss = Set.of("CANCELED", "RESCHEDULED"); Set<String> ss = Set.of("CANCELED", "RESCHEDULED");
List<OrderInfoEntity> orders = orderInfoDao.findByDtAndEngineerCode(DateUtils.localDateFromStr(date), engineerCode); List<OrderInfoEntity> orders = orderInfoDao.findByDtAndEngineerCode(DateUtils.localDateFromStr(date), engineerCode);
// 根据capacity_engineer_calendar和order_info,来确定当天剩下的最大连续时间区块;
EngineerBusinessEntity businessEntity = engineerBusinessDao.getByEngineerCode(engineerCode);
//TODO 就算单小时时间段工程师技能已用容量存储至时间切片工程师时间表内 //TODO 就算单小时时间段工程师技能已用容量存储至时间切片工程师时间表内
//查询时间片容量
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao.findByWorkdayAndEngineerCode(date, engineerCode);
int used = orders.stream().map(e -> { int used = orders.stream().map(e -> {
if (ss.contains(e.getOrderStatus())) { if (ss.contains(e.getOrderStatus())) {
return 0; return 0;
...@@ -71,13 +108,8 @@ public class CalcEngineerCapacityScheduler { ...@@ -71,13 +108,8 @@ public class CalcEngineerCapacityScheduler {
long cnt = orders.stream() long cnt = orders.stream()
.filter(e -> !ss.contains(e.getOrderStatus())) .filter(e -> !ss.contains(e.getOrderStatus()))
.count(); .count();
long max = getMaxRemainBlock(date, engineerCode, orders); long max = getMaxRemainBlock(date, engineerCode, orders, businessEntity);
log.info("正在处理: 日期[{}]技术员[{}]容量相关信息 ==> used:{}, orderCnt:{}, maxDuration:{}", date, engineerCode, used, cnt, max); log.info("正在处理: 日期[{}]技术员[{}]容量相关信息 ==> used:{}, orderCnt:{}, maxDuration:{}", date, engineerCode, used, cnt, max);
CapacityEngineerStatEntity statEntity = capacityEngineerStatDao.getByWorkdayAndEngineerCode(date, engineerCode);
if (statEntity == null) {
log.error("错误:日期[{}]技术员[{}]容量尚未初始化,忽略退出!", date, engineerCode);
return;
}
statEntity.setOrderCount((int) cnt); statEntity.setOrderCount((int) cnt);
statEntity.setCapUsed(used); statEntity.setCapUsed(used);
statEntity.setCapLeft(statEntity.getCapTotal() - used); statEntity.setCapLeft(statEntity.getCapTotal() - used);
...@@ -85,10 +117,8 @@ public class CalcEngineerCapacityScheduler { ...@@ -85,10 +117,8 @@ public class CalcEngineerCapacityScheduler {
statEntity.setUpdateTime(LocalDateTime.now()); statEntity.setUpdateTime(LocalDateTime.now());
capacityEngineerStatDao.save(statEntity); capacityEngineerStatDao.save(statEntity);
} }
private long getMaxRemainBlock(String date, String engineerCode, List<OrderInfoEntity> orders, EngineerBusinessEntity businessEntity) {
private long getMaxRemainBlock(String date, String engineerCode, List<OrderInfoEntity> orders) {
// 根据capacity_engineer_calendar和order_info,来确定当天剩下的最大连续时间区块; // 根据capacity_engineer_calendar和order_info,来确定当天剩下的最大连续时间区块;
EngineerBusinessEntity businessEntity = engineerBusinessDao.getByEngineerCode(engineerCode);
LocalDateTime startTime = DateUtils.localDateTimeFromStr(String.format("%s %s:00", date, businessEntity.getWorkOn())); LocalDateTime startTime = DateUtils.localDateTimeFromStr(String.format("%s %s:00", date, businessEntity.getWorkOn()));
LocalDateTime endTime = DateUtils.localDateTimeFromStr(String.format("%s %s:00", date, businessEntity.getWorkOff())); LocalDateTime endTime = DateUtils.localDateTimeFromStr(String.format("%s %s:00", date, businessEntity.getWorkOff()));
......
...@@ -6,11 +6,24 @@ import com.dituhui.pea.order.common.CapacityUtils; ...@@ -6,11 +6,24 @@ import com.dituhui.pea.order.common.CapacityUtils;
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;
import com.dituhui.pea.order.dao.*; import com.dituhui.pea.order.dao.CapacityEngineerStatDao;
import com.dituhui.pea.order.dao.EngineerInfoDao;
import com.dituhui.pea.order.dao.EngineerSkillDao;
import com.dituhui.pea.order.dao.EngineerSliceUsedCapacityDao;
import com.dituhui.pea.order.dao.MapBlockInfoDao;
import com.dituhui.pea.order.dao.OrgTeamDao;
import com.dituhui.pea.order.dao.SkillInfoDao;
import com.dituhui.pea.order.dao.TimeSliceDao;
import com.dituhui.pea.order.dto.CapacityOrderQueryDTO; import com.dituhui.pea.order.dto.CapacityOrderQueryDTO;
import com.dituhui.pea.order.dto.param.CapacityQueryDTO; import com.dituhui.pea.order.dto.param.CapacityQueryDTO;
import com.dituhui.pea.order.dto.param.Location; import com.dituhui.pea.order.dto.param.Location;
import com.dituhui.pea.order.entity.*; import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity;
import com.dituhui.pea.order.entity.CapacityEngineerStatEntity;
import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.EngineerSkillEntity;
import com.dituhui.pea.order.entity.MapBlockInfoEntity;
import com.dituhui.pea.order.entity.OrgTeamEntity;
import com.dituhui.pea.order.entity.SkillInfoEntity;
import com.dituhui.pea.order.feign.ISaaSRemoteService; import com.dituhui.pea.order.feign.ISaaSRemoteService;
import com.dituhui.pea.order.service.CapacityQueryService; import com.dituhui.pea.order.service.CapacityQueryService;
import com.dituhui.pea.pojo.fendan.FendanDTO; import com.dituhui.pea.pojo.fendan.FendanDTO;
...@@ -25,6 +38,7 @@ import org.springframework.stereotype.Service; ...@@ -25,6 +38,7 @@ import org.springframework.stereotype.Service;
import java.time.LocalDate; import java.time.LocalDate;
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.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -55,6 +69,10 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -55,6 +69,10 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
private EngineerInfoDao engineerInfoDao; private EngineerInfoDao engineerInfoDao;
@Autowired @Autowired
private MapBlockInfoDao mapBlockInfoDao; private MapBlockInfoDao mapBlockInfoDao;
@Autowired
private TimeSliceDao timeSliceDao;
@Autowired
private EngineerSliceUsedCapacityDao engineerSliceUsedCapacityDao;
@Override @Override
public Result<?> matchCapacityData(List<CapacityQueryDTO.Service> services, Location location, LocalDate beginDate, LocalDate endDate) { public Result<?> matchCapacityData(List<CapacityQueryDTO.Service> services, Location location, LocalDate beginDate, LocalDate endDate) {
...@@ -81,7 +99,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -81,7 +99,7 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
.collect(Collectors.toList()); .collect(Collectors.toList());
final String groupId = groupIdList.get(0); final String groupId = groupIdList.get(0);
//3. 查询分站下拥有对应技能的工程师(排重) todo 技能码转换为对应的技能汉字 //3. 查询分站下拥有对应技能的工程师(排重) 技能码转换为对应的技能汉字
List<CapacityQueryDTO.Service> convertServices = services; List<CapacityQueryDTO.Service> convertServices = services;
List<SkillInfoEntity> querySkillGroup = new ArrayList<>(); List<SkillInfoEntity> querySkillGroup = new ArrayList<>();
Set<EngineerInfoEntity> allFulfillEngineer = Sets.newConcurrentHashSet(); Set<EngineerInfoEntity> allFulfillEngineer = Sets.newConcurrentHashSet();
...@@ -97,23 +115,26 @@ public class CapacityQueryServiceImpl implements CapacityQueryService { ...@@ -97,23 +115,26 @@ public class CapacityQueryServiceImpl implements CapacityQueryService {
} }
log.info("[matchCapacityData]【符合技能要求的工程师总数为:{} 个】", allFulfillEngineer.size()); log.info("[matchCapacityData]【符合技能要求的工程师总数为:{} 个】", allFulfillEngineer.size());
//TODO 计算所有查询技能的所需耗时 (querySkillGroup) //计算所有查询技能的所需耗时 (querySkillGroup)
int totalTakeTime = querySkillGroup.stream()
.mapToInt(SkillInfoEntity::getTakeTime)
.sum();
//TODO 查询单个工程师日期范围内的技能容量信息 后加和汇总 //TODO 查询单个工程师日期范围内的技能容量信息 后加和汇总
return null; return null;
} }
private List<?> getEngineerOneDay(String engineerCode, String date) {
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao.findByWorkdayAndEngineerCode(date, engineerCode);
return Collections.emptyList();
}
@Override @Override
public <E> E queryEngineerCapacity(String engineerCode, LocalDate date) { public <E> E queryEngineerCapacity(String engineerCode, LocalDate date) {
return null; return null;
} }
//TODO 计算单个工程师 单日 多技能容量
private void reckonEngineerDaySkillsVolume(LocalDate date, EngineerInfoEntity engineerInfo) {
//TODO
}
@Override @Override
public Result<?> queryMatchCapacityData(CapacityOrderQueryDTO.Request reqDTO) { public Result<?> queryMatchCapacityData(CapacityOrderQueryDTO.Request reqDTO) {
// 单条容量查询 // 单条容量查询
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!