package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.service.UserService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.domain.SysUserPost;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
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.Arrays;
import java.util.List;
/**
* 用户 业务层处ç†
*
* @author Lion Li
*/
@Slf4j
@Service
public class SysUserServiceImpl extends ServicePlusImpl<SysUserMapper, SysUser, SysUser> implements ISysUserService, UserService {
@Autowired
private SysRoleMapper roleMapper;
@Autowired
private SysPostMapper postMapper;
@Autowired
private SysUserRoleMapper userRoleMapper;
@Autowired
private SysUserPostMapper userPostMapper;
@Autowired
private ISysConfigService configService;
@Override
@DataScope(deptAlias = "d", userAlias = "u", isUser = true)
public TableDataInfo<SysUser> selectPageUserList(SysUser user) {
return PageUtils.buildDataInfo(baseMapper.selectPageUserList(PageUtils.buildPage(), user));
}
/**
* æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢ç”¨æˆ·åˆ—表
*
* @param user 用户信æ¯
* @return 用户信æ¯é›†åˆä¿¡æ¯
*/
@Override
@DataScope(deptAlias = "d", userAlias = "u", isUser = true)
public List<SysUser> selectUserList(SysUser user) {
return baseMapper.selectUserList(user);
}
/**
* æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²åˆ†é…用户角色列表
*
* @param user 用户信æ¯
* @return 用户信æ¯é›†åˆä¿¡æ¯
*/
@Override
@DataScope(deptAlias = "d", userAlias = "u", isUser = true)
public TableDataInfo<SysUser> selectAllocatedList(SysUser user) {
return PageUtils.buildDataInfo(baseMapper.selectAllocatedList(PageUtils.buildPage(), user));
}
/**
* æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢æœªåˆ†é…用户角色列表
*
* @param user 用户信æ¯
* @return 用户信æ¯é›†åˆä¿¡æ¯
*/
@Override
@DataScope(deptAlias = "d", userAlias = "u", isUser = true)
public TableDataInfo<SysUser> selectUnallocatedList(SysUser user) {
return PageUtils.buildDataInfo(baseMapper.selectUnallocatedList(PageUtils.buildPage(), user));
}
/**
* é€šè¿‡ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·
*
* @param userName 用户å
* @return 用户对象信æ¯
*/
@Override
public SysUser selectUserByUserName(String userName) {
return baseMapper.selectUserByUserName(userName);
}
/**
* 通过用户ID查询用户
*
* @param userId 用户ID
* @return 用户对象信æ¯
*/
@Override
public SysUser selectUserById(Long userId) {
return baseMapper.selectUserById(userId);
}
/**
* 查询用户所属角色组
*
* @param userName 用户å
* @return 结果
*/
@Override
public String selectUserRoleGroup(String userName) {
List<SysRole> list = roleMapper.selectRolesByUserName(userName);
StringBuilder idsStr = new StringBuilder();
for (SysRole role : list) {
idsStr.append(role.getRoleName()).append(",");
}
if (StringUtils.isNotEmpty(idsStr.toString())) {
return idsStr.substring(0, idsStr.length() - 1);
}
return idsStr.toString();
}
/**
* 查询用户所属岗ä½ç»„
*
* @param userName 用户å
* @return 结果
*/
@Override
public String selectUserPostGroup(String userName) {
List<SysPost> list = postMapper.selectPostsByUserName(userName);
StringBuilder idsStr = new StringBuilder();
for (SysPost post : list) {
idsStr.append(post.getPostName()).append(",");
}
if (StringUtils.isNotEmpty(idsStr.toString())) {
return idsStr.substring(0, idsStr.length() - 1);
}
return idsStr.toString();
}
/**
* æ ¡éªŒç”¨æˆ·å称是å¦å”¯ä¸€
*
* @param userName 用户åç§°
* @return 结果
*/
@Override
public String checkUserNameUnique(String userName) {
long count = count(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName));
if (count > 0) {
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();
long count = count(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getPhonenumber, user.getPhonenumber())
.ne(SysUser::getUserId, userId));
if (count > 0) {
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();
long count = count(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getEmail, user.getEmail())
.ne(SysUser::getUserId, userId));
if (count > 0) {
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<SysUser> 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 = baseMapper.insert(user);
// 新增用户岗ä½å…³è”
insertUserPost(user);
// 新增用户与角色管ç†
insertUserRole(user);
return rows;
}
/**
* 注册用户信æ¯
*
* @param user 用户信æ¯
* @return 结果
*/
@Override
public boolean registerUser(SysUser user) {
return baseMapper.insert(user) > 0;
}
/**
* 修改ä¿å˜ç”¨æˆ·ä¿¡æ¯
*
* @param user 用户信æ¯
* @return 结果
*/
@Override
@Transactional
public int updateUser(SysUser user) {
Long userId = user.getUserId();
// åˆ é™¤ç”¨æˆ·ä¸Žè§’è‰²å…³è”
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
// 新增用户与角色管ç†
insertUserRole(user);
// åˆ é™¤ç”¨æˆ·ä¸Žå²—ä½å…³è”
userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().eq(SysUserPost::getUserId, userId));
// 新增用户与岗ä½ç®¡ç†
insertUserPost(user);
return baseMapper.updateById(user);
}
/**
* 用户授æƒè§’色
*
* @param userId 用户ID
* @param roleIds 角色组
*/
@Override
@Transactional
public void insertUserAuth(Long userId, Long[] roleIds) {
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getUserId, userId));
insertUserRole(userId, roleIds);
}
/**
* 修改用户状æ€
*
* @param user 用户信æ¯
* @return 结果
*/
@Override
public int updateUserStatus(SysUser user) {
return baseMapper.updateById(user);
}
/**
* 修改用户基本信æ¯
*
* @param user 用户信æ¯
* @return 结果
*/
@Override
public int updateUserProfile(SysUser user) {
return baseMapper.updateById(user);
}
/**
* 修改用户头åƒ
*
* @param userName 用户å
* @param avatar 头åƒåœ°å€
* @return 结果
*/
@Override
public boolean updateUserAvatar(String userName, String avatar) {
return baseMapper.update(null,
new LambdaUpdateWrapper<SysUser>()
.set(SysUser::getAvatar, avatar)
.eq(SysUser::getUserName, userName)) > 0;
}
/**
* é‡ç½®ç”¨æˆ·å¯†ç
*
* @param user 用户信æ¯
* @return 结果
*/
@Override
public int resetPwd(SysUser user) {
return baseMapper.updateById(user);
}
/**
* é‡ç½®ç”¨æˆ·å¯†ç
*
* @param userName 用户å
* @param password 密ç
* @return 结果
*/
@Override
public int resetUserPwd(String userName, String password) {
return baseMapper.update(null,
new LambdaUpdateWrapper<SysUser>()
.set(SysUser::getPassword, password)
.eq(SysUser::getUserName, userName));
}
/**
* 新增用户角色信æ¯
*
* @param user 用户对象
*/
public void insertUserRole(SysUser user) {
Long[] roles = user.getRoleIds();
if (StringUtils.isNotNull(roles)) {
// 新增用户与角色管ç†
List<SysUserRole> list = new ArrayList<SysUserRole>();
for (Long roleId : roles) {
SysUserRole ur = new SysUserRole();
ur.setUserId(user.getUserId());
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0) {
userRoleMapper.insertAll(list);
}
}
}
/**
* 新增用户岗ä½ä¿¡æ¯
*
* @param user 用户对象
*/
public void insertUserPost(SysUser user) {
Long[] posts = user.getPostIds();
if (StringUtils.isNotNull(posts)) {
// 新增用户与岗ä½ç®¡ç†
List<SysUserPost> list = new ArrayList<SysUserPost>();
for (Long postId : posts) {
SysUserPost up = new SysUserPost();
up.setUserId(user.getUserId());
up.setPostId(postId);
list.add(up);
}
if (list.size() > 0) {
userPostMapper.insertAll(list);
}
}
}
/**
* 新增用户角色信æ¯
*
* @param userId 用户ID
* @param roleIds 角色组
*/
public void insertUserRole(Long userId, Long[] roleIds) {
if (StringUtils.isNotNull(roleIds)) {
// 新增用户与角色管ç†
List<SysUserRole> list = new ArrayList<SysUserRole>();
for (Long roleId : roleIds) {
SysUserRole ur = new SysUserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0) {
userRoleMapper.insertAll(list);
}
}
}
/**
* 通过用户IDåˆ é™¤ç”¨æˆ·
*
* @param userId 用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserById(Long userId) {
// åˆ é™¤ç”¨æˆ·ä¸Žè§’è‰²å…³è”
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
// åˆ é™¤ç”¨æˆ·ä¸Žå²—ä½è¡¨
userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().eq(SysUserPost::getUserId, userId));
return baseMapper.deleteById(userId);
}
/**
* 批é‡åˆ 除用户信æ¯
*
* @param userIds 需è¦åˆ 除的用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserByIds(Long[] userIds) {
for (Long userId : userIds) {
checkUserAllowed(new SysUser(userId));
}
List<Long> ids = Arrays.asList(userIds);
// åˆ é™¤ç”¨æˆ·ä¸Žè§’è‰²å…³è”
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, ids));
// åˆ é™¤ç”¨æˆ·ä¸Žå²—ä½è¡¨
userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().in(SysUserPost::getUserId, ids));
return baseMapper.deleteBatchIds(ids);
}
/**
* 导入用户数æ®
*
* @param userList 用户数æ®åˆ—表
* @param isUpdateSupport æ˜¯å¦æ›´æ–°æ”¯æŒï¼Œå¦‚果已å˜åœ¨ï¼Œåˆ™è¿›è¡Œæ›´æ–°æ•°æ®
* @param operName æ“作用户
* @return 结果
*/
@Override
public String importUser(List<SysUser> 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 = baseMapper.selectUserByUserName(user.getUserName());
if (StringUtils.isNull(u)) {
user.setPassword(SecurityUtils.encryptPassword(password));
user.setCreateBy(operName);
this.insertUser(user);
successNum++;
successMsg.append("<br/>" + successNum + "ã€è´¦å· " + user.getUserName() + " 导入æˆåŠŸ");
} else if (isUpdateSupport) {
user.setUpdateBy(operName);
this.updateUser(user);
successNum++;
successMsg.append("<br/>" + successNum + "ã€è´¦å· " + user.getUserName() + " æ›´æ–°æˆåŠŸ");
} else {
failureNum++;
failureMsg.append("<br/>" + failureNum + "ã€è´¦å· " + user.getUserName() + " å·²å˜åœ¨");
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + 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();
}
@Override
public Page<SysUser> pageList(Page<SysUser> page, Long deptId) {
return baseMapper.selectPage(page, new QueryWrapper<SysUser>().eq("dept_id", deptId));
}
}