Эх сурвалжийг харах

嗅探数据同步
光谱检测点

459242451@qq.com 3 жил өмнө
parent
commit
38ceef958b

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
@@ -14,6 +15,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @Slf4j
 @EnableScheduling
+@EnableAsync
 public class RuoYiApplication
 {
     public static void main(String[] args)

+ 37 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/GasCommonController.java

@@ -0,0 +1,37 @@
+package com.ruoyi.web.controller.gas;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.domain.SyncPost;
+import com.ruoyi.web.service.IGasCommonService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: 公共提出接口
+ * @Author: huangcheng
+ * @Date: 2021/8/30
+ * @Version V1.0
+ */
+@RestController
+@RequestMapping("/gas/common")
+@Api(tags = "公共接口")
+public class GasCommonController {
+
+    @Autowired
+    private IGasCommonService gasCommonService;
+
+    @PreAuthorize("@ss.hasPermi('system:gas:sync')")
+    @PostMapping("/sync")
+    @ApiOperation("第三方表数据同步ES")
+    public AjaxResult sync(@RequestBody SyncPost syncPost) {
+        gasCommonService.sync(syncPost);
+        return AjaxResult.success("同步中...");
+    }
+
+}

+ 46 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/So2Controller.java

@@ -6,12 +6,15 @@ import cn.hutool.core.util.StrUtil;
 import com.ruoyi.common.constant.ElasticConstants;
 import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.core.controller.BaseController;
+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.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 io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,4 +72,47 @@ public class So2Controller extends BaseController {
         rspData.setTotal(Convert.toLong(maps.get("totalNum")));
         return rspData;
     }
+
+    @GetMapping("/xiutan/list")
+    @ApiOperation("嗅探-硫嫌疑船舶列表数据")
+    public TableDataInfo XtList(XiuTanIllegalShip illegalShip) {
+        // 传来的参数
+        Map<String, Object> params = illegalShip.getParams();
+        Map<String, Object> equalsCondition = new HashMap<>();
+        // 组装查询条件
+        equalsCondition.put("shipMmsi", ObjectUtil.isEmpty(illegalShip.getShipMmsi()) ? null : StrUtil.concat(true, "*", Convert.toStr(illegalShip.getShipMmsi()), "*"));
+        equalsCondition.put("shipName", StrUtil.isBlank(illegalShip.getShipName()) ? null : StrUtil.concat(true, "*", illegalShip.getShipName(), "*"));
+        equalsCondition.put("semId", illegalShip.getSemId());
+        // 组装范围查询条件
+        Map<String, Object> rangeCondition = new HashMap<>();
+        if (ObjectUtil.isNotEmpty(params.get("beginTime"))) {
+            params.put("beginTime", params.get("beginTime") + " 00:00:00");
+        }
+        if (ObjectUtil.isNotEmpty(params.get("endTime"))) {
+            params.put("endTime", params.get("endTime") + " 23:59:59");
+        }
+        rangeCondition.put("peakTime", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]"));
+        List<String> orderBy = new ArrayList<>();
+        orderBy.add("-peakTime");
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Map<String, Object> maps = client.searchDocument(ElasticConstants.AIS_ILLEGAL_SHIP, equalsCondition, rangeCondition, orderBy, pageDomain.getPageNum(), pageDomain.getPageSize());
+
+        TableDataInfo rspData = new TableDataInfo();
+        rspData.setCode(HttpStatus.SUCCESS);
+        rspData.setMsg("查询成功");
+        rspData.setRows(Convert.toList(GuapAlert.class, maps.get("pageList")));
+        rspData.setTotal(Convert.toLong(maps.get("totalNum")));
+        return rspData;
+    }
+
+    @GetMapping("/guangpu/monitorPoint")
+    @ApiOperation("光谱-检测点数据")
+    public AjaxResult monitorPoint(GuapMonitorPoint monitorPoint) {
+        // 传来的参数
+        Map<String, Object> equalsCondition = new HashMap<>();
+        // 组装查询条件
+        equalsCondition.put("name", StrUtil.isBlank(monitorPoint.getName()) ? null : StrUtil.concat(true, "*", monitorPoint.getName(), "*"));
+        Map<String, Object> maps = client.searchDocument(ElasticConstants.SO2_MONITOR_POINT, equalsCondition, null, null, 1, 10000);
+        return AjaxResult.success(Convert.toList(GuapMonitorPoint.class, maps.get("pageList")));
+    }
 }

