浏览代码

Merge branch 'master' of http://120.25.74.229:8003/chenfangchao/es-track-analysis into xiahailong

 Conflicts:
	tianao-analysis/target/classes/application.yml
xiahailong 2 年之前
父节点
当前提交
d7cfd92ddd
共有 45 个文件被更改,包括 1866 次插入19 次删除
  1. 48 0
      beidou-analysis/pom.xml
  2. 18 0
      beidou-analysis/src/main/java/cn/com/taiji/BeidouAnalySisApplication.java
  3. 40 0
      beidou-analysis/src/main/java/cn/com/taiji/controller/BeidouAnalySisController.java
  4. 18 0
      beidou-analysis/src/main/java/cn/com/taiji/service/BeidouAnalySisService.java
  5. 137 0
      beidou-analysis/src/main/java/cn/com/taiji/service/impl/BeidouAnalySisServiceImpl.java
  6. 7 0
      beidou-analysis/src/main/resources/application-prod.yml
  7. 10 0
      beidou-analysis/src/main/resources/application.yml
  8. 17 0
      es-track-common/pom.xml
  9. 15 0
      es-track-common/src/main/java/cn/com/taiji/constants/TopicConstants.java
  10. 32 0
      es-track-common/src/main/java/cn/com/taiji/entity/BeidouShipTrackDTO.java
  11. 26 0
      es-track-common/src/main/java/cn/com/taiji/entity/CountDTO.java
  12. 212 0
      es-track-common/src/main/java/cn/com/taiji/entity/FusionBaseEntity.java
  13. 29 0
      es-track-common/src/main/java/cn/com/taiji/entity/FusionNewShipJsonDTO.java
  14. 25 0
      es-track-common/src/main/java/cn/com/taiji/entity/GlobalAisTrackDTO.java
  15. 25 0
      es-track-common/src/main/java/cn/com/taiji/entity/Location.java
  16. 21 0
      es-track-common/src/main/java/cn/com/taiji/entity/QueryVo.java
  17. 0 0
      es-track-common/src/main/java/cn/com/taiji/utils/DateUtils.java
  18. 91 0
      es-track-common/src/main/java/cn/com/taiji/utils/ExcelUtils.java
  19. 92 0
      es-track-common/src/main/java/cn/com/taiji/utils/LocationUtils.java
  20. 28 0
      es-track-common/src/main/java/cn/com/taiji/vo/ExportVo.java
  21. 0 1
      fusion-analysis/src/main/java/cn/com/taiji/service/impl/FusionAnalysisServiceImpl.java
  22. 48 0
      hlx-one-fusion-analysis/pom.xml
  23. 18 0
      hlx-one-fusion-analysis/src/main/java/cn/com/taiji/HlxOneLevelApplication.java
  24. 40 0
      hlx-one-fusion-analysis/src/main/java/cn/com/taiji/controller/HlxOneLevelController.java
  25. 72 0
      hlx-one-fusion-analysis/src/main/java/cn/com/taiji/entity/HlxOneLevelShipTrackDTO.java
  26. 18 0
      hlx-one-fusion-analysis/src/main/java/cn/com/taiji/service/HlxOneLevelService.java
  27. 136 0
      hlx-one-fusion-analysis/src/main/java/cn/com/taiji/service/HlxOneLevelServiceImpl.java
  28. 7 0
      hlx-one-fusion-analysis/src/main/resources/application-prod.yml
  29. 10 0
      hlx-one-fusion-analysis/src/main/resources/application.yml
  30. 21 0
      pom.xml
  31. 73 0
      simulation-track/pom.xml
  32. 18 0
      simulation-track/src/main/java/cn/com/taiji/SimulationTrackApplication.java
  33. 34 0
      simulation-track/src/main/java/cn/com/taiji/controller/SimulationTrackController.java
  34. 15 0
      simulation-track/src/main/java/cn/com/taiji/service/SimulationTrackService.java
  35. 85 0
      simulation-track/src/main/java/cn/com/taiji/service/impl/SimulationTrackImpl.java
  36. 58 0
      simulation-track/src/main/resources/application-prod.yml
  37. 53 0
      simulation-track/src/main/resources/application.yml
  38. 34 0
      tianao-analysis/pom.xml
  39. 40 0
      tianao-analysis/src/main/java/cn/com/taiji/controller/TianaoRadarController.java
  40. 0 17
      tianao-analysis/src/main/java/cn/com/taiji/dto/TianaoRadar.java
  41. 36 0
      tianao-analysis/src/main/java/cn/com/taiji/entity/TianaoRadar.java
  42. 18 0
      tianao-analysis/src/main/java/cn/com/taiji/service/TianaoService.java
  43. 138 0
      tianao-analysis/src/main/java/cn/com/taiji/service/impl/TianaoServiceImpl.java
  44. 1 1
      tianao-analysis/src/main/resources/application.yml
  45. 2 0
      tianao-analysis/target/classes/application.yml

+ 48 - 0
beidou-analysis/pom.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>es-track-analysis</artifactId>
+        <groupId>cn.com.taiji</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>beidou-analysis</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.taiji</groupId>
+            <artifactId>es-track-common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <mainClass>cn.com.taiji.BeidouAnalySisApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
beidou-analysis/src/main/java/cn/com/taiji/BeidouAnalySisApplication.java

@@ -0,0 +1,18 @@
+package cn.com.taiji;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author chenfangchao
+ * @title: BeidouAnalySisApplication
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 10:57 AM
+ */
+@SpringBootApplication
+public class BeidouAnalySisApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(BeidouAnalySisApplication.class,args);
+    }
+}

+ 40 - 0
beidou-analysis/src/main/java/cn/com/taiji/controller/BeidouAnalySisController.java

