Merge branch 'develop/oprlog_modify/221014' into 'dev'

Develop/oprlog modify/221014

See merge request infra/xlog!20
This commit is contained in:
彭健 2022-10-12 10:31:47 +00:00
commit 2747e67934
5 changed files with 145 additions and 113 deletions

View File

@ -65,7 +65,30 @@ public class OperateLogController {
return CommonResponse.fail("the time span is greater than 7");
}
try {
CommonPageResponse<OperateLogQueryRespDTO> resp = operateLogService.queryForPage(req);
CommonPageResponse<OperateLogQueryRespDTO> resp = operateLogService.queryBasicInfoForPage(req);
return CommonResponse.success(resp);
} catch (Exception e) {
logger.error("query operate logs failed,", e);
return CommonResponse.fail(e.getMessage());
}
}
@RequestMapping(value = "/operateLog/queryDetailForPage", method = RequestMethod.POST)
@ApiOperation(value = "操作日志分页查询(详情列表)")
public CommonResponse<CommonPageResponse<OperateLogQueryDetailRespDTO>> operateLogsQueryDetail(@RequestBody @Valid OperateLogQueryReqDTO req,
BindingResult bindingResult) {
//参数缺失等返回
if (bindingResult.hasErrors()) {
return CommonResponse.fail(bindingResult.getAllErrors().get(0).getDefaultMessage());
}
//时间跨度校验
if (DateUtil.betweenDay(req.getStartTime(), req.getEndTime(), true) > 7) {
logger.error("start and end date interval greater than 7.");
return CommonResponse.fail("the time span is greater than 7");
}
try {
CommonPageResponse<OperateLogQueryDetailRespDTO> resp = operateLogService.queryForPage(req);
return CommonResponse.success(resp);
} catch (Exception e) {
logger.error("query operate logs failed,", e);
@ -75,7 +98,7 @@ public class OperateLogController {
@RequestMapping(value = "/operateLog/queryDetail", method = RequestMethod.POST)
@ApiOperation(value = "操作日志详情查询")
@ApiOperation(value = "单条操作日志详情查询")
public CommonResponse<OperateLogQueryDetailRespDTO> operateLogDetail(@RequestBody OperateLogQueryDetailReqDTO reqDTO) {
try {
OperateLogQueryDetailRespDTO detail = operateLogService.queryOperateLogDetail(reqDTO);

View File

@ -14,6 +14,9 @@ import java.util.Date;
@Data
public class OperateLogQueryDetailRespDTO {
@ApiModelProperty(value = "记录ID", position = 1)
private String id;
/**
* 操作人
*/

View File

@ -17,21 +17,21 @@ public interface OperateLogService {
boolean insertOperaLog(OperateLogReqDTO operateLogReq) throws Exception;
/**
* 分页查询
* 分页查询 返回基本字段
*
* @param req
* @return
*/
CommonPageResponse<OperateLogQueryRespDTO> queryForPage(OperateLogQueryReqDTO req) throws Exception;
CommonPageResponse<OperateLogQueryRespDTO> queryBasicInfoForPage(OperateLogQueryReqDTO req) throws Exception;
/**
* query from es
* 返回详情信息
*
* @param req
* @return
* @throws Exception
*/
CommonPageResponse<OperateLogQueryRespDTO> queryForPageFromEs(OperateLogQueryReqDTO req) throws Exception;
CommonPageResponse<OperateLogQueryDetailRespDTO> queryForPage(OperateLogQueryReqDTO req) throws Exception;
/**
* 查询每个日志的详情
@ -40,4 +40,5 @@ public interface OperateLogService {
* @return
*/
OperateLogQueryDetailRespDTO queryOperateLogDetail(OperateLogQueryDetailReqDTO req) throws Exception;
}

View File

@ -39,6 +39,7 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.function.BiConsumer;
/***
* @author: pepsi
@ -96,6 +97,112 @@ public class OperateLogServiceImpl extends BaseEsService implements OperateLogSe
return insert(json, indexNamePrex + indexSuffixDate);
}
@Override
public CommonPageResponse<OperateLogQueryDetailRespDTO> queryForPage(OperateLogQueryReqDTO req) throws Exception {
//这里做个区分时从ES查询获取还是从DB获取.
if (esStorageFlag) {
return queryForPageFromEs(req);
}
IPage<OperateLogRecordEntity> page = operateLogRepository.pageLogRecord(req);
//为空则返回空
List<OperateLogRecordEntity> recordList = page.getRecords();
if (recordList == null || recordList.isEmpty()) {
return CommonPageResponse.zero(req.getPage(), req.getPageSize());
}
List<OperateLogQueryDetailRespDTO> respList = new ArrayList<>();
recordList.forEach(item -> {
OperateLogQueryDetailRespDTO detail = operateLogConverter.toDetailDto(item);
detail.setId(item.getId().toString());
respList.add(detail);
});
return CommonPageResponse.list(req.getPage(), req.getPageSize(), page.getTotal(), respList);
}
@Override
public CommonPageResponse<OperateLogQueryRespDTO> queryBasicInfoForPage(OperateLogQueryReqDTO req) throws Exception {
CommonPageResponse<OperateLogQueryDetailRespDTO> detailResp = queryForPage(req);
if (detailResp.getList() == null || detailResp.getList().isEmpty()) {
return CommonPageResponse.zero(detailResp.getPage(), detailResp.getPageSize());
}
List<OperateLogQueryRespDTO> respList = assembleOperateLogResp(detailResp.getList());
return CommonPageResponse.list(detailResp.getPage(), detailResp.getPageSize(), detailResp.getTotalCount(), respList);
}
@Override
public OperateLogQueryDetailRespDTO queryOperateLogDetail(OperateLogQueryDetailReqDTO req) throws Exception {
if (esStorageFlag) {
return queryOperateLogDetailFromEs(req.getOperateTime(), req.getId());
}
//从DB查询
OperateLogRecordEntity entity = operateLogRepository.queryById(Long.valueOf(req.getId()));
if (entity == null) {
return null;
}
return operateLogConverter.toDetailDto(entity);
}
/***
* 从ES获取查询结果
* @param req
* @return
*/
public CommonPageResponse<OperateLogQueryDetailRespDTO> queryForPageFromEs(OperateLogQueryReqDTO req) throws Exception {
//根据查询的时间段获取所属的索引集合
Set<String> indices = betweenIndices(req.getStartTime(), req.getEndTime());
if (indices.isEmpty()) {
logger.warn("can not find index,startDate={}.", DateUtil.format(req.getStartTime(), DatePattern.PURE_DATE_PATTERN));
return CommonPageResponse.zero(req.getPage(), req.getPageSize());
}
//组装查询条件.
SearchSourceBuilder builder = assembleQueryBuilder(req);
SearchRequest request = new SearchRequest();
request.source(builder);
SearchResponse response = search(request, indices.toArray(new String[]{}));
//处理查询结果的数据
SearchHits hits = response.getHits();
SearchHit[] searchHits = hits.getHits();
Map<String, OperateLogRecordEntity> resMap = new HashMap<>(searchHits.length);
if (searchHits.length == 0) {
return CommonPageResponse.zero(req.getPage(), req.getPageSize());
}
for (SearchHit hit : searchHits) {
String oprLogStr = hit.getSourceAsString();
resMap.put(hit.getId(), JSONObject.parseObject(oprLogStr, OperateLogRecordEntity.class));
}
List<OperateLogQueryDetailRespDTO> detailLists = new ArrayList<>();
resMap.forEach(new BiConsumer<String, OperateLogRecordEntity>() {
@Override
public void accept(String id, OperateLogRecordEntity entity) {
OperateLogQueryDetailRespDTO detail = operateLogConverter.toDetailDto(entity);
detail.setId(id);
detailLists.add(detail);
}
});
return CommonPageResponse.list(req.getPage(), req.getPageSize(), hits.getTotalHits().value, detailLists);
}
/**
* 对于 es 而言需要索引信息.
*
* @param id
* @return
*/
public OperateLogQueryDetailRespDTO queryOperateLogDetailFromEs(Date oprDateTime, String id) throws Exception {
//根据日期找索引,
String indexName = indexNamePrex + findIndexSuffixDate(oprDateTime);
//需要判断下索引是否存在,
List<String> indices = getIndices(indexNamePrex);
if (!indices.contains(indexName)) {
logger.warn("can not find index,oprDateTime={},id={}", oprDateTime, id);
return null;
}
GetRequest getRequest = new GetRequest(indexName, id);
GetResponse response = get(getRequest);
String oprLogStr = response.getSourceAsString();
OperateLogRecordEntity entity = JSONObject.parseObject(oprLogStr, OperateLogRecordEntity.class);
return operateLogConverter.toDetailDto(entity);
}
/***
* 根据数据中的日期信息找到所属的索引
* 目前是按7天的规则
@ -126,90 +233,6 @@ public class OperateLogServiceImpl extends BaseEsService implements OperateLogSe
return unifiedLogRecord;
}
@Override
public CommonPageResponse<OperateLogQueryRespDTO> queryForPage(OperateLogQueryReqDTO req) throws Exception {
//这里做个区分时从ES查询获取还是从DB获取.
if (esStorageFlag) {
return queryForPageFromEs(req);
}
IPage<OperateLogRecordEntity> page = operateLogRepository.pageLogRecord(req);
//为空则返回空
List<OperateLogRecordEntity> recordList = page.getRecords();
if (recordList == null || recordList.isEmpty()) {
return CommonPageResponse.zero(req.getPage(), req.getPageSize());
}
List<OperateLogQueryRespDTO> respList = assembleOperateLogResp(recordList);
return CommonPageResponse.list(req.getPage(), req.getPageSize(), page.getTotal(), respList);
}
/***
* 从ES获取查询结果
* @param req
* @return
*/
public CommonPageResponse<OperateLogQueryRespDTO> queryForPageFromEs(OperateLogQueryReqDTO req) throws Exception {
//根据查询的时间段获取所属的索引集合
Set<String> indices = betweenIndices(req.getStartTime(), req.getEndTime());
if (indices.isEmpty()) {
logger.warn("can not find index,startDate={}.", DateUtil.format(req.getStartTime(), DatePattern.PURE_DATE_PATTERN));
return CommonPageResponse.zero(req.getPage(), req.getPageSize());
}
//组装查询条件.
SearchSourceBuilder builder = assembleQueryBuilder(req);
SearchRequest request = new SearchRequest();
request.source(builder);
SearchResponse response = search(request, indices.toArray(new String[]{}));
//处理查询结果的数据
SearchHits hits = response.getHits();
SearchHit[] searchHits = hits.getHits();
Map<String, OperateLogRecordEntity> resMap = new HashMap<>(searchHits.length);
if (searchHits.length == 0) {
return CommonPageResponse.zero(req.getPage(), req.getPageSize());
}
for (SearchHit hit : searchHits) {
String oprLogStr = hit.getSourceAsString();
resMap.put(hit.getId(), JSONObject.parseObject(oprLogStr, OperateLogRecordEntity.class));
}
List<OperateLogQueryRespDTO> respList = assembleOperateLogResp(resMap);
return CommonPageResponse.list(req.getPage(), req.getPageSize(), hits.getTotalHits().value, respList);
}
@Override
public OperateLogQueryDetailRespDTO queryOperateLogDetail(OperateLogQueryDetailReqDTO req) throws Exception {
if (esStorageFlag) {
return queryOperateLogDetailFromEs(req.getOperateTime(), req.getId());
}
//从DB查询
OperateLogRecordEntity entity = operateLogRepository.queryById(Long.valueOf(req.getId()));
if (entity == null) {
return null;
}
return operateLogConverter.toDetailDto(entity);
}
/**
* 对于 es 而言需要索引信息.
*
* @param id
* @return
*/
public OperateLogQueryDetailRespDTO queryOperateLogDetailFromEs(Date oprDateTime, String id) throws Exception {
//根据日期找索引,
String indexName = indexNamePrex + findIndexSuffixDate(oprDateTime);
//需要判断下索引是否存在,
List<String> indices = getIndices(indexNamePrex);
if (!indices.contains(indexName)) {
logger.warn("can not find index,oprDateTime={},id={}", oprDateTime, id);
return null;
}
GetRequest getRequest = new GetRequest(indexName, id);
GetResponse response = get(getRequest);
String oprLogStr = response.getSourceAsString();
OperateLogRecordEntity entity = JSONObject.parseObject(oprLogStr, OperateLogRecordEntity.class);
return operateLogConverter.toDetailDto(entity);
}
/***
* 获取2个时间段之间的索引startTime + 7 < endTime 即可
* @param startDate
@ -288,25 +311,7 @@ public class OperateLogServiceImpl extends BaseEsService implements OperateLogSe
return searchSourceBuilder;
}
private List<OperateLogQueryRespDTO> assembleOperateLogResp(Map<String, OperateLogRecordEntity> recordMap) {
List<OperateLogQueryRespDTO> resList = new ArrayList<>();
recordMap.forEach((id, item) -> {
OperateLogQueryRespDTO resp = new OperateLogQueryRespDTO();
resp.setOperateUserName(item.getIdentityUserName());
resp.setFeatureCode(item.getFeatureCode());
resp.setFeatureName(item.getFeatureName());
resp.setContentSummary(item.getContentSummary());
resp.setOperateTime(item.getOperateTime());
resp.setOperateUserPhone(item.getIdentityUserPhone());
resp.setOuName(item.getOuName());
resp.setId(id);
resList.add(resp);
});
return resList;
}
private List<OperateLogQueryRespDTO> assembleOperateLogResp(List<OperateLogRecordEntity> recordList) {
private List<OperateLogQueryRespDTO> assembleOperateLogResp(List<OperateLogQueryDetailRespDTO> recordList) {
List<OperateLogQueryRespDTO> resList = new ArrayList<>();
recordList.forEach((ele) -> {
OperateLogQueryRespDTO response = new OperateLogQueryRespDTO();
@ -317,7 +322,7 @@ public class OperateLogServiceImpl extends BaseEsService implements OperateLogSe
response.setOperateTime(ele.getOperateTime());
response.setOperateUserPhone(ele.getIdentityUserPhone());
response.setOuName(ele.getOuName());
response.setId(ele.getId().toString());
response.setId(ele.getId());
resList.add(response);
});
return resList;

View File

@ -77,7 +77,7 @@ public class OperateLogServiceTest extends LogPlatApplicationTestBase {
OperateLogQueryReqDTO req = new OperateLogQueryReqDTO();
req.setPage(1L);
req.setPageSize(3L);
CommonPageResponse<OperateLogQueryRespDTO> response = operateLogService.queryForPage(req);
CommonPageResponse<OperateLogQueryRespDTO> response = operateLogService.queryBasicInfoForPage(req);
long totalCount = response.getTotalCount();
Assert.assertEquals(3L, totalCount);
List<OperateLogQueryRespDTO> respList = response.getList();
@ -91,7 +91,7 @@ public class OperateLogServiceTest extends LogPlatApplicationTestBase {
req.setPageSize(20L);
req.setStartTime(DateUtil.parse("2022-09-01 00:00:00", "yyyy-MM-dd HH:mm:ss").toJdkDate());
req.setEndTime(DateUtil.parse("2023-09-01 00:00:00", "yyyy-MM-dd HH:mm:ss").toJdkDate());
CommonPageResponse<OperateLogQueryRespDTO> response = operateLogService.queryForPageFromEs(req);
CommonPageResponse<OperateLogQueryRespDTO> response = operateLogService.queryBasicInfoForPage(req);
long totalCount = response.getTotalCount();
Assert.assertEquals(103L, totalCount);
List<OperateLogQueryRespDTO> respList = response.getList();