package com.cloud.retrieve.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cloud.common.utils.RestTemplateUtil; import com.cloud.retrieve.dao.CulOrDevDao; import com.cloud.retrieve.service.AggDataByEsService; import com.cloud.retrieve.service.ClusterService; import com.cloud.retrieve.utils.C_Es_Map; import com.cloud.retrieve.utils.EnumStr; import com.cloud.retrieve.vo.MenuTreeVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import java.util.*; @Slf4j @Service public class AggDataByEsServiceImpl implements AggDataByEsService { @Autowired private EnumStr enumStr; @Autowired private CulOrDevDao culOrDevDao; @Autowired private ClusterService clusterService; /** * 聚合全部底库列表 * wp * 2019-01-08 * @return */ @Override public JSONArray getAllDataBaseFromEs() { String bsUrl = "http://"+enumStr.getEsHOSTNAME()+":"+enumStr.getEsHTTP_PORT(); String esBaseUrl = enumStr.getEsIndexUrl()+enumStr.getEsSearch(); String postJson = "{\"size\":0,\"aggs\":" + "{\"cluster_ids\":{\"terms\":{\"field\":\"cluster_id\",\"size\":100}," + "\"aggs\":{\"BaseNames\":{\"terms\":{\"field\":\"BaseName.raw\",\"size\":100}," + "\"aggs\":{\"personIsHub\":{\"terms\":{\"field\":\"personIsHub\",\"size\":100}}}}}}}}"; JSONObject dataBaseParams = JSONObject.parseObject(postJson); // log.info("请求地址:"+bsUrl+esBaseUrl+",postJson:"+postJson); JSONObject respData = null; String resp = RestTemplateUtil.post(bsUrl+esBaseUrl,dataBaseParams,MediaType.APPLICATION_JSON_UTF8,false); if(StringUtils.isNotEmpty(resp)) respData = JSONObject.parseObject(resp); // JSONObject respData = restTemplateUtil.post(bsUrl+esBaseUrl, // dataBaseParams, MediaType.APPLICATION_JSON_UTF8, JSONObject.class, false); JSONArray clusterList = respData.getJSONObject("aggregations").getJSONObject("cluster_ids").getJSONArray("buckets"); JSONArray respArray = new JSONArray(); // 集群信息 for (Object cluster : clusterList){ JSONObject jsonObj = new JSONObject(); JSONObject cluste = (JSONObject)cluster; // 集群信息 String clusterId = cluste.getString("key"); // Map culInfo = culOrDevDao.findById(clusterId); Map culInfo = getCluOrDevAndNameOrIpById(clusterId); if (culInfo != null){ jsonObj.put("cluId",culInfo.get("id")); jsonObj.put("cluName",culInfo.get("name")); JSONArray baseArray = new JSONArray(); JSONArray dataBaseList = cluste.getJSONObject("BaseNames").getJSONArray("buckets"); for (Object db : dataBaseList) { JSONObject dB = (JSONObject)db; // String baseName = dB.getString("key"); if (!baseName.isEmpty() && !"wait todo".equalsIgnoreCase(baseName)){ String baseValue = baseName.startsWith("lt_")?baseName.substring(3):baseName; JSONArray dbTypeList = dB.getJSONObject("personIsHub").getJSONArray("buckets"); if (dbTypeList != null && dbTypeList.size()>0){ for (Object o : dbTypeList) { JSONObject dataBase = new JSONObject(); dataBase.put("baseName",addCluAndBaseNameAndHub(jsonObj.getString("cluId"),baseName,((JSONObject)o).getString("key"))); // 是否要加集群id--------------------> 汇总后梳理 dataBase.put("baseValue",baseValue); dataBase.put("personIsHub",((JSONObject)o).getString("key")); baseArray.add(dataBase); } } } } jsonObj.put("dblist",baseArray); respArray.add(jsonObj); } } return respArray; } /** * 合并底库数据条件 * @param cluId * @param baseName * @param hubStatus * @return */ public String addCluAndBaseNameAndHub(String cluId,String baseName,String hubStatus){ return (cluId!=null?cluId:"")+"$"+(baseName!=null?baseName:"")+"$"+(hubStatus!=null?hubStatus:""); } // 依据 集群id 获取 集群 name public Map getCluOrDevAndNameOrIpById(String id){ Map respMap = new HashMap<>(); List result = clusterService.getClusterDeviceTree(); if (result!=null && result.size() > 0){ List data = JSONArray.parseArray(result.toString(),MenuTreeVo.class); for (MenuTreeVo datum : data) { if (datum.getId().equals(id) && datum.getType().equals("1")){ respMap.put("name",datum.getName()); respMap.put("id",datum.getId()); return respMap; } } } return null; } /** *从 es 聚合 全部分析列表 * wp * 2019-01-08 * @return */ @Override public JSONArray getAnalyListByEs(){ String bsUrl = "http://"+enumStr.getEsHOSTNAME()+":"+enumStr.getEsHTTP_PORT(); String esBaseUrl = enumStr.getEsIndexUrl()+enumStr.getEsSearch(); String postJson = "{\"size\":0,\"aggs\":{" + "\"personaction_type\":{\"terms\":{\"field\":\"sdkType\",\"order\":[{\"_term\":\"asc\"}]}}}}"; log.info("获取分析列表:"+postJson); JSONObject analyParams = JSONObject.parseObject(postJson); log.info("请求地址:"+bsUrl+esBaseUrl); JSONObject respData = null; String resp = RestTemplateUtil.post(bsUrl+esBaseUrl, analyParams, MediaType.APPLICATION_JSON_UTF8, false); if(StringUtils.isNotEmpty(resp)) respData = JSONObject.parseObject(resp); List sdkTypeField = Arrays.asList(C_Es_Map.esSdkType); // 1,2,3 List sdkValue = Arrays.asList(C_Es_Map.sdkValue); // 人脸, JSONArray array = new JSONArray(); // 返回集合 JSONArray sdkTypeList = respData.getJSONObject("aggregations").getJSONObject("personaction_type").getJSONArray("buckets"); if (sdkTypeList.size()>0){ for (Object db : sdkTypeList){ // sdkType String sdkType = ((JSONObject) db).getString("key"); int i = sdkTypeField.indexOf(sdkType); // 获取对应值 String s = sdkValue.get(i); // 获取对应展示内容 array.add(s); } } // 互换位置 if(array.contains("拥挤") && array.contains("入侵")){ int i = array.indexOf("入侵"); Collections.swap(array,i,array.indexOf("拥挤")); } return array; } /** * 汇总 人员报警数据 数量 * @return */ @Override public JSONObject aggEsPersonSum() { String bsUrl = "http://"+enumStr.getEsHOSTNAME()+":"+enumStr.getEsHTTP_PORT(); String esBaseUrl = enumStr.getEsIndexUrl()+enumStr.getEsSearch(); String reqJson = "{\"query\":{\"bool\":{\"must\":[" + "{\"terms\":{\"ack_alarm\":[\"0\",\"\"]}}," + "{\"term\":{\"personIsHub\":\"1\"}}]}},\"size\":0," + "\"aggs\":{\"singleCamAlarms\":{\"filter\":{\"range\":{\"picDate\":{\"gte\":\"now-3M/d\",\"lte\":\"now/d\"}}}," + "\"aggs\":{\"singleCamAlarms\":{\"terms\":{\"field\":\"videoReqNum\"}}}}}}"; JSONObject analyParams = JSONObject.parseObject(reqJson); JSONObject respData = null; String resp = RestTemplateUtil.post(bsUrl+esBaseUrl, analyParams, MediaType.APPLICATION_JSON_UTF8, false); if(StringUtils.isNotEmpty(resp)) respData = JSONObject.parseObject(resp); JSONObject respView = new JSONObject(); Long total = respData.getJSONObject("hits").getLong("total"); respView.put("total",total); JSONArray jsonArray = respData.getJSONObject("aggregations").getJSONObject("singleCamAlarms") .getJSONObject("singleCamAlarms").getJSONArray("buckets"); JSONArray devList = new JSONArray(); for (Object obj : jsonArray) { String devId = ((JSONObject) obj).getString("key"); devList.add(devId); } respView.put("equList",devList); return respView; } @Override public JSONObject aggDevSumByEsParams(List baseName, List analyType, List videoReqNum, String startDate, String endDate) { String queryEquJson = C_Es_Map.queryHubEquJson; String term = C_Es_Map.term; // String terms = C_Es_Map.terms; // // ["DS-2CD2T46WDA2-I8278",""] 底库 过滤 boolean isHas = true; String mustQueryJson = ""; if (baseName == null || baseName.isEmpty()){ }else { if (!isHas){isHas = true;}else {mustQueryJson+=",";} String baseNameJson = terms.replace("sdkType", "BaseName"+C_Es_Map.fieldRaw);// 汇总数据类型 String sdkValueJson = baseNameJson.replace("sdkValues", JSONArray.toJSONString(baseName)); mustQueryJson += sdkValueJson; } // ["1",""] sdkType {"terms":{"sdkType":["1","6","4","7","8"]}}, if (analyType == null|| analyType.isEmpty()){ queryEquJson = queryEquJson.replace("sdkTypes",""); }else { // {"term":{"viType":"1"}}, String analyJson = ""; if (analyType.contains("人脸")){ analyJson += term; analyType.remove("人脸"); if (analyType.size()>0) analyJson += ","; } if (analyType.size()>0){ for (int s=0;s