소스 검색

1. 实现空的 bpm UserGroupManager
2. 去除任务分配时,candidateUsers 协调者

YunaiV 3 년 전
부모
커밋
9b26c3e98a

+ 5 - 1
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());
         };
     }
 

+ 2 - 14
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<Long> 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) {

+ 37 - 0
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<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();
+    }
+
+}

+ 1 - 4
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<BpmTaskTodoPageItemRespVO> 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() + "%");

+ 0 - 1
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;
     }
 

+ 1 - 11
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<Long> postIds;
-    /**
-     * group  目前指岗位代替
-     */
-    // TODO jason:这个字段,改成 postCodes 明确更好哈
-    private List<String> groups;
 
     // ========== 上下文 ==========
     /**
@@ -100,12 +95,7 @@ public class LoginUser implements UserDetails {
     @Override
     @JsonIgnore// 避免序列化
     public Collection<? extends GrantedAuthority> getAuthorities() {
-        List<GrantedAuthority> 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