package cn.com.taiji.service.impl;

import cn.com.taiji.domain.FusionData;
import cn.com.taiji.domain.FusionQuery;
import cn.com.taiji.domain.LeaveOutData;
import cn.com.taiji.domain.StaticOrDynamicData;
import cn.com.taiji.domain.dto.LeaceOutDto;
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.ParsedDoubleTerms;
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.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.*;


/**
 * @author xhl
 * @date 2023/2/6
 */
@Service
public class FusionAnalysisServiceImpl implements FusionAnalysisService {

    @Autowired
    private RestHighLevelClient client;

    @Override
    public void fusionAnalysisExcelOne(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
        List<FusionData> list = new ArrayList<>();
        Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
        String time = DateUtils.format(startTime,"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(1000000)
                .subAggregation(
                        AggregationBuilders.topHits("ship_field_agg_top1")
                                .size(100)
                                .sort(
                                        SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
                                )
                );
        searchSourceBuilder
                .trackTotalHits(true)
                .aggregation(aggBuilder)
                .size(1000000);
        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("mergeTime").toString(),"yyyy-MM-dd");
                    Date date2 = DateUtils.parse(map2.get("mergeTime").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
            System.out.println("导出识别融合数据率波动问题excel失败:{}" + e.getMessage() + e);
        }
    }

    @Override
    public void fusionAnalysisExcelTwo(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
        List<FusionData> list = new ArrayList<>();
        Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
        String time = DateUtils.format(startTime,"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(1000000)
                .subAggregation(
                        AggregationBuilders.terms("ship_field_agg_one")
                                .field("targetCourse")
                                .size(1000000)
                                .subAggregation(
                                        AggregationBuilders.terms("ship_field_agg_two")
                                                .field("targetSpeed")
                                                .size(1000000)
                                                .subAggregation(AggregationBuilders.topHits("ship_field_agg_top1")
                                                        .size(100)
                                                        .sort(
                                                                SortBuilders.fieldSort("mergeTime").order(SortOrder.ASC)
                                                        ))
                                )
                );
        searchSourceBuilder
                .trackTotalHits(true)
                .aggregation(aggBuilder)
                .size(1000000);
        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();
            ParsedStringTerms terms = bucket.getAggregations().get("ship_field_agg_one");
            Integer num = 0;
            for (Terms.Bucket buc : terms.getBuckets()){
                ParsedDoubleTerms termsTwo = buc.getAggregations().get("ship_field_agg_two");
                for (Terms.Bucket ket : termsTwo.getBuckets()){
                    ParsedTopHits topHit = ket.getAggregations().get("ship_field_agg_top1");
                    SearchHits searchHit = topHit.getHits();
                    SearchHit[] hit = searchHit.getHits();
                    for (int i = 0; i < hit.length; i++) {
                        if (num>2){
                            data.setFluctuateNumber(data.getFluctuateNumber()+1);
                            num =0;
                        }
                        if (i != hit.length-1){
                            Map<String, Object> map = hit[i].getSourceAsMap();
                            Map<String, Object> map2 = hit[i+1].getSourceAsMap();
                            Date date = DateUtils.parse(map.get("mergeTime").toString(),"yyyy-MM-dd");
                            Date date2 = DateUtils.parse(map2.get("mergeTime").toString(),"yyyy-MM-dd");
                            Long interval = date2.getTime()-date.getTime();
                            if (interval<6500L){
                                num++;
                            }
                        }
                    }
                }
            }
            data.setMergeTarget(bucket.getKeyAsString());
            data.setTrackCount(Long.valueOf(bucket.getDocCount()));
            data.setStartTime(query.getStartTime());
            data.setEndTime(query.getEndTime());
            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
            System.out.println("导出虚假推送问题excel失败:{}" + e.getMessage() + e);
        }
    }