+ 37 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/job/CanalScheduling.java

@@ -126,7 +126,7 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
             if (column == null) {
                 return;
             }
-            map.put(StrUtil.toCamelCase(column.getName()), JdbcTypeUtil.typeConvert(tableName, column.getName(), column.getValue(), column.getSqlType(), column.getMysqlType()));
+            map.put(StrUtil.lowerFirst(StrUtil.toCamelCase(column.getName())), JdbcTypeUtil.typeConvert(tableName, column.getName(), column.getValue(), column.getSqlType(), column.getMysqlType()));
         });
         return map;
     }
@@ -142,7 +142,10 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
         if (!StrUtil.equalsAnyIgnoreCase(table, "ship_recognition",
                 "alert",
                 "monitor_point",
-                "ship_static_info")) {
+                "ship_static_info",
+                "illegal_ship",
+                "sem_instrument",
+                "sem_instrument_test")) {
             return;
         }
 
@@ -177,6 +180,20 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                         afterDataMap.put("monitorPointName", data.get("name"));
                     }
                     client.createDocument(ElasticConstants.SO2_ALERT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                } 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);
+                } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
+                    // 嗅探系统-违规船舶
+                    // 查询站点信息
+                    Map<String, Object> sem = client.getDocById(ElasticConstants.AIS_SEM_INSTRUMENT, Convert.toStr(afterDataMap.get("semId")), "name");
+                    if (sem != null && ObjectUtil.equal(sem.get("code"), 200)) {
+                        Map<String, String> data = Convert.toMap(String.class, String.class, sem.get("data"));
+                        afterDataMap.put("semName", data.get("name"));
+                    }
+                    // 初始化设为未上传状态
+                    afterDataMap.put("uploadFlag", 0);
+                    client.createDocument(ElasticConstants.AIS_ILLEGAL_SHIP, Convert.toStr(afterDataMap.get("id")), afterDataMap);
                 }
                 break;
             case UPDATE:
@@ -191,6 +208,18 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "alert")) {
                     // 违规船舶
                     client.updateDocument(ElasticConstants.SO2_ALERT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                } 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);
+                } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
+                    // 嗅探系统-违规船舶
+                    // 查询站点信息
+                    Map<String, Object> sem = client.getDocById(ElasticConstants.AIS_SEM_INSTRUMENT, Convert.toStr(afterDataMap.get("semId")), "name");
+                    if (sem != null && ObjectUtil.equal(sem.get("code"), 200)) {
+                        Map<String, String> data = Convert.toMap(String.class, String.class, sem.get("data"));
+                        afterDataMap.put("semName", data.get("name"));
+                    }
+                    client.updateDocument(ElasticConstants.AIS_ILLEGAL_SHIP, Convert.toStr(afterDataMap.get("id")), afterDataMap);
                 }
                 break;
             case DELETE:
