add 新增办理人权限处理器

This commit is contained in:
AprilWind 2024-11-29 17:45:15 +08:00
parent 8986f9a9b3
commit a454ab452d
2 changed files with 67 additions and 43 deletions

View File

@ -0,0 +1,67 @@
package org.dromara.workflow.handler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.TaskAssigneeEnum;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.handler.PermissionHandler;
import org.dromara.warm.flow.core.service.impl.TaskServiceImpl;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 办理人权限处理器
*
* @author AprilWind
*/
@RequiredArgsConstructor
@Component
@Slf4j
public class WorkflowPermissionHandler implements PermissionHandler {
/**
* 审批前获取当前办理人办理时会校验的该权限集合
* 后续在{@link TaskServiceImpl#checkAuth(Task, FlowParams)} 中调用
* 返回当前用户权限集合
*/
@Override
public List<String> permissions() {
LoginUser loginUser = LoginHelper.getLoginUser();
// 使用一个流来构建权限列表
return Stream.of(
// 角色权限前缀
loginUser.getRoles().stream()
.map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()),
// 岗位权限前缀
Stream.ofNullable(loginUser.getPosts())
.flatMap(Collection::stream)
.map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()),
// 用户和部门权限
Stream.of(
TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(),
TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId()
)
)
.flatMap(stream -> stream)
.collect(Collectors.toList());
}
/**
* 获取当前办理人
*
* @return 当前办理人
*/
@Override
public String getHandler() {
return LoginHelper.getUserIdStr();
}
}

View File

@ -2,19 +2,11 @@ package org.dromara.workflow.listener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.listener.Listener;
import org.dromara.warm.flow.core.listener.ListenerVariable;
import org.dromara.common.core.enums.TaskAssigneeEnum;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 流程启动监听器用于处理流程开始时的用户信息和权限设置
* <p>
@ -43,43 +35,8 @@ public class WorkflowStartListener implements Listener {
public void notify(ListenerVariable listenerVariable) {
log.info("流程启动监听器");
FlowParams flowParams = listenerVariable.getFlowParams();
LoginUser loginUser = LoginHelper.getLoginUser();
// 设置当前办理人id
flowParams.handler(loginUser.getUserId().toString());
// 设置办理人所拥有的权限比如角色部门用户等
flowParams.permissionFlag(buildUserPermissions(loginUser));
log.info("流程启动监听器结束;{}", "开启流程完成");
}
/**
* 构建当前用户的所有权限列表包括角色岗位用户和部门权限
* <p>
* 通过合并用户的角色岗位用户ID和部门ID来构建用户的权限列表格式化为字符串列表
* </p>
*
* @param loginUser 当前登录的用户对象包含用户的角色岗位ID等信息
* @return 权限列表包含角色岗位用户和部门的权限格式化为字符串列表
*/
private List<String> buildUserPermissions(LoginUser loginUser) {
// 使用一个流来构建权限列表
return Stream.of(
// 角色权限前缀
loginUser.getRoles().stream()
.map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()),
// 岗位权限前缀
Stream.ofNullable(loginUser.getPosts())
.flatMap(Collection::stream)
.map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()),
// 用户和部门权限
Stream.of(
TaskAssigneeEnum.USER.getCode() + loginUser.getUserId(),
TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId()
)
)
.flatMap(stream -> stream)
.collect(Collectors.toList());
}
}