yangys
2024-10-25 9faa74e1912022dc6e54c3e93426946876b5d83a
修改redistemplate的hashkey serializer,更方便客户端查看redis的数据
已修改11个文件
已添加3个文件
297 ■■■■■ 文件已修改
collect/pom.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/cache/TimeSliceCache.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/config/redis/RedisKeySerializer.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/constants/CommonConstant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/controller/CalController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/service/CalendarService.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/service/WorkstationService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/service/feedback/ImmediateFeedbackHandlerStrategy.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/test/java/com/qianwen/mdc/collect/service/PackedDataServiceTest.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/pom.xml
@@ -115,9 +115,13 @@
            <artifactId>smart-starter-mybatis</artifactId>
            <version>1.0.0</version>
        </dependency>
  <!--
          <dependency>
            <groupId>com.qianwen</groupId>
            <artifactId>smart-starter-redis</artifactId>
            <version>1.0.0</version>
        </dependency>
 -->
       
        <!-- <dependency>
            <groupId>org.opcfoundation</groupId>
collect/src/main/java/com/qianwen/mdc/collect/cache/TimeSliceCache.java
@@ -10,8 +10,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.qianwen.core.tool.utils.SpringUtil;
import com.qianwen.mdc.collect.dto.CacheBuildDTO;
import com.qianwen.mdc.collect.dto.CalendarShiftTimeSlicesDTO;
import com.qianwen.mdc.collect.dto.TimestampToProductionTimeCacheDto;
@@ -19,47 +17,42 @@
import com.qianwen.mdc.collect.utils.CommonUtil;
import com.qianwen.mdc.collect.utils.redis.RedisUtil;
/*
import com.qianwen.posting.dto.CacheBuildDTO;
import com.qianwen.posting.dto.CalendarShiftTimeSlicesDTO;
import com.qianwen.posting.dto.TimestampToProductionTimeCacheDto;
import com.qianwen.posting.service.ICalendarService;
import com.qianwen.posting.utils.CommonUtil;
*/
@Component
public class TimeSliceCache {
    public static final String COLLECT_CALENDAR = "collect:calendar";
    public static final String CALENDAR = "calendar";
    public static final String CALENDARS_CODE = "calendar:code:";
    public static final String MINUTE_POINT = "minute-point:";
    private static final Logger log = LoggerFactory.getLogger(TimeSliceCache.class);
    //private static final BladeRedis bladeRedis = (BladeRedis) SpringUtil.getBean(BladeRedis.class);
    //private static final ICalendarService calendarService = (ICalendarService) SpringUtil.getBean(ICalendarService.class);
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private CalendarService calendarService;
    //@Autowired
    //private BladeRedis bladeRedis;
    public CalendarShiftTimeSlicesDTO getTimeSliceShift(String calendarCode, Date date) {
        int minutes = (DateTime.of(date).hour(true) * 60) + DateTime.of(date).minute();//日期转化为分钟数,作为hash key从redis取切片数据数据
        String redisKey = CommonUtil.getReallyCacheName("posting:calendar", CALENDARS_CODE.concat(calendarCode).concat(":").concat(MINUTE_POINT), DateTime.of(date).toDateStr());
        //return (CalendarShiftTimeSlicesDTO) bladeRedis.hGet(redisKey, Integer.valueOf(minutes));
        return (CalendarShiftTimeSlicesDTO) redisUtil.hget(redisKey, minutes+"");
        String redisKey = CommonUtil.getReallyCacheName(COLLECT_CALENDAR, CALENDARS_CODE.concat(calendarCode).concat(":").concat(MINUTE_POINT), DateTime.of(date).toDateStr());
        return (CalendarShiftTimeSlicesDTO)redisUtil.getRedisTemplate().opsForHash().get(redisKey, Integer.valueOf(minutes));
    }
    //构建并保存时间切片,保存到redis
 
    public void build(CacheBuildDTO cacheBuildDTO) {
        String key = cacheBuildDTO.getTargetDate().format(DateTimeFormatter.ISO_LOCAL_DATE);
        List<TimestampToProductionTimeCacheDto> data = calendarService.buildProductionTimeCache(cacheBuildDTO);//查询生产日历,并计算出时间切片
        data.forEach(t -> {
            String redisKey = CommonUtil.getReallyCacheName("posting:calendar", CALENDARS_CODE.concat(t.getCalendarCode()).concat(":").concat(MINUTE_POINT), key);
            String redisKey = CommonUtil.getReallyCacheName(COLLECT_CALENDAR, CALENDARS_CODE.concat(t.getCalendarCode()).concat(":").concat(MINUTE_POINT), key);
            Map<Integer, CalendarShiftTimeSlicesDTO> timeSlicesDtoMap = t.getTimeSlicesDTOMap();
            //bladeRedis.getRedisTemplate().opsForHash().putAll(redisKey, timeSlicesDtoMap);
            //bladeRedis.expire(redisKey, 259200L);
            redisUtil.hmset(redisKey, timeSlicesDtoMap, 259200L);
            //redisUtil.hmset(redisKey, timeSlicesDtoMap, 259200L);
            redisUtil.getRedisTemplate().opsForHash().putAll(redisKey, timeSlicesDtoMap);
        });
    }
}
collect/src/main/java/com/qianwen/mdc/collect/cache/WorkstationCache.java
@@ -28,6 +28,7 @@
@Component
public class WorkstationCache {
    public static final String COLLECT_WORKSTATION = "collect:workstation";
    private static final String WORKSTATION_ID = "workstation:id:";
    private static final String CALENDAR_DATE = ":calendar:date:";
    private static final String WORKSTATION_ALL = "workstation:all";
@@ -46,7 +47,7 @@
    
    
    public Map<Long, WorkstationDTO> getWorkstations() {
        String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL);
        String redisKey = COLLECT_WORKSTATION.concat("::").concat(WORKSTATION_ALL);
        /*Map<String, WorkstationDTO> map = bladeRedis.hGetAll(redisKey);
       
        
@@ -67,7 +68,7 @@
    
    private Map<Long, WorkstationDTO> setWorkstations() {
        List<Workstation> list = workstationService.list();
        String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL);
        String redisKey = COLLECT_WORKSTATION.concat("::").concat(WORKSTATION_ALL);
       
        list.forEach(ws -> {
            /*
@@ -109,7 +110,7 @@
     * @return
     */
    public String getWorkstationCalendarCodeForDate(Long workstationId, String date) {
        String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ID).concat(workstationId.toString().concat(CALENDAR_DATE)).concat(date);
        String redisKey = COLLECT_WORKSTATION.concat("::").concat(WORKSTATION_ID).concat(workstationId.toString().concat(CALENDAR_DATE)).concat(date);
        //String calendarCode = (String) bladeRedis.get(redisKey);
        String calendarCode = (String) redisUtil.get(redisKey);
        if (ObjectUtil.isEmpty(calendarCode)) {
@@ -125,7 +126,7 @@
    }
    
    public GlobalWcsOfRps getWorkstationWcsSetting(Long workstationId, String code) {
        String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ID).concat(workstationId.toString()
        String redisKey = COLLECT_WORKSTATION.concat("::").concat(WORKSTATION_ID).concat(workstationId.toString()
            .concat(WCS_SETTING));
        
        //GlobalWcsOfRps wcsSetting = (GlobalWcsOfRps)redisUtil.hGet(redisKey, code);
@@ -155,7 +156,7 @@
     */
    public Long getBelongToEmployeeForWorkstation(Long workstationId, Date timePoint) {
        Long employeeId = null;
        String redisKey = "posting:workstation".concat("::").concat("workstation:id:")
        String redisKey = COLLECT_WORKSTATION.concat("::").concat("workstation:id:")
                .concat(workstationId.toString().concat(EMPLOYEE));
        // Set<EmployeeOnOffWork> employeeOnOffWorks = bladeRedis.sMembers(redisKey);
collect/src/main/java/com/qianwen/mdc/collect/config/RedisConfig.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.qianwen.mdc.collect.config.redis.RedisKeySerializer;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
@@ -37,16 +38,18 @@
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        //om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.WRAPPER_ARRAY);
        
        jacksonSeial.setObjectMapper(om);
        template.setValueSerializer(jacksonSeial);
        template.setKeySerializer(new StringRedisSerializer());
        
        //new JdkSerializationRedisSerializer(classLoader);
        //template.setHashKeySerializer(new StringRedisSerializer());
        //template.setKeySerializer(new StringRedisSerializer()); //这个注释了1024
        RedisKeySerializer keySerializer = new RedisKeySerializer();
        template.setKeySerializer(keySerializer);
        template.setHashKeySerializer(keySerializer);
        
        ClassLoader classLoader = getClass().getClassLoader();
        template.setHashKeySerializer(new JdkSerializationRedisSerializer(classLoader));
        //ClassLoader classLoader = getClass().getClassLoader();
        //template.setHashKeySerializer(new JdkSerializationRedisSerializer(classLoader));
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();
        return template;
collect/src/main/java/com/qianwen/mdc/collect/config/redis/RedisKeySerializer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.qianwen.mdc.collect.config.redis;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import org.springframework.cache.interceptor.SimpleKey;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.redis.serializer.RedisSerializer;
public class RedisKeySerializer implements RedisSerializer<Object> {
    private final Charset charset;
    private final ConversionService converter;
    public RedisKeySerializer() {
        this(StandardCharsets.UTF_8);
    }
    public RedisKeySerializer(Charset charset) {
        Objects.requireNonNull(charset, "Charset must not be null");
        this.charset = charset;
        this.converter = DefaultConversionService.getSharedInstance();
    }
    public Object deserialize(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        return new String(bytes, this.charset);
    }
    public byte[] serialize(Object object) {
        String key;
        Objects.requireNonNull(object, "redis key is null");
        if (object instanceof SimpleKey) {
            key = "";
        } else if (object instanceof String) {
            key = (String) object;
        } else {
            key = this.converter.convert(object, String.class);
        }
        return key.getBytes(this.charset);
    }
}
collect/src/main/java/com/qianwen/mdc/collect/constants/CommonConstant.java
@@ -1,7 +1,7 @@
package com.qianwen.mdc.collect.constants;
public interface CommonConstant {
    public static final String APPLICATION_NAME = "posting";
    public static final String APPLICATION_NAME = "collect";
    public static final String ALARM_CODE = "code";
    public static final String ALARM_TIME = "timestamp";
    public static final String ALARM_MSG = "msg";
@@ -11,7 +11,7 @@
    public static final String STATE = "state";
    public static final String BIZ_SPLIT = "::";
    public static final String DEFAULT_CODE = "#default#";
    public static final String GLOBAL_WORKSTATION_FEEDBACK_ANALYSE_LOCK = "lock:posting:state:{}";
    public static final String GLOBAL_WORKSTATION_FEEDBACK_ANALYSE_LOCK = "lock:collect:state:{}";
    public static final long WAIT_TIME = 10;
    public static final long REDIS_LOCK_LEASE_TIME = 240;
    public static final Integer DEFAULT_SHIFT_INDEX = 1;
collect/src/main/java/com/qianwen/mdc/collect/controller/CalController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.qianwen.mdc.collect.controller;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.google.common.collect.Sets;
import com.qianwen.mdc.collect.cache.TimeSliceCache;
import com.qianwen.mdc.collect.config.IotDBSessionConfig;
import com.qianwen.mdc.collect.dto.CacheBuildDTO;
import com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO;
import com.qianwen.mdc.collect.dto.CalendarShiftTimeSlicesDTO;
import com.qianwen.mdc.collect.entity.iotdb.Output;
import com.qianwen.mdc.collect.entity.iotdb.ProcessParam;
import com.qianwen.mdc.collect.mapper.iotdb.OutputMapper;
import com.qianwen.mdc.collect.mapper.iotdb.ProcessParamMapper;
import com.qianwen.mdc.collect.mapper.mgr.CalendarMapper;
import com.qianwen.mdc.collect.mqtt.MqttMessageSender;
import com.qianwen.mdc.collect.service.DeviceStateFixPointService;
import com.qianwen.mdc.collect.service.IOTMqttReceiveService;
import com.qianwen.mdc.collect.service.IotDBCommonService;
import com.qianwen.mdc.collect.service.OutputAggregateService;
import com.qianwen.mdc.collect.utils.redis.RedisUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
@RestController("timecache")
public class CalController {
    @Autowired
    private TimeSliceCache timeSliceCache;
    String calCode= "1";
    @GetMapping("/gett")
    public Object gett() {
        Date date = new Date();
        System.out.println("getdate="+date);
        CalendarShiftTimeSlicesDTO dto = timeSliceCache.getTimeSliceShift(calCode, date);
        return dto;
    }
    @GetMapping("/sett")
    public Object sett() {
        Date date = new Date();
         LocalDate targetDate = Instant.ofEpochMilli(date.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate();
         CacheBuildDTO cacheBuildDTO = CacheBuildDTO.builder().tenantIds(Sets.newHashSet(new String[]{"000000"})).calendarCode(calCode).targetDate(targetDate).build();
         timeSliceCache.build(cacheBuildDTO);
        return "settOK,targetDate="+targetDate;
    }
}
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);
    }
}
collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java
@@ -75,7 +75,7 @@
    }
    /**
     * æ•°æ®å¡«å……,(calendarCode,factoryYear,month,date,week)
     * æ•°æ®å¡«å……,日历代码之类的统计相关字段初始化(calendarCode,factoryYear,month,date,week)
     * 
     * @param telemetryDataList
     * @return
@@ -117,7 +117,7 @@
     * 
     * @param pdata
     */
    void fillByCalendar(PackedTelemetryData pdata) {
    public void fillByCalendar(PackedTelemetryData pdata) {
        //原来在TelemetryPropertyWrapper.packWorkstationCalendarInfo中完成
        //FIXME: å¡«å†™å®žé™…的数据还需要后续处理
        
collect/src/main/java/com/qianwen/mdc/collect/service/WorkstationService.java
@@ -21,16 +21,7 @@
import com.qianwen.mdc.collect.utils.LocalDateTimeUtils;
import org.springframework.beans.factory.annotation.Autowired;
/*
import com.qianwen.posting.cache.WorkstationCache;
import com.qianwen.posting.constant.CommonConstant;
import com.qianwen.posting.dto.CalendarShiftInfoDTO;
import com.qianwen.posting.entity.mysql.Workstation;
import com.qianwen.posting.mapper.mysql.CalendarMapper;
import com.qianwen.posting.mapper.mysql.WorkstationMapper;
import com.qianwen.posting.service.IWorkstationService;
import com.qianwen.posting.utils.LocalDateTimeUtils;
*/
import org.springframework.stereotype.Service;
@Service
collect/src/main/java/com/qianwen/mdc/collect/service/feedback/ImmediateFeedbackHandlerStrategy.java
@@ -18,15 +18,11 @@
import com.qianwen.mdc.collect.enums.FeedbackTypeEnum;
import com.qianwen.mdc.collect.mapper.iotdb.DeviceStateMapper;
import com.qianwen.mdc.collect.mapper.mgr.WorkstationWcsFeedbackDetailMapper;
//import com.qianwen.posting.entity.tdengine.WorkstationState;
import com.qianwen.mdc.collect.mapper.mgr.WorkstationWcsFeedbackMapper;
import com.qianwen.mdc.collect.service.DeviceStateAggregateService;
import com.qianwen.mdc.collect.service.DeviceStateService;
//import com.qianwen.posting.message.event.WorkstationAggregateMessage;
//import com.qianwen.posting.message.producer.WorkstationAggregateProducer;
@Component
public class ImmediateFeedbackHandlerStrategy implements WorkstationFeedbackHandlerStrategy {
collect/src/main/java/com/qianwen/mdc/collect/utils/redis/RedisUtil.java
@@ -14,10 +14,15 @@
@Component
public class RedisUtil {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    public RedisTemplate<String, Object> getRedisTemplate() {
        return this.redisTemplate;
    }
    /**
     * æŒ‡å®šç¼“存失效时间
     * @param key é”®
@@ -603,6 +608,5 @@
        return boundValueOperations.rightPop();
    }
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
}
collect/src/main/resources/application-dev.yml
@@ -23,7 +23,7 @@
  #心跳时间
  keepalive: 10
  connectionTimeout: 3000 #连接超时时间
  dataReceiveTopic: forward/test #从iot平台接收mqtt采集数据的topic
  dataReceiveTopic: forward/testxxx #从iot平台接收mqtt采集数据的topic forward/test
  # mysql
datasource:
  type: mysql
collect/src/test/java/com/qianwen/mdc/collect/service/PackedDataServiceTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.qianwen.mdc.collect.service;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import org.junit.jupiter.api.Test;
public class PackedDataServiceTest {
    @Test
    public void testTime() {
        LocalDate targetDate = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneOffset.systemDefault()).toLocalDate();
        System.out.println(targetDate);
        //System.out.println(DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(targetDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
    }
}