FusionAnalysisServiceImpl.java 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  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 cn.hutool.core.io.LineHandler;
  10. import com.alibaba.excel.EasyExcel;
  11. import com.alibaba.fastjson.JSON;
  12. import com.alibaba.fastjson.JSONArray;
  13. import com.alibaba.fastjson.JSONObject;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.apache.http.client.config.RequestConfig;
  16. import org.elasticsearch.action.index.IndexRequest;
  17. import org.elasticsearch.action.search.SearchRequest;
  18. import org.elasticsearch.action.search.SearchResponse;
  19. import org.elasticsearch.client.HttpAsyncResponseConsumerFactory;
  20. import org.elasticsearch.client.RequestOptions;
  21. import org.elasticsearch.client.RestClientBuilder;
  22. import org.elasticsearch.client.RestHighLevelClient;
  23. import org.elasticsearch.core.TimeValue;
  24. import org.elasticsearch.index.query.BoolQueryBuilder;
  25. import org.elasticsearch.index.query.QueryBuilders;
  26. import org.elasticsearch.search.SearchHit;
  27. import org.elasticsearch.search.SearchHits;
  28. import org.elasticsearch.search.aggregations.AggregationBuilders;
  29. import org.elasticsearch.search.aggregations.Aggregations;
  30. import org.elasticsearch.search.aggregations.bucket.terms.ParsedDoubleTerms;
  31. import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
  32. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  33. import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
  34. import org.elasticsearch.search.aggregations.metrics.ParsedTopHits;
  35. import org.elasticsearch.search.builder.SearchSourceBuilder;
  36. import org.elasticsearch.search.sort.SortBuilders;
  37. import org.elasticsearch.search.sort.SortOrder;
  38. import org.springframework.beans.factory.annotation.Autowired;
  39. import org.springframework.stereotype.Service;
  40. import javax.servlet.http.HttpServletResponse;
  41. import java.io.IOException;
  42. import java.lang.reflect.Field;
  43. import java.net.URLEncoder;
  44. import java.text.ParseException;
  45. import java.util.*;
  46. import static cn.com.taiji.constants.EsIndexConstants.*;
  47. /**
  48. * @author xhl
  49. * @date 2023/2/6
  50. */
  51. @Service
  52. public class FusionAnalysisServiceImpl implements FusionAnalysisService {
  53. private static final RequestOptions COMMON_OPTIONS;
  54. static {
  55. RequestConfig requestConfig = RequestConfig.custom()
  56. .setConnectTimeout(5000)
  57. .setSocketTimeout(60000)
  58. .build();
  59. RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
  60. builder.setRequestConfig(requestConfig).setHttpAsyncResponseConsumerFactory(
  61. // 设置查询内容大小限制,默认100 * 1024 * 1024
  62. new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(5*1024 * 1024 * 1024)
  63. );
  64. COMMON_OPTIONS = builder.build();
  65. }
  66. @Autowired
  67. private RestHighLevelClient client;
  68. @Override
  69. public void fusionAnalysisExcelOne(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  70. List<FusionData> list = new ArrayList<>();
  71. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  72. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  73. SearchRequest request = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  74. // 构建查询条件
  75. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  76. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  77. boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  78. searchSourceBuilder.query(boolQueryBuilder);
  79. // TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  80. // .field("mergeTarget")
  81. // .size(query.getPageSize())
  82. // .subAggregation(
  83. // AggregationBuilders.topHits("ship_field_agg_top1")
  84. // .size(100)
  85. // .sort(
  86. // SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
  87. // )
  88. // );
  89. searchSourceBuilder
  90. .trackTotalHits(true)
  91. .sort(SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC))
  92. // .aggregation(aggBuilder)
  93. .size(query.getPageSize())
  94. .timeout(TimeValue.timeValueHours(1L))
  95. .timeout(TimeValue.timeValueMinutes(30L))
  96. .timeout(TimeValue.timeValueSeconds(500L));
  97. request.source(searchSourceBuilder);
  98. SearchResponse search = client.search(request, COMMON_OPTIONS);
  99. SearchHits searchHits = search.getHits();
  100. SearchHit[] hits = searchHits.getHits();
  101. List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
  102. List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
  103. for (SearchHit hit : hits) {
  104. Map<String, Object> map = hit.getSourceAsMap();
  105. inList.add(map);
  106. }
  107. outList = change(inList, "mergeTarget", outList);
  108. outList.forEach(map->{
  109. JSONObject maps = JSONObject.parseObject(JSON.toJSONString(map));
  110. // JSONObject maps = new JSONObject();
  111. // Iterator it = map.keySet().iterator();
  112. // while (it.hasNext()) {
  113. // String key = (String) it.next();
  114. // maps.put(key, map.get(key));
  115. // }
  116. JSONArray jsonArray =JSONArray.parseArray(maps.getString("array"));
  117. if (jsonArray.size()>0){
  118. FusionData data = new FusionData();
  119. Integer num = 0;
  120. for (int i = 0; i < jsonArray.size(); i++) {
  121. if (i<jsonArray.size()-1){
  122. JSONObject job = jsonArray.getJSONObject(i);
  123. JSONObject job2 = jsonArray.getJSONObject(i+1);
  124. Date date = null;
  125. Date date2 = null;
  126. try {
  127. date = DateUtils.parse(job.get("mergeTime").toString(),"yyyy-MM-dd HH:mm:ss.SSS");
  128. date2 = DateUtils.parse(job2.get("mergeTime").toString(),"yyyy-MM-dd HH:mm:ss.SSS");
  129. } catch (ParseException e) {
  130. e.printStackTrace();
  131. }
  132. Long interval = date2.getTime()-date.getTime();
  133. if (interval>6500L){
  134. num++;
  135. }
  136. }
  137. }
  138. if (num>0){
  139. JSONObject sourceItem = jsonArray.getJSONObject(0);
  140. JSONObject sourceItem2 = jsonArray.getJSONObject(jsonArray.size()-1);
  141. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  142. data.setTrackCount((long) jsonArray.size());
  143. data.setStartTime(sourceItem.getString("mergeTime"));
  144. data.setEndTime(sourceItem2.getString("mergeTime"));
  145. data.setFluctuateNumber(num);
  146. list.add(data);
  147. }
  148. }
  149. });
  150. // Aggregations aggregations = search.getAggregations();
  151. // ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  152. // for (Terms.Bucket bucket : aggregation.getBuckets()) {
  153. // FusionData data = new FusionData();
  154. // ParsedTopHits topHits = bucket.getAggregations().get("ship_field_agg_top1");
  155. // SearchHits searchHits = topHits.getHits();
  156. // Long value = searchHits.getTotalHits().value;
  157. // SearchHit[] hits = searchHits.getHits();
  158. // Integer num = 0;
  159. // for (int i = 0; i < hits.length; i++) {
  160. // if (i != hits.length-1){
  161. // Map<String, Object> map = hits[i].getSourceAsMap();
  162. // Map<String, Object> map2 = hits[i+1].getSourceAsMap();
  163. // Date date = DateUtils.parse(map.get("mergeTime").toString(),"yyyy-MM-dd");
  164. // Date date2 = DateUtils.parse(map2.get("mergeTime").toString(),"yyyy-MM-dd");
  165. // Long interval = date2.getTime()-date.getTime();
  166. // if (interval>6500L){
  167. // num++;
  168. // }
  169. // }
  170. // }
  171. // if (num>0){
  172. // JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
  173. // JSONObject sourceItem2 = JSONObject.parseObject(hits[value.intValue()-1].getSourceAsString());
  174. // data.setMergeTarget(sourceItem.getString("mergeTarget"));
  175. // data.setTrackCount(value);
  176. // data.setStartTime(sourceItem.getString("mergeTime"));
  177. // data.setEndTime(sourceItem2.getString("mergeTime"));
  178. // data.setFluctuateNumber(num);
  179. // list.add(data);
  180. // }
  181. // }
  182. try {
  183. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  184. response.setCharacterEncoding("utf-8");
  185. String fileName = URLEncoder.encode("识别融合数据率波动问题", "UTF-8");
  186. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  187. EasyExcel.write(response.getOutputStream(), FusionData.class).sheet("识别融合数据率波动问题")
  188. .doWrite(list);
  189. } catch (Exception e) {
  190. // 重置response
  191. System.out.println("导出识别融合数据率波动问题excel失败:{}" + e.getMessage() + e);
  192. }
  193. }
  194. @Override
  195. public void fusionAnalysisExcelTwo(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  196. List<FusionData> list = new ArrayList<>();
  197. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  198. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  199. SearchRequest request = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  200. // 构建查询条件
  201. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  202. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  203. boolQueryBuilder.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  204. searchSourceBuilder.query(boolQueryBuilder);
  205. TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  206. .field("mergeTarget")
  207. .size(query.getPageSize())
  208. .subAggregation(
  209. AggregationBuilders.terms("ship_field_agg_one")
  210. .field("targetCourse")
  211. .size(query.getPageSize())
  212. .subAggregation(
  213. AggregationBuilders.terms("ship_field_agg_two")
  214. .field("targetSpeed")
  215. .size(query.getPageSize())
  216. .subAggregation(AggregationBuilders.topHits("ship_field_agg_top1")
  217. .size(100)
  218. .sort(
  219. SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
  220. ))
  221. )
  222. );
  223. searchSourceBuilder
  224. .trackTotalHits(true)
  225. .aggregation(aggBuilder)
  226. .size(query.getPageSize())
  227. .timeout(TimeValue.timeValueHours(1L))
  228. .timeout(TimeValue.timeValueMinutes(30L))
  229. .timeout(TimeValue.timeValueSeconds(500L));
  230. request.source(searchSourceBuilder);
  231. SearchResponse search = client.search(request, COMMON_OPTIONS);
  232. Aggregations aggregations = search.getAggregations();
  233. ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  234. for (Terms.Bucket bucket : aggregation.getBuckets()) {
  235. FusionData data = new FusionData();
  236. ParsedStringTerms terms = bucket.getAggregations().get("ship_field_agg_one");
  237. Integer num = 0;
  238. for (Terms.Bucket buc : terms.getBuckets()){
  239. ParsedDoubleTerms termsTwo = buc.getAggregations().get("ship_field_agg_two");
  240. for (Terms.Bucket ket : termsTwo.getBuckets()){
  241. ParsedTopHits topHit = ket.getAggregations().get("ship_field_agg_top1");
  242. SearchHits searchHit = topHit.getHits();
  243. SearchHit[] hit = searchHit.getHits();
  244. for (int i = 0; i < hit.length; i++) {
  245. if (num>2){
  246. data.setFluctuateNumber(data.getFluctuateNumber()+1);
  247. data.setMergeTarget(bucket.getKeyAsString());
  248. data.setTrackCount(bucket.getDocCount());
  249. data.setStartTime(query.getStartTime());
  250. data.setEndTime(query.getEndTime());
  251. list.add(data);
  252. num =0;
  253. }
  254. if (i != hit.length-1){
  255. Map<String, Object> map = hit[i].getSourceAsMap();
  256. Map<String, Object> map2 = hit[i+1].getSourceAsMap();
  257. Date date = DateUtils.parse(map.get("mergeTime").toString(),"yyyy-MM-dd");
  258. Date date2 = DateUtils.parse(map2.get("mergeTime").toString(),"yyyy-MM-dd");
  259. Long interval = date2.getTime()-date.getTime();
  260. if (interval<6500L){
  261. num++;
  262. }
  263. }
  264. }
  265. }
  266. }
  267. }
  268. try {
  269. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  270. response.setCharacterEncoding("utf-8");
  271. String fileName = URLEncoder.encode("虚假推送问题", "UTF-8");
  272. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  273. EasyExcel.write(response.getOutputStream(), FusionData.class).sheet("虚假推送问题")
  274. .doWrite(list);
  275. } catch (Exception e) {
  276. // 重置response
  277. System.out.println("导出虚假推送问题excel失败:{}" + e.getMessage() + e);
  278. }
  279. }
  280. @Override
  281. public void tianAoLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  282. List<LeaveOutData> list = new ArrayList<>();
  283. List<LeaceOutDto> dtos = new ArrayList<>();
  284. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  285. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  286. SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_RADAR+time);
  287. // 构建查询条件
  288. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  289. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  290. boolQueryBuilder.filter(QueryBuilders.rangeQuery("receiveTime").gte(query.getStartTime()).lte(query.getEndTime()));
  291. searchSourceBuilder.query(boolQueryBuilder);
  292. // TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  293. // .field("fusionBatchNum")
  294. // .size(query.getPageSize());
  295. searchSourceBuilder
  296. .trackTotalHits(true)
  297. // .aggregation(aggBuilder)
  298. .size(query.getPageSize())
  299. .sort(SortBuilders.fieldSort("receiveTime").order(SortOrder.ASC))
  300. .timeout(TimeValue.timeValueHours(1L))
  301. .timeout(TimeValue.timeValueMinutes(30L))
  302. .timeout(TimeValue.timeValueSeconds(500L));
  303. request.source(searchSourceBuilder);
  304. SearchResponse search = client.search(request, COMMON_OPTIONS);
  305. SearchHits searchHits = search.getHits();
  306. SearchHit[] hits = searchHits.getHits();
  307. List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
  308. List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
  309. for (SearchHit hit : hits) {
  310. Map<String, Object> map = hit.getSourceAsMap();
  311. inList.add(map);
  312. }
  313. outList = change(inList, "fusionBatchNum", outList);
  314. outList.forEach(map-> {
  315. JSONObject maps = JSONObject.parseObject(JSON.toJSONString(map));
  316. // JSONObject maps = new JSONObject();
  317. // Iterator it = map.keySet().iterator();
  318. // while (it.hasNext()) {
  319. // String key = (String) it.next();
  320. // maps.put(key, map.get(key));
  321. // }
  322. JSONArray jsonArray = JSONArray.parseArray(maps.getString("array"));
  323. if (jsonArray.size() > 0) {
  324. JSONObject job = jsonArray.getJSONObject(0);
  325. LeaceOutDto dto = new LeaceOutDto();
  326. dto.setBatchNumber(job.getString("fusionBatchNum"));
  327. dto.setCount((long) jsonArray.size());
  328. dtos.add(dto);
  329. }
  330. });
  331. // Aggregations aggregations = search.getAggregations();
  332. // ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  333. // for (Terms.Bucket bucket : aggregation.getBuckets()) {
  334. // LeaceOutDto dto = new LeaceOutDto();
  335. // dto.setBatchNumber(bucket.getKeyAsString());
  336. // dto.setCount(bucket.getDocCount());
  337. // dtos.add(dto);
  338. // }
  339. dtos.forEach(item->{
  340. LeaveOutData data = new LeaveOutData();
  341. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  342. // 构建查询条件
  343. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  344. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  345. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  346. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  347. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","RADAR","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  348. searchSourceBuilder2.query(boolQueryBuilder2)
  349. .trackTotalHits(true)
  350. .size(query.getPageSize())
  351. .timeout(TimeValue.timeValueHours(1L))
  352. .timeout(TimeValue.timeValueMinutes(30L))
  353. .timeout(TimeValue.timeValueSeconds(500L));
  354. request2.source(searchSourceBuilder2);
  355. try {
  356. SearchResponse search2 = client.search(request2, COMMON_OPTIONS);
  357. SearchHits searchHits2 = search2.getHits();
  358. Long totalHits = searchHits2.getTotalHits().value;
  359. if (totalHits<5) {
  360. SearchHit[] hits2 = searchHits2.getHits();
  361. if (hits2.length > 0) {
  362. JSONObject sourceItem = JSONObject.parseObject(hits2[0].getSourceAsString());
  363. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  364. data.setStartTime(query.getStartTime());
  365. data.setEndTime(query.getEndTime());
  366. data.setBatchNumber(item.getBatchNumber());
  367. data.setOriginalCount(item.getCount());
  368. data.setTrackCount(totalHits);
  369. list.add(data);
  370. }
  371. }
  372. } catch (IOException e) {
  373. e.printStackTrace();
  374. }
  375. });
  376. try {
  377. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  378. response.setCharacterEncoding("utf-8");
  379. String fileName = URLEncoder.encode("天奥轨迹数据遗漏", "UTF-8");
  380. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  381. EasyExcel.write(response.getOutputStream(), LeaveOutData.class).sheet("天奥轨迹数据遗漏")
  382. .doWrite(list);
  383. } catch (Exception e) {
  384. // 重置response
  385. System.out.println("导出天奥轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
  386. }
  387. }
  388. @Override
  389. public void beiDouLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  390. List<LeaveOutData> list = new ArrayList<>();
  391. List<LeaceOutDto> dtos = new ArrayList<>();
  392. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  393. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  394. SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_BEIDOU+time);
  395. // 构建查询条件
  396. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  397. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  398. boolQueryBuilder.filter(QueryBuilders.rangeQuery("locationTime").gte(query.getStartTime()).lte(query.getEndTime()));
  399. searchSourceBuilder.query(boolQueryBuilder);
  400. // TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  401. // .field("fusionBatchNum")
  402. // .size(query.getPageSize());
  403. searchSourceBuilder
  404. .trackTotalHits(true)
  405. // .aggregation(aggBuilder)
  406. .size(query.getPageSize())
  407. .sort(SortBuilders.fieldSort("locationTime").order(SortOrder.ASC))
  408. .timeout(TimeValue.timeValueHours(1L))
  409. .timeout(TimeValue.timeValueMinutes(30L))
  410. .timeout(TimeValue.timeValueSeconds(500L));
  411. request.source(searchSourceBuilder);
  412. SearchResponse search = client.search(request, COMMON_OPTIONS);
  413. SearchHits searchHits = search.getHits();
  414. SearchHit[] hits = searchHits.getHits();
  415. List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
  416. List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
  417. for (SearchHit hit : hits) {
  418. Map<String, Object> map = hit.getSourceAsMap();
  419. inList.add(map);
  420. }
  421. outList = change(inList, "devideNo", outList);
  422. outList.forEach(map-> {
  423. JSONObject maps = JSONObject.parseObject(JSON.toJSONString(map));
  424. // JSONObject maps = new JSONObject();
  425. // Iterator it = map.keySet().iterator();
  426. // while (it.hasNext()) {
  427. // String key = (String) it.next();
  428. // maps.put(key, map.get(key));
  429. // }
  430. JSONArray jsonArray = JSONArray.parseArray(maps.getString("array"));
  431. if (jsonArray.size() > 0) {
  432. JSONObject job = jsonArray.getJSONObject(0);
  433. LeaceOutDto dto = new LeaceOutDto();
  434. dto.setBatchNumber(job.getString("devideNo"));
  435. dto.setCount((long) jsonArray.size());
  436. dtos.add(dto);
  437. }
  438. });
  439. // Aggregations aggregations = search.getAggregations();
  440. // ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  441. // for (Terms.Bucket bucket : aggregation.getBuckets()) {
  442. // LeaceOutDto dto = new LeaceOutDto();
  443. // dto.setBatchNumber(bucket.getKeyAsString());
  444. // dto.setCount(bucket.getDocCount());
  445. // dtos.add(dto);
  446. // }
  447. dtos.forEach(item->{
  448. LeaveOutData data = new LeaveOutData();
  449. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  450. // 构建查询条件
  451. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  452. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  453. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  454. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  455. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","BEIDOU","AIS_BEIDOU","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  456. searchSourceBuilder2.query(boolQueryBuilder2)
  457. .trackTotalHits(true)
  458. .size(query.getPageSize())
  459. .timeout(TimeValue.timeValueHours(1L))
  460. .timeout(TimeValue.timeValueMinutes(30L))
  461. .timeout(TimeValue.timeValueSeconds(500L));
  462. request2.source(searchSourceBuilder2);
  463. try {
  464. SearchResponse search2 = client.search(request2, COMMON_OPTIONS);
  465. SearchHits searchHits2 = search2.getHits();
  466. Long totalHits = searchHits2.getTotalHits().value;
  467. if (totalHits<5) {
  468. SearchHit[] hits2 = searchHits2.getHits();
  469. if (hits2.length > 0) {
  470. JSONObject sourceItem = JSONObject.parseObject(hits2[0].getSourceAsString());
  471. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  472. data.setStartTime(query.getStartTime());
  473. data.setEndTime(query.getEndTime());
  474. data.setBatchNumber(item.getBatchNumber());
  475. data.setOriginalCount(item.getCount());
  476. data.setTrackCount(totalHits);
  477. list.add(data);
  478. }
  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(), LeaveOutData.class).sheet("北斗轨迹数据遗漏")
  490. .doWrite(list);
  491. } catch (Exception e) {
  492. // 重置response
  493. System.out.println("导出北斗轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
  494. }
  495. }
  496. @Override
  497. public void hlxyjrhLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  498. List<LeaveOutData> list = new ArrayList<>();
  499. List<LeaceOutDto> dtos = new ArrayList<>();
  500. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  501. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  502. SearchRequest request = new SearchRequest(INDEX_SEAT_HLX_FUSION_SHIP+time);
  503. // 构建查询条件
  504. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  505. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  506. boolQueryBuilder.filter(QueryBuilders.rangeQuery("time").gte(query.getStartTime()).lte(query.getEndTime()));
  507. searchSourceBuilder.query(boolQueryBuilder);
  508. // TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  509. // .field("fusionBatchNum")
  510. // .size(query.getPageSize());
  511. searchSourceBuilder
  512. .trackTotalHits(true)
  513. // .aggregation(aggBuilder)
  514. .size(query.getPageSize())
  515. .sort(SortBuilders.fieldSort("time").order(SortOrder.ASC))
  516. .timeout(TimeValue.timeValueHours(1L))
  517. .timeout(TimeValue.timeValueMinutes(30L))
  518. .timeout(TimeValue.timeValueSeconds(500L));
  519. request.source(searchSourceBuilder);
  520. SearchResponse search = client.search(request, COMMON_OPTIONS);
  521. SearchHits searchHits = search.getHits();
  522. SearchHit[] hits = searchHits.getHits();
  523. List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
  524. List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
  525. for (SearchHit hit : hits) {
  526. Map<String, Object> map = hit.getSourceAsMap();
  527. inList.add(map);
  528. }
  529. outList = change(inList, "targetID", outList);
  530. outList.forEach(map-> {
  531. JSONObject maps = JSONObject.parseObject(JSON.toJSONString(map));
  532. // JSONObject maps = new JSONObject();
  533. // Iterator it = map.keySet().iterator();
  534. // while (it.hasNext()) {
  535. // String key = (String) it.next();
  536. // maps.put(key, map.get(key));
  537. // }
  538. JSONArray jsonArray = JSONArray.parseArray(maps.getString("array"));
  539. if (jsonArray.size() > 0) {
  540. JSONObject job = jsonArray.getJSONObject(0);
  541. LeaceOutDto dto = new LeaceOutDto();
  542. dto.setBatchNumber(job.getString("targetID"));
  543. dto.setCount((long) jsonArray.size());
  544. dtos.add(dto);
  545. }
  546. });
  547. // Aggregations aggregations = search.getAggregations();
  548. // ParsedStringTerms aggregation = aggregations.get("ship_field_agg");
  549. // for (Terms.Bucket bucket : aggregation.getBuckets()) {
  550. // LeaceOutDto dto = new LeaceOutDto();
  551. // dto.setBatchNumber(bucket.getKeyAsString());
  552. // dto.setCount(bucket.getDocCount());
  553. // dtos.add(dto);
  554. // }
  555. dtos.forEach(item->{
  556. LeaveOutData data = new LeaveOutData();
  557. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  558. // 构建查询条件
  559. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  560. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  561. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  562. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  563. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","AIS","RADAR","AIS_BEIDOU","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  564. searchSourceBuilder2.query(boolQueryBuilder2)
  565. .trackTotalHits(true)
  566. .size(query.getPageSize())
  567. .timeout(TimeValue.timeValueHours(1L))
  568. .timeout(TimeValue.timeValueMinutes(30L))
  569. .timeout(TimeValue.timeValueSeconds(500L));
  570. request2.source(searchSourceBuilder2);
  571. try {
  572. SearchResponse search2 = client.search(request2, COMMON_OPTIONS);
  573. SearchHits searchHits2 = search2.getHits();
  574. Long totalHits = searchHits2.getTotalHits().value;
  575. if (totalHits<5) {
  576. SearchHit[] hits2 = searchHits2.getHits();
  577. if (hits2.length > 0) {
  578. JSONObject sourceItem = JSONObject.parseObject(hits2[0].getSourceAsString());
  579. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  580. data.setStartTime(query.getStartTime());
  581. data.setEndTime(query.getEndTime());
  582. data.setBatchNumber(item.getBatchNumber());
  583. data.setOriginalCount(item.getCount());
  584. data.setTrackCount(totalHits);
  585. list.add(data);
  586. }
  587. }
  588. } catch (IOException e) {
  589. e.printStackTrace();
  590. }
  591. });
  592. try {
  593. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  594. response.setCharacterEncoding("utf-8");
  595. String fileName = URLEncoder.encode("海兰信1级融合轨迹数据遗漏", "UTF-8");
  596. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  597. EasyExcel.write(response.getOutputStream(), LeaveOutData.class).sheet("海兰信1级融合轨迹数据遗漏")
  598. .doWrite(list);
  599. } catch (Exception e) {
  600. // 重置response
  601. System.out.println("导出海兰信1级融合轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
  602. }
  603. }
  604. @Override
  605. public void tianaoStaticOrDynamicLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
  606. List<StaticOrDynamicData> list = new ArrayList<>();
  607. List<LeaceOutDto> dtos = new ArrayList<>();
  608. Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
  609. String time = DateUtils.format(startTime,"yyyy-MM-dd");
  610. SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_RADAR+time);
  611. // 构建查询条件
  612. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  613. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  614. boolQueryBuilder.filter(QueryBuilders.rangeQuery("receiveTime").gte(query.getStartTime()).lte(query.getEndTime()));
  615. boolQueryBuilder.filter(QueryBuilders.termQuery("targetProper","1"));
  616. searchSourceBuilder.query(boolQueryBuilder);
  617. // TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
  618. // .field("fusionBatchNum")
  619. // .size(query.getPageSize());
  620. searchSourceBuilder
  621. .trackTotalHits(true)
  622. // .aggregation(aggBuilder)
  623. .size(query.getPageSize())
  624. .timeout(TimeValue.timeValueHours(1L))
  625. .timeout(TimeValue.timeValueMinutes(30L))
  626. .timeout(TimeValue.timeValueSeconds(500L));
  627. request.source(searchSourceBuilder);
  628. SearchResponse search = client.search(request, COMMON_OPTIONS);
  629. SearchHits searchHits = search.getHits();
  630. SearchHit[] hits = searchHits.getHits();
  631. List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
  632. List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
  633. for (SearchHit hit : hits) {
  634. Map<String, Object> map = hit.getSourceAsMap();
  635. inList.add(map);
  636. }
  637. outList = change(inList, "fusionBatchNum", outList);
  638. outList.forEach(map-> {
  639. JSONObject maps = JSONObject.parseObject(JSON.toJSONString(map));
  640. // JSONObject maps = new JSONObject();
  641. // Iterator it = map.keySet().iterator();
  642. // while (it.hasNext()) {
  643. // String key = (String) it.next();
  644. // maps.put(key, map.get(key));
  645. // }
  646. JSONArray jsonArray = JSONArray.parseArray(maps.getString("array"));
  647. if (jsonArray.size() > 0) {
  648. JSONObject job = jsonArray.getJSONObject(0);
  649. LeaceOutDto dto = new LeaceOutDto();
  650. dto.setBatchNumber(job.getString("fusionBatchNum"));
  651. dto.setCount((long) jsonArray.size());
  652. dtos.add(dto);
  653. }
  654. });
  655. dtos.forEach(item->{
  656. StaticOrDynamicData data = new StaticOrDynamicData();
  657. SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
  658. // 构建查询条件
  659. BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
  660. SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
  661. boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
  662. boolQueryBuilder2.filter(QueryBuilders.termQuery("targetType","0"));
  663. boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
  664. boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","RADAR","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
  665. searchSourceBuilder2.query(boolQueryBuilder2)
  666. .trackTotalHits(true)
  667. .size(query.getPageSize())
  668. .timeout(TimeValue.timeValueHours(1L))
  669. .timeout(TimeValue.timeValueMinutes(30L))
  670. .timeout(TimeValue.timeValueSeconds(500L));
  671. request2.source(searchSourceBuilder2);
  672. try {
  673. SearchResponse search2 = client.search(request2, COMMON_OPTIONS);
  674. SearchHits searchHits2 = search2.getHits();
  675. SearchHit[] hits2 = searchHits2.getHits();
  676. if (hits2.length > 0) {
  677. JSONObject sourceItem = JSONObject.parseObject(hits2[0].getSourceAsString());
  678. data.setMergeTarget(sourceItem.getString("mergeTarget"));
  679. data.setBatchNumber(item.getBatchNumber());
  680. list.add(data);
  681. }
  682. } catch (IOException e) {
  683. e.printStackTrace();
  684. }
  685. });
  686. try {
  687. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  688. response.setCharacterEncoding("utf-8");
  689. String fileName = URLEncoder.encode("天奥静态数据与动态轨迹融合", "UTF-8");
  690. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  691. EasyExcel.write(response.getOutputStream(), StaticOrDynamicData.class).sheet("天奥静态数据与动态轨迹融合")
  692. .doWrite(list);
  693. } catch (Exception e) {
  694. // 重置response
  695. System.out.println("导出天奥静态数据与动态轨迹融合excel失败:{}" + e.getMessage() + e);
  696. }
  697. }
  698. /**
  699. * 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map<String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>>>
  700. * @param inList
  701. * @param oneMapKey
  702. * @param outList
  703. * @return
  704. */
  705. private static List<Map<String, Object>> change(List<Map<String, Object>> inList, String oneMapKey,
  706. List<Map<String, Object>> outList) {
  707. // 1.将某个key的值存在set中
  708. Set<Object> setTmp = new HashSet<Object>();
  709. for (Map<String, Object> tmp : inList) {
  710. setTmp.add(tmp.get(oneMapKey));
  711. }
  712. // 2.遍历set
  713. Iterator<Object> it = setTmp.iterator();
  714. while (it.hasNext()) {
  715. String oneMapValueStr = "";
  716. String oneSetTmpStr = (String) it.next();
  717. Map<String, Object> oneSetTmpMap = new HashMap<String, Object>();
  718. List<Map<String, Object>> oneSetTmpList = new ArrayList<Map<String, Object>>();
  719. for (Map<String, Object> tmp : inList) {
  720. oneMapValueStr = (String) tmp.get(oneMapKey);
  721. if (oneSetTmpStr.equals(oneMapValueStr)) {
  722. oneSetTmpMap.put("text", oneSetTmpStr);
  723. oneSetTmpList.add(tmp);
  724. }
  725. }
  726. oneSetTmpMap.put("array", oneSetTmpList);
  727. outList.add(oneSetTmpMap);
  728. }
  729. return outList;
  730. }
  731. }
  732. class text{
  733. @Autowired
  734. public RestHighLevelClient client;
  735. public static void main(String[] args) {
  736. String source = "[{\"track_device_no\":\"15013798\",\"track_id\":\"15013798\",\"id\":\"82717282\",\"time\":\"2023 - 02 - 07 00: 59: 30.069\",\"type\":\"BEIDOU\"}]";
  737. String json = JSON.toJSONString(source);
  738. System.out.println(json);
  739. }
  740. }