diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java index bb12b8af..940fc4d1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java +++ b/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; 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.identity.EmptyUserGroupManager; 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.BpmUserGroupService; 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.user.SysUserService; +import org.activiti.api.runtime.shared.identity.UserGroupManager; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -24,7 +26,7 @@ import static org.activiti.spring.boot.ProcessEngineAutoConfiguration.BEHAVIOR_F public class BpmActivitiConfiguration { /** - * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器 + * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器、用户组管理 */ @Bean public ProcessEngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( @@ -32,6 +34,8 @@ public class BpmActivitiConfiguration { return configuration -> { // 注册监听器,例如说 BpmActivitiEventListener configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener)); + // 用户组 + configuration.setUserGroupManager(new EmptyUserGroupManager()); }; } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java index 4426e405..55c426db 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java +++ b/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 * 自定义的流程任务的 assignee 负责人的分配 * 第一步,获得对应的分配规则; * 第二步,根据分配规则,计算出分配任务的候选人。如果找不到,则直接报业务异常,不继续执行后续的流程; - * 第三步,情况一,只有一个候选人,则选择一个作为 assignee 负责人,所有人作为 candidateUsers 候选人; - * 情况二,不设置负责人,则所有人作为 candidateUsers 候选人;这样,后续他们可以在【待办任务】列表,进行【签收】动作,然后进行任务的审批。 - * - * 如果计算出来的负责人是一个,则直接设置为该任务的 assignee 负责人; - * 如果是多个,则直接设置为该任务的 assignee 负责人,直接他们所有人为该任务的 candidateUsers 候选人; - * 注意,两者是互斥的。只要任务设置了 assignee,即使设置其他人为 candidateUsers,使用 TaskQuery 的 taskCandidateUser 条件,一样无法查询到任务。 - * 原因是,WHERE 条件在过滤任务时,会额外增加一个 RES.ASSIGNEE_ is null !!! + * 第三步,随机选择一个候选人,则选择作为 assignee 负责人。 * * @author 芋道源码 */ @@ -83,15 +77,9 @@ public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { BpmTaskAssignRuleDO rule = getTaskRule(task); // 第二步,获得任务的候选用户们 Set candidateUserIds = calculateTaskCandidateUsers(task, rule); - // 情况一,只有一个 candidateUserIds,则设置负责人 - if (CollU) + // 第三步,设置一个作为负责人 Long assigneeUserId = chooseTaskAssignee(candidateUserIds); taskEntityManager.changeTaskAssignee(task, String.valueOf(assigneeUserId)); - // 设置候选人们 - candidateUserIds.remove(assigneeUserId); // 已经成为负责人了,就不要在扮演候选人了 - if (CollUtil.isNotEmpty(candidateUserIds)) { - task.addCandidateUsers(convertSet(candidateUserIds, String::valueOf)); - } } private BpmTaskAssignRuleDO getTaskRule(TaskEntity task) { diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java new file mode 100644 index 00000000..b4b86b22 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/identity/EmptyUserGroupManager.java @@ -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 getUserGroups(String s) { + return Collections.emptyList(); + } + + @Override + public List getUserRoles(String s) { + return Collections.emptyList(); + } + + @Override + public List getGroups() { + return Collections.emptyList(); + } + + @Override + public List getUsers() { + return Collections.emptyList(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java index 88c5ea1a..1b771590 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java +++ b/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 { public PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { // 查询待办任务 TaskQuery taskQuery = taskService.createTaskQuery() -// .or() -// .taskAssignee(String.valueOf(userId)) // 分配给自己 -// .taskCandidateOrAssigned(String.valueOf(userId)) + .taskAssignee(String.valueOf(userId)) // 分配给自己 .taskCandidateUser(String.valueOf(userId)) -// .endOr() .orderByTaskCreateTime().desc(); // 创建时间倒序 if (StrUtil.isNotBlank(pageVO.getName())) { taskQuery.taskNameLike("%" + pageVO.getName() + "%"); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java index 83ab8699..438bd1e7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/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 { // 补全字段 loginUser.setDeptId(user.getDeptId()); loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); - loginUser.setGroups(this.getUserPosts(user.getPostIds())); return loginUser; } diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java index 35c4e165..3612e490 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java +++ b/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 { * 所属岗位 */ private Set postIds; - /** - * group 目前指岗位代替 - */ - // TODO jason:这个字段,改成 postCodes 明确更好哈 - private List groups; // ========== 上下文 ========== /** @@ -100,12 +95,7 @@ public class LoginUser implements UserDetails { @Override @JsonIgnore// 避免序列化 public Collection getAuthorities() { - List list = new ArrayList<>(1); - // 设置 ROLE_ACTIVITI_USER 角色,保证 activiti7 在 Security 验证时,可以通过。参考 https://juejin.cn/post/6972369247041224712 文章 - // TODO 芋艿:这里估计得优化下 - // TODO @芋艿:看看有没更优化的方案 - list.add(new SimpleGrantedAuthority("ROLE_ACTIVITI_USER")); - return list; + return new HashSet<>(); } @Override