HlxOneLevelServiceImpl.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package cn.com.taiji.service;
  2. import cn.com.taiji.constants.EsIndexConstants;
  3. import cn.com.taiji.entity.CountDTO;
  4. import cn.com.taiji.entity.FusionNewShipJsonDTO;
  5. import cn.com.taiji.entity.HlxOneLevelShipTrackDTO;
  6. import cn.com.taiji.entity.QueryVo;
  7. import cn.com.taiji.utils.DateUtils;
  8. import cn.com.taiji.vo.ExportVo;
  9. import com.alibaba.fastjson.JSON;
  10. import org.elasticsearch.action.search.SearchRequest;
  11. import org.elasticsearch.action.search.SearchResponse;
  12. import org.elasticsearch.client.RequestOptions;
  13. import org.elasticsearch.client.RestHighLevelClient;
  14. import org.elasticsearch.index.query.BoolQueryBuilder;
  15. import org.elasticsearch.index.query.QueryBuilders;
  16. import org.elasticsearch.search.SearchHit;
  17. import org.elasticsearch.search.builder.SearchSourceBuilder;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import java.io.IOException;
  21. import java.util.*;
  22. /**
  23. * @author chenfangchao
  24. * @title: HlxOneLevelServiceImpl
  25. * @projectName es-track-analysis
  26. * @description: TODO
  27. * @date 2023/2/7 4:53 PM
  28. */
  29. @Service
  30. public class HlxOneLevelServiceImpl implements HlxOneLevelService{
  31. @Autowired
  32. private RestHighLevelClient restHighLevelClient;
  33. @Override
  34. public List<ExportVo> hlx(QueryVo query) {
  35. ArrayList<String> result = new ArrayList<>();
  36. List<String> hlxList = new ArrayList<>();
  37. IdentityHashMap<String, CountDTO> idenNewStringMap = new IdentityHashMap<>();
  38. String time = DateUtils.format(new Date(), "yyyy-MM-dd");
  39. SearchRequest searchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_HLX_FUSION_SHIP + time);
  40. // 构建查询条件
  41. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  42. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  43. boolQueryBuilder.filter(QueryBuilders.rangeQuery("time").gte(query.getStartTime()).lte(query.getEndTime()));
  44. searchSourceBuilder.query(boolQueryBuilder);
  45. searchRequest.source(searchSourceBuilder);
  46. try {
  47. SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  48. SearchHit[] hits = search.getHits().getHits();
  49. for (SearchHit hit : hits) {
  50. String sourceAsString = hit.getSourceAsString();
  51. HlxOneLevelShipTrackDTO object = JSON.parseObject(sourceAsString, HlxOneLevelShipTrackDTO.class);
  52. //存储海兰信
  53. hlxList.add(object.getTargetId());
  54. }
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. //融合
  59. SearchRequest fusionSearchRequest = new SearchRequest((EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time));
  60. // 构建查询条件
  61. BoolQueryBuilder fusionBoolQueryBuilder = QueryBuilders.boolQuery();
  62. SearchSourceBuilder fusionSearchSourceBuilder = new SearchSourceBuilder();
  63. boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  64. fusionSearchSourceBuilder.query(fusionBoolQueryBuilder);
  65. fusionSearchRequest.source(fusionSearchSourceBuilder);
  66. try {
  67. SearchResponse fusionSearch = restHighLevelClient.search(fusionSearchRequest, RequestOptions.DEFAULT);
  68. SearchHit[] hits = fusionSearch.getHits().getHits();
  69. for (SearchHit hit : hits) {
  70. Map<String, Object> sourceAsMap = hit.getSourceAsMap();
  71. String mergeTarget = (String) sourceAsMap.get("merge_target");
  72. String targetSource = (String) sourceAsMap.get("targetSource");
  73. List<FusionNewShipJsonDTO> targetSourceList = JSON.parseArray(targetSource, FusionNewShipJsonDTO.class);
  74. for (FusionNewShipJsonDTO item : targetSourceList) {
  75. if (null != item) {
  76. if (null != item.getType() && "HLX_AIS_RADAR".equals(item.getType())) {
  77. if(idenNewStringMap.get(item.getTrackId()) != null){
  78. CountDTO countDTO = idenNewStringMap.get(item.getTrackId());
  79. countDTO.setCount(countDTO.getCount()+1);
  80. List<String> data = countDTO.getData();
  81. if(!data.contains(mergeTarget)){
  82. data.add(mergeTarget);
  83. countDTO.setData(data);
  84. }
  85. idenNewStringMap.put(item.getTrackId(),countDTO);
  86. }else {
  87. ArrayList<String> list = new ArrayList<>();
  88. list.add(mergeTarget);
  89. idenNewStringMap.put(item.getTrackId(),new CountDTO(1,list));
  90. }
  91. }
  92. }
  93. }
  94. }
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. //遍历海兰信数据、找到在一条海兰信数据在融合中有两个不同mergeTarget的融合数据
  99. for (String key : hlxList) {
  100. //计算key在map中的数量,大于1则拿出map中的mergeTarget
  101. CountDTO countDTO = idenNewStringMap.get(key);
  102. if(countDTO.getCount() > 1){
  103. List<String> data = countDTO.getData();
  104. result.addAll(data);
  105. }
  106. }
  107. //导出融合数据
  108. SearchRequest exportFusionSearchRequest = new SearchRequest(EsIndexConstants.INDEX_SEAT_REALTIMETRAJECTORY + time);
  109. SearchSourceBuilder exportSearchSourceBuilder = new SearchSourceBuilder();
  110. exportSearchSourceBuilder.query(QueryBuilders.termsQuery("mergeTime",result));
  111. exportFusionSearchRequest.source(exportSearchSourceBuilder);
  112. List<ExportVo> data = new ArrayList<>();
  113. try {
  114. SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  115. SearchHit[] hits = response.getHits().getHits();
  116. for (SearchHit hit : hits) {
  117. Map<String, Object> sourceAsMap = hit.getSourceAsMap();
  118. String mergeTarget = (String) sourceAsMap.get("merge_target");
  119. String targetSource = (String) sourceAsMap.get("targetSource");
  120. ExportVo tianaoVo = new ExportVo();
  121. tianaoVo.setMergeTarget(mergeTarget);
  122. tianaoVo.setStartTime(targetSource);
  123. data.add(tianaoVo);
  124. }
  125. } catch (IOException e) {
  126. e.printStackTrace();
  127. }
  128. return data;
  129. }
  130. }