package com.ruoyi.project.system.user.service; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.utils.RegexUtil; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.security.ShiroUtils; import com.ruoyi.common.utils.text.Convert; import com.ruoyi.framework.aspectj.lang.annotation.DataScope; import com.ruoyi.framework.shiro.service.PasswordService; import com.ruoyi.project.system.config.service.IConfigService; import com.ruoyi.project.system.post.domain.Post; import com.ruoyi.project.system.post.mapper.PostMapper; import com.ruoyi.project.system.role.domain.Role; import com.ruoyi.project.system.role.mapper.RoleMapper; import com.ruoyi.project.system.role.service.IRoleService; import com.ruoyi.project.system.roleRegion.domain.RoleRegion; import com.ruoyi.project.system.roleRegion.mapper.RoleRegionMapper; import com.ruoyi.project.system.user.domain.User; import com.ruoyi.project.system.user.domain.UserPost; import com.ruoyi.project.system.user.domain.UserRole; import com.ruoyi.project.system.user.mapper.UserMapper; import com.ruoyi.project.system.user.mapper.UserPostMapper; import com.ruoyi.project.system.user.mapper.UserRoleMapper; import com.ruoyi.project.tr.region.domain.Region; import com.ruoyi.project.tr.region.mapper.RegionMapper; 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 java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 用户 业务层处理 * * @author ruoyi */ @Service public class UserServiceImpl implements IUserService { private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class); @Autowired private UserMapper userMapper; @Autowired private RoleMapper roleMapper; @Autowired private PostMapper postMapper; @Autowired private UserPostMapper userPostMapper; @Autowired private UserRoleMapper userRoleMapper; @Autowired private IConfigService configService; @Autowired private PasswordService passwordService; @Autowired private IRoleService roleService; @Autowired private RegionMapper regionMapper; @Autowired private RoleRegionMapper roleRegionMapper; /** * 根据条件分页查询用户列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectUserList(User user) { // 生成数据权限过滤条件 return userMapper.selectUserList(user); } /** * 根据条件分页查询已分配用户角色列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectAllocatedList(User user) { return userMapper.selectAllocatedList(user); } /** * 根据条件分页查询未分配用户角色列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectUnallocatedList(User user) { return userMapper.selectUnallocatedList(user); } /** * 通过用户名查询用户 * * @param userName 用户名 * @return 用户对象信息 */ @Override public User selectUserByLoginName(String userName) { return userMapper.selectUserByLoginName(userName); } /** * 通过手机号码查询用户 * * @param phoneNumber 手机号码 * @return 用户对象信息 */ @Override public User selectUserByPhoneNumber(String phoneNumber) { return userMapper.selectUserByPhoneNumber(phoneNumber); } /** * 通过邮箱查询用户 * * @param email 邮箱 * @return 用户对象信息 */ @Override public User selectUserByEmail(String email) { return userMapper.selectUserByEmail(email); } /** * 通过用户ID查询用户 * * @param userId 用户ID * @return 用户对象信息 */ @Override public User selectUserById(Long userId) { return userMapper.selectUserById(userId); } /** * 通过用户ID查询用户和角色关联 * * @param userId 用户ID * @return 用户和角色关联列表 */ @Override public List selectUserRoleByUserId(Long userId) { return userRoleMapper.selectUserRoleByUserId(userId); } /** * 通过用户ID删除用户 * * @param userId 用户ID * @return 结果 */ @Override public int deleteUserById(Long userId) { // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(userId); // 删除用户与岗位表 userPostMapper.deleteUserPostByUserId(userId); return userMapper.deleteUserById(userId); } /** * 批量删除用户信息 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteUserByIds(String ids) throws BusinessException { Long[] userIds = Convert.toLongArray(ids); for (Long userId : userIds) { checkUserAllowed(new User(userId)); } return userMapper.deleteUserByIds(userIds); } /** * 批量删除用户信息(物理删除) * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteUserByIdsByPhysics(String ids) throws BusinessException { Long[] userIds = Convert.toLongArray(ids); for (Long userId : userIds) { checkUserAllowed(new User(userId)); } return userMapper.deleteUserByIdsByPhysics(userIds); } /** * 新增保存用户信息 * * @param user 用户信息 * @return 结果 */ @Override @Transactional public int insertUser(User user) { if(StringUtils.isEmpty(user.getPassword())){ throw new BusinessException("密码不能为空"); } if(!RegexUtil.isPassword(user.getPassword())){ throw new BusinessException("密码无效。密码必须包含至少一个大写字母、一个小写字母和一个数字,并且至少10个字符长。"); } user.randomSalt(); user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt())); user.setCreateBy(ShiroUtils.getLoginName()); // 新增用户信息 int rows = userMapper.insertUser(user); // 新增用户岗位关联 insertUserPost(user); // 新增用户与角色管理 insertUserRole(user.getUserId(), user.getRoleIds()); return rows; } /** * 注册用户信息 * * @param user 用户信息 * @return 结果 */ @Override public boolean registerUser(User user) { user.setUserType(UserConstants.REGISTER_USER_TYPE); user.randomSalt(); user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt())); return userMapper.insertUser(user) > 0; } /** * 修改保存用户信息 * * @param user 用户信息 * @return 结果 */ @Override @Transactional public int updateUser(User user) { Long userId = user.getUserId(); user.setUpdateBy(ShiroUtils.getLoginName()); // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(userId); // 新增用户与角色管理 insertUserRole(user.getUserId(), user.getRoleIds()); // 删除用户与岗位关联 userPostMapper.deleteUserPostByUserId(userId); // 新增用户与岗位管理 insertUserPost(user); return userMapper.updateUser(user); } /** * 修改用户个人详细信息 * * @param user 用户信息 * @return 结果 */ @Override public int updateUserInfo(User user) { return userMapper.updateUser(user); } /** * 用户授权角色 * * @param userId 用户ID * @param roleIds 角色组 */ @Override public void insertUserAuth(Long userId, Long[] roleIds) { userRoleMapper.deleteUserRoleByUserId(userId); insertUserRole(userId, roleIds); } /** * 修改用户密码 * * @param user 用户信息 * @return 结果 */ @Override public int resetUserPwd(User user) { if(StringUtils.isEmpty(user.getPassword())){ throw new BusinessException("密码不能为空"); } if(!RegexUtil.isPassword(user.getPassword())){ throw new BusinessException("密码无效。密码必须包含至少一个大写字母、一个小写字母和一个数字,并且至少10个字符长。"); } user.randomSalt(); user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt())); return updateUserInfo(user); } /** * 新增用户角色信息 * * @param userId * @param roleIds */ public void insertUserRole(Long userId, Long[] roleIds) { if (StringUtils.isNotNull(roleIds)) { // 新增用户与角色管理 List list = new ArrayList(); for (Long roleId : roleIds) { UserRole ur = new UserRole(); ur.setUserId(userId); ur.setRoleId(roleId); list.add(ur); } if (list.size() > 0) { userRoleMapper.batchUserRole(list); } } } /** * 新增用户岗位信息 * * @param user 用户对象 */ public void insertUserPost(User user) { Long[] posts = user.getPostIds(); if (StringUtils.isNotNull(posts)) { // 新增用户与岗位管理 List list = new ArrayList(); for (Long postId : user.getPostIds()) { UserPost up = new UserPost(); up.setUserId(user.getUserId()); up.setPostId(postId); list.add(up); } if (list.size() > 0) { userPostMapper.batchUserPost(list); } } } /** * 校验登录名称是否唯一 * * @param loginName 用户名 * @return */ @Override public String checkLoginNameUnique(String loginName) { int count = userMapper.checkLoginNameUnique(loginName); if (count > 0) { return UserConstants.USER_NAME_NOT_UNIQUE; } return UserConstants.USER_NAME_UNIQUE; } /** * 校验手机号码是否唯一 * * @param user 用户信息 * @return */ @Override public String checkPhoneUnique(User user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); User info = userMapper.checkPhoneUnique(user.getPhonenumber()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.USER_PHONE_NOT_UNIQUE; } return UserConstants.USER_PHONE_UNIQUE; } /** * 校验email是否唯一 * * @param user 用户信息 * @return */ @Override public String checkEmailUnique(User user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); User info = userMapper.checkEmailUnique(user.getEmail()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.USER_EMAIL_NOT_UNIQUE; } return UserConstants.USER_EMAIL_UNIQUE; } /** * 校验用户是否允许操作 * * @param user 用户信息 */ @Override public void checkUserAllowed(User user) { if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) { throw new BusinessException("不允许操作超级管理员用户"); } } /** * 查询用户所属角色组 * * @param userId 用户ID * @return 结果 */ @Override public String selectUserRoleGroup(Long userId) { List list = roleMapper.selectRolesByUserId(userId); StringBuffer idsStr = new StringBuffer(); for (Role role : list) { idsStr.append(role.getRoleName()).append(","); } if (StringUtils.isNotEmpty(idsStr.toString())) { return idsStr.substring(0, idsStr.length() - 1); } return idsStr.toString(); } /** * 查询用户所属岗位组 * * @param userId 用户ID * @return 结果 */ @Override public String selectUserPostGroup(Long userId) { List list = postMapper.selectPostsByUserId(userId); StringBuffer idsStr = new StringBuffer(); for (Post post : list) { idsStr.append(post.getPostName()).append(","); } if (StringUtils.isNotEmpty(idsStr.toString())) { return idsStr.substring(0, idsStr.length() - 1); } return idsStr.toString(); } /** * 导入用户数据 * * @param userList 用户数据列表 * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 * @return 结果 */ @Override public String importUser(List userList, Boolean isUpdateSupport) { if (StringUtils.isNull(userList) || userList.size() == 0) { throw new BusinessException("导入用户数据不能为空!"); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); String operName = ShiroUtils.getLoginName(); String password = configService.selectConfigByKey("sys.user.initPassword"); for (User user : userList) { try { // 验证是否存在这个用户 User u = userMapper.selectUserByLoginName(user.getLoginName()); if (StringUtils.isNull(u)) { user.setPassword(password); user.setCreateBy(operName); this.insertUser(user); successNum++; successMsg.append("
" + successNum + "、账号 " + user.getLoginName() + " 导入成功"); } else if (isUpdateSupport) { user.setUpdateBy(operName); this.updateUser(user); successNum++; successMsg.append("
" + successNum + "、账号 " + user.getLoginName() + " 更新成功"); } else { failureNum++; failureMsg.append("
" + failureNum + "、账号 " + user.getLoginName() + " 已存在"); } } catch (Exception e) { failureNum++; String msg = "
" + failureNum + "、账号 " + user.getLoginName() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new BusinessException(failureMsg.toString()); } else { successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); } return successMsg.toString(); } /** * 用户状态修改 * * @param user 用户信息 * @return 结果 */ @Override public int changeStatus(User user) { return userMapper.updateUser(user); } /** * 根据userId获取regionId集合 */ @Override public Set getRegionIdSetByUserId(User userQuery) { if (userQuery.getUserId() != null) { Set regionSet = new HashSet<>(); User user = userMapper.selectUserById(userQuery.getUserId()); if (user.isAdmin()) { Region region = new Region(); region.setCompanyId(user.getCompanyId()); List regionList = regionMapper.selectRegionList(region); for (Region regionListTemp : regionList) { regionSet.add(regionListTemp.getRegionId().toString()); } return new HashSet<>(); } else { Set roleSet = roleService.selectRoleKeys(user.getUserId()); if (roleSet.contains("common")) { Region region = new Region(); region.setCompanyId(user.getCompanyId()); List regionList = regionMapper.selectRegionList(region); for (Region regionListTemp : regionList) { regionSet.add(regionListTemp.getRegionId().toString()); } return regionSet; } else { List roleListTemp = roleService.selectRolesByUserId(user.getUserId()); for (Role roleTemp : roleListTemp) { if (roleTemp.getRoleId()!=null) { RoleRegion roleRegionQuery = new RoleRegion(); roleRegionQuery.setRoleId(roleTemp.getRoleId()); List roleRegionListTemp = roleRegionMapper.selectRoleRegionList(roleRegionQuery); for (RoleRegion roleRegionTemp : roleRegionListTemp) { regionSet.add(roleRegionTemp.getRegionId().toString()); } } } return regionSet; } } } return null; } /** * 用户getBYId */ @Override public User getUserById(Long userId) { return userMapper.getUserById(userId); } /** * 用户getBY LoginName */ @Override public User getUserByLoginName(String createBy) { return userMapper.getUserByLoginName(createBy); } @Override public User getUserByName(String createBy) { return userMapper.getUserByName(createBy); } @Override public List getAllUser() { return userMapper.getAllUser(); } @Override public List selectForUpdatePwd() { return userMapper.selectForUpdatePwd(); } @Override public int updateUserForUpdatePwd(User user) { return userMapper.updateUserForUpdatePwd(user); } }