From 504333e56f249d16e71e8ac2a435cf2212040c23 Mon Sep 17 00:00:00 2001
From: cuikaidong <ckd2942379034@163.com>
Date: 星期二, 27 五月 2025 17:32:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java |  536 ++++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 326 insertions(+), 210 deletions(-)

diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
index 6b715e9..78a241f 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.flowable.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
@@ -68,6 +69,7 @@
 import java.util.stream.Collectors;
 
 /**
+ *
  **/
 @Service
 @Slf4j
@@ -78,6 +80,7 @@
     private IFlowThirdService iFlowThirdService;
     @Autowired
     FlowMyBusinessServiceImpl flowMyBusinessService;
+
     /**
      * 瀹屾垚浠诲姟
      *
@@ -87,23 +90,23 @@
     @Override
     public Result complete(FlowTaskVo taskVo) {
         Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult();
-        if (Objects.isNull(task)){
+        if (Objects.isNull(task)) {
             return Result.error("浠诲姟涓嶅瓨鍦�");
         }
-        if(StringUtils.isNotEmpty(taskVo.getComment())){
+        if (StringUtils.isNotEmpty(taskVo.getComment())) {
             task.setDescription(taskVo.getComment());
             taskService.saveTask(task);
         }
         SysUser loginUser = iFlowThirdService.getLoginUser();
         //鍒ゆ柇鐢ㄦ埛鏄惁鏈夋潈闄�
-        if (!task.getAssignee().equals(loginUser.getUsername())){
+        if (!task.getAssignee().equals(loginUser.getUsername())) {
             return Result.error("褰撳墠鐢ㄦ埛鏃犳潈闄�");
         }
         if (DelegationState.PENDING.equals(task.getDelegationState())) {
             taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment());
             //taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues());
         } else {
-            System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()"+taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---"+taskVo.getComment() );
+            System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()" + taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---" + taskVo.getComment());
             taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
             taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername());
         }
@@ -111,20 +114,22 @@
         //涓氬姟鏁版嵁id
         String dataId = taskVo.getDataId();
         //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂
-        FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId);
+        FlowMyBusiness business = flowMyBusinessService.getFlowMyBusiness(taskVo.getInstanceId(), taskVo.getTaskId());
         //spring瀹瑰櫒绫诲悕
         String serviceImplName = business.getServiceImplName();
         FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName);
         // 娴佺▼鍙橀噺
-        Map<String, Object> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(),taskVo.getValues());
+        Map<String, Object> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(), taskVo.getValues());
 
         //璁剧疆鏁版嵁
         Map<String, Object> values = taskVo.getValues();
-        if (MapUtil.isNotEmpty(flowBeforeParamsValues)){
-        //    涓氬姟灞傛湁璁剧疆鍙橀噺锛屼娇鐢ㄤ笟鍔″眰鐨勫彉閲�
+        if (MapUtil.isNotEmpty(flowBeforeParamsValues)) {
+            //    涓氬姟灞傛湁璁剧疆鍙橀噺锛屼娇鐢ㄤ笟鍔″眰鐨勫彉閲�
             values = flowBeforeParamsValues;
         }
-        FlowNextDto nextFlowNode = this.getNextFlowNode(task.getId(), values);
+
+        //骞惰缃戝叧 澶氫换鍔�
+        List<FlowNextDto> nextFlowNodeList = this.getNextFlowNode(task.getId(), values);
         //涓嬩竴涓疄渚嬭妭鐐�
         if (DelegationState.PENDING.equals(task.getDelegationState())) {
             taskService.resolveTask(taskVo.getTaskId(), values);
@@ -132,140 +137,218 @@
             taskService.complete(taskVo.getTaskId(), values);
         }
         List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list();
-        Task task2 = null;
-        if (CollUtil.isNotEmpty(task2List)){
-            task2 = task2List.get(0);
-        }
-
-        // 涓嬩釜鑺傜偣鍊欓�変汉
-        List<String> beforeParamsCandidateUsernames = Lists.newArrayList();
-        if(task2!=null){
-            beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(),taskVo.getValues());
-        }
-        List<String> candidateUsers = taskVo.getCandidateUsers();
-        if (CollUtil.isNotEmpty(candidateUsers)){
-            //    鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊
-            beforeParamsCandidateUsernames = candidateUsers;
-        }
         String doneUsers = business.getDoneUsers();
         // 澶勭悊杩囨祦绋嬬殑浜�
         JSONArray doneUserList = new JSONArray();
-        if (StrUtil.isNotBlank(doneUsers)){
+        if (StrUtil.isNotBlank(doneUsers)) {
             doneUserList = JSON.parseArray(doneUsers);
         }
-        if (!doneUserList.contains(loginUser.getUsername())){
+        if (!doneUserList.contains(loginUser.getUsername())) {
             doneUserList.add(loginUser.getUsername());
         }
 
-        if (task2!=null && task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())){
-        //    * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬
-            business.setTaskId(task2.getId())
-//                    .setActStatus(ActStatus.doing)
+        if (CollectionUtils.isEmpty(nextFlowNodeList)) {
+            //    **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜�
+            business
                     .setDoneUsers(doneUserList.toJSONString())
+                    .setTodoUsers("")
+                    .setTaskId("")
+                    .setTaskNameId("")
+                    .setTaskName("")
             ;
-            String todoUsersStr = business.getTodoUsers();
-            JSONArray todosArr = JSON.parseArray(todoUsersStr);
-            // 鍒犻櫎鍚庨噸鍐�
-            for (Task task2One : task2List) {
-                for (Object oldUser : todosArr) {
-                    taskService.deleteCandidateUser(task2One.getId(),oldUser.toString());
+            flowMyBusinessService.updateById(business);
+        }
+        else if (nextFlowNodeList.size() == 1) {
+            FlowNextDto nextFlowNode = nextFlowNodeList.get(0);
+            UserTask nextTask = nextFlowNode.getUserTask();
+            Task task2 = null;
+            Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst();
+            task2 = first.orElseGet(() -> task2List.get(0));
+            if (task2 != null) {
+                // 涓嬩釜鑺傜偣鍊欓�変汉
+                List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), taskVo.getValues());
+                List<String> candidateUsers = taskVo.getCandidateUsers();
+                if (CollUtil.isNotEmpty(candidateUsers)) {
+                    //    鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊
+                    beforeParamsCandidateUsernames = candidateUsers;
                 }
-            }
-            // 閲嶅啓
-            if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){
-                beforeParamsCandidateUsernames.remove(loginUser.getUsername());
-                // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
-                for (Task task2One : task2List) {
-                    for (String newUser : beforeParamsCandidateUsernames) {
-                        taskService.addCandidateUser(task2One.getId(),newUser);
-                    }
-                }
-                business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
-            } else {
-                todosArr.remove(loginUser.getUsername());
-                for (Task task2One : task2List) {
+                if (task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())) {
+                    //澶氬疄渚� 浼氱 TODO
+                    //    * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬
+                    business.setTaskId(task2.getId())
+//                    .setActStatus(ActStatus.doing)
+                            .setDoneUsers(doneUserList.toJSONString())
+                    ;
+                    String todoUsersStr = business.getTodoUsers();
+                    JSONArray todosArr = JSON.parseArray(todoUsersStr);
+                    // 鍒犻櫎鍚庨噸鍐�
                     for (Object oldUser : todosArr) {
-                        taskService.addCandidateUser(task2One.getId(),oldUser.toString());
+                        taskService.deleteCandidateUser(task2.getId(), oldUser.toString());
+                    }
+                    // 閲嶅啓
+                    if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) {
+                        beforeParamsCandidateUsernames.remove(loginUser.getUsername());
+                        // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
+                        for (String newUser : beforeParamsCandidateUsernames) {
+                            taskService.addCandidateUser(task2.getId(), newUser);
+                        }
+                        business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
+                    } else {
+                        todosArr.remove(loginUser.getUsername());
+                        for (Object oldUser : todosArr) {
+                            taskService.addCandidateUser(task2.getId(), oldUser.toString());
+                        }
+                        business.setTodoUsers(todosArr.toJSONString());
+                    }
+
+                } else {
+                    //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉
+                    List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList();
+                    List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList());
+                    if (CollUtil.isNotEmpty(candidateUsers)) {
+                        //    鍓嶇浼犲叆鍊欓�変汉
+                        collect_username = candidateUsers;
+                    }
+                    business
+                            .setTaskId(task2.getId())
+//                        .setActStatus(ActStatus.doing)
+                            .setTaskNameId(nextTask.getId())
+                            .setTaskName(nextTask.getName())
+                            .setPriority(nextTask.getPriority())
+                            .setDoneUsers(doneUserList.toJSONString())
+                            .setTodoUsers(JSON.toJSONString(collect_username))
+                    ;
+                    // 鍒犻櫎鍚庨噸鍐�
+                    for (String oldUser : collect_username) {
+                        taskService.deleteCandidateUser(task2.getId(), oldUser);
+                    }
+                    if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) {
+                        // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
+                        for (String newUser : beforeParamsCandidateUsernames) {
+                            taskService.addCandidateUser(task2.getId(), newUser);
+                        }
+                        business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
+                    } else {
+                        for (String oldUser : collect_username) {
+                            taskService.addCandidateUser(task2.getId(), oldUser);
+                        }
+                        business.setTodoUsers(JSON.toJSONString(collect_username));
                     }
                 }
-                business.setTodoUsers(todosArr.toJSONString());
             }
-
-
-        } else {
-        //    * 涓嬩竴鑺傜偣鏄細绛捐妭鐐� 鎴� 鏅�氱敤鎴疯妭鐐癸紝閫昏緫涓�鑷�
-            if (nextFlowNode!=null){
+            flowMyBusinessService.updateById(business);
+        }
+        else {
+            for(FlowNextDto nextFlowNode : nextFlowNodeList) {
                 //**鏈変笅涓�涓妭鐐�
                 UserTask nextTask = nextFlowNode.getUserTask();
-                //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉
-                List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList();
-                List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList());
-                if (CollUtil.isNotEmpty(candidateUsers)){
-                    //    鍓嶇浼犲叆鍊欓�変汉
-                    collect_username = candidateUsers;
+                Task task2 = null;
+                Optional<Task> first = task2List.stream().filter(t -> t.getTaskDefinitionKey().equals(nextTask.getId())).findFirst();
+                if (first.isPresent()) {
+                    task2 = first.get();
                 }
-                business
-                        .setTaskId(task2.getId())
-//                        .setActStatus(ActStatus.doing)
-                        .setTaskNameId(nextTask.getId())
-                        .setTaskName(nextTask.getName())
-                        .setPriority(nextTask.getPriority())
-                        .setDoneUsers(doneUserList.toJSONString())
-                        .setTodoUsers(JSON.toJSONString(collect_username))
-                ;
-                // 鍒犻櫎鍚庨噸鍐�
-                for (Task task2One : task2List) {
-                    for (String oldUser : collect_username) {
-                        taskService.deleteCandidateUser(task2One.getId(),oldUser);
+                if (task2 != null) {
+                    //鏂扮殑涓氬姟娴佺▼鑺傜偣
+                    FlowMyBusiness newBusiness =  BeanUtil.copyProperties(business, FlowMyBusiness.class, "id");
+                    // 涓嬩釜鑺傜偣鍊欓�変汉
+                    List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), taskVo.getValues());
+                    List<String> candidateUsers = taskVo.getCandidateUsers();
+                    if (CollUtil.isNotEmpty(candidateUsers)) {
+                        //    鍓嶇浼犲叆鍊欓�変汉 瑕嗙洊
+                        beforeParamsCandidateUsernames = candidateUsers;
                     }
-                }
-                if (CollUtil.isEmpty(candidateUsers)&&CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){
-                    // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
-                    for (Task task2One : task2List) {
-                        for (String newUser : beforeParamsCandidateUsernames) {
-                            taskService.addCandidateUser(task2One.getId(),newUser);
+                    if (task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())) {
+                        //澶氬疄渚� 浼氱 TODO
+                        //    * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬
+                        newBusiness.setTaskId(task2.getId())
+//                    .setActStatus(ActStatus.doing)
+                                .setDoneUsers(doneUserList.toJSONString())
+                        ;
+                        String todoUsersStr = business.getTodoUsers();
+                        JSONArray todosArr = JSON.parseArray(todoUsersStr);
+                        // 鍒犻櫎鍚庨噸鍐�
+                        for (Object oldUser : todosArr) {
+                            taskService.deleteCandidateUser(task2.getId(), oldUser.toString());
                         }
-                    }
-                    business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
-                } else {
-                    for (Task task2One : task2List) {
-                        for (String oldUser : collect_username) {
-                            taskService.addCandidateUser(task2One.getId(),oldUser);
+                        // 閲嶅啓
+                        if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) {
+                            beforeParamsCandidateUsernames.remove(loginUser.getUsername());
+                            // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
+                            for (String newUser : beforeParamsCandidateUsernames) {
+                                taskService.addCandidateUser(task2.getId(), newUser);
+                            }
+                            newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
+                        } else {
+                            todosArr.remove(loginUser.getUsername());
+                            for (Object oldUser : todosArr) {
+                                taskService.addCandidateUser(task2.getId(), oldUser.toString());
+                            }
+                            newBusiness.setTodoUsers(todosArr.toJSONString());
                         }
-                    }
-                }
 
-            } else {
-                //    **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜�
-                business
-                        .setDoneUsers(doneUserList.toJSONString())
-                        .setTodoUsers("")
-                        .setTaskId("")
-                        .setTaskNameId("")
-                        .setTaskName("")
-                ;
+                    } else {
+                        //鑳藉澶勭悊涓嬩釜鑺傜偣鐨勫�欓�変汉
+                        List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList();
+                        List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList());
+                        if (CollUtil.isNotEmpty(candidateUsers)) {
+                            //    鍓嶇浼犲叆鍊欓�変汉
+                            collect_username = candidateUsers;
+                        }
+                        newBusiness
+                                .setTaskId(task2.getId())
+//                        .setActStatus(ActStatus.doing)
+                                .setTaskNameId(nextTask.getId())
+                                .setTaskName(nextTask.getName())
+                                .setPriority(nextTask.getPriority())
+                                .setDoneUsers(doneUserList.toJSONString())
+                                .setTodoUsers(JSON.toJSONString(collect_username))
+                        ;
+                        // 鍒犻櫎鍚庨噸鍐�
+                        for (String oldUser : collect_username) {
+                            taskService.deleteCandidateUser(task2.getId(), oldUser);
+                        }
+                        if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) {
+                            // 鍓嶇娌℃湁浼犲叆鍊欓�変汉 && 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
+                            for (String newUser : beforeParamsCandidateUsernames) {
+                                taskService.addCandidateUser(task2.getId(), newUser);
+                            }
+                            newBusiness.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
+                        } else {
+                            for (String oldUser : collect_username) {
+                                taskService.addCandidateUser(task2.getId(), oldUser);
+                            }
+                            newBusiness.setTodoUsers(JSON.toJSONString(collect_username));
+                        }
+                    }
+                    flowMyBusinessService.save(newBusiness);
+                }
+                flowMyBusinessService.updateById(business);
             }
+            //鍒犻櫎鍘熸湁鐨勪笟鍔℃暟鎹�
+            flowMyBusinessService.removeById(business.getId());
         }
 
-        flowMyBusinessService.updateById(business);
         // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰
         business.setValues(values);
-        if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business);
+        if (flowCallBackService != null) {
+            flowCallBackService.afterFlowHandle(business);
+        }
         return Result.OK();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Result completeByDateId(FlowTaskVo flowTaskVo){
+    public Result completeByDateId(FlowTaskVo flowTaskVo) {
         return this.complete(flowTaskVo);
     }
 
     @Override
-    public void taskRejectByDataId(FlowTaskVo flowTaskVo){
+    public void taskRejectByDataId(FlowTaskVo flowTaskVo) {
         FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId());
         flowTaskVo.setTaskId(business.getTaskId());
         this.taskReject(flowTaskVo);
     }
+
     /**
      * 椹冲洖浠诲姟
      *
@@ -387,7 +470,7 @@
             /*======================椹冲洖  鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/
             //涓氬姟鏁版嵁id
             String dataId = flowTaskVo.getDataId();
-            if (dataId==null) return;
+            if (dataId == null) return;
             //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂
             FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId);
             // 椹冲洖鍒颁簡涓婁竴涓妭鐐圭瓑寰呭鐞�
@@ -397,21 +480,21 @@
             String serviceImplName = business.getServiceImplName();
             FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName);
             Map<String, Object> values = flowTaskVo.getValues();
-            if (values ==null){
+            if (values == null) {
                 values = MapUtil.newHashMap();
-                values.put("dataId",dataId);
+                values.put("dataId", dataId);
             } else {
-                values.put("dataId",dataId);
+                values.put("dataId", dataId);
             }
             List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), values);
             //璁剧疆鏁版嵁
             String doneUsers = business.getDoneUsers();
             // 澶勭悊杩囨祦绋嬬殑浜�
             JSONArray doneUserList = new JSONArray();
-            if (StrUtil.isNotBlank(doneUsers)){
+            if (StrUtil.isNotBlank(doneUsers)) {
                 doneUserList = JSON.parseArray(doneUsers);
             }
-            if (!doneUserList.contains(loginUser.getUsername())){
+            if (!doneUserList.contains(loginUser.getUsername())) {
                 doneUserList.add(loginUser.getUsername());
             }
             business
@@ -432,31 +515,31 @@
                 }
             }
 
-            if (targetElement!=null){
+            if (targetElement != null) {
                 UserTask targetTask = (UserTask) targetElement;
                 business.setPriority(targetTask.getPriority());
 
-                if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){
+                if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) {
                     //    寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉
                     business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer())));
-                    taskService.setAssignee(business.getTaskId(),business.getProposer());
+                    taskService.setAssignee(business.getTaskId(), business.getProposer());
                 } else {
                     List<SysUser> sysUserFromTask = getSysUserFromTask(targetTask);
                     List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList());
                     // 鍓嶇瀛樺叆鐨勫�欓�変汉
                     List<String> candidateUsers = flowTaskVo.getCandidateUsers();
-                    if (CollUtil.isNotEmpty(candidateUsers)){
+                    if (CollUtil.isNotEmpty(candidateUsers)) {
                         collect_username = candidateUsers;
                     }
                     business.setTodoUsers(JSON.toJSONString(collect_username));
                     // 鍒犻櫎鍚庨噸鍐�
                     for (Task task2One : task2List) {
                         for (String oldUser : collect_username) {
-                            taskService.deleteCandidateUser(task2One.getId(),oldUser);
+                            taskService.deleteCandidateUser(task2One.getId(), oldUser);
                         }
                     }
-                    if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){
-                        if (CollUtil.isNotEmpty(candidateUsers)){
+                    if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) {
+                        if (CollUtil.isNotEmpty(candidateUsers)) {
                             beforeParamsCandidateUsernames = candidateUsers;
                         }
                         // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
@@ -477,9 +560,9 @@
             }
 
             flowMyBusinessService.updateById(business);
-           // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰
+            // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰
             business.setValues(values);
-            if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business);
+            if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business);
         } catch (FlowableObjectNotFoundException e) {
             throw new CustomException("鏈壘鍒版祦绋嬪疄渚嬶紝娴佺▼鍙兘宸插彂鐢熷彉鍖�");
         } catch (FlowableException e) {
@@ -487,13 +570,15 @@
         }
 
     }
+
     @Override
-    public void taskReturnByDataId(FlowTaskVo flowTaskVo){
+    public void taskReturnByDataId(FlowTaskVo flowTaskVo) {
         //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂
         FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId());
         flowTaskVo.setTaskId(business.getTaskId());
         taskReturn(flowTaskVo);
     }
+
     /**
      * 閫�鍥炰换鍔�
      *
@@ -574,7 +659,7 @@
             /*======================閫�鍥�  鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/
             //涓氬姟鏁版嵁id
             String dataId = flowTaskVo.getDataId();
-            if (dataId==null) return;
+            if (dataId == null) return;
             //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂
             FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId);
             //spring瀹瑰櫒绫诲悕
@@ -584,61 +669,61 @@
             String doneUsers = business.getDoneUsers();
             // 澶勭悊杩囨祦绋嬬殑浜�
             JSONArray doneUserList = new JSONArray();
-            if (StrUtil.isNotBlank(doneUsers)){
+            if (StrUtil.isNotBlank(doneUsers)) {
                 doneUserList = JSON.parseArray(doneUsers);
             }
 
-            if (!doneUserList.contains(loginUser.getUsername())){
+            if (!doneUserList.contains(loginUser.getUsername())) {
                 doneUserList.add(loginUser.getUsername());
             }
-                //**璺宠浆鍒扮洰鏍囪妭鐐�
+            //**璺宠浆鍒扮洰鏍囪妭鐐�
             List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list();
             Task targetTask = task2List.get(0);
-                business
-                        .setTaskId(targetTask.getId())
+            business
+                    .setTaskId(targetTask.getId())
 //                        .setActStatus(ActStatus.reject)
-                        .setTaskNameId(targetTask.getTaskDefinitionKey())
-                        .setTaskName(targetTask.getName())
-                        .setPriority(targetTask.getPriority()+"")
-                        .setDoneUsers(doneUserList.toJSONString())
-                ;
-            if (target!=null){
+                    .setTaskNameId(targetTask.getTaskDefinitionKey())
+                    .setTaskName(targetTask.getName())
+                    .setPriority(targetTask.getPriority() + "")
+                    .setDoneUsers(doneUserList.toJSONString())
+            ;
+            if (target != null) {
                 UserTask target2 = (UserTask) target;
                 business.setPriority(target2.getPriority());
-                if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){
-                //    寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉
+                if (StrUtil.equals(business.getTaskNameId(), ProcessConstants.START_NODE)) {
+                    //    寮�濮嬭妭鐐广�傝缃鐞嗕汉涓虹敵璇蜂汉
                     business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer())));
-                    taskService.setAssignee(business.getTaskId(),business.getProposer());
+                    taskService.setAssignee(business.getTaskId(), business.getProposer());
                 } else {
                     List<SysUser> sysUserFromTask = getSysUserFromTask(target2);
                     List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList());
                     List<String> candidateUsers = flowTaskVo.getCandidateUsers();
-                    if (CollUtil.isNotEmpty(candidateUsers)){
+                    if (CollUtil.isNotEmpty(candidateUsers)) {
                         collect_username = candidateUsers;
                     }
                     business.setTodoUsers(JSON.toJSONString(collect_username));
                     // 鍒犻櫎鍚庨噸鍐�
                     for (Task task2One : task2List) {
                         for (String oldUser : collect_username) {
-                            taskService.deleteCandidateUser(task2One.getId(),oldUser);
+                            taskService.deleteCandidateUser(task2One.getId(), oldUser);
                         }
                     }
                     Map<String, Object> values = flowTaskVo.getValues();
-                    if (values==null){
+                    if (values == null) {
                         values = MapUtil.newHashMap();
-                        values.put("dataId",dataId);
+                        values.put("dataId", dataId);
                     } else {
-                        values.put("dataId",dataId);
+                        values.put("dataId", dataId);
                     }
                     List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(targetTask.getTaskDefinitionKey(), values);
-                    if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){
-                        if (CollUtil.isNotEmpty(candidateUsers)){
+                    if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)) {
+                        if (CollUtil.isNotEmpty(candidateUsers)) {
                             beforeParamsCandidateUsernames = candidateUsers;
                         }
                         // 涓氬姟灞傛湁鎸囧畾鍊欓�変汉锛岃鐩�
                         for (Task task2One : task2List) {
                             for (String newUser : beforeParamsCandidateUsernames) {
-                                taskService.addCandidateUser(task2One.getId(),newUser);
+                                taskService.addCandidateUser(task2One.getId(), newUser);
                             }
                         }
                         business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames));
@@ -654,7 +739,7 @@
             flowMyBusinessService.updateById(business);
             // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰
             business.setValues(flowTaskVo.getValues());
-            if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business);
+            if (flowCallBackService != null) flowCallBackService.afterFlowHandle(business);
         } catch (FlowableObjectNotFoundException e) {
             throw new CustomException("鏈壘鍒版祦绋嬪疄渚嬶紝娴佺▼鍙兘宸插彂鐢熷彉鍖�");
         } catch (FlowableException e) {
@@ -671,15 +756,16 @@
 
     /**
      * 缁撴潫娴佺▼
+     *
      * @param processInstanceId 娴佺▼瀹炰緥 ID
-     * @param deleteReason 瀹氫箟鍒犻櫎鍘熷洜
+     * @param deleteReason      瀹氫箟鍒犻櫎鍘熷洜
      */
     public Result<?> end(String processInstanceId, String deleteReason) {
         try {
             // 寮哄埗缁撴潫娴佺▼瀹炰緥
             runtimeService.deleteProcessInstance(processInstanceId, deleteReason);
             // 鍒犻櫎鍏宠仈娴佺▼鐨勪笟鍔�
-            FlowMyBusiness flowMyBusiness=flowMyBusinessService.getFlowMyBusiness(processInstanceId);
+            FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(processInstanceId);
             flowMyBusinessService.removeById(flowMyBusiness.getId());
             System.out.println("Process instance with ID " + processInstanceId + " has been forcefully ended.");
         } catch (Exception e) {
@@ -740,7 +826,7 @@
     @Override
     public void deleteTask(FlowTaskVo flowTaskVo) {
         // todo 寰呯‘璁ゅ垹闄や换鍔℃槸鐗╃悊鍒犻櫎浠诲姟 杩樻槸閫昏緫鍒犻櫎锛岃杩欎釜浠诲姟鐩存帴閫氳繃锛�
-        taskService.deleteTask(flowTaskVo.getTaskId(),flowTaskVo.getComment());
+        taskService.deleteTask(flowTaskVo.getTaskId(), flowTaskVo.getComment());
     }
 
     /**
@@ -785,7 +871,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void assignTask(FlowTaskVo flowTaskVo) {
-        taskService.setAssignee(flowTaskVo.getTaskId(),flowTaskVo.getAssignee());
+        taskService.setAssignee(flowTaskVo.getTaskId(), flowTaskVo.getAssignee());
     }
 
     /**
@@ -803,7 +889,7 @@
                 .startedBy(username)
                 .orderByProcessInstanceStartTime()
                 .desc();
-        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize);
+        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1) * pageSize, pageSize);
         page.setTotal(historicProcessInstanceQuery.count());
         List<FlowTaskDto> flowList = new ArrayList<>();
         for (HistoricProcessInstance hisIns : historicProcessInstances) {
@@ -942,6 +1028,7 @@
 
     /**
      * 鍒ゆ柇澶氫釜浠诲姟鏄惁澶勪簬鍚屼竴娴佺▼鑺傜偣
+     *
      * @param taskIds 閫楀彿鍒嗛殧鐨勪换鍔D瀛楃涓�
      * @return 缁熶竴缁撴灉灏佽
      */
@@ -1013,7 +1100,7 @@
                 .taskAssignee(username)
                 .orderByTaskCreateTime().desc();
         page.setTotal(taskQuery.count());
-        List<Task> taskList = taskQuery.listPage((pageNum - 1)*pageSize, pageSize);
+        List<Task> taskList = taskQuery.listPage((pageNum - 1) * pageSize, pageSize);
         List<FlowTaskDto> flowList = new ArrayList<>();
         for (Task task : taskList) {
             FlowTaskDto flowTask = new FlowTaskDto();
@@ -1040,7 +1127,7 @@
             List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId());
             flowTask.setStartUserId(startUser.getUsername());
             flowTask.setStartUserName(startUser.getRealname());
-            flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�"));
+            flowTask.setStartDeptName(CollUtil.join(departNamesByUsername, "锛�"));
             flowList.add(flowTask);
         }
 
@@ -1069,15 +1156,15 @@
                     .processInstanceId(flowTaskDto.getProcInsId())
                     .singleResult();
             SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId());
