Commit 9b26c3e98a5af21a11cb0e2ac9176c8d396aabcd

Authored by YunaiV
1 parent bacf741f

1. 实现空的 bpm UserGroupManager

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