diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysUserRoleServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysUserRoleServiceApi.java index 30b56a40e..70c85b46b 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysUserRoleServiceApi.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysUserRoleServiceApi.java @@ -12,13 +12,21 @@ import java.util.Set; public interface SysUserRoleServiceApi { /** - * 获取用户的角色id列表 + * 获取用户的所有角色id列表 * * @author fengshuonan * @since 2023/6/12 11:29 */ List getUserRoleIdList(Long userId); + /** + * 获取用户的当前所在公司的所有角色id列表 + * + * @author fengshuonan + * @since 2024-01-17 16:24 + */ + List getUserRoleIdListCurrentCompany(Long userId, Long companyId); + /** * 根据角色id找到角色对应的用户id集合 * diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleMemoryCache.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleMemoryCache.java index 61d2112e6..ca571d813 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleMemoryCache.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleMemoryCache.java @@ -3,6 +3,7 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole; import cn.hutool.cache.impl.TimedCache; import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator; import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants; +import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import java.util.List; @@ -12,9 +13,9 @@ import java.util.List; * @author fengshuonan * @since 2023/7/14 22:00 */ -public class UserRoleMemoryCache extends AbstractMemoryCacheOperator> { +public class UserRoleMemoryCache extends AbstractMemoryCacheOperator> { - public UserRoleMemoryCache(TimedCache> timedCache) { + public UserRoleMemoryCache(TimedCache> timedCache) { super(timedCache); } diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleRedisCache.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleRedisCache.java index 47e528fe6..7bcfe5682 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleRedisCache.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/UserRoleRedisCache.java @@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole; import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator; import cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants; +import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import org.springframework.data.redis.core.RedisTemplate; import java.util.List; @@ -12,9 +13,9 @@ import java.util.List; * @author fengshuonan * @since 2023/7/14 21:58 */ -public class UserRoleRedisCache extends AbstractRedisCacheOperator> { +public class UserRoleRedisCache extends AbstractRedisCacheOperator> { - public UserRoleRedisCache(RedisTemplate> redisTemplate) { + public UserRoleRedisCache(RedisTemplate> redisTemplate) { super(redisTemplate); } diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/clear/UserRoleClearListener.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/clear/UserRoleClearListener.java index 8603afdc6..7ea8578bb 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/clear/UserRoleClearListener.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/cache/userrole/clear/UserRoleClearListener.java @@ -3,6 +3,7 @@ package cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole.clear; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener; +import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -20,7 +21,7 @@ import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants public class UserRoleClearListener { @Resource(name = "userRoleCache") - private CacheOperatorApi> userRoleCache; + private CacheOperatorApi> userRoleCache; /** * 监听更新用户角色 diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/entity/SysUserRole.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/entity/SysUserRole.java index 204f0b33e..270a8b7c1 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/entity/SysUserRole.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/entity/SysUserRole.java @@ -41,4 +41,18 @@ public class SysUserRole extends BaseEntity { @ChineseDescription("角色id") private Long roleId; + /** + * 角色类型:10-系统角色,20-公司角色 + */ + @TableField("role_type") + @ChineseDescription("角色类型:10-系统角色,20-公司角色") + private Integer roleType; + + /** + * 角色所属公司id + */ + @TableField(value = "role_company_id") + @ChineseDescription("角色所属公司id") + private Long roleCompanyId; + } diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java index ff5327f4c..8c9b40f18 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java @@ -40,8 +40,7 @@ import static cn.stylefeng.roses.kernel.sys.modular.user.constants.UserConstants * @date 2023/06/10 21:26 */ @Service -public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService, - RemoveUserCallbackApi, RemoveRoleCallbackApi { +public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService, RemoveUserCallbackApi, RemoveRoleCallbackApi { @Resource private SysRoleServiceApi sysRoleServiceApi; @@ -50,7 +49,7 @@ public class SysUserRoleServiceImpl extends ServiceImpl> userRoleCache; + private CacheOperatorApi> userRoleCache; @Resource private SysRoleLimitServiceApi sysRoleLimitServiceApi; @@ -136,25 +135,42 @@ public class SysUserRoleServiceImpl extends ServiceImpl cachedRoleIds = userRoleCache.get(userId.toString()); - if (cachedRoleIds != null) { - return cachedRoleIds; + List cachedRoleList = userRoleCache.get(userId.toString()); + if (ObjectUtil.isNotEmpty(cachedRoleList)) { + return cachedRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SysUserRole::getUserId, userId); - wrapper.select(SysUserRole::getRoleId); - List sysUserRoleList = this.list(wrapper); - - List userRoleQueryResult = sysUserRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + List sysUserRoleList = this.dbGetUserTotalRoleList(userId); // 查询结果缓存起来 - if (ObjectUtil.isNotEmpty(userRoleQueryResult)) { - userRoleCache.put(userId.toString(), userRoleQueryResult, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); - return userRoleQueryResult; + if (ObjectUtil.isNotEmpty(sysUserRoleList)) { + userRoleCache.put(userId.toString(), sysUserRoleList, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); } - return userRoleQueryResult; + return sysUserRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + } + + @Override + public List getUserRoleIdListCurrentCompany(Long userId, Long companyId) { + + if (ObjectUtil.isEmpty(companyId)) { + return this.getUserRoleIdList(userId); + } + + // 先从缓存查找用户的角色 + List cachedRoleList = userRoleCache.get(userId.toString()); + if (ObjectUtil.isNotEmpty(cachedRoleList)) { + return this.getUserCompanyPermissionRole(cachedRoleList, companyId); + } + + List sysUserRoleList = this.dbGetUserTotalRoleList(userId); + + // 查询结果缓存起来 + if (ObjectUtil.isNotEmpty(sysUserRoleList)) { + userRoleCache.put(userId.toString(), sysUserRoleList, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); + } + + return this.getUserCompanyPermissionRole(sysUserRoleList, companyId); } @Override @@ -193,22 +209,16 @@ public class SysUserRoleServiceImpl extends ServiceImpl roleResults = sysRoleServiceApi.getSystemRoleAndCurrentCompanyRole( - LoginContext.me().getCurrentUserCompanyId()); + List roleResults = sysRoleServiceApi.getSystemRoleAndCurrentCompanyRole(LoginContext.me().getCurrentUserCompanyId()); if (ObjectUtil.isEmpty(roleResults)) { return; } // 2. 所有系统角色id集合 - Set systemRoleIdList = roleResults.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.SYSTEM_ROLE.getCode())) - .map(SysRoleDTO::getRoleId) - .collect(Collectors.toSet()); + Set systemRoleIdList = roleResults.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.SYSTEM_ROLE.getCode())).map(SysRoleDTO::getRoleId).collect(Collectors.toSet()); // 3. 所有当前公司角色id集合 - Set currentCompanyRoleIdList = roleResults.stream() - .filter(i -> i.getRoleType().equals(RoleTypeEnum.COMPANY_ROLE.getCode())) - .map(SysRoleDTO::getRoleId) - .collect(Collectors.toSet()); + Set currentCompanyRoleIdList = roleResults.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.COMPANY_ROLE.getCode())).map(SysRoleDTO::getRoleId).collect(Collectors.toSet()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -237,4 +247,50 @@ public class SysUserRoleServiceImpl extends ServiceImpl dbGetUserTotalRoleList(Long userId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUserRole::getUserId, userId); + wrapper.select(SysUserRole::getRoleId, SysUserRole::getRoleCompanyId, SysUserRole::getRoleType); + return this.list(wrapper); + } + + /** + * 获取当前用户登录公司的角色id集合 + *

+ * 从参数中找到当前用户登录公司的 + 用户基本的角色集合 + * + * @author fengshuonan + * @since 2024-01-17 16:16 + */ + private List getUserCompanyPermissionRole(List paramRoles, Long userCurrentCompanyId) { + + // 1. 先获取最基本的用户角色,不分公司的,每个人都有的角色 + Set baseRoleIdList = paramRoles.stream().filter(i -> RoleTypeEnum.SYSTEM_ROLE.getCode().equals(i.getRoleType()) && i.getRoleCompanyId() == null).map(SysUserRole::getRoleId) + .collect(Collectors.toSet()); + + // 2. 获取用户当前登录公司下的角色id集合 + Set currentCompanyRoleIdList = paramRoles.stream() + .filter(i -> RoleTypeEnum.COMPANY_ROLE.getCode().equals(i.getRoleType()) + && i.getRoleCompanyId() != null + && i.getRoleCompanyId().equals(userCurrentCompanyId)) + .map(SysUserRole::getRoleId) + .collect(Collectors.toSet()); + + // 3. 合并两个集合并返回 + List resultRoleIdList = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(baseRoleIdList)) { + resultRoleIdList.addAll(baseRoleIdList); + } + if (ObjectUtil.isNotEmpty(currentCompanyRoleIdList)) { + resultRoleIdList.addAll(currentCompanyRoleIdList); + } + return resultRoleIdList; + } + } \ No newline at end of file diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/login/service/UserIndexInfoService.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/login/service/UserIndexInfoService.java index c78e4a08a..285d5ebc5 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/login/service/UserIndexInfoService.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/login/service/UserIndexInfoService.java @@ -93,7 +93,7 @@ public class UserIndexInfoService { // 3. 获取用户的权限编码集合 List userMenuList = this.fillUserPermissionCodeList(loginUser, userIndexInfo); - // 4. 获取用户的当前登录App + // 4. 获取用户的App信息和菜单信息列表 this.fillUserAppList(loginUser, userIndexInfo, userMenuList); // 5. 构建websocket url diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java index 83b219ae0..8f4a125ba 100644 --- a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java +++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserMemoryCacheAutoConfiguration.java @@ -29,6 +29,7 @@ import cn.hutool.cache.impl.TimedCache; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; import cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole.UserRoleMemoryCache; +import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -52,9 +53,9 @@ public class UserMemoryCacheAutoConfiguration { * @since 2023/7/14 22:14 */ @Bean - public CacheOperatorApi> userRoleCache() { + public CacheOperatorApi> userRoleCache() { // 1小时过期 - TimedCache> cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); + TimedCache> cache = CacheUtil.newTimedCache(1000 * SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS); return new UserRoleMemoryCache(cache); } diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java index aa9d6c88c..158ae7649 100644 --- a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java +++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/cache/user/UserRedisCacheAutoConfiguration.java @@ -27,6 +27,7 @@ package cn.stylefeng.roses.kernel.sys.starter.cache.user; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.cache.redis.util.CreateRedisTemplateUtil; import cn.stylefeng.roses.kernel.sys.modular.user.cache.userrole.UserRoleRedisCache; +import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -52,8 +53,8 @@ public class UserRedisCacheAutoConfiguration { * @since 2023/7/14 22:15 */ @Bean - public CacheOperatorApi> userRoleCache(RedisConnectionFactory redisConnectionFactory) { - RedisTemplate> redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory); + public CacheOperatorApi> userRoleCache(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate> redisTemplate = CreateRedisTemplateUtil.createObject(redisConnectionFactory); return new UserRoleRedisCache(redisTemplate); }