Bladeren bron

`fix 分表及分表查询`

wenhongquan 1 jaar geleden
bovenliggende
commit
29cb4acc69

+ 4 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -277,4 +277,7 @@ mqtt:
   user: ${MQTT_USER:iotc}
   password: ${MQTT_PWD:iotc}
   topic: ${MQTT_TOPIC:/sensor/#}
-  saveAndForward: ${DATASAVE:false}
+  saveAndForward: ${DATASAVE:true}
+
+record:
+  start: 2024_11

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

@@ -1,10 +1,14 @@
 package com.ruoyi.data.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.data.domain.TblSensorRecord;
 import com.ruoyi.data.domain.vo.TblSensorRecordVo;
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 传感器实时数据Mapper接口
@@ -15,4 +19,11 @@ import java.util.List;
 public interface TblSensorRecordMapper extends BaseMapperPlus<TblSensorRecordMapper, TblSensorRecord, TblSensorRecordVo> {
     public List<TblSensorRecord> selectNewRecords();
 
+    public void createTable(Map<String,Object> map);
+
+    public Integer insertData(TblSensorRecord record);
+
+    public IPage<TblSensorRecordVo> selectDataPage(Page<?> page, @Param("t") TblSensorRecord record);
+
+    public List<TblSensorRecordVo> selectData(TblSensorRecord record);
 }

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/data/service/ITblSensorRecordService.java

@@ -8,6 +8,7 @@ import com.ruoyi.common.core.domain.PageQuery;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 传感器实时数据Service接口
@@ -17,6 +18,8 @@ import java.util.List;
  */
 public interface ITblSensorRecordService {
 
+    void createTable(Map<String, Object> map);
+
     /**
      * 查询传感器实时数据
      */

+ 12 - 4
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/MqttServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.data.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSON;
@@ -51,7 +52,7 @@ public class MqttServiceImpl implements MqttService {
 
     private final TblSensorMapper tblSensorMapper;
 
-    private final TblSensorRecordMapper tblSensorRecordMapper;
+//    private final TblSensorRecordMapper tblSensorRecordMapper;
 
     private final ISysDictTypeService sysDictTypeService;
 
@@ -73,6 +74,9 @@ public class MqttServiceImpl implements MqttService {
 
     private final TblBreakdownMapper tblBreakdownMapper;
 
+
+    private final ITblSensorRecordService iTblSensorRecordService;
+
     @Value("${mqtt.url}")
     private String mqttUrl;
 
@@ -139,10 +143,11 @@ public class MqttServiceImpl implements MqttService {
                         //保存到数据库
 
 
-                        List<TblSensorRecord> tblSensorRecords = new ArrayList<>();
+                        List<TblSensorRecordBo> tblSensorRecords = new ArrayList<>();
 
                         dataBo.getData().forEach(i->{
-                            TblSensorRecord tblSensorRecord = new TblSensorRecord();
+
+                            TblSensorRecordBo tblSensorRecord = new TblSensorRecordBo();
                             tblSensorRecord.setEquipmentId(tblSensor.getDeviceId());
                             tblSensorRecord.setCreateBy("admin");
                             tblSensorRecord.setUpdateBy("admin");
@@ -150,10 +155,13 @@ public class MqttServiceImpl implements MqttService {
                             tblSensorRecord.setSensorId(tblSensor.getId());
                             tblSensorRecord.setPointName(i.getName());
                             tblSensorRecord.setPointValue(i.getValue());
+                            tblSensorRecord.setParams(new HashMap<String, Object>());
+                            tblSensorRecord.getParams().put("datetime", DateUtil.format(DateUtil.date(), "YYYY_MM"));
                             tblSensorRecords.add(tblSensorRecord);
+                            iTblSensorRecordService.insertByBo(tblSensorRecord);
                         });
                         if(tblSensorRecords.size()>0){
-                            tblSensorRecordMapper.insertBatch(tblSensorRecords);
+//                            tblSensorRecordMapper.insertBatch(tblSensorRecords);
                         }
 
 

+ 99 - 6
ruoyi-system/src/main/java/com/ruoyi/data/service/impl/TblSensorRecordServiceImpl.java

@@ -1,6 +1,10 @@
 package com.ruoyi.data.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.domain.PageQuery;
@@ -11,6 +15,8 @@ import com.ruoyi.common.utils.redis.CacheUtils;
 import com.ruoyi.data.domain.TblRecord;
 import com.ruoyi.data.mapper.TblRecordMapper;
 import lombok.RequiredArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import com.ruoyi.data.domain.bo.TblSensorRecordBo;
 import com.ruoyi.data.domain.vo.TblSensorRecordVo;
@@ -18,9 +24,11 @@ import com.ruoyi.data.domain.TblSensorRecord;
 import com.ruoyi.data.mapper.TblSensorRecordMapper;
 import com.ruoyi.data.service.ITblSensorRecordService;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
+import java.util.stream.Collectors;
 
 /**
  * 传感器实时数据Service业务层处理
@@ -32,9 +40,15 @@ import java.util.Collection;
 @Service
 public class TblSensorRecordServiceImpl implements ITblSensorRecordService {
 
+    private static final Logger log = LoggerFactory.getLogger(TblSensorRecordServiceImpl.class);
     private final TblSensorRecordMapper baseMapper;
 
 
+    @Override
+    public void createTable(Map<String, Object> map) {
+        baseMapper.createTable(map);
+    }
+
     /**
      * 查询传感器实时数据
      */
@@ -48,8 +62,41 @@ public class TblSensorRecordServiceImpl implements ITblSensorRecordService {
      */
     @Override
     public TableDataInfo<TblSensorRecordVo> queryPageList(TblSensorRecordBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<TblSensorRecord> lqw = buildQueryWrapper(bo);
-        Page<TblSensorRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        if(bo.getParams()!=null){
+            Date startTime1  = new Date();
+            Date endTime1  =new Date();
+            try{
+                String startTime =  bo.getParams().get("starttime").toString();
+                String endTime =  bo.getParams().get("endtime").toString();
+                startTime1  = DateUtil.date(Long.parseLong(startTime)*1000);
+                endTime1  = DateUtil.date(Long.parseLong(endTime)*1000);
+
+                bo.getParams().put("startTime",DateUtil.format(startTime1,"yyyy-MM-dd HH:mm:ss"));
+                bo.getParams().put("endTime",DateUtil.format(endTime1,"yyyy-MM-dd HH:mm:ss"));
+
+            }catch (Exception e){
+                String startTime =  bo.getParams().get("starttime").toString();
+                String endTime =  bo.getParams().get("endtime").toString();
+                startTime1 = DateUtil.parseTime(startTime);
+                endTime1 = DateUtil.parseTime(endTime);
+                bo.getParams().put("startTime",startTime);
+                bo.getParams().put("endTime",endTime);
+            }
+
+            //计算月
+            List<DateTime> dateList =DateUtil.rangeToList(startTime1,endTime1, DateField.MONTH);
+            bo.getParams().put("datetimes",dateList.stream().map(date -> DateUtil.format(date,"yyyy_MM")).collect(Collectors.toList()));
+
+        }
+
+        TblSensorRecord r = new TblSensorRecord();
+        r.setParams(bo.getParams());
+        r.setId(bo.getId());
+        r.setSensorId(bo.getSensorId());
+        r.setPointName(bo.getPointName());
+        r.setPointValue(bo.getPointValue());
+        r.setCreateBy(bo.getCreateBy());
+        Page<TblSensorRecordVo> result = (Page<TblSensorRecordVo>) baseMapper.selectDataPage(pageQuery.build(),r);
         return TableDataInfo.build(result);
     }
 
@@ -58,15 +105,50 @@ public class TblSensorRecordServiceImpl implements ITblSensorRecordService {
      */
     @Override
     public List<TblSensorRecordVo> queryList(TblSensorRecordBo bo) {
-        LambdaQueryWrapper<TblSensorRecord> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
+        if(bo.getParams()!=null){
+            Date startTime1  = new Date();
+            Date endTime1  =new Date();
+            try{
+                String startTime =  bo.getParams().get("starttime").toString();
+                String endTime =  bo.getParams().get("endtime").toString();
+                startTime1  = DateUtil.date(Long.parseLong(startTime)*1000);
+                endTime1  = DateUtil.date(Long.parseLong(endTime)*1000);
+
+                bo.getParams().put("startTime",DateUtil.format(startTime1,"yyyy-MM-dd HH:mm:ss"));
+                bo.getParams().put("endTime",DateUtil.format(endTime1,"yyyy-MM-dd HH:mm:ss"));
+
+            }catch (Exception e){
+                String startTime =  bo.getParams().get("starttime").toString();
+                String endTime =  bo.getParams().get("endtime").toString();
+                startTime1 = DateUtil.parse(startTime,"yyyy-MM-dd HH:mm:ss");
+                endTime1 = DateUtil.parse(endTime,  "yyyy-MM-dd HH:mm:ss");
+                bo.getParams().put("startTime",startTime);
+                bo.getParams().put("endTime",endTime);
+            }
+
+
+            //计算月
+            List<DateTime> dateList =DateUtil.rangeToList(startTime1,endTime1, DateField.MONTH);
+            bo.getParams().put("datetimes",dateList.stream().map(date -> DateUtil.format(date,"yyyy_MM")).collect(Collectors.toList()));
+
+        }
+        TblSensorRecord r = new TblSensorRecord();
+        r.setParams(bo.getParams());
+        r.setId(bo.getId());
+        r.setSensorId(bo.getSensorId());
+        r.setPointName(bo.getPointName());
+        r.setPointValue(bo.getPointValue());
+        r.setCreateBy(bo.getCreateBy());
+        List<TblSensorRecordVo> result = baseMapper.selectData(r);
+        return result;
     }
 
     private LambdaQueryWrapper<TblSensorRecord> buildQueryWrapper(TblSensorRecordBo bo) {
+
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<TblSensorRecord> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getSensorId() != null, TblSensorRecord::getSensorId, bo.getSensorId());
-        lqw.eq(StringUtils.isNotBlank(bo.getPointName()), TblSensorRecord::getPointName, bo.getPointName());
+        lqw.like(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.orderBy(true,false, TblSensorRecord::getCreateTime);
@@ -90,12 +172,23 @@ public class TblSensorRecordServiceImpl implements ITblSensorRecordService {
     @Override
     public Boolean insertByBo(TblSensorRecordBo bo) {
         TblSensorRecord add = BeanUtil.toBean(bo, TblSensorRecord.class);
+        if(bo.getParams()==null || bo.getParams().get("datetime")==null) return false;
+        try {
+            baseMapper.createTable(bo.getParams());
+
         validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
+        log.info(JSONUtil.toJsonStr(add));
+        boolean flag = baseMapper.insertData(add) > 0;
+
         if (flag) {
             bo.setId(add.getId());
         }
         return flag;
+        }catch (Exception e){
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+        return false;
     }
 
     /**

+ 102 - 0
ruoyi-system/src/main/resources/mapper/data/TblSensorRecordMapper.xml

@@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="com.ruoyi.data.domain.TblSensorRecord" id="TblSensorRecordResult">
         <result property="id" column="id"/>
         <result property="sensorId" column="sensor_id"/>
+        <result property="equipmentId" column="equipment_id"/>
         <result property="pointName" column="point_name"/>
         <result property="pointValue" column="point_value"/>
         <result property="equipmentId" column="equipment_id"/>
@@ -17,4 +18,105 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
 
+    <select id="createTable" parameterType="java.util.Map">
+        create table if not exists tbl_sensor_record_${datetime} (
+            id bigint not null auto_increment,
+            sensor_id bigint not null,
+            equipment_id  bigint default null,
+            point_name varchar(255) not null,
+            point_value varchar(255) not null,
+            create_by varchar(64) default null,
+            create_time datetime default null,
+            update_by varchar(64) default null,
+            update_time datetime default null,
+            PRIMARY KEY (id)
+            )
+    </select>
+
+    <insert id="insertData" parameterType="com.ruoyi.data.domain.TblSensorRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into tbl_sensor_record_${params.datetime} (id,sensor_id,equipment_id,
+                                                          point_name,
+                                                          point_value,create_time) values (#{id}, #{sensorId}, #{equipmentId},
+                                                                                           #{pointName},
+                                                                                           #{pointValue},
+                                                                                           #{createTime}
+
+                                                                                          )
+    </insert>
+
+    <select id="selectData" parameterType="com.ruoyi.data.domain.TblSensorRecord"
+            resultType="com.ruoyi.data.domain.vo.TblSensorRecordVo">
+        select * from (
+        <foreach collection="params.datetimes" item="datav" separator=" UNION ALL ">
+            select id,sensor_id,equipment_id,
+            point_name,
+            point_value,
+            create_by,
+            create_time,
+            update_by,
+            update_time from tbl_sensor_record_${datav} where 1=1
+            <if test="id!=null">
+                and id=#{id}
+            </if>
+            <if test="sensorId!=null">
+                and sensor_id=#{sensorId}
+            </if>
+            <if test="equipmentId!=null">
+                and equipment_id=#{equipmentId}
+            </if>
+            <if test="pointName!=null">
+                and point_name=#{pointName}
+            </if>
+            <if test="pointValue!=null">
+                and point_value=#{pointValue}
+            </if>
+            <if test="params!=null and params.startTime!=null and params.endTime!=null">
+                <![CDATA[
+               and create_time > #{params.startTime} and create_time < #{params.endTime}
+              ]]>
+            </if>
+
+        </foreach>
+        ) AS t ORDER BY
+        create_time DESC;
+    </select>
+
+    <select id="selectDataPage"
+            resultType="com.ruoyi.data.domain.vo.TblSensorRecordVo">
+        select * from (
+        <foreach collection="t.params.datetimes" item="datav" separator=" UNION ALL ">
+            select id,sensor_id,equipment_id,
+            point_name,
+            point_value,
+            create_by,
+            create_time,
+            update_by,
+            update_time from tbl_sensor_record_${datav} where 1=1
+            <if test="t.id!=null">
+                and id=#{t.id}
+            </if>
+            <if test="t.sensorId!=null">
+                and sensor_id=#{t.sensorId}
+            </if>
+            <if test="t.equipmentId!=null">
+                and equipment_id=#{t.equipmentId}
+            </if>
+            <if test="t.pointName!=null">
+                and point_name=#{t.pointName}
+            </if>
+            <if test="t.pointValue!=null">
+                and point_value=#{t.pointValue}
+            </if>
+            <if test="t.params!=null and t.params.startTime!=null and t.params.endTime!=null">
+                <![CDATA[
+               and create_time > #{t.params.startTime} and create_time < #{t.params.endTime}
+              ]]>
+            </if>
+
+        </foreach>
+        ) AS t ORDER BY
+        create_time DESC
+    </select>
+
+
 </mapper>