yangys
2024-09-05 312fd03ae1ee528892129a10630d44de92c73c37
增加告警信息入库
已修改7个文件
已添加2个文件
300 ■■■■■ 文件已修改
collect/src/main/java/com/qianwen/mdc/collect/constants/IOTDBConstant.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/dto/PackedTelemetryData.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/Alarm.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/enums/WorkstationParamTypeEnum.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/handler/AlarmDataHandler.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/handler/PackedTelemetryDataHandlerSelector.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/service/AlarmService.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
collect/src/main/java/com/qianwen/mdc/collect/constants/IOTDBConstant.java
@@ -26,4 +26,10 @@
     * çŠ¶æ€æ¨¡æ¿åç§° state
     */
    public static final String TEMPLATE_STATE = "state";
    /**
     * å‘Šè­¦æ¨¡æ¿åç§° alarm
     */
    public static final String TEMPLATE_ALARM = "alarm";
}
collect/src/main/java/com/qianwen/mdc/collect/controller/MqttController.java
@@ -36,19 +36,7 @@
        return "Message sent to topic " + topic;
    }
    
    @GetMapping("/create")
    public String create(@RequestParam String topic, @RequestParam String message) {
        try {
            iotdbCfg.getSessionPool().createTimeseries("root.f2.myt1", TSDataType.UNKNOWN, null, null);
        } catch (IoTDBConnectionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (StatementExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "Message sent to topic " + topic;
    }
    @GetMapping("/rec2")
    public void testRec2() {
        //数据格式:{"174":[{"values":{"d1":12},"ts":"1721978780449"}]} 174是应用id
@@ -59,6 +47,15 @@
    }
    
    
    @GetMapping("/recalarm")
    public void testAlarm() {
        //数据格式:{"174":[{"values":{"d1":12},"ts":"1721978780449"}]} 174是应用id
        //多条格式:{"174":[{"values":{"DeviceStatus":2},"ts":"1722478128278"},{"values":{"spindleSpeed":22},"ts":"1722478128281"}]}
        String payload = "{\"174\":[{\"values\":{\"Alarm\":\"告警信息1\"},\"ts\":\"1725504995056\"}]}";
        //payload = "{\"174\":[{\"values\":{\"Output\":11},\"ts\":\"1722478128278\"},{\"values\":{\"SpindleSpeed\":22},\"ts\":\"1722478128281\"}]}";
        recService.handle(payload);
    }
    @GetMapping("/tpl")
    public Object tpl(String tplname) throws StatementExecutionException, IoTDBConnectionException {
        boolean b = iotdbCfg.getSessionPool().checkTimeseriesExists("root.f2.output_22005.*");
collect/src/main/java/com/qianwen/mdc/collect/dto/PackedTelemetryData.java
@@ -100,6 +100,8 @@
    public Integer getParamType() {
        int result = WorkstationParamTypeEnum.OTHER.getType();
        switch(this.name) {
        case "Output":
            result = WorkstationParamTypeEnum.OUTPUT.getType();
collect/src/main/java/com/qianwen/mdc/collect/entity/iotdb/Alarm.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package com.qianwen.mdc.collect.entity.iotdb;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
 * å‘Šè­¦ä¿¡æ¯
 */
public class Alarm {
    private Long time;
    private Long workstationId;
    private String calendarCode;
    private Integer factoryYear;
    private Integer factoryMonth;
    private Integer factoryWeek;
    private Integer factoryDate;
    private Integer shiftIndex;
    private Integer shiftTimeType;
    private String code;
    private String message;
    private String level;
    public void setWorkstationId(final Long workstationId) {
        this.workstationId = workstationId;
    }
    public void setCalendarCode(final String calendarCode) {
        this.calendarCode = calendarCode;
    }
    public void setFactoryYear(final Integer factoryYear) {
        this.factoryYear = factoryYear;
    }
    public void setFactoryMonth(final Integer factoryMonth) {
        this.factoryMonth = factoryMonth;
    }
    public void setFactoryWeek(final Integer factoryWeek) {
        this.factoryWeek = factoryWeek;
    }
    public void setFactoryDate(final Integer factoryDate) {
        this.factoryDate = factoryDate;
    }
    public void setShiftIndex(final Integer shiftIndex) {
        this.shiftIndex = shiftIndex;
    }
    public void setShiftTimeType(final Integer shiftTimeType) {
        this.shiftTimeType = shiftTimeType;
    }
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
    public Alarm() {
    }
    public Long getTime() {
        return time;
    }
    public void setTime(Long time) {
        this.time = time;
    }
    public Long getWorkstationId() {
        return this.workstationId;
    }
    public String getCalendarCode() {
        return this.calendarCode;
    }
    public Integer getFactoryYear() {
        return this.factoryYear;
    }
    public Integer getFactoryMonth() {
        return this.factoryMonth;
    }
    public Integer getFactoryWeek() {
        return this.factoryWeek;
    }
    public Integer getFactoryDate() {
        return this.factoryDate;
    }
    public Integer getShiftIndex() {
        return this.shiftIndex;
    }
    public Integer getShiftTimeType() {
        return this.shiftTimeType;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level;
    }
}
collect/src/main/java/com/qianwen/mdc/collect/enums/WorkstationParamTypeEnum.java
@@ -4,6 +4,9 @@
    OTHER(0, "其他"),
    STATE(1, "状态"),
    OUTPUT(2, "产量"),
    /**
     * 3-ALARM
     */
    ALARM(3, "报警"),
    PROGRAMNUM(4, "程序号"),
    PULSE_OUTPUT(5, "脉冲产量"),
collect/src/main/java/com/qianwen/mdc/collect/handler/AlarmDataHandler.java
@@ -1,23 +1,47 @@
package com.qianwen.mdc.collect.handler;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.qianwen.mdc.collect.dto.PackedTelemetryData;
import com.qianwen.mdc.collect.entity.iotdb.Alarm;
import com.qianwen.mdc.collect.service.AlarmService;
@Component
public class AlarmDataHandler implements TelemetryDataHandler {
    private static final Logger log = LoggerFactory.getLogger(AlarmDataHandler.class);
    @Autowired
    private AlarmService alarmService;
    @Override
    public void handleData(PackedTelemetryData data) {
        
        /*
        WorkstationOutput workstationOutput = TelemetryOutputWrapper.build().entityVO(data);
        IOutputAggregateService outputAggregateService = (IOutputAggregateService) SpringUtil.getBean(IOutputAggregateService.class);
        outputAggregateService.outputRealTimeAggregate(workstationOutput);
        Alarm alarm =  new Alarm();//Objects.requireNonNull(BeanUtil.copy(data, Alarm.class));
        alarm.setTime(data.getTime());
        alarm.setWorkstationId(data.getWorkstationId());
        alarm.setCalendarCode(data.getCalendarCode());
        alarm.setFactoryDate(data.getFactoryDate());
        alarm.setFactoryMonth(data.getFactoryMonth());
        alarm.setFactoryWeek(data.getFactoryWeek());
        alarm.setFactoryYear(data.getFactoryYear());
        alarm.setShiftIndex(data.getShiftIndex());
        alarm.setShiftTimeType(data.getShiftTimeType());
        alarmService.saveAlarms(Arrays.asList(alarm));
        log.info("报警数据处理完成:告警数据{} ",alarm);
    }
    /**
     * å¡«å……告警的详细信息,级别,信息,代码
     * @param alarm
        */
        log.info("报警tdengine å®žæ—¶èšåˆå®Œæˆ:数据{} ");
    void fileAlarmDetail(Alarm alarm,PackedTelemetryData data){
        alarm.setMessage(data.getValue());
    }
}
collect/src/main/java/com/qianwen/mdc/collect/handler/PackedTelemetryDataHandlerSelector.java
@@ -16,6 +16,8 @@
    private OutputDataHandler outputHandler;
    @Autowired
    private DeviceStatusDataHandler statusDataHandler;
    @Autowired
    private AlarmDataHandler alarmDataHandler;
    /**
     * ç›®å‰çœ‹åº”该只有state,output和alarm有数据
     */
@@ -35,6 +37,8 @@
            return statusDataHandler;
        }else if(WorkstationParamTypeEnum.OUTPUT.getType().equals(paramType)){
            return outputHandler;
        }else if(WorkstationParamTypeEnum.ALARM.getType().equals(paramType) || WorkstationParamTypeEnum.ALARM_MSG.getType().equals(paramType) || WorkstationParamTypeEnum.ALARM_NO.getType().equals(paramType)){
            return alarmDataHandler;
        }else{
            return null;
        }
collect/src/main/java/com/qianwen/mdc/collect/service/AlarmService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.qianwen.mdc.collect.service;
import java.util.ArrayList;
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.qianwen.mdc.collect.config.IotDBSessionConfig;
import com.qianwen.mdc.collect.constants.IOTDBConstant;
import com.qianwen.mdc.collect.entity.iotdb.Alarm;
/**
 * è®¾å¤‡çŠ¶æ€æ™®é€šæœåŠ¡
 */
@Service
public class AlarmService{
    private static final Logger log = LoggerFactory.getLogger(AlarmService.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("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("code", TSDataType.TEXT));
        schemas.add(new MeasurementSchema("message", TSDataType.TEXT));
        schemas.add(new MeasurementSchema("level", TSDataType.TEXT));
    }
    /**
     * ä¿å­˜å‘Šè­¦æ•°æ®(state_{workstationId})
     * @param stateList
     */
    public void saveAlarms(List<Alarm> alarmList) {
        //将数据按照工位id分组
        Map<Long,List<Alarm>> maps = alarmList.stream().collect(Collectors.groupingBy(Alarm::getWorkstationId));
        String deviceId;
        Long wid;
        List<Alarm> alarms;
        for(Entry<Long, List<Alarm>>  entry: maps.entrySet()) {
            wid = entry.getKey();
            deviceId = IOTDBConstant.DB_PREFIX+"alarm_"+wid;
            iotDBCommonService.setTemmplateIfNotSet(IOTDBConstant.TEMPLATE_ALARM, deviceId);//挂载模板
            Tablet tablet = new Tablet(deviceId, schemas);
            alarms = entry.getValue();
            tablet.rowSize = alarms.size();
            Alarm alarm;
            for(int i=0;i<alarms.size();i++) {
                alarm = alarms.get(i);
                tablet.addTimestamp(i, alarm.getTime());
                tablet.addValue("workstation_id", i, alarm.getWorkstationId());
                tablet.addValue("calendar_code", i, alarm.getCalendarCode());
                tablet.addValue("factory_year", i, alarm.getFactoryYear());
                tablet.addValue("factory_month", i, alarm.getFactoryMonth());
                tablet.addValue("factory_week", i, alarm.getFactoryWeek());
                tablet.addValue("factory_date", i, alarm.getFactoryDate());
                tablet.addValue("shift_index", i, alarm.getShiftIndex());
                tablet.addValue("shift_time_type", i, alarm.getShiftTimeType());
                tablet.addValue("code", i, alarm.getCode());
                tablet.addValue("message", i, alarm.getMessage());
                tablet.addValue("level", i, alarm.getLevel());
            }
            try {
                //每个工位批量插入一次数据
                this.iotdbConfig.getSessionPool().insertAlignedTablet(tablet);
            } catch (Exception e) {
                log.error("保存固定点数据异常",e);
            }
        }
    }
}
collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java
@@ -47,7 +47,6 @@
    private WorkstationCache workstationCache;
    @Autowired
    private TimeSliceCache timeSliceCache;
    //private static String TEMPLATE_NAME = "process_param";
    static {
        PROCESS_PARAM_MAP.put(1, "STATE");
@@ -101,6 +100,7 @@
                                
                        fillByCalendar(pkData);
                        result.add(pkData);
                    }