yangys
2024-10-25 9faa74e1912022dc6e54c3e93426946876b5d83a
collect/src/main/java/com/qianwen/mdc/collect/service/CalendarService.java
@@ -19,6 +19,7 @@
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;
@@ -27,45 +28,23 @@
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)
@@ -73,10 +52,10 @@
        
        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()
@@ -85,28 +64,40 @@
                              .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;
        }
@@ -119,6 +110,6 @@
            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);
    }
}