Showing
1 changed file
with
185 additions
and
185 deletions
@@ -38,199 +38,199 @@ import java.util.stream.Collectors; | @@ -38,199 +38,199 @@ import java.util.stream.Collectors; | ||
38 | @RequiredArgsConstructor | 38 | @RequiredArgsConstructor |
39 | public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> implements RoleService { | 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 | } |