SysRoleMenuRelationService.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package cc.uncarbon.module.sys.service;
  2. import cc.uncarbon.module.sys.entity.SysRoleMenuRelationEntity;
  3. import cc.uncarbon.module.sys.mapper.SysRoleMenuRelationMapper;
  4. import cn.hutool.core.collection.CollUtil;
  5. import cn.hutool.core.lang.Assert;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import lombok.RequiredArgsConstructor;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.transaction.annotation.Transactional;
  12. import java.util.*;
  13. import java.util.stream.Collectors;
  14. /**
  15. * 后台角色-可见菜单关联
  16. */
  17. @RequiredArgsConstructor
  18. @Service
  19. @Slf4j
  20. public class SysRoleMenuRelationService {
  21. private final SysRoleMenuRelationMapper sysRoleMenuRelationMapper;
  22. /**
  23. * 根据角色Ids取菜单Ids
  24. * 因为多种角色容易出现交集,所以干脆用 Set
  25. *
  26. * @param roleIds 角色Ids
  27. * @return 菜单Ids
  28. */
  29. public Set<Long> listMenuIdsByRoleIds(Collection<Long> roleIds) throws IllegalArgumentException {
  30. Assert.notEmpty(roleIds);
  31. // aka * 16
  32. Set<Long> ret = new HashSet<>(roleIds.size() << 4);
  33. for (Long roleId : roleIds) {
  34. ret.addAll(
  35. sysRoleMenuRelationMapper.selectList(
  36. new QueryWrapper<SysRoleMenuRelationEntity>()
  37. .lambda()
  38. .select(SysRoleMenuRelationEntity::getMenuId)
  39. .eq(SysRoleMenuRelationEntity::getRoleId, roleId)
  40. ).stream().map(SysRoleMenuRelationEntity::getMenuId).collect(Collectors.toSet()));
  41. }
  42. return ret;
  43. }
  44. /**
  45. * 绑定角色ID与菜单ID关联关系,增量更新
  46. *
  47. * @param roleId 角色ID
  48. * @param menuIds 新菜单ID集合
  49. */
  50. @Transactional(rollbackFor = Exception.class)
  51. public void cleanAndBind(Long roleId, Collection<Long> menuIds) {
  52. LambdaQueryWrapper<SysRoleMenuRelationEntity> menuIdsQuery =
  53. new QueryWrapper<SysRoleMenuRelationEntity>()
  54. .lambda()
  55. .select(SysRoleMenuRelationEntity::getMenuId)
  56. .eq(SysRoleMenuRelationEntity::getRoleId, roleId);
  57. if (CollUtil.isEmpty(menuIds)) {
  58. // 清除绑定,直接删除所有关联关系就行
  59. sysRoleMenuRelationMapper.delete(menuIdsQuery);
  60. return;
  61. }
  62. // 先删除不再需要的关联关系
  63. sysRoleMenuRelationMapper.delete(
  64. new QueryWrapper<SysRoleMenuRelationEntity>()
  65. .lambda()
  66. .eq(SysRoleMenuRelationEntity::getRoleId, roleId)
  67. .notIn(SysRoleMenuRelationEntity::getMenuId, menuIds)
  68. );
  69. // 取出需要增量更新的部分
  70. Set<Long> existingMenuIds = sysRoleMenuRelationMapper.selectList(menuIdsQuery)
  71. .stream().map(SysRoleMenuRelationEntity::getMenuId)
  72. .collect(Collectors.toSet());
  73. menuIds.removeAll(existingMenuIds);
  74. if (CollUtil.isNotEmpty(menuIds)) {
  75. // 批量插入需要增量更新的部分
  76. List<SysRoleMenuRelationEntity> entityList = new ArrayList<>(menuIds.size());
  77. for (Long menuId : menuIds) {
  78. entityList.add(
  79. SysRoleMenuRelationEntity.builder()
  80. .roleId(roleId)
  81. .menuId(menuId)
  82. .build()
  83. );
  84. }
  85. entityList.forEach(sysRoleMenuRelationMapper::insert);
  86. }
  87. }
  88. }