parent
bacf741f77
commit
9b26c3e98a
|
@ -2,12 +2,14 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config;
|
||||||
|
|
||||||
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory;
|
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory;
|
||||||
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript;
|
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript;
|
||||||
|
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager;
|
||||||
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener;
|
import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener;
|
||||||
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
|
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
|
||||||
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService;
|
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmUserGroupService;
|
||||||
import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
|
import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
|
||||||
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
|
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
|
||||||
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
|
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
|
||||||
|
import org.activiti.api.runtime.shared.identity.UserGroupManager;
|
||||||
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
|
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
@ -24,7 +26,7 @@ import static org.activiti.spring.boot.ProcessEngineAutoConfiguration.BEHAVIOR_F
|
||||||
public class BpmActivitiConfiguration {
|
public class BpmActivitiConfiguration {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器
|
* BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器、用户组管理
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public ProcessEngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer(
|
public ProcessEngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer(
|
||||||
|
@ -32,6 +34,8 @@ public class BpmActivitiConfiguration {
|
||||||
return configuration -> {
|
return configuration -> {
|
||||||
// 注册监听器,例如说 BpmActivitiEventListener
|
// 注册监听器,例如说 BpmActivitiEventListener
|
||||||
configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener));
|
configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener));
|
||||||
|
// 用户组
|
||||||
|
configuration.setUserGroupManager(new EmptyUserGroupManager());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,13 +39,7 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString
|
||||||
* 自定义的流程任务的 assignee 负责人的分配
|
* 自定义的流程任务的 assignee 负责人的分配
|
||||||
* 第一步,获得对应的分配规则;
|
* 第一步,获得对应的分配规则;
|
||||||
* 第二步,根据分配规则,计算出分配任务的候选人。如果找不到,则直接报业务异常,不继续执行后续的流程;
|
* 第二步,根据分配规则,计算出分配任务的候选人。如果找不到,则直接报业务异常,不继续执行后续的流程;
|
||||||
* 第三步,情况一,只有一个候选人,则选择一个作为 assignee 负责人,所有人作为 candidateUsers 候选人;
|
* 第三步,随机选择一个候选人,则选择作为 assignee 负责人。
|
||||||
* 情况二,不设置负责人,则所有人作为 candidateUsers 候选人;这样,后续他们可以在【待办任务】列表,进行【签收】动作,然后进行任务的审批。
|
|
||||||
*
|
|
||||||
* 如果计算出来的负责人是一个,则直接设置为该任务的 assignee 负责人;
|
|
||||||
* 如果是多个,则直接设置为该任务的 assignee 负责人,直接他们所有人为该任务的 candidateUsers 候选人;
|
|
||||||
* 注意,两者是互斥的。只要任务设置了 assignee,即使设置其他人为 candidateUsers,使用 TaskQuery 的 taskCandidateUser 条件,一样无法查询到任务。
|
|
||||||
* 原因是,WHERE 条件在过滤任务时,会额外增加一个 RES.ASSIGNEE_ is null !!!
|
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
|
@ -83,15 +77,9 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior {
|
||||||
BpmTaskAssignRuleDO rule = getTaskRule(task);
|
BpmTaskAssignRuleDO rule = getTaskRule(task);
|
||||||
// 第二步,获得任务的候选用户们
|
// 第二步,获得任务的候选用户们
|
||||||
Set<Long> candidateUserIds = calculateTaskCandidateUsers(task, rule);
|
Set<Long> candidateUserIds = calculateTaskCandidateUsers(task, rule);
|
||||||
// 情况一,只有一个 candidateUserIds,则设置负责人
|
// 第三步,设置一个作为负责人
|
||||||
if (CollU)
|
|
||||||
Long assigneeUserId = chooseTaskAssignee(candidateUserIds);
|
Long assigneeUserId = chooseTaskAssignee(candidateUserIds);
|
||||||
taskEntityManager.changeTaskAssignee(task, String.valueOf(assigneeUserId));
|
taskEntityManager.changeTaskAssignee(task, String.valueOf(assigneeUserId));
|
||||||
// 设置候选人们
|
|
||||||
candidateUserIds.remove(assigneeUserId); // 已经成为负责人了,就不要在扮演候选人了
|
|
||||||
if (CollUtil.isNotEmpty(candidateUserIds)) {
|
|
||||||
task.addCandidateUsers(convertSet(candidateUserIds, String::valueOf));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private BpmTaskAssignRuleDO getTaskRule(TaskEntity task) {
|
private BpmTaskAssignRuleDO getTaskRule(TaskEntity task) {
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity;
|
||||||
|
|
||||||
|
import org.activiti.api.runtime.shared.identity.UserGroupManager;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 空的 UserGroupManager 实现类,用于禁用 Activiti 自带的用户组实现。
|
||||||
|
* 原因是,我们使用了自己实现的任务分配规则,所以不需要 Activiti。
|
||||||
|
* 如果不去禁用,会存在一些场景下,会去查询用户所在的用户组,导致报错。
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
public class EmptyUserGroupManager implements UserGroupManager {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getUserGroups(String s) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getUserRoles(String s) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getGroups() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getUsers() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -98,11 +98,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||||
public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
|
public PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) {
|
||||||
// 查询待办任务
|
// 查询待办任务
|
||||||
TaskQuery taskQuery = taskService.createTaskQuery()
|
TaskQuery taskQuery = taskService.createTaskQuery()
|
||||||
// .or()
|
.taskAssignee(String.valueOf(userId)) // 分配给自己
|
||||||
// .taskAssignee(String.valueOf(userId)) // 分配给自己
|
|
||||||
// .taskCandidateOrAssigned(String.valueOf(userId))
|
|
||||||
.taskCandidateUser(String.valueOf(userId))
|
.taskCandidateUser(String.valueOf(userId))
|
||||||
// .endOr()
|
|
||||||
.orderByTaskCreateTime().desc(); // 创建时间倒序
|
.orderByTaskCreateTime().desc(); // 创建时间倒序
|
||||||
if (StrUtil.isNotBlank(pageVO.getName())) {
|
if (StrUtil.isNotBlank(pageVO.getName())) {
|
||||||
taskQuery.taskNameLike("%" + pageVO.getName() + "%");
|
taskQuery.taskNameLike("%" + pageVO.getName() + "%");
|
||||||
|
|
|
@ -325,7 +325,6 @@ public class SysAuthServiceImpl implements SysAuthService {
|
||||||
// 补全字段
|
// 补全字段
|
||||||
loginUser.setDeptId(user.getDeptId());
|
loginUser.setDeptId(user.getDeptId());
|
||||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId()));
|
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId()));
|
||||||
loginUser.setGroups(this.getUserPosts(user.getPostIds()));
|
|
||||||
return loginUser;
|
return loginUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,11 +65,6 @@ public class LoginUser implements UserDetails {
|
||||||
* 所属岗位
|
* 所属岗位
|
||||||
*/
|
*/
|
||||||
private Set<Long> postIds;
|
private Set<Long> postIds;
|
||||||
/**
|
|
||||||
* group 目前指岗位代替
|
|
||||||
*/
|
|
||||||
// TODO jason:这个字段,改成 postCodes 明确更好哈
|
|
||||||
private List<String> groups;
|
|
||||||
|
|
||||||
// ========== 上下文 ==========
|
// ========== 上下文 ==========
|
||||||
/**
|
/**
|
||||||
|
@ -100,12 +95,7 @@ public class LoginUser implements UserDetails {
|
||||||
@Override
|
@Override
|
||||||
@JsonIgnore// 避免序列化
|
@JsonIgnore// 避免序列化
|
||||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||||
List<GrantedAuthority> list = new ArrayList<>(1);
|
return new HashSet<>();
|
||||||
// 设置 ROLE_ACTIVITI_USER 角色,保证 activiti7 在 Security 验证时,可以通过。参考 https://juejin.cn/post/6972369247041224712 文章
|
|
||||||
// TODO 芋艿:这里估计得优化下
|
|
||||||
// TODO @芋艿:看看有没更优化的方案
|
|
||||||
list.add(new SimpleGrantedAuthority("ROLE_ACTIVITI_USER"));
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue