Browse Source

光谱系统嫌疑船舶数据

459242451@qq.com 3 years ago
parent
commit
19a646d0a1

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

@@ -0,0 +1,72 @@
+package com.ruoyi.web.controller.gas;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+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.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.ShipRecognition;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 硫含量
+ * @Author: huangcheng
+ * @Date: 2021/8/26
+ * @Version V1.0
+ */
+@RestController
+@RequestMapping("/so2")
+@Api(tags = "硫含量接口")
+public class So2Controller extends BaseController {
+
+    @Autowired
+    private ElasticSearchClient client;
+
+    @GetMapping("/guangpu/list")
+    @ApiOperation("光谱-硫嫌疑船舶列表数据")
+    public TableDataInfo GpList(GuapAlert guapAlert) {
+        // 传来的参数
+        Map<String, Object> params = guapAlert.getParams();
+        Map<String, Object> equalsCondition = new HashMap<>();
+        // 组装查询条件
+        equalsCondition.put("mmsi", ObjectUtil.isEmpty(guapAlert.getMmsi()) ? null : StrUtil.concat(true, "*", Convert.toStr(guapAlert.getMmsi()), "*"));
+        equalsCondition.put("shipName", StrUtil.isBlank(guapAlert.getShipName()) ? null : StrUtil.concat(true, "*", guapAlert.getShipName(), "*"));
+        equalsCondition.put("monitorPointId", guapAlert.getMonitorPointId());
+        // 组装范围查询条件
+        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("createTime", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]"));
+        List<String> orderBy = new ArrayList<>();
+        orderBy.add("-createTime");
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Map<String, Object> maps = client.searchDocument(ElasticConstants.SO2_ALERT, 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;
+    }
+}

+ 69 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/job/CanalScheduling.java

@@ -1,6 +1,7 @@
 package com.ruoyi.web.job;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.otter.canal.client.CanalConnector;
 import com.alibaba.otter.canal.client.CanalConnectors;
@@ -19,6 +20,7 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedCaseInsensitiveMap;
 
 import java.net.InetSocketAddress;
 import java.util.HashMap;
@@ -110,8 +112,8 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
             List<CanalEntry.Column> beforeColumnsList = rowData.getBeforeColumnsList();
             //获取改变后的数据
             List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
-            Map<String, Object> beforeColumnsToMap = parseColumnsToMap(beforeColumnsList, tableName);
-            Map<String, Object> afterColumnsToMap = parseColumnsToMap(afterColumnsList, tableName);
+            Map<String, Object> beforeColumnsToMap = toCaseInsensitiveMap(parseColumnsToMap(beforeColumnsList, tableName));
+            Map<String, Object> afterColumnsToMap = toCaseInsensitiveMap(parseColumnsToMap(afterColumnsList, tableName));
             //插入es
             indexES(beforeColumnsToMap, afterColumnsToMap, eventType, database, tableName);
 
@@ -124,7 +126,7 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
             if (column == null) {
                 return;
             }
-            map.put(column.getName(), JdbcTypeUtil.typeConvert(tableName, column.getName(), column.getValue(), column.getSqlType(), column.getMysqlType()));
+            map.put(StrUtil.toCamelCase(column.getName()), JdbcTypeUtil.typeConvert(tableName, column.getName(), column.getValue(), column.getSqlType(), column.getMysqlType()));
         });
         return map;
     }
@@ -137,7 +139,10 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
         }
 
         //不是user表中的数据不处理
-        if (!StrUtil.equalsAnyIgnoreCase(table, "ship_recognition")) {
+        if (!StrUtil.equalsAnyIgnoreCase(table, "ship_recognition",
+                "alert",
+                "monitor_point",
+                "ship_static_info")) {
             return;
         }
 
@@ -147,22 +152,82 @@ public class CanalScheduling implements Runnable, ApplicationContextAware {
                 // 黑烟船舶数据入库
                 if (StrUtil.equalsIgnoreCase(database, "heiyan") && StrUtil.equalsIgnoreCase(table, "ship_recognition")) {
                     client.createDocument(ElasticConstants.HEIYAN_SHIP_RECOGNITION, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "monitor_point")) {
+                    // 检测点信息
+                    client.createDocument(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "ship_static_info")) {
+                    // 船舶信息
+                    if (ObjectUtil.isNotEmpty(afterDataMap.get("mmsi"))) {
+                        client.createDocument(ElasticConstants.SO2_SHIP_STATIC_INFO, Convert.toStr(afterDataMap.get("mmsi")), afterDataMap);
+                    }
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "alert")) {
+                    // 违规船舶
+                    // 查询检测点和船舶信息
+                    if (ObjectUtil.isNotEmpty(afterDataMap.get("mmsi"))) {
+                        Map<String, Object> mmsi = client.getDocById(ElasticConstants.SO2_SHIP_STATIC_INFO, Convert.toStr(afterDataMap.get("mmsi")), "name,destination");
+                        if (mmsi != null && ObjectUtil.equal(mmsi.get("code"), 200)) {
+                            Map<String, String> data = Convert.toMap(String.class, String.class, mmsi.get("data"));
+                            afterDataMap.put("shipName", data.get("name"));
+                            afterDataMap.put("destination", data.get("destination"));
+                        }
+                    }
+                    Map<String, Object> monitor = client.getDocById(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("monitorPointId")), "name");
+                    if (monitor != null && ObjectUtil.equal(monitor.get("code"), 200)) {
+                        Map<String, String> data = Convert.toMap(String.class, String.class, monitor.get("data"));
+                        afterDataMap.put("monitorPointName", data.get("name"));
+                    }
+                    client.createDocument(ElasticConstants.SO2_ALERT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
                 }
                 break;
             case UPDATE:
                 if (StrUtil.equalsIgnoreCase(database, "heiyan") && StrUtil.equalsIgnoreCase(table, "ship_recognition")) {
                     client.updateDocument(ElasticConstants.HEIYAN_SHIP_RECOGNITION, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "monitor_point")) {
+                    // 检测点信息
+                    client.updateDocument(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
+                } 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);
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "alert")) {
+                    // 违规船舶
+                    client.updateDocument(ElasticConstants.SO2_ALERT, Convert.toStr(afterDataMap.get("id")), afterDataMap);
                 }
                 break;
             case DELETE:
