| package com.ruoyi.system.service.impl; | 
|   | 
| import java.util.*; | 
| import java.util.stream.Collectors; | 
|   | 
| import com.ruoyi.common.basic.PageInfo; | 
| import com.ruoyi.common.core.domain.entity.SysMenu; | 
| import com.ruoyi.system.dto.SysRoleDTO; | 
| import com.ruoyi.system.mapper.*; | 
| import com.ruoyi.system.query.SysRoleQuery; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
| 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.exception.ServiceException; | 
| 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.service.ISysRoleService; | 
| import org.springframework.util.CollectionUtils; | 
|   | 
| /** | 
|  * 角色 业务层处理 | 
|  *  | 
|  * @author ruoyi | 
|  */ | 
| @Service | 
| public class SysRoleServiceImpl implements ISysRoleService | 
| { | 
|     @Autowired | 
|     private SysRoleMapper roleMapper; | 
|   | 
|     @Autowired | 
|     private SysRoleMenuMapper roleMenuMapper; | 
|   | 
|     @Autowired | 
|     private SysUserRoleMapper userRoleMapper; | 
|   | 
|     @Autowired | 
|     private SysRoleDeptMapper roleDeptMapper; | 
|     @Autowired | 
|     private SysMenuMapper menuMapper; | 
|   | 
|     /** | 
|      * 根据条件分页查询角色数据 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 角色数据集合信息 | 
|      */ | 
|     @Override | 
|     public List<SysRole> selectRoleList(SysRole role) | 
|     { | 
|         return roleMapper.selectRoleList(role); | 
|     } | 
|   | 
|     /** | 
|      * 根据用户ID查询角色 | 
|      *  | 
|      * @param userId 用户ID | 
|      * @return 角色列表 | 
|      */ | 
|     @Override | 
|     public List<SysRole> selectRolesByUserId(Long userId) | 
|     { | 
|         List<SysRole> userRoles = roleMapper.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 = roleMapper.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 this.selectRoleList(new SysRole()); | 
|     } | 
|   | 
|     /** | 
|      * 根据用户ID获取角色选择框列表 | 
|      *  | 
|      * @param userId 用户ID | 
|      * @return 选中角色ID列表 | 
|      */ | 
|     @Override | 
|     public List<Long> selectRoleListByUserId(Long userId) | 
|     { | 
|         return roleMapper.selectRoleListByUserId(userId); | 
|     } | 
|   | 
|     /** | 
|      * 通过角色ID查询角色 | 
|      *  | 
|      * @param roleId 角色ID | 
|      * @return 角色对象信息 | 
|      */ | 
|     @Override | 
|     public SysRole selectRoleById(Long roleId) | 
|     { | 
|         return roleMapper.selectRoleById(roleId); | 
|     } | 
|   | 
|     /** | 
|      * 校验角色名称是否唯一 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     public boolean checkRoleNameUnique(SysRole role) | 
|     { | 
|         Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); | 
|         SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); | 
|         if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) | 
|         { | 
|             return UserConstants.NOT_UNIQUE; | 
|         } | 
|         return UserConstants.UNIQUE; | 
|     } | 
|   | 
|     /** | 
|      * 校验角色权限是否唯一 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     public boolean checkRoleKeyUnique(SysRole role) | 
|     { | 
|         Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); | 
|         SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); | 
|         if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) | 
|         { | 
|             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 int countUserRoleByRoleId(Long roleId) | 
|     { | 
|         return userRoleMapper.countUserRoleByRoleId(roleId); | 
|     } | 
|   | 
|     /** | 
|      * 新增保存角色信息 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public int insertRole(SysRole role) | 
|     { | 
|         // 新增角色信息 | 
|         roleMapper.insertRole(role); | 
|         return insertRoleMenu(role); | 
|     } | 
|   | 
|     /** | 
|      * 修改保存角色信息 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public int updateRole(SysRole role) | 
|     { | 
|         // 修改角色信息 | 
|         roleMapper.updateRole(role); | 
|         // 删除角色与菜单关联 | 
|         roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); | 
|         return insertRoleMenu(role); | 
|     } | 
|   | 
|     /** | 
|      * 修改保存角色信息 | 
|      * | 
|      * @param dto 角色信息 | 
|      * @return 结果 | 
|      */ | 
| //    @Override | 
| //    @Transactional | 
| //    public int editRole(SysRoleDTO dto) | 
| //    { | 
| //        // 修改角色信息 | 
| //        SysRole sysRole = new SysRole(); | 
| //        sysRole.setRoleName(dto.getRoleName()); | 
| //        sysRole.setPostType(dto.getPostType()); | 
| //        roleMapper.updateRole(sysRole); | 
| //        // 删除角色与菜单关联 | 
| //        roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId()); | 
| // | 
| //        // 添加角色权限中间表 | 
| //        List<Long> menuIds = dto.getMenuIds(); | 
| //        List<SysRoleMenu> sysRoleMenus = new ArrayList<>(); | 
| //        for (Long menuId : menuIds) { | 
| //            SysRoleMenu sysRoleMenu = new SysRoleMenu(); | 
| //            sysRoleMenu.setRoleId(dto.getRoleId()); | 
| //            sysRoleMenu.setMenuId(menuId); | 
| //            sysRoleMenus.add(sysRoleMenu); | 
| //        } | 
| // | 
| //        return roleMenuMapper.batchRoleMenu(sysRoleMenus); | 
| //    } | 
|   | 
|     /** | 
|      * 修改角色状态 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     public int updateRoleStatus(SysRole role) | 
|     { | 
|         return roleMapper.updateRole(role); | 
|     } | 
|   | 
|     /** | 
|      * 修改数据权限信息 | 
|      *  | 
|      * @param role 角色信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public int authDataScope(SysRole role) | 
|     { | 
|         // 修改角色信息 | 
|         roleMapper.updateRole(role); | 
|         // 删除角色与部门关联 | 
|         roleDeptMapper.deleteRoleDeptByRoleId(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.batchRoleMenu(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.batchRoleDept(list); | 
|         } | 
|         return rows; | 
|     } | 
|   | 
|     /** | 
|      * 通过角色ID删除角色 | 
|      *  | 
|      * @param roleId 角色ID | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public int deleteRoleById(Long roleId) | 
|     { | 
|         // 删除角色与菜单关联 | 
|         roleMenuMapper.deleteRoleMenuByRoleId(roleId); | 
|         // 删除角色与部门关联 | 
|         roleDeptMapper.deleteRoleDeptByRoleId(roleId); | 
|         return roleMapper.deleteRoleById(roleId); | 
|     } | 
|   | 
|     /** | 
|      * 批量删除角色信息 | 
|      *  | 
|      * @param roleIds 需要删除的角色ID | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public int deleteRoleByIds(List<Long> roleIds) | 
|     { | 
|         for (Long roleId : roleIds) | 
|         { | 
|             SysRole role = selectRoleById(roleId); | 
|             if (countUserRoleByRoleId(roleId) > 0) | 
|             { | 
|                 throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); | 
|             } | 
|         } | 
|         // 删除角色与菜单关联 | 
|         roleMenuMapper.deleteRoleMenu(roleIds); | 
|         return roleMapper.deleteRoleByIds(roleIds); | 
|     } | 
|   | 
|     /** | 
|      * 取消授权用户角色 | 
|      *  | 
|      * @param userRole 用户和角色关联信息 | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     public int deleteAuthUser(SysUserRole userRole) | 
|     { | 
|         return userRoleMapper.deleteUserRoleInfo(userRole); | 
|     } | 
|   | 
|     /** | 
|      * 批量取消授权用户角色 | 
|      *  | 
|      * @param roleId 角色ID | 
|      * @param userIds 需要取消授权的用户数据ID | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     public int deleteAuthUsers(Long roleId, Long[] userIds) | 
|     { | 
|         return userRoleMapper.deleteUserRoleInfos(roleId, userIds); | 
|     } | 
|   | 
|     /** | 
|      * 批量选择授权用户角色 | 
|      *  | 
|      * @param roleId 角色ID | 
|      * @param userIds 需要授权的用户数据ID | 
|      * @return 结果 | 
|      */ | 
|     @Override | 
|     public int insertAuthUsers(Long roleId, Long[] userIds) | 
|     { | 
|         // 新增用户与角色管理 | 
|         List<SysUserRole> list = new ArrayList<SysUserRole>(); | 
|         for (Long userId : userIds) | 
|         { | 
|             SysUserRole ur = new SysUserRole(); | 
|             ur.setUserId(userId); | 
|             ur.setRoleId(roleId); | 
|             list.add(ur); | 
|         } | 
|         return userRoleMapper.batchUserRole(list); | 
|     } | 
|   | 
|     @Override | 
|     public int selectCountByRoleName(String roleName) { | 
|         return roleMapper.selectCountByRoleName(roleName); | 
|     } | 
|   | 
| //    @Override | 
| //    public void saveRole(SysRoleDTO dto) { | 
| // | 
| //        // 添加角色 | 
| //        SysRole sysRole = new SysRole(); | 
| //        sysRole.setRoleName(dto.getRoleName()); | 
| //        sysRole.setPostType(dto.getPostType()); | 
| //        roleMapper.insertRole(sysRole); | 
| // | 
| //        // 添加角色权限中间表 | 
| //        List<Long> menuIds = dto.getMenuIds(); | 
| //        List<SysRoleMenu> sysRoleMenus = new ArrayList<>(); | 
| //        for (Long menuId : menuIds) { | 
| //            SysRoleMenu sysRoleMenu = new SysRoleMenu(); | 
| //            sysRoleMenu.setRoleId(sysRole.getRoleId()); | 
| //            sysRoleMenu.setMenuId(menuId); | 
| //            sysRoleMenus.add(sysRoleMenu); | 
| //        } | 
| //        roleMenuMapper.batchRoleMenu(sysRoleMenus); | 
| //    } | 
|   | 
|     @Override | 
|     public Boolean isExit(Long id, String roleName) { | 
|         int count = this.selectCountByRoleName(roleName); | 
|         if (StringUtils.isNotNull(id)) { | 
|             // 修改 | 
|             SysRole sysRole = roleMapper.selectRoleById(id); | 
|             return Objects.nonNull(sysRole) && !sysRole.getRoleName().equals(roleName) && count > 0; | 
|         } else { | 
|             // 新增 | 
|             return count > 0; | 
|         } | 
|     } | 
|   | 
| //    @Override | 
| //    public List<SysRole> selectList(SysRoleQuery query) { | 
| //        return roleMapper.selectList(query); | 
| //    } | 
|   | 
|     @Override | 
|     public int selectCount(Integer status) { | 
|         return roleMapper.selectCount(status); | 
|     } | 
|   | 
|     @Override | 
|     public void updateStatus(SysRole role) { | 
|         roleMapper.updateStatus(role); | 
|     } | 
|   | 
|     @Override | 
|     public List<SysRole> selectListByDelFlag(Integer delFlag) { | 
|         return roleMapper.selectListByDelFlag(delFlag); | 
|     } | 
|   | 
|     @Override | 
|     public SysRole selectRoleByUserId(Long userId) { | 
|         return roleMapper.selectRoleByUserId(userId); | 
|     } | 
|   | 
|     @Override | 
|     public List<SysMenu> getMenuLevelList(List<Long> menusId) { | 
|         //获取当前的权限菜单 | 
|         List<SysMenu> all = menuMapper.getAllInIds(menusId); | 
|         // 第三级 | 
|         List<SysMenu> s3 = all.stream().filter(e -> e.getMenuType().equals("F")).collect(Collectors.toList()); | 
|         // 第二级 | 
|         List<SysMenu> s2 = all.stream().filter(e -> e.getMenuType().equals("C")).collect(Collectors.toList()); | 
|         // 第一级 | 
|         List<SysMenu> s1 = all.stream().filter(e -> e.getMenuType().equals("M")).collect(Collectors.toList()); | 
|   | 
|         for (SysMenu menu : s2) { | 
|             List<SysMenu> collect = s3.stream().filter(e -> e.getParentId().equals(menu.getMenuId())).collect(Collectors.toList()); | 
|             menu.setChildren(collect); | 
|         } | 
|         for (SysMenu menu : s1) { | 
|             List<SysMenu> collect = s2.stream().filter(e -> e.getParentId().equals(menu.getMenuId())).collect(Collectors.toList()); | 
|             menu.setChildren(collect); | 
|         } | 
|         return s1; | 
|     } | 
|   | 
|     @Override | 
|     public List<SysMenu> roleInfoFromUserId(Long userId) { | 
|         SysRole sysRole = roleMapper.selectRoleByUserId(userId); | 
|         // 获取当前角色的菜单列表 | 
|         List<SysMenu> menus = menuMapper.selectListByRoleId(sysRole.getRoleId()); | 
|         if(menus.size()==0){ | 
|             return new ArrayList<>(); | 
|         } | 
|         List<Long> menusId = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList()); | 
|         // 获取当前的权限菜单(有层级) | 
|         return this.getMenuLevelList(menusId); | 
|     } | 
|   | 
|     @Override | 
|     public String selectByUserId(Long user_id) { | 
|         return roleMapper.selectByUserId(user_id); | 
|     } | 
|   | 
|     @Override | 
|     public void saveRole(SysRoleDTO dto) { | 
|         // 添加角色 | 
|         SysRole sysRole = new SysRole(); | 
|         sysRole.setRoleName(dto.getRoleName()); | 
|         sysRole.setRoleType(dto.getRoleType()); | 
|         sysRole.setRemark(dto.getRemark()); | 
|         roleMapper.insertRole(sysRole); | 
|   | 
|         // 添加角色权限中间表 | 
|         List<Long> menuIds = dto.getMenuIds(); | 
|         List<SysRoleMenu> sysRoleMenus = new ArrayList<>(); | 
|         for (Long menuId : menuIds) { | 
|             SysRoleMenu sysRoleMenu = new SysRoleMenu(); | 
|             sysRoleMenu.setRoleId(sysRole.getRoleId()); | 
|             sysRoleMenu.setMenuId(menuId); | 
|             sysRoleMenus.add(sysRoleMenu); | 
|         } | 
|         roleMenuMapper.batchRoleMenu(sysRoleMenus); | 
|     } | 
|   | 
|     @Override | 
|     public PageInfo<SysRole> selectPageList(SysRoleQuery query) { | 
|         PageInfo<SysRole> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); | 
|         List<SysRole> list = roleMapper.selectPageList(query,pageInfo); | 
|         pageInfo.setRecords(list); | 
|         return pageInfo; | 
|     } | 
|   | 
|     @Override | 
|     public int editRole(SysRoleDTO dto) { | 
|         // 修改角色信息 | 
|         SysRole sysRole = new SysRole(); | 
|         sysRole.setRoleId(dto.getRoleId()); | 
|         sysRole.setRoleName(dto.getRoleName()); | 
|         sysRole.setRoleType(dto.getRoleType()); | 
|         sysRole.setRemark(dto.getRemark()); | 
|         roleMapper.updateRole(sysRole); | 
|         // 删除角色与菜单关联 | 
|         roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId()); | 
|   | 
|         // 添加角色权限中间表 | 
|         List<Long> menuIds = dto.getMenuIds(); | 
|         List<SysRoleMenu> sysRoleMenus = new ArrayList<>(); | 
|         for (Long menuId : menuIds) { | 
|             SysRoleMenu sysRoleMenu = new SysRoleMenu(); | 
|             sysRoleMenu.setRoleId(dto.getRoleId()); | 
|             sysRoleMenu.setMenuId(menuId); | 
|             sysRoleMenus.add(sysRoleMenu); | 
|         } | 
|   | 
|         return roleMenuMapper.batchRoleMenu(sysRoleMenus); | 
|     } | 
|   | 
|     @Override | 
|     public List<SysRole> selectRoleByUserIds(List<String> roleIds) { | 
|         return roleMapper.selectRoleByUserIds(roleIds); | 
|     } | 
| } |