Commit 4d0d259a by 刘鑫

fix(ID1003910): 博西PEA_V1.0-工作日历-批量新增

des: 批量新增日程类型可以重复新增,导致同一天出现多批同样的日程数据
fix: 增加每天每个工程师日历时间交叉检查
1 parent cdca1959
...@@ -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 秒数
......
...@@ -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
...@@ -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) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!