Showing
1 changed file
with
185 additions
and
185 deletions
... | ... | @@ -38,199 +38,199 @@ import java.util.stream.Collectors; |
38 | 38 | @RequiredArgsConstructor |
39 | 39 | public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> implements RoleService { |
40 | 40 | |
41 | - private final MenuMapper menuMapper; | |
42 | - private final CacheUtils cacheUtils; | |
43 | - private final MenuService menuService; | |
44 | - private final TenantMenuMapper tenantMenuMapper; | |
45 | - private final TenantRoleMapper tenantRoleMapper; | |
46 | - private final UserRoleMapper userRoleMapper; | |
41 | + private final MenuMapper menuMapper; | |
42 | + private final CacheUtils cacheUtils; | |
43 | + private final MenuService menuService; | |
44 | + private final TenantMenuMapper tenantMenuMapper; | |
45 | + private final TenantRoleMapper tenantRoleMapper; | |
46 | + private final UserRoleMapper userRoleMapper; | |
47 | 47 | |
48 | - @Override | |
49 | - public YtPageData<RoleDTO> page(String tenantId, Map<String, Object> queryMap) { | |
50 | - IPage<Role> roleIPage = | |
51 | - baseMapper.selectPage( | |
52 | - getPage(queryMap, "create_time", false), | |
53 | - new QueryWrapper<Role>() | |
54 | - .lambda() | |
55 | - .eq(queryMap.get("status") != null, Role::isEnabled, queryMap.get("status")) | |
56 | - .eq(queryMap.get("roleType") != null, Role::getRoleType, queryMap.get("roleType")) | |
57 | - .ne(queryMap.get("roleType") == null, Role::getRoleType, RoleEnum.TENANT_ADMIN.name()) | |
58 | - .eq(Role::getTenantId, tenantId) | |
59 | - .like( | |
60 | - queryMap.get("roleName") != null, | |
61 | - Role::getName, | |
62 | - String.valueOf(queryMap.get("roleName")))); | |
63 | - return getPageData(roleIPage, RoleDTO.class); | |
64 | - } | |
65 | - | |
66 | - @Override | |
67 | - @Transactional | |
68 | - public boolean deleteRole(String[] roleIds, String tenantId) { | |
69 | - Set<String> ids = Set.of(roleIds); | |
70 | - int notTenantMenuCount = | |
71 | - baseMapper.selectCount( | |
72 | - new QueryWrapper<Role>().lambda().ne(Role::getTenantId, tenantId).in(Role::getId, ids)); | |
73 | - if (notTenantMenuCount > 0) { | |
74 | - throw new AccessDeniedException("cannot delete role that not create by you"); | |
75 | - } | |
76 | - // 判断该角色下面是否有用户 | |
77 | - Set<String> userIds = baseMapper.checkRoleUserMappingByRoleIds(ids); | |
78 | - if (null != userIds && userIds.size() > 0) { | |
79 | - throw new YtDataValidationException(ErrorMessage.ROLE_IN_USE.getMessage()); | |
48 | + @Override | |
49 | + public YtPageData<RoleDTO> page(String tenantId, Map<String, Object> queryMap) { | |
50 | + IPage<Role> roleIPage = | |
51 | + baseMapper.selectPage( | |
52 | + getPage(queryMap, "create_time", false), | |
53 | + new QueryWrapper<Role>() | |
54 | + .lambda() | |
55 | + .eq(queryMap.get("status") != null, Role::isEnabled, queryMap.get("status")) | |
56 | + .eq(queryMap.get("roleType") != null, Role::getRoleType, queryMap.get("roleType")) | |
57 | + .ne(queryMap.get("roleType") == null, Role::getRoleType, RoleEnum.TENANT_ADMIN.name()) | |
58 | + .eq(Role::getTenantId, tenantId) | |
59 | + .like( | |
60 | + queryMap.get("roleName") != null, | |
61 | + Role::getName, | |
62 | + String.valueOf(queryMap.get("roleName")))); | |
63 | + return getPageData(roleIPage, RoleDTO.class); | |
80 | 64 | } |
81 | - // delete sys_role_menu mapping | |
82 | - baseMapper.deleteRoleMenuMappingByRoleIds(ids); | |
83 | - // delete role | |
84 | - baseMapper.deleteBatchIds(ids); | |
85 | - // FIXME 频繁删除role造成缓存效果不大 | |
86 | - cacheUtils.invalidateCacheName(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY); | |
87 | - return true; | |
88 | - } | |
89 | 65 | |
90 | - @Override | |
91 | - public Set<String> getPermissions( | |
92 | - boolean isSysadmin, boolean isTenantAdmin, String tenantId, String useerId) { | |
93 | - Set<String> permissions = Sets.newHashSet(); | |
94 | - Set<String> allPermission; | |
95 | - String cacheKey; | |
96 | - boolean cachePresent; | |
97 | - if (isSysadmin) { | |
98 | - cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + RoleEnum.SYS_ADMIN.name(); | |
99 | - Optional<Set<String>> optionalPermission = | |
100 | - cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); | |
101 | - cachePresent = optionalPermission.isPresent(); | |
102 | - allPermission = optionalPermission.orElseGet(menuMapper::getAllPermission); | |
103 | - } else if (isTenantAdmin) { | |
104 | - cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + tenantId; | |
105 | - Optional<Set<String>> optionalPermission = | |
106 | - cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); | |
107 | - cachePresent = optionalPermission.isPresent(); | |
108 | - allPermission = | |
109 | - optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByTenantId(tenantId)); | |
110 | - } else { | |
111 | - cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + useerId; | |
112 | - Optional<Set<String>> optionalPermission = | |
113 | - cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); | |
114 | - cachePresent = optionalPermission.isPresent(); | |
115 | - allPermission = | |
116 | - optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByUserId(useerId)); | |
66 | + @Override | |
67 | + @Transactional | |
68 | + public boolean deleteRole(String[] roleIds, String tenantId) { | |
69 | + Set<String> ids = Set.of(roleIds); | |
70 | + int notTenantMenuCount = | |
71 | + baseMapper.selectCount( | |
72 | + new QueryWrapper<Role>().lambda().ne(Role::getTenantId, tenantId).in(Role::getId, ids)); | |
73 | + if (notTenantMenuCount > 0) { | |
74 | + throw new AccessDeniedException("cannot delete role that not create by you"); | |
75 | + } | |
76 | + // 判断该角色下面是否有用户 | |
77 | + Set<String> userIds = baseMapper.checkRoleUserMappingByRoleIds(ids); | |
78 | + if (null != userIds && userIds.size() > 0) { | |
79 | + throw new YtDataValidationException(ErrorMessage.ROLE_IN_USE.getMessage()); | |
80 | + } | |
81 | + // delete sys_role_menu mapping | |
82 | + baseMapper.deleteRoleMenuMappingByRoleIds(ids); | |
83 | + // delete role | |
84 | + baseMapper.deleteBatchIds(ids); | |
85 | + // FIXME 频繁删除role造成缓存效果不大 | |
86 | + cacheUtils.invalidateCacheName(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY); | |
87 | + return true; | |
117 | 88 | } |
118 | - if (cachePresent) { | |
119 | - return allPermission; | |
120 | - } else { | |
121 | - allPermission.forEach( | |
122 | - permission -> permissions.addAll(Sets.newHashSet(permission.split(",")))); | |
123 | - cacheUtils.put(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey, permissions); | |
124 | - } | |
125 | - return permissions; | |
126 | - } | |
127 | - | |
128 | - @Override | |
129 | - @Transactional | |
130 | - public void updateRoleStatus(String roleId, int status, boolean isSysadmin, String tenantId) { | |
131 | - Optional.ofNullable( | |
132 | - baseMapper.selectOne( | |
133 | - new QueryWrapper<Role>() | |
134 | - .lambda() | |
135 | - .eq(Role::getId, roleId) | |
136 | - .eq(!isSysadmin, Role::getTenantId, tenantId))) | |
137 | - .ifPresent( | |
138 | - role -> { | |
139 | - role.setEnabled(status == 1); | |
140 | - baseMapper.updateById(role); | |
141 | - }); | |
142 | - } | |
143 | 89 | |
144 | - @Override | |
145 | - @Transactional | |
146 | - public RoleDTO saveOrUpdateRoleInfoWithMenu( | |
147 | - RoleReqDTO roleReqDTO, boolean isSysadmin, boolean isPlatformAdmin, String tenantId) { | |
148 | - Role role; | |
149 | - // 默认普通管理员角色,即租户管理员添加的角色 | |
150 | - var roleType = RoleEnum.CUSTOMER_USER.name(); | |
151 | - if (null != roleReqDTO.getRoleType()) { | |
152 | - roleType = roleReqDTO.getRoleType().name(); | |
153 | - } else { | |
154 | - if (isSysadmin || isPlatformAdmin) { | |
155 | - roleType = RoleEnum.PLATFORM_ADMIN.name(); | |
156 | - } | |
90 | + @Override | |
91 | + public Set<String> getPermissions( | |
92 | + boolean isSysadmin, boolean isTenantAdmin, String tenantId, String useerId) { | |
93 | + Set<String> permissions = Sets.newHashSet(); | |
94 | + Set<String> allPermission; | |
95 | + String cacheKey; | |
96 | + boolean cachePresent; | |
97 | + if (isSysadmin) { | |
98 | + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + RoleEnum.SYS_ADMIN.name(); | |
99 | + Optional<Set<String>> optionalPermission = | |
100 | + cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); | |
101 | + cachePresent = optionalPermission.isPresent(); | |
102 | + allPermission = optionalPermission.orElseGet(menuMapper::getAllPermission); | |
103 | + } else if (isTenantAdmin) { | |
104 | + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + tenantId; | |
105 | + Optional<Set<String>> optionalPermission = | |
106 | + cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); | |
107 | + cachePresent = optionalPermission.isPresent(); | |
108 | + allPermission = | |
109 | + optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByTenantId(tenantId)); | |
110 | + } else { | |
111 | + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + useerId; | |
112 | + Optional<Set<String>> optionalPermission = | |
113 | + cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); | |
114 | + cachePresent = optionalPermission.isPresent(); | |
115 | + allPermission = | |
116 | + optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByUserId(useerId)); | |
117 | + } | |
118 | + if (cachePresent) { | |
119 | + return allPermission; | |
120 | + } else { | |
121 | + allPermission.forEach( | |
122 | + permission -> permissions.addAll(Sets.newHashSet(permission.split(",")))); | |
123 | + cacheUtils.put(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey, permissions); | |
124 | + } | |
125 | + return permissions; | |
157 | 126 | } |
158 | - boolean update = StringUtils.isNotBlank(roleReqDTO.getId()); | |
159 | - if (update) { | |
160 | - // do update | |
161 | - role = | |
162 | - baseMapper.selectOne( | |
163 | - new QueryWrapper<Role>() | |
164 | - .lambda() | |
165 | - .eq(Role::getId, roleReqDTO.getId()) | |
166 | - .eq(!isSysadmin, Role::getTenantId, tenantId)); | |
167 | - if (role == null) { | |
168 | - return null; | |
169 | - } else { | |
170 | - role.setRemark(roleReqDTO.getRemark()); | |
171 | - role.setName(roleReqDTO.getName()); | |
172 | - role.setEnabled(roleReqDTO.getStatus() == 1); | |
173 | - baseMapper.updateById(role); | |
174 | - } | |
175 | - } else { | |
176 | - // do save | |
177 | - role = new Role(); | |
178 | - role.setRoleType(roleType); | |
179 | - role.setCode(RandomStringUtils.randomAlphabetic(10)); | |
180 | - role.setRemark(roleReqDTO.getRemark()); | |
181 | - role.setName(roleReqDTO.getName()); | |
182 | - role.setEnabled(roleReqDTO.getStatus() == 1); | |
183 | - role.setTenantId(tenantId); | |
184 | - baseMapper.insert(role); | |
185 | - } | |
186 | - // do update or save menu associate with this roleId | |
187 | - menuService.assignMenuToRole( | |
188 | - roleReqDTO.getMenu().toArray(new String[roleReqDTO.getMenu().size()]), role.getId()); | |
189 | - // 如果是租户管理员角色并且是更新,则需要更新租户菜单表 | |
190 | - if (role.getRoleType().equals(RoleEnum.TENANT_ADMIN.name()) && update) { | |
191 | - List<String> menus = roleReqDTO.getMenu(); | |
192 | - // 先删除以前的租户菜单,再更新新的租户菜单 | |
193 | - // 1、查询这个角色有几个租户用户 | |
194 | - // 2、删除并更新对应租户的信息 | |
195 | - List<TenantRole> tenantRoles = | |
196 | - tenantRoleMapper.selectList( | |
197 | - new QueryWrapper<TenantRole>().lambda().eq(TenantRole::getRoleId, role.getId())); | |
198 | - tenantRoles.forEach( | |
199 | - tenantRole -> { | |
200 | - String updateTenantId = tenantRole.getTenantId(); | |
201 | - tenantMenuMapper.delete( | |
202 | - new QueryWrapper<TenantMenu>() | |
203 | - .lambda() | |
204 | - .eq(TenantMenu::getTenantId, updateTenantId)); | |
205 | - menus.forEach( | |
206 | - menu -> { | |
207 | - TenantMenu tenantMenu = new TenantMenu(); | |
208 | - tenantMenu.setMenuId(menu); | |
209 | - tenantMenu.setTenantId(updateTenantId); | |
210 | - tenantMenuMapper.insert(tenantMenu); | |
211 | - }); | |
212 | - }); | |
127 | + | |
128 | + @Override | |
129 | + @Transactional | |
130 | + public void updateRoleStatus(String roleId, int status, boolean isSysadmin, String tenantId) { | |
131 | + Optional.ofNullable( | |
132 | + baseMapper.selectOne( | |
133 | + new QueryWrapper<Role>() | |
134 | + .lambda() | |
135 | + .eq(Role::getId, roleId) | |
136 | + .eq(!isSysadmin, Role::getTenantId, tenantId))) | |
137 | + .ifPresent( | |
138 | + role -> { | |
139 | + role.setEnabled(status == 1); | |
140 | + baseMapper.updateById(role); | |
141 | + }); | |
213 | 142 | } |
214 | - cacheUtils.invalidateCacheName(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY); | |
215 | - return role.getDTO(RoleDTO.class); | |
216 | - } | |
217 | 143 | |
218 | - @Override | |
219 | - public List<RoleDTO> findRoleInfo( | |
220 | - boolean isTenantAdmin, String tenantId, String userId, RoleDTO roleDTO) { | |
221 | - if (StringUtils.isEmpty(roleDTO.getTenantId())) { | |
222 | - roleDTO.setTenantId(tenantId); | |
144 | + @Override | |
145 | + @Transactional | |
146 | + public RoleDTO saveOrUpdateRoleInfoWithMenu( | |
147 | + RoleReqDTO roleReqDTO, boolean isSysadmin, boolean isPlatformAdmin, String tenantId) { | |
148 | + Role role; | |
149 | + // 默认普通管理员角色,即租户管理员添加的角色 | |
150 | + var roleType = RoleEnum.CUSTOMER_USER.name(); | |
151 | + if (null != roleReqDTO.getRoleType()) { | |
152 | + roleType = roleReqDTO.getRoleType().name(); | |
153 | + } else { | |
154 | + if (isSysadmin || isPlatformAdmin) { | |
155 | + roleType = RoleEnum.PLATFORM_ADMIN.name(); | |
156 | + } | |
157 | + } | |
158 | + boolean update = StringUtils.isNotBlank(roleReqDTO.getId()); | |
159 | + if (update) { | |
160 | + // do update | |
161 | + role = | |
162 | + baseMapper.selectOne( | |
163 | + new QueryWrapper<Role>() | |
164 | + .lambda() | |
165 | + .eq(Role::getId, roleReqDTO.getId()) | |
166 | + .eq(!isSysadmin, Role::getTenantId, tenantId)); | |
167 | + if (role == null) { | |
168 | + return null; | |
169 | + } else { | |
170 | + role.setRemark(roleReqDTO.getRemark()); | |
171 | + role.setName(roleReqDTO.getName()); | |
172 | + role.setEnabled(roleReqDTO.getStatus() == 1); | |
173 | + baseMapper.updateById(role); | |
174 | + } | |
175 | + } else { | |
176 | + // do save | |
177 | + role = new Role(); | |
178 | + role.setRoleType(roleType); | |
179 | + role.setCode(RandomStringUtils.randomAlphabetic(10)); | |
180 | + role.setRemark(roleReqDTO.getRemark()); | |
181 | + role.setName(roleReqDTO.getName()); | |
182 | + role.setEnabled(roleReqDTO.getStatus() == 1); | |
183 | + role.setTenantId(tenantId); | |
184 | + baseMapper.insert(role); | |
185 | + } | |
186 | + // do update or save menu associate with this roleId | |
187 | + menuService.assignMenuToRole( | |
188 | + roleReqDTO.getMenu().toArray(new String[roleReqDTO.getMenu().size()]), role.getId()); | |
189 | + // 如果是租户管理员角色并且是更新,则需要更新租户菜单表 | |
190 | + if (role.getRoleType().equals(RoleEnum.TENANT_ADMIN.name()) && update) { | |
191 | + List<String> menus = roleReqDTO.getMenu(); | |
192 | + // 先删除以前的租户菜单,再更新新的租户菜单 | |
193 | + // 1、查询这个角色有几个租户用户 | |
194 | + // 2、删除并更新对应租户的信息 | |
195 | + List<TenantRole> tenantRoles = | |
196 | + tenantRoleMapper.selectList( | |
197 | + new QueryWrapper<TenantRole>().lambda().eq(TenantRole::getRoleId, role.getId())); | |
198 | + tenantRoles.forEach( | |
199 | + tenantRole -> { | |
200 | + String updateTenantId = tenantRole.getTenantId(); | |
201 | + tenantMenuMapper.delete( | |
202 | + new QueryWrapper<TenantMenu>() | |
203 | + .lambda() | |
204 | + .eq(TenantMenu::getTenantId, updateTenantId)); | |
205 | + menus.forEach( | |
206 | + menu -> { | |
207 | + TenantMenu tenantMenu = new TenantMenu(); | |
208 | + tenantMenu.setMenuId(menu); | |
209 | + tenantMenu.setTenantId(updateTenantId); | |
210 | + tenantMenuMapper.insert(tenantMenu); | |
211 | + }); | |
212 | + }); | |
213 | + } | |
214 | + cacheUtils.invalidateCacheName(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY); | |
215 | + return role.getDTO(RoleDTO.class); | |
223 | 216 | } |
224 | - if (isTenantAdmin) { | |
225 | - // 租户管理员既要查询自己拥有的角色,也要查询自己创建的角色 | |
226 | - List<String> roleIds = | |
227 | - userRoleMapper | |
228 | - .selectList(new QueryWrapper<UserRole>().lambda().eq(UserRole::getUserId, userId)) | |
229 | - .stream() | |
230 | - .map(UserRole::getRoleId) | |
231 | - .collect(Collectors.toList()); | |
232 | - roleDTO.setRoleIds(roleIds.toArray(new String[roleIds.size()])); | |
217 | + | |
218 | + @Override | |
219 | + public List<RoleDTO> findRoleInfo( | |
220 | + boolean isTenantAdmin, String tenantId, String userId, RoleDTO roleDTO) { | |
221 | + if (StringUtils.isEmpty(roleDTO.getTenantId())) { | |
222 | + roleDTO.setTenantId(tenantId); | |
223 | + } | |
224 | + if (isTenantAdmin) { | |
225 | + // 租户管理员既要查询自己拥有的角色,也要查询自己创建的角色 | |
226 | + List<String> roleIds = | |
227 | + userRoleMapper | |
228 | + .selectList(new QueryWrapper<UserRole>().lambda().eq(UserRole::getUserId, userId)) | |
229 | + .stream() | |
230 | + .map(UserRole::getRoleId) | |
231 | + .collect(Collectors.toList()); | |
232 | + roleDTO.setRoleIds(roleIds.toArray(new String[roleIds.size()])); | |
233 | + } | |
234 | + return baseMapper.findRoleInfo(roleDTO); | |
233 | 235 | } |
234 | - return baseMapper.findRoleInfo(roleDTO); | |
235 | - } | |
236 | 236 | } | ... | ... |