FusionAnalysisServiceImpl.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. package cn.com.taiji.service.impl;
  2. import cn.com.taiji.domain.FusionData;
  3. import cn.com.taiji.domain.FusionQuery;
  4. import cn.com.taiji.domain.LeaveOutData;
  5. import cn.com.taiji.domain.StaticOrDynamicData;
  6. import cn.com.taiji.domain.dto.LeaceOutDto;
  7. import cn.com.taiji.service.FusionAnalysisService;
  8. import cn.com.taiji.utils.DateUtils;
  9. import com.alibaba.excel.EasyExcel;
  10. import com.alibaba.fastjson.JSONObject;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.elasticsearch.action.search.SearchRequest;
  13. import org.elasticsearch.action.search.SearchResponse;
  14. import org.elasticsearch.client.RequestOptions;
  15. import org.elasticsearch.client.RestHighLevelClient;
  16. import org.elasticsearch.index.query.BoolQueryBuilder;
  17. import org.elasticsearch.index.query.QueryBuilders;
  18. import org.elasticsearch.search.SearchHit;
  19. import org.elasticsearch.search.SearchHits;
  20. import org.elasticsearch.search.aggregations.AggregationBuilders;
  21. import org.elasticsearch.search.aggregations.Aggregations;
  22. import org.elasticsearch.search.aggregations.bucket.terms.ParsedDoubleTerms;
  23. import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
  24. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  25. import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
  26. import org.elasticsearch.search.aggregations.metrics.ParsedTopHits;
  27. import org.elasticsearch.search.builder.SearchSourceBuilder;
  28. import org.elasticsearch.search.sort.SortBuilders;
  29. import org.elasticsearch.search.sort.SortOrder;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Service;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.io.IOException;
  34. import java.net.URLEncoder;
  35. import java.text.ParseException;
  36. import java.util.ArrayList;
  37. import java.util.Date;
  38. import java.util.List;
  39. import java.util.Map;
  40. import static cn.com.taiji.constants.EsIndexConstants.*;
  41. /**
  42. * @author xhl
  43. * @date 2023/2/6
  44. */
  45. @Service
  46. public class FusionAnalysisServiceImpl implements FusionAnalysisService {
  47. @Autowired
  48. private RestHighLevelClient client;
  49. @Override
  50. public void fusionAnalysisExcelOne(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  51. List<FusionData> list = new ArrayList<>();
  52. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  53. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  54. SearchRequest request = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  55. // 构建查询条件
  56. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  57. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  58. boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  59. searchSourceBuilder.query(boolQueryBuilder);
  60. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  61. .field("mergeTarget")
  62. .size(1000000)
  63. .subAggregation(
  64. AggregationBuilders.topHits("ship_field_agg_top1")
  65. .size(100)
  66. .sort(
  67. SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
  68. )
  69. );
  70. searchSourceBuilder
  71. .trackTotalHits(true)
  72. .aggregation(aggBuilder)
  73. .size(1000000);
  74. request.source(searchSourceBuilder);
  75. SearchResponse search = client.search(request, RequestOptions.DEFAULT);
  76. Aggregations aggregations = search.getAggregations();
  77. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  78. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  79. FusionData data = new FusionData();
  80. ParsedTopHits topHits = bucket.getAggregations().get("ship_field_agg_top1");
  81. SearchHits searchHits = topHits.getHits();
  82. Long value = searchHits.getTotalHits().value;
  83. SearchHit[] hits = searchHits.getHits();
  84. JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
  85. JSONObject sourceItem2 = JSONObject.parseObject(hits[value.intValue()-1].getSourceAsString());
  86. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  87. data.setTrackCount(value);
  88. data.setStartTime(sourceItem.getString("mergeTime"));
  89. data.setEndTime(sourceItem2.getString("mergeTime"));
  90. Integer num = 0;
  91. for (int i = 0; i < hits.length; i++) {
  92. if (i != hits.length-1){
  93. Map<String, Object> map = hits[i].getSourceAsMap();
  94. Map<String, Object> map2 = hits[i+1].getSourceAsMap();
  95. Date date = DateUtils.parse(map.get("mergeTime").toString(),"yyyy-MM-dd");
  96. Date date2 = DateUtils.parse(map2.get("mergeTime").toString(),"yyyy-MM-dd");
  97. Long interval = date2.getTime()-date.getTime();
  98. if (interval>6500L){
  99. num++;
  100. }
  101. }
  102. }
  103. data.setFluctuateNumber(num);
  104. list.add(data);
  105. }
  106. try {
  107. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  108. response.setCharacterEncoding("utf-8");
  109. String fileName = URLEncoder.encode("识别融合数据率波动问题", "UTF-8");
  110. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  111. EasyExcel.write(response.getOutputStream(), FusionData.class).sheet("识别融合数据率波动问题")
  112. .doWrite(list);
  113. } catch (Exception e) {
  114. // 重置response
  115. System.out.println("导出识别融合数据率波动问题excel失败:{}" + e.getMessage() + e);
  116. }
  117. }
  118. @Override
  119. public void fusionAnalysisExcelTwo(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  120. List<FusionData> list = new ArrayList<>();
  121. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  122. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  123. SearchRequest request = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  124. // 构建查询条件
  125. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  126. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  127. boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  128. searchSourceBuilder.query(boolQueryBuilder);
  129. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  130. .field("mergeTarget")
  131. .size(1000000)
  132. .subAggregation(
  133. AggregationBuilders.terms("ship_field_agg_one")
  134. .field("targetCourse")
  135. .size(1000000)
  136. .subAggregation(
  137. AggregationBuilders.terms("ship_field_agg_two")
  138. .field("targetSpeed")
  139. .size(1000000)
  140. .subAggregation(AggregationBuilders.topHits("ship_field_agg_top1")
  141. .size(100)
  142. .sort(
  143. SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
  144. ))
  145. )
  146. );
  147. searchSourceBuilder
  148. .trackTotalHits(true)
  149. .aggregation(aggBuilder)
  150. .size(1000000);
  151. request.source(searchSourceBuilder);
  152. SearchResponse search = client.search(request, RequestOptions.DEFAULT);
  153. Aggregations aggregations = search.getAggregations();
  154. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  155. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  156. FusionData data = new FusionData();
  157. ParsedStringTerms terms = bucket.getAggregations().get("ship_field_agg_one");
  158. Integer num = 0;
  159. for (Terms.Bucket buc : terms.getBuckets()){
  160. ParsedDoubleTerms termsTwo = buc.getAggregations().get("ship_field_agg_two");
  161. for (Terms.Bucket ket : termsTwo.getBuckets()){
  162. ParsedTopHits topHit = ket.getAggregations().get("ship_field_agg_top1");
  163. SearchHits searchHit = topHit.getHits();
  164. SearchHit[] hit = searchHit.getHits();
  165. for (int i = 0; i < hit.length; i++) {
  166. if (num>2){
  167. data.setFluctuateNumber(data.getFluctuateNumber()+1);
  168. num =0;
  169. }
  170. if (i != hit.length-1){
  171. Map<String, Object> map = hit[i].getSourceAsMap();
  172. Map<String, Object> map2 = hit[i+1].getSourceAsMap();
  173. Date date = DateUtils.parse(map.get("mergeTime").toString(),"yyyy-MM-dd");
  174. Date date2 = DateUtils.parse(map2.get("mergeTime").toString(),"yyyy-MM-dd");
  175. Long interval = date2.getTime()-date.getTime();
  176. if (interval<6500L){
  177. num++;
  178. }
  179. }
  180. }
  181. }
  182. }
  183. data.setMergeTarget(bucket.getKeyAsString());
  184. data.setTrackCount(Long.valueOf(bucket.getDocCount()));
  185. data.setStartTime(query.getStartTime());
  186. data.setEndTime(query.getEndTime());
  187. list.add(data);
  188. }
  189. try {
  190. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  191. response.setCharacterEncoding("utf-8");
  192. String fileName = URLEncoder.encode("虚假推送问题", "UTF-8");
  193. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  194. EasyExcel.write(response.getOutputStream(), FusionData.class).sheet("虚假推送问题")
  195. .doWrite(list);
  196. } catch (Exception e) {
  197. // 重置response
  198. System.out.println("导出虚假推送问题excel失败:{}" + e.getMessage() + e);
  199. }
  200. }
  201. @Override
  202. public void tianAoLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  203. List<LeaveOutData> list = new ArrayList<>();
  204. List<LeaceOutDto> dtos = new ArrayList<>();
  205. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  206. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  207. SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_RADAR+time);
  208. // 构建查询条件
  209. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  210. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  211. boolQueryBuilder.filter(QueryBuilders.rangeQuery("receiveTime").gte(query.getStartTime()).lte(query.getEndTime()));
  212. searchSourceBuilder.query(boolQueryBuilder);
  213. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  214. .field("fusionBatchNum")
  215. .size(1000000);
  216. searchSourceBuilder
  217. .trackTotalHits(true)
  218. .aggregation(aggBuilder)
  219. .size(1000000);
  220. request.source(searchSourceBuilder);
  221. SearchResponse search = client.search(request, RequestOptions.DEFAULT);
  222. Aggregations aggregations = search.getAggregations();
  223. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  224. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  225. LeaceOutDto dto = new LeaceOutDto();
  226. dto.setBatchNumber(bucket.getKeyAsString());
  227. dto.setCount(Long.valueOf(bucket.getDocCount()));
  228. dtos.add(dto);
  229. }
  230. dtos.forEach(item->{
  231. LeaveOutData data = new LeaveOutData();
  232. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  233. // 构建查询条件
  234. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  235. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  236. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  237. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  238. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","RADAR","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  239. searchSourceBuilder2.query(boolQueryBuilder2)
  240. .trackTotalHits(true)
  241. .size(1000000);
  242. request2.source(searchSourceBuilder2);
  243. try {
  244. SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
  245. SearchHits searchHits = search2.getHits();
  246. Long totalHits = searchHits.getTotalHits().value;
  247. if (totalHits<5) {
  248. SearchHit[] hits = searchHits.getHits();
  249. if (hits.length > 0) {
  250. JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
  251. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  252. data.setStartTime(query.getStartTime());
  253. data.setEndTime(query.getEndTime());
  254. data.setBatchNumber(item.getBatchNumber());
  255. data.setOriginalCount(item.getCount());
  256. data.setTrackCount(totalHits);
  257. list.add(data);
  258. }
  259. }
  260. } catch (IOException e) {
  261. e.printStackTrace();
  262. }
  263. });
  264. try {
  265. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  266. response.setCharacterEncoding("utf-8");
  267. String fileName = URLEncoder.encode("天奥轨迹数据遗漏", "UTF-8");
  268. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  269. EasyExcel.write(response.getOutputStream(), LeaveOutData.class).sheet("天奥轨迹数据遗漏")
  270. .doWrite(list);
  271. } catch (Exception e) {
  272. // 重置response
  273. System.out.println("导出天奥轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
  274. }
  275. }
  276. @Override
  277. public void beiDouLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  278. List<LeaveOutData> list = new ArrayList<>();
  279. List<LeaceOutDto> dtos = new ArrayList<>();
  280. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  281. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  282. SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_BEIDOU+time);
  283. // 构建查询条件
  284. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  285. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  286. boolQueryBuilder.filter(QueryBuilders.rangeQuery("locationTime").gte(query.getStartTime()).lte(query.getEndTime()));
  287. searchSourceBuilder.query(boolQueryBuilder);
  288. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  289. .field("devideNo")
  290. .size(1000000);
  291. searchSourceBuilder
  292. .trackTotalHits(true)
  293. .aggregation(aggBuilder)
  294. .size(1000000);
  295. request.source(searchSourceBuilder);
  296. SearchResponse search = client.search(request, RequestOptions.DEFAULT);
  297. Aggregations aggregations = search.getAggregations();
  298. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  299. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  300. LeaceOutDto dto = new LeaceOutDto();
  301. dto.setBatchNumber(bucket.getKeyAsString());
  302. dto.setCount(Long.valueOf(bucket.getDocCount()));
  303. dtos.add(dto);
  304. }
  305. dtos.forEach(item->{
  306. LeaveOutData data = new LeaveOutData();
  307. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  308. // 构建查询条件
  309. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  310. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  311. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  312. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  313. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","BEIDOU","AIS_BEIDOU","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  314. searchSourceBuilder2.query(boolQueryBuilder2)
  315. .trackTotalHits(true)
  316. .size(1000000);
  317. request2.source(searchSourceBuilder2);
  318. try {
  319. SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
  320. SearchHits searchHits = search2.getHits();
  321. Long totalHits = searchHits.getTotalHits().value;
  322. if (totalHits<5) {
  323. SearchHit[] hits = searchHits.getHits();
  324. if (hits.length > 0) {
  325. JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
  326. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  327. data.setStartTime(query.getStartTime());
  328. data.setEndTime(query.getEndTime());
  329. data.setBatchNumber(item.getBatchNumber());
  330. data.setOriginalCount(item.getCount());
  331. data.setTrackCount(totalHits);
  332. list.add(data);
  333. }
  334. }
  335. } catch (IOException e) {
  336. e.printStackTrace();
  337. }
  338. });
  339. try {
  340. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  341. response.setCharacterEncoding("utf-8");
  342. String fileName = URLEncoder.encode("北斗轨迹数据遗漏", "UTF-8");
  343. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  344. EasyExcel.write(response.getOutputStream(), LeaveOutData.class).sheet("北斗轨迹数据遗漏")
  345. .doWrite(list);
  346. } catch (Exception e) {
  347. // 重置response
  348. System.out.println("导出北斗轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
  349. }
  350. }
  351. @Override
  352. public void hlxyjrhLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  353. List<LeaveOutData> list = new ArrayList<>();
  354. List<LeaceOutDto> dtos = new ArrayList<>();
  355. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  356. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  357. SearchRequest request = new SearchRequest(INDEX_SEAT_HLX_FUSION_SHIP+time);
  358. // 构建查询条件
  359. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  360. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  361. boolQueryBuilder.filter(QueryBuilders.rangeQuery("time").gte(query.getStartTime()).lte(query.getEndTime()));
  362. searchSourceBuilder.query(boolQueryBuilder);
  363. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  364. .field("targetID")
  365. .size(1000000);
  366. searchSourceBuilder
  367. .trackTotalHits(true)
  368. .aggregation(aggBuilder)
  369. .size(1000000);
  370. request.source(searchSourceBuilder);
  371. SearchResponse search = client.search(request, RequestOptions.DEFAULT);
  372. Aggregations aggregations = search.getAggregations();
  373. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  374. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  375. LeaceOutDto dto = new LeaceOutDto();
  376. dto.setBatchNumber(bucket.getKeyAsString());
  377. dto.setCount(Long.valueOf(bucket.getDocCount()));
  378. dtos.add(dto);
  379. }
  380. dtos.forEach(item->{
  381. LeaveOutData data = new LeaveOutData();
  382. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  383. // 构建查询条件
  384. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  385. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  386. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  387. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  388. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","AIS","RADAR","AIS_BEIDOU","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  389. searchSourceBuilder2.query(boolQueryBuilder2)
  390. .trackTotalHits(true)
  391. .size(1000000);
  392. request2.source(searchSourceBuilder2);
  393. try {
  394. SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
  395. SearchHits searchHits = search2.getHits();
  396. Long totalHits = searchHits.getTotalHits().value;
  397. if (totalHits<5) {
  398. SearchHit[] hits = searchHits.getHits();
  399. if (hits.length > 0) {
  400. JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
  401. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  402. data.setStartTime(query.getStartTime());
  403. data.setEndTime(query.getEndTime());
  404. data.setBatchNumber(item.getBatchNumber());
  405. data.setOriginalCount(item.getCount());
  406. data.setTrackCount(totalHits);
  407. list.add(data);
  408. }
  409. }
  410. } catch (IOException e) {
  411. e.printStackTrace();
  412. }
  413. });
  414. try {
  415. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  416. response.setCharacterEncoding("utf-8");
  417. String fileName = URLEncoder.encode("海兰信1级融合轨迹数据遗漏", "UTF-8");
  418. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  419. EasyExcel.write(response.getOutputStream(), LeaveOutData.class).sheet("海兰信1级融合轨迹数据遗漏")
  420. .doWrite(list);
  421. } catch (Exception e) {
  422. // 重置response
  423. System.out.println("导出海兰信1级融合轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
  424. }
  425. }
  426. @Override
  427. public void tianaoStaticOrDynamicLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  428. List<StaticOrDynamicData> list = new ArrayList<>();
  429. List<LeaceOutDto> dtos = new ArrayList<>();
  430. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  431. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  432. SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_RADAR+time);
  433. // 构建查询条件
  434. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  435. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  436. boolQueryBuilder.filter(QueryBuilders.rangeQuery("receiveTime").gte(query.getStartTime()).lte(query.getEndTime()));
  437. boolQueryBuilder.filter(QueryBuilders.termQuery("targetProper","1"));
  438. searchSourceBuilder.query(boolQueryBuilder);
  439. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  440. .field("fusionBatchNum")
  441. .size(1000000);
  442. searchSourceBuilder
  443. .trackTotalHits(true)
  444. .aggregation(aggBuilder)
  445. .size(1000000);
  446. request.source(searchSourceBuilder);
  447. SearchResponse search = client.search(request, RequestOptions.DEFAULT);
  448. Aggregations aggregations = search.getAggregations();
  449. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  450. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  451. LeaceOutDto dto = new LeaceOutDto();
  452. dto.setBatchNumber(bucket.getKeyAsString());
  453. dto.setCount(Long.valueOf(bucket.getDocCount()));
  454. dtos.add(dto);
  455. }
  456. dtos.forEach(item->{
  457. StaticOrDynamicData data = new StaticOrDynamicData();
  458. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  459. // 构建查询条件
  460. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  461. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  462. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  463. boolQueryBuilder2.filter(QueryBuilders.termQuery("targetType","0"));
  464. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  465. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","RADAR","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  466. searchSourceBuilder2.query(boolQueryBuilder2)
  467. .trackTotalHits(true)
  468. .size(1000000);
  469. request2.source(searchSourceBuilder2);
  470. try {
  471. SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
  472. SearchHits searchHits = search2.getHits();
  473. SearchHit[] hits = searchHits.getHits();
  474. if (hits.length > 0) {
  475. JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
  476. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  477. data.setBatchNumber(item.getBatchNumber());
  478. list.add(data);
  479. }
  480. } catch (IOException e) {
  481. e.printStackTrace();
  482. }
  483. });
  484. try {
  485. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  486. response.setCharacterEncoding("utf-8");
  487. String fileName = URLEncoder.encode("天奥静态数据与动态轨迹融合", "UTF-8");
  488. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  489. EasyExcel.write(response.getOutputStream(), StaticOrDynamicData.class).sheet("天奥静态数据与动态轨迹融合")
  490. .doWrite(list);
  491. } catch (Exception e) {
  492. // 重置response
  493. System.out.println("导出天奥静态数据与动态轨迹融合excel失败:{}" + e.getMessage() + e);
  494. }
  495. }
  496. }