@@ -0,0 +1,40 @@
+package cn.com.taiji.controller;
+
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.service.BeidouAnalySisService;
+import cn.com.taiji.utils.ExcelUtils;
+import cn.com.taiji.vo.ExportVo;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: BeidouAnalySisController
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 10:59 AM
+ */
+@RequestMapping("/beidou")
+@RestController
+public class BeidouAnalySisController {
+
+    @Autowired
+    private BeidouAnalySisService beidouAnalySisService;
+
+    @PostMapping("/export")
+    public void beidouAnalySis(HttpServletResponse response, @RequestBody QueryVo query) {
+        try {
+            List<ExportVo> list = beidouAnalySisService.export(query);
+            ExcelUtils.export2Web(response, "北斗", "天奥", ExportVo.class, list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 18 - 0
beidou-analysis/src/main/java/cn/com/taiji/service/BeidouAnalySisService.java

@@ -0,0 +1,18 @@
+package cn.com.taiji.service;
+
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.vo.ExportVo;
+
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: BeidouAnalySisService
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 10:59 AM
+ */
+public interface BeidouAnalySisService {
+
+    List<ExportVo> export(QueryVo query);
+}

+ 137 - 0
beidou-analysis/src/main/java/cn/com/taiji/service/impl/BeidouAnalySisServiceImpl.java

@@ -0,0 +1,137 @@
+package cn.com.taiji.service.impl;
+
+import cn.com.taiji.constants.EsIndexConstants;
+import cn.com.taiji.entity.BeidouShipTrackDTO;
+import cn.com.taiji.entity.CountDTO;
+import cn.com.taiji.entity.FusionNewShipJsonDTO;
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.service.BeidouAnalySisService;
+import cn.com.taiji.utils.DateUtils;
+import cn.com.taiji.vo.ExportVo;
+import com.alibaba.fastjson.JSON;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * @author chenfangchao
+ * @title: BeidouAnalySisServiceImpl
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 10:59 AM
+ */
+@Service
+public class BeidouAnalySisServiceImpl implements BeidouAnalySisService {
+
+    @Autowired
+    private RestHighLevelClient restHighLevelClient;
+
+    @Override
+    public List<ExportVo> export(QueryVo query) {
+        ArrayList<String> result = new ArrayList<>();
+        List<String> beidouList = new ArrayList<>();
+        IdentityHashMap<String, CountDTO> idenNewStringMap = new IdentityHashMap<>();
+        String time = DateUtils.format(new Date(), "yyyy-MM-dd");
+        SearchRequest searchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_TRACK_BEIDOU + time);
+        // 构建查询条件
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("sendTime").gte(query.getStartTime()).lte(query.getEndTime()));
+        searchSourceBuilder.query(boolQueryBuilder);
+        searchRequest.source(searchSourceBuilder);
+        try {
+            SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = search.getHits().getHits();
+            for (SearchHit hit : hits) {
+                String sourceAsString = hit.getSourceAsString();
+                BeidouShipTrackDTO object = JSON.parseObject(sourceAsString, BeidouShipTrackDTO.class);
+                //存储北斗
+                beidouList.add(object.getDeviceId());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        //融合
+        SearchRequest fusionSearchRequest = new SearchRequest((EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time));
+        // 构建查询条件
+        BoolQueryBuilder fusionBoolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder fusionSearchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
+        fusionSearchSourceBuilder.query(fusionBoolQueryBuilder);
+        fusionSearchRequest.source(fusionSearchSourceBuilder);
+        try {
+            SearchResponse fusionSearch = restHighLevelClient.search(fusionSearchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = fusionSearch.getHits().getHits();
+            for (SearchHit hit : hits) {
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+                String mergeTarget = (String) sourceAsMap.get("merge_target");
+                String targetSource = (String) sourceAsMap.get("targetSource");
+                List<FusionNewShipJsonDTO> targetSourceList = JSON.parseArray(targetSource, FusionNewShipJsonDTO.class);
+                for (FusionNewShipJsonDTO item : targetSourceList) {
+                    if (null != item) {
+                        if (null != item.getType() && "BEIDOU".equals(item.getType())) {
+                            if(idenNewStringMap.get(item.getTrackId()) != null){
+                                CountDTO countDTO = idenNewStringMap.get(item.getTrackId());
+                                countDTO.setCount(countDTO.getCount()+1);
+                                List<String> data = countDTO.getData();
+                                if(!data.contains(mergeTarget)){
+                                    data.add(mergeTarget);
+                                    countDTO.setData(data);
+                                }
+                                idenNewStringMap.put(item.getTrackId(),countDTO);
+                            }else {
+                                ArrayList<String> list = new ArrayList<>();
+                                list.add(mergeTarget);
+                                idenNewStringMap.put(item.getTrackId(),new CountDTO(1,list));
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        //遍历北斗数据、找到在一条北斗在融合中有两个不同mergeTarget的融合数据
+        for (String key : beidouList) {
+            //计算key在map中的数量,大于1则拿出map中的mergeTarget
+            CountDTO countDTO = idenNewStringMap.get(key);
+            if(countDTO.getCount() > 1){
+                List<String> data = countDTO.getData();
+                result.addAll(data);
+            }
+        }
+        //导出融合数据
+        SearchRequest exportFusionSearchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time);
+        SearchSourceBuilder exportSearchSourceBuilder = new SearchSourceBuilder();
+        exportSearchSourceBuilder.query(QueryBuilders.termsQuery("mergeTime",result));
+        exportFusionSearchRequest.source(exportSearchSourceBuilder);
+        List<ExportVo> data = new ArrayList<>();
+        try {
+            SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = response.getHits().getHits();
+            for (SearchHit hit : hits) {
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+                String mergeTarget = (String) sourceAsMap.get("merge_target");
+                String targetSource = (String) sourceAsMap.get("targetSource");
+                ExportVo tianaoVo = new ExportVo();
+                tianaoVo.setMergeTarget(mergeTarget);
+                tianaoVo.setStartTime(targetSource);
+                data.add(tianaoVo);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+}

+ 7 - 0
beidou-analysis/src/main/resources/application-prod.yml

@@ -0,0 +1,7 @@
+taiji:
+  elasticsearch.rest:
+    uris: 74.10.28.65:9200,74.10.28.65:9201,74.10.28.65:9202,74.10.28.66:9200,74.10.28.66:9201,74.10.28.66:9202,74.10.28.67:9200,74.10.28.67:9201,74.10.28.67:9202,74.10.28.68:9200,74.10.28.68:9201,74.10.28.68:9202,74.10.28.69:9200,74.10.28.69:9201,74.10.28.69:9202
+    username: ax_seat       #如果你设置了基于x-pack的验证就要填写账号和密码
+    password: ax_seat       #没有则不用配置
+    connection-timeout: 100 #连接超时
+    max-connection: 100  #最大连接数

+ 10 - 0
beidou-analysis/src/main/resources/application.yml

@@ -0,0 +1,10 @@
+server:
+  port: 9002
+
+taiji:
+  elasticsearch.rest:
+    uris: 120.25.233.10:9200
+    username: elastic       #如果你设置了基于x-pack的验证就要填写账号和密码
+    password: root@2022!       #没有则不用配置
+    connection-timeout: 100 #连接超时
+    max-connection: 100  #最大连接数

+ 17 - 0
es-track-common/pom.xml

@@ -57,6 +57,23 @@
             <version>2.14.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.60</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.0.3</version>
+        </dependency>
 
     </dependencies>
 

+ 15 - 0
es-track-common/src/main/java/cn/com/taiji/constants/TopicConstants.java

@@ -0,0 +1,15 @@
+package cn.com.taiji.constants;
+
+/**
+ * @author chenfangchao
+ * @title: TopicConstans
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:22 PM
+ */
+public class TopicConstants {
+
+    public static final String BEIDOU_TOPIC = "taiji_ax_beidou_dynamic_ship";
+
+    public static final String GLOBAL_AIS = "taiji_ax_ztpt_dynamic_ais";
+}

+ 32 - 0
es-track-common/src/main/java/cn/com/taiji/entity/BeidouShipTrackDTO.java

@@ -0,0 +1,32 @@
+package cn.com.taiji.entity;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class BeidouShipTrackDTO implements Serializable {
+
+    private static final long serialVersionUID = -8983779632713666636L;
+
+    private String time;
+    private Long trackId;
+    private String deviceId;
+    private Long shipType;
+    private Long workType;
+    private Integer workWay;
+    private String sendTime;
+    private String locationTime;
+    private Integer online;
+    private Integer shipLength;
+    private Integer shipWidth;
+    private Integer texture;
+    private Double longitude;
+    private Double latitude;
+    private Double direction;
+    private Double speed;
+    private Integer kwh;
+    private String shipName;
+}

+ 26 - 0
es-track-common/src/main/java/cn/com/taiji/entity/CountDTO.java

@@ -0,0 +1,26 @@
+package cn.com.taiji.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: Count
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 3:42 PM
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class CountDTO implements Serializable {
+    private static final long serialVersionUID = 4984753519417414138L;
+
+    private Integer count;
+
+    private List<String> data;
+}

+ 212 - 0
es-track-common/src/main/java/cn/com/taiji/entity/FusionBaseEntity.java

@@ -0,0 +1,212 @@
+package cn.com.taiji.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: FusionBaseEntity
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/6 8:03 PM
+ */
+@Data
+public class FusionBaseEntity implements Serializable {
+    private static final long serialVersionUID = 9164079715828741429L;
+
+    /**
+     * 融合主键
+     **/
+    private String mergeId;
+
+    /**
+     * 融合时间
+     **/
+    private String mergeTime;
+
+    /**
+     * 融合目标唯一标识
+     **/
+    private String mergeTarget;
+
+    /**
+     * 国籍
+     **/
+    private String targetNationality;
+
+    /**
+     * 船舶类型
+     **/
+    private String targetShipType;
+
+    /**
+     * 融合目标名称(中文)
+     **/
+    private String targetName;
+
+    /**
+     * 融合目标名称(英文)
+     **/
+    private String targetNameEn;
+
+    /**
+     * 目标经度
+     **/
+    private Double targetLongitude;
+
+    /**
+     * 目标纬度
+     **/
+    private Double targetLatitude;
+
+    /**
+     * 目标航向
+     **/
+    private Double targetCourse;
+
+    /**
+     * 目标速度
+     **/
+    private Double targetSpeed;
+
+    /**
+     * 目标艏向
+     **/
+    private Double targetHeading;
+
+    /**
+     * 当前转向率
+     **/
+    private Double targetRot;
+
+    /**
+     * 当前最大吃水
+     **/
+    private Double targetDraught;
+
+    /**
+     * 目标状态
+     **/
+    private Integer targetState;
+
+    /**
+     * 目标分类
+     **/
+    private Integer targetType;
+
+    /**
+     * 目标长度
+     */
+    private String targetLength;
+
+    /**
+     * 目标(航迹)可信度
+     **/
+    private Integer targetTypeReliability;
+
+    /**
+     * 航迹状态
+     **/
+    private Integer targetTrackState;
+
+    /**
+     * 目标持续时长
+     **/
+    private Long targetTrackTime;
+
+    /**
+     * 融合关联子源信息(最新)
+     **/
+    private List<FusionNewShipJsonDTO> targetSource;
+
+
+    private String  targetSourceJson;
+
+
+    /**
+     * 在港状态
+     **/
+    private Integer portState;
+
+    /**
+     * 港口id
+     **/
+    private String portId;
+
+    /**
+     * 加油状态
+     **/
+    private Integer refueledState;
+
+    /**
+     * 加油区域id
+     **/
+    private String refueledAreaId;
+
+    /**
+     * 加冰/加水状态
+     **/
+    private Integer supplyIceWaterState;
+
+    /**
+     * 加冰/加水区域id
+     **/
+    private String supplyIceWaterAreaId;
+
+    /**
+     * 在航状态
+     **/
+    private Integer motionState;
+
+
+    /**
+     * 海兰信光电跟踪ID
+     */
+    private String targetMonitorId;
+
+    private String monitorId;
+
+    /**
+     * 地图筛选专用字段
+     */
+    private Integer gisNationality;
+
+
+    /**
+     * 地图筛选专用字段
+     */
+    private Integer gisShipType;
+
+
+    /**
+     * 轨迹设备编码
+     */
+    private String  trackDeviceNo;
+
+    /**
+     * 融合类型
+     */
+    private String mergeType;
+
+
+    private String sClass;
+
+
+    /** 是否被关注 0未关注 1已关注**/
+    private Integer focus = 0;
+
+    /** 是否为重点 0否 1是 **/
+    private Integer fokey = 0;
+
+    /** 关注颜色 **/
+    private String focusColor = "";
+
+    /** 用户id **/
+    private String focusUserId = "";
+
+    /** 位置 **/
+    private String location;
+}
+

+ 29 - 0
es-track-common/src/main/java/cn/com/taiji/entity/FusionNewShipJsonDTO.java

@@ -0,0 +1,29 @@
+package cn.com.taiji.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author chenfangchao
+ * @title: FusionNewShipJsonDTO
+ * @projectName ax-geomesa-redis
+ * @description: TODO
+ * @date 2022/11/15 6:44 PM
+ */
+@Data
+public class FusionNewShipJsonDTO implements Serializable {
+
+    private static final long serialVersionUID = -615399293072238261L;
+
+    private String sourceId;
+
+    private String type;
+
+    private String trackId;
+
+    private String trackDeviceNo;
+
+    private String sourceTime;
+
+}

+ 25 - 0
es-track-common/src/main/java/cn/com/taiji/entity/GlobalAisTrackDTO.java

@@ -0,0 +1,25 @@
+package cn.com.taiji.entity;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class GlobalAisTrackDTO implements Serializable {
+
+    private static final long serialVersionUID = 7817585048163272316L;
+    private String userid;
+    private String receiveTime;
+    private String messageid;
+    private String navStatus;
+    private String rot;
+    private String sog;
+    private Double longitude;
+    private Double latitude;
+    private String cog;
+    private String trueHeading;
+    private String dsource;
+
+    private String location;
+}

+ 25 - 0
es-track-common/src/main/java/cn/com/taiji/entity/Location.java

@@ -0,0 +1,25 @@
+package cn.com.taiji.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author chenfangchao
+ * @title: Location
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:45 PM
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Location implements Serializable {
+    private static final long serialVersionUID = 7635781718824272160L;
+
+    private Double log;
+
+    private Double lat;
+}

+ 21 - 0
es-track-common/src/main/java/cn/com/taiji/entity/QueryVo.java

@@ -0,0 +1,21 @@
+package cn.com.taiji.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author chenfangchao
+ * @title: QueryVo
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/6 6:09 PM
+ */
+@Data
+public class QueryVo implements Serializable {
+    private static final long serialVersionUID = -2648592247382866257L;
+
+    private String startTime;
+
+    private String endTime;
+}

fusion-analysis/src/main/java/cn/com/taiji/utils/DateUtils.java → es-track-common/src/main/java/cn/com/taiji/utils/DateUtils.java


+ 91 - 0
es-track-common/src/main/java/cn/com/taiji/utils/ExcelUtils.java

@@ -0,0 +1,91 @@
+package cn.com.taiji.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import org.apache.poi.util.IOUtils;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * Excel工具类
+ */
+@Slf4j
+public class ExcelUtils {
+
+    /**
+     * 导出Excel(07版.xlsx)到指定路径下
+     *
+     * @param path      路径
+     * @param excelName Excel名称
+     * @param sheetName sheet页名称
+     * @param clazz     Excel要转换的类型
+     * @param data      要导出的数据
+     */
+    public static void export2File(String path, String excelName, String sheetName, Class clazz, List data) {
+        String fileName = path.concat(excelName).concat(ExcelTypeEnum.XLSX.getValue());
+        EasyExcel.write(fileName, clazz).sheet(sheetName).doWrite(data);
+    }
+
+    /**
+     * 导出Excel(07版.xlsx)到web
+     *
+     * @param response  响应
+     * @param excelName Excel名称
+     * @param sheetName sheet页名称
+     * @param clazz     Excel要转换的类型
+     * @param data      要导出的数据
+     * @throws Exception
+     */
+    public static void export2Web(HttpServletResponse response, String excelName, String sheetName, Class clazz, List data) throws Exception {
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        // 这里URLEncoder.encode可以防止中文乱码
+        excelName = URLEncoder.encode(excelName, "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
+        EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(data);
+    }
+
+    /**
+     * 将指定位置指定名称的Excel导出到web
+     *
+     * @param response  响应
+     * @param path      文件路径
+     * @param excelName 文件名称
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    public static String export2Web4File(HttpServletResponse response, String path, String excelName) throws UnsupportedEncodingException {
+        File file = new File(path.concat(excelName).concat(ExcelTypeEnum.XLSX.getValue()));
+        if (!file.exists()) {
+            return "文件不存在!";
+        }
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        // 这里URLEncoder.encode可以防止中文乱码
+        excelName = URLEncoder.encode(excelName, "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
+
+        try (
+                FileInputStream in = new FileInputStream(file);
+                ServletOutputStream out = response.getOutputStream();
+        ) {
+            IOUtils.copy(in, out);
+            return "导出成功!";
+        } catch (Exception e) {
+            log.error("导出文件异常:", e);
+        }
+
+        return "导出失败!";
+    }
+
+}
+
+

+ 92 - 0
es-track-common/src/main/java/cn/com/taiji/utils/LocationUtils.java

@@ -0,0 +1,92 @@
+package cn.com.taiji.utils;
+
+import cn.com.taiji.entity.Location;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: LocationUtils
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:40 PM
+ */
+public class LocationUtils {
+
+    public static List<Location> generateLogLat(String startTime, String endTime, Double startLog, Double startLat, Double endLog, Double endLat) {
+        List<Location> list = new ArrayList<>();
+        try {
+            final int seconds = 1000;
+            //经纬度差
+            Double difflog = Math.abs(startLog - endLog);
+            Double difflat = Math.abs(startLat - endLat);
+            //相差秒数
+            long diffSeconds = diffSeconds(startTime, endTime);
+            //平均经纬度差
+            Double avgLog = difflog / diffSeconds;
+            Double avgLat = difflat / diffSeconds;
+            //开始时间时间戳
+            long startTimeStamp = dateToStamp(startTime);
+            long endTimeStamp = dateToStamp(endTime);
+            Double resLog = startLog;
+            Double resLat = startLat;
+            long startTimeStampNew = startTimeStamp + seconds;
+            //判断时间大小关系
+            if (startTimeStampNew < endTimeStamp) {
+                for (long i = startTimeStamp + seconds; i < endTimeStamp; i += seconds) {
+                    resLog = avgLog + resLog;
+                    resLat = avgLat + resLat;
+                    double bdLog = doubleDown(resLog);
+                    double bdLat = doubleDown(resLat);
+                    Location location = new Location(bdLog,bdLat);
+                    list.add(location);
+                }
+            } else {
+                for (long i = endTimeStamp + seconds; i < startTimeStampNew; i += seconds) {
+                    resLog = avgLog + resLog;
+                    resLat = avgLat + resLat;
+                    double bdLog = doubleDown(resLog);
+                    double bdLat = doubleDown(resLat);
+                    Location location = new Location(bdLog,bdLat);
+                    list.add(location);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+
+    public static double doubleDown(Double data) {
+        try {
+            BigDecimal bd = new BigDecimal(data);
+            double res = bd.setScale(7, BigDecimal.ROUND_DOWN).doubleValue();
+            return res;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    public static long dateToStamp(String time) {
+        Date date = DateUtil.parse(time);
+        long ts = date.getTime();
+        return ts;
+    }
+
+    public static long diffSeconds(String startTime,String endTime){
+        Date startDate= DateUtil.parse(startTime);
+        Date endDate=DateUtil.parse(endTime);
+        long second=DateUtil.between(startDate,endDate, DateUnit.SECOND);
+        return second;
+    }
+}
+
+

+ 28 - 0
es-track-common/src/main/java/cn/com/taiji/vo/ExportVo.java

@@ -0,0 +1,28 @@
+package cn.com.taiji.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author chenfangchao
+ * @title: TianaoVo
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 10:29 AM
+ */
+@Data
+public class ExportVo implements Serializable {
+
+    @ExcelProperty(value = {"批次号"}, index = 0)
+    private String mergeTarget;
+
+    @ExcelProperty(value = {"批次开始时间"}, index = 1)
+    private String startTime;
+
+    private String endTime;
+
+    @ExcelProperty(value = {"相同子源标识"}, index = 2)
+    private String targetSource;
+}

+ 0 - 1
fusion-analysis/src/main/java/cn/com/taiji/service/impl/FusionAnalysisServiceImpl.java

@@ -25,7 +25,6 @@ import org.elasticsearch.search.aggregations.bucket.terms.Terms;
 import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
 import org.elasticsearch.search.aggregations.metrics.ParsedTopHits;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.elasticsearch.search.sort.SortBuilder;
 import org.elasticsearch.search.sort.SortBuilders;
 import org.elasticsearch.search.sort.SortOrder;
 import org.springframework.beans.factory.annotation.Autowired;

+ 48 - 0
hlx-one-fusion-analysis/pom.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>es-track-analysis</artifactId>
+        <groupId>cn.com.taiji</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hlx-one-fusion-analysis</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.taiji</groupId>
+            <artifactId>es-track-common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <mainClass>cn.com.taiji.BeidouAnalySisApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
hlx-one-fusion-analysis/src/main/java/cn/com/taiji/HlxOneLevelApplication.java

@@ -0,0 +1,18 @@
+package cn.com.taiji;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author chenfangchao
+ * @title: HlxOneLevelApplication
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 4:54 PM
+ */
+@SpringBootApplication
+public class HlxOneLevelApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(HlxOneLevelApplication.class,args);
+    }
+}

+ 40 - 0
hlx-one-fusion-analysis/src/main/java/cn/com/taiji/controller/HlxOneLevelController.java

@@ -0,0 +1,40 @@
+package cn.com.taiji.controller;
+
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.service.HlxOneLevelService;
+import cn.com.taiji.utils.ExcelUtils;
+import cn.com.taiji.vo.ExportVo;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: HlxOneLevelController
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 4:53 PM
+ */
+@RequestMapping("/hlx")
+@RestController
+public class HlxOneLevelController {
+
+    @Autowired
+    private HlxOneLevelService hlxOneLevelService;
+
+    @PostMapping("/export")
+    public void hlx(HttpServletResponse response, @RequestBody QueryVo query) {
+        try {
+            List<ExportVo> list = hlxOneLevelService.hlx(query);
+            ExcelUtils.export2Web(response, "海兰信", "海兰信", ExportVo.class, list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 72 - 0
hlx-one-fusion-analysis/src/main/java/cn/com/taiji/entity/HlxOneLevelShipTrackDTO.java

@@ -0,0 +1,72 @@
+package cn.com.taiji.entity;
+
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @author chenfangchao
+ * @title: HxlOneLevelShipTrackDTO
+ * @projectName ax-geomesa-redis
+ * @description: TODO
+ * @date 2022/11/7 5:29 PM
+ */
+@Data
+@ToString
+public class HlxOneLevelShipTrackDTO {
+
+    /** 一级融合输出批次号 **/
+    private String targetId;
+
+    /** 雷达主站点编号,非雷达融合目标取0 **/
+    private String radarId;
+
+    /** true/false,目标是否处于预测态 **/
+    private String predicted;
+
+    /** 航速,节 **/
+    private Float speed;
+
+    /** 航向,度 **/
+    private Float course;
+
+    /** 艏向,度 **/
+    private Float heading;
+
+    /** 经度,度 **/
+    private Float longitude;
+
+    /** 纬度,度 **/
+    private Float latitude;
+
+    /** 船长 **/
+    private Double length;
+
+    /** 非AIS融合取0 **/
+    private String mmsi;
+
+    /** 0:非AIS融合,1:class A 2:class B 3:AID **/
+    private Long shipClass;
+
+    /** 0:非AIS融合,非0:AIS船型编号 **/
+    private Long shipType;
+
+    /** 船名 **/
+    private String vesselName;
+
+    /** 融合时间,utc毫秒 **/
+    private String time;
+
+
+    /**
+     * 太极应用层计算
+     */
+    private String gisShipType;
+
+    private String gisNationality;
+
+    /**
+     * 位置
+     */
+    private String location;
+}

+ 18 - 0
hlx-one-fusion-analysis/src/main/java/cn/com/taiji/service/HlxOneLevelService.java

@@ -0,0 +1,18 @@
+package cn.com.taiji.service;
+
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.vo.ExportVo;
+
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: HlxOneLevelService
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 4:53 PM
+ */
+public interface HlxOneLevelService {
+
+    List<ExportVo> hlx(QueryVo query);
+}

+ 136 - 0
hlx-one-fusion-analysis/src/main/java/cn/com/taiji/service/HlxOneLevelServiceImpl.java

@@ -0,0 +1,136 @@
+package cn.com.taiji.service;
+
+import cn.com.taiji.constants.EsIndexConstants;
+import cn.com.taiji.entity.CountDTO;
+import cn.com.taiji.entity.FusionNewShipJsonDTO;
+import cn.com.taiji.entity.HlxOneLevelShipTrackDTO;
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.utils.DateUtils;
+import cn.com.taiji.vo.ExportVo;
+import com.alibaba.fastjson.JSON;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * @author chenfangchao
+ * @title: HlxOneLevelServiceImpl
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 4:53 PM
+ */
+@Service
+public class HlxOneLevelServiceImpl implements HlxOneLevelService{
+
+    @Autowired
+    private RestHighLevelClient restHighLevelClient;
+
+    @Override
+    public List<ExportVo> hlx(QueryVo query) {
+        ArrayList<String> result = new ArrayList<>();
+        List<String> hlxList = new ArrayList<>();
+        IdentityHashMap<String, CountDTO> idenNewStringMap = new IdentityHashMap<>();
+        String time = DateUtils.format(new Date(), "yyyy-MM-dd");
+        SearchRequest searchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_HLX_FUSION_SHIP + time);
+        // 构建查询条件
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("time").gte(query.getStartTime()).lte(query.getEndTime()));
+        searchSourceBuilder.query(boolQueryBuilder);
+        searchRequest.source(searchSourceBuilder);
+        try {
+            SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = search.getHits().getHits();
+            for (SearchHit hit : hits) {
+                String sourceAsString = hit.getSourceAsString();
+                HlxOneLevelShipTrackDTO object = JSON.parseObject(sourceAsString, HlxOneLevelShipTrackDTO.class);
+                //存储海兰信
+                hlxList.add(object.getTargetId());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        //融合
+        SearchRequest fusionSearchRequest = new SearchRequest((EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time));
+        // 构建查询条件
+        BoolQueryBuilder fusionBoolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder fusionSearchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
+        fusionSearchSourceBuilder.query(fusionBoolQueryBuilder);
+        fusionSearchRequest.source(fusionSearchSourceBuilder);
+        try {
+            SearchResponse fusionSearch = restHighLevelClient.search(fusionSearchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = fusionSearch.getHits().getHits();
+            for (SearchHit hit : hits) {
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+                String mergeTarget = (String) sourceAsMap.get("merge_target");
+                String targetSource = (String) sourceAsMap.get("targetSource");
+                List<FusionNewShipJsonDTO> targetSourceList = JSON.parseArray(targetSource, FusionNewShipJsonDTO.class);
+                for (FusionNewShipJsonDTO item : targetSourceList) {
+                    if (null != item) {
+                        if (null != item.getType() && "HLX_AIS_RADAR".equals(item.getType())) {
+                            if(idenNewStringMap.get(item.getTrackId()) != null){
+                                CountDTO countDTO = idenNewStringMap.get(item.getTrackId());
+                                countDTO.setCount(countDTO.getCount()+1);
+                                List<String> data = countDTO.getData();
+                                if(!data.contains(mergeTarget)){
+                                    data.add(mergeTarget);
+                                    countDTO.setData(data);
+                                }
+                                idenNewStringMap.put(item.getTrackId(),countDTO);
+                            }else {
+                                ArrayList<String> list = new ArrayList<>();
+                                list.add(mergeTarget);
+                                idenNewStringMap.put(item.getTrackId(),new CountDTO(1,list));
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        //遍历海兰信数据、找到在一条海兰信数据在融合中有两个不同mergeTarget的融合数据
+        for (String key : hlxList) {
+            //计算key在map中的数量,大于1则拿出map中的mergeTarget
+            CountDTO countDTO = idenNewStringMap.get(key);
+            if(countDTO.getCount() > 1){
+                List<String> data = countDTO.getData();
+                result.addAll(data);
+            }
+        }
+        //导出融合数据
+        SearchRequest exportFusionSearchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time);
+        SearchSourceBuilder exportSearchSourceBuilder = new SearchSourceBuilder();
+        exportSearchSourceBuilder.query(QueryBuilders.termsQuery("mergeTime",result));
+        exportFusionSearchRequest.source(exportSearchSourceBuilder);
+        List<ExportVo> data = new ArrayList<>();
+        try {
+            SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = response.getHits().getHits();
+            for (SearchHit hit : hits) {
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+                String mergeTarget = (String) sourceAsMap.get("merge_target");
+                String targetSource = (String) sourceAsMap.get("targetSource");
+                ExportVo tianaoVo = new ExportVo();
+                tianaoVo.setMergeTarget(mergeTarget);
+                tianaoVo.setStartTime(targetSource);
+                data.add(tianaoVo);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+}

+ 7 - 0
hlx-one-fusion-analysis/src/main/resources/application-prod.yml

@@ -0,0 +1,7 @@
+taiji:
+  elasticsearch.rest:
+    uris: 74.10.28.65:9200,74.10.28.65:9201,74.10.28.65:9202,74.10.28.66:9200,74.10.28.66:9201,74.10.28.66:9202,74.10.28.67:9200,74.10.28.67:9201,74.10.28.67:9202,74.10.28.68:9200,74.10.28.68:9201,74.10.28.68:9202,74.10.28.69:9200,74.10.28.69:9201,74.10.28.69:9202
+    username: ax_seat       #如果你设置了基于x-pack的验证就要填写账号和密码
+    password: ax_seat       #没有则不用配置
+    connection-timeout: 100 #连接超时
+    max-connection: 100  #最大连接数

+ 10 - 0
hlx-one-fusion-analysis/src/main/resources/application.yml

@@ -0,0 +1,10 @@
+server:
+  port: 9001
+
+taiji:
+  elasticsearch.rest:
+    uris: 120.25.233.10:9200
+    username: elastic       #如果你设置了基于x-pack的验证就要填写账号和密码
+    password: root@2022!       #没有则不用配置
+    connection-timeout: 100 #连接超时
+    max-connection: 100  #最大连接数

+ 21 - 0
pom.xml

@@ -12,6 +12,9 @@
         <module>es-track-common</module>
         <module>tianao-analysis</module>
         <module>fusion-analysis</module>
+        <module>beidou-analysis</module>
+        <module>hlx-one-fusion-analysis</module>
+        <module>simulation-track</module>
     </modules>
 
     <properties>
@@ -20,6 +23,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>2.5.5</version>
+    </parent>
+
     <dependencies>
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -29,12 +39,23 @@
     </dependencies>
 
     <build>
+        <resources>
+            <resource>
+                <filtering>true</filtering>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+            </resource>
+        </resources>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.1</version>
                 <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
                 </configuration>
             </plugin>

+ 73 - 0
simulation-track/pom.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>es-track-analysis</artifactId>
+        <groupId>cn.com.taiji</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>simulation-track</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>kafka-clients</artifactId>
+                    <groupId>org.apache.kafka</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+            <version>2.7.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.com.taiji</groupId>
+            <artifactId>es-track-common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <mainClass>cn.com.taiji.BeidouAnalySisApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
simulation-track/src/main/java/cn/com/taiji/SimulationTrackApplication.java

@@ -0,0 +1,18 @@
+package cn.com.taiji;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author chenfangchao
+ * @title: SimulationTrackApplication
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:15 PM
+ */
+@SpringBootApplication
+public class SimulationTrackApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(SimulationTrackApplication.class,args);
+    }
+}

+ 34 - 0
simulation-track/src/main/java/cn/com/taiji/controller/SimulationTrackController.java

@@ -0,0 +1,34 @@
+package cn.com.taiji.controller;
+
+import cn.com.taiji.service.SimulationTrackService;
+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;
+
+/**
+ * @author chenfangchao
+ * @title: SimulationTrackController
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:15 PM
+ */
+@RequestMapping("/track")
+@RestController
+public class SimulationTrackController {
+
+    @Autowired
+    private SimulationTrackService simulationTrackService;
+
+
+    @GetMapping("/beidou")
+    public void beidouTrack(){
+        simulationTrackService.beidouTrack();
+    }
+
+    @GetMapping("/ais")
+    public void aisTrack(){
+        simulationTrackService.aisTrack();
+    }
+
+}

+ 15 - 0
simulation-track/src/main/java/cn/com/taiji/service/SimulationTrackService.java

@@ -0,0 +1,15 @@
+package cn.com.taiji.service;
+
+/**
+ * @author chenfangchao
+ * @title: SimulationTrackService
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:16 PM
+ */
+public interface SimulationTrackService {
+
+    void beidouTrack();
+
+    void aisTrack();
+}

+ 85 - 0
simulation-track/src/main/java/cn/com/taiji/service/impl/SimulationTrackImpl.java

@@ -0,0 +1,85 @@
+package cn.com.taiji.service.impl;
+
+import cn.com.taiji.constants.TopicConstants;
+import cn.com.taiji.entity.BeidouShipTrackDTO;
+import cn.com.taiji.entity.GlobalAisTrackDTO;
+import cn.com.taiji.entity.Location;
+import cn.com.taiji.service.SimulationTrackService;
+import cn.com.taiji.utils.LocationUtils;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: SimulationTrackImpl
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/7 5:16 PM
+ */
+@Service
+public class SimulationTrackImpl implements SimulationTrackService {
+
+
+    @Resource
+    private KafkaTemplate<String, Object> kafkaTemplate;
+
+
+    public static void main(String[] args) {
+        List<Location> list = LocationUtils.generateLogLat("2023-02-03 00:00:00", "2023-02-03 00:02:00", 109.287806, 19.718716, 101.287806, 19.918716);
+    }
+
+    @Override
+    public void beidouTrack() {
+        List<Location> list = LocationUtils.generateLogLat("2023-02-03 00:00:00", "2023-02-03 00:02:00", 109.287806, 19.718716, 101.287806, 20.918716);
+        for (Location location : list) {
+            BeidouShipTrackDTO beidouShipTrackDTO = new BeidouShipTrackDTO();
+            beidouShipTrackDTO.setTrackId(20236688L);
+            beidouShipTrackDTO.setTime(DateUtil.now());
+            beidouShipTrackDTO.setDeviceId("2023111,2023222");
+            beidouShipTrackDTO.setShipType(1L);
+            beidouShipTrackDTO.setWorkType(1L);
+            beidouShipTrackDTO.setWorkWay(1);
+            beidouShipTrackDTO.setSendTime(DateUtil.now());
+            beidouShipTrackDTO.setLocationTime(DateUtil.now());
+            beidouShipTrackDTO.setOnline(1);
+            beidouShipTrackDTO.setShipLength(1);
+            beidouShipTrackDTO.setShipWidth(1);
+            beidouShipTrackDTO.setTexture(1);
+            beidouShipTrackDTO.setDirection(1D);
+            beidouShipTrackDTO.setSpeed(1D);
+            beidouShipTrackDTO.setKwh(1);
+            beidouShipTrackDTO.setShipName("模拟北斗船舶");
+            beidouShipTrackDTO.setLatitude(location.getLat());
+            beidouShipTrackDTO.setLongitude(location.getLog());
+            String data = JSONUtil.toJsonStr(beidouShipTrackDTO);
+            kafkaTemplate.send(TopicConstants.BEIDOU_TOPIC,data);
+        }
+    }
+
+    @Override
+    public void aisTrack() {
+        List<Location> list = LocationUtils.generateLogLat("2023-02-03 00:00:00", "2023-02-03 00:02:00", 101.287806, 20.718716, 101.387806, 20.818716);
+        for (Location location : list) {
+            GlobalAisTrackDTO globalAisTrackDTO = new GlobalAisTrackDTO();
+            globalAisTrackDTO.setUserid("2023111,2023222");
+            globalAisTrackDTO.setReceiveTime(DateUtil.now());
+            globalAisTrackDTO.setMessageid("2023");
+            globalAisTrackDTO.setNavStatus("1");
+            globalAisTrackDTO.setRot("1");
+            globalAisTrackDTO.setSog("1");
+            globalAisTrackDTO.setCog("1");
+            globalAisTrackDTO.setTrueHeading("1");
+            globalAisTrackDTO.setDsource("1");
+            globalAisTrackDTO.setLongitude(location.getLog());
+            globalAisTrackDTO.setLatitude(location.getLat());
+            String data = JSONUtil.toJsonStr(globalAisTrackDTO);
+            kafkaTemplate.send(TopicConstants.GLOBAL_AIS,data);
+        }
+    }
+    
+}

+ 58 - 0
simulation-track/src/main/resources/application-prod.yml

@@ -0,0 +1,58 @@
+spring:
+  kafka:
+    bootstrap-servers: kafka67:9094,kafka68:9094,kafka69:9094,kafka70:9094,kafka71:9094
+    #ip 74.10.28.67:9094,74.10.28.68:9094,74.10.28.69:9094,74.10.28.70:9094,74.10.28.71:9094
+    #bootstrap-servers: localhost:9092
+    producer:
+      retries: 3
+      batch-size: 16384
+      buffer-memory: 33554432
+      key-serializer: org.apache.kafka.common.serialization.StringSerializer
+      value-serializer: org.apache.kafka.common.serialization.StringSerializer
+      # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
+      # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
+      # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
+      acks: 1
+    consumer:
+      # 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
+      auto-commit-interval: 1S
+      # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
+      # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
+      # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
+      auto-offset-reset: latest
+      # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
+      enable-auto-commit: false
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+    properties:
+      security:
+        protocol: SASL_PLAINTEXT
+      sasl:
+        mechanism: SCRAM-SHA-512
+        jaas:
+          config: 'org.apache.kafka.common.security.scram.ScramLoginModule required username="user01" password="user01";'
+    listener:
+      # 在侦听器容器中运行的线程数。
+      concurrency: 5
+      #listner负责ack,每调用一次,就立即commit
+      ack-mode: manual_immediate
+      missing-topics-fatal: false
+
+taiji:
+  kafka.consumer:
+    beidou:
+      enable: false
+      expiry: 70
+      topic: taiji_ax_beidou_dynamic_ship
+      group: taiji_ax_beidou_dynamic_ship—${random.uuid}
+    global-ais:
+      enable: false
+      expiry: 10
+      topic: taiji_ax_ztpt_dynamic_ais
+    prefix:
+      trake_user_prefix: trake_user_prefix_
+      trake_dept_prefix: trake_dept_prefix_
+      ship_borne_terminal_redis_key_prefix: ship_borne_terminal_
+      static_beidou_law_enforcement_ship_redis_key_prefix: STATIC_BEIDOU_LAW_ENFORCEMENT_SHIP_
+      static_police_man_track_redis_key_prefix: STATIC_POLICE_MAN_TRACK_REDIS_
+      static_law_enforcement_car_redis_key_prefix: STATIC_LAW_ENFORCEMENT_CAR_

+ 53 - 0
simulation-track/src/main/resources/application.yml

@@ -0,0 +1,53 @@
+server:
+  port: 9003
+
+spring:
+  ##kafka
+  kafka:
+    bootstrap-servers: 120.25.232.213:9092
+    consumer:
+      auto-commit-interval: 1S
+        # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
+        # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
+        # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
+        # 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
+        # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
+      # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
+      # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
+      auto-offset-reset: latest
+      # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
+      enable-auto-commit: false
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+    producer:
+      retries: 3
+      batch-size: 16384
+      buffer-memory: 33554432
+      key-serializer: org.apache.kafka.common.serialization.StringSerializer
+      value-serializer: org.apache.kafka.common.serialization.StringSerializer
+      # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
+      # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
+      # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
+      acks: 1
+    properties:
+      security:
+        protocol: SASL_PLAINTEXT
+      sasl:
+        mechanism: SCRAM-SHA-512
+        jaas:
+          config: 'org.apache.kafka.common.security.scram.ScramLoginModule required username="user01" password="user01";'
+    listener:
+      # 在侦听器容器中运行的线程数。
+      concurrency: 5
+      #listner负责ack,每调用一次,就立即commit
+      ack-mode: manual_immediate
+      missing-topics-fatal: false
+
+
+taiji:
+  elasticsearch.rest:
+    uris: 120.25.233.10:9200
+    username: elastic       #如果你设置了基于x-pack的验证就要填写账号和密码
+    password: root@2022!       #没有则不用配置
+    connection-timeout: 100 #连接超时
+    max-connection: 100  #最大连接数

+ 34 - 0
tianao-analysis/pom.xml

@@ -22,6 +22,40 @@
             <artifactId>es-track-common</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.46</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis</artifactId>
+            <version>3.5.9</version>
+        </dependency>
+
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <mainClass>cn.com.taiji.BeidouAnalySisApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>

+ 40 - 0
tianao-analysis/src/main/java/cn/com/taiji/controller/TianaoRadarController.java

@@ -0,0 +1,40 @@
+package cn.com.taiji.controller;
+
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.service.TianaoService;
+import cn.com.taiji.utils.ExcelUtils;
+import cn.com.taiji.vo.ExportVo;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: TianaoRadarController
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/6 5:49 PM
+ */
+@RequestMapping("/tianao")
+@RestController
+public class TianaoRadarController {
+
+
+    @Autowired
+    private TianaoService tianaoService;
+
+    @PostMapping("/export")
+    public void tianaRader(HttpServletResponse response, @RequestBody QueryVo query) {
+        try {
+            List<ExportVo> list = tianaoService.tianaRader(query);
+            ExcelUtils.export2Web(response, "天奥", "天奥", ExportVo.class, list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 0 - 17
tianao-analysis/src/main/java/cn/com/taiji/dto/TianaoRadar.java

@@ -1,17 +0,0 @@
-package cn.com.taiji.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author chenfangchao
- * @title: TianaoRadar
- * @projectName es-track-analysis
- * @description: TODO
- * @date 2023/2/6 5:38 PM
- */
-@Data
-public class TianaoRadar implements Serializable {
-    private static final long serialVersionUID = -8434894021166439952L;
-}

+ 36 - 0
tianao-analysis/src/main/java/cn/com/taiji/entity/TianaoRadar.java

@@ -0,0 +1,36 @@
+package cn.com.taiji.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author chenfangchao
+ * @title: TianaoRadar
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/6 5:38 PM
+ */
+@Data
+public class TianaoRadar implements Serializable {
+    private static final long serialVersionUID = -8434894021166439952L;
+    private String id;
+    private String shipId;
+    private String fusionTime;
+    private String location;
+    private String shiptracktime;
+    private String shipName;
+    private String fusionBatchNum;
+    private String altitude;
+    private String course;
+    private String longitude;
+    private String radarCode;
+    private String receiveTime;
+    private String reliability;
+    private String speed;
+    private String targetSize;
+    private String traceState;
+    private String collectTime;
+    private String shipTrack;
+    private String targetProper;
+}

+ 18 - 0
tianao-analysis/src/main/java/cn/com/taiji/service/TianaoService.java

@@ -0,0 +1,18 @@
+package cn.com.taiji.service;
+
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.vo.ExportVo;
+
+import java.util.List;
+
+/**
+ * @author chenfangchao
+ * @title: TianaoService
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/6 5:53 PM
+ */
+public interface TianaoService {
+
+    List<ExportVo> tianaRader(QueryVo query);
+}

+ 138 - 0
tianao-analysis/src/main/java/cn/com/taiji/service/impl/TianaoServiceImpl.java

@@ -0,0 +1,138 @@
+package cn.com.taiji.service.impl;
+
+import cn.com.taiji.constants.EsIndexConstants;
+import cn.com.taiji.entity.CountDTO;
+import cn.com.taiji.entity.FusionNewShipJsonDTO;
+import cn.com.taiji.entity.QueryVo;
+import cn.com.taiji.entity.TianaoRadar;
+import cn.com.taiji.service.TianaoService;
+import cn.com.taiji.utils.DateUtils;
+import cn.com.taiji.vo.ExportVo;
+import com.alibaba.fastjson.JSON;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * @author chenfangchao
+ * @title: TianaoServiceImpl
+ * @projectName es-track-analysis
+ * @description: TODO
+ * @date 2023/2/6 5:53 PM
+ */
+@Service
+public class TianaoServiceImpl implements TianaoService {
+
+    @Autowired
+    private RestHighLevelClient restHighLevelClient;
+
+
+    @Override
+    public List<ExportVo> tianaRader(QueryVo query) {
+        ArrayList<String> result = new ArrayList<>();
+        List<String> tianaoRadarList = new ArrayList<>();
+        IdentityHashMap<String, CountDTO> idenNewStringMap = new IdentityHashMap<>();
+        String time = DateUtils.format(new Date(), "yyyy-MM-dd");
+        SearchRequest searchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_TRACK_RADAR + time);
+        // 构建查询条件
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("fusionTime").gte(query.getStartTime()).lte(query.getEndTime()));
+        searchSourceBuilder.query(boolQueryBuilder);
+        searchRequest.source(searchSourceBuilder);
+        try {
+            SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = search.getHits().getHits();
+            for (SearchHit hit : hits) {
+                String sourceAsString = hit.getSourceAsString();
+                TianaoRadar object = JSON.parseObject(sourceAsString, TianaoRadar.class);
+                //存储天奥
+                tianaoRadarList.add(object.getFusionBatchNum());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        //融合
+        SearchRequest fusionSearchRequest = new SearchRequest((EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time));
+        // 构建查询条件
+        BoolQueryBuilder fusionBoolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder fusionSearchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
+        fusionSearchSourceBuilder.query(fusionBoolQueryBuilder);
+        fusionSearchRequest.source(fusionSearchSourceBuilder);
+        try {
+            SearchResponse fusionSearch = restHighLevelClient.search(fusionSearchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = fusionSearch.getHits().getHits();
+            for (SearchHit hit : hits) {
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+                String mergeTarget = (String) sourceAsMap.get("merge_target");
+                String targetSource = (String) sourceAsMap.get("targetSource");
+                List<FusionNewShipJsonDTO> targetSourceList = JSON.parseArray(targetSource, FusionNewShipJsonDTO.class);
+                for (FusionNewShipJsonDTO item : targetSourceList) {
+                    if (null != item) {
+                        if (null != item.getType() && "TA_RADAR".equals(item.getType())) {
+                            if(idenNewStringMap.get(item.getTrackId()) != null){
+                                CountDTO countDTO = idenNewStringMap.get(item.getTrackId());
+                                countDTO.setCount(countDTO.getCount()+1);
+                                List<String> data = countDTO.getData();
+                                if(!data.contains(mergeTarget)){
+                                    data.add(mergeTarget);
+                                    countDTO.setData(data);
+                                }
+                                idenNewStringMap.put(item.getTrackId(),countDTO);
+                            }else {
+                                ArrayList<String> list = new ArrayList<>();
+                                list.add(mergeTarget);
+                                idenNewStringMap.put(item.getTrackId(),new CountDTO(1,list));
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        //遍历天奥数据、找到在一条天奥数据在融合中有两个不同mergeTarget的融合数据
+        for (String key : tianaoRadarList) {
+            //计算key在map中的数量,大于1则拿出map中的mergeTarget
+            CountDTO countDTO = idenNewStringMap.get(key);
+            if(countDTO.getCount() > 1){
+                List<String> data = countDTO.getData();
+                result.addAll(data);
+            }
+        }
+        //导出融合数据
+        SearchRequest exportFusionSearchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time);
+        SearchSourceBuilder exportSearchSourceBuilder = new SearchSourceBuilder();
+        exportSearchSourceBuilder.query(QueryBuilders.termsQuery("mergeTime",result));
+        exportFusionSearchRequest.source(exportSearchSourceBuilder);
+        List<ExportVo> data = new ArrayList<>();
+        try {
+            SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = response.getHits().getHits();
+            for (SearchHit hit : hits) {
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+                String mergeTarget = (String) sourceAsMap.get("merge_target");
+                String targetSource = (String) sourceAsMap.get("targetSource");
+                ExportVo tianaoVo = new ExportVo();
+                tianaoVo.setMergeTarget(mergeTarget);
+                tianaoVo.setStartTime(targetSource);
+                data.add(tianaoVo);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+}

+ 1 - 1
tianao-analysis/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8081
+  port: 9003
 
 taiji:
   elasticsearch.rest:

+ 2 - 0
tianao-analysis/target/classes/application.yml

@@ -0,0 +1,2 @@
+server:
+  port: 9003