fanxp 1 ano atrás
pai
commit
4e541d5de7

+ 0 - 6
src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java

@@ -133,12 +133,6 @@ public class WorkflowExecuteController {
         return R.ok(workflowExecuteService.newApprove(dto));
     }
 
-    @PostMapping("/is-choose-approve")
-    @ApiOperation(value = "判断当前流程是否需要选择人员审批")
-    public R isChooseApprove(@Valid @RequestBody IsChooseApproveDto dto) {
-        return R.ok(workflowExecuteService.isChooseApprove(dto));
-    }
-
     @GetMapping("/check-audited")
     @ApiOperation(value = "检查是否已经审核")
     public R checkAudited(@RequestParam String taskId) {

+ 0 - 2
src/main/java/com/xjrsoft/module/workflow/listener/TaskDelegate.java

@@ -535,8 +535,6 @@ public class TaskDelegate implements TaskListener {
 
         IWorkflowExtraService workflowExtraService = SpringUtil.getBean(IWorkflowExtraService.class);
         workflowExtraService.save(extra);
-
-
     }
 
 

+ 47 - 47
src/main/java/com/xjrsoft/module/workflow/listener/TaskTimeoutListener.java

@@ -2,7 +2,6 @@ package com.xjrsoft.module.workflow.listener;
 
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.convert.Convert;
-import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
@@ -13,7 +12,10 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.oa.utils.SendMessageUtil;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
 import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.model.*;
+import com.xjrsoft.module.workflow.model.MemberConfig;
+import com.xjrsoft.module.workflow.model.NoticePolicyParam;
+import com.xjrsoft.module.workflow.model.TimeoutRemidConfig;
+import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
 import com.xjrsoft.module.workflow.service.IWorkflowSchemaService;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
@@ -26,8 +28,6 @@ import org.springframework.data.redis.listener.KeyExpirationEventMessageListener
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -67,49 +67,49 @@ public class TaskTimeoutListener extends KeyExpirationEventMessageListener {
 //            taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
 
             // 驳回
-            workflowExecuteService.dealTimeoutTask(1, taskId);
-
-            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-            if (list.size() == 1) {
-                Task currentTask = list.get(0);
-                //获取到审批人 发送消息
-                Object approvedIds = taskService.getVariableLocal(currentTask.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-
-                List<String> variableNames = ListUtil.toList(
-                        WorkflowConstant.PROCESS_SCHEMA_ID_KEY,
-                        WorkflowConstant.PROCESS_SCHEMA_NAME_KEY,
-                        WorkflowConstant.PROCESS_START_USER_NAME_KEY);
-
-                Map<String, Object> variables = taskService.getVariables(currentTask.getId(), variableNames);
-
-                Long schemaId = Convert.toLong(taskService.getVariable(currentTask.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-
-                IWorkflowSchemaService workflowSchemaService = SpringUtil.getBean(IWorkflowSchemaService.class);
-                WorkflowSchema workflowSchema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(WorkflowSchema::getJsonContent));
-
-                WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-                Map<String, Object> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(currentTask.getTaskDefinitionKey())).findFirst().orElse(new HashMap<>());
-                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap);
-
-                List<String> approveIds = ListUtil.toList(Convert.toStr(approvedIds).split(StringPool.COMMA));
-
-                NoticePolicyParam param = new NoticePolicyParam();
-                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
-                param.setTaskId(currentTask.getId());
-                param.setTaskName(currentTask.getName());
-                param.setProcessId(currentTask.getProcessInstanceId());
-                param.setTaskName(currentTask.getName());
-                param.setSchemaId(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
-                param.setSchemaName(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
-                param.setStartUserName(MapUtil.get(variables, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
-                // 默认强制推送微信消息
-                param.setNoticePolicyConfigs(new ArrayList(){{
-                    add(WorkflowNoticePolicyType.WECHAT.getCode());
-                }});
-                //超时消息
-                WorkFlowUtil.sendTimeOutNoticePolicy(param, "由于审批超时,系统自动驳回审批");
-            }
+//            workflowExecuteService.dealTimeoutTask(1, taskId);
+//
+//            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
+//            if (list.size() == 1) {
+//                Task currentTask = list.get(0);
+//                //获取到审批人 发送消息
+//                Object approvedIds = taskService.getVariableLocal(currentTask.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
+//
+//                List<String> variableNames = ListUtil.toList(
+//                        WorkflowConstant.PROCESS_SCHEMA_ID_KEY,
+//                        WorkflowConstant.PROCESS_SCHEMA_NAME_KEY,
+//                        WorkflowConstant.PROCESS_START_USER_NAME_KEY);
+//
+//                Map<String, Object> variables = taskService.getVariables(currentTask.getId(), variableNames);
+//
+//                Long schemaId = Convert.toLong(taskService.getVariable(currentTask.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
+//
+//                IWorkflowSchemaService workflowSchemaService = SpringUtil.getBean(IWorkflowSchemaService.class);
+//                WorkflowSchema workflowSchema = workflowSchemaService.getOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(WorkflowSchema::getJsonContent));
+//
+//                WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
+//
+//                Map<String, Object> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(currentTask.getTaskDefinitionKey())).findFirst().orElse(new HashMap<>());
+//                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap);
+//
+//                List<String> approveIds = ListUtil.toList(Convert.toStr(approvedIds).split(StringPool.COMMA));
+//
+//                NoticePolicyParam param = new NoticePolicyParam();
+//                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
+//                param.setTaskId(currentTask.getId());
+//                param.setTaskName(currentTask.getName());
+//                param.setProcessId(currentTask.getProcessInstanceId());
+//                param.setTaskName(currentTask.getName());
+//                param.setSchemaId(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
+//                param.setSchemaName(MapUtil.get(variables, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
+//                param.setStartUserName(MapUtil.get(variables, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
+//                // 默认强制推送微信消息
+//                param.setNoticePolicyConfigs(new ArrayList(){{
+//                    add(WorkflowNoticePolicyType.WECHAT.getCode());
+//                }});
+//                //超时消息
+//                WorkFlowUtil.sendTimeOutNoticePolicy(param, "由于审批超时,系统自动驳回审批");
+//            }
 
             return;
         }

+ 0 - 5
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java

@@ -106,11 +106,6 @@ public interface IWorkflowExecuteService {
      */
     Page<PendingTaskVo> myExamine(Page<PendingTaskVo> page, MyExaminePageDto dto);
 
-    /**
-     * 判断当前流程是否需要选择人员审批
-     */
-    List<LaunchAndApproveVo> isChooseApprove(IsChooseApproveDto dto);
-
     /**
      * 审批
      */

+ 74 - 61
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -349,7 +349,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         if (!taskNodeConfigMap.isPresent()) {
             throw new MyException("找不到当前节点的配置信息!");
         }
-        if(taskNodeConfigMap.get().get("styleType") != null){
+        if (taskNodeConfigMap.get().get("styleType") != null) {
             vo.setStyleType(Integer.parseInt(taskNodeConfigMap.get().get("styleType").toString()));
         }
 
@@ -382,10 +382,10 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
                 templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
             }
-            if(formInfoVo.getFormData().containsKey("document_level") && formInfoVo.getFormData().containsKey("emergency_level")){
+            if (formInfoVo.getFormData().containsKey("document_level") && formInfoVo.getFormData().containsKey("emergency_level")) {
                 Object id = formInfoVo.getFormData().get("id");
                 OfficialDocumentReceived received = officialdocumentreceivedmapper.selectById(id.toString());
-                if(received != null){
+                if (received != null) {
                     formInfoVo.getFormData().computeIfAbsent("document_level", k -> received.getDocumentLevel());
                     formInfoVo.getFormData().computeIfAbsent("emergency_level", k -> received.getEmergencyLevel());
                 }
@@ -619,7 +619,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 if (!taskNodeConfigMap.isPresent()) {
                     throw new MyException("找不到当前节点的配置信息!");
                 }
-                if(taskNodeConfigMap.get().get("styleType") != null){
+                if (taskNodeConfigMap.get().get("styleType") != null) {
                     vo.setStyleType(Integer.parseInt(taskNodeConfigMap.get().get("styleType").toString()));
                 }
 
@@ -1610,7 +1610,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 //            List<Task> tasks = taskQuery.orderByTaskCreateTime().desc().listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
 //            taskIds = tasks.stream().map(Task::getId).collect(Collectors.toList());
 //        }
-        if(!taskIds.isEmpty()){
+        if (!taskIds.isEmpty()) {
             dto.setTaskIds(taskIds);
             return xjrWorkflowExtraMapper.myApproveRecord(page, dto);
         }
@@ -1618,40 +1618,6 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return new Page<>();
     }
 
-    /**
-     * 判断当前流程是否需要选择人员审批
-     */
-    public List<LaunchAndApproveVo> isChooseApprove(IsChooseApproveDto dto){
-        //根据taskid  获取任务信息
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-
-        //获取当前任务变量中的  schemaId
-        Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = null;
-        // TODO 判断当前流程是否发生了变更
-        if (workflowSchema.getDefinitionId().equals(task.getProcessDefinitionId())) {
-            workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-        } else {
-            WorkflowSchemaHistory workflowSchemaHistory = workflowSchemaHistoryMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchemaHistory.class).eq(WorkflowSchemaHistory::getDefinitionId, task.getProcessDefinitionId()));
-            if (workflowSchemaHistory == null) {
-                throw new MyException("流转历史记录已丢失!");
-            }
-            workflowSchemaConfig = JSONUtil.toBean(workflowSchemaHistory.getJsonContent(), WorkflowSchemaConfig.class);
-        }
-        List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-        List<LaunchAndApproveVo> result = new ArrayList<>();
-        //如果是同意  || 拒绝  || 其他  默认都是流程往下走
-        if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.OTHER.getCode()) {
-            result = isPrevChooseApprove(workflowSchemaConfig, list, null);
-        }
-        return result;
-    }
-
     @Override
     @SneakyThrows
     @Transactional(rollbackFor = Exception.class)
@@ -1974,13 +1940,13 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //新增流程自定义发起流程记录
                 XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
                 xjrWorkflowOperateRecord.setNodeId(task.getId());
-                if(userTaskConfig.getShowNode() != null){
-                    if(userTaskConfig.getShowNode()){
+                if (userTaskConfig.getShowNode() != null) {
+                    if (userTaskConfig.getShowNode()) {
                         xjrWorkflowOperateRecord.setShowNode(1);
-                    }else{
+                    } else {
                         xjrWorkflowOperateRecord.setShowNode(0);
                     }
-                }else{
+                } else {
                     xjrWorkflowOperateRecord.setShowNode(1);
                 }
                 xjrWorkflowOperateRecord.setNodeName(task.getName());
@@ -2688,7 +2654,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
     /**
      * 根据taskid发送审核通知
      */
-    private void sendApproveNoticePolicy(String taskId){
+    private void sendApproveNoticePolicy(String taskId) {
         //获取到审批人 发送消息
         Object approvedIds = taskService.getVariableLocal(taskId, WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
 
@@ -2726,7 +2692,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         param.setStartUserName(MapUtil.get(variables, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
         param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
         //发送消息
-        WorkFlowUtil.sendApproveNoticePolicy(param,task.getName());
+        WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
     }
 
     @Override
@@ -3310,7 +3276,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                         .orderByDesc(WorkflowCirculated::getCreateTime)
                         .like(StrUtil.isNotBlank(dto.getTaskName()), WorkflowCirculated::getTaskName, dto.getTaskName())
                         .like(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .and(StrUtil.isNotBlank(dto.getKeyword()),wp -> wp.like(WorkflowSchema::getName, dto.getKeyword())
+                        .and(StrUtil.isNotBlank(dto.getKeyword()), wp -> wp.like(WorkflowSchema::getName, dto.getKeyword())
                                 .or()
                                 .like(WorkflowCirculated::getTaskName, dto.getKeyword())
                                 .or()
@@ -3462,7 +3428,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class)
                     .in(WorkflowExtra::getProcessId, processIds)
-                    .and(StrUtil.isNotBlank(dto.getKeyword()),wp -> wp.like(WorkflowExtra::getSchemaName, dto.getKeyword())
+                    .and(StrUtil.isNotBlank(dto.getKeyword()), wp -> wp.like(WorkflowExtra::getSchemaName, dto.getKeyword())
                             .or()
                             .like(WorkflowExtra::getTaskName, dto.getKeyword())
                             .or()
@@ -3493,7 +3459,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                                     new QueryWrapper<WorkflowApproveRecord>().lambda()
                                             .eq(WorkflowApproveRecord::getProcessId, e.getProcessId())
                             );
-                            if(list.size() > 0){
+                            if (list.size() > 0) {
                                 vo.setIsApproval(1);
                             }
                             //如果是已经完成的任务 默认是100进度
@@ -4594,9 +4560,9 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             recordListVo.setComment(workflowOperateRecord.getOperateInfo());
             recordListVo.setStartTime(workflowOperateRecord.getRecordTime());
 
-            if(workflowOperateRecord.getShowNode() != null && workflowOperateRecord.getShowNode() == 0){
+            if (workflowOperateRecord.getShowNode() != null && workflowOperateRecord.getShowNode() == 0) {
                 recordListVo.setShowNode(false);
-            }else if(workflowOperateRecord.getShowNode() != null && workflowOperateRecord.getShowNode() == 1){
+            } else if (workflowOperateRecord.getShowNode() != null && workflowOperateRecord.getShowNode() == 1) {
                 recordListVo.setShowNode(true);
             }
 
@@ -5547,6 +5513,28 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     .asc()
                     .list();
 
+            // 该流程实例的所有走过的task
+//            List<HistoricTaskInstance> taskInstanceList = historyService.createHistoricTaskInstanceQuery()
+//                    .processInstanceId(task.getProcessInstanceId())
+//                    .taskId()
+//                    .finished()
+//                    .orderByHistoricTaskInstanceEndTime()
+//                    .asc()
+//                    .singleResult();
+//            for (HistoricTaskInstance h : taskInstanceList) {
+//                Map<String, Object> variables = new HashMap<>();
+//                // 获取act_hi_detail表中的信息,但是HistoricDetail还没有包含变量信息
+//                List<HistoricDetail> details = historyService.createHistoricDetailQuery()
+//                        .variableUpdates()
+//                        .activityInstanceId(h.getActivityInstanceId())// 使用activityInstanceId可以获取到每个节点对应的detail信息
+//                        .list();
+//                for (HistoricDetail historicDetail : details) {
+//                    // 所以需要将HistoricDetail转换为HistoricVariableUpdate才可以获取到variables
+//                    HistoricVariableUpdate historicVariableUpdate = (HistoricVariableUpdate) historicDetail;
+//                    variables.put(historicVariableUpdate.getVariableName(), historicVariableUpdate.getValue());
+//                }
+//            }
+
             if (null == resultList || resultList.size() == 0) {
                 throw new MyException("当前任务之前不存在用户任务无法驳回!");
             }
@@ -5564,6 +5552,28 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             }
             String toActId = lastNode.get("toActId");
             String assignee = lastNode.get("assignee");
+            String lastTaskId = lastNode.get("taskId");
+            // 获取历史任务信息
+            HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
+                    .processInstanceId(task.getProcessInstanceId())
+                    .taskId(lastTaskId)
+                    .finished()
+                    .orderByHistoricTaskInstanceEndTime()
+                    .asc()
+                    .singleResult();
+            // 获取act_hi_detail表中的信息,但是HistoricDetail还没有包含变量信息
+            List<HistoricDetail> details = historyService.createHistoricDetailQuery()
+                    .variableUpdates()
+                    .activityInstanceId(historicTaskInstance.getActivityInstanceId())// 使用activityInstanceId可以获取到每个节点对应的detail信息
+                    .list();
+            Map<String, Object> variables = new HashMap<>();
+            for (HistoricDetail historicDetail : details) {
+                // 所以需要将HistoricDetail转换为HistoricVariableUpdate才可以获取到variables
+                HistoricVariableUpdate historicVariableUpdate = (HistoricVariableUpdate) historicDetail;
+                variables.put(historicVariableUpdate.getVariableName(), historicVariableUpdate.getValue());
+            }
+            assignee = variables.get("assignee").toString();
+
             //设置流程中的可变参数
             Map<String, Object> taskVariable = new HashMap<>(2);
             taskVariable.put("user", assignee);
@@ -5687,15 +5697,15 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         for (ProcessRecordListVo p : processRecordListVos) {
             String comment = p.getComment();
             String approveComment = "";
-            if(!"".equals(comment) && comment != null){
-                approveComment = comment.substring(comment.indexOf("审批内容:")+5).replaceAll(", 未达到会签完成条件", "");
+            if (!"".equals(comment) && comment != null) {
+                approveComment = comment.substring(comment.indexOf("审批内容:") + 5).replaceAll(", 未达到会签完成条件", "");
             }
 
             String[] commentArr = comment.split(",");
             if (commentArr.length > 1) {
                 String[] approveUserNameArr = commentArr[0].split(":");
                 String[] approveResultArr = commentArr[1].split(":");
-                if(approveResultArr.length > 1 && "驳回".equals(approveResultArr[1])){
+                if (approveResultArr.length > 1 && "驳回".equals(approveResultArr[1])) {
                     continue;
                 }
                 String[] approveCommentArr = commentArr[2].split(":");
@@ -5844,10 +5854,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             HistoricActivityInstance historicActivityInstance = resultList.get(originSize - 1);
             backNode.put("toActId", historicActivityInstance.getActivityId());
             backNode.put("assignee", historicActivityInstance.getAssignee());
+            backNode.put("taskId", historicActivityInstance.getTaskId());
             return backNode;
         }
         //情况2、当前节点在历史节点里(已回退过的)
-        return currentNodeInHis(linkedHashMap, currentActivityId);
+        return currentNodeInHis(resultList, currentActivityId);
     }
 
     private String getInstanceIdForActivity(ActivityInstance activityInstance, String activityId) {
@@ -5871,18 +5882,20 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return null;
     }
 
-    private static Map<String, String> currentNodeInHis(LinkedHashMap<String, String> linkedHashMap, String currentActivityId) {
+    private static Map<String, String> currentNodeInHis(List<HistoricActivityInstance> resultList, String currentActivityId) {
         //情况2、当前节点在历史节点里(已回退过的)
         Map<String, String> backNode = new HashMap<>();
-        ListIterator<Map.Entry<String, String>> li = new ArrayList<>(linkedHashMap.entrySet()).listIterator();
+//        ListIterator<Map.Entry<String, String>> li = new ArrayList<>(linkedHashMap.entrySet()).listIterator();
+        ListIterator<HistoricActivityInstance> li = resultList.listIterator();
         //System.out.println("已回退过的");
         while (li.hasNext()) {
-            Map.Entry<String, String> entry = li.next();
-            if (currentActivityId.equals(entry.getKey())) {
+            HistoricActivityInstance entry = li.next();
+            if (currentActivityId.equals(entry.getActivityId())) {
                 li.previous();
-                Map.Entry<String, String> previousEntry = li.previous();
-                backNode.put("toActId", previousEntry.getKey());
-                backNode.put("assignee", previousEntry.getValue());
+                HistoricActivityInstance previousEntry = li.previous();
+                backNode.put("toActId", previousEntry.getActivityId());
+                backNode.put("assignee", previousEntry.getAssignee());
+                backNode.put("taskId", previousEntry.getTaskId());
                 return backNode;
             }
         }