    @Override
    public void tianAoLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
        List<LeaveOutData> list = new ArrayList<>();
        List<LeaceOutDto> dtos = new ArrayList<>();
        Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
        String time = DateUtils.format(startTime,"yyyy-MM-dd");
        SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_RADAR+time);
        // 构建查询条件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("receiveTime").gte(query.getStartTime()).lte(query.getEndTime()));
        searchSourceBuilder.query(boolQueryBuilder);
        TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
                .field("fusionBatchNum")
                .size(1000000);
        searchSourceBuilder
                .trackTotalHits(true)
                .aggregation(aggBuilder)
                .size(1000000);
        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()) {
            LeaceOutDto dto = new LeaceOutDto();
            dto.setBatchNumber(bucket.getKeyAsString());
            dto.setCount(Long.valueOf(bucket.getDocCount()));
            dtos.add(dto);
        }
        dtos.forEach(item->{
            LeaveOutData data = new LeaveOutData();
            SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
            // 构建查询条件
            BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
            SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
            boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
            boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
            boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","RADAR","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
            searchSourceBuilder2.query(boolQueryBuilder2)
                    .trackTotalHits(true)
                    .size(1000000);
            request2.source(searchSourceBuilder2);
            try {
                SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
                SearchHits searchHits = search2.getHits();
                Long totalHits = searchHits.getTotalHits().value;
                if (totalHits<5) {
                    SearchHit[] hits = searchHits.getHits();
                    if (hits.length > 0) {
                        JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
                        data.setMergeTarget(sourceItem.getString("mergeTarget"));
                        data.setStartTime(query.getStartTime());
                        data.setEndTime(query.getEndTime());
                        data.setBatchNumber(item.getBatchNumber());
                        data.setOriginalCount(item.getCount());
                        data.setTrackCount(totalHits);
                        list.add(data);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        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(), LeaveOutData.class).sheet("天奥轨迹数据遗漏")
                    .doWrite(list);
        } catch (Exception e) {
            // 重置response
            System.out.println("导出天奥轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
        }
    }

    @Override
    public void beiDouLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
        List<LeaveOutData> list = new ArrayList<>();
        List<LeaceOutDto> dtos = new ArrayList<>();
        Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
        String time = DateUtils.format(startTime,"yyyy-MM-dd");
        SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_BEIDOU+time);
        // 构建查询条件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("locationTime").gte(query.getStartTime()).lte(query.getEndTime()));
        searchSourceBuilder.query(boolQueryBuilder);
        TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
                .field("devideNo")
                .size(1000000);
        searchSourceBuilder
                .trackTotalHits(true)
                .aggregation(aggBuilder)
                .size(1000000);
        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()) {
            LeaceOutDto dto = new LeaceOutDto();
            dto.setBatchNumber(bucket.getKeyAsString());
            dto.setCount(Long.valueOf(bucket.getDocCount()));
            dtos.add(dto);
        }
        dtos.forEach(item->{
            LeaveOutData data = new LeaveOutData();
            SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
            // 构建查询条件
            BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
            SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
            boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
            boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
            boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","BEIDOU","AIS_BEIDOU","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
            searchSourceBuilder2.query(boolQueryBuilder2)
                    .trackTotalHits(true)
                    .size(1000000);
            request2.source(searchSourceBuilder2);
            try {
                SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
                SearchHits searchHits = search2.getHits();
                Long totalHits = searchHits.getTotalHits().value;
                if (totalHits<5) {
                    SearchHit[] hits = searchHits.getHits();
                    if (hits.length > 0) {
                        JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
                        data.setMergeTarget(sourceItem.getString("mergeTarget"));
                        data.setStartTime(query.getStartTime());
                        data.setEndTime(query.getEndTime());
                        data.setBatchNumber(item.getBatchNumber());
                        data.setOriginalCount(item.getCount());
                        data.setTrackCount(totalHits);
                        list.add(data);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        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(), LeaveOutData.class).sheet("北斗轨迹数据遗漏")
                    .doWrite(list);
        } catch (Exception e) {
            // 重置response
            System.out.println("导出北斗轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
        }
    }

    @Override
    public void hlxyjrhLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
        List<LeaveOutData> list = new ArrayList<>();
        List<LeaceOutDto> dtos = new ArrayList<>();
        Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
        String time = DateUtils.format(startTime,"yyyy-MM-dd");
        SearchRequest request = new SearchRequest(INDEX_SEAT_HLX_FUSION_SHIP+time);
        // 构建查询条件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("time").gte(query.getStartTime()).lte(query.getEndTime()));
        searchSourceBuilder.query(boolQueryBuilder);
        TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
                .field("targetID")
                .size(1000000);
        searchSourceBuilder
                .trackTotalHits(true)
                .aggregation(aggBuilder)
                .size(1000000);
        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()) {
            LeaceOutDto dto = new LeaceOutDto();
            dto.setBatchNumber(bucket.getKeyAsString());
            dto.setCount(Long.valueOf(bucket.getDocCount()));
            dtos.add(dto);
        }
        dtos.forEach(item->{
            LeaveOutData data = new LeaveOutData();
            SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
            // 构建查询条件
            BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
            SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
            boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
            boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
            boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","AIS","RADAR","AIS_BEIDOU","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
            searchSourceBuilder2.query(boolQueryBuilder2)
                    .trackTotalHits(true)
                    .size(1000000);
            request2.source(searchSourceBuilder2);
            try {
                SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
                SearchHits searchHits = search2.getHits();
                Long totalHits = searchHits.getTotalHits().value;
                if (totalHits<5) {
                    SearchHit[] hits = searchHits.getHits();
                    if (hits.length > 0) {
                        JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
                        data.setMergeTarget(sourceItem.getString("mergeTarget"));
                        data.setStartTime(query.getStartTime());
                        data.setEndTime(query.getEndTime());
                        data.setBatchNumber(item.getBatchNumber());
                        data.setOriginalCount(item.getCount());
                        data.setTrackCount(totalHits);
                        list.add(data);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("海兰信1级融合轨迹数据遗漏", "UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
            EasyExcel.write(response.getOutputStream(), LeaveOutData.class).sheet("海兰信1级融合轨迹数据遗漏")
                    .doWrite(list);
        } catch (Exception e) {
            // 重置response
            System.out.println("导出海兰信1级融合轨迹数据遗漏excel失败:{}" + e.getMessage() + e);
        }
    }

    @Override
    public void tianaoStaticOrDynamicLeaveOutExcel(FusionQuery query, HttpServletResponse response) throws IOException, ParseException {
        List<StaticOrDynamicData> list = new ArrayList<>();
        List<LeaceOutDto> dtos = new ArrayList<>();
        Date startTime = DateUtils.parse(query.getStartTime(),"yyyy-MM-dd");
        String time = DateUtils.format(startTime,"yyyy-MM-dd");
        SearchRequest request = new SearchRequest(INDEX_SEAT_TRACK_RADAR+time);
        // 构建查询条件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("receiveTime").gte(query.getStartTime()).lte(query.getEndTime()));
        boolQueryBuilder.filter(QueryBuilders.termQuery("targetProper","1"));
        searchSourceBuilder.query(boolQueryBuilder);
        TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("ship_field_agg")
                .field("fusionBatchNum")
                .size(1000000);
        searchSourceBuilder
                .trackTotalHits(true)
                .aggregation(aggBuilder)
                .size(1000000);
        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()) {
            LeaceOutDto dto = new LeaceOutDto();
            dto.setBatchNumber(bucket.getKeyAsString());
            dto.setCount(Long.valueOf(bucket.getDocCount()));
            dtos.add(dto);
        }
        dtos.forEach(item->{
            StaticOrDynamicData data = new StaticOrDynamicData();
            SearchRequest request2 = new SearchRequest(INDEX_SEAT_REALTIMETRAJECTORY+time);
            // 构建查询条件
            BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();
            SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
            boolQueryBuilder2.filter(QueryBuilders.wildcardQuery("trackDeviceNo", "*,"+ item.getBatchNumber() +",*"));
            boolQueryBuilder2.filter(QueryBuilders.termQuery("targetType","0"));
            boolQueryBuilder2.filter(QueryBuilders.rangeQuery("mergeTime").gte(query.getStartTime()).lte(query.getEndTime()));
            boolQueryBuilder2.filter(QueryBuilders.termsQuery("mergeType","RADAR","AIS_RADAR","BEIDOU_RADAR","AIS_BEIDOU_RADAR"));
            searchSourceBuilder2.query(boolQueryBuilder2)
                    .trackTotalHits(true)
                    .size(1000000);
            request2.source(searchSourceBuilder2);
            try {
                SearchResponse search2 = client.search(request, RequestOptions.DEFAULT);
                SearchHits searchHits = search2.getHits();
                SearchHit[] hits = searchHits.getHits();
                if (hits.length > 0) {
                    JSONObject sourceItem = JSONObject.parseObject(hits[0].getSourceAsString());
                    data.setMergeTarget(sourceItem.getString("mergeTarget"));
                    data.setBatchNumber(item.getBatchNumber());
                    list.add(data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        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(), StaticOrDynamicData.class).sheet("天奥静态数据与动态轨迹融合")
                    .doWrite(list);
        } catch (Exception e) {
            // 重置response
            System.out.println("导出天奥静态数据与动态轨迹融合excel失败:{}" + e.getMessage() + e);
        }
    }
}