@@ -205,6 +234,12 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "alert")) {
                     // 违规船舶
                     client.deleteDocument(ElasticConstants.SO2_ALERT, Convert.toStr(afterDataMap.get("id")));
+                } 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")));
+                } else if (StrUtil.equalsIgnoreCase(database, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
+                    // 嗅探系统-违规船舶
+                    client.deleteDocument(ElasticConstants.AIS_ILLEGAL_SHIP, Convert.toStr(afterDataMap.get("id")));
                 }
                 break;
             default:

+ 13 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/service/IGasCommonService.java

@@ -0,0 +1,13 @@
+package com.ruoyi.web.service;
+
+import com.ruoyi.system.domain.SyncPost;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/30
+ * @Version V1.0
+ */
+public interface IGasCommonService {
+    void sync(SyncPost syncPost);
+}

+ 73 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/service/Impl/GasCommonServiceImpl.java

@@ -0,0 +1,73 @@
+package com.ruoyi.web.service.Impl;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ruoyi.common.constant.ElasticConstants;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.framework.config.ElasticSearchClient;
+import com.ruoyi.system.domain.SyncPost;
+import com.ruoyi.system.mapper.GasCommonMapper;
+import com.ruoyi.web.service.IGasCommonService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/30
+ * @Version V1.0
+ */
+@Service
+@Slf4j
+public class GasCommonServiceImpl implements IGasCommonService {
+
+    @Autowired
+    private GasCommonMapper gasCommonMapper;
+    @Autowired
+    private ElasticSearchClient client;
+
+    @SneakyThrows
+    @Override
+    @Async
+    public void sync(SyncPost syncPost) {
+        String schema = syncPost.getSchema();
+        String table = syncPost.getTable();
+        if (StrUtil.equalsIgnoreCase(schema, "ais_database") && (StrUtil.equalsIgnoreCase(table, "sem_instrument_test") || StrUtil.equalsIgnoreCase(table, "sem_instrument"))) {
+            // 嗅探站点信息
+            List<Map<String,Object>> map = gasCommonMapper.querySemInstrument(table);
+            for (Map<String, Object> stringObjectMap : map) {
+                saveOrUpdate(ElasticConstants.AIS_SEM_INSTRUMENT, Convert.toStr(stringObjectMap.get("id")), stringObjectMap);
+            }
+        } else if (StrUtil.equalsIgnoreCase(schema, "ais_database") && StrUtil.equalsIgnoreCase(table, "illegal_ship")) {
+            // 嗅探违规船舶信息
+            List<Map<String,Object>> map = gasCommonMapper.queryIllegalShip(syncPost);
+            for (Map<String, Object> stringObjectMap : map) {
+                stringObjectMap.put("peakTime", DateUtil.formatDateTime(DateUtil.parse(Convert.toStr(stringObjectMap.get("peakTime")))));
+                stringObjectMap.put("startTime", DateUtil.formatDateTime(DateUtil.parse(Convert.toStr(stringObjectMap.get("startTime")))));
+                stringObjectMap.put("endTime", DateUtil.formatDateTime(DateUtil.parse(Convert.toStr(stringObjectMap.get("endTime")))));
+                saveOrUpdate(ElasticConstants.AIS_ILLEGAL_SHIP, Convert.toStr(stringObjectMap.get("id")), stringObjectMap);
+            }
+        }
+    }
+
+    @SneakyThrows
+    private void saveOrUpdate(String indexName, String id, Map<String, Object> map) {
+        Map<String, Object> doc = client.getDocById(indexName, id, "");
+        if (doc != null && ObjectUtil.equal(doc.get("code"), 200)) {
+            // 更新操作
+            client.updateDocument(indexName, id, map);
+        } else {
+            // 新增操作
+            client.createDocument(indexName, id, map);
+        }
+    }
+
+}

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

@@ -9,7 +9,7 @@ spring:
                 url: jdbc:mysql://200.200.19.126:3306/cbwqpf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
                 password: root
-            # 从库数据源(光谱分析)
+            # 从库数据源(嗅探)
             slaveais:
                 # 从数据源开关/默认关闭
                 enabled: true

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

@@ -9,7 +9,7 @@ spring:
                 url: jdbc:mysql://200.200.19.126:3306/cbwqpf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
                 password: root
-            # 从库数据源(光谱分析)
+            # 从库数据源(嗅探)
             slaveais:
                 # 从数据源开关/默认关闭
                 enabled: true

+ 4 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/ElasticConstants.java

@@ -15,4 +15,8 @@ public class ElasticConstants {
     public static final String SO2_MONITOR_POINT = "so2_monitor_point";
     // 光谱违规船舶
     public static final String SO2_ALERT = "so2_alert";
+    // 嗅探站点信息
+    public static final String AIS_SEM_INSTRUMENT = "ais_sem_instrument";
+    // 嗅探违规船舶
+    public static final String AIS_ILLEGAL_SHIP = "ais_illegal_ship";
 }

+ 35 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/GuapMonitorPoint.java

@@ -0,0 +1,35 @@
+package com.ruoyi.system.domain;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 光谱-检测点
+ * 
+ * @author ruoyi
+ * @date 2021-08-24
+ */
+@Data
+public class GuapMonitorPoint
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    @Excel(name = "名称")
+    private String name;
+
+    @Excel(name = "经度")
+    private String longitude;
+
+    @Excel(name = "纬度")
+    private String latitude;
+
+}