+                if (StrUtil.equalsIgnoreCase(database, "heiyan") && StrUtil.equalsIgnoreCase(table, "ship_recognition")) {
+                    client.deleteDocument(ElasticConstants.HEIYAN_SHIP_RECOGNITION, Convert.toStr(afterDataMap.get("id")));
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "monitor_point")) {
+                    // 检测点信息
+                    client.deleteDocument(ElasticConstants.SO2_MONITOR_POINT, Convert.toStr(afterDataMap.get("id")));
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "ship_static_info")) {
+                    // 船舶信息
+                    client.deleteDocument(ElasticConstants.SO2_SHIP_STATIC_INFO, Convert.toStr(afterDataMap.get("mmsi")));
+                } else if (StrUtil.equalsIgnoreCase(database, "so2") && StrUtil.equalsIgnoreCase(table, "alert")) {
+                    // 违规船舶
+                    client.deleteDocument(ElasticConstants.SO2_ALERT, Convert.toStr(afterDataMap.get("id")));
+                }
                 break;
             default:
                 break;
         }
     }
 
+    /**
+     * 或缺数据库字段的大小写
+     *
+     * @param data
+     * @param <V>
+     * @return
+     */
+    private static <V> LinkedCaseInsensitiveMap<V> toCaseInsensitiveMap(Map<String, V> data) {
+        LinkedCaseInsensitiveMap map = new LinkedCaseInsensitiveMap();
+        map.putAll(data);
+        return map;
+    }
+
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         this.applicationContext = applicationContext;
     }
+
 }

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

@@ -7,5 +7,12 @@ package com.ruoyi.common.constant;
  * @Version V1.0
  */
 public class ElasticConstants {
+    // 黑烟嫌疑船舶
     public static final String HEIYAN_SHIP_RECOGNITION = "heiyan_ship_recognition";
+    // 光谱船舶信息
+    public static final String SO2_SHIP_STATIC_INFO = "so2_ship_static_info";
+    // 光谱检测点信息
+    public static final String SO2_MONITOR_POINT = "so2_monitor_point";
+    // 光谱违规船舶
+    public static final String SO2_ALERT = "so2_alert";
 }

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ElasticSearchClient.java

@@ -397,7 +397,7 @@ public class ElasticSearchClient {
         }
         //分页(es分页查询默认是查询返回10条记录,而深度分页,默认是10000条数据,也就是一次性最多返回10000条,设置size就可以实现,但是如果实际数据量特别大,可以使用scroll游标查询,此处主要常规分页查询)
         if (ObjectUtil.isNotEmpty(pageNum)) {
-            pageSize = pageSize == null ? 10000 : pageSize;
+            pageSize = pageSize == null ? 10 : pageSize;
             if (pageNum > 0) {
                 sourceBuilder.from(pageSize * (pageNum - 1));
             } else {

+ 65 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/GuapAlert.java

@@ -0,0 +1,65 @@
+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 GuapAlert extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    private String mmsi;
+
+    @Excel(name = "船名")
+    private String shipName;
+
+    @Excel(name = "目的地")
+    private String destination;
+
+    private Long monitorPointId;
+
+    @Excel(name = "监测点")
+    private String monitorPointName;
+
+    @Excel(name = "类型 0:报警 1:疑似报警")
+    private Integer alertType;
+
+    @Excel(name = "二氧化氮浓度")
+    private BigDecimal no2Concentration;
+
+    @Excel(name = "二氧化硫浓度")
+    private BigDecimal so2Concentration;
+
+    @Excel(name = "二氧化碳浓度")
+    private BigDecimal co2Concentration;
+
+    @Excel(name = "燃油硫含量")
+    private BigDecimal so2Percent;
+
+    @Excel(name = "时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Excel(name = "0: 未审核 1:违法 2:合法")
+    private Integer auditStatus;
+
+    @Excel(name = "抓拍图片地址")
+    private String captureUrl;
+
+}