-            if (startUser!=null){
+            if (startUser != null) {
                 flowTaskDto.setStartUserId(startUser.getUsername());
                 flowTaskDto.setStartUserName(startUser.getRealname());
             }
             List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId());
-            flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�"));
-            if (flowTaskDto.getTodoUsers() == null){
+            flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername, "锛�"));
+            if (flowTaskDto.getTodoUsers() == null) {
                 flowTaskDto.setTodoUsers("");
-            }else {
+            } else {
                 //鍘婚櫎[]
                 flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\\[", "").replaceAll("\\]", ""));
                 flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\"", ""));
@@ -1125,9 +1212,9 @@
                         flowTask.setAssigneeId(sysUser.getUsername());
                         flowTask.setAssigneeName(sysUser.getRealname());
                         List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(histIns.getAssignee());
-                        flowTask.setDeptName(CollUtil.join(departNamesByUsername,"锛�"));
-                        if (StrUtil.equals(histIns.getActivityId(),ProcessConstants.START_NODE)){
-                        //    寮�濮嬭妭鐐癸紝鎶婂�欓�変汉璁剧疆涓哄彂璧蜂汉锛岃繖涓�煎凡琚叾浠栧湴鏂硅缃繃锛屼笌瀹為檯鍔炵悊浜轰竴鑷村嵆鍙�
+                        flowTask.setDeptName(CollUtil.join(departNamesByUsername, "锛�"));
+                        if (StrUtil.equals(histIns.getActivityId(), ProcessConstants.START_NODE)) {
+                            //    寮�濮嬭妭鐐癸紝鎶婂�欓�変汉璁剧疆涓哄彂璧蜂汉锛岃繖涓�煎凡琚叾浠栧湴鏂硅缃繃锛屼笌瀹為檯鍔炵悊浜轰竴鑷村嵆鍙�
                             flowTask.setCandidate(sysUser.getRealname());
                         }
                     }
