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.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.SysUserCacheInfo; 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.ISysUserService; import org.jeecg.modules.system.vo.SysUserDepVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; 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 ISysBaseAPI sysBaseAPI; @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; @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("两次输入密码不一致!"); } String password = PasswordUtil.encrypt(username, newpassword, user.getSalt()); this.userMapper.update(new SysUser().setPassword(password), 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); 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 public SysUser getUserByRealName(String realname) { return userMapper.getUserByRealName(realname); } @Override @Transactional 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 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); } @Override public List getRoleName(String username) { return sysUserRoleMapper.getRoleNameByUserName(username); } @Override public List> getDepartRoleByName(String username){ return sysUserRoleMapper.getDepartRoleByName(username); } /** * 通过用户名获取用户角色集合 * @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; } @Override public SysUserCacheInfo getCacheUser(String username) { SysUserCacheInfo info = new SysUserCacheInfo(); info.setOneDepart(true); // SysUser user = userMapper.getUserByName(username); // info.setSysUserCode(user.getUsername()); // info.setSysUserName(user.getRealname()); LoginUser user = sysBaseAPI.getUserByName(username); if(user!=null) { info.setSysUserCode(user.getUsername()); info.setSysUserName(user.getRealname()); info.setSysOrgCode(user.getOrgCode()); } //多部门支持in查询 List list = sysDepartMapper.queryUserDeparts(user.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查询 @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(); 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; } @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); } @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查询 @Override public IPage getUserByRoleId(Page page, String roleId, String username) { return userMapper.getUserByRoleId(page,roleId,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 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(); //情况1:根据用户信息查询,该用户不存在 if (sysUser == null) { result.error500("该用户不存在,请注册"); baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); return result; } //情况2:根据用户信息查询,该用户已注销 //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) { //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); result.error500("该用户已注销"); return result; } //情况3:根据用户信息查询,该用户已冻结 if (CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) { baseCommonService.addLog("用户登录失败,用户名:" + sysUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); result.error500("该用户已冻结"); return result; } return result; } @Override public List queryLogicDeleted() { return this.queryLogicDeleted(null); } @Override public List queryLogicDeleted(LambdaQueryWrapper wrapper) { if (wrapper == null) { wrapper = new LambdaQueryWrapper<>(); } wrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_1); return userMapper.selectLogicDeleted(wrapper); } @Override public boolean revertLogicDeleted(List userIds, SysUser updateEntity) { String ids = String.format("'%s'", String.join("','", userIds)); return userMapper.revertLogicDeleted(ids, updateEntity) > 0; } @Override @Transactional(rollbackFor = Exception.class) public boolean removeLogicDeleted(List userIds) { String ids = String.format("'%s'", String.join("','", userIds)); // 1. 删除用户 int line = userMapper.deleteLogicDeleted(ids); // 2. 删除用户部门关系 line += sysUserDepartMapper.delete(new LambdaQueryWrapper().in(SysUserDepart::getUserId, userIds)); //3. 删除用户角色关系 line += sysUserRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, userIds)); //4.同步删除第三方App的用户 try { dingtalkService.removeThirdAppUser(userIds); wechatEnterpriseService.removeThirdAppUser(userIds); } catch (Exception e) { log.error("同步删除第三方App的用户失败:", e); } //5. 删除第三方用户表(因为第4步需要用到第三方用户表,所以在他之后删) line += sysThirdAccountMapper.delete(new LambdaQueryWrapper().in(SysThirdAccount::getSysUserId, userIds)); return line != 0; } @Override @Transactional(rollbackFor = Exception.class) public boolean updateNullPhoneEmail() { userMapper.updateNullByEmptyString("email"); userMapper.updateNullByEmptyString("phone"); return true; } @Override public void saveThirdUser(SysUser sysUser) { //保存用户 String userid = UUIDGenerator.generate(); sysUser.setId(userid); baseMapper.insert(sysUser); //获取第三方角色 SysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper().eq(SysRole::getRoleCode, "third_role")); //保存用户角色 SysUserRole userRole = new SysUserRole(); userRole.setRoleId(sysRole.getId()); userRole.setUserId(userid); sysUserRoleMapper.insert(userRole); } @Override public List queryByDepIds(List departIds, String username) { return userMapper.queryByDepIds(departIds,username); } @Override @Transactional(rollbackFor = Exception.class) public void saveUser(SysUser user, String selectedRoles, String selectedDeparts) { //step.1 保存用户 this.save(user); //step.2 保存角色 if(oConvertUtils.isNotEmpty(selectedRoles)) { String[] arr = selectedRoles.split(","); for (String roleId : arr) { SysUserRole userRole = new SysUserRole(user.getId(), roleId); sysUserRoleMapper.insert(userRole); } } //step.3 保存所属部门 if(oConvertUtils.isNotEmpty(selectedDeparts)) { String[] arr = selectedDeparts.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 editUser(SysUser user, String roles, String departs) { /*if(!StringUtils.isEmpty(departs)){ user.setOrgCode(""); user.setDepartIds(departs); }*/ //step.1 修改用户基础信息 this.updateById(user); //step.2 修改角色 //处理用户角色 先删后加 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); } } //step.3 修改部门 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); } } //step.4 修改手机号和邮箱 // 更新手机号、邮箱空字符串为 null userMapper.updateNullByEmptyString("email"); userMapper.updateNullByEmptyString("phone"); } @Override public List userIdToUsername(Collection userIdList) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysUser::getId, userIdList); List userList = super.list(queryWrapper); return userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); } }