Browse Source

设备统计

459242451@qq.com 3 years ago
parent
commit
d3738637b7

+ 33 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/So2Controller.java

@@ -1,8 +1,10 @@
 package com.ruoyi.web.controller.gas;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.ElasticConstants;
 import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.core.controller.BaseController;
@@ -10,12 +12,15 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.PageDomain;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.page.TableSupport;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.framework.config.ElasticSearchClient;
 import com.ruoyi.system.domain.GuapAlert;
 import com.ruoyi.system.domain.GuapMonitorPoint;
 import com.ruoyi.system.domain.ShipRecognition;
 import com.ruoyi.system.domain.XiuTanIllegalShip;
 import com.ruoyi.system.domain.XiuTanSemInstrument;
+import com.ruoyi.system.service.IAisDatabase;
+import com.ruoyi.system.service.ISo2Service;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +46,12 @@ public class So2Controller extends BaseController {
 
     @Autowired
     private ElasticSearchClient client;
+    @Autowired
+    private IAisDatabase aisDatabase;
+    @Autowired
+    private ISo2Service so2Service;
+    @Autowired
+    private RedisCache redisCache;
 
     @GetMapping("/guangpu/list")
     @ApiOperation("光谱-硫嫌疑船舶列表数据")
@@ -118,7 +129,7 @@ public class So2Controller extends BaseController {
     }
 
     @GetMapping("/xiutan/semInstrument")
-    @ApiOperation("嗅探-站点数据")
+    @ApiOperation("嗅探-设备数据")
     public AjaxResult semInstrument(XiuTanSemInstrument semInstrument) {
         // 传来的参数
         Map<String, Object> equalsCondition = new HashMap<>();
@@ -127,4 +138,25 @@ public class So2Controller extends BaseController {
         Map<String, Object> maps = client.searchDocument(ElasticConstants.AIS_SEM_INSTRUMENT, equalsCondition, null, null, 1, 10000);
         return AjaxResult.success(Convert.toList(XiuTanSemInstrument.class, maps.get("pageList")));
     }
+
+    @GetMapping("/static/device")
+    @ApiOperation("嗅探-设备数据")
+    public AjaxResult deviceStatic() {
+        if (redisCache.hasKey(CacheConstants.SO2_DEVICE_STATIC)) {
+            return AjaxResult.success(redisCache.getCacheMap(CacheConstants.SO2_DEVICE_STATIC));
+        }
+        List<Map<String, Object>> aisDevice = aisDatabase.queryDeviceStatic();
+        List<Map<String, Object>> so2Device = so2Service.queryDeviceStatic();
+        // 两个结果合并
+        Map<String, Integer> result = new HashMap<>(8);
+        for (Map<String, Object> stringIntegerMap : aisDevice) {
+            result.put(Convert.toStr(stringIntegerMap.get("point")), Convert.toInt(stringIntegerMap.get("count")));
+        }
+        for (Map<String, Object> stringIntegerMap : so2Device) {
+            result.put(Convert.toStr(stringIntegerMap.get("point")), Convert.toInt(NumberUtil.add(result.get(Convert.toStr(stringIntegerMap.get("point"))), Convert.toInt(stringIntegerMap.get("count")))));
+        }
+        redisCache.setCacheMap(CacheConstants.SO2_DEVICE_STATIC, result);
+        return AjaxResult.success(result);
+    }
+
 }

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/job/CanalScheduling.java

@@ -8,7 +8,9 @@ import com.alibaba.otter.canal.client.CanalConnectors;
 import com.alibaba.otter.canal.protocol.CanalEntry;
 import com.alibaba.otter.canal.protocol.Message;
 import com.google.protobuf.InvalidProtocolBufferException;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.ElasticConstants;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.JdbcTypeUtil;
 import com.ruoyi.framework.config.ElasticSearchClient;
 import com.ruoyi.web.core.config.CanalConfig;
@@ -40,6 +42,8 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
     private ApplicationContext applicationContext;
     @Autowired
     private ElasticSearchClient client;
+    @Autowired
+    private RedisCache redisCache;
 //    @Resource
 //    private CanalConnector canalConnector;
 
@@ -142,6 +146,7 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
         if (!StrUtil.equalsAnyIgnoreCase(table, "ship_recognition",
                 "alert",
                 "monitor_point",
+                "device",
                 "ship_static_info",
                 "illegal_ship",
                 "sem_instrument",
@@ -158,6 +163,10 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "monitor_point")) {
                     // 检测点信息
                     client.createDocument(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "device")) {
+                    // 设备信息
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "ship_static_info")) {
                     // 船舶信息
                     if (ObjectUtil.isNotEmpty(afterDataMap.get("mmsi"))) {
@@ -183,6 +192,7 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && (StrUtil.equalsIgnoreCase(table, "sem_instrument_test") || StrUtil.equalsIgnoreCase(table, "sem_instrument"))) {
                     // 嗅探系统-站点信息
                     client.createDocument(ElasticConstants.AIS_SEM_INSTRUMENT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
                 } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
                     // 嗅探系统-违规船舶
                     // 查询站点信息
@@ -202,6 +212,10 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "monitor_point")) {
                     // 检测点信息
                     client.updateDocument(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "device")) {
+                    // 设备信息
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "ship_static_info")) {
                     // 船舶信息
                     client.updateDocument(ElasticConstants.SO2_SHIP_STATIC_INFO, Convert.toStr(afterDataMap.get("mmsi")), afterDataMap);
@@ -211,6 +225,7 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && (StrUtil.equalsIgnoreCase(table, "sem_instrument_test") || StrUtil.equalsIgnoreCase(table, "sem_instrument"))) {
                     // 嗅探系统-站点信息
                     client.updateDocument(ElasticConstants.AIS_SEM_INSTRUMENT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
                 } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
                     // 嗅探系统-违规船舶
                     // 查询站点信息
@@ -228,6 +243,10 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "monitor_point")) {
                     // 检测点信息
                     client.deleteDocument(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("id")));
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "device")) {
+                    // 设备信息
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "ship_static_info")) {
                     // 船舶信息
                     client.deleteDocument(ElasticConstants.SO2_SHIP_STATIC_INFO, Convert.toStr(afterDataMap.get("mmsi")));
@@ -237,6 +256,7 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && (StrUtil.equalsIgnoreCase(table, "sem_instrument_test") || StrUtil.equalsIgnoreCase(table, "sem_instrument"))) {
                     // 嗅探系统-站点信息
                     client.deleteDocument(ElasticConstants.AIS_SEM_INSTRUMENT, Convert.toStr(afterDataMap.get("id")));
+                    redisCache.deleteObject(CacheConstants.SO2_DEVICE_STATIC);
                 } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
                     // 嗅探系统-违规船舶
                     client.deleteDocument(ElasticConstants.AIS_ILLEGAL_SHIP, Convert.toStr(afterDataMap.get("id")));

+ 13 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java

@@ -0,0 +1,13 @@
+package com.ruoyi.common.constant;
+
+/**
+ * @Description: redis缓存常量
+ * @Author: huangcheng
+ * @Date: 2021/8/24
+ * @Version V1.0
+ */
+public class CacheConstants {
+    // 设备统计
+    public static final String SO2_DEVICE_STATIC = "so2:device:static";
+
+}

+ 15 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java

@@ -231,4 +231,19 @@ public class RedisCache
     {
         return redisTemplate.keys(pattern);
     }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
 }

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/utils/JdbcTypeUtil.java

@@ -137,7 +137,7 @@ public class JdbcTypeUtil {
                 }
                 case Types.TIMESTAMP:
                     if (!value.startsWith("0000-00-00")) {
-                        res = DateUtils.parseDate(value);
+                        res = DateUtil.formatDateTime(DateUtil.parse(value));
                     } else {
                         res = null;
                     }

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/XiuTanSemInstrument.java

@@ -35,4 +35,7 @@ public class XiuTanSemInstrument
     @Excel(name = "备注")
     private String remark;
 
+    @Excel(name = "分组")
+    private String category;
+
 }

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/AisDatabaseMapper.java

@@ -0,0 +1,14 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/31
+ * @Version V1.0
+ */
+public interface AisDatabaseMapper {
+    List<Map<String, Object>> queryDeviceStatic();
+}

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/So2Mapper.java

@@ -0,0 +1,14 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/31
+ * @Version V1.0
+ */
+public interface So2Mapper {
+    List<Map<String, Object>> queryDeviceStatic();
+}

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IAisDatabase.java

@@ -0,0 +1,14 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/31
+ * @Version V1.0
+ */
+public interface IAisDatabase {
+    List<Map<String, Object>> queryDeviceStatic();
+}

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISo2Service.java

@@ -0,0 +1,14 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/31
+ * @Version V1.0
+ */
+public interface ISo2Service {
+    List<Map<String, Object>> queryDeviceStatic();
+}

+ 30 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AisDatabaseImpl.java

@@ -0,0 +1,30 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.system.mapper.AisDatabaseMapper;
+import com.ruoyi.system.service.IAisDatabase;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/31
+ * @Version V1.0
+ */
+@Service
+@DataSource(DataSourceType.SLAVE_AIS)
+public class AisDatabaseImpl implements IAisDatabase {
+
+    @Autowired
+    private AisDatabaseMapper aisDatabaseMapper;
+
+    @Override
+    public List<Map<String, Object>> queryDeviceStatic() {
+        return aisDatabaseMapper.queryDeviceStatic();
+    }
+}

+ 30 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/So2ServiceImpl.java

@@ -0,0 +1,30 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.system.mapper.So2Mapper;
+import com.ruoyi.system.service.ISo2Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/31
+ * @Version V1.0
+ */
+@Service
+@DataSource(DataSourceType.SLAVE_SO2)
+public class So2ServiceImpl implements ISo2Service {
+
+    @Autowired
+    private So2Mapper so2Mapper;
+
+    @Override
+    public List<Map<String, Object>> queryDeviceStatic() {
+        return so2Mapper.queryDeviceStatic();
+    }
+}

+ 12 - 0
ruoyi-system/src/main/resources/mapper/system/AisDatabaseMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.AisDatabaseMapper">
+
+    <select id="queryDeviceStatic" resultType="java.util.Map">
+        select Category point, count(1) count
+        from sem_instrument_test
+        group by Category;
+    </select>
+</mapper>

+ 13 - 0
ruoyi-system/src/main/resources/mapper/system/So2Mapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.So2Mapper">
+
+    <select id="queryDeviceStatic" resultType="java.util.Map">
+        select t1.name point, count(d.id) count
+        from monitor_point t1
+            left join device d on t1.id = d.monitor_point_id
+        group by t1.id;
+    </select>
+</mapper>