@@ -1169,9 +1256,9 @@
         String serviceImplName = business.getServiceImplName();
         FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName);
         // 娴佺▼澶勭悊瀹屽悗锛岃繘琛屽洖璋冧笟鍔″眰
-        if (flowCallBackService!=null){
+        if (flowCallBackService != null) {
             Object businessDataById = flowCallBackService.getBusinessDataById(dataId);
-            map.put("formData",businessDataById);
+            map.put("formData", businessDataById);
         }
         return Result.OK(map);
     }
@@ -1260,8 +1347,8 @@
 
                 for (FlowViewerDto viewerDto : flowViewerList) {
                     String key = viewerDto.getKey();
-                    if (key.equals(flowViewerDto.getKey())){
-                    //    閲嶅鍒犻櫎鍚庨潰鏇存柊
+                    if (key.equals(flowViewerDto.getKey())) {
+                        //    閲嶅鍒犻櫎鍚庨潰鏇存柊
                         flowViewerList.remove(viewerDto);
                         break;
                     }
@@ -1276,7 +1363,7 @@
     @Override
     public List<FlowViewerDto> getFlowViewerByDataId(String dataId) {
         LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId)
+        flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId)
         ;
         //濡傛灉淇濆瓨鏁版嵁鍓嶆湭璋冪敤蹇呰皟鐨凢lowCommonService.initActBusiness鏂规硶锛屽氨浼氭湁闂
         FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper);
@@ -1298,7 +1385,7 @@
                     String firstKey = stev.getId();
                     orderKeys.add(firstKey);
                     //椤哄簭鑾峰彇鑺傜偣
-                    this.appendKeys(orderKeys, firstKey,flowElements);
+                    this.appendKeys(orderKeys, firstKey, flowElements);
                 } catch (Exception e) {
                     break;
                 }
@@ -1307,11 +1394,11 @@
 
             for (String key : orderKeys) {
                 Optional<FlowViewerDto> any = flowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), key)).findAny();
-                if(any.isPresent()){
+                if (any.isPresent()) {
                     FlowViewerDto viewerDto = any.get();
                     reflowViewers.add(viewerDto);
-                    if (!viewerDto.isCompleted()){
-                    //    宸插埌姝e湪绛夊緟鎵ц鐨勮妭鐐癸紝鍚庨潰鐨勪笉瑕佷簡
+                    if (!viewerDto.isCompleted()) {
+                        //    宸插埌姝e湪绛夊緟鎵ц鐨勮妭鐐癸紝鍚庨潰鐨勪笉瑕佷簡
                         break;
                     }
                 }
@@ -1327,8 +1414,9 @@
 
     /**
      * 椤哄簭鎶藉彇鑺傜偣
-     * @param orderKeys 瀹瑰櫒
-     * @param sourceKey 婧�
+     *
+     * @param orderKeys    瀹瑰櫒
+     * @param sourceKey    婧�
      * @param flowElements 鎵�鏈夌殑鑺傜偣瀵硅薄
      */
     private void appendKeys(List<String> orderKeys, String sourceKey, List<FlowElement> flowElements) {
@@ -1337,9 +1425,9 @@
                 SequenceFlow sf = (SequenceFlow) flowElement;
                 String sourceRef = sf.getSourceRef();
                 String targetRef = sf.getTargetRef();
-                if (sourceKey.equals(sourceRef)&&targetRef!=null){
+                if (sourceKey.equals(sourceRef) && targetRef != null) {
                     orderKeys.add(targetRef);
-                    this.appendKeys(orderKeys,targetRef,flowElements);
+                    this.appendKeys(orderKeys, targetRef, flowElements);
                 }
             } catch (Exception e) {
                 continue;
@@ -1373,89 +1461,116 @@
      * @return
      */
     @Override
-    public Result getNextFlowNode(FlowTaskVo flowTaskVo) {
+    public Result<List<FlowNextDto>> getNextFlowNode(FlowTaskVo flowTaskVo) {
         // todo 浼间箮閫昏緫鏈啓瀹岋紝寰呮鏌�
-        FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues());
-        if (flowNextDto==null) {
+        List<FlowNextDto> nextDtoList = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues());
+        if (CollectionUtils.isEmpty(nextDtoList)) {
             return Result.OK("娴佺▼宸插畬缁�", null);
         }
-        return Result.OK(flowNextDto);
+        return Result.OK(nextDtoList);
+    }
+
+    @Override
+    public boolean checkParallelCompletion(String currentTaskId) {
+        //鑾峰彇褰撳墠浠诲姟
+        Task currentTask = taskService.createTaskQuery().taskId(currentTaskId).singleResult();
+        if (currentTask == null) {
+            return false;
+        }
+        //鑾峰彇褰撳墠鎵ц
+        Execution execution = runtimeService.createExecutionQuery().executionId(currentTask.getExecutionId()).singleResult();
+        if (execution == null) {
+            return false;
+        }
+        String parentId = execution.getParentId();
+        if (StringUtils.isBlank(parentId)) {
+            //娌℃湁鐖惰妭鐐� 浠h〃娌℃湁骞惰浠诲姟
+            return true;
+        }
+        // 鑾峰彇鎵�鏈夊厔寮熸墽琛�
+        List<Execution> siblingExecutions = runtimeService.createExecutionQuery()
+                .parentId(parentId)
+                .list();
+
+        for (Execution siblingExecution : siblingExecutions) {
+            if (!siblingExecution.getId().equals(execution.getId())) {
+                //闈炶嚜韬殑鍏勫紵鑺傜偣
+                long count = runtimeService.createActivityInstanceQuery().executionId(siblingExecution.getId()).unfinished().count();
+                if (count > 0) {
+                    return false;
+                }
+            }
+        }
+        return true;
     }
 
     /**
      * 鑾峰彇涓嬩竴涓妭鐐逛俊鎭�,娴佺▼瀹氫箟涓婄殑鑺傜偣淇℃伅
+     *
      * @param taskId 褰撳墠鑺傜偣id
      * @param values 娴佺▼鍙橀噺
      * @return 濡傛灉杩斿洖null锛岃〃绀烘病鏈変笅涓�涓妭鐐癸紝娴佺▼缁撴潫
      */
-    public FlowNextDto getNextFlowNode(String taskId, Map<String, Object> values) {
+    public List<FlowNextDto> getNextFlowNode(String taskId, Map<String, Object> values) {
         //褰撳墠鑺傜偣
         Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
         if (Objects.nonNull(task)) {
             // 涓嬩釜浠诲姟鑺傜偣
             List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values);
             if (CollectionUtils.isNotEmpty(nextUserTask)) {
-                FlowNextDto flowNextDto = new FlowNextDto();
+                List<FlowNextDto> nextDtoList = Lists.newArrayList();
+                FlowNextDto flowNextDto;
                 for (UserTask userTask : nextUserTask) {
+                    flowNextDto = new FlowNextDto();
                     flowNextDto.setUserTask(userTask);
                     //寰呭姙浜哄憳
                     List<SysUser> sysUserFromTask = this.getSysUserFromTask(userTask);
                     flowNextDto.setUserList(sysUserFromTask);
-
-                    MultiInstanceLoopCharacteristics   multiInstance =  userTask.getLoopCharacteristics();
-                    if (Objects.nonNull(multiInstance)) {
-                    //    浼氱  澶氬疄渚�
-                        String collectionString = multiInstance.getInputDataItem();
-                        Object colObj = values.get(collectionString);
-                        List<String> userNameList = null;
-                        if(colObj!=null){
-                            userNameList = (List) colObj;
-                        }
-                        if (CollUtil.isNotEmpty(userNameList)){
-                            // 寰呭姙浜哄憳浠庡彉閲忎腑鑾峰彇  鍚﹀垯灏辨槸鑺傜偣涓厤缃殑鐢ㄦ埛 sysUserFromTask
-                            List<SysUser> userList = Lists.newArrayList();
-                            for (String username : userNameList) {
-                                SysUser userByUsername = iFlowThirdService.getUserByUsername(username);
-                                if (userByUsername==null){
-                                    throw new CustomException(username + " 鐢ㄦ埛鍚嶆湭鎵惧埌");
-                                } else {
-                                    userList.add(userByUsername);
-                                }
+                    //澶氫换鍔″苟琛�
+                    Object colObj = values.get(userTask.getId());
+                    if (Objects.nonNull(colObj)) {
+                        List<String> userNameList = (List) colObj;
+                        // 寰呭姙浜哄憳浠庡彉閲忎腑鑾峰彇  鍚﹀垯灏辨槸鑺傜偣涓厤缃殑鐢ㄦ埛 sysUserFromTask
+                        List<SysUser> userList = Lists.newArrayList();
+                        for (String username : userNameList) {
+                            SysUser userByUsername = iFlowThirdService.getUserByUsername(username);
+                            if (userByUsername == null) {
+                                throw new CustomException(username + " 鐢ㄦ埛鍚嶆湭鎵惧埌");
+                            } else {
+                                userList.add(userByUsername);
                             }
-                            flowNextDto.setUserList(userList);
-                        } else {
-                            // 鍙橀噺涓病鏈変紶鍏ワ紝鍐欏叆鑺傜偣涓厤缃殑鐢ㄦ埛
-                            List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList());
-                            values.put(collectionString,collect_username);
                         }
+                        flowNextDto.setUserList(userList);
                     } else {
-                        // todo 璇诲彇鑷畾涔夎妭鐐瑰睘鎬у仛浜涘暐锛�
-                        //String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE);
-                        String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE);
+                        // 鍙橀噺涓病鏈変紶鍏ワ紝鍐欏叆鑺傜偣涓厤缃殑鐢ㄦ埛
+                        List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList());
+                        values.put(userTask.getId(), collect_username);
                     }
+                    nextDtoList.add(flowNextDto);
                 }
-                return flowNextDto;
+                return nextDtoList;
             }
         }
         return null;
 
     }
+
     public List<SysUser> getSysUserFromTask(UserTask userTask) {
         String assignee = userTask.getAssignee();
-        if (StrUtil.isNotBlank(assignee)){
+        if (StrUtil.isNotBlank(assignee)) {
             // 鎸囧畾鍗曚汉
             SysUser userByUsername = iFlowThirdService.getUserByUsername(assignee);
             return Lists.newArrayList(userByUsername);
         }
         List<String> candidateUsers = userTask.getCandidateUsers();
-        if (CollUtil.isNotEmpty(candidateUsers)){
+        if (CollUtil.isNotEmpty(candidateUsers)) {
             // 鎸囧畾澶氫汉
             List<SysUser> list = iFlowThirdService.getAllUser();
-            return list.stream().filter(o->candidateUsers.contains(o.getUsername())).collect(Collectors.toList());
+            return list.stream().filter(o -> candidateUsers.contains(o.getUsername())).collect(Collectors.toList());
         }
         List<String> candidateGroups = userTask.getCandidateGroups();
-        if (CollUtil.isNotEmpty(candidateGroups)){
-        //    鎸囧畾澶氱粍
+        if (CollUtil.isNotEmpty(candidateGroups)) {
+            //    鎸囧畾澶氱粍
             List<SysUser> userList = Lists.newArrayList();
             for (String candidateGroup : candidateGroups) {
                 List<SysUser> usersByRoleId = iFlowThirdService.getUsersByRoleId(candidateGroup);
@@ -1465,6 +1580,7 @@
         }
         return Lists.newArrayList();
     }
+
     /**
      * 娴佺▼瀹屾垚鏃堕棿澶勭悊
      *

--
Gitblit v1.9.3