diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index bf8efc550..16cb32d5d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -55,6 +55,11 @@ public interface CacheNames { */ String SYS_DEPT = "sys_dept#30d"; + /** + * 岗位 ID 列表 + */ + String SYS_POST_ID = "sys_post_id#30d"; + /** * OSS内容 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java index 6e4ead244..abb72534b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PostService.java @@ -3,6 +3,8 @@ package org.dromara.common.core.service; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; +import java.util.List; + /** * 通用 岗位服务 * @@ -10,6 +12,14 @@ import org.dromara.common.core.domain.model.TaskAssigneeBody; */ public interface PostService { + /** + * 根据用户 ID 查询其所属的岗位 ID 列表 + * + * @param userId 用户 ID,用于确定用户所属的岗位 + * @return 与该用户关联的岗位 ID 列表,如果未找到则返回空列表 + */ + List selectPostIdByUserIdList(Long userId); + /** * 查询岗位并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 2848347df..f0962e953 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -25,6 +26,7 @@ import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysPostMapper; import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.service.ISysPostService; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -238,6 +240,21 @@ public class SysPostServiceImpl implements ISysPostService, PostService { return baseMapper.updateById(post); } + /** + * 根据用户 ID 查询其所属的岗位 ID 列表 + * + * @param userId 用户 ID,用于确定用户所属的岗位 + * @return 与该用户关联的岗位 ID 列表,如果未找到则返回空列表 + */ + @Cacheable(cacheNames = CacheNames.SYS_POST_ID, key = "#userId") + @Override + public List selectPostIdByUserIdList(Long userId) { + // 通过岗位ID获取用户岗位信息 + List userPosts = userPostMapper.selectList( + new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); + return StreamUtils.toList(userPosts, SysUserPost::getPostId); + } + /** * 查询岗位并返回任务指派的列表,支持分页 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 763ac582d..58acbc9dc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -34,6 +34,7 @@ import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -329,8 +330,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService { * @param user 用户信息 * @return 结果 */ + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId"), + @CacheEvict(cacheNames = CacheNames.SYS_POST_ID, key = "#user.userId")} + ) @Override - @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") @Transactional(rollbackFor = Exception.class) public int updateUser(SysUserBo user) { // 新增用户与角色管理 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 741f94e4f..2ab7b641d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -3,20 +3,17 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; import com.warm.flow.core.entity.User; import com.warm.flow.orm.entity.FlowUser; -import java.util.Collections; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.service.PostService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.workflow.service.IWfTaskAssigneeService; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -35,15 +32,27 @@ public class WorkflowUtils { */ public static List permissionList() { LoginUser loginUser = LoginHelper.getLoginUser(); + Long userId = loginUser.getUserId(); Long deptId = loginUser.getDeptId(); - //todo 岗位获取待考虑 - return Stream.concat( - loginUser.getRoles().stream().map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), - Stream.of( - TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(), - TaskAssigneeEnum.DEPT.getCode() + deptId + List postIds = SpringUtils.getBean(PostService.class).selectPostIdByUserIdList(userId); + // 使用一个流来构建权限列表 + return Stream.of( + // 角色权限前缀 + loginUser.getRoles().stream() + .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), + + // 岗位权限前缀 + postIds.stream() + .map(postId -> TaskAssigneeEnum.POST.getCode() + postId), + + // 用户和部门权限 + Stream.of( + TaskAssigneeEnum.USER.getCode() + userId, + TaskAssigneeEnum.DEPT.getCode() + deptId + ) ) - ).collect(Collectors.toList()); + .flatMap(stream -> stream) + .collect(Collectors.toList()); } /**