package com.xmcc.service;
import com.fasterxml.jackson.core.type.TypeReference;
import com.xmcc.beans.LogType;
import com.xmcc.beans.PageBean;
import com.xmcc.dao.*;
import com.xmcc.dto.SysLogDto;
import com.xmcc.exception.ParamException;
import com.xmcc.model.*;
import com.xmcc.param.SysLogParam;
import com.xmcc.utils.BeanValidator;
import com.xmcc.utils.IpUtil;
import com.xmcc.utils.JsonMapper;
import com.xmcc.utils.RequestHolder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@Service
public class SysLogService {
@Resource
private SysLogMapper sysLogMapper;
@Resource
private SysDeptMapper sysDeptMapper;
@Resource
private SysRoleMapper sysRoleMapper;
@Resource
private SysDeptService sysDeptService;
@Resource
private SysCoreService sysCoreService;
@Resource
private SysRoleUserService sysRoleUserService;
@Resource
private SysUserMapper sysUserMapper;
@Resource
private SysAclMapper sysAclMapper;
@Resource
private SysAclModuleMapper sysAclModuleMapper;
@Resource
private SysAclModuleService sysAclModuleService;
/**
* 获取日志记录,并分页
* @param param
* @param page
* @return
*/
public PageBean<SysLogWithBLOBs> searchPageList(SysLogParam param,PageBean<SysLogWithBLOBs> page){
//校验参数
BeanValidator.check(param);
//封装dto
SysLogDto logDto = new SysLogDto();
//设置类型
logDto.setType(param.getType());
//设置查询条件
if (StringUtils.isNotBlank(param.getBeforeSeg())){
logDto.setBeforeSeg("%" + param.getBeforeSeg() + "%");
}
if (StringUtils.isNotBlank(param.getAfterSeg())){
logDto.setAfterSeg("%" + param.getAfterSeg() + "%");
}
if (StringUtils.isNotBlank(param.getOperator())){
logDto.setOperator("%" + param.getOperator() + "%");
}
//处理日期格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
try {
if (StringUtils.isNotBlank(param.getFromTime())) {
logDto.setFromTime(format.parse(param.getFromTime()));
}
if (StringUtils.isNotBlank(param.getToTime())) {
logDto.setToTime(format.parse(param.getToTime()));
}
} catch (ParseException e) {
throw new ParamException("参数有误");
}
//判断要查询的记录是否存在
int count = sysLogMapper.countByLog(logDto);
if (count > 0){
List<SysLogWithBLOBs> logList = sysLogMapper.getPageListByLog(logDto,page);
page.setTotal(count);
page.setData(logList);
return page;
}
return new PageBean<>();
}
/**
* 还原记录
* @param id
*/
public void recover(int id){
//根据id获取记录
SysLogWithBLOBs log = sysLogMapper.selectByPrimaryKey(id);
//判断记录是否为空
if (log == null){
throw new ParamException("待还原的记录不存在");
}
//根据记录的类型,执行对应的操作
switch (log.getType()){
case LogType.TYPE_DEPT:
//设置更改前的值,还原操作中更改前的值为现在的值,根据targetid获取现在的值
SysDept beforeDept = sysDeptMapper.selectByPrimaryKey(log.getTargetId());
if (beforeDept == null){
throw new ParamException("待还原的部门以不存在");
}
//新增或删除不做还原
if (StringUtils.isBlank(log.getOldValue()) || StringUtils.isBlank(log.getNewValue())){
throw new ParamException("新增或删除不做还原处理");
}
//设置更改后的值,还原操作中更改后的值为log中以前的值,根据log获取以前的值
SysDept afterDept = JsonMapper.string2Obj(log.getOldValue(), new TypeReference<SysDept>(){});
afterDept.setOperator(RequestHolder.getUser().getUsername());
afterDept.setOperateIp(IpUtil.getUserIP(RequestHolder.getRequest()));
afterDept.setOperateTime(new Date());
//更新日志信息
sysDeptMapper.updateByPrimaryKeySelective(afterDept);
//调用sysDeptService.updateWithChild方法,将子部门更新
sysDeptService.updateWithChild(beforeDept,afterDept);
saveDeptLog(beforeDept,afterDept);
break;
case LogType.TYPE_USER:
SysUser beforeUser = sysUserMapper.selectByPrimaryKey(log.getTargetId());
if (beforeUser == null){
throw new ParamException("待还原的用户以不存在");
}
if (StringUtils.isBlank(log.getOldValue()) || StringUtils.isBlank(log.getNewValue())){
throw new ParamException("新增或删除不做还原处理");
}
SysUser afterUser = JsonMapper.string2Obj(log.getOldValue(), new TypeReference<SysUser>() {});
afterUser.setOperator(RequestHolder.getUser().getUsername());
afterUser.setOperateIp(IpUtil.getUserIP(RequestHolder.getRequest()));
afterUser.setOperateTime(new Date());
sysUserMapper.updateByPrimaryKeySelective(afterUser);
saveUserLog(beforeUser,afterUser);
break;
case LogType.TYPE_ACL_MODULE:
SysAclModule beforeAclModule = sysAclModuleMapper.selectByPrimaryKey(log.getTargetId());
if (beforeAclModule == null){
throw new ParamException("待还原的角色以不存在");
}
if (StringUtils.isBlank(log.getOldValue()) || StringUtils.isBlank(log.getNewValue())){
throw new ParamException("新增或删除不做还原处理");
}
SysAclModule afterAclModule = JsonMapper.string2Obj(log.getOldValue(), new TypeReference<SysAclModule>(){});
afterAclModule.setOperator(RequestHolder.getUser().getUsername());
afterAclModule.setOperateIp(IpUtil.getUserIP(RequestHolder.getRequest()));
afterAclModule.setOperateTime(new Date());
sysAclModuleMapper.updateByPrimaryKeySelective(afterAclModule);
sysAclModuleService.updateWithChild(beforeAclModule,afterAclModule);
saveAclModuleLog(beforeAclModule,afterAclModule);
break;
case LogType.TYPE_ACL:
SysAcl beforeAcl = sysAclMapper.selectByPrimaryKey(log.getTargetId());
if (beforeAcl == null){
throw new ParamException("待还原的角色以不存在");
}
if (StringUtils.isBlank(log.getOldValue()) || StringUtils.isBlank(log.getNewValue())){
throw new ParamException("新增或删除不做还原处理");
}
SysAcl afterAcl = JsonMapper.string2Obj(log.getOldValue(), new TypeReference<SysAcl>(){});
afterAcl.setOperator(RequestHolder.getUser().getUsername());
afterAcl.setOperateIp(IpUtil.getUserIP(RequestHolder.getRequest()));
afterAcl.setOperateTime(new Date());
sysAclMapper.updateByPrimaryKeySelective(afterAcl);
saveAclLog(beforeAcl,afterAcl);
break;
case