Browse Source

[insert]新增融合解析--识别融合数据率波动问题导出

xiahailong 2 years ago
parent
commit
c1ba28db4a

+ 1 - 0
.idea/compiler.xml

@@ -9,6 +9,7 @@
         <outputRelativeToContentRoot value="true" />
         <module name="tianao-analysis" />
         <module name="es-track-common" />
+        <module name="fusion-analysis" />
       </profile>
     </annotationProcessing>
   </component>

+ 43 - 6
.idea/workspace.xml

@@ -4,10 +4,21 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="3bf79822-fe13-41ea-bc8f-858fbea129e7" name="Changes" comment="[insert]新增prod环境配置,完善es连接配置">
+    <list default="true" id="3bf79822-fe13-41ea-bc8f-858fbea129e7" name="Changes" comment="[insert]新增融合解析--识别融合数据率波动问题导出">
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/pom.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/FusionAnalysisApplication.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/controller/FusionAnalysisController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/domain/FusionData.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/domain/FusionQuery.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/service/FusionAnalysisService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/service/impl/FusionAnalysisServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/java/cn/com/taiji/utils/DateUtils.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/resources/application-prod.yml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/fusion-analysis/src/main/resources/application.yml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/es-track-common/src/main/java/cn/com/taiji/constants/EsIndexConstants.java" beforeDir="false" afterPath="$PROJECT_DIR$/es-track-common/src/main/java/cn/com/taiji/constants/EsIndexConstants.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/es-track-common/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/es-track-common/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -29,6 +40,14 @@
     </option>
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
+  <component name="GitSEFilterConfiguration">
+    <file-type-list>
+      <filtered-out-file-type name="LOCAL_BRANCH" />
+      <filtered-out-file-type name="REMOTE_BRANCH" />
+      <filtered-out-file-type name="TAG" />
+      <filtered-out-file-type name="COMMIT_BY_MESSAGE" />
+    </file-type-list>
+  </component>
   <component name="MarkdownSettingsMigration">
     <option name="stateVersion" value="1" />
   </component>
@@ -53,18 +72,25 @@
     <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
     <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
     <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/fusion-analysis/src/main/resources" />
     <property name="node.js.detected.package.eslint" value="true" />
     <property name="node.js.detected.package.tslint" value="true" />
     <property name="node.js.selected.package.eslint" value="(autodetect)" />
     <property name="node.js.selected.package.tslint" value="(autodetect)" />
+    <property name="project.structure.last.edited" value="模块" />
+    <property name="project.structure.proportion" value="0.0" />
+    <property name="project.structure.side.proportion" value="0.0" />
     <property name="settings.editor.selected.configurable" value="MavenSettings" />
   </component>
   <component name="RebelAgentSelection">
     <selection>jr</selection>
   </component>
   <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\FusionAnalysis\fusion-analysis\src\main\resources" />
+    </key>
     <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="cn.com.taiji.utils" />
       <recent name="cn.com.taiji.config" />
     </key>
   </component>
@@ -97,7 +123,8 @@
       <option name="presentableId" value="Default" />
       <updated>1675647747556</updated>
       <workItem from="1675647750482" duration="488000" />
-      <workItem from="1675651220605" duration="1348000" />
+      <workItem from="1675651220605" duration="3438000" />
+      <workItem from="1675666106206" duration="7273000" />
     </task>
     <task id="LOCAL-00001" summary="[insert]新增prod环境配置,完善es连接配置">
       <created>1675652041715</created>
@@ -106,7 +133,14 @@
       <option name="project" value="LOCAL" />
       <updated>1675652041715</updated>
     </task>
-    <option name="localTasksCounter" value="2" />
+    <task id="LOCAL-00002" summary="[insert]新增es索引名">
+      <created>1675652628130</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1675652628130</updated>
+    </task>
+    <option name="localTasksCounter" value="3" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -122,9 +156,12 @@
         </entry>
       </map>
     </option>
+    <option name="oldMeFiltersMigrated" value="true" />
   </component>
   <component name="VcsManagerConfiguration">
     <MESSAGE value="[insert]新增prod环境配置,完善es连接配置" />
-    <option name="LAST_COMMIT_MESSAGE" value="[insert]新增prod环境配置,完善es连接配置" />
+    <MESSAGE value="[insert]新增es索引名" />
+    <MESSAGE value="[insert]新增融合解析--识别融合数据率波动问题导出" />
+    <option name="LAST_COMMIT_MESSAGE" value="[insert]新增融合解析--识别融合数据率波动问题导出" />
   </component>
 </project>

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

