package info.aspirecn.cloud.yysj.dao.es; import info.aspirecn.cloud.yysj.config.IndexConfig; import info.aspirecn.cloud.yysj.model.response.OrderStatistics; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; 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.QueryBuilders; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.histogram.ParsedDateHistogram; import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * ElasticSearch 云验数据平台子订单索引查询 * * @author dingliqiang */ @Repository public class YysjGatewayFirstIndex { /** * 车辆查询 */ private static final String QUERY_CAR_INFO = "/info_check/carInfo.do"; /** * 驾驶员查询 */ private static final String QUERY_DRIVER_INFO = "/info_check/driverInfo.do"; /** * 运单查询 */ private static final String QUERY_WAYBILL_INFO = "/info_check/waybill.do"; /** * ,人员:https://yunyancrm.logink.cn/gateway/info_check/personRoadTransport.do */ private static final String QUERY_COMPANY_ROAD_INFO = "/info_check/companyRoadTransport.do"; /** * 车辆:https://yunyancrm.logink.cn/gateway/info_check/carRoadTransport.do */ private static final String QUERY_CAR_ROAD_INFO = "/info_check/carRoadTransport.do"; /** * 人员https://yunyancrm.logink.cn/gateway/info_check/personRoadTransport.do */ private static final String QUERY_PERSON_ROAD_INFO= "/info_check/personRoadTransport.do"; /** * 查询产品类型 */ private static final String[] QUERY_TYPE = {QUERY_CAR_INFO, QUERY_DRIVER_INFO, QUERY_WAYBILL_INFO,QUERY_COMPANY_ROAD_INFO, QUERY_CAR_ROAD_INFO,QUERY_PERSON_ROAD_INFO }; @Autowired private RestHighLevelClient restHighLevelClient; @Autowired private IndexConfig indexConfig; /** * 统计云验平台用户调用总量、车辆、运单、司机信息 * * @param userId 云验平台用户ID * @return 用户调用总量、车辆、运单、司机统计信息 */ @SneakyThrows(IOException.class) public List getTotalConsumptionAmount(String userId) { // 设置云验平台用户当日总量、车辆、运单、司机接口调用量集合 List orderStatisticsList = new ArrayList<>(); // 构建查询源构建器 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); searchSourceBuilder.query(QueryBuilders.boolQuery() .filter(QueryBuilders.rangeQuery("DateTime").gte("now-15d")) .must(QueryBuilders.termQuery("MG-UserId", userId)) .must(QueryBuilders.termsQuery("URI.keyword", QUERY_TYPE))); searchSourceBuilder.aggregation(AggregationBuilders.dateHistogram("daily_count") .field("DateTime").format("yyyy-MM-dd").dateHistogramInterval(DateHistogramInterval.DAY) .subAggregation(AggregationBuilders.terms("orders_received_statistics").field("URI.keyword"))); // 创建查询请求对象,将查询对象配置到其中 SearchRequest request = new SearchRequest(indexConfig.getIndexYysjFirst()).source(searchSourceBuilder); // 执行查询请求,获取响应信息 SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); if (!RestStatus.OK.equals(response.status()) || response.getAggregations() == null) { return orderStatisticsList; } // 获取响应中的聚合信息 ParsedDateHistogram parsedDateHistogram = response.getAggregations().get("daily_count"); // 获取分桶信息 List buckets = parsedDateHistogram.getBuckets(); for (Histogram.Bucket bucket : buckets) { // 创建 OrderStatistics 对象,并设置车辆、运单、司机信息 OrderStatistics orderStatistics = getCarDriverWaybill(bucket); // 设置日期 orderStatistics.setDate(bucket.getKeyAsString()); // 设置总数 orderStatistics.setSum(bucket.getDocCount()); // 加入到集合 orderStatisticsList.add(orderStatistics); } return orderStatisticsList; } /** * 获取车辆、运单、司机产品的调用统计信息 * * @param bucket 分桶信息 * @return 车辆、运单、司机调用统计信息 */ private OrderStatistics getCarDriverWaybill(Histogram.Bucket bucket) { OrderStatistics orderStatistics = new OrderStatistics(); ParsedTerms termsAggregations = bucket.getAggregations().get("orders_received_statistics"); List termsBuckets = termsAggregations.getBuckets(); for (Terms.Bucket termsBucket : termsBuckets) { if (StringUtils.equalsIgnoreCase(QUERY_CAR_INFO, termsBucket.getKeyAsString())) { orderStatistics.setVehicle(termsBucket.getDocCount()); } else if (StringUtils.equalsIgnoreCase(QUERY_DRIVER_INFO, termsBucket.getKeyAsString())) { orderStatistics.setDriver(termsBucket.getDocCount()); } else if (StringUtils.equalsIgnoreCase(QUERY_WAYBILL_INFO, termsBucket.getKeyAsString())) { orderStatistics.setWaybill(termsBucket.getDocCount()); } else if (StringUtils.equalsIgnoreCase(QUERY_PERSON_ROAD_INFO, termsBucket.getKeyAsString())) { orderStatistics.setPerson(termsBucket.getDocCount()); } else if (StringUtils.equalsIgnoreCase(QUERY_CAR_ROAD_INFO, termsBucket.getKeyAsString())) { orderStatistics.setCarRoad(termsBucket.getDocCount()); } else if (StringUtils.equalsIgnoreCase(QUERY_COMPANY_ROAD_INFO, termsBucket.getKeyAsString())) { orderStatistics.setCompany(termsBucket.getDocCount()); } } return orderStatistics; } }