package com.kyexpress.common.syslog.provider.es;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
*
- @author 160332
*/
@Component
public class EsConfig {
private static final Logger logger = LoggerFactory.getLogger(EsConfig.class);
@Value("${elasticsearch.clients.cluster-default.clusterNodes}")
private String clusterNodes;
private String schema = “http”;
private int connectTimeOut = 3000;
private int socketTimeOut = 60000;
private int connectionRequestTimeOut = 600;
private int maxConnectNum = 200;
private int maxConnectPerRoute = 200;
private HttpHost httpHost;
private boolean uniqueConnectTimeConfig = true;
private boolean uniqueConnectNumConfig = true;
private RestClientBuilder builder;
private RestHighLevelClient client;
/**
* Bean name default 函数名字
*
* @return
*/
@Bean(autowire = Autowire.BY_NAME, name = "commonClinet")
public RestHighLevelClient client() {
logger.info("init client");
if (!StringUtils.isEmpty(clusterNodes)) {
try {
String[] ips = clusterNodes.split(",");
for (int i = 0; i < ips.length; i++) {
String ip = ips[i];
String host = ip.split(":")[0];
int port = Integer.parseInt(ip.split(":")[1]);
httpHost = new HttpHost(host, port, schema);
builder = RestClient.builder(httpHost);
if (uniqueConnectTimeConfig) {
setConnectTimeOutConfig();
}
if (uniqueConnectNumConfig) {
setMutiConnectConfig();
}
client = new RestHighLevelClient(builder);
break;
}
logger.info("end client");
} catch (Exception e) {
logger.error("elasticsearch TransportClient create error!!", e);
}
}
return client;
}
/**
* 异步httpclient的连接延时配置
*/
public void setConnectTimeOutConfig() {
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(connectTimeOut);
requestConfigBuilder.setSocketTimeout(socketTimeOut);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
return requestConfigBuilder;
}
});
}
/**
* 异步httpclient的连接数配置
*/
public void setMutiConnectConfig() {
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder;
}
});
}
/**
* 关闭连接
*/
public void close() {
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.kyexpress.common.syslog.provider.es;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.WriteRequest.RefreshPolicy;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
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.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.common.collect.Lists;
import com.kyexpress.common.syslog.api.model.bo.SysUserOperateLogBO;
import com.kyexpress.common.syslog.api.model.bo.SysUserOperateLogEsBO;
import com.kyexpress.common.syslog.api.model.bo.UserOperateLogBO;
import com.kyexpress.common.syslog.api.model.bo.UserOperateLogEsBO;
import com.kyexpress.common.syslog.api.model.mongo.UserOperateLog;
import com.kyexpress.common.syslog.api.model.vo.KafkaMessageVo;
import com.kyexpress.common.syslog.api.model.vo.SysUserOperateLogEsVo;
import com.kyexpress.common.syslog.api.model.vo.SysUserOperateLogVo;
import com.kyexpress.common.syslog.api.model.vo.UserOperateLogEsVo;
import com.kyexpress.common.syslog.api.model.vo.UserOperateLogVo;
import com.kyexpress.common.syslog.provider.constant.Constants;
import com.kyexpress.framework.model.GenericQuery;
import com.kyexpress.framework.model.Pagination;
import com.kyexpress.framework.model.ResponseData;
@Service
public class ElasticsearchHightService {
private final Logger logger = LoggerFactory.getLogger(ElasticsearchHightService.class);
/**
* 子索引
*/
private static String SYS_INDEX_DETAIL = "sys_user_operate_log_detail";
/**
* 主索引
*/
private static String BASE_INDEX_DATA = "base_user_operate_log_data";
/**
* 类型
*/
private static String INDEX_TYPE = "_doc";
private static ObjectMapper objectMapper;
@Autowired
RestHighLevelClient commonClinet;
private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
static {
// 把数据批量写入到数据库表中
objectMapper = new ObjectMapper();
// 转换为格式化的json
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
// 如果json中有新增的字段并且是实体类类中不存在的,不报错
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 过滤属性为空的字段
objectMapper.setSerializationInclusion(Include.NON_NULL);
}
/**
* 比对结果表插入es
*
* @param compareResults
*/
public void insertBacthBaseUserOperateLog(KafkaMessageVo messageVo) {
UserOperateLog sysLog = messageVo.getBaseDataLog();
// 如果dataId为空,就丢掉
if (StringUtils.isBlank(sysLog.getDataId())) {
return;
}
String esId = sysLog.getMasterId().concat("_").concat(sysLog.getTraceId());
UserOperateLogVo obj = srcObject2DestObject(sysLog);
try {
BulkRequest request = new BulkRequest();
// request.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
IndexRequest indexRequest = null;
indexRequest = new IndexRequest(BASE_INDEX_DATA, INDEX_TYPE, esId)
.source(objectMapper.writeValueAsString(obj), XContentType.JSON);
request.add(indexRequest).setRefreshPolicy(RefreshPolicy.IMMEDIATE);
while (true) {
try {
BulkResponse resp = commonClinet.bulk(request);
// 更新子表信息
updateEsOperateLogDetailByMasterIdAndTraceId(sysLog.getMasterId(), sysLog.getTraceId(), obj);
break;
} catch (Throwable e) {
logger.error("主数据插入es状态{}:", e.getMessage());
try {
Thread.sleep(60000L);
} catch (InterruptedException e1) {
logger.error(e1.getMessage(), e1);
}
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
private void updateEsOperateLogDetailByMasterIdAndTraceId(String masterId, String traceId, UserOperateLogVo obj) {
try {
SearchRequest searchRequest = new SearchRequest(SYS_INDEX_DETAIL);
searchRequest.types(INDEX_TYPE);
SearchSourceBuilder srb = new SearchSourceBuilder();
BoolQueryBuilder bq = QueryBuilders.boolQuery();
// 根据批次id查询数据
bq.must(QueryBuilders.termQuery("traceId", traceId));
bq.must(QueryBuilders.termQuery("masterId", masterId));
srb.query(bq);
searchRequest.source(srb);
try {
SearchResponse response = commonClinet.search(searchRequest);
SearchHits hits = response.getHits();
SearchHit[] searchHists = hits.getHits();
if (searchHists.length > 0) {
BulkRequest bulkRequest = new BulkRequest();
for (SearchHit hit : searchHists) {
Map<String, Object> hitMap = hit.getSourceAsMap();
if (null != hitMap) {
UpdateRequest updateRequest = new UpdateRequest(SYS_INDEX_DETAIL, INDEX_TYPE,
String.valueOf(hit.getId()));
updateRequest.docAsUpsert(true);
updateRequest.retryOnConflict(3);
updateRequest.doc(objectMapper.writeValueAsString(updateSysUserOperateLogVo(obj)),
XContentType.JSON);
bulkRequest.add(updateRequest);
}
}
BulkResponse resp = commonClinet.bulk(bulkRequest);
logger.info("更新明细es状态{}", resp.hasFailures());
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
private SysUserOperateLogVo updateSysUserOperateLogVo(UserOperateLogVo obj) {
SysUserOperateLogVo vo = new SysUserOperateLogVo();
vo.setBusinessNo(null != obj.getBusinessNo() ? obj.getBusinessNo() : null);
vo.setCanDelete(null != obj.getCanDelete() ? obj.getCanDelete() : Constants.NO);
vo.setDepartmentId(null != obj.getDepartmentId() ? obj.getDepartmentId() : null);
vo.setDepartmentName(null != obj.getDepartmentName() ? obj.getDepartmentName() : null);
vo.setMasterId(null != obj.getMasterId() ? obj.getMasterId() : null);
vo.setModuleCode(null != obj.getModuleCode() ? obj.getModuleCode() : null);
vo.setOperateContent(null != obj.getOperateContent() ? obj.getOperateContent() : null);
vo.setOperateDevice(null != obj.getOperateDevice() ? obj.getOperateDevice() : null);
vo.setOperateReason(null != obj.getOperateReason() ? obj.getOperateReason() : null);
vo.setOperateTime(null != obj.getOperateTime() ? obj.getOperateTime() : null);
vo.setOperateType(null != obj.getOperateType() ? obj.getOperateType() : null);
vo.setOperatorId(null != obj.getOperatorId() ? obj.getOperatorId() : null);
vo.setOperatorName(null != obj.getOperatorName() ? obj.getOperatorName() : null);
vo.setOperatorNumber(null != obj.getOperatorNumber() ? obj.getOperatorNumber() : null);
return vo;
}
/**
* 属性转换
*
* @param obj
* @return
*/
private UserOperateLogVo srcObject2DestObject(UserOperateLog obj) {
UserOperateLogVo vo = new UserOperateLogVo();
vo.setBusinessNo(obj.getBusinessNo());
vo.setCanDelete(obj.getCanDelete());
vo.setDataId(obj.getDataId());
vo.setDepartmentId(obj.getDepartmentId());
vo.setDepartmentName(obj.getDepartmentName());
vo.setMasterId(obj.getMasterId());
vo.setModuleCode(obj.getModuleCode());
vo.setOperateContent(obj.getOperateContent());
vo.setOperateDevice(obj.getOperateDevice());
vo.setOperateIp(null);
vo.setOperateReason(obj.getOperateReason());
vo.setOperateTime(null != obj.getOperateTime() ? obj.getOperateTime().getTime() : null);
vo.setOperateType(obj.getOperateType());
vo.setOperatorId(obj.getOperatorId());
vo.setOperatorName(obj.getOperatorName());
vo.setOperatorNumber(obj.getOperatorNumber());
vo.setPosition(obj.getPosition());
vo.setTraceId(obj.getTraceId());
return vo;
}
public UserOperateLogVo getEsById(String esId) {
UserOperateLogVo vo = null;
try {
SearchRequest searchRequest = new SearchRequest(BASE_INDEX_DATA);
searchRequest.types(INDEX_TYPE);
SearchSourceBuilder srb = new SearchSourceBuilder();
BoolQueryBuilder bq = QueryBuilders.boolQuery();
// 根据批次id查询数据
bq.must(QueryBuilders.termQuery("_id", esId));
srb.query(bq);
searchRequest.source(srb);
try {
SearchResponse response = commonClinet.search(searchRequest);
SearchHits hits = response.getHits();
SearchHit[] searchHists = hits.getHits();
for (SearchHit hit : searchHists) {
Map<String, Object> hitMap = hit.getSourceAsMap();
if (null != hitMap) {
vo = map2Object(hitMap);
}
// 只会存在一条数
break;
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
return vo;
}
private UserOperateLogVo map2Object(Map<String, Object> hitMap) {
UserOperateLogVo obj = new UserOperateLogVo();
if (null != hitMap) {
obj.setBusinessNo(null == hitMap.get("businessNo") ? null : String.valueOf(hitMap.get("businessNo")));
obj.setCanDelete(null == hitMap.get("canDelete") ? null : String.valueOf(hitMap.get("canDelete")));
obj.setDataId(null == hitMap.get("dataId") ? null : String.valueOf(hitMap.get("dataId")));
// obj.setComputerName(null == hitMap.get("computerName") ? null :
// String.valueOf(hitMap.get("computerName")));
obj.setDepartmentId(null == hitMap.get("departmentId") ? null : String.valueOf(hitMap.get("departmentId")));
obj.setDepartmentName(
null == hitMap.get("departmentName") ? null : String.valueOf(hitMap.get("departmentName")));
obj.setMasterId(null == hitMap.get("masterId") ? null : String.valueOf(hitMap.get("masterId")));
obj.setModuleCode(null == hitMap.get("moduleCode") ? null : String.valueOf(hitMap.get("moduleCode")));
obj.setOperateContent(
null == hitMap.get("operateContent") ? null : String.valueOf(hitMap.get("operateContent")));
obj.setOperateDevice(
null == hitMap.get("operateDevice") ? null : String.valueOf(hitMap.get("operateDevice")));
// obj.setOperateIp(null == hitMap.get("operateIp") ? null :
// String.valueOf(hitMap.get("operateIp")));
obj.setOperateReason(
null == hitMap.get("operateReason") ? null : String.valueOf(hitMap.get("operateReason")));
obj.setOperateTime(
null == hitMap.get("operateTime") ? null : Long.valueOf(String.valueOf(hitMap.get("operateTime"))));
obj.setOperateType(null == hitMap.get("operateType") ? null : String.valueOf(hitMap.get("operateType")));
obj.setOperatorId(null == hitMap.get("operatorId") ? null : String.valueOf(hitMap.get("operatorId")));
obj.setOperatorName(null == hitMap.get("operatorName") ? null : String.valueOf(hitMap.get("operatorName")));
obj.setOperatorNumber(
null == hitMap.get("operatorNumber") ? null : String.valueOf(hitMap.get("operatorNumber")));
obj.setPosition(null == hitMap.get("position") ? null : String.valueOf(hitMap.get("position")));
obj.setTraceId(null == hitMap.get("traceId") ? null : String.valueOf(hitMap.get("traceId")));
}
return obj;
}
public void inserSysUserOperateLog(List<SysUserOperateLogVo> lists, List<SysUserOperateLogVo> refreshbatchInserts) {
// 查询到主日志就直接插入明细日志
insertSysUserLog(lists);
// 如果查询不到主日志,就插入明细日志且强制刷新到es
insertrefresSysUserLog(refreshbatchInserts);
}
private void insertSysUserLog(List<SysUserOperateLogVo> lists) {
BulkRequest request = new BulkRequest();
try {
for (SysUserOperateLogVo obj : lists) {
IndexRequest indexRequest = null;
indexRequest = new IndexRequest(SYS_INDEX_DETAIL, INDEX_TYPE)
.source(objectMapper.writeValueAsString(obj), XContentType.JSON);
request.add(indexRequest);
}
while (true) {
try {
commonClinet.bulk(request);
break;
} catch (Throwable e) {
e.printStackTrace();
logger.info("插入明细日志失败,失败原因", e.getMessage());
try {
Thread.sleep(60000L);
} catch (InterruptedException e1) {
logger.error(e1.getMessage(), e1);
}
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
}
}
private void insertrefresSysUserLog(List<SysUserOperateLogVo> refreshbatchInserts) {
if (refreshbatchInserts.size() > 0) {
BulkRequest request = new BulkRequest();
try {
for (SysUserOperateLogVo obj : refreshbatchInserts) {
IndexRequest indexRequest = null;
indexRequest = new IndexRequest(SYS_INDEX_DETAIL, INDEX_TYPE)
.source(objectMapper.writeValueAsString(obj), XContentType.JSON);
request.add(indexRequest);
}
// 刷新完数据再结束请求
request.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
while (true) {
try {
BulkResponse resp = commonClinet.bulk(request);
BulkItemResponse[] items = resp.getItems();
for(BulkItemResponse item:items){
}
break;
} catch (Throwable e) {
logger.info("插入明细日志失败,失败原因", e.getMessage());
try {
Thread.sleep(60000L);
} catch (InterruptedException e1) {
logger.error(e1.getMessage(), e1);
}
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
public List<String> getModuleCodesByBusinessNo(String businessNo) {
List<String> moduleCodes = Lists.newArrayList();
try {
SearchRequest searchRequest = new SearchRequest(BASE_INDEX_DATA);
searchRequest.types(INDEX_TYPE);
SearchSourceBuilder srb = new SearchSourceBuilder();
BoolQueryBuilder bq = QueryBuilders.boolQuery();
// 根据批次id查询数据
bq.must(QueryBuilders.termQuery("businessNo", businessNo));
srb.query(bq);
searchRequest.source(srb);
try {
SearchResponse response = commonClinet.search(searchRequest);
SearchHits hits = response.getHits();
SearchHit[] searchHists = hits.getHits();
for (SearchHit hit : searchHists) {
Map<String, Object> hitMap = hit.getSourceAsMap();
if (null != hitMap) {
if (null != hitMap.get("moduleCode")
&& StringUtils.isNotBlank(String.valueOf(hitMap.get("moduleCode")))) {
moduleCodes.add(String.valueOf(hitMap.get("moduleCode")));
}
}
}
} catch (Exception ex) {
logger.error("error:{}", ex);
}
} catch (Exception ex) {
logger.error("error:{}", ex);
}
moduleCodes = moduleCodes.stream().distinct().collect(Collectors.toList());
return moduleCodes;
}
/**
* 分页获取主日志信息
*
* @param
* @return
*/
public ResponseData<Pagination> getBaseUserOperateLogData(UserOperateLogBO param) {
ResponseData<Pagination> result = new ResponseData<>();
Pagination<UserOperateLogEsBO> pagination = new Pagination<>();
List<UserOperateLogEsBO> lists = new ArrayList<>();
try {
SearchRequest searchRequest = new SearchRequest(BASE_INDEX_DATA);
searchRequest.types(INDEX_TYPE);
SearchSourceBuilder srb = new SearchSourceBuilder();
// 继续拼接where条件
Integer offset = (param.getPage() - 1) * param.getPageSize();
srb.from(offset).size(param.getPageSize());
BoolQueryBuilder bq = QueryBuilders.boolQuery();
List<GenericQuery> querys = param.getGeneric().getVos();
for (GenericQuery query : querys) {
if ("moduleCode".equals(query.getPropertyName())) {
bq.must(QueryBuilders.termQuery("moduleCode", query.getValues().get(0)));
}
// 业务编号
if ("businessNo".equals(query.getPropertyName())) {
bq.must(QueryBuilders.termQuery("businessNo", query.getValues().get(0)));
}
// 操作时间
if ("operateTimeFrom".equals(query.getPropertyName())) {
Date dt1 = df.parse(query.getValues().get(0));
Date dt2 = df.parse(query.getValues().get(1));
bq.must(QueryBuilders.rangeQuery("operateTime").gte(dt1.getTime()).lte(dt2.getTime()));
}
// 操作人
if ("operatorName".equals(query.getPropertyName())) {
bq.must(QueryBuilders.termQuery("operatorName", query.getValues().get(0)));
}
}
srb.query(bq).sort("operateTime", SortOrder.DESC);
;
searchRequest.source(srb);
try {
SearchResponse response = commonClinet.search(searchRequest);
SearchHits hits = response.getHits();
SearchHit[] searchHists = hits.getHits();
UserOperateLogEsVo obj = null;
for (SearchHit hit : searchHists) {
obj = new UserOperateLogEsVo();
Map<String, Object> hitMap = hit.getSourceAsMap();
obj = objectMapper.convertValue(hitMap, UserOperateLogEsVo.class);
if (null != hitMap.get("operateTime")
&& StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime")))) {
obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
}
// obj.setBusinessNo(
// null == hitMap.get("businessNo") ? null :
// String.valueOf(hitMap.get("businessNo")));
// obj.setOperateType(
// null == hitMap.get("operateType") ? null :
// String.valueOf(hitMap.get("operateType")));
// obj.setOperateContent(
// null == hitMap.get("operateContent") ? null :
// String.valueOf(hitMap.get("operateContent")));
// obj.setOperatorNumber(
// null == hitMap.get("operatorNumber") ? null :
// String.valueOf(hitMap.get("operatorNumber")));
// obj.setOperatorName(
// null == hitMap.get("operatorName") ? null :
// String.valueOf(hitMap.get("operatorName")));
// if (null != hitMap.get("operateTime")
// &&
// StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime"))))
// {
// obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
// }
// obj.setOperateDevice(
// null == hitMap.get("operateDevice") ? null :
// String.valueOf(hitMap.get("operateDevice")));
//
// 因为排除了operaTime字段,所以这里换个对象输出
UserOperateLogEsBO vo = new UserOperateLogEsBO();
BeanUtils.copyProperties(vo, obj);
lists.add(vo);
}
pagination.setRowTotal((int) hits.totalHits);
} catch (Exception ex) {
logger.error("error:{}", ex);
pagination.setRowTotal(0);
}
pagination.setRows(lists);
pagination.setPageSize(param.getPageSize());
pagination.setPage(param.getPage());
result.setData(pagination).ok();
} catch (Exception ex) {
logger.error("error:{}", ex);
}
return result;
}
/**
*
* @param
* @return
*/
public ResponseData<Pagination> getSysUserOperateLogDetail(SysUserOperateLogBO param) {
ResponseData<Pagination> result = new ResponseData<>();
Pagination<SysUserOperateLogEsBO> pagination = new Pagination<>();
List<SysUserOperateLogEsBO> lists = new ArrayList<>();
try {
SearchRequest searchRequest = new SearchRequest(SYS_INDEX_DETAIL);
searchRequest.types(INDEX_TYPE);
SearchSourceBuilder srb = new SearchSourceBuilder();
// 继续拼接where条件
Integer offset = (param.getPage() - 1) * param.getPageSize();
srb.from(offset).size(param.getPageSize());
BoolQueryBuilder bq = QueryBuilders.boolQuery();
List<GenericQuery> querys = param.getGeneric().getVos();
for (GenericQuery query : querys) {
if ("moduleCode".equals(query.getPropertyName())) {
bq.must(QueryBuilders.termQuery("moduleCode", query.getValues().get(0)));
}
// 业务编号
if ("businessNo".equals(query.getPropertyName())) {
bq.must(QueryBuilders.termQuery("businessNo", query.getValues().get(0)));
}
// 操作时间
if ("operateTimeFrom".equals(query.getPropertyName())) {
Date dt1 = df.parse(query.getValues().get(0));
Date dt2 = df.parse(query.getValues().get(1));
bq.must(QueryBuilders.rangeQuery("operateTime").gte(dt1.getTime()).lte(dt2.getTime()));
}
// 操作人
if ("operatorName".equals(query.getPropertyName())) {
bq.must(QueryBuilders.termQuery("operatorName", query.getValues().get(0)));
}
}
srb.query(bq).sort("operateTime", SortOrder.DESC);
searchRequest.source(srb);
try {
SearchResponse response = commonClinet.search(searchRequest);
SearchHits hits = response.getHits();
SearchHit[] searchHists = hits.getHits();
SysUserOperateLogEsVo obj = null;
for (SearchHit hit : searchHists) {
obj = new SysUserOperateLogEsVo();
Map<String, Object> hitMap = hit.getSourceAsMap();
obj = objectMapper.convertValue(hitMap, SysUserOperateLogEsVo.class);
if (null != hitMap.get("operateTime")
&& StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime")))) {
obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
}
obj.setId(hit.getId());
// // 修改后的值
// obj.setAfterValue(
// null == hitMap.get("afterValue") ? null :
// String.valueOf(hitMap.get("afterValue")));
// obj.setAfterValueConvert(null ==
// hitMap.get("afterValueConvert") ? null
// : String.valueOf(hitMap.get("afterValueConvert")));
// // 修改前的值
// obj.setBeforeValue(
// null == hitMap.get("beforeValue") ? null :
// String.valueOf(hitMap.get("beforeValue")));
// obj.setBeforeValueConvert(null ==
// hitMap.get("beforeValueConvert") ? null
// : String.valueOf(hitMap.get("beforeValueConvert")));
// // 业务编号
// obj.setBusinessNo(
// null == hitMap.get("businessNo") ? null :
// String.valueOf(hitMap.get("businessNo")));
// obj.setCanDelete(null == hitMap.get("canDelete") ? null :
// String.valueOf(hitMap.get("canDelete")));
// // 子表业务编号
// obj.setChildBusinessNo(null ==
// hitMap.get("childBusinessNo") ? null
// : String.valueOf(hitMap.get("childBusinessNo")));
// obj.setDataId(null == hitMap.get("dataId") ? null :
// String.valueOf(hitMap.get("dataId")));
// if (null != hitMap.get("dataModifyTime")) {
// if
// (StringUtils.isNotBlank(String.valueOf(hitMap.get("dataModifyTime"))))
// {
// obj.setDataModifyTime(null ==
// hitMap.get("dataModifyTime") ? 0L
// :
// Long.valueOf(String.valueOf(hitMap.get("dataModifyTime"))));
// }
// }
// // 操作类型
// obj.setOperateType(
// null == hitMap.get("operateType") ? null :
// String.valueOf(hitMap.get("operateType")));
// obj.setDepartmentId(
// null == hitMap.get("departmentId") ? null :
// String.valueOf(hitMap.get("departmentId")));
// obj.setDepartmentName(
// null == hitMap.get("departmentName") ? null :
// String.valueOf(hitMap.get("departmentName")));
// // 业务实体描述
// obj.setEntityComment(
// null == hitMap.get("entityComment") ? null :
// String.valueOf(hitMap.get("entityComment")));
// obj.setEntityName(
// null == hitMap.get("entityName") ? null :
// String.valueOf(hitMap.get("entityName")));
// // 字段名称
// obj.setFieldName(null == hitMap.get("fieldName") ? null :
// String.valueOf(hitMap.get("fieldName")));
//
// obj.setFieldComment(
// null == hitMap.get("fieldComment") ? null :
// String.valueOf(hitMap.get("fieldComment")));
// obj.setMasterId(null == hitMap.get("masterId") ? null :
// String.valueOf(hitMap.get("masterId")));
// obj.setModuleCode(
// null == hitMap.get("moduleCode") ? null :
// String.valueOf(hitMap.get("moduleCode")));
//
// // 操作内容
// obj.setOperateContent(
// null == hitMap.get("operateContent") ? null :
// String.valueOf(hitMap.get("operateContent")));
// // 操作设备
// obj.setOperateDevice(
// null == hitMap.get("operateDevice") ? null :
// String.valueOf(hitMap.get("operateDevice")));
// obj.setOperateReason(
// null == hitMap.get("operateReason") ? null :
// String.valueOf(hitMap.get("operateReason")));
// if (null != hitMap.get("operateTime")
// &&
// StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime"))))
// {
// obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
// }
//
// // 操作人工号
// obj.setOperatorNumber(
// null == hitMap.get("operatorNumber") ? null :
// String.valueOf(hitMap.get("operatorNumber")));
// // 操作人
// obj.setOperatorName(
// null == hitMap.get("operatorName") ? null :
// String.valueOf(hitMap.get("operatorName")));
// 因为排除了operaTime字段,所以这里换个对象输出
SysUserOperateLogEsBO vo = new SysUserOperateLogEsBO();
BeanUtils.copyProperties(vo, obj);
lists.add(vo);
}
pagination.setRowTotal((int) hits.totalHits);
} catch (Exception ex) {
logger.error("error:{}", ex);
pagination.setRowTotal(0);
}
pagination.setRows(lists);
pagination.setPageSize(param.getPageSize());
pagination.setPage(param.getPage());
result.setData(pagination).ok();
} catch (Exception ex) {
logger.error("error:{}", ex);
}
return result;
}
private String dateLong2String(String time) {
try {
Date date = new Date();
date.setTime(Long.valueOf(time));
return df.format(date);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return time;
}
/**
* 删除无用数据
*
*/
public void deleteSysOperaLog(String canDeleteValue, Long time) {
try {
String method = "POST";
String endpoint = "/" + SYS_INDEX_DETAIL + "/_delete_by_query?conflicts=proceed&wait_for_completion=false";
HttpEntity entity = new NStringEntity("{\n" + "\"query\": {\n" + "\"bool\": {\n" + "\"must\": [\n" + "{\n"
+ "\"term\": {\n" + " \"canDelete\": {\n" + "\"value\": \"" + canDeleteValue + "\"}\n" + "}\n"
+ "}\n" + ",{\n" + "\"range\": {\n" + "\"operateTime\": {\n" + "\"lt\": " + time + "}\n" + "}\n"
+ "}\n" + "]\n" + "}\n" + "}\n" + "}", ContentType.APPLICATION_JSON);
Response response = commonClinet.getLowLevelClient().performRequest(method, endpoint,
Collections.<String, String> emptyMap(), entity);
logger.info("删除无效明细日志成功", response.getStatusLine().getStatusCode());
} catch (IOException e) {
logger.error("jsonBuild fail:{}", e);
}
}
}