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<MeasurementSchema> 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<DeviceState> stateList) {
|
//将数据按照工位id分组
|
Map<Long,List<DeviceState>> maps = stateList.stream().collect(Collectors.groupingBy(DeviceState::getWorkstationId));
|
String deviceId;
|
Long wid;
|
|
List<DeviceState> states;
|
for(Entry<Long, List<DeviceState>> 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();
|
DeviceState state;
|
|
|
final int MAX_COUNT = 1000;
|
//int currentIdx = 0;
|
|
|
int tblIndex = -1;
|
for(int i=0; i < states.size(); i++) {
|
state = states.get(i);
|
tblIndex = tablet.rowSize++;
|
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 = -1;
|
} catch (Exception e) {
|
log.error("保存固定点数据异常",e);
|
}
|
}
|
}
|
|
if(tablet.rowSize > 0) {
|
try {
|
//每个工位批量插入一次数据
|
this.iotdbConfig.getSessionPool().insertAlignedTablet(tablet);
|
log.info("保存设备状态完成2");
|
tablet.reset();
|
//tblIndex = -1;
|
} catch (Exception e) {
|
log.error("保存固定点数据异常",e);
|
}
|
}
|
|
|
}
|
}
|
|
}
|