package com.qianwen.mdc.collect.service; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.Sets; import com.qianwen.mdc.collect.cache.TimeSliceCache; import com.qianwen.mdc.collect.cache.WorkstationCache; import com.qianwen.mdc.collect.constants.CommonConstant; import com.qianwen.mdc.collect.domain.TelemetryData; import com.qianwen.mdc.collect.domain.TelemetryDataItem; import com.qianwen.mdc.collect.dto.CacheBuildDTO; import com.qianwen.mdc.collect.dto.CalendarShiftTimeSlicesDTO; import com.qianwen.mdc.collect.dto.PackedTelemetryData; import com.qianwen.mdc.collect.handler.PackedTelemetryDataHandlerSelector; import com.qianwen.mdc.collect.handler.TelemetryDataHandler; import com.qianwen.mdc.collect.utils.LocalDateTimeUtils; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; /** * 采集数据填充,聚合和入库 */ @Service public class PackedDataService { private static final Logger log = LoggerFactory.getLogger(PackedDataService.class); private static final Map PROCESS_PARAM_MAP = new HashMap<>(); @Autowired private PackedTelemetryDataHandlerSelector handlerSelector; @Autowired private WorkstationCache workstationCache; @Autowired private TimeSliceCache timeSliceCache; static { PROCESS_PARAM_MAP.put(1, "STATE"); PROCESS_PARAM_MAP.put(2, "OUTPUT"); PROCESS_PARAM_MAP.put(3, "ALARM"); PROCESS_PARAM_MAP.put(4, "PROGRAMNUM"); PROCESS_PARAM_MAP.put(5, "OUTPUT"); PROCESS_PARAM_MAP.put(6, "ALARM"); PROCESS_PARAM_MAP.put(7, "ALARM"); } public void handle(List telemetryDataList) { List pdataList = packetData(telemetryDataList); //System.out.print(pdataList); for (PackedTelemetryData pdt : pdataList) { TelemetryDataHandler handler = handlerSelector.select(pdt.getParamType()); if (handler == null) { return; } handler.handleData(pdt); } } /** * 数据填充,日历代码之类的统计相关字段初始化(calendarCode,factoryYear,month,date,week) * * @param telemetryDataList * @return */ List packetData(List telemetryDataList) { List result = new ArrayList<>(); for (TelemetryData tdata : telemetryDataList) { for (int i = 0; i < tdata.getDataItems().size(); i++) { TelemetryDataItem item = tdata.getDataItems().get(i); for (Map map : item.getDataPoints()) { String[] keys = map.keySet().toArray(new String[0]); for (int j = 0; j < keys.length; j++) { PackedTelemetryData pkData = new PackedTelemetryData(); pkData.setWorkstationId(tdata.getWorkstationId()); pkData.setValue(map.get(keys[j])); pkData.setTime(item.getTime()); pkData.setName(keys[j]);//数据点名称 fillByCalendar(pkData); result.add(pkData); } } } } return result; } /** * 填充生产日历code,以及factoryyear * * @param pdata */ public void fillByCalendar(PackedTelemetryData pdata) { //原来在TelemetryPropertyWrapper.packWorkstationCalendarInfo中完成 //FIXME: 填写实际的数据还需要后续处理 Date collectTime = new Date(pdata.getTime()); String calendarCode = workstationCache.getWorkstationCalendarCodeForDate(pdata.getWorkstationId(), DateUtil.formatDate(DateUtil.date(collectTime))); if (ObjectUtil.isNotEmpty(calendarCode)) { pdata.setCalendarCode(calendarCode); //telemetryData.setCalendarCode(calendarCode); } else { //telemetryData.setCalendarCode("#default#"); pdata.setCalendarCode("#default#"); } // TelemetryPropertyWrapper中packWorkstationCalendarInfo //------------start boolean isDefaultCalendar = true; if (!"#default#".equals(pdata.getCalendarCode())) { CalendarShiftTimeSlicesDTO calendarShiftTimeSlicesDTO = timeSliceCache.getTimeSliceShift(pdata.getCalendarCode(), collectTime);//从redis中获得日历的时间切片 if (ObjectUtil.isEmpty(calendarShiftTimeSlicesDTO)) {//如果没有时间切片,则使用TimeSliceCache.build(cacheBuildDTO);构建 LocalDate targetDate = Instant.ofEpochMilli(pdata.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate(); CacheBuildDTO cacheBuildDTO = CacheBuildDTO.builder().tenantIds(Sets.newHashSet(new String[]{"000000"})).calendarCode(calendarCode).targetDate(targetDate).build(); timeSliceCache.build(cacheBuildDTO); calendarShiftTimeSlicesDTO = timeSliceCache.getTimeSliceShift(pdata.getCalendarCode(), collectTime); } if (ObjectUtil.isNotEmpty(calendarShiftTimeSlicesDTO)) { pdata.setShiftIndex(calendarShiftTimeSlicesDTO.getShiftIndex()).setShiftTimeType(Integer.valueOf(calendarShiftTimeSlicesDTO.getShiftTimeType())).setFactoryDate(Integer.valueOf(calendarShiftTimeSlicesDTO.getFactoryDate().replaceAll("-", ""))).setFactoryWeek(calendarShiftTimeSlicesDTO.getFactoryWeek()).setFactoryMonth(calendarShiftTimeSlicesDTO.getFactoryMonth()).setFactoryYear(calendarShiftTimeSlicesDTO.getFactoryYear()); isDefaultCalendar = false; } } //无日历切片,使用采集时间填充factoryYear,month,date,week几个属性 if (isDefaultCalendar) { log.info("无日历切片"); LocalDate localDate = Instant.ofEpochMilli(pdata.getTime().longValue()).atZone(ZoneOffset.systemDefault()).toLocalDate(); pdata.setFactoryDate(Integer.valueOf(DatePattern.PURE_DATE_FORMAT.format(collectTime))) .setFactoryYear(DateUtil.year(collectTime)) .setFactoryWeek(LocalDateTimeUtils.getWeek(localDate)) .setFactoryMonth(DateUtil.month(collectTime) + 1) .setShiftIndex(CommonConstant.DEFAULT_SHIFT_INDEX) .setShiftTimeType(CommonConstant.DEFAULT_SHIFT_TYPE); } //----------------------end /* LocalDate localDate = Instant.ofEpochMilli(pdata.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate(); String PURE_DATE_PATTERN = "yyyyMMdd"; FastDateFormat PURE_DATE_FORMAT = FastDateFormat.getInstance(PURE_DATE_PATTERN); WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 1); pdata.setFactoryYear(localDate.getYear()).setFactoryMonth(localDate.getMonthValue()) .setFactoryDate(Integer.valueOf(PURE_DATE_FORMAT.format(collectTime))) .setFactoryWeek(localDate.get(weekFields.weekOfYear())); */ } }