package org.jeecg.modules.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CacheConstant;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
import org.jeecg.common.desensitization.annotation.SensitiveEncode;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.SysUserCacheInfo;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.PasswordUtil;
import org.jeecg.common.util.UUIDGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.base.service.BaseCommonService;
import org.jeecg.modules.system.entity.*;
import org.jeecg.modules.system.mapper.*;
import org.jeecg.modules.system.model.SysUserSysDepartModel;
import org.jeecg.modules.system.service.ISysDictService;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.system.vo.MdcUserProVo;
import org.jeecg.modules.system.vo.SysUserDepVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 用户表 服务实现类
*
*
* @Author: scott
* @Date: 2018-12-20
*/
@Service
@Slf4j
public class SysUserServiceImpl extends ServiceImpl implements ISysUserService {
@Autowired
private SysUserMapper userMapper;
@Autowired
private SysPermissionMapper sysPermissionMapper;
@Autowired
private SysUserRoleMapper sysUserRoleMapper;
@Autowired
private SysUserDepartMapper sysUserDepartMapper;
@Autowired
private SysDepartMapper sysDepartMapper;
@Autowired
private SysRoleMapper sysRoleMapper;
@Autowired
private SysDepartRoleUserMapper departRoleUserMapper;
@Autowired
private SysDepartRoleMapper sysDepartRoleMapper;
@Resource
private BaseCommonService baseCommonService;
@Autowired
private SysThirdAccountMapper sysThirdAccountMapper;
@Autowired
ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
@Autowired
ThirdAppDingtalkServiceImpl dingtalkService;
@Autowired
SysRoleIndexMapper sysRoleIndexMapper;
@Resource
MdcUserProductionMapper mdcUserProductionMapper;
@Resource
private ISysDictService sysDictService;
@Override
@CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
public Result> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword) {
SysUser user = userMapper.getUserByName(username);
String passwordEncode = PasswordUtil.encrypt(username, oldpassword, user.getSalt());
if (!user.getPassword().equals(passwordEncode)) {
return Result.error("旧密码输入错误!");
}
if (oConvertUtils.isEmpty(newpassword)) {
return Result.error("新密码不允许为空!");
}
if (!newpassword.equals(confirmpassword)) {
return Result.error("两次输入密码不一致!");
}
//设置密码更新时间
//sysUser.setPasswordTime(new Date());
//设置密码首次登录失效
//sysUser.setPasswordFlag(CommonConstant.DEL_FLAG_0);
String password = PasswordUtil.encrypt(username, newpassword, user.getSalt());
this.userMapper.update(new SysUser().setPassword(password).setPasswordTime(new Date()).setPasswordFlag(CommonConstant.DEL_FLAG_0), new LambdaQueryWrapper().eq(SysUser::getId, user.getId()));
return Result.ok("密码重置成功!");
}
@Override
@CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
public Result> changePassword(SysUser sysUser) {
String salt = oConvertUtils.randomGen(8);
sysUser.setSalt(salt);
//设置密码更新时间
sysUser.setPasswordTime(new Date());
//管理员修改密码,设置用户首次登录
//sysUser.setPasswordFlag();
String password = sysUser.getPassword();
String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
sysUser.setPassword(passwordEncode);
this.userMapper.updateById(sysUser);
return Result.ok("密码修改成功!");
}
@Override
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
@Transactional(rollbackFor = Exception.class)
public boolean deleteUser(String userId) {
//1.删除用户
this.removeById(userId);
return false;
}
@Override
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
@Transactional(rollbackFor = Exception.class)
public boolean deleteBatchUsers(String userIds) {
//1.删除用户
this.removeByIds(Arrays.asList(userIds.split(",")));
return false;
}
@Override
public SysUser getUserByName(String username) {
return userMapper.getUserByName(username);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addUserWithRole(SysUser user, String roles) {
this.save(user);
if(oConvertUtils.isNotEmpty(roles)) {
String[] arr = roles.split(",");
for (String roleId : arr) {
SysUserRole userRole = new SysUserRole(user.getId(), roleId);
sysUserRoleMapper.insert(userRole);
}
}
}
@Override
@CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, allEntries=true)
@Transactional(rollbackFor = Exception.class)
public void editUserWithRole(SysUser user, String roles) {
this.updateById(user);
//先删后加
sysUserRoleMapper.delete(new QueryWrapper().lambda().eq(SysUserRole::getUserId, user.getId()));
if(oConvertUtils.isNotEmpty(roles)) {
String[] arr = roles.split(",");
for (String roleId : arr) {
SysUserRole userRole = new SysUserRole(user.getId(), roleId);
sysUserRoleMapper.insert(userRole);
}
}
}
@Override
public List getRole(String username) {
return sysUserRoleMapper.getRoleByUserName(username);
}
/**
* 获取动态首页路由配置
* @param username
* @param version
* @return
*/
@Override
public SysRoleIndex getDynamicIndexByUserRole(String username,String version) {
List roles = sysUserRoleMapper.getRoleByUserName(username);
String componentUrl = RoleIndexConfigEnum.getIndexByRoles(roles);
SysRoleIndex roleIndex = new SysRoleIndex(componentUrl);
//只有 X-Version=v3 的时候,才读取sys_role_index表获取角色首页配置
if (oConvertUtils.isNotEmpty(version) && roles!=null && roles.size()>0) {
LambdaQueryWrapper routeIndexQuery = new LambdaQueryWrapper();
//用户所有角色
routeIndexQuery.in(SysRoleIndex::getRoleCode, roles);
//角色首页状态0:未开启 1:开启
routeIndexQuery.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1);
//优先级正序排序
routeIndexQuery.orderByAsc(SysRoleIndex::getPriority);
List list = sysRoleIndexMapper.selectList(routeIndexQuery);
if (null != list && list.size() > 0) {
roleIndex = list.get(0);
}
}
//如果componentUrl为空,则返回空
if(oConvertUtils.isEmpty(roleIndex.getComponent())){
return null;
}
return roleIndex;
}
/**
* 通过用户名获取用户角色集合
* @param username 用户名
* @return 角色集合
*/
@Override
public Set getUserRolesSet(String username) {
// 查询用户拥有的角色集合
List roles = sysUserRoleMapper.getRoleByUserName(username);
log.info("-------通过数据库读取用户拥有的角色Rules------username: " + username + ",Roles size: " + (roles == null ? 0 : roles.size()));
return new HashSet<>(roles);
}
/**
* 通过用户名获取用户权限集合
*
* @param username 用户名
* @return 权限集合
*/
@Override
public Set getUserPermissionsSet(String username) {
Set permissionSet = new HashSet<>();
List permissionList = sysPermissionMapper.queryByUser(username);
for (SysPermission po : permissionList) {
// // TODO URL规则有问题?
// if (oConvertUtils.isNotEmpty(po.getUrl())) {
// permissionSet.add(po.getUrl());
// }
if (oConvertUtils.isNotEmpty(po.getPerms())) {
permissionSet.add(po.getPerms());
}
}
log.info("-------通过数据库读取用户拥有的权限Perms------username: "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) );
return permissionSet;
}
/**
* 升级SpringBoot2.6.6,不允许循环依赖
* @author:qinfeng
* @update: 2022-04-07
* @param username
* @return
*/
@Override
public SysUserCacheInfo getCacheUser(String username) {
SysUserCacheInfo info = new SysUserCacheInfo();
info.setOneDepart(true);
if(oConvertUtils.isEmpty(username)) {
return null;
}
//查询用户信息
SysUser sysUser = userMapper.getUserByName(username);
if(sysUser!=null) {
info.setSysUserCode(sysUser.getUsername());
info.setSysUserName(sysUser.getRealname());
info.setSysOrgCode(sysUser.getOrgCode());
}
//多部门支持in查询
List list = sysDepartMapper.queryUserDeparts(sysUser.getId());
List sysMultiOrgCode = new ArrayList();
if(list==null || list.size()==0) {
//当前用户无部门
//sysMultiOrgCode.add("0");
}else if(list.size()==1) {
sysMultiOrgCode.add(list.get(0).getOrgCode());
}else {
info.setOneDepart(false);
for (SysDepart dpt : list) {
sysMultiOrgCode.add(dpt.getOrgCode());
}
}
info.setSysMultiOrgCode(sysMultiOrgCode);
return info;
}
/**
* 根据部门Id查询
* @param page
* @param departId 部门id
* @param username 用户账户名称
* @return
*/
@Override
public IPage getUserByDepId(Page page, String departId,String username) {
return userMapper.getUserByDepId(page, departId,username);
}
@Override
public IPage getUserByDepIds(Page page, List departIds, String username) {
return userMapper.getUserByDepIds(page, departIds,username);
}
@Override
public Map getDepNamesByUserIds(List userIds) {
List list = this.baseMapper.getDepNamesByUserIds(userIds);
Map res = new HashMap(5);
list.forEach(item -> {
if (res.get(item.getUserId()) == null) {
res.put(item.getUserId(), item.getDepartName());
} else {
res.put(item.getUserId(), res.get(item.getUserId()) + "," + item.getDepartName());
}
}
);
return res;
}
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245【漏洞】发现新漏洞待处理20220906 ----sql注入 方法没有使用,注掉
/* @Override
public IPage getUserByDepartIdAndQueryWrapper(Page page, String departId, QueryWrapper queryWrapper) {
LambdaQueryWrapper lambdaQueryWrapper = queryWrapper.lambda();
lambdaQueryWrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0);
lambdaQueryWrapper.inSql(SysUser::getId, "SELECT user_id FROM sys_user_depart WHERE dep_id = '" + departId + "'");
return userMapper.selectPage(page, lambdaQueryWrapper);
}*/
//update-end-author:taoyan date:2022-9-13 for: VUEN-2245【漏洞】发现新漏洞待处理20220906 ----sql注入 方法没有使用,注掉
@Override
public IPage queryUserByOrgCode(String orgCode, SysUser userParams, IPage page) {
List list = baseMapper.getUserByOrgCode(page, orgCode, userParams);
Integer total = baseMapper.getUserByOrgCodeTotal(orgCode, userParams);
IPage result = new Page<>(page.getCurrent(), page.getSize(), total);
result.setRecords(list);
return result;
}
/**
* 根据角色Id查询
* @param page
* @param roleId 角色id
* @param username 用户账户名称
* @return
*/
@Override
public IPage getUserByRoleId(Page page, String roleId, String username) {
return userMapper.getUserByRoleId(page,roleId,username);
}
/**
* 根据设备车间管理Id查询
* @param page
* @param workShopDepartId 设备车间管理Id
* @return
*/
public IPage getUserByworkShopDepartId(Page page,String workShopDepartId,String username){
return userMapper.getUserByWorkShopDepartId(page,workShopDepartId,username);
}
@Override
@CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, key="#username")
public void updateUserDepart(String username,String orgCode) {
baseMapper.updateUserDepart(username, orgCode);
}
@Override
public SysUser getUserByPhone(String phone) {
return userMapper.getUserByPhone(phone);
}
@Override
public SysUser getUserByEmail(String email) {
return userMapper.getUserByEmail(email);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addUserWithDepart(SysUser user, String selectedParts) {
// this.save(user); //保存角色的时候已经添加过一次了
if(oConvertUtils.isNotEmpty(selectedParts)) {
String[] arr = selectedParts.split(",");
for (String deaprtId : arr) {
SysUserDepart userDeaprt = new SysUserDepart(user.getId(), deaprtId);
sysUserDepartMapper.insert(userDeaprt);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
public void editUserWithDepart(SysUser user, String departs) {
//更新角色的时候已经更新了一次了,可以再跟新一次
this.updateById(user);
String[] arr = {};
if(oConvertUtils.isNotEmpty(departs)){
arr = departs.split(",");
}
//查询已关联部门
List userDepartList = sysUserDepartMapper.selectList(new QueryWrapper().lambda().eq(SysUserDepart::getUserId, user.getId()));
if(userDepartList != null && userDepartList.size()>0){
for(SysUserDepart depart : userDepartList ){
//修改已关联部门删除部门用户角色关系
if(!Arrays.asList(arr).contains(depart.getDepId())){
List sysDepartRoleList = sysDepartRoleMapper.selectList(
new QueryWrapper().lambda().eq(SysDepartRole::getDepartId,depart.getDepId()));
List roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());
if(roleIds != null && roleIds.size()>0){
departRoleUserMapper.delete(new QueryWrapper().lambda().eq(SysDepartRoleUser::getUserId, user.getId())
.in(SysDepartRoleUser::getDroleId,roleIds));
}
}
}
}
//先删后加
sysUserDepartMapper.delete(new QueryWrapper().lambda().eq(SysUserDepart::getUserId, user.getId()));
if(oConvertUtils.isNotEmpty(departs)) {
for (String departId : arr) {
SysUserDepart userDepart = new SysUserDepart(user.getId(), departId);
sysUserDepartMapper.insert(userDepart);
}
}
}
/**
* 校验用户是否有效
* @param sysUser
* @return
*/
@Override
public Result> checkUserIsEffective(SysUser sysUser) {
Result> result = new Result