|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|