package com.qianwen.mdc.collect.service; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.stream.Collectors; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.write.record.Tablet; import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; 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.Lists; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.tool.utils.SpringUtil; import com.qianwen.mdc.collect.cache.WorkstationCache; import com.qianwen.mdc.collect.config.IotDBSessionConfig; import com.qianwen.mdc.collect.constants.CommonConstant; import com.qianwen.mdc.collect.constants.IOTDBConstant; import com.qianwen.mdc.collect.dto.CalendarShiftInfoDTO; import com.qianwen.mdc.collect.dto.WorkstationDTO; import com.qianwen.mdc.collect.entity.iotdb.DeviceState; import com.qianwen.mdc.collect.enums.FeedbackTimePointEnum; import com.qianwen.mdc.collect.mapper.mgr.CalendarMapper; import com.qianwen.mdc.collect.utils.LocalDateTimeUtils; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; /** * 设备状态普通服务 */ @Service public class DeviceStateService{ private static final Logger log = LoggerFactory.getLogger(DeviceStateService.class); @Autowired private IotDBCommonService iotDBCommonService; @Autowired private IotDBSessionConfig iotdbConfig; static final List schemas; static { schemas = new ArrayList<>(); schemas.add(new MeasurementSchema("workstation_id", TSDataType.INT64)); schemas.add(new MeasurementSchema("value_collect", TSDataType.INT32)); schemas.add(new MeasurementSchema("calendar_code", TSDataType.TEXT)); schemas.add(new MeasurementSchema("factory_year", TSDataType.INT32)); schemas.add(new MeasurementSchema("factory_month", TSDataType.INT32)); schemas.add(new MeasurementSchema("factory_week", TSDataType.INT32)); schemas.add(new MeasurementSchema("factory_date", TSDataType.INT32)); schemas.add(new MeasurementSchema("shift_index", TSDataType.INT32)); schemas.add(new MeasurementSchema("shift_time_type", TSDataType.INT32)); schemas.add(new MeasurementSchema("wcs", TSDataType.INT32)); schemas.add(new MeasurementSchema("rps", TSDataType.INT32)); schemas.add(new MeasurementSchema("is_fix_point", TSDataType.BOOLEAN)); schemas.add(new MeasurementSchema("is_sync", TSDataType.BOOLEAN)); schemas.add(new MeasurementSchema("is_plan", TSDataType.INT32));//TODO 这个属性应该是GlobalWcsOfRps中的值,如何填写? schemas.add(new MeasurementSchema("feedback_point_type", TSDataType.INT32)); schemas.add(new MeasurementSchema("feedback_id", TSDataType.INT64)); schemas.add(new MeasurementSchema("is_deleted", TSDataType.BOOLEAN)); schemas.add(new MeasurementSchema("employee_id", TSDataType.INT64)); } /** * 保存状态固定点数据(state_{workstationId}) * @param stateList */ public void saveDeviceStates(List stateList) { //将数据按照工位id分组 Map> maps = stateList.stream().collect(Collectors.groupingBy(DeviceState::getWorkstationId)); String deviceId; Long wid; List states; for(Entry> entry: maps.entrySet()) { wid = entry.getKey(); deviceId = IOTDBConstant.DB_PREFIX+"state_"+wid; iotDBCommonService.setTemmplateIfNotSet(IOTDBConstant.TEMPLATE_STATE, deviceId);//挂载模板 Tablet tablet = new Tablet(deviceId, schemas); states = entry.getValue(); tablet.rowSize = states.size(); DeviceState state; final int MAX_COUNT = 1000; //int currentIdx = 0; int tblIndex = 0; for(int i=0; i < states.size(); i++) { state = states.get(i); tablet.addTimestamp(tblIndex, state.getTime()); tablet.addValue("workstation_id", tblIndex, state.getWorkstationId()); tablet.addValue("value_collect", tblIndex, state.getValueCollect()); tablet.addValue("calendar_code", tblIndex, state.getCalendarCode()); tablet.addValue("factory_year", tblIndex, state.getFactoryYear()); tablet.addValue("factory_month", tblIndex, state.getFactoryMonth()); tablet.addValue("factory_week", tblIndex, state.getFactoryWeek()); tablet.addValue("factory_date", tblIndex, state.getFactoryDate()); tablet.addValue("shift_index", tblIndex, state.getShiftIndex()); tablet.addValue("shift_time_type", tblIndex, state.getShiftTimeType()); tablet.addValue("wcs", tblIndex, state.getWcs()); tablet.addValue("rps", tblIndex, state.getRps()); tablet.addValue("is_fix_point", tblIndex, state.getIsFixPoint()); tablet.addValue("is_sync", tblIndex, state.getIsSync()); tablet.addValue("is_plan", tblIndex, state.getIsPlan()); tablet.addValue("feedback_point_type", tblIndex, state.getFeedbackPointType()); tablet.addValue("feedback_id", tblIndex, state.getFeedbackId()); tablet.addValue("is_deleted", tblIndex, state.getIsDeleted()); tablet.addValue("employee_id", tblIndex, state.getEmployeeId()); tblIndex++; if(tblIndex >= MAX_COUNT) { try { //每个工位批量插入一次数据 this.iotdbConfig.getSessionPool().insertAlignedTablet(tablet); log.info("保存设备状态完成"); tablet.reset(); tblIndex = 0; } catch (Exception e) { log.error("保存固定点数据异常",e); } } } if(tblIndex > 0) { try { //每个工位批量插入一次数据 this.iotdbConfig.getSessionPool().insertAlignedTablet(tablet); log.info("保存设备状态完成2"); tablet.reset(); tblIndex = 0; } catch (Exception e) { log.error("保存固定点数据异常",e); } } /* for(int i=0;i