package org.ruoyi.system.service.impl; import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.ruoyi.common.core.utils.MapstructUtils; import org.ruoyi.common.core.utils.StringUtils; import org.ruoyi.common.core.utils.ip.AddressUtils; import org.ruoyi.common.log.event.OperLogEvent; import org.ruoyi.core.page.PageQuery; import org.ruoyi.core.page.TableDataInfo; import org.ruoyi.system.domain.SysOperLog; import org.ruoyi.system.domain.bo.SysOperLogBo; import org.ruoyi.system.domain.vo.SysOperLogVo; import org.ruoyi.system.mapper.SysOperLogMapper; import org.ruoyi.system.service.ISysOperLogService; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; /** * 操作日志 服务层处理 * * @author Lion Li */ @RequiredArgsConstructor @Service public class SysOperLogServiceImpl implements ISysOperLogService { private final SysOperLogMapper baseMapper; /** * 操作日志记录 * * @param operLogEvent 操作日志事件 */ @Async @EventListener @Override public void recordOper(OperLogEvent operLogEvent) { SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class); // 远程查询操作地点 operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); insertOperlog(operLog); } @Override public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { Map params = operLog.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType, operLog.getBusinessType()) .func(f -> { if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); } }) .eq(operLog.getStatus() != null, SysOperLog::getStatus, operLog.getStatus()) .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { pageQuery.setOrderByColumn("oper_id"); pageQuery.setIsAsc("desc"); } Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } /** * 新增操作日志 * * @param bo 操作日志对象 */ @Override public void insertOperlog(SysOperLogBo bo) { SysOperLog operLog = MapstructUtils.convert(bo, SysOperLog.class); operLog.setOperTime(new Date()); baseMapper.insert(operLog); } /** * 查询系统操作日志集合 * * @param operLog 操作日志对象 * @return 操作日志集合 */ @Override public List selectOperLogList(SysOperLogBo operLog) { Map params = operLog.getParams(); return baseMapper.selectVoList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType, operLog.getBusinessType()) .func(f -> { if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); } }) .eq(operLog.getStatus() != null && operLog.getStatus() > 0, SysOperLog::getStatus, operLog.getStatus()) .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")) .orderByDesc(SysOperLog::getOperId)); } /** * 批量删除系统操作日志 * * @param operIds 需要删除的操作日志ID * @return 结果 */ @Override public int deleteOperLogByIds(Long[] operIds) { return baseMapper.deleteBatchIds(Arrays.asList(operIds)); } /** * 查询操作日志详细 * * @param operId 操作ID * @return 操作日志对象 */ @Override public SysOperLogVo selectOperLogById(Long operId) { return baseMapper.selectVoById(operId); } /** * 清空操作日志 */ @Override public void cleanOperLog() { baseMapper.delete(new LambdaQueryWrapper<>()); } }