+ 19 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/SyncPost.java

@@ -0,0 +1,19 @@
+package com.ruoyi.system.domain;
+
+import lombok.Data;
+
+/**
+ * @Description: 表同步
+ * @Author: huangcheng
+ * @Date: 2021/8/30
+ * @Version V1.0
+ */
+@Data
+public class SyncPost {
+
+    private String schema;
+    private String table;
+    private String startTime;
+    private String endTime;
+
+}

+ 66 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/XiuTanIllegalShip.java

@@ -0,0 +1,66 @@
+package com.ruoyi.system.domain;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 嗅探-嫌疑船舶
+ * 
+ * @author ruoyi
+ * @date 2021-08-24
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class XiuTanIllegalShip extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    private String semId;
+
+    @Excel(name = "站点")
+    private String semName;
+
+    @Excel(name = "硫含量")
+    private BigDecimal sPercent;
+
+    @Excel(name = "氮含量")
+    private BigDecimal nPercent;
+
+    @Excel(name = "波峰时间")
+    private Date peakTime;
+
+    @Excel(name = "波峰起始时间")
+    private Date startTime;
+
+    @Excel(name = "波峰结束时间")
+    private Date endTime;
+
+    private String shipMmsi;
+
+    @Excel(name = "船舶名")
+    private String shipName;
+
+    @Excel(name = "误差")
+    private BigDecimal error;
+
+    @Excel(name = "距离")
+    private BigDecimal distance;
+
+    @Excel(name = "风速")
+    private BigDecimal windSpeed;
+
+    @Excel(name = "风向")
+    private BigDecimal windAngle;
+
+    private Integer confirmed;
+
+}

+ 24 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/GasCommonMapper.java

@@ -0,0 +1,24 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.system.domain.SyncPost;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2021/8/30
+ * @Version V1.0
+ */
+public interface GasCommonMapper {
+
+    @DataSource(DataSourceType.SLAVE_AIS)
+    List<Map<String,Object>> querySemInstrument(@Param("table") String table);
+
+    @DataSource(DataSourceType.SLAVE_AIS)
+    List<Map<String, Object>> queryIllegalShip(@Param("syncPost") SyncPost syncPost);
+}

+ 50 - 0
ruoyi-system/src/main/resources/mapper/system/GasCommonMapper.xml

@@ -0,0 +1,50 @@
+<?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.GasCommonMapper">
+
+    <select id="querySemInstrument" resultType="java.util.Map">
+        select id,
+               name,
+               ip,
+               longitude,
+               latitude,
+               remark,
+               pattern,
+               windDirection,
+               windSpeed,
+               spreadTime,
+               delayTime,
+               sMax,
+               relyMmsi,
+               relyShow,
+               radius,
+               pMode,
+               nFlag,
+               sensitiveType,
+               autoType
+        from ${table}
+    </select>
+
+    <select id="queryIllegalShip" resultType="java.util.Map">
+        select t1.id,
+               sem_id        semId,
+               t2.Name       semName,
+               s_percent     sPercent,
+               n_percent     nPercent,
+               peak_time     peakTime,
+               start_time    startTime,
+               end_time      endTime,
+               ship_mmsi     shipMmsi,
+               ship_name     shipName,
+               error,
+               distance,
+               t1.wind_speed windSpeed,
+               wind_angle    windAngle,
+               confirmed
+        from illegal_ship t1
+                 left join sem_instrument_test t2 on t1.sem_id = t2.id
+    </select>
+
+</mapper>