package com.shangwei.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shangwei.common.core.exception.ServiceException;
import com.shangwei.common.core.utils.StreamUtils;
import com.shangwei.common.core.utils.StringUtils;
import com.shangwei.common.core.utils.ValidatorUtils;
import com.shangwei.common.core.validate.AddGroup;
import com.shangwei.common.mybatis.core.page.PageQuery;
import com.shangwei.common.mybatis.core.page.TableDataInfo;
import com.shangwei.common.mybatis.interceptor.MybatisTenantContext;
import com.shangwei.system.api.domain.bo.LogRecordsBo;
import com.shangwei.system.domain.LogModule;
import com.shangwei.system.domain.LogPoint;
import com.shangwei.system.domain.LogRecords;
import com.shangwei.system.domain.bo.LogModuleBo;
import com.shangwei.system.domain.bo.LogPointBo;
import com.shangwei.system.mapper.LogModuleMapper;
import com.shangwei.system.mapper.LogPointMapper;
import com.shangwei.system.mapper.LogRecordMapper;
import com.shangwei.system.service.ILogRecordService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* 日志实现类
*
* @author xyl
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class LogRecordServiceImpl implements ILogRecordService {
private final LogRecordMapper baseMapper;
private final LogModuleMapper moduleMapper;
private final LogPointMapper pointMapper;
private final ConcurrentMap<Long, ConcurrentMap<Long, LogModuleBo>> cache = new ConcurrentHashMap<>();
@Override
public void save(LogRecordsBo logRecordBo) {
ValidatorUtils.validate(logRecordBo, AddGroup.class);
LogModule module = BeanUtil.copyProperties(logRecordBo, LogModule.class);
LogPoint point = BeanUtil.copyProperties(logRecordBo, LogPoint.class);
LogRecords record = BeanUtil.copyProperties(logRecordBo, LogRecords.class);
Long deptId = record.getOprDeptId();
try {
boolean isMoudleAdd = checkModule(module, deptId);
point.setModuleId(module.getId());
boolean isPointAdd = checkPoint(point, deptId);
record.setModuleId(module.getId());
record.setPointId(point.getId());
baseMapper.insert(record);
if (isMoudleAdd) {
processCacheByModule(deptId, module);
}
if (isPointAdd) {
processCacheByPoint(deptId, point);
}
} catch (NullPointerException | ServiceException e) {
e.printStackTrace();
} finally {
log.info("save log end");
}
}
@Override
public void loadingCache() {
try {
MybatisTenantContext.set(true);
List<LogRecords> records = baseMapper.loadCache();
if (!records.isEmpty()) {
List<LogModule> modules = moduleMapper.selectList();
List<LogPoint> points = pointMapper.selectList();
//数据分组
Map<Long, LogModule> groupsByModules = StreamUtils.toIdentityMap(modules, LogModule::getId);
Map<Long, LogPoint> groupsByPoints = StreamUtils.toIdentityMap(points, LogPoint::getId);
Map<Long, List<LogRecords>> groupsByRecords = StreamUtils.groupByKey(records, LogRecords::getOprDeptId);
//按部门遍历
for (Long deptId : groupsByRecords.keySet()) {
ConcurrentMap<Long, LogModuleBo> cacheByModule = new ConcurrentHashMap<>(1);
//获取部门的模块-节点
List<LogRecords> logRecordsByDeptId = groupsByRecords.get(deptId);
//进一步用模块id分组
Map<Long, List<LogRecords>> groupsByModuleWithDeptId = StreamUtils.groupByKey(logRecordsByDeptId, LogRecords::getModuleId);
//按模块遍历
for (Long moduleId : groupsByModuleWithDeptId.keySet()) {
List<LogRecords> byPoints = groupsByModuleWithDeptId.get(moduleId);
//模块存在就转换数据到cache
LogModule module = groupsByModules.get(moduleId);
if (Objects.nonNull(module)) {
LogModuleBo moduleBo = BeanUtil.copyProperties(module, LogModuleBo.class);
for (LogRecords byPoint : byPoints) {
LogPoint point = groupsByPoints.get(byPoint.getPointId());
if (Objects.nonNull(point)) {
LogPointBo pointBo = BeanUtil.copyProperties(point, LogPointBo.class);
moduleBo.addPoints(pointBo);
}
}
cacheByModule.put(moduleId, moduleBo);
}
}
cache.put(deptId, cacheByModule);
}
}
} finally {
MybatisTenantContext.clear();
}
log.info("加载缓存完成");
}
@Override
public Object readCache(Long deptId) {
if (Objects.isNull(deptId)) {
return null;
}
return cache.containsKey(deptId) ? cache.get(deptId).values() : null;
}
@Override
public TableDataInfo<LogRecordsBo> selectPageList(LogRecordsBo log, PageQuery pageQuery) {
Map<String, Object> params = log.getParams();
Object keyword = params.get("keyword");
boolean hasKeyword = Objects.nonNull(keyword) && StringUtils.isNotBlank(String.valueOf(keyword));
LambdaQueryWrapper<LogRecords> lqw = new LambdaQueryWrapper<LogRecords>()
.eq(Objects.nonNull(log.getOprDeptId()), LogRecords::getOprDeptId, log.getOprDeptId())
.eq(Objects.nonNull(log.getPointId()), LogRecords::getPointId, log.getPointId())
.eq(Objects.nonNull(log.getModuleId()), LogRecords::getModuleId, log.getModuleId())
.eq(StringUtils.isNotBlank(log.getBusinessType()), LogRecords::getBusinessType, log.getBusinessType())
.and(hasKeyword, wrapper -> wrapper.or().eq(hasKeyword, LogRecords::getOprIp, keyword)
.or().eq(hasKeyword, LogRecords::getOprName, keyword))
.between(params.get("beginTime") != null && params.get("endTime") != null,
LogRecords::getOprTime, params.get("beginTime"), params.get("endTime"));
if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
pageQuery.setOrderByColumn("opr_time");
pageQuery.setIsAsc("desc");
}
Page<LogRecordsBo> page = baseMapper.selectVoPage(pageQuery.build(), lqw, LogRecordsBo.class);
return TableDataInfo.build(page);
}
/**
* 新增节点到缓存
*
* @param oprDeptId 部门id
* @param point 节点
*/
private void processCacheByPoint(Long oprDeptId, LogPoint point) {
ConcurrentMap<Long, LogModuleBo> cacheByDept = cache.get(oprDeptId);
if (Objects.nonNull(cacheByDept)) {
LogModuleBo moduleBo = cacheByDept.get(point.getModuleId());
if (Objects.nonNull(moduleBo)) {
moduleBo.addPoints(BeanUtil.copyProperties(point, LogPointBo.class));
}
}
}
/**
* 新增模块到缓存
*
* @param oprDeptId 部门id
* @param module 模块
没有合适的资源?快使用搜索试试~ 我知道了~
日志通过ApplicationEvent、Annotation、MQ实现公用逻辑
共34个文件
java:34个
需积分: 0 0 下载量 67 浏览量
2023-07-06
11:50:26
上传
评论
收藏 10KB 7Z 举报
温馨提示
日志通过ApplicationEvent、Annotation、MQ实现公用逻辑
资源推荐
资源详情
资源评论
收起资源包目录
log.7z (34个子文件)
mq
SystemRabbitMqListener.java 2KB
ILogRecordService.java 991B
api
annotation
LoggerModule.java 387B
LoggerField.java 670B
LoggerPoint.java 481B
LoggerSubject.java 679B
enums
OperatorType.java 280B
BusinessType.java 757B
common
record
utils
LoaderParamsUtil.java 1KB
mq
MqUtil.java 1KB
LoggerModuleUtil.java 968B
ReflectionBeanUtil.java 1KB
LoggerFieldUtil.java 5KB
factory
CommonAnalysisUtil.java 866B
CommonUtil.java 5KB
UpdateRecordUtil.java 3KB
InsertRecordUtil.java 839B
DeleteRecordUtil.java 839B
MethodUtil.java 666B
InitializationUtil.java 6KB
LoggerPointUtil.java 1KB
LoggerFieldBySubjectUtil.java 4KB
event
RecordEvent.java 2KB
listener
ListenerEventImpl.java 2KB
exception
ModuleFaultException.java 160B
NullFaultException.java 161B
SubjectFaultException.java 161B
TypeFaultException.java 158B
PointFaultException.java 159B
bean
LogRecords.java 1KB
LogRecordServiceImpl.java 12KB
bean
LogModule.java 683B
LogRecords.java 1KB
LogPoint.java 679B
共 34 条
- 1
资源评论
风起黄金梦
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功