package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.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.SysRoleDept;
import com.ruoyi.system.domain.SysRoleMenu;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.SysRoleDeptMapper;
import com.ruoyi.system.mapper.SysRoleMapper;
import com.ruoyi.system.mapper.SysRoleMenuMapper;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* 角色 业务层处ç†
*
* @author Lion Li
*/
@Service
public class SysRoleServiceImpl extends ServicePlusImpl<SysRoleMapper, SysRole, SysRole> implements ISysRoleService {
@Autowired
private SysRoleMenuMapper roleMenuMapper;
@Autowired
private SysUserRoleMapper userRoleMapper;
@Autowired
private SysRoleDeptMapper roleDeptMapper;
@Override
@DataScope(deptAlias = "d")
public TableDataInfo<SysRole> selectPageRoleList(SysRole role) {
return PageUtils.buildDataInfo(baseMapper.selectPageRoleList(PageUtils.buildPage(), role));
}
/**
* æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢è§’色数æ®
*
* @param role 角色信æ¯
* @return 角色数æ®é›†åˆä¿¡æ¯
*/
@Override
@DataScope(deptAlias = "d")
public List<SysRole> selectRoleList(SysRole role) {
return baseMapper.selectRoleList(role);
}
/**
* æ ¹æ®ç”¨æˆ·ID查询角色
*
* @param userId 用户ID
* @return 角色列表
*/
@Override
public List<SysRole> selectRolesByUserId(Long userId) {
List<SysRole> userRoles = baseMapper.selectRolePermissionByUserId(userId);
List<SysRole> roles = selectRoleAll();
for (SysRole role : roles) {
for (SysRole userRole : userRoles) {
if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) {
role.setFlag(true);
break;
}
}
}
return roles;
}
/**
* æ ¹æ®ç”¨æˆ·ID查询æƒé™
*
* @param userId 用户ID
* @return æƒé™åˆ—表
*/
@Override
public Set<String> selectRolePermissionByUserId(Long userId) {
List<SysRole> perms = baseMapper.selectRolePermissionByUserId(userId);
Set<String> permsSet = new HashSet<>();
for (SysRole perm : perms) {
if (StringUtils.isNotNull(perm)) {
permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
}
}
return permsSet;
}
/**
* 查询所有角色
*
* @return 角色列表
*/
@Override
public List<SysRole> selectRoleAll() {
return SpringUtils.getAopProxy(this).selectRoleList(new SysRole());
}
/**
* æ ¹æ®ç”¨æˆ·ID获å–角色选择框列表
*
* @param userId 用户ID
* @return 选ä¸è§’色ID列表
*/
@Override
public List<Long> selectRoleListByUserId(Long userId) {
return baseMapper.selectRoleListByUserId(userId);
}
/**
* 通过角色ID查询角色
*
* @param roleId 角色ID
* @return 角色对象信æ¯
*/
@Override
public SysRole selectRoleById(Long roleId) {
return getById(roleId);
}
/**
* æ ¡éªŒè§’è‰²å称是å¦å”¯ä¸€
*
* @param role 角色信æ¯
* @return 结果
*/
@Override
public String checkRoleNameUnique(SysRole role) {
Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
long count = count(new LambdaQueryWrapper<SysRole>()
.eq(SysRole::getRoleName, role.getRoleName())
.ne(SysRole::getRoleId, roleId));
if (count > 0) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* æ ¡éªŒè§’è‰²æƒé™æ˜¯å¦å”¯ä¸€
*
* @param role 角色信æ¯
* @return 结果
*/
@Override
public String checkRoleKeyUnique(SysRole role) {
Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
long count = count(new LambdaQueryWrapper<SysRole>()
.eq(SysRole::getRoleKey, role.getRoleKey())
.ne(SysRole::getRoleId, roleId));
if (count > 0) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* æ ¡éªŒè§’è‰²æ˜¯å¦å…许æ“作
*
* @param role 角色信æ¯
*/
@Override
public void checkRoleAllowed(SysRole role) {
if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) {
throw new ServiceException("ä¸å…许æ“作超级管ç†å‘˜è§’色");
}
}
/**
* æ ¡éªŒè§’è‰²æ˜¯å¦æœ‰æ•°æ®æƒé™
*
* @param roleId 角色id
*/
@Override
public void checkRoleDataScope(Long roleId) {
if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
SysRole role = new SysRole();
role.setRoleId(roleId);
List<SysRole> roles = SpringUtils.getAopProxy(this).selectRoleList(role);
if (StringUtils.isEmpty(roles)) {
throw new ServiceException("没有æƒé™è®¿é—®è§’色数æ®ï¼");
}
}
}
/**
* 通过角色ID查询角色使用数é‡
*
* @param roleId 角色ID
* @return 结果
*/
@Override
public long countUserRoleByRoleId(Long roleId) {
return userRoleMapper.selectCount(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getRoleId, roleId));
}
/**
* 新增ä¿å˜è§’色信æ¯
*
* @param role 角色信æ¯
* @return 结果
*/
@Override
@Transactional
public int insertRole(SysRole role) {
// 新增角色信æ¯
baseMapper.insert(role);
return insertRoleMenu(role);
}
/**
* 修改ä¿å˜è§’色信æ¯
*
* @param role 角色信æ¯
* @return 结果
*/
@Override
@Transactional
public int updateRole(SysRole role) {
// 修改角色信æ¯
baseMapper.updateById(role);
// åˆ é™¤è§’è‰²ä¸Žèœå•å…³è”
roleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, role.getRoleId()));
return insertRoleMenu(role);
}
/**
* 修改角色状æ€
*
* @param role 角色信æ¯
* @return 结果
*/
@Override
public int updateRoleStatus(SysRole role) {
return baseMapper.updateById(role);
}
/**
* ä¿®æ”¹æ•°æ®æƒé™ä¿¡æ¯
*
* @param role 角色信æ¯
* @return 结果
*/
@Override
@Transactional
public int authDataScope(SysRole role) {
// 修改角色信æ¯
baseMapper.updateById(role);
// åˆ é™¤è§’è‰²ä¸Žéƒ¨é—¨å…³è”
roleDeptMapper.delete(new LambdaQueryWrapper<SysRoleDept>().eq(SysRoleDept::getRoleId, role.getRoleId()));
// 新增角色和部门信æ¯ï¼ˆæ•°æ®æƒé™ï¼‰
return insertRoleDept(role);
}
/**
* 新增角色èœå•ä¿¡æ¯
*
* @param role 角色对象
*/
public int insertRoleMenu(SysRole role) {
int rows = 1;
// 新增用户与角色管ç†
List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();
for (Long menuId : role.getMenuIds()) {
SysRoleMenu rm = new SysRoleMenu();
rm.setRoleId(role.getRoleId());
rm.setMenuId(menuId);
list.add(rm);
}
if (list.size() > 0) {
rows = roleMenuMapper.insertAll(list);
}
return rows;
}
/**
* 新增角色部门信æ¯(æ•°æ®æƒé™)
*
* @param role 角色对象
*/
public int insertRoleDept(SysRole role) {
int rows = 1;
// æ–°å¢žè§’è‰²ä¸Žéƒ¨é—¨ï¼ˆæ•°æ®æƒé™ï¼‰ç®¡ç†
List<SysRoleDept> list = new ArrayList<SysRoleDept>();
for (Long deptId : role.getDeptIds()) {
SysRoleDept rd = new SysRoleDept();
rd.setRoleId(role.getRoleId());
rd.setDeptId(deptId);
list.add(rd);
}
if (list.size() > 0) {
rows = roleDeptMapper.insertAll(list);
}
return rows;
}
/**
* 通过角色IDåˆ é™¤è§’è‰²
*
* @param roleId 角色ID
* @return 结果
*/
@Override
@Transactional
public int deleteRoleById(Long roleId) {
// åˆ é™¤è§’è‰²ä¸Žèœå•å…³è”
roleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
// åˆ é™¤è§’è‰²ä¸Žéƒ¨é—¨å…³è”
roleDeptMapper.delete(new LambdaQueryWrapper<SysRoleDept>().eq(SysRoleDept::getRoleId, roleId));
return baseMapper.deleteById(roleId);
}
/**
* 批é‡åˆ 除角色信æ¯
*
* @param roleIds 需è¦åˆ 除的角色ID
* @return 结果
*/
@Override
@Transactional
public int deleteRoleByIds(Long[] roleIds) {
for (Long roleId : roleIds) {
checkRoleAllowed(new SysRole(roleId));
SysRole role = selectRoleById(roleId);
if (countUserRoleByRoleId(roleId) > 0) {
throw new ServiceException(String.format("%1$s已分é…,ä¸èƒ½åˆ 除", role.getRoleName()));
}
}
List<Long> ids = Arrays.asList(roleIds);
// åˆ é™¤è§’è‰²ä¸Žèœå•å…³è”
roleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids));
// åˆ é™¤è§’è‰²ä¸Žéƒ¨é—¨å…³è”
roleDeptMapper.delete(new LambdaQueryWrapper<SysRoleDept>().in(SysRoleDept::getRoleId, ids));
return baseMapper.deleteBatchIds(ids);
}
/**
* å–æ¶ˆæŽˆæƒç”¨æˆ·è§’色
*
* @param userRole 用户和角色关è”ä¿¡æ¯
* @return 结果
*/
@Override
public int deleteAuthUser(SysUserRole userRole) {
return userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getRoleId, userRole.getRoleId())
.eq(SysUserRole::getUserId, userRole.getUserId()));
}
/**
* 批é‡å–消授æƒç”¨æˆ·è§’色
*
* @param roleId 角色ID
* @param userIds 需è¦å–消授æƒçš„用户数æ®ID
* @return 结果
*/
@Override
public int deleteAuthUsers(Long roleId, Long[] userIds) {
return userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getRoleId, roleId)
.in(SysUserRole::getUserId, Arrays.asList(userIds)));
}
/**
* 批é‡é€‰æ‹©æŽˆæƒç”¨æˆ·è§’色
*
* @param roleId 角色ID
* @param userIds 需è¦åˆ 除的用户数æ®ID
* @return 结果
*/
@Override
public int insertAuthUsers(Long roleId, Long[] userIds) {
// 新增用户与角色管ç†
int rows = 1;
List<SysUserRole> list = new ArrayList<SysUserRole>();
for (Long userId : userIds) {
SysUserRole ur = new SysUserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0) {
rows = userRoleMapper.insertAll(list);
}
return rows;
}
}