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; ...@@ -9,7 +9,6 @@ import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period; import java.time.Period;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
...@@ -468,6 +467,46 @@ public class DateUtil { ...@@ -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 秒数 * @param second 秒数
......
...@@ -16,7 +16,7 @@ public interface CapacityEngineerCalendarDao extends JpaRepository<CapacityEngin ...@@ -16,7 +16,7 @@ public interface CapacityEngineerCalendarDao extends JpaRepository<CapacityEngin
CapacityEngineerCalendarEntity getByPlanId(String planId); 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); Integer queryEngineerPlanNum(List<String> engineers, LocalDateTime startDate, LocalDateTime endDate, String type);
@Modifying @Modifying
......
...@@ -8,4 +8,5 @@ import java.util.List; ...@@ -8,4 +8,5 @@ import java.util.List;
public interface EngineerSliceUsedCapacityDao extends JpaRepository<CapacityEngineerSliceUsedEntity, Long> { public interface EngineerSliceUsedCapacityDao extends JpaRepository<CapacityEngineerSliceUsedEntity, Long> {
List<CapacityEngineerSliceUsedEntity> findByWorkdayAndEngineerCode(String workDay, String engineerCode); 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; ...@@ -8,7 +8,6 @@ import com.dituhui.pea.order.dao.CapacityEngineerCalendarDao;
import com.dituhui.pea.order.dao.CapacityEngineerStatDao; import com.dituhui.pea.order.dao.CapacityEngineerStatDao;
import com.dituhui.pea.order.dao.EngineerBusinessDao; import com.dituhui.pea.order.dao.EngineerBusinessDao;
import com.dituhui.pea.order.dao.EngineerInfoDao; 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.dao.TimeSliceDao;
import com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity; import com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity;
import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity; import com.dituhui.pea.order.entity.CapacityEngineerSliceUsedEntity;
...@@ -16,6 +15,7 @@ import com.dituhui.pea.order.entity.CapacityEngineerStatEntity; ...@@ -16,6 +15,7 @@ import com.dituhui.pea.order.entity.CapacityEngineerStatEntity;
import com.dituhui.pea.order.entity.EngineerBusinessEntity; import com.dituhui.pea.order.entity.EngineerBusinessEntity;
import com.dituhui.pea.order.entity.EngineerInfoEntity; import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.TimeSliceEntity; import com.dituhui.pea.order.entity.TimeSliceEntity;
import com.dituhui.pea.order.service.EngineerSliceUsedCapacityService;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -29,8 +29,11 @@ import java.time.LocalDate; ...@@ -29,8 +29,11 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.ArrayList; import java.util.ArrayList;
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.Optional;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -58,7 +61,7 @@ public class InitEngineerCapacityScheduler { ...@@ -58,7 +61,7 @@ public class InitEngineerCapacityScheduler {
@Autowired @Autowired
private TimeSliceDao timeSliceDao; private TimeSliceDao timeSliceDao;
@Autowired @Autowired
private EngineerSliceUsedCapacityDao engineerSliceUsedCapacityDao; private EngineerSliceUsedCapacityService EngineerSliceUsedCapacityService;
private boolean verifyCalendar(List<CapacityEngineerCalendarEntity> configs) { private boolean verifyCalendar(List<CapacityEngineerCalendarEntity> configs) {
// 检查多条请假配置是否有交叉行为; configs已经根据startTime排序 // 检查多条请假配置是否有交叉行为; configs已经根据startTime排序
...@@ -101,7 +104,7 @@ public class InitEngineerCapacityScheduler { ...@@ -101,7 +104,7 @@ public class InitEngineerCapacityScheduler {
private void initOneEngineerSlice(String date, String engineerCode, List<CapacityEngineerCalendarEntity> configs, private void initOneEngineerSlice(String date, String engineerCode, List<CapacityEngineerCalendarEntity> configs,
List<TimeSliceEntity> commonTimeSliceList) { List<TimeSliceEntity> commonTimeSliceList) {
//查询时间片容量 //查询时间片容量
List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = engineerSliceUsedCapacityDao.findByWorkdayAndEngineerCode(date, engineerCode); List<CapacityEngineerSliceUsedEntity> engineerTimeSlice = EngineerSliceUsedCapacityService.findByWorkdayAndEngineerCode(date, engineerCode);
if (!CollectionUtil.isEmpty(engineerTimeSlice) && !rewriteForce) { if (!CollectionUtil.isEmpty(engineerTimeSlice) && !rewriteForce) {
log.warn("工程师:{}存在日期:{}时间切片记录, 无需初始化", engineerCode, date); log.warn("工程师:{}存在日期:{}时间切片记录, 无需初始化", engineerCode, date);
return; return;
...@@ -116,7 +119,11 @@ public class InitEngineerCapacityScheduler { ...@@ -116,7 +119,11 @@ public class InitEngineerCapacityScheduler {
ArrayList<CapacityEngineerSliceUsedEntity> resultList = new ArrayList<>(timeCorridor.size()); ArrayList<CapacityEngineerSliceUsedEntity> resultList = new ArrayList<>(timeCorridor.size());
for (TimeSliceEntity timeSlice : timeCorridor) { 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.setTimmeSlice(timeSlice);
r.setEngineerCode(engineerCode); r.setEngineerCode(engineerCode);
r.setWorkday(date); r.setWorkday(date);
...@@ -145,15 +152,16 @@ public class InitEngineerCapacityScheduler { ...@@ -145,15 +152,16 @@ public class InitEngineerCapacityScheduler {
} }
} }
// 剩余可约容量 // 剩余可约容量
long leftUseTime = 60 - lengthOfLeave; long leftUseTime = r.getCapTotal() - lengthOfLeave;
r.setCapLeft(leftUseTime); r.setCapLeft(leftUseTime);
r.setMaxDuration(leftUseTime);
r.setCapUsed(lengthOfLeave); r.setCapUsed(lengthOfLeave);
r.setCreateTime(LocalDateTime.now()); r.setCreateTime(LocalDateTime.now());
r.setUpdateTime(LocalDateTime.now()); r.setUpdateTime(LocalDateTime.now());
resultList.add(r); 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; ...@@ -3,14 +3,33 @@ package com.dituhui.pea.order.service.impl;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.dituhui.pea.common.BusinessException;
import com.dituhui.pea.common.Result; import com.dituhui.pea.common.Result;
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.dao.*; import com.dituhui.pea.order.common.jackson.DateTimeUtil;
import com.dituhui.pea.order.dto.*; 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.EngineerCalendar;
import com.dituhui.pea.order.dto.param.EngineerCalendarResultDTO; 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.order.service.EngineerCalendarService;
import com.dituhui.pea.user.IUser; import com.dituhui.pea.user.IUser;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
...@@ -23,10 +42,20 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -23,10 +42,20 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.sql.Timestamp; 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.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; 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.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -242,6 +271,11 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -242,6 +271,11 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
String planId = newPlanId(); String planId = newPlanId();
if (beginDate.isEqual(endDate)) { 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(); CapacityEngineerCalendarEntity e = new CapacityEngineerCalendarEntity();
e.setCreateTime(LocalDateTime.now()); e.setCreateTime(LocalDateTime.now());
...@@ -250,8 +284,8 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -250,8 +284,8 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
e.setPlanId(planId); e.setPlanId(planId);
e.setType(type); e.setType(type);
e.setReason(getNameForType(type)); e.setReason(getNameForType(type));
e.setStartTime(DateUtils.localDateTimeFromStr(beginTime)); e.setStartTime(startTime);
e.setEndTime(DateUtils.localDateTimeFromStr(endTime)); e.setEndTime(endTime1);
e.setWorkday(DateUtils.formatDate(beginDate)); e.setWorkday(DateUtils.formatDate(beginDate));
e.setMemo(remark); e.setMemo(remark);
// //
...@@ -263,6 +297,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -263,6 +297,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
// 跨天处理 // 跨天处理
LocalDate current = beginDate; LocalDate current = beginDate;
EngineerBusinessEntity config = engineerBusinessDao.getByEngineerCode(engineerCode); EngineerBusinessEntity config = engineerBusinessDao.getByEngineerCode(engineerCode);
ArrayList<CapacityEngineerCalendarEntity> all = new ArrayList<>();
while (!current.isAfter(endDate)) { while (!current.isAfter(endDate)) {
log.info("按日遍历,planId[{}]current[{}]", planId, current); log.info("按日遍历,planId[{}]current[{}]", planId, current);
CapacityEngineerCalendarEntity e = new CapacityEngineerCalendarEntity(); CapacityEngineerCalendarEntity e = new CapacityEngineerCalendarEntity();
...@@ -288,15 +323,36 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -288,15 +323,36 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
String etime = String.format("%s %s:00", DateUtils.formatDate(current), config.getWorkOff()); String etime = String.format("%s %s:00", DateUtils.formatDate(current), config.getWorkOff());
e.setEndTime(DateUtils.localDateTimeFromStr(etime)); 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.setWorkday(DateUtils.formatDate(current));
e.setMemo(remark); e.setMemo(remark);
e.setOperatorId(userId); e.setOperatorId(userId);
e.setOperatorName(userName); e.setOperatorName(userName);
capacityEngineerCalendarDao.save(e); all.add(e);
// 按日迭代 // 按日迭代
current = current.plusDays(1); 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 @Override
...@@ -305,7 +361,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -305,7 +361,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
return Result.failed("没有选中工程师"); return Result.failed("没有选中工程师");
} }
LocalDateTime startDate = DateUtils.localDateFromStr(reqDTO.getStartDate()).atTime(LocalTime.MIDNIGHT); 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()); Integer num = capacityEngineerCalendarDao.queryEngineerPlanNum(reqDTO.getEngineerCodes(), startDate, endDate, reqDTO.getType());
CalendarQueryNumDTO.Result rs = new CalendarQueryNumDTO.Result(); CalendarQueryNumDTO.Result rs = new CalendarQueryNumDTO.Result();
rs.setPlanNum(num); rs.setPlanNum(num);
...@@ -397,7 +453,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService { ...@@ -397,7 +453,7 @@ public class EngineerCalendarServiceImpl implements EngineerCalendarService {
result.setEngineerName(engineerInfoEntity.getName()); result.setEngineerName(engineerInfoEntity.getName());
result.setEngineerCode(engineerInfoEntity.getEngineerCode()); result.setEngineerCode(engineerInfoEntity.getEngineerCode());
result.setCalendar(engineerCalendarResultList); result.setCalendar(engineerCalendarResultList);
return result; return result;
} }
private List<EngineerCalendarDTO.Calendar> getOneEngineerCalendars(String engineerCode, String bdate, String edate) { private List<EngineerCalendarDTO.Calendar> getOneEngineerCalendars(String engineerCode, String bdate, String edate) {
......
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!