@@ -57,6 +57,7 @@
             <version>2.14.2</version>
         </dependency>
 
+
     </dependencies>
 
 

+ 46 - 0
fusion-analysis/pom.xml

@@ -0,0 +1,46 @@
+<?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>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>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.16.18</version>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.60</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.8</version>
+        </dependency>
+    </dependencies>
+
+
+</project>

+ 15 - 0
fusion-analysis/src/main/java/cn/com/taiji/FusionAnalysisApplication.java

@@ -0,0 +1,15 @@
+package cn.com.taiji;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author xhl
+ * @date 2023/2/6
+ */
+@SpringBootApplication
+public class FusionAnalysisApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(FusionAnalysisApplication.class,args);
+    }
+}

+ 13 - 0
fusion-analysis/src/main/java/cn/com/taiji/controller/FusionAnalysisController.java

@@ -0,0 +1,13 @@
+package cn.com.taiji.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author xhl
+ * @date 2023/2/6
+ */
+@RequestMapping("/es/fusion/analysis")
+@RestController
+public class FusionAnalysisController {
+}

+ 42 - 0
fusion-analysis/src/main/java/cn/com/taiji/domain/FusionData.java

@@ -0,0 +1,42 @@
+package cn.com.taiji.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author xhl
+ * @date 2023/2/6
+ */
+@Data
+public class FusionData {
+
+    /**
+     * 批次号
+     */
+    @ExcelProperty(index = 0,value = "批次号")
+    private String mergeTarget;
+
+    /**
+     * 批次开始时间
+     */
+    @ExcelProperty(index = 1,value = "批次开始时间")
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(index = 2,value = "结束时间")
+    private String endTime;
+
+    /**
+     * 融合轨迹点总数
+     */
+    @ExcelProperty(index = 3,value = "融合轨迹点总数")
+    private Long trackCount;
+
+    /**
+     * 波动次数
+     */
+    @ExcelProperty(index = 4,value = "波动次数")
+    private Integer fluctuateNumber;
+}

+ 17 - 0
fusion-analysis/src/main/java/cn/com/taiji/domain/FusionQuery.java

@@ -0,0 +1,17 @@
+package cn.com.taiji.domain;
+
+import lombok.Data;
+
+/**
+ * @author xhl
+ * @date 2023/2/6
+ */
+@Data
+public class FusionQuery {
+
+    private String startTime;
+
+    private String endTime;
+
+    private Integer pageSize;
+}

+ 21 - 0
fusion-analysis/src/main/java/cn/com/taiji/service/FusionAnalysisService.java

@@ -0,0 +1,21 @@
+package cn.com.taiji.service;
+
+import cn.com.taiji.domain.FusionQuery;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.ParseException;
+
+/**
+ * @author xhl
+ * @date 2023/2/6
+ */
+public interface FusionAnalysisService {
+
+    /**
+     * 识别融合数据率波动问题
+     * @param query
+     * @param response
+     */
+    void fusionMergeTimeExcelExport(FusionQuery query, HttpServletResponse response) throws IOException, ParseException;
+}

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

