wenhongquan 2 лет назад
Родитель
Сommit
b3a6484d34

+ 4 - 1
ruoyi-admin/src/main/java/com/ruoyi/ServerInitCommandLineRunner.java

@@ -17,6 +17,9 @@ public class ServerInitCommandLineRunner implements CommandLineRunner {
     public void run(String... args) throws Exception {
     public void run(String... args) throws Exception {
         mqttService.createMqttMain(new TblMqttBo());
         mqttService.createMqttMain(new TblMqttBo());
         tblSensorService.setCache();
         tblSensorService.setCache();
-        mqttService.setMqttCache();
+
+
+        //TODO 缓存需考虑跟新的问题  参照 @CachePut 用于跟新  @Cacheable 用户获取
+//        mqttService.setMqttCache();
     }
     }
 }
 }

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/data/controller/TblSensorController.java

@@ -7,6 +7,7 @@ import java.util.concurrent.TimeUnit;
 
 
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.data.domain.PointData;
 import com.ruoyi.data.domain.PointData;
 import com.ruoyi.data.domain.SensorPoint;
 import com.ruoyi.data.domain.SensorPoint;
@@ -195,7 +196,7 @@ public class TblSensorController extends BaseController {
         for(TblSensorVo tblSensorVo:tblSensorVoList){
         for(TblSensorVo tblSensorVo:tblSensorVoList){
             SensorRecord sensorRecord = new SensorRecord();
             SensorRecord sensorRecord = new SensorRecord();
             sensorRecord.setTblSensor(tblSensorVo);
             sensorRecord.setTblSensor(tblSensorVo);
-            String jsonData = CacheUtils.get("sensorData",tblSensorVo.getId());
+            String jsonData = JSONUtil.parseObj(CacheUtils.get("sensorData",tblSensorVo.getId().toString()),true).toStringPretty() ;
             sensorRecord.setRecordData(jsonData);
             sensorRecord.setRecordData(jsonData);
             SensorRecordList.add(sensorRecord);
             SensorRecordList.add(sensorRecord);
         }
         }

+ 5 - 2
ruoyi-system/src/main/java/com/ruoyi/data/domain/TblSensorRecord.java

@@ -23,7 +23,7 @@ public class TblSensorRecord extends BaseEntity {
     private static final long serialVersionUID=1L;
     private static final long serialVersionUID=1L;
 
 
     /**
     /**
-     * 
+     *
      */
      */
     @TableId(value = "id")
     @TableId(value = "id")
     private Long id;
     private Long id;
@@ -34,10 +34,13 @@ public class TblSensorRecord extends BaseEntity {
     /**
     /**
      * Json数据
      * Json数据
      */
      */
-    private String json;
     /**
     /**
      * 设备id
      * 设备id
      */
      */
     private Long equipmentId;
     private Long equipmentId;
 
 
+    private String pointName;
+
+    private String pointValue;
+
 }
 }

+ 17 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/MqttSensorDataBo.java

@@ -0,0 +1,17 @@
+package com.ruoyi.data.domain.bo;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class MqttSensorDataBo extends BaseEntity {
+    private String sensorId;
+    private List<SensorDataBo> data;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date time;
+    private String sensorSn;
+}

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/SensorDataBo.java

@@ -0,0 +1,14 @@
+package com.ruoyi.data.domain.bo;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SensorDataBo extends BaseEntity {
+    private String unitType;
+    private String unit;
+    private String value;
+    private String name;
+    private String label;
+    private String unitSymbol;
+}

+ 17 - 0
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/SensorDataToOtherMqttBo.java

@@ -0,0 +1,17 @@
+package com.ruoyi.data.domain.bo;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class SensorDataToOtherMqttBo extends BaseEntity {
+
+    private String deviceId;
+
+    private String sensorId;
+
+    private List<SensorDataBo> data;
+}

+ 4 - 6
ruoyi-system/src/main/java/com/ruoyi/data/domain/bo/TblSensorRecordBo.java

@@ -22,27 +22,25 @@ import com.ruoyi.common.core.domain.BaseEntity;
 public class TblSensorRecordBo extends BaseEntity {
 public class TblSensorRecordBo extends BaseEntity {
 
 
     /**
     /**
-     * 
+     *
      */
      */
-    @NotNull(message = "不能为空", groups = { EditGroup.class })
     private Long id;
     private Long id;
 
 
     /**
     /**
      * 传感器id
      * 传感器id
      */
      */
-    @NotNull(message = "传感器id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long sensorId;
     private Long sensorId;
 
 
     /**
     /**
      * Json数据
      * Json数据
      */
      */
-    @NotBlank(message = "Json数据不能为空", groups = { AddGroup.class, EditGroup.class })
-    private String json;
+    private String pointName;
+
+    private String pointValue;
 
 
     /**
     /**
      * 设备id
      * 设备id
      */
      */
-    @NotNull(message = "设备id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long equipmentId;
     private Long equipmentId;
 
 
 
 

+ 6 - 5
ruoyi-system/src/main/java/com/ruoyi/data/domain/vo/TblSensorRecordVo.java

@@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.ruoyi.common.annotation.ExcelDictFormat;
 import com.ruoyi.common.annotation.ExcelDictFormat;
 import com.ruoyi.common.convert.ExcelDictConvert;
 import com.ruoyi.common.convert.ExcelDictConvert;
+import com.ruoyi.common.core.domain.BaseEntity;
 import lombok.Data;
 import lombok.Data;
 import java.util.Date;
 import java.util.Date;
 
 
@@ -17,12 +18,11 @@ import java.io.Serializable;
  */
  */
 @Data
 @Data
 @ExcelIgnoreUnannotated
 @ExcelIgnoreUnannotated
-public class TblSensorRecordVo implements Serializable {
+public class TblSensorRecordVo extends BaseEntity  {
 
 
-    private static final long serialVersionUID = 1L;
 
 
     /**
     /**
-     * 
+     *
      */
      */
     @ExcelProperty(value = "")
     @ExcelProperty(value = "")
     private Long id;
     private Long id;
@@ -36,8 +36,9 @@ public class TblSensorRecordVo implements Serializable {
     /**
     /**
      * Json数据
      * Json数据
      */
      */
-    @ExcelProperty(value = "Json数据")
-    private String json;
+    private String pointName;
+
+    private String pointValue;
 
 
     /**
     /**
      * 设备id
      * 设备id

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/data/mapper/TblSensorRecordMapper.java

@@ -4,6 +4,8 @@ import com.ruoyi.data.domain.TblSensorRecord;
 import com.ruoyi.data.domain.vo.TblSensorRecordVo;
 import com.ruoyi.data.domain.vo.TblSensorRecordVo;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
 
 
+import java.util.List;
+
 /**
 /**
  * 传感器实时数据Mapper接口
  * 传感器实时数据Mapper接口
  *
  *
@@ -11,5 +13,6 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
  * @date 2023-12-18
  * @date 2023-12-18
  */
  */
 public interface TblSensorRecordMapper extends BaseMapperPlus<TblSensorRecordMapper, TblSensorRecord, TblSensorRecordVo> {
 public interface TblSensorRecordMapper extends BaseMapperPlus<TblSensorRecordMapper, TblSensorRecord, TblSensorRecordVo> {
+    public List<TblSensorRecord> selectNewRecords();
 
 
 }
 }

+ 131 - 73
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/MqttServiceImpl.java

@@ -9,19 +9,19 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.PoolUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.mqtt.MQTTConnect;
 import com.ruoyi.common.utils.mqtt.MQTTConnect;
 import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.data.domain.*;
 import com.ruoyi.data.domain.*;
-import com.ruoyi.data.domain.bo.TblEquipmentSbookBo;
-import com.ruoyi.data.domain.bo.TblMqttBo;
-import com.ruoyi.data.domain.bo.TblSensorRecordBo;
+import com.ruoyi.data.domain.bo.*;
 import com.ruoyi.data.domain.vo.*;
 import com.ruoyi.data.domain.vo.*;
 import com.ruoyi.data.mapper.*;
 import com.ruoyi.data.mapper.*;
 import com.ruoyi.data.service.ITblEquipmentSbookService;
 import com.ruoyi.data.service.ITblEquipmentSbookService;
 import com.ruoyi.data.service.MqttService;
 import com.ruoyi.data.service.MqttService;
 import com.ruoyi.data.service.WebsocketService;
 import com.ruoyi.data.service.WebsocketService;
 import com.ruoyi.system.service.ISysDictTypeService;
 import com.ruoyi.system.service.ISysDictTypeService;
+import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
@@ -32,10 +32,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Base64;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 @RequiredArgsConstructor
 @RequiredArgsConstructor
 @Service
 @Service
@@ -78,76 +76,135 @@ public class MqttServiceImpl implements MqttService {
 
 
     @Override
     @Override
     public void pubMqttData(String mqttStr) {
     public void pubMqttData(String mqttStr) {
+
+        //数据分发到websocket 前端调用
         websocketService.sendMessageAll(mqttStr);
         websocketService.sendMessageAll(mqttStr);
+        //数据保存到数据库
         if(saveAndForward) {
         if(saveAndForward) {
-            JSONObject jsonObject = new JSONObject(mqttStr);
-            Long sensorId = jsonObject.getLong("sensorId");
-            TblSensor tblSensor = tblSensorMapper.selectById(sensorId);
-            Long deviceId = tblSensor.getDeviceId();
-            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            Date date = new Date(System.currentTimeMillis());
-            JSONObject mqttMsg = new JSONObject();
-            mqttMsg.put("deviceSn", deviceId);
-            mqttMsg.put("sensorSn", sensorId);
-            mqttMsg.put("sensorType", tblSensor.getSensorType());
-            mqttMsg.put("created_time", formatter.format(date));
-            JSONArray sensorData = new JSONArray();
-            JSONArray dataArry = new JSONArray(jsonObject.get("data"));
-            for (Object obj : dataArry) {
-                JSONObject dataObj = new JSONObject(obj);
-                dataObj.remove("gcdinfo");
-                sensorData.add(dataObj);
-            }
-            mqttMsg.put("sensorData", sensorData);
-            MqttObj mqttObj = new MqttObj();
-            mqttObj.setEquipmentId(deviceId);
-            List<MqttObj> mqttObjList = CacheUtils.get("DeviceMqtt",deviceId);
-            TblRecord tblRecord = new TblRecord();
-            tblRecord.setEquipmentId(deviceId);
-            tblRecord.setJson(mqttMsg.toString());
-            tblRecord.setCreateBy("admin");
-            tblRecord.setUpdateBy("admin");
-            tblRecord.setSensorId(sensorId);
-            tblRecordMapper.insert(tblRecord);
-        CacheUtils.put("sensorData",sensorId,mqttMsg.toString());
-        String protocolType = "";
-        List<SysDictData> sysDictTypeList = sysDictTypeService.selectDictDataByType("protocal_type");
-        for(SysDictData sysDictData:sysDictTypeList){
-                 if(Long.valueOf(sysDictData.getDictValue()).longValue() == tblSensor.getProtocalType().longValue()){
-                     protocolType = sysDictData.getDictLabel();
-                 }
-        }
-        for(MqttObj obj:mqttObjList){
-               if(obj.getStatus() == 1) {
-                   JSONArray topicObj1 = JSONUtil.parseArray(obj.getServerTopic());
-                   MQTTConnect mqttConnect = new MQTTConnect();
-                   try {
-                       mqttConnect.createMqttClient(obj.getServerAddress(), obj.getUuid(), obj.getAccount(), obj.getPassword(), new Callback());
-                       if (topicObj1.size() >0) {
-                           String finalProtocolType = protocolType;
-                           topicObj1.forEach(i->{
-                               JSONObject p = (JSONObject)i;
-                               String topic = p.getStr("name");
-                               topic = StrUtil.replace(topic,"$protocolType$", finalProtocolType);
-                               topic = StrUtil.replace(topic,"$sensorId$", sensorId.toString());
-                               try {
-                                   mqttConnect.pub(topic, mqttMsg.toString(), (Integer) p.get("qos"));
-                               } catch (MqttException e) {
-                                   throw new RuntimeException(e);
-                               }
-                           });
-                       } else {
-                           String topic = "sensor/"+protocolType+"/" + sensorId;
-                           mqttConnect.pub(topic, mqttMsg.toString(), 0);
-                       }
-                   } catch (Exception e) {
-                       e.printStackTrace();
-                   }
-               }
-            }
+            // 解析数据 异步线程执行
+            PoolUtils.getPool().execute(new Runnable() {
+                @Override
+                public void run() {
+
+                    MqttSensorDataBo dataBo = JSONUtil.toBean(mqttStr, MqttSensorDataBo.class);
+                    Date timedata = new Date();
+                    if (dataBo.getTime() != null) {
+                        timedata=(dataBo.getTime());
+                    }
+                    Date finalTimedata = timedata;
+
+                    //放缓存内  sensorId 缓存数据
+                    MqttSensorDataBo dataBo1 = CacheUtils.get("sensorData", dataBo.getSensorId());
+                    if (dataBo1 == null) {
+                        dataBo.getData().forEach(i -> {
+                            i.setCreateTime(finalTimedata);
+                        });
+                        CacheUtils.put("sensorData", dataBo.getSensorId(), dataBo);
+                    } else {
+                        dataBo1.getData().addAll(dataBo.getData());
+                        dataBo.getData().forEach(i -> {
+                            List<SensorDataBo> dataBoList = dataBo1.getData().stream().filter(j -> j.getName().equals(i.getName())).collect(Collectors.toList());
+                            if (dataBoList.size() > 0) {
+                                dataBo1.getData().removeAll(dataBoList);
+                            }
+                            i.setCreateTime(finalTimedata);
+                            dataBo1.getData().add(i);
+                        });
+                        CacheUtils.put("sensorData", dataBo.getSensorId(), dataBo1);
+                    }
+                    //TODO 缓存获取对应设备的缓存数据
+                    TblSensor tblSensor = tblSensorMapper.selectById(dataBo.getSensorId());
+                    if (tblSensor != null) {
+                        //保存到数据库
+
+
+                        List<TblSensorRecord> tblSensorRecords = new ArrayList<>();
+
+                        dataBo.getData().forEach(i->{
+                            TblSensorRecord tblSensorRecord = new TblSensorRecord();
+                            tblSensorRecord.setEquipmentId(tblSensor.getDeviceId());
+                            tblSensorRecord.setCreateBy("admin");
+                            tblSensorRecord.setUpdateBy("admin");
+                            tblSensorRecord.setCreateTime(finalTimedata);
+                            tblSensorRecord.setSensorId(tblSensor.getId());
+                            tblSensorRecord.setPointName(i.getName());
+                            tblSensorRecord.setPointValue(i.getValue());
+                            tblSensorRecords.add(tblSensorRecord);
+                        });
+                        if(tblSensorRecords.size()>0){
+                            tblSensorRecordMapper.insertBatch(tblSensorRecords);
+                        }
+
+
+                        String protocolType = "";
+                        List<SysDictData> sysDictTypeList = sysDictTypeService.selectDictDataByType("protocal_type");
+                        for (SysDictData sysDictData : sysDictTypeList) {
+                            if (Long.valueOf(sysDictData.getDictValue()).longValue() == tblSensor.getProtocalType().longValue()) {
+                                protocolType = sysDictData.getDictLabel();
+                            }
+                        }
+
+                        //转换
+                        SensorDataToOtherMqttBo mqttdata = new SensorDataToOtherMqttBo();
+                        mqttdata.setDeviceId(tblSensor.getDeviceId().toString());
+                        List<SensorDataBo> dataBoList = JSONUtil.toList(tblSensor.getDatapoints(), SensorDataBo.class);
+                        dataBo.getData().forEach(i -> {
+                                dataBoList.stream().filter(j -> j.getName().equals(i.getName())).forEach(j -> {
+                                    i.setUnitSymbol(j.getUnitType());
+                                    i.setUnit(j.getUnit());
+                                    i.setUnitType(j.getUnit());
+                                });
+                                i.setParams(null);
+                            }
+                        );
+                        mqttdata.setData(dataBo.getData());
+                        mqttdata.setSensorId(tblSensor.getId().toString());
+                        mqttdata.setCreateTime(finalTimedata);
+                        String mqttstr = JSONUtil.parseObj(mqttdata, true).toStringPretty();
+                        //转发mqtt数据
+
+                        //TODO 缓存获取对应mqtt的缓存数据
+                        MqttObj searchdata = new MqttObj();
+                        searchdata.setEquipmentId(tblSensor.getDeviceId());
+                        List<MqttObj> mqttObjList = tblEquipmentMqttMapper.selectMqttListByDeviceId(searchdata);
+
+                        for (MqttObj obj : mqttObjList) {
+                            if (obj.getStatus() == 1) {
+                                JSONArray topicObj1 = JSONUtil.parseArray(obj.getServerTopic());
+                                MQTTConnect mqttConnect = new MQTTConnect();
+                                try {
+                                    mqttConnect.createMqttClient(obj.getServerAddress(), obj.getUuid(), obj.getAccount(), obj.getPassword(), new Callback());
+                                    if (topicObj1.size() > 0) {
+                                        String finalProtocolType = protocolType;
+                                        topicObj1.forEach(i -> {
+                                            JSONObject p = (JSONObject) i;
+                                            String topic = p.getStr("name");
+                                            topic = StrUtil.replace(topic, "$protocolType$", finalProtocolType);
+                                            topic = StrUtil.replace(topic, "$sensorId$", tblSensor.getId().toString());
+                                            try {
+                                                mqttConnect.pub(topic, mqttstr.toString(), (Integer) p.get("qos"));
+                                            } catch (MqttException e) {
+                                                throw new RuntimeException(e);
+                                            }
+                                        });
+                                    } else {
+                                        String topic = "sensor/" + protocolType + "/" + tblSensor.getId().toString();
+                                        mqttConnect.pub(topic, mqttstr.toString(), 0);
+                                    }
+                                } catch (Exception e) {
+                                    log.error("mqtt转发失败", e);
+                                }
+                            }
+                        }
+
+                    }
+
+                }
+            });
         }
         }
     }
     }
 
 
+
     @Override
     @Override
     public void createMqttMain(TblMqttBo bo){
     public void createMqttMain(TblMqttBo bo){
         MQTTConnect mqttConnect = new MQTTConnect();
         MQTTConnect mqttConnect = new MQTTConnect();
@@ -268,7 +325,8 @@ public class MqttServiceImpl implements MqttService {
         Map<String, Object> params = bo.getParams();
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<TblSensorRecord> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<TblSensorRecord> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getSensorId() != null, TblSensorRecord::getSensorId, bo.getSensorId());
         lqw.eq(bo.getSensorId() != null, TblSensorRecord::getSensorId, bo.getSensorId());
-        lqw.eq(StringUtils.isNotBlank(bo.getJson()), TblSensorRecord::getJson, bo.getJson());
+        lqw.eq(StringUtils.isNotBlank(bo.getPointName()), TblSensorRecord::getPointName, bo.getPointName());
+        lqw.eq(StringUtils.isNotBlank(bo.getPointValue()), TblSensorRecord::getPointValue, bo.getPointValue());
         lqw.eq(bo.getEquipmentId() != null, TblSensorRecord::getEquipmentId, bo.getEquipmentId());
         lqw.eq(bo.getEquipmentId() != null, TblSensorRecord::getEquipmentId, bo.getEquipmentId());
         return lqw;
         return lqw;
     }
     }

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblSensorRecordServiceImpl.java

@@ -66,7 +66,8 @@ public class TblSensorRecordServiceImpl implements ITblSensorRecordService {
         Map<String, Object> params = bo.getParams();
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<TblSensorRecord> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<TblSensorRecord> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getSensorId() != null, TblSensorRecord::getSensorId, bo.getSensorId());
         lqw.eq(bo.getSensorId() != null, TblSensorRecord::getSensorId, bo.getSensorId());
-        lqw.eq(StringUtils.isNotBlank(bo.getJson()), TblSensorRecord::getJson, bo.getJson());
+        lqw.eq(StringUtils.isNotBlank(bo.getPointName()), TblSensorRecord::getPointName, bo.getPointName());
+        lqw.eq(StringUtils.isNotBlank(bo.getPointValue()), TblSensorRecord::getPointValue, bo.getPointValue());
         lqw.eq(bo.getEquipmentId() != null, TblSensorRecord::getEquipmentId, bo.getEquipmentId());
         lqw.eq(bo.getEquipmentId() != null, TblSensorRecord::getEquipmentId, bo.getEquipmentId());
         return lqw;
         return lqw;
     }
     }

+ 28 - 9
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblSensorServiceImpl.java

@@ -9,7 +9,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.data.domain.TblRecord;
 import com.ruoyi.data.domain.TblRecord;
+import com.ruoyi.data.domain.TblSensorRecord;
+import com.ruoyi.data.domain.bo.MqttSensorDataBo;
+import com.ruoyi.data.domain.bo.SensorDataBo;
 import com.ruoyi.data.mapper.TblRecordMapper;
 import com.ruoyi.data.mapper.TblRecordMapper;
+import com.ruoyi.data.mapper.TblSensorRecordMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.ruoyi.data.domain.bo.TblSensorBo;
 import com.ruoyi.data.domain.bo.TblSensorBo;
@@ -18,10 +22,7 @@ import com.ruoyi.data.domain.TblSensor;
 import com.ruoyi.data.mapper.TblSensorMapper;
 import com.ruoyi.data.mapper.TblSensorMapper;
 import com.ruoyi.data.service.ITblSensorService;
 import com.ruoyi.data.service.ITblSensorService;
 
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -38,6 +39,8 @@ public class TblSensorServiceImpl implements ITblSensorService {
 
 
     private final TblRecordMapper tblRecordMapper;
     private final TblRecordMapper tblRecordMapper;
 
 
+    private final TblSensorRecordMapper tblSensorRecordMapper;
+
     /**
     /**
      * 查询传感器列
      * 查询传感器列
      */
      */
@@ -138,11 +141,27 @@ public class TblSensorServiceImpl implements ITblSensorService {
 
 
     @Override
     @Override
     public void setCache(){
     public void setCache(){
-        List<TblRecord> recordList = tblRecordMapper.getNewRecord();
-        for(TblRecord record:recordList){
-            if(record.getSensorId() != null){
-                CacheUtils.put("sensorData",record.getSensorId(),record.getJson());
+        List<TblSensorRecord> recordList = tblSensorRecordMapper.selectNewRecords();
+        Map<String,MqttSensorDataBo> sensorDataMap = new HashMap<>();
+        recordList.forEach(record->{
+            if(record.getSensorId()!= null){
+                if(sensorDataMap.get(record.getSensorId().toString()) == null){
+                    MqttSensorDataBo bo = new MqttSensorDataBo();
+                    bo.setSensorId(record.getSensorId().toString());
+                    bo.setData(new ArrayList<SensorDataBo>());
+                    sensorDataMap.put(record.getSensorId().toString(),bo);
+                }
+                SensorDataBo dataBo = new SensorDataBo();
+                dataBo.setName(record.getPointName());
+                dataBo.setValue(record.getPointValue());
+                dataBo.setCreateTime(record.getCreateTime());
+                sensorDataMap.get(record.getSensorId().toString()).getData().add(dataBo);
             }
             }
-        }
+        });
+        CacheUtils.clear("sensorData");
+        sensorDataMap.values().forEach(bo->{
+            CacheUtils.put("sensorData",bo.getSensorId(),bo);
+        });
+
     }
     }
 }
 }

+ 1 - 1
ruoyi-system/src/main/resources/mapper/data/TblEquipmentMqttMapper.xml

@@ -30,7 +30,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="status" column="status"/>
         <result property="status" column="status"/>
     </resultMap>
     </resultMap>
 
 
-    <select id="selectMqttListByDeviceId" parameterType="MqttObj" resultMap="MqttObjResult">
+    <select id="selectMqttListByDeviceId" parameterType="com.ruoyi.data.domain.MqttObj" resultMap="MqttObjResult">
           select a.equipment_id as equipmentId,b.* from tbl_equipment_mqtt a left join tbl_mqtt b on a.mqtt_id = b.id
           select a.equipment_id as equipmentId,b.* from tbl_equipment_mqtt a left join tbl_mqtt b on a.mqtt_id = b.id
         <where>
         <where>
             <if test="equipmentId != null "> and a.equipment_id = #{equipmentId}</if>
             <if test="equipmentId != null "> and a.equipment_id = #{equipmentId}</if>

+ 6 - 1
ruoyi-system/src/main/resources/mapper/data/TblSensorRecordMapper.xml

@@ -7,9 +7,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="com.ruoyi.data.domain.TblSensorRecord" id="TblSensorRecordResult">
     <resultMap type="com.ruoyi.data.domain.TblSensorRecord" id="TblSensorRecordResult">
         <result property="id" column="id"/>
         <result property="id" column="id"/>
         <result property="sensorId" column="sensor_id"/>
         <result property="sensorId" column="sensor_id"/>
-        <result property="json" column="json"/>
+        <result property="pointName" column="point_name"/>
+        <result property="pointValue" column="point_value"/>
         <result property="equipmentId" column="equipment_id"/>
         <result property="equipmentId" column="equipment_id"/>
     </resultMap>
     </resultMap>
 
 
+    <select id="selectNewRecords" resultMap="TblSensorRecordResult">
+        select * from (  select DISTINCT * from tbl_sensor_record  order by create_time desc) as t1 group by point_name,sensor_id
+    </select>
+
 
 
 </mapper>
 </mapper>

+ 9 - 0
ruoyi-ui-vue3/src/api/data/sensor.js

@@ -18,6 +18,15 @@ export function listSensorData(query) {
 }
 }
 
 
 
 
+export function listSensorRecordData(query) {
+  return request({
+    url: '/data/sensorRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
 // 查询传感器台账详细
 // 查询传感器台账详细
 export function getSensor(id) {
 export function getSensor(id) {
   return request({
   return request({

+ 5 - 5
ruoyi-ui-vue3/src/store/modules/websocket.js

@@ -17,13 +17,13 @@ const useWSStore = defineStore(
           this.message[`${data.sensorId}`][i.name] = { value:i.value,unit:i.unitType,time:moment().format('YYYY-MM-DD HH:mm:ss') }
           this.message[`${data.sensorId}`][i.name] = { value:i.value,unit:i.unitType,time:moment().format('YYYY-MM-DD HH:mm:ss') }
         })
         })
       },
       },
-      setMessagetype1(message) {
+      setMessagetype1(sn,message) {
         let data = message;
         let data = message;
-        data.sensorData.forEach(i=>{
-          if(!this.message[`${data.sensorSn}`]){
-            this.message[`${data.sensorSn}`] = {};
+        data.data.forEach(i=>{
+          if(!this.message[`${sn}`]){
+            this.message[`${sn}`] = {};
           }
           }
-          this.message[`${data.sensorSn}`][i.name] = { value:i.value,unit:i.unitType,time:data.created_time }
+          this.message[`${sn}`][i.name] = { value:i.value,unit:i.unitType,time:moment(i.createdTime).format('YYYY-MM-DD HH:mm:ss') }
         })
         })
       },
       },
       getMessage() {
       getMessage() {

+ 6 - 9
ruoyi-ui-vue3/src/views/device/sensordash/index.vue

@@ -250,7 +250,7 @@
     >
     >
       <div>
       <div>
 <!--        显示测点实时数据-->
 <!--        显示测点实时数据-->
-        <el-table @cellClick="doshowhistory" :data="JSON.parse(currentsensor.datapoints)" style="margin-top: 15px" height="150px">
+        <el-table @cellClick="doshowhistory" :data="JSON.parse(currentsensor.datapoints)" style="margin-top: 15px" height="250px">
           <el-table-column label="变量名" prop="name">
           <el-table-column label="变量名" prop="name">
             <template #default="scope">
             <template #default="scope">
               <span>{{scope.row.name}}</span>
               <span>{{scope.row.name}}</span>
@@ -282,7 +282,7 @@
       <div>
       <div>
         <div style="margin-top: 10px" v-if="currentname!=''">变量 {{currentname}} 数值曲线</div>
         <div style="margin-top: 10px" v-if="currentname!=''">变量 {{currentname}} 数值曲线</div>
 <!--        显示历史数据 折线图-->
 <!--        显示历史数据 折线图-->
-        <div ref="chartlinediv" style="height: 400px" v-loading="isloading" ></div>
+        <div ref="chartlinediv" style="height: 250px" v-loading="isloading" ></div>
 
 
 
 
       </div>
       </div>
@@ -297,11 +297,10 @@ import "@layui/layui-vue/lib/index.css";
 import {useRoute, useRouter} from "vue-router";
 import {useRoute, useRouter} from "vue-router";
 import {listEquipmentOrganizational} from "@/api/data/equipmentOrganizational"
 import {listEquipmentOrganizational} from "@/api/data/equipmentOrganizational"
 import {listEquipmentSbook} from "@/api/data/equipmentSbook"
 import {listEquipmentSbook} from "@/api/data/equipmentSbook"
-import {listSensor,delSensor,addSensor,updateSensor,listSensorData} from "@/api/data/sensor"
+import {listSensor,delSensor,addSensor,updateSensor,listSensorData,listSensorRecordData} from "@/api/data/sensor"
 import {listDatapoint} from "@/api/data/datapoint";
 import {listDatapoint} from "@/api/data/datapoint";
 import {listUnit} from "@/api/data/unit";
 import {listUnit} from "@/api/data/unit";
 import useWSStore from "@/store/modules/websocket"
 import useWSStore from "@/store/modules/websocket"
-import {listRecord} from "@/api/data/record"
 import * as echarts from 'echarts';
 import * as echarts from 'echarts';
 
 
 
 
@@ -492,7 +491,7 @@ const lookdata = (item)=>{
     if(rows.length>0){
     if(rows.length>0){
       if(rows[0].recordData){
       if(rows[0].recordData){
         let data = JSON.parse(rows[0].recordData);
         let data = JSON.parse(rows[0].recordData);
-        useWSStore().setMessagetype1(data);
+        useWSStore().setMessagetype1(rows[0].tblSensor.id,data);
       }
       }
     }
     }
 
 
@@ -594,13 +593,11 @@ const doshowhistory = (row)=>{
   isloading.value = true;
   isloading.value = true;
   currentname.value = row.name;
   currentname.value = row.name;
   //获取历史数据
   //获取历史数据
-  listRecord({sensorId:currentsensor.value.id,page:1,pageSize:100,orderByColumn:"create_time",isAsc:"desc",params:{name:row.name}}).then(res=>{
+  listSensorRecordData({sensorId:currentsensor.value.id,pointName:row.name,page:1,pageSize:100,orderByColumn:"create_time",isAsc:"desc",params:{name:row.name}}).then(res=>{
     const {rows,total,page,size} = res;
     const {rows,total,page,size} = res;
     isloading.value = false;
     isloading.value = false;
     historytabledata.value = rows.map(i=>{
     historytabledata.value = rows.map(i=>{
-      var j = JSON.parse(i.json);
-      console.log(j.data[0].value)
-      return [moment(i.createTime).toDate(),j.data[0].value]
+      return [moment(i.createTime).toDate(),i.pointValue]
     });
     });
   })
   })
 }
 }