Commit adb25d34 by 刘鑫

Merge branch 'develop-16542' into 'develop'

【ID1003911】【ID1003910】

See merge request !353
2 parents 615ee65c e0185240
......@@ -9,7 +9,6 @@ import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;
......@@ -468,6 +467,46 @@ public class DateUtil {
}
/**
* 判断两个时间范围是否有交集
*
* @param dynaStartTime 比较时间段开始时间
* @param dynaEndTime 比较时间段结束时间
* @param fixedStartTime 参考时间段开始时间
* @param fixedEndTime 参考时间段结束时间
* @return
*/
public static boolean checkTimesHasOverlap(Date dynaStartTime, Date dynaEndTime, Date fixedStartTime, Date fixedEndTime) {
if (dynaStartTime.getTime() <= fixedStartTime.getTime() && dynaEndTime.getTime() > fixedStartTime.getTime()) {
return true;
} else if (dynaStartTime.getTime() >= fixedStartTime.getTime() && dynaStartTime.getTime() < fixedEndTime.getTime()) {
return true;
} else {
return false;
}
}
/**
* 判断两个时间范围是否有交集
*
* @param dynaStartTime 比较时间段开始时间
* @param dynaEndTime 比较时间段结束时间
* @param fixedStartTime 参考时间段开始时间
* @param fixedEndTime 参考时间段结束时间
* @return
*/
public static boolean checkTimesHasOverlap(LocalDateTime dynaStartTime, LocalDateTime dynaEndTime,
LocalDateTime fixedStartTime, LocalDateTime fixedEndTime) {
if (dynaStartTime.compareTo(fixedStartTime) <= 0 && dynaEndTime.compareTo(fixedStartTime) > 0) {
return true;
} else if (dynaStartTime.compareTo(fixedStartTime) >= 0 && dynaStartTime.compareTo(fixedEndTime) < 0) {
return true;
} else {
return false;
}
}
/**
* 将秒数转换为日时分秒
*
* @param second 秒数
......
......@@ -16,7 +16,7 @@ public interface CapacityEngineerCalendarDao extends JpaRepository<CapacityEngin
CapacityEngineerCalendarEntity getByPlanId(String planId);
@Query("select count(*) from CapacityEngineerCalendarEntity a where a.type = :type and a.startTime >= :startDate and a.endTime <= :endDate and a.engineerCode in :engineers")
@Query("select count(*) from CapacityEngineerCalendarEntity a where a.type = :type and (a.startTime BETWEEN :startDate and :endDate) and a.engineerCode in :engineers")
Integer queryEngineerPlanNum(List<String> engineers, LocalDateTime startDate, LocalDateTime endDate, String type);
@Modifying
......
......@@ -8,4 +8,5 @@ import java.util.List;
public interface EngineerSliceUsedCapacityDao extends JpaRepository<CapacityEngineerSliceUsedEntity, Long> {
List<CapacityEngineerSliceUsedEntity> findByWorkdayAndEngineerCode(String workDay, String engineerCode);
List<CapacityEngineerSliceUsedEntity> deleteByWorkdayAndEngineerCode(String workDay, String engineerCode);
}
......@@ -8,7 +8,6 @@ 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.TimeSliceDao;
import com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity;
import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity;
......@@ -16,6 +15,7 @@ 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.TimeSliceEntity;
import com.dituhui.pea.order.service.EngineerSliceUsedCapacityService;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
......@@ -29,8 +29,11 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
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.concurrent.TimeUnit;
import java.util.stream.Collectors;
......@@ -58,7 +61,7 @@ public class InitEngineerCapacityScheduler {
@Autowired
private TimeSliceDao timeSliceDao;
@Autowired
private EngineerSliceUsedCapacityDao engineerSliceUsedCapacityDao;
private EngineerSliceUsedCapacityService EngineerSliceUsedCapacityService;
private boolean verifyCalendar(List<CapacityEngineerCalendarEntity> configs) {
// 检查多条请假配置是否有交叉行为; configs已经根据startTime排序
......@@ -101,7 +104,7 @@ public class InitEngineerCapacityScheduler {
private void initOneEngineerSlice(String date, String engineerCode, List<CapacityEngineerCalendarEntity> configs,
List<TimeSliceEntity> commonTimeSliceList) {
//查询时间片容量
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao.findByWorkdayAndEngineerCode(date, engineerCode);
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = EngineerSliceUsedCapacityService.findByWorkdayAndEngineerCode(date, engineerCode);
if (!CollectionUtil.isEmpty(engineerTimeSlice) && !rewriteForce) {
log.warn("工程师:{}存在日期:{}时间切片记录, 无需初始化", engineerCode, date);
return;
......@@ -116,7 +119,11 @@ public class InitEngineerCapacityScheduler {
ArrayList<CapacityEngineerSliceUsedEntity> resultList = new ArrayList<>(timeCorridor.size());
for (TimeSliceEntity timeSlice : timeCorridor) {
CapacityEngineerSliceUsedEntity r = new CapacityEngineerSliceUsedEntity();
final Long id = timeSlice.getId();
Optional<CapacityEngineerSliceUsedEntity> sliceUsedEntity = Optional.ofNullable(engineerTimeSlice).orElse(Collections.emptyList())
.stream()
.filter(t -> Objects.equals(t.getTimmeSlice().getId(), id)).findFirst();
CapacityEngineerSliceUsedEntity r = sliceUsedEntity.orElseGet(CapacityEngineerSliceUsedEntity::new);
r.setTimmeSlice(timeSlice);
r.setEngineerCode(engineerCode);
r.setWorkday(date);
......@@ -145,15 +152,16 @@ public class InitEngineerCapacityScheduler {
}
}
// 剩余可约容量
long leftUseTime = 60 - lengthOfLeave;
long leftUseTime = r.getCapTotal() - lengthOfLeave;
r.setCapLeft(leftUseTime);
r.setMaxDuration(leftUseTime);
r.setCapUsed(lengthOfLeave);
r.setCreateTime(LocalDateTime.now());
r.setUpdateTime(LocalDateTime.now());
resultList.add(r);
}
engineerSliceUsedCapacityDao.saveAll(resultList);
EngineerSliceUsedCapacityService.saveAll(resultList);
}
......
package com.dituhui.pea.order.service;
import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity;
import java.util.Collection;
import java.util.List;
public interface EngineerSliceUsedCapacityService {
List<CapacityEngineerSliceUsedEntity> findByWorkdayAndEngineerCode(String workDay, String engineerCode);
List<CapacityEngineerSliceUsedEntity> deleteByWorkdayAndEngineerCode(String workDay, String engineerCode);
List<CapacityEngineerSliceUsedEntity> saveAll(Collection<CapacityEngineerSliceUsedEntity> collection);
}
......@@ -3,14 +3,33 @@ package com.dituhui.pea.order.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.IdUtil;
import com.dituhui.pea.common.BusinessException;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.common.DateUtils;
import com.dituhui.pea.order.common.EngineerUtils;
import com.dituhui.pea.order.dao.*;
import com.dituhui.pea.order.dto.*;
import com.dituhui.pea.order.common.jackson.DateTimeUtil;
import com.dituhui.pea.order.common.jackson.DateUtil;
import com.dituhui.pea.order.dao.CapacityEngineerCalendarDao;
import com.dituhui.pea.order.dao.EngineerBusinessDao;
import com.dituhui.pea.order.dao.EngineerInfoDao;
import com.dituhui.pea.order.dao.OrgTeamDao;
import com.dituhui.pea.order.dao.OrgTeamEngineerDao;
import com.dituhui.pea.order.dao.PubParamsDao;
import com.dituhui.pea.order.dto.CalendarBatAddDTO;
import com.dituhui.pea.order.dto.CalendarBatDelDTO;
import com.dituhui.pea.order.dto.CalendarDeleteDTO;
import com.dituhui.pea.order.dto.CalendarDetailDTO;
import com.dituhui.pea.order.dto.CalendarQueryNumDTO;
import com.dituhui.pea.order.dto.CalendarTypeDTO;
import com.dituhui.pea.order.dto.CalendarUpdateDTO;
import com.dituhui.pea.order.dto.EngineerCalendarDTO;
import com.dituhui.pea.order.dto.param.EngineerCalendar;
import com.dituhui.pea.order.dto.param.EngineerCalendarResultDTO;
import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity;
import com.dituhui.pea.order.entity.EngineerBusinessEntity;
import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.OrgTeamEntity;
import com.dituhui.pea.order.entity.PubParamsEntity;
import com.dituhui.pea.order.service.EngineerCalendarService;
import com.dituhui.pea.user.IUser;
import com.fasterxml.jackson.core.JsonProcessingException;
......@@ -23,10 +42,20 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import java.time.*;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -242,6 +271,11 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
String planId = newPlanId();
if (beginDate.isEqual(endDate)) {
LocalDateTime startTime = DateUtils.localDateTimeFromStr(beginTime);
LocalDateTime endTime1 = DateUtils.localDateTimeFromStr(endTime);
if (checkTimesHasOverlap(endDate, engineerCode, startTime, endTime1)) {
throw new BusinessException("工程师" + engineerCode + "存在交叉的日期日历" + DateTimeUtil.formatDate(endDate));
}
// 设定的是同一天,简单处理
CapacityEngineerCalendarEntity e = new CapacityEngineerCalendarEntity();
e.setCreateTime(LocalDateTime.now());
......@@ -250,8 +284,8 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
e.setPlanId(planId);
e.setType(type);
e.setReason(getNameForType(type));
e.setStartTime(DateUtils.localDateTimeFromStr(beginTime));
e.setEndTime(DateUtils.localDateTimeFromStr(endTime));
e.setStartTime(startTime);
e.setEndTime(endTime1);
e.setWorkday(DateUtils.formatDate(beginDate));
e.setMemo(remark);
//
......@@ -263,6 +297,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
// 跨天处理
LocalDate current = beginDate;
EngineerBusinessEntity config = engineerBusinessDao.getByEngineerCode(engineerCode);
ArrayList<CapacityEngineerCalendarEntity> all = new ArrayList<>();
while (!current.isAfter(endDate)) {
log.info("按日遍历,planId[{}]current[{}]", planId, current);
CapacityEngineerCalendarEntity e = new CapacityEngineerCalendarEntity();
......@@ -288,15 +323,36 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
String etime = String.format("%s %s:00", DateUtils.formatDate(current), config.getWorkOff());
e.setEndTime(DateUtils.localDateTimeFromStr(etime));
}
//校验是否有当天时间段的记录
if (checkTimesHasOverlap(current, engineerCode, e.getStartTime(), e.getEndTime())) {
throw new BusinessException("工程师" + engineerCode + "存在交叉的日期日历" + DateTimeUtil.formatDate(current));
}
e.setWorkday(DateUtils.formatDate(current));
e.setMemo(remark);
e.setOperatorId(userId);
e.setOperatorName(userName);
capacityEngineerCalendarDao.save(e);
all.add(e);
// 按日迭代
current = current.plusDays(1);
}
capacityEngineerCalendarDao.saveAll(all);
}
private boolean checkTimesHasOverlap(LocalDate date,
String engineerCode, LocalDateTime dynaStartTime, LocalDateTime dynaEndTime) {
//获取指定日期的工作人员日历
List<CapacityEngineerCalendarEntity> calendar = capacityEngineerCalendarDao.findCalendarByWorkdayAndEngineerCode(DateTimeUtil.formatDate(date), engineerCode);
if (CollectionUtils.isEmpty(calendar)) {
return false;
}
//进行时间交集检查, 如果有交集返回 true 无则返回
return calendar.stream()
.anyMatch(t -> {
LocalDateTime fixedStartTime = t.getStartTime();
LocalDateTime fixedEndTime = t.getEndTime();
return DateUtil.checkTimesHasOverlap(dynaStartTime, dynaEndTime, fixedStartTime, fixedEndTime);
});
}
@Override
......@@ -305,7 +361,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
return Result.failed("没有选中工程师");
}
LocalDateTime startDate = DateUtils.localDateFromStr(reqDTO.getStartDate()).atTime(LocalTime.MIDNIGHT);
LocalDateTime endDate = DateUtils.localDateFromStr(reqDTO.getEndDate()).atTime(LocalTime.MIDNIGHT);
LocalDateTime endDate = DateUtils.localDateFromStr(reqDTO.getEndDate()).atTime(LocalTime.MAX);
Integer num = capacityEngineerCalendarDao.queryEngineerPlanNum(reqDTO.getEngineerCodes(), startDate, endDate, reqDTO.getType());
CalendarQueryNumDTO.Result rs = new CalendarQueryNumDTO.Result();
rs.setPlanNum(num);
......
package com.dituhui.pea.order.service.impl;
import com.dituhui.pea.order.dao.EngineerSliceUsedCapacityDao;
import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity;
import com.dituhui.pea.order.service.EngineerSliceUsedCapacityService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.Collection;
import java.util.List;
@Service
@AllArgsConstructor
public class EngineerSliceUsedCapacityServiceImpl implements EngineerSliceUsedCapacityService {
private final EngineerSliceUsedCapacityDao engineerSliceUsedCapacityDao;
@Override
@Transactional
public List<CapacityEngineerSliceUsedEntity> findByWorkdayAndEngineerCode(String workDay, String engineerCode) {
return engineerSliceUsedCapacityDao.findByWorkdayAndEngineerCode(workDay, engineerCode);
}
@Override
@Transactional
public List<CapacityEngineerSliceUsedEntity> deleteByWorkdayAndEngineerCode(String workDay, String engineerCode) {
return engineerSliceUsedCapacityDao.deleteByWorkdayAndEngineerCode(workDay, engineerCode);
}
@Override
@Transactional
public List<CapacityEngineerSliceUsedEntity> saveAll(Collection<CapacityEngineerSliceUsedEntity> collection) {
return engineerSliceUsedCapacityDao.saveAll(collection);
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!