@@ -0,0 +1,122 @@
+package cn.com.taiji.service.impl;
+
+import cn.com.taiji.domain.FusionData;
+import cn.com.taiji.domain.FusionQuery;
+import cn.com.taiji.service.FusionAnalysisService;
+import cn.com.taiji.utils.DateUtils;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+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.SearchHits;
+import org.elasticsearch.search.aggregations.AggregationBuilders;
+import org.elasticsearch.search.aggregations.Aggregations;
+import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
+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;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static cn.com.taiji.constants.EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY;
+
+/**
+ * @author xhl
+ * @date 2023/2/6
+ */
+@Slf4j
+@Service
+public class FusionAnalysisServiceImpl implements FusionAnalysisService {
+
+    @Autowired
+    private RestHighLevelClient client;
+
+    @Override
+    public void fusionMergeTimeExcelExport(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
+        List<FusionData> list = new ArrayList<>();
+        String time = DateUtils.format(new Date(),"yyyy-MM-dd");
+        SearchRequest request = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
+        // 构建查询条件
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
+        searchSourceBuilder.query(boolQueryBuilder);
+        TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
+                .field("mergeTarget")
+                .size(query.getPageSize())
+                .subAggregation(
+                        AggregationBuilders.topHits("ship_field_agg_top1")
+                                .size(query.getPageSize())
+                                .sort(
+                                        SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
+                                )
+                );
+        searchSourceBuilder.sort("merge_time", SortOrder.ASC)
+                .trackTotalHits(true)
+                .aggregation(aggBuilder)
+                .size(query.getPageSize());
+        request.source(searchSourceBuilder);
+        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
+        Aggregations aggregations = search.getAggregations();
+        ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
+        for (Terms.Bucket bucket : aggregation.getBuckets()) {
+            FusionData data = new FusionData();
+            ParsedTopHits topHits = bucket.getAggregations().get("ship_field_agg_top1");
+            SearchHits searchHits = topHits.getHits();
+            Long value = searchHits.getTotalHits().value;
+            SearchHit[] hits = searchHits.getHits();
+            JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
+            JSONObject sourceItem2 = JSONObject.parseObject(hits[value.intValue()-1].getSourceAsString());
+            data.setMergeTarget(sourceItem.getString("mergeTarget"));
+            data.setTrackCount(value);
+            data.setStartTime(sourceItem.getString("mergeTime"));
+            data.setEndTime(sourceItem2.getString("mergeTime"));
+            Integer num = 0;
+            for (int i = 0; i < hits.length; i++) {
+                if (i != hits.length-1){
+                    Map<String, Object> map = hits[i].getSourceAsMap();
+                    Map<String, Object> map2 = hits[i+1].getSourceAsMap();
+                    Date date = DateUtils.parse(map.get("merge_time").toString(),"yyyy-MM-dd");
+                    Date date2 = DateUtils.parse(map2.get("merge_time").toString(),"yyyy-MM-dd");
+                    Long interval = date2.getTime()-date.getTime();
+                    if (interval>6500L){
+                        num++;
+                    }
+                }
+            }
+            data.setFluctuateNumber(num);
+            list.add(data);
+        }
+        try {
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            String fileName = URLEncoder.encode("识别融合数据率波动问题", "UTF-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
+            EasyExcel.write(response.getOutputStream(), FusionData.class).sheet("识别融合数据率波动问题")
+                    .doWrite(list);
+        } catch (Exception e) {
+            // 重置response
+            log.info("导出excel失败:{}" + e.getMessage() + e);
+        }
+    }
+}

+ 72 - 0
fusion-analysis/src/main/java/cn/com/taiji/utils/DateUtils.java

@@ -0,0 +1,72 @@
+package cn.com.taiji.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author xhl
+ * @date 2022/11/20
+ */
+public class DateUtils {
+    /**
+     * 常规日期时间格式,24小时制yyyy-MM-dd HH:mm:ss
+     */
+    public static final String NORMAL_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 常规日期,yyyy-MM-dd
+     **/
+    public static final String NORMAL_DATE_FORMAT = "yyyy-MM-dd";
+    /**
+     * 锁对象
+     */
+    private static final Object LOCK_OBJ = new Object();
+    /**
+     * 存放不同的日期模板格式的SimpleDateFormat的Map
+     */
+    private static Map<String, ThreadLocal<SimpleDateFormat>> threadLocalMap = new HashMap<>(8);
+    /**
+     * 返回一个ThreadLocal的SimpleDateFormat,每个线程只会new一次
+     *
+     * @param pattern
+     * @return
+     */
+    private static SimpleDateFormat getDateFormat(final String pattern) {
+        ThreadLocal<SimpleDateFormat> tl = threadLocalMap.get(pattern);
+        // 双重判断和同步,防止threadLocalMap这个单例被多次重复的SimpleDateFormat
+        if (tl == null) {
+            synchronized (LOCK_OBJ) {
+                tl = threadLocalMap.get(pattern);
+                if (tl == null) {
+                    tl = ThreadLocal.withInitial(() -> new SimpleDateFormat(pattern));
+                    threadLocalMap.put(pattern, tl);
+                }
+            }
+        }
+        return tl.get();
+    }
+    /**
+     * 日期转字符串
+     *
+     * @param date
+     * @param format
+     * @return
+     */
+    public static String format(Date date, String format) {
+        return getDateFormat(format).format(date);
+    }
+    /**
+     * 字符串转日期
+     *
+     * @param dateStr
+     * @param format
+     * @return
+     * @throws ParseException
+     */
+    public static Date parse(String dateStr, String format) throws ParseException {
+        return getDateFormat(format).parse(dateStr);
+    }
+}
+

+ 7 - 0
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  #最大连接数

+ 14 - 0
fusion-analysis/src/main/resources/application.yml

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

+ 1 - 0
pom.xml

@@ -11,6 +11,7 @@
     <modules>
         <module>es-track-common</module>
         <module>tianao-analysis</module>
+        <module>fusion-analysis</module>
     </modules>
 
     <properties>