package com.fdkankan.manage.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.common.response.PageInfo;
import com.fdkankan.common.util.Base64Converter;
import com.fdkankan.common.util.DateUtil;
import com.fdkankan.common.util.SecurityUtil;
import com.fdkankan.manage.api.dto.ManageLoginResponse;
import com.fdkankan.manage.entity.SysMenu;
import com.fdkankan.manage.entity.SysRole;
import com.fdkankan.manage.entity.SysUser;
import com.fdkankan.manage.mapper.ISysUserMapper;
import com.fdkankan.manage.service.ISysMenuService;
import com.fdkankan.manage.service.ISysRoleService;
import com.fdkankan.manage.service.ISysUserService;
import com.fdkankan.manage.vo.request.SysUserParam;
import com.fdkankan.manage.vo.response.SysRoleVo;
import com.fdkankan.manage.vo.response.SysUserVo;
import com.fdkankan.redis.constant.RedisKey;
import com.fdkankan.redis.util.RedisUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author
* @since 2022-06-09
*/
@Service
public class SysUserServiceImpl extends ServiceImpl implements ISysUserService {
@Autowired
private ISysRoleService roleService;
@Autowired
private ISysMenuService menuService;
@Autowired
private RedisUtil redisUtil;
@Override
public SysUser getByUserName(String userName) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getUserName,userName);
List list = this.list(wrapper);
if(list == null || list.size() <=0){
return null;
}
return list.get(0);
}
@Override
public ManageLoginResponse getUserByUserNameAndPassword(String userName, String password) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getUserName,userName)
.eq(SysUser::getPassword,password);
List list = this.list(wrapper);
if(list == null || list.size() <=0){
return null;
}
SysUser sysUser = list.get(0);
SysRole role = roleService.getById(sysUser.getRoleId());
ManageLoginResponse loginVO = new ManageLoginResponse();
BeanUtils.copyProperties(sysUser,loginVO);
loginVO.setRoleId(role.getId());
loginVO.setRoleName(role.getRoleName());
//设置redis role
String roleType = role.getRoleType();
List roleList = Collections.singletonList(roleType);
redisUtil.set(String.format(RedisKey.MANAGE_ROLE_USER,sysUser.getId()), JSONObject.toJSONString(roleList));
//设置redis perm
List menus = menuService.getListByUserId(sysUser.getId());
List menuList = menus.parallelStream().map(SysMenu::getPerms).collect(Collectors.toList());
redisUtil.set(String.format(RedisKey.MANAGE_PERM_USER,sysUser.getId()), JSONObject.toJSONString(menuList));
return loginVO;
}
@Override
public void addOrUpdate(SysUserParam param) {
if(param.getId() == null){
SysUser user = this.getByUserName(param.getUserName());
if(user !=null){
throw new BusinessException(-1,"用户已存在!");
}
}
SysUser sysUser = new SysUser();
BeanUtils.copyProperties(param,sysUser);
if(!StringUtils.isEmpty(param.getPassword())){
String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(param.getPassword())));
sysUser.setPassword(passwordMd5);
}
sysUser.setUpdateTime(DateUtil.date2String(new Date(),DateUtil.DEFAULT_DATE_FORMAT));
this.saveOrUpdate(sysUser);
}
@Override
public PageInfo pageList(SysUserParam param) {
Page page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
return PageInfo.PageInfo(page);
}
@Override
public HashMap groupByRoleId() {
HashMap map = new HashMap<>();
List roleVos = this.getBaseMapper().groupByRoleId();
for (SysRoleVo roleVo : roleVos) {
map.put(roleVo.getId(),roleVo.getAdminCount());
}
return map;
}
}