Parcourir la source

es的聚合查询方法
黑烟的分组查询接口

459242451@qq.com il y a 3 ans
Parent
commit
bee049273a

+ 36 - 13
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gas/BlackGasController.java

@@ -1,7 +1,5 @@
 package com.ruoyi.web.controller.gas;
 
-import cn.afterturn.easypoi.excel.ExcelExportUtil;
-import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -11,30 +9,29 @@ import com.ruoyi.common.constant.ElasticConstants;
 import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.page.PageDomain;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.page.TableSupport;
+import com.ruoyi.common.enums.AggsType;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.config.ElasticSearchClient;
 import com.ruoyi.system.domain.ShipRecognition;
-import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.service.ISysDictTypeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.SneakyThrows;
-import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.FileOutputStream;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -52,6 +49,8 @@ public class BlackGasController extends BaseController {
 
     @Autowired
     private ElasticSearchClient client;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
 
     @GetMapping("/list")
     @ApiOperation("列表数据")
@@ -65,7 +64,7 @@ public class BlackGasController extends BaseController {
         equalsCondition.put("snapPos", StrUtil.isBlank(shipRecognition.getSnapPos()) ? null : StrUtil.concat(true, "*", shipRecognition.getSnapPos(), "*"));
         equalsCondition.put("aisDst", StrUtil.isBlank(shipRecognition.getAisDst()) ? null : StrUtil.concat(true, "*", shipRecognition.getAisDst(), "*"));
         equalsCondition.put("aisShipType", StrUtil.isBlank(shipRecognition.getAisShipType()) ? null : StrUtil.concat(true, "*", shipRecognition.getAisShipType(), "*"));
-        equalsCondition.put("rcgSoot",shipRecognition.getRcgSoot());
+        equalsCondition.put("rcgSoot", shipRecognition.getRcgSoot());
         // 组装范围查询条件
         Map<String, Object> rangeCondition = new HashMap<>();
         if (ObjectUtil.isNotEmpty(params.get("beginTime"))) {
@@ -74,7 +73,7 @@ public class BlackGasController extends BaseController {
         if (ObjectUtil.isNotEmpty(params.get("endTime"))) {
             params.put("endTime", params.get("endTime") + " 23:59:59");
         }
-        rangeCondition.put("snapTime", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]"));
+        rangeCondition.put("snapTimeFmt", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]"));
         List<String> orderBy = new ArrayList<>();
         orderBy.add("-snapTime");
         PageDomain pageDomain = TableSupport.buildPageRequest();
@@ -102,7 +101,7 @@ public class BlackGasController extends BaseController {
         equalsCondition.put("snapPos", StrUtil.isBlank(shipRecognition.getSnapPos()) ? null : StrUtil.concat(true, "*", shipRecognition.getSnapPos(), "*"));
         equalsCondition.put("aisDst", StrUtil.isBlank(shipRecognition.getAisDst()) ? null : StrUtil.concat(true, "*", shipRecognition.getAisDst(), "*"));
         equalsCondition.put("aisShipType", StrUtil.isBlank(shipRecognition.getAisShipType()) ? null : StrUtil.concat(true, "*", shipRecognition.getAisShipType(), "*"));
-        equalsCondition.put("rcgSoot",shipRecognition.getRcgSoot());
+        equalsCondition.put("rcgSoot", shipRecognition.getRcgSoot());
         // 组装范围查询条件
         Map<String, Object> rangeCondition = new HashMap<>();
         if (ObjectUtil.isNotEmpty(params.get("beginTime"))) {
@@ -111,7 +110,7 @@ public class BlackGasController extends BaseController {
         if (ObjectUtil.isNotEmpty(params.get("endTime"))) {
             params.put("endTime", params.get("endTime") + " 23:59:59");
         }
-        rangeCondition.put("snapTime", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]"));
+        rangeCondition.put("snapTimeFmt", StrUtil.concat(true, "[", Convert.toStr(params.get("beginTime")), ",", Convert.toStr(params.get("endTime")), "]"));
         List<String> orderBy = new ArrayList<>();
         orderBy.add("-snapTime");
         Map<String, Object> maps = client.searchDocument(ElasticConstants.HEIYAN_SHIP_RECOGNITION, equalsCondition, rangeCondition, orderBy, 0, 10000);
@@ -120,8 +119,32 @@ public class BlackGasController extends BaseController {
                 "黑烟违规数据",
                 "黑烟违规数据",
                 ShipRecognition.class,
-                Convert.toList(ShipRecognition.class,maps.get("pageList")),
+                Convert.toList(ShipRecognition.class, maps.get("pageList")),
                 request, response);
     }
 
+    @GetMapping("/snapPos/static")
+    @ApiOperation("黑烟抓拍分布统计")
+    public AjaxResult snapPosStatic(@RequestParam(required = false) String month) {
+        String beginTime = "";
+        String endTime = "";
+        if (StrUtil.isBlank(month)) {
+            beginTime = DateUtil.formatDate(DateUtil.beginOfMonth(new Date())) + " 00:00:00";
+            endTime = DateUtil.formatDate(DateUtil.endOfMonth(new Date())) + " 23:59:59";
+        } else {
+            beginTime = month + "-01 00:00:00";
+            endTime = DateUtil.formatDate(DateUtil.endOfMonth(DateUtil.parseDate(beginTime))) + " 23:59:59";
+        }
+        Map<String, Object> rangeCondition = new HashMap<>();
+        rangeCondition.put("snapTimeFmt", StrUtil.concat(true, "[", beginTime, ",", endTime, "]"));
+        Map<Object, Object> aggs = client.aggs(ElasticConstants.HEIYAN_SHIP_RECOGNITION, AggsType.count, "snapPos", "id", null, rangeCondition);
+        // 构造黑烟的数据
+        List<SysDictData> heiyan_snap_pos = dictTypeService.selectDictDataByType("heiyan_snap_pos");
+        Map<String, Object> result = new HashMap<>();
+        for (SysDictData heiyan_snap_po : heiyan_snap_pos) {
+            result.put(heiyan_snap_po.getDictLabel(), ObjectUtil.isEmpty(aggs.get(heiyan_snap_po.getDictLabel())) ? 0 : aggs.get(heiyan_snap_po.getDictLabel()));
+        }
+        return AjaxResult.success(result);
+    }
+
 }

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/service/Impl/GasCommonServiceImpl.java

@@ -87,8 +87,8 @@ public class GasCommonServiceImpl implements IGasCommonService {
 
     @SneakyThrows
     private void saveOrUpdate(String indexName, String id, Map<String, Object> map) {
-        Map<String, Object> doc = client.getDocById(indexName, id, "");
-        if (doc != null && ObjectUtil.equal(doc.get("code"), 200)) {
+        boolean b = client.existsById(indexName, id);
+        if (b) {
             // 更新操作
             client.updateDocument(indexName, id, map);
         } else {

+ 10 - 0
ruoyi-common/src/main/java/com/ruoyi/common/enums/AggsType.java

@@ -0,0 +1,10 @@
+package com.ruoyi.common.enums;
+
+/**
+ * description: 聚合metric类型枚举
+ * author: huangcheng
+ * create: 2021-09-02 10:11:20
+ **/
+public enum AggsType {
+    sum,min,max,count,avg
+}

+ 110 - 8
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ElasticSearchClient.java

@@ -3,6 +3,7 @@ package com.ruoyi.framework.config;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.ruoyi.common.constant.DefineConstant;
+import com.ruoyi.common.enums.AggsType;
 import com.ruoyi.framework.config.properties.ElasticSearchConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpHost;
@@ -44,6 +45,16 @@ import org.elasticsearch.index.query.TermQueryBuilder;
 import org.elasticsearch.index.query.WildcardQueryBuilder;
 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.BucketOrder;
+import org.elasticsearch.search.aggregations.bucket.terms.Terms;
+import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
+import org.elasticsearch.search.aggregations.metrics.ParsedAvg;
+import org.elasticsearch.search.aggregations.metrics.ParsedMax;
+import org.elasticsearch.search.aggregations.metrics.ParsedMin;
+import org.elasticsearch.search.aggregations.metrics.ParsedSum;
+import org.elasticsearch.search.aggregations.metrics.ValueCount;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
 import org.elasticsearch.search.sort.FieldSortBuilder;
@@ -60,6 +71,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -75,6 +87,8 @@ public class ElasticSearchClient {
 
     public static RestHighLevelClient client;
 
+    private static final String keyword = ".keyword";
+
     /**
      * 设置创建索引的相关参数
      */
@@ -192,8 +206,8 @@ public class ElasticSearchClient {
      * 更新文档内容
      *
      * @param indexName 索引名称
-     * @param id id
-     * @param paramMap paramMap
+     * @param id        id
+     * @param paramMap  paramMap
      */
     public void updateDocument(String indexName, String id, Map<String, Object> paramMap) {
 
@@ -225,7 +239,7 @@ public class ElasticSearchClient {
      * 删除文档数据
      *
      * @param indexName 索引名称
-     * @param id id
+     * @param id        id
      */
     public void deleteDocument(String indexName, String id) {
         DeleteRequest deleteRequest = new DeleteRequest(indexName, id);
@@ -365,11 +379,11 @@ public class ElasticSearchClient {
      * @Description ElasticSearch条件查询
      */
     public Map<String, Object> searchDocument(String indexName,
-                                                     Map<String, Object> equalsCondition,
-                                                     Map<String, Object> rangeCondition,
-                                                     List<String> orderBy,
-                                                     Integer pageNum,
-                                                     Integer pageSize) {
+                                              Map<String, Object> equalsCondition,
+                                              Map<String, Object> rangeCondition,
+                                              List<String> orderBy,
+                                              Integer pageNum,
+                                              Integer pageSize) {
         Map<String, Object> resultMap = new HashMap<>(8);
         List<Map<String, Object>> queryResult = new ArrayList<>();
         long totalNum = 0;
@@ -426,6 +440,94 @@ public class ElasticSearchClient {
     }
 
     /**
+     *
+     * @param indexName
+     * @param aggsType
+     * @param bucketName
+     * @param metricName 需要统计分析的字段
+     * @param equalsCondition
+     * @param rangeCondition
+     * @return
+     */
+    public Map<Object, Object> aggs(String indexName,
+                                    AggsType aggsType,
+                                    String bucketName,
+                                    String metricName,
+                                    Map<String, Object> equalsCondition,
+                                    Map<String, Object> rangeCondition) {
+        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
+
+        String by = "by_" + bucketName.replaceAll(keyword, "");
+        String me = aggsType.toString() + "_" + metricName.replaceAll(keyword, "");
+        TermsAggregationBuilder aggregation = AggregationBuilders.terms(by).field(bucketName);
+        //默认按照聚合结果降序排序
+        aggregation.order(BucketOrder.aggregation(me, false));
+        if (AggsType.count == aggsType) {
+            aggregation.subAggregation(AggregationBuilders.count(me).field(metricName)).size(10000);
+        } else if (AggsType.min == aggsType) {
+            aggregation.subAggregation(AggregationBuilders.min(me).field(metricName)).size(Integer.MAX_VALUE);
+        } else if (AggsType.max == aggsType) {
+            aggregation.subAggregation(AggregationBuilders.max(me).field(metricName)).size(Integer.MAX_VALUE);
+        } else if (AggsType.sum == aggsType) {
+            aggregation.subAggregation(AggregationBuilders.sum(me).field(metricName)).size(Integer.MAX_VALUE);
+        } else if (AggsType.avg == aggsType) {
+            aggregation.subAggregation(AggregationBuilders.avg(me).field(metricName)).size(Integer.MAX_VALUE);
+        }
+        sourceBuilder.aggregation(aggregation);
+
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        // 某一field=具体的值; 也可以某一field 的值 in 具体定义集合里的值
+        if (null != equalsCondition && !equalsCondition.isEmpty()) {
+            for (Map.Entry<String, Object> entry : equalsCondition.entrySet()) {
+                String key = entry.getKey();
+                //由于我创建索引的时候使用字符串不分词使用的.keyword类型
+                if (key.endsWith("_s")) {
+                    queryValueBuild(boolQueryBuilder, key + ".keyword", entry.getValue());
+                } else {
+                    queryValueBuild(boolQueryBuilder, key, entry.getValue());
+                }
+            }
+        }
+        //范围查询
+        if (null != rangeCondition && !rangeCondition.isEmpty()) {
+            rangeValueBuild(boolQueryBuilder, rangeCondition);
+        }
+        sourceBuilder.query(boolQueryBuilder);
+        sourceBuilder.size(0);
+
+        // 执行查询
+        SearchResponse response = executeSearch(indexName, sourceBuilder);
+        // 解析结果
+        Aggregations aggregations = response.getAggregations();
+        Terms terms = aggregations.get(by);
+        Map<Object, Object> map = new LinkedHashMap<>();
+        for (Terms.Bucket bucket : terms.getBuckets()) {
+            if (AggsType.count == aggsType) {
+                ValueCount count = bucket.getAggregations().get(me);
+                long value = count.getValue();
+                map.put(bucket.getKey(), value);
+            } else if (AggsType.min == aggsType) {
+                ParsedMin min = bucket.getAggregations().get(me);
+                double value = min.getValue();
+                map.put(bucket.getKey(), value);
+            } else if (AggsType.max == aggsType) {
+                ParsedMax max = bucket.getAggregations().get(me);
+                double value = max.getValue();
+                map.put(bucket.getKey(), value);
+            } else if (AggsType.sum == aggsType) {
+                ParsedSum sum = bucket.getAggregations().get(me);
+                double value = sum.getValue();
+                map.put(bucket.getKey(), value);
+            } else if (AggsType.avg == aggsType) {
+                ParsedAvg avg = bucket.getAggregations().get(me);
+                double value = avg.getValue();
+                map.put(bucket.getKey(), value);
+            }
+        }
+        return map;
+    }
+
+    /**
      * @param boolQueryBuilder
      * @param key
      * @param value