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<String, Object> culInfo = culOrDevDao.findById(clusterId);
|
Map<String, Object> 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<String,Object> getCluOrDevAndNameOrIpById(String id){
|
Map<String, Object> respMap = new HashMap<>();
|
List result = clusterService.getClusterDeviceTree();
|
if (result!=null && result.size() > 0){
|
List<MenuTreeVo> 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<String> sdkTypeField = Arrays.asList(C_Es_Map.esSdkType); // 1,2,3
|
List<String> 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<String> baseName, List<String> analyType, List<String> 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 <analyType.size();s++) {
|
for (int i =0;i<C_Es_Map.sdkValue.length;i++){
|
if (analyType.get(s).equalsIgnoreCase(C_Es_Map.sdkValue[i])){
|
analyType.set(s,C_Es_Map.esSdkType[i]);
|
}
|
}
|
}
|
}
|
String sdkValueJson = terms.replace("sdkValues", JSONArray.toJSONString(analyType));
|
analyJson += sdkValueJson;
|
queryEquJson = queryEquJson.replace("sdkTypes",analyJson);
|
}
|
if (videoReqNum == null || videoReqNum.isEmpty()){
|
// if (isHas)mustQueryJson+=",";
|
}else {
|
if (!isHas){isHas = true;}else { mustQueryJson+=",";}
|
String reqJson = terms.replace("sdkType", "videoReqNum");// 汇总数据类型
|
String reqValueJson = reqJson.replace("sdkValues", JSONArray.toJSONString(videoReqNum));
|
mustQueryJson += reqValueJson;
|
}
|
if (!StringUtils.isBlank(startDate) || !StringUtils.isBlank(endDate)){
|
queryEquJson = queryEquJson.replace("now-3M/d",startDate);
|
queryEquJson = queryEquJson.replace("now/d",endDate);
|
}
|
// ["DS-2CD2T46WDA2-I8278",""] 设备id videoReqQuery
|
queryEquJson = queryEquJson.replace("mustQueryJson",mustQueryJson);
|
log.info("设备汇总调用json:"+queryEquJson);
|
// 开始调用
|
JSONObject analyParams = JSONObject.parseObject(queryEquJson);
|
String bsUrl = "http://"+enumStr.getEsHOSTNAME()+":"+enumStr.getEsHTTP_PORT();
|
String esBaseUrl = enumStr.getEsIndexUrl()+enumStr.getEsSearch();
|
JSONObject respView = new JSONObject();
|
JSONObject respData = null;
|
String resp = RestTemplateUtil.post(bsUrl+esBaseUrl,
|
analyParams, MediaType.APPLICATION_JSON_UTF8, false);
|
if(StringUtils.isNotEmpty(resp))
|
respData = JSONObject.parseObject(resp);
|
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");
|
Long alarmCount = ((JSONObject) obj).getLong("doc_count"); //
|
JSONObject devSouce = new JSONObject();
|
devSouce.put("devId",devId);
|
devSouce.put("alarmCount",alarmCount);
|
devList.add(devSouce);
|
}
|
respView.put("equList",devList);
|
return respView;
|
}
|
|
/**
|
* 汇总 报警设备 数量
|
* @return
|
*/
|
@Override
|
public JSONObject aggEsDevSum() {
|
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");
|
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");
|
Long alarmCount = ((JSONObject) obj).getLong("doc_count"); //
|
JSONObject devSouce = new JSONObject();
|
devSouce.put("devId",devId);
|
devSouce.put("alarmCount",alarmCount);
|
devList.add(devSouce);
|
}
|
respView.put("total",devList.size());
|
respView.put("equList",devList);
|
return respView;
|
}
|
}
|