| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.qianwen.core.tool.utils.Func; |
| | | import com.qianwen.mdc.collect.constants.CommonConstant; |
| | | import com.qianwen.mdc.collect.dto.CacheBuildDTO; |
| | | import com.qianwen.mdc.collect.dto.CalendarShiftTimeSlicesDTO; |
| | |
| | | import com.qianwen.mdc.collect.entity.mgr.ProductionCalendarDaytime; |
| | | import com.qianwen.mdc.collect.mapper.mgr.CalendarMapper; |
| | | import com.qianwen.mdc.collect.utils.LocalDateTimeUtils; |
| | | import com.qianwen.core.secure.utils.AuthUtil; |
| | | import com.qianwen.core.tool.utils.Func; |
| | | /* |
| | | import com.qianwen.core.redis.cache.BladeRedis; |
| | | |
| | | import com.qianwen.posting.constant.CommonConstant; |
| | | import com.qianwen.posting.dto.CacheBuildDTO; |
| | | import com.qianwen.posting.dto.CalendarShiftTimeSlicesDTO; |
| | | import com.qianwen.posting.dto.TimestampToProductionTimeCacheDto; |
| | | import com.qianwen.posting.entity.mysql.ProductionCalendar; |
| | | import com.qianwen.posting.entity.mysql.ProductionCalendarDaytime; |
| | | |
| | | import com.qianwen.posting.service.ICalendarDayService; |
| | | import com.qianwen.posting.service.ICalendarDaytimeService; |
| | | import com.qianwen.posting.service.ICalendarService; |
| | | import com.qianwen.posting.utils.LocalDateTimeUtils; |
| | | */ |
| | | @Service |
| | | public class CalendarService extends ServiceImpl<CalendarMapper, ProductionCalendar>{ |
| | | private static final Logger log = LoggerFactory.getLogger(CalendarService.class); |
| | | @Autowired |
| | | private CalendarDayService calendarDayService; |
| | | //@Autowired |
| | | //private CalendarDayService calendarDayService; |
| | | @Autowired |
| | | private CalendarDaytimeService calendarDaytimeService; |
| | | //private final BladeRedis bladeRedis; |
| | | |
| | | /* |
| | | @Override |
| | | public String getShiftIndexNameByCodeAndYear(String calendarCode, Integer year, Integer shiftIndex) { |
| | | return ((CalendarMapper) this.baseMapper).getShiftIndexNameByCodeAndYear(calendarCode, year, shiftIndex, AuthUtil.getTenantId()); |
| | | }*/ |
| | | |
| | | //构建生产日历切片(blade_production_calendar) |
| | | public List<TimestampToProductionTimeCacheDto> buildProductionTimeCache(CacheBuildDTO cacheBuildDTO) { |
| | | LocalDate targetDate = cacheBuildDTO.getTargetDate(); |
| | | Set<String> tenantIds = cacheBuildDTO.getTenantIds(); |
| | | String code = cacheBuildDTO.getCalendarCode(); |
| | | List<TimestampToProductionTimeCacheDto> timestampToProductionTimeCacheDtos = new ArrayList<>(); |
| | | List<ProductionCalendar> list = list((new QueryWrapper<ProductionCalendar>()).lambda() |
| | | List<TimestampToProductionTimeCacheDto> timestampToProductionTimeCacheDtos = new ArrayList<>();//返回结果, |
| | | List<ProductionCalendar> calList = list((new QueryWrapper<ProductionCalendar>()).lambda() |
| | | .in(ProductionCalendar::getTenantId, tenantIds) |
| | | .eq(ProductionCalendar::getStatus, CommonConstant.ENABLE) |
| | | .eq(StringUtils.isNotBlank(code), ProductionCalendar::getCode, code) |
| | |
| | | |
| | | LocalDateTime startTime = LocalDateTime.of(targetDate, LocalTime.MIN);//0分0秒开始 |
| | | LocalDateTime endTime = LocalDateTime.of(targetDate.plusDays(1L), LocalTime.of(0, 0));//第二天0点 |
| | | if (Func.isNotEmpty(list)) { |
| | | Map<String, List<ProductionCalendar>> collect = (Map<String, List<ProductionCalendar>>)list.stream().collect(Collectors.groupingBy(ProductionCalendar::getTenantId)); |
| | | collect.forEach((tenantId, productionList) -> { |
| | | productionList.forEach(productionCalendar -> { |
| | | if (Func.isNotEmpty(calList)) { |
| | | Map<String, List<ProductionCalendar>> collect = calList.stream().collect(Collectors.groupingBy(ProductionCalendar::getTenantId)); |
| | | collect.forEach((tenantId, productionCalList) -> { |
| | | productionCalList.forEach(productionCalendar -> { |
| | | TimestampToProductionTimeCacheDto timestampToProductionTimeCacheDto = TimestampToProductionTimeCacheDto.builder().TenantId(productionCalendar.getTenantId()).CalendarCode(productionCalendar.getCode()).NaturalDay(targetDate).build(); |
| | | |
| | | List<ProductionCalendarDaytime> dayTimeList = this.calendarDaytimeService.list(new QueryWrapper<ProductionCalendarDaytime>().lambda() |
| | |
| | | .between(ProductionCalendarDaytime::getEndTime, startTime, endTime); |
| | | }).orderByAsc(ProductionCalendarDaytime::getStartTime)); |
| | | |
| | | //去掉dayTimeList种起止时间=startTime和endTime的数据 |
| | | List<ProductionCalendarDaytime> dayTimeList2 = dayTimeList.stream().filter(productionCalendarDaytime -> { |
| | | return (productionCalendarDaytime.getEndTime().equals(startTime) || productionCalendarDaytime.getStartTime().equals(endTime)) ? false : true; |
| | | }).collect(Collectors.toList()); |
| | | Map<Integer, CalendarShiftTimeSlicesDTO> timeSlicesMap = new HashMap<>(1919); |
| | | |
| | | Map<Integer, CalendarShiftTimeSlicesDTO> timeSlicesMap = new HashMap<>(1919);//一天中的分钟序号 -> DTO |
| | | for (int i2 = 0; i2 <= CommonConstant.MINUTE_STOP.intValue(); i2++) {//MINUTE_STOP=1439,差一分钟23小时59分的分钟数 |
| | | buildTimeSlicesMap(startTime, endTime, dayTimeList2, timeSlicesMap, i2, targetDate); |
| | | } |
| | | timestampToProductionTimeCacheDto.setTimeSlicesDTOMap(timeSlicesMap); |
| | | |
| | | timestampToProductionTimeCacheDtos.add(timestampToProductionTimeCacheDto); |
| | | }); |
| | | }); |
| | | } |
| | | return timestampToProductionTimeCacheDtos; |
| | | } |
| | | |
| | | private void buildTimeSlicesMap(LocalDateTime startTime, LocalDateTime endTime, List<ProductionCalendarDaytime> dayTimeList, Map<Integer, CalendarShiftTimeSlicesDTO> timeSlicesDTOMap, int i, LocalDate targetDate) { |
| | | LocalDateTime localDateTime = LocalDateTime.of(targetDate, LocalTime.MIN).plusMinutes(i).plusSeconds(1L); |
| | | /** |
| | | * 构建一天的时间切片数据,保存到timeSlicesDTOMap种 |
| | | * @param startTime |
| | | * @param endTime |
| | | * @param dayTimeList |
| | | * @param timeSlicesDTOMap 设置值,上层方法直接使用 |
| | | * @param minutesOfDay 分钟数值 从0点开始的,不是每小时的分钟数 |
| | | * @param targetDate 日期 |
| | | */ |
| | | private void buildTimeSlicesMap(LocalDateTime startTime, LocalDateTime endTime, List<ProductionCalendarDaytime> dayTimeList, Map<Integer, CalendarShiftTimeSlicesDTO> timeSlicesDTOMap, int minutesOfDay, LocalDate targetDate) { |
| | | LocalDateTime localDateTime = LocalDateTime.of(targetDate, LocalTime.MIN).plusMinutes(minutesOfDay).plusSeconds(1L); |
| | | |
| | | //在dayTimeList中过滤出在starttime,endtime之间的日期 |
| | | //在dayTimeList中过滤出在starttime,endtime之间的数据,取第一个 |
| | | ProductionCalendarDaytime productionCalendarDaytime = dayTimeList.stream().filter(dayTime -> { |
| | | return (localDateTime.isAfter(dayTime.getStartTime()) || localDateTime.equals(dayTime.getStartTime())) && (localDateTime.isBefore(dayTime.getEndTime()) || localDateTime.equals(dayTime.getEndTime())); |
| | | }).findFirst().orElse(null); |
| | | |
| | | if (Func.isEmpty(productionCalendarDaytime)) { |
| | | return; |
| | | } |
| | |
| | | shiftEndTime = endTime; |
| | | } |
| | | CalendarShiftTimeSlicesDTO calendarShiftTimeSlicesDTO = CalendarShiftTimeSlicesDTO.builder().shiftTimeType(productionCalendarDaytime.getShiftType().toString()).endTime(LocalDateTimeUtils.LocalDateTimeToDate(shiftEndTime)).startTime(LocalDateTimeUtils.LocalDateTimeToDate(shiftStartTime)).shiftIndex(productionCalendarDaytime.getShiftIndex()).shiftTimeType(productionCalendarDaytime.getShiftType().toString()).factoryDate(LocalDateTimeUtils.formatTimeLocalDate(productionCalendarDaytime.getCalendarDate(), "yyyy-MM-dd")).factoryMonth(productionCalendarDaytime.getMonth()).factoryWeek(productionCalendarDaytime.getWeek()).factoryYear(productionCalendarDaytime.getYear()).build(); |
| | | timeSlicesDTOMap.put(Integer.valueOf(i), calendarShiftTimeSlicesDTO); |
| | | timeSlicesDTOMap.put(Integer.valueOf(minutesOfDay), calendarShiftTimeSlicesDTO); |
| | | } |
| | | } |