package com.ruoyi.system.service.impl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.*; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanValidators; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; import com.smartor.mapper.SysUserDeptMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.validation.Validator; import java.util.*; import java.util.stream.Collectors; /** * 用户 业务层处理 * * @author ruoyi */ @Service public class SysUserServiceImpl implements ISysUserService { private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @Autowired private SysUserMapper userMapper; @Autowired private SysDeptMapper sysDeptMapper; @Autowired private SysUserDeptMapper sysUserDeptMapper; @Autowired private SysRoleMapper roleMapper; @Autowired private SysPostMapper postMapper; @Autowired private SysUserRoleMapper userRoleMapper; @Autowired private SysUserPostMapper userPostMapper; @Autowired private ISysConfigService configService; @Autowired protected Validator validator; /** * 根据条件分页查询用户列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectUserList(SysUser user) { return userMapper.selectUserList(user); } /** * 根据条件分页查询已分配用户角色列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectAllocatedList(SysUser user) { return userMapper.selectAllocatedList(user); } /** * 根据条件分页查询未分配用户角色列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectUnallocatedList(SysUser user) { return userMapper.selectUnallocatedList(user); } /** * 通过用户名查询用户 * * @param userName 用户名 * @return 用户对象信息 */ @Override public SysUser selectUserByUserName(String userName) { SysUser sysUser = userMapper.selectUserByUserName(userName); List sysDepts = sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId()); List deptIds = new ArrayList<>(); for (SysDept sysDept : sysDepts) { deptIds.add(sysDept.getDeptId()); } SysUserDept sysUserDept = new SysUserDept(); sysUserDept.setUserId(sysUser.getUserId()); sysUserDept.setDeptType(sysUser.getSearchscope()); List sysUserDeptKSs = null; List sysUserDeptBQs = null; if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("0")) { sysUserDept.setDeptType("1"); sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); sysUserDept.setDeptType("2"); sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("1")) { sysUserDept.setDeptType("1"); sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("2")) { sysUserDept.setDeptType("2"); sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); } sysUser.setDepts(deptIds); if (!CollectionUtils.isEmpty(sysUserDeptBQs)) { List> list = new ArrayList<>(); for (SysUserDept sud : sysUserDeptBQs) { Map map = new HashMap<>(); map.put("districtCode", ""); if (StringUtils.isNotEmpty(sud.getDeptCode())) map.put("districtCode", sud.getDeptCode()); map.put("districtName", ""); if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("districtName", sud.getDeptName()); list.add(map); } sysUser.setBelongWards(list); } if (!CollectionUtils.isEmpty(sysUserDeptKSs)) { List> list = new ArrayList<>(); for (SysUserDept sud : sysUserDeptKSs) { Map map = new HashMap<>(); map.put("deptCode", ""); if (StringUtils.isNotEmpty(sud.getDeptCode())) map.put("deptCode", sud.getDeptCode()); map.put("deptName", ""); if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("deptName", sud.getDeptName()); list.add(map); } sysUser.setBelongDepts(list); } return sysUser; } @Override public SysUser selectUserByUserName2(String userName) { String[] split = userName.split("&"); SysUser sysUser = userMapper.selectUserByUserNameByCondition(split[0], split[1]); List sysDepts = null; if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) { SysDept dept = new SysDept(); dept.setOrgid(split[1]); sysDepts = sysDeptMapper.selectDeptList(dept); } else { sysDepts = sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId()); } List deptIds = new ArrayList<>(); for (SysDept sysDept : sysDepts) { deptIds.add(sysDept.getDeptId()); } SysUserDept sysUserDept = new SysUserDept(); sysUserDept.setUserId(sysUser.getUserId()); sysUserDept.setDeptType(sysUser.getSearchscope()); List sysUserDeptKSs = null; List sysUserDeptBQs = null; if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("0")) { if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) { sysUserDept.setUserId(null); } sysUserDept.setDeptType("1"); sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); sysUserDept.setDeptType("2"); sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); //如果是admin,需要对sysUserDeptBQs,sysUserDeptBQs去重 if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) { List distinctUserDepts = new ArrayList<>(); Set uniqueDeptCodes = new HashSet<>(); for (SysUserDept userDept : sysUserDeptKSs) { String deptCode = userDept.getDeptCode(); if (StringUtils.isNotEmpty(deptCode) && !uniqueDeptCodes.contains(deptCode)) { distinctUserDepts.add(userDept); uniqueDeptCodes.add(deptCode); } } List distinctUserBQs = new ArrayList<>(); Set uniqueBQCodes = new HashSet<>(); for (SysUserDept userDept : sysUserDeptBQs) { String deptCode = userDept.getDeptCode(); if (StringUtils.isNotEmpty(deptCode) && !uniqueBQCodes.contains(deptCode)) { distinctUserBQs.add(userDept); uniqueBQCodes.add(deptCode); } } sysUserDeptKSs = distinctUserDepts; sysUserDeptBQs = distinctUserBQs; } } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("1")) { sysUserDept.setDeptType("1"); sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("2")) { sysUserDept.setDeptType("2"); sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); } sysUser.setDepts(deptIds); if (!CollectionUtils.isEmpty(sysUserDeptBQs)) { List> list = new ArrayList<>(); for (SysUserDept sud : sysUserDeptBQs) { Map map = new HashMap<>(); map.put("districtCode", ""); if (StringUtils.isNotEmpty(sud.getDeptCode())) map.put("districtCode", sud.getDeptCode()); else continue; map.put("districtName", ""); if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("districtName", sud.getDeptName()); list.add(map); } sysUser.setBelongWards(list); } if (!CollectionUtils.isEmpty(sysUserDeptKSs)) { List> list = new ArrayList<>(); for (SysUserDept sud : sysUserDeptKSs) { Map map = new HashMap<>(); map.put("deptCode", ""); if (StringUtils.isNotEmpty(sud.getDeptCode())) map.put("deptCode", sud.getDeptCode()); else continue; map.put("deptName", ""); if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("deptName", sud.getDeptName()); list.add(map); } sysUser.setBelongDepts(list); } return sysUser; } /** * 通过用户ID查询用户 * * @param userId 用户ID * @return 用户对象信息 */ @Override public SysUser selectUserById(Long userId) { SysUser sysUser = userMapper.selectUserById(userId); List sysDepts = sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId()); List deptIds = new ArrayList<>(); for (SysDept sysDept : sysDepts) { deptIds.add(sysDept.getDeptId()); } sysUser.setDepts(deptIds); return sysUser; } /** * 查询用户所属角色组 * * @param userName 用户名 * @return 结果 */ @Override public String selectUserRoleGroup(String userName) { List list = roleMapper.selectRolesByUserName(userName); if (CollectionUtils.isEmpty(list)) { return StringUtils.EMPTY; } return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); } /** * 查询用户所属岗位组 * * @param userName 用户名 * @return 结果 */ @Override public String selectUserPostGroup(String userName) { List list = postMapper.selectPostsByUserName(userName); if (CollectionUtils.isEmpty(list)) { return StringUtils.EMPTY; } return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); } /** * 校验用户名称是否唯一 * * @param user 用户信息 * @return 结果 */ @Override public String checkUserNameUnique(SysUser user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); SysUser info = userMapper.checkUserNameUnique(user.getUserName()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验手机号码是否唯一 * * @param user 用户信息 * @return */ @Override public String checkPhoneUnique(SysUser user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验email是否唯一 * * @param user 用户信息 * @return */ @Override public String checkEmailUnique(SysUser user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); SysUser info = userMapper.checkEmailUnique(user.getEmail()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验用户是否允许操作 * * @param user 用户信息 */ @Override public void checkUserAllowed(SysUser user) { if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) { throw new ServiceException("不允许操作超级管理员用户"); } } /** * 校验用户是否有数据权限 * * @param userId 用户id */ @Override public void checkUserDataScope(Long userId) { if (!SysUser.isAdmin(SecurityUtils.getUserId())) { SysUser user = new SysUser(); user.setUserId(userId); List users = SpringUtils.getAopProxy(this).selectUserList(user); if (StringUtils.isEmpty(users)) { throw new ServiceException("没有权限访问用户数据!"); } } } /** * 新增保存用户信息 * * @param user 用户信息 * @return 结果 */ @Override @Transactional public int insertUser(SysUser user) { // 新增用户信息 int rows = userMapper.insertUser(user); //新增用户与部门关联 if (!CollectionUtils.isEmpty(user.getDepts())) { for (Long deptId : user.getDepts()) { SysUserDept sysUserDep = new SysUserDept(); sysUserDep.setUserId(user.getUserId()); sysUserDep.setDeptId(deptId); sysUserDep.setCreateTime(new Date()); sysUserDep.setUpdateTime(new Date()); sysUserDep.setOrgid(user.getOrgid()); sysUserDeptMapper.insertSysUserDept(sysUserDep); } } // 新增用户岗位关联 insertUserPost(user); // 新增用户与角色管理 insertUserRole(user); return rows; } /** * 注册用户信息 * * @param user 用户信息 * @return 结果 */ @Override public boolean registerUser(SysUser user) { return userMapper.insertUser(user) > 0; } /** * 修改保存用户信息 * * @param user 用户信息 * @return 结果 */ @Override @Transactional public int updateUser(SysUser user) { Long userId = user.getUserId(); // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(userId); // 新增用户与角色管理 insertUserRole(user); // 删除用户与岗位关联 userPostMapper.deleteUserPostByUserId(userId); // 新增用户与岗位管理 insertUserPost(user); //删除用户与部门的关联 Long[] ids = {user.getUserId()}; //新增用户与部门关联 // sysUserDeptMapper.deleteSysUserDeptByIds(ids); // if (!CollectionUtils.isEmpty(user.getDepts())) { // for (Long deptId : user.getDepts()) { // SysUserDept sysUserDep = new SysUserDept(); // sysUserDep.setUserId(user.getUserId()); // sysUserDep.setDeptId(deptId); // //查询是否 已经关联该部门 // List sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDep); // if (!CollectionUtils.isEmpty(sysUserDepts)) { // SysUserDept sysUserDept = sysUserDepts.get(0); // sysUserDept.setDelFlag(0L); // sysUserDeptMapper.updateSysUserDept(sysUserDept); // continue; // } // sysUserDep.setCreateTime(new Date()); // sysUserDep.setUpdateTime(new Date()); // sysUserDeptMapper.insertSysUserDept(sysUserDep); // } // } if (!CollectionUtils.isEmpty(user.getDeptCodes())) { for (String deptCode : user.getDeptCodes()) { SysDept sysDept = sysDeptMapper.selectDeptByCode(deptCode); SysUserDept sysUserDept = new SysUserDept(); sysUserDept.setUserId(user.getUserId()); sysUserDept.setOrgid(user.getOrgid()); sysUserDept.setDeptCode(deptCode); List sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); sysUserDept.setDelFlag(0L); sysUserDept.setDeptType("1"); sysUserDept.setDeptName(sysDept.getDeptName()); sysUserDept.setUpdateTime(new Date()); if (!CollectionUtils.isEmpty(sysUserDepts)) { sysUserDept.setId(sysUserDepts.get(0).getId()); sysUserDeptMapper.updateSysUserDept(sysUserDept); continue; } sysUserDept.setCreateTime(new Date()); sysUserDeptMapper.insertSysUserDept(sysUserDept); } } if (!CollectionUtils.isEmpty(user.getWardCodes())) { for (String wardCode : user.getWardCodes()) { SysDept sysDept = sysDeptMapper.selectDeptByCode(wardCode); SysUserDept sysUserDept = new SysUserDept(); sysUserDept.setUserId(user.getUserId()); sysUserDept.setDeptCode(wardCode); List sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); sysUserDept.setDelFlag(0L); sysUserDept.setDeptType("2"); sysUserDept.setOrgid(user.getOrgid()); sysUserDept.setDeptName(sysDept.getDeptName()); sysUserDept.setUpdateTime(new Date()); if (!CollectionUtils.isEmpty(sysUserDepts)) { sysUserDeptMapper.updateSysUserDept(sysUserDept); continue; } sysUserDept.setCreateTime(new Date()); sysUserDeptMapper.insertSysUserDept(sysUserDept); } } return userMapper.updateUser(user); } /** * 用户授权角色 * * @param userId 用户ID * @param roleIds 角色组 */ @Override @Transactional public void insertUserAuth(Long userId, Long[] roleIds, String orgid) { userRoleMapper.deleteUserRoleByUserId(userId); insertUserRole(userId, roleIds, orgid); } /** * 修改用户状态 * * @param user 用户信息 * @return 结果 */ @Override public int updateUserStatus(SysUser user) { return userMapper.updateUser(user); } /** * 修改用户基本信息 * * @param user 用户信息 * @return 结果 */ @Override public int updateUserProfile(SysUser user) { return userMapper.updateUser(user); } /** * 修改用户头像 * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 */ @Override public boolean updateUserAvatar(String userName, String avatar) { return userMapper.updateUserAvatar(userName, avatar) > 0; } /** * 重置用户密码 * * @param user 用户信息 * @return 结果 */ @Override public int resetPwd(SysUser user) { return userMapper.updateUser(user); } /** * 重置用户密码 * * @param userName 用户名 * @param password 密码 * @return 结果 */ @Override public int resetUserPwd(String userName, String password) { return userMapper.resetUserPwd(userName, password); } /** * 新增用户角色信息 * * @param user 用户对象 */ public void insertUserRole(SysUser user) { this.insertUserRole(user.getUserId(), user.getRoleIds(), user.getOrgid()); } /** * 新增用户岗位信息 * * @param user 用户对象 */ public void insertUserPost(SysUser user) { Long[] posts = user.getPostIds(); if (StringUtils.isNotEmpty(posts)) { // 新增用户与岗位管理 List list = new ArrayList(posts.length); for (Long postId : posts) { SysUserPost up = new SysUserPost(); up.setUserId(user.getUserId()); up.setPostId(postId); up.setOrgid(user.getOrgid()); list.add(up); } userPostMapper.batchUserPost(list); } } /** * 新增用户角色信息 * * @param userId 用户ID * @param roleIds 角色组 */ public void insertUserRole(Long userId, Long[] roleIds, String orgid) { if (StringUtils.isNotEmpty(roleIds)) { // 新增用户与角色管理 List list = new ArrayList(roleIds.length); for (Long roleId : roleIds) { SysUserRole ur = new SysUserRole(); ur.setUserId(userId); ur.setRoleId(roleId); ur.setOrgid(orgid); list.add(ur); } userRoleMapper.batchUserRole(list); } } /** * 通过用户ID删除用户 * * @param userId 用户ID * @return 结果 */ @Override @Transactional public int deleteUserById(Long userId) { // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(userId); // 删除用户与岗位表 userPostMapper.deleteUserPostByUserId(userId); return userMapper.deleteUserById(userId); } /** * 批量删除用户信息 * * @param userIds 需要删除的用户ID * @return 结果 */ @Override @Transactional public int deleteUserByIds(Long[] userIds) { for (Long userId : userIds) { checkUserAllowed(new SysUser(userId)); checkUserDataScope(userId); } // 删除用户与角色关联 userRoleMapper.deleteUserRole(userIds); // 删除用户与岗位关联 userPostMapper.deleteUserPost(userIds); return userMapper.deleteUserByIds(userIds); } /** * 导入用户数据 * * @param userList 用户数据列表 * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 * @param operName 操作用户 * @return 结果 */ @Override public String importUser(List userList, Boolean isUpdateSupport, String operName) { if (StringUtils.isNull(userList) || userList.size() == 0) { throw new ServiceException("导入用户数据不能为空!"); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); String password = configService.selectConfigByKey("sys.user.initPassword"); for (SysUser user : userList) { try { // 验证是否存在这个用户 SysUser u = userMapper.selectUserByUserName(user.getUserName()); if (StringUtils.isNull(u)) { BeanValidators.validateWithException(validator, user); user.setPassword(SecurityUtils.encryptPassword(password)); user.setCreateBy(operName); this.insertUser(user); successNum++; successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); } else if (isUpdateSupport) { BeanValidators.validateWithException(validator, user); checkUserAllowed(user); checkUserDataScope(user.getUserId()); user.setUpdateBy(operName); this.updateUser(user); successNum++; successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); } else { failureNum++; failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); } } catch (Exception e) { failureNum++; String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new ServiceException(failureMsg.toString()); } else { successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); } return successMsg.toString(); } }