Commit 9b26c3e98a5af21a11cb0e2ac9176c8d396aabcd
1 parent
bacf741f
1. 实现空的 bpm UserGroupManager
2. 去除任务分配时,candidateUsers 协调者
Showing
6 changed files
with
46 additions
and
31 deletions
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 |