Przeglądaj źródła

fix 修复指定选人审批后 再次驳回到指定选人环节后 全部人能看到待办问题

gssong 7 miesięcy temu
rodzic
commit
b1d3d87360

+ 48 - 6
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java

@@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.TypeReference;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.enums.BusinessStatusEnum;
@@ -104,20 +105,61 @@ public class WorkflowGlobalListener implements GlobalListener {
         Definition definition = listenerVariable.getDefinition();
         Instance instance = listenerVariable.getInstance();
         String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
+        String hisStatus = flowParams != null ? flowParams.getHisStatus() : null;
+
         for (Task flowTask : nextTasks) {
-            // 如果办理或者退回并行存在需要指定办理人,则直接覆盖办理人
-            if (variable.containsKey(flowTask.getNodeCode()) && TaskStatusEnum.isPassOrBack(flowParams.getHisStatus())) {
-                String userIds = variable.get(flowTask.getNodeCode()).toString();
-                flowTask.setPermissionList(List.of(userIds.split(StringUtils.SEPARATOR)));
-                variable.remove(flowTask.getNodeCode());
+            String nodeCode = flowTask.getNodeCode();
+
+            // 处理办理或退回时指定办理人的情况
+            if (TaskStatusEnum.PASS.getStatus().equals(hisStatus)) {
+                processTaskPermission(variable, flowTask, hisStatus);
+            } else if (TaskStatusEnum.BACK.getStatus().equals(hisStatus)) {
+                processTaskPermission(variable, flowTask, hisStatus);
             }
+
             // 如果是申请节点,则把启动人添加到办理人
-            if (flowTask.getNodeCode().equals(applyNodeCode)) {
+            if (nodeCode.equals(applyNodeCode) && StringUtils.isNotBlank(instance.getCreateBy())) {
                 flowTask.setPermissionList(List.of(instance.getCreateBy()));
             }
         }
     }
 
+    /**
+     * 处理任务权限设置
+     *
+     * @param variable   变量集合
+     * @param flowTask   流程任务
+     * @param taskStatus 任务状态
+     */
+    private void processTaskPermission(Map<String, Object> variable, Task flowTask, String taskStatus) {
+        String nodeKey = taskStatus + StrUtil.COLON + flowTask.getNodeCode();
+
+        // 检查是否存在状态相关的变量
+        if (!variable.containsKey(nodeKey)) {
+            return;
+        }
+
+        // 获取用户ID字符串
+        Object userIdsObj = variable.get(nodeKey);
+        if (userIdsObj == null) {
+            return;
+        }
+
+        String userIds = userIdsObj.toString();
+        if (StringUtils.isBlank(userIds)) {
+            return;
+        }
+
+        // 分割用户ID并设置权限列表
+        String[] userIdArray = userIds.split(StringUtils.SEPARATOR);
+        if (userIdArray.length > 0) {
+            flowTask.setPermissionList(List.of(userIdArray));
+            // 移除已处理的状态变量
+            variable.remove(nodeKey);
+            FlowEngine.insService().removeVariables(flowTask.getInstanceId(),nodeKey);
+        }
+    }
+
     /**
      * 完成监听器,当前任务完成后执行
      *

+ 5 - 2
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Dict;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
@@ -308,10 +309,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
                     List<String> variableUserIds = Arrays.asList(userIds.split(StringUtils.SEPARATOR));
                     hashSet.addAll(popUserIds);
                     hashSet.addAll(variableUserIds);
-                    map.put(entry.getKey(), StringUtils.joinComma(hashSet));
+                    map.put(TaskStatusEnum.PASS.getStatus() + StrUtil.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
+                    map.put(TaskStatusEnum.BACK.getStatus() + StrUtil.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
                 }
             } else {
-                map.put(entry.getKey(), entry.getValue());
+                map.put(TaskStatusEnum.PASS.getStatus() + StrUtil.COLON + entry.getKey(), entry.getValue());
+                map.put(TaskStatusEnum.BACK.getStatus() + StrUtil.COLON + entry.getKey(), entry.getValue());
             }
         }
         return map;