5
0

2 Коммиты f2c608feeb ... 713eb4bf38

Автор SHA1 Сообщение Дата
  fanxp 713eb4bf38 Merge remote-tracking branch 'origin/dev' into dev 2 месяцев назад
  fanxp 9682979dee workflow 2 месяцев назад

+ 0 - 0
http-nio-8080-exec-10temp.jpeg


+ 15 - 1
src/main/java/com/xjrsoft/common/enums/WorkflowApproveType.java

@@ -26,7 +26,12 @@ public enum WorkflowApproveType {
     /**
      * 其他(用户自定义)
      */
-    OTHER(4, "其他(用户自定义)");
+    OTHER(4, "其他(用户自定义)"),
+
+    /**
+     * 撤回
+     */
+    WITHDRAW(5, "撤回");
 
 
 
@@ -45,4 +50,13 @@ public enum WorkflowApproveType {
         this.code = code;
         this.value = message;
     }
+
+    public static WorkflowApproveType fromCode(int code) {
+        for (WorkflowApproveType color : WorkflowApproveType.values()) {
+            if (color.getCode() == code) {
+                return color;
+            }
+        }
+        throw new IllegalArgumentException("Invalid code: " + code);
+    }
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/form/service/impl/FormExecuteServiceImpl.java

@@ -1277,7 +1277,7 @@ public class FormExecuteServiceImpl implements IFormExecuteService {
                 findwhere.putAll(entity);
                 Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(tableName, findwhere);
                 Boolean isUpdate = false;
-                if (objectMap == null) {
+                if (objectMap != null) {
                     isUpdate = true;
                 }
 

+ 22 - 0
src/main/java/com/xjrsoft/module/workflow/entity/WorkflowFormRelation.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * <p>
@@ -40,4 +41,25 @@ public class WorkflowFormRelation implements Serializable {
     @ApiModelProperty("表单数据id")
     private String formKeyValue;
 
+    /**
+     * 当前状态
+     * STATE_ACTIVE-正在运行的流程实例
+     * STATE_SUSPENDED-挂起的流程实例
+     * STATE_COMPLETED-通过正常结束事件完成
+     * STATE_EXTERNALLY_TERMINATED-外部终止,例如通过REST API终止
+     * STATEINTERNALY_TERMINATED-内部终止,例如通过终止边界事件
+     */
+    @ApiModelProperty("当前状态")
+    private String currentState;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty("结束时间")
+    private Date endTime;
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/workflow/entity/WorkflowRecord.java

@@ -56,4 +56,10 @@ public class WorkflowRecord implements Serializable {
 
     @TableField(fill = FieldFill.INSERT)
     private Long createUserId;
+
+    /**
+     * 工作流审批类型
+     */
+    @ApiModelProperty("工作流审批类型")
+    private Integer workflowApproveType;
 }

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

@@ -62,8 +62,10 @@ import com.xjrsoft.module.workflow.vo.StartProcessInfoVo;
 import com.xjrsoft.module.workflow.vo.TaskInfoVo;
 import com.xjrsoft.module.workflow.vo.UserDefinedProcessRecordListVo;
 import com.xjrsoft.module.workflow.vo.UserTaskInfoVo;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @Author: tzx
@@ -71,6 +73,11 @@ import java.util.List;
  */
 public interface IWorkflowExecuteService {
 
+    /**
+     * 获取流程当前状态
+     */
+    Optional<HistoricProcessInstance> getHistoricProcessInstance(String processInstanceId);
+
     /**
      * 部署
      *

+ 4 - 0
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowFormRelationService.java

@@ -13,4 +13,8 @@ import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
  */
 public interface IWorkflowFormRelationService extends IService<WorkflowFormRelation> {
 
+    /**
+     * 更新流程状态
+     */
+    boolean updateCurrentState(WorkflowFormRelation relation);
 }

+ 0 - 1
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowRecordService.java

@@ -12,5 +12,4 @@ import com.xjrsoft.module.workflow.entity.WorkflowRecord;
  * @since 2022-11-10
  */
 public interface IWorkflowRecordService extends IService<WorkflowRecord> {
-
 }

+ 116 - 177
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -13,7 +13,6 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.db.Session;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -29,17 +28,7 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.enums.FormTemplateType;
-import com.xjrsoft.common.enums.WorkflowApproveType;
-import com.xjrsoft.common.enums.WorkflowAutoAgreeType;
-import com.xjrsoft.common.enums.WorkflowIsPrevChooseNextType;
-import com.xjrsoft.common.enums.WorkflowIsRecycleType;
-import com.xjrsoft.common.enums.WorkflowMultiInstanceFinishType;
-import com.xjrsoft.common.enums.WorkflowMultiInstanceType;
-import com.xjrsoft.common.enums.WorkflowNoHandlerType;
-import com.xjrsoft.common.enums.WorkflowRelationAuthType;
-import com.xjrsoft.common.enums.YesOrNoEnum;
+import com.xjrsoft.common.enums.*;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.page.ConventPage;
@@ -65,114 +54,13 @@ import com.xjrsoft.module.system.entity.Stamp;
 import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.system.service.IStampService;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
-import com.xjrsoft.module.workflow.dto.AddOrSubSignDto;
-import com.xjrsoft.module.workflow.dto.ApproveDto;
-import com.xjrsoft.module.workflow.dto.ApproveMultiDto;
-import com.xjrsoft.module.workflow.dto.ApproveMultiInfoDto;
-import com.xjrsoft.module.workflow.dto.ApproveRecordListDto;
-import com.xjrsoft.module.workflow.dto.ApproveUserDto;
-import com.xjrsoft.module.workflow.dto.ApproveUserMultiDto;
-import com.xjrsoft.module.workflow.dto.CirculatedTaskPageDto;
-import com.xjrsoft.module.workflow.dto.DeployDto;
-import com.xjrsoft.module.workflow.dto.DraftPageDto;
-import com.xjrsoft.module.workflow.dto.FinishedTaskPageDto;
-import com.xjrsoft.module.workflow.dto.FormFinishedTaskDto;
-import com.xjrsoft.module.workflow.dto.GetAssigneeDto;
-import com.xjrsoft.module.workflow.dto.LaunchDto;
-import com.xjrsoft.module.workflow.dto.LaunchRelationTaskDto;
-import com.xjrsoft.module.workflow.dto.MonitorPageDto;
-import com.xjrsoft.module.workflow.dto.MoveRecycleDto;
-import com.xjrsoft.module.workflow.dto.MyExaminePageDto;
-import com.xjrsoft.module.workflow.dto.MyProcessPageDto;
-import com.xjrsoft.module.workflow.dto.PendingTaskPageDto;
-import com.xjrsoft.module.workflow.dto.ReLaunchDto;
-import com.xjrsoft.module.workflow.dto.RecycleDeleteDto;
-import com.xjrsoft.module.workflow.dto.RecycleProcessPageDto;
-import com.xjrsoft.module.workflow.dto.RejectNodeDto;
-import com.xjrsoft.module.workflow.dto.RelationTaskInfoDto;
-import com.xjrsoft.module.workflow.dto.RelationTaskPageDto;
-import com.xjrsoft.module.workflow.dto.RestartDto;
-import com.xjrsoft.module.workflow.dto.SaveDraftDto;
-import com.xjrsoft.module.workflow.dto.SetAssigneeDto;
-import com.xjrsoft.module.workflow.dto.SetSuspendedDto;
-import com.xjrsoft.module.workflow.dto.TransferDto;
-import com.xjrsoft.module.workflow.dto.UpdateDraftDto;
-import com.xjrsoft.module.workflow.dto.WithdrawDto;
-import com.xjrsoft.module.workflow.entity.WorkflowApproveRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowCirculated;
-import com.xjrsoft.module.workflow.entity.WorkflowDelegate;
-import com.xjrsoft.module.workflow.entity.WorkflowDraft;
-import com.xjrsoft.module.workflow.entity.WorkflowExtra;
-import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
-import com.xjrsoft.module.workflow.entity.WorkflowRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.entity.WorkflowSchemaHistory;
-import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
-import com.xjrsoft.module.workflow.mapper.WorkflowDelegateMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowSchemaHistoryMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowSchemaMapper;
-import com.xjrsoft.module.workflow.mapper.XjrWorkflowExtraMapper;
-import com.xjrsoft.module.workflow.mapper.XjrWorkflowOperateRecordMapper;
-import com.xjrsoft.module.workflow.model.ApiConfig;
-import com.xjrsoft.module.workflow.model.ApiRequestParamsConfig;
-import com.xjrsoft.module.workflow.model.AuthConfig;
-import com.xjrsoft.module.workflow.model.ButtonConfig;
-import com.xjrsoft.module.workflow.model.FormAssignmentConfig;
-import com.xjrsoft.module.workflow.model.FormConfig;
-import com.xjrsoft.module.workflow.model.MemberConfig;
-import com.xjrsoft.module.workflow.model.NoticePolicyParam;
-import com.xjrsoft.module.workflow.model.ProcessParamConfig;
-import com.xjrsoft.module.workflow.model.RelationProcessConfig;
-import com.xjrsoft.module.workflow.model.StartNodeConfig;
-import com.xjrsoft.module.workflow.model.UserTaskConfig;
-import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
-import com.xjrsoft.module.workflow.service.IWorkflowApproveRecordService;
-import com.xjrsoft.module.workflow.service.IWorkflowCirculatedService;
-import com.xjrsoft.module.workflow.service.IWorkflowDraftService;
-import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
-import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
-import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
-import com.xjrsoft.module.workflow.service.IWorkflowRecordService;
-import com.xjrsoft.module.workflow.service.IWorkflowSchemaService;
-import com.xjrsoft.module.workflow.service.IXjrWorkflowOperateRecordService;
+import com.xjrsoft.module.workflow.dto.*;
+import com.xjrsoft.module.workflow.entity.*;
+import com.xjrsoft.module.workflow.mapper.*;
+import com.xjrsoft.module.workflow.model.*;
+import com.xjrsoft.module.workflow.service.*;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
-import com.xjrsoft.module.workflow.vo.AllRecordListVo;
-import com.xjrsoft.module.workflow.vo.ApproveMultiInfoVo;
-import com.xjrsoft.module.workflow.vo.ApproveMultiVo;
-import com.xjrsoft.module.workflow.vo.CirculatedTaskPageVo;
-import com.xjrsoft.module.workflow.vo.DraftInfoVo;
-import com.xjrsoft.module.workflow.vo.DraftPageVo;
-import com.xjrsoft.module.workflow.vo.FinishedTaskPageVo;
-import com.xjrsoft.module.workflow.vo.FinishedTaskVo;
-import com.xjrsoft.module.workflow.vo.FormFinishedTaskVo;
-import com.xjrsoft.module.workflow.vo.GetAssigneeVo;
-import com.xjrsoft.module.workflow.vo.GetCountVo;
-import com.xjrsoft.module.workflow.vo.HistoryTaskVo;
-import com.xjrsoft.module.workflow.vo.LaunchAndApproveVo;
-import com.xjrsoft.module.workflow.vo.MonitorPageVo;
-import com.xjrsoft.module.workflow.vo.MyProcessPageVo;
-import com.xjrsoft.module.workflow.vo.PendingTaskVo;
-import com.xjrsoft.module.workflow.vo.ProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.ProcessRecordListVo;
-import com.xjrsoft.module.workflow.vo.RecycleProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.RecycleProcessPageVo;
-import com.xjrsoft.module.workflow.vo.RejectNodeVo;
-import com.xjrsoft.module.workflow.vo.RelationFormInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskPageVo;
-import com.xjrsoft.module.workflow.vo.RestartVo;
-import com.xjrsoft.module.workflow.vo.StartNodeFormInfoVo;
-import com.xjrsoft.module.workflow.vo.StartProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.StartProcessRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserDefinedProcessRecordListVo;
-import com.xjrsoft.module.workflow.vo.UserTaskFormInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.WorkflowSchemaInfoVo;
+import com.xjrsoft.module.workflow.vo.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -182,14 +70,7 @@ import org.camunda.bpm.engine.HistoryService;
 import org.camunda.bpm.engine.RepositoryService;
 import org.camunda.bpm.engine.RuntimeService;
 import org.camunda.bpm.engine.TaskService;
-import org.camunda.bpm.engine.history.HistoricActivityInstance;
-import org.camunda.bpm.engine.history.HistoricDetail;
-import org.camunda.bpm.engine.history.HistoricProcessInstance;
-import org.camunda.bpm.engine.history.HistoricProcessInstanceQuery;
-import org.camunda.bpm.engine.history.HistoricTaskInstance;
-import org.camunda.bpm.engine.history.HistoricTaskInstanceQuery;
-import org.camunda.bpm.engine.history.HistoricVariableInstance;
-import org.camunda.bpm.engine.history.HistoricVariableUpdate;
+import org.camunda.bpm.engine.history.*;
 import org.camunda.bpm.engine.impl.persistence.entity.HistoricVariableInstanceEntity;
 import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;
 import org.camunda.bpm.engine.repository.Deployment;
@@ -211,17 +92,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.ssssssss.magicapi.core.service.MagicAPIService;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -437,7 +308,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 .select(WorkflowCirculated::getId);
 
         WorkflowCirculated thisCirculated = circulatedService.getOne(queryWrapper2);
-        if(thisCirculated != null){
+        if (thisCirculated != null) {
             thisCirculated.setIsRead(YesOrNoEnum.YES.getCode());
             circulatedService.updateById(thisCirculated);
         }
@@ -690,7 +561,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 .select(WorkflowCirculated::getId);
 
         WorkflowCirculated thisCirculated = circulatedService.getOne(queryWrapper2);
-        if(thisCirculated != null){
+        if (thisCirculated != null) {
             thisCirculated.setIsRead(YesOrNoEnum.YES.getCode());
             circulatedService.updateById(thisCirculated);
         }
@@ -1406,9 +1277,16 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             updateFileInfo(dto.getFileFolderIds(), processInstance.getId());
 
+            Optional<HistoricProcessInstance> historicProcessInstance = getHistoricProcessInstance(processInstance.getId());
+
             //保存 流程 表单 关联 数据
             for (WorkflowFormRelation relation : relations) {
                 relation.setProcessId(processInstance.getId());
+                historicProcessInstance.ifPresent(x -> {
+                    relation.setCurrentState(x.getState());
+                    relation.setStartTime(x.getStartTime());
+                    relation.setEndTime(x.getEndTime());
+                });
             }
 
             formRelationService.saveBatch(relations);
@@ -1424,6 +1302,21 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
     }
 
+    /**
+     * 获取流程当前状态
+     */
+    @Override
+    public Optional<HistoricProcessInstance> getHistoricProcessInstance(String processInstanceId) {
+        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery();
+        historicProcessInstanceQuery.processInstanceId(processInstanceId);
+        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.list();
+        // 更新流程状态
+        if (!historicProcessInstances.isEmpty()) {
+            return historicProcessInstances.stream().findFirst();
+        }
+        return Optional.empty();
+    }
+
     @Override
     @SneakyThrows
     @Transactional(rollbackFor = Exception.class)
@@ -1555,9 +1448,16 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             updateFileInfo(dto.getFileFolderIds(), processInstance.getId());
 
+            Optional<HistoricProcessInstance> historicProcessInstance = getHistoricProcessInstance(processInstance.getId());
+
             //保存 流程 表单 关联 数据
             for (WorkflowFormRelation relation : relations) {
                 relation.setProcessId(processInstance.getId());
+                historicProcessInstance.ifPresent(x -> {
+                    relation.setCurrentState(x.getState());
+                    relation.setStartTime(x.getStartTime());
+                    relation.setEndTime(x.getEndTime());
+                });
             }
 
             formRelationService.saveBatch(relations);
@@ -1569,7 +1469,6 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 session.close();
             }
 
-            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
             List<HistoricProcessInstance> childProcessinstance = historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(dto.getProcessId()).list();
 
             for (HistoricProcessInstance processInstance1 : childProcessinstance) {
@@ -1707,21 +1606,21 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 });
                 //查询审批记录中的驳回记录是否有驳回(最后一条)或者自动驳回(倒数第二条)
                 List<WorkflowRecord> recordList = workflowRecordMapper.selectList(
-                    new QueryWrapper<WorkflowRecord>().lambda()
-                    .eq(WorkflowRecord::getProcessId, task.getProcessInstanceId())
+                        new QueryWrapper<WorkflowRecord>().lambda()
+                                .eq(WorkflowRecord::getProcessId, task.getProcessInstanceId())
                 );
-                if(!recordList.isEmpty() && recordList.size() > 1){
+                if (!recordList.isEmpty() && recordList.size() > 1) {
                     String comment = recordList.get(recordList.size() - 1).getMessage();
-                    if(comment.contains("【驳回】")){
+                    if (comment.contains("【驳回】")) {
                         User rejectUser = userService.getById(recordList.get(recordList.size() - 1).getCreateUserId());
                         vo.setRejectState(rejectUser.getName() + "驳回");
-                    }else if(comment.contains("自动驳回")){
+                    } else if (comment.contains("自动驳回")) {
                         vo.setRejectState("系统自动驳回");
                     }
                 }
-                if(!recordList.isEmpty() && recordList.size() > 2){
+                if (!recordList.isEmpty() && recordList.size() > 2) {
                     String comment2 = recordList.get(recordList.size() - 2).getMessage();
-                    if(comment2.contains("自动驳回")){
+                    if (comment2.contains("自动驳回")) {
                         vo.setRejectState("系统自动驳回");
                     }
                 }
@@ -1941,6 +1840,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
         List<LaunchAndApproveVo> result = new ArrayList<>();
 
+        Optional<HistoricProcessInstance> historicProcessInstance = getHistoricProcessInstance(task.getProcessInstanceId());
+
         try {
             for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
 
@@ -1972,6 +1873,12 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     relation.setFormKey(formConfig.getKey());
                     relation.setFormKeyValue(sessionLongLongTriple.getRight().toString());
 
+                    historicProcessInstance.ifPresent(x -> {
+                        relation.setCurrentState(x.getState());
+                        relation.setStartTime(x.getStartTime());
+                        relation.setEndTime(x.getEndTime());
+                    });
+
                     newFormRelationList.add(relation);
 
 //                    keyValueMap.put(formConfig.getKey(), sessionLongLongTriple.getRight());
@@ -2136,6 +2043,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //当前任务的名称
                 String oldTaskName = task.getName();
                 record.setCirculateMessage(circulateMessage);
+                record.setWorkflowApproveType(WorkflowApproveType.fromCode(dto.getApprovedType()).getCode());
 
                 //新增流程自定义发起流程记录
                 XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
@@ -2242,10 +2150,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     record.setSchemaId(schemaId);
                     record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
                     record.setRecordTime(LocalDateTime.now().minusSeconds(+1));//时间设置提前1秒钟,好排序
+                    record.setWorkflowApproveType(WorkflowApproveType.REJECT.getCode());
 
 //                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
                     record.setMessage("审批信息:【" + user.getName() + "】【驳回】审批,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
-                    workflowRecordMapper.insert(record);
+                    addProcessRecord(record);
 
                     //新增自定义流程发起流程记录
                     XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
@@ -2286,10 +2195,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 record.setSchemaId(schemaId);
                 record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
                 record.setRecordTime(LocalDateTime.now());
+                record.setWorkflowApproveType(WorkflowApproveType.FINISH.getCode());
 
                 record.setMessage("【审批人:" + user.getName() + "】 结束 【任务:" + task.getName() + "】");
 
-                workflowRecordMapper.insert(record);
+                addProcessRecord(record);
 
                 //新增流程发起流程记录
                 XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
@@ -2760,7 +2670,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             //新增流程发起流程记录
             WorkflowRecord record = new WorkflowRecord();
             record.setRecordTime(LocalDateTime.now());
-            addProcessRecord(task, Convert.toLong(schemaId), message, record);
+            addProcessRecord(task, Convert.toLong(schemaId), message, record, WorkflowApproveType.OTHER);
         }
         //包括
         String allUserIds = StrUtil.join(StringPool.COMMA, dto.getApprovedUsers());
@@ -2805,7 +2715,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //新增流程发起流程记录
                 WorkflowRecord record = new WorkflowRecord();
                 record.setRecordTime(LocalDateTime.now());
-                addProcessRecord(task, Convert.toLong(schemaId), "【" + approveName + "】" + "准备审批", record);
+                addProcessRecord(task, Convert.toLong(schemaId), "【" + approveName + "】" + "准备审批", record, WorkflowApproveType.OTHER);
             } else {
                 //修改原本的流转记录
                 records.setMessage("【" + approveName + "】" + "准备审批");
@@ -2864,7 +2774,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //新增流程发起流程记录
                 WorkflowRecord record = new WorkflowRecord();
                 record.setRecordTime(LocalDateTime.now());
-                addProcessRecord(task, Convert.toLong(dto.getSchemaId()), message, record);
+                addProcessRecord(task, Convert.toLong(dto.getSchemaId()), message, record, WorkflowApproveType.OTHER);
             }
             String userIds = StrUtil.join(StringPool.COMMA, item.getApprovedUsers());
 
@@ -3963,6 +3873,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         record.setSchemaId(workflowExtra.getSchemaId());
         record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
         record.setRecordTime(LocalDateTime.now());
+        record.setWorkflowApproveType(WorkflowApproveType.WITHDRAW.getCode());
         String oldTaskName = workflowExtra.getTaskName();
         //如果传入的是开始节点的值  默认是关闭流程  重新发起
         if (StrUtil.equals(dto.getActivityId(), historicProcessInstance.getStartActivityId())) {
@@ -3994,7 +3905,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             record.setMessage("【" + user.getName() + "】 将当前流程从【" + oldTaskName + "】撤回 到【" + workflowExtraNew.getTaskName() + "】!");
         }
         //保存流程撤回信息
-        workflowRecordMapper.insert(record);
+        addProcessRecord(record);
         return true;
     }
 
@@ -4023,10 +3934,11 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         record.setSchemaId(workflowExtra.getSchemaId());
         record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
         record.setRecordTime(LocalDateTime.now());
+        record.setWorkflowApproveType(WorkflowApproveType.WITHDRAW.getCode());
 
         runtimeService.deleteProcessInstance(historicProcessInstance.getId(), "【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到  开始节点!");
         //保存流程撤回信息
-        workflowRecordMapper.insert(record);
+        addProcessRecord(record);
         workflowExtraMapper.delete(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
 
         HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
@@ -4060,10 +3972,10 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 thisFormData.ifPresent(data -> {
                     Map<String, Object> formData = Convert.toMap(String.class, Object.class, data.getValue());
-//                    formData.remove("id");
                     WorkflowDraft draft = new WorkflowDraft();
                     draft.setSchemaId(workflowSchema.getId());
                     draft.setDataId(formData.get("id").toString());
+                    formData.remove("id");
                     draft.setFormData(JSONUtil.toJsonStr(formData));
                     workflowDraftService.save(draft);
                 });
@@ -4130,14 +4042,14 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
     }
 
     @Override
-    public boolean deleteDraft(List<Long> ids){
+    public boolean deleteDraft(List<Long> ids) {
         //根据草稿箱查询对应的流程
         List<WorkflowDraft> list = workflowDraftService.list(
-            new QueryWrapper<WorkflowDraft>()
-            .lambda()
-            .select(WorkflowDraft::getId)
-            .select(WorkflowDraft.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowDraft.class).contains(x.getProperty()))
-            .in(WorkflowDraft::getId, ids)
+                new QueryWrapper<WorkflowDraft>()
+                        .lambda()
+                        .select(WorkflowDraft::getId)
+                        .select(WorkflowDraft.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowDraft.class).contains(x.getProperty()))
+                        .in(WorkflowDraft::getId, ids)
         );
         JsonParser parser = new JsonParser();
         for (WorkflowDraft workflowDraft : list) {
@@ -4152,7 +4064,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             for (JsonElement tableConfig : tableConfigs) {
                 JsonObject table = tableConfig.getAsJsonObject();
-                if(workflowDraft.getDataId() != null &&  !"".equals(workflowDraft.getDataId())){
+                if (workflowDraft.getDataId() != null && !"".equals(workflowDraft.getDataId())) {
                     String sql = "delete from " + table.get("tableName").getAsString() + " where id = " + workflowDraft.getDataId();
                     SqlRunnerAdapter.db().update(sql);
                 }
@@ -4285,7 +4197,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         String allAssigneesUserNames = getAllUserNamesByIds(allAssigneesUserIds);
         record.setMessage("【" + user.getName() + "】通过【指派审核人】指派【" + allAssigneesUserNames + "】作为审核人");
 
-        workflowRecordMapper.insert(record);
+        addProcessRecord(record);
 
         //新增流程发起流程记录
         XjrWorkflowOperateRecord operateRecord = new XjrWorkflowOperateRecord();
@@ -4330,12 +4242,12 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             runtimeService.activateProcessInstanceById(dto.getProcessId());
             //[操作人名称] 将流程恢复
             record.setMessage("【" + user.getName() + "】将流程恢复");
-            workflowRecordMapper.insert(record);
+            addProcessRecord(record);
         } else {
             runtimeService.suspendProcessInstanceById(dto.getProcessId());
             //[操作人名称] 将流程挂起
             record.setMessage("【" + user.getName() + "】将流程挂起");
-            workflowRecordMapper.insert(record);
+            addProcessRecord(record);
         }
 
         return true;
@@ -4682,7 +4594,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         String message = "【" + user.getName() + "】将【" + task.getName() + "】转交给【" + newAssigneeName + "】办理";
         record.setMessage(message);
 
-        workflowRecordMapper.insert(record);
+        addProcessRecord(record);
         return true;
     }
 
@@ -4980,7 +4892,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 " + allNextTaskName;
 
-                addProcessRecord(task, schemaId, message, record);
+                addProcessRecord(task, schemaId, message, record, WorkflowApproveType.AGREE);
 
                 deleteAutoAgreePrepareNodeInRecord(task, schemaId, "【" + approveName + "】准备审批");
                 // 如果还有用户任务  则递归调用
@@ -4988,7 +4900,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             } else {
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 结束节点";
 
-                addProcessRecord(task, schemaId, message, record);
+                addProcessRecord(task, schemaId, message, record, WorkflowApproveType.AGREE);
                 deleteAutoAgreePrepareNodeInRecord(task, schemaId, "【" + approveName + "】准备审批");
             }
         }
@@ -5311,8 +5223,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
     /**
      * 添加流程记录
      */
-    private void addProcessRecord(Task task, Long schemaId, String message, WorkflowRecord record) {
-
+    private void addProcessRecord(Task task, Long schemaId, String message, WorkflowRecord record, WorkflowApproveType workflowApproveType) {
         IWorkflowRecordService workflowRecordService = SpringUtil.getBean(IWorkflowRecordService.class);
         //新增流程发起流程记录
         record.setNodeId(task.getId());
@@ -5322,9 +5233,36 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         record.setSchemaId(schemaId);
         record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
         record.setMessage(message);
+        record.setWorkflowApproveType(workflowApproveType.getCode());
 
         workflowRecordService.save(record);
 
+        // 记录流程状态
+        updateProcessState(record.getProcessId());
+    }
+
+    /**
+     * 添加流程记录
+     */
+    private void addProcessRecord(WorkflowRecord record) {
+        IWorkflowRecordService workflowRecordService = SpringUtil.getBean(IWorkflowRecordService.class);
+
+        workflowRecordService.save(record);
+
+        // 记录流程状态
+        updateProcessState(record.getProcessId());
+    }
+
+    private void updateProcessState(String processId) {
+        Optional<HistoricProcessInstance> historicProcessInstance = getHistoricProcessInstance(processId);
+        historicProcessInstance.ifPresent(item -> {
+            formRelationService.updateCurrentState(new WorkflowFormRelation() {{
+                setProcessId(processId);
+                setCurrentState(item.getState());
+                setStartTime(item.getStartTime());
+                setEndTime(item.getEndTime());
+            }});
+        });
 
     }
 
@@ -5365,7 +5303,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         startRecord.setRecordTime(LocalDateTime.now());
         startRecord.setMessage("【" + user.getName() + "】 创建流程");
 
-        workflowRecordMapper.insert(startRecord);
+        addProcessRecord(startRecord);
 
         XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
         xjrWorkflowOperateRecord.setNodeId(startNodeConfig.getId());
@@ -5611,7 +5549,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 record.setMessage(message);
             }
         }
-        workflowRecordMapper.insert(record);
+        addProcessRecord(record);
     }
 
     /**
@@ -5884,7 +5822,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 //                record.setMessage("审批信息:由于审批超时,【系统】【自动驳回】审批,审批意见为:“系统自动驳回审批”,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
                 String message = "【审阅】后未选择下一节点审核人,系统自动驳回,请重新【审阅】后选择下一节点审核人。";
                 record.setMessage(message);
-                workflowRecordMapper.insert(record);
+                record.setWorkflowApproveType(WorkflowApproveType.REJECT.getCode());
+                addProcessRecord(record);
 
                 //新增流程发起流程记录
                 XjrWorkflowOperateRecord operateRecord = new XjrWorkflowOperateRecord();
@@ -5961,8 +5900,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 operateRecord.setOperateInfo("审批人:" + oldTaskName + ", 审批结果:同意, 审批内容:由于审批超时,系统自动同意审批");
             }
-
-            workflowRecordMapper.insert(record);
+            record.setWorkflowApproveType(WorkflowApproveType.AGREE.getCode());
+            addProcessRecord(record);
             xjrWorkflowOperateRecordMapper.insert(operateRecord);
         }
         return true;
@@ -5989,7 +5928,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 recordListVo.setApproveComment(approveComment);
                 if (approveResultArr.length > 1 && "驳回".equals(approveResultArr[1])) {
                     recordListVo.setIsReject(1);
-                }else if(comment.contains("自动驳回")){
+                } else if (comment.contains("自动驳回")) {
                     recordListVo.setIsReject(1);
                     recordListVo.setApproveComment(p.getComment());
                 }

+ 0 - 5314
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java.back

@@ -1,5314 +0,0 @@
-package com.xjrsoft.module.workflow.service.impl;
-
-import cn.dev33.satoken.session.SaSession;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.convert.Convert;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.db.Session;
-import cn.hutool.extra.spring.SpringUtil;
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.yulichang.toolkit.MPJWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.enums.FormTemplateType;
-import com.xjrsoft.common.enums.WorkflowApproveType;
-import com.xjrsoft.common.enums.WorkflowAutoAgreeType;
-import com.xjrsoft.common.enums.WorkflowIsPrevChooseNextType;
-import com.xjrsoft.common.enums.WorkflowIsRecycleType;
-import com.xjrsoft.common.enums.WorkflowMultiInstanceFinishType;
-import com.xjrsoft.common.enums.WorkflowMultiInstanceType;
-import com.xjrsoft.common.enums.WorkflowNoHandlerType;
-import com.xjrsoft.common.enums.WorkflowRelationAuthType;
-import com.xjrsoft.common.enums.YesOrNoEnum;
-import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.common.page.ConventPage;
-import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.common.utils.RedisUtil;
-import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.form.dto.FormExecuteWorkflowAddDto;
-import com.xjrsoft.module.form.dto.FormExecuteWorkflowUpdateDto;
-import com.xjrsoft.module.form.entity.FormTemplate;
-import com.xjrsoft.module.form.mapper.FormTemplateMapper;
-import com.xjrsoft.module.form.service.IFormExecuteService;
-import com.xjrsoft.module.magicapi.service.IMagicApiService;
-import com.xjrsoft.module.magicapi.vo.MagicApiInfoVo;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.entity.UserRoleRelation;
-import com.xjrsoft.module.organization.service.IUserService;
-import com.xjrsoft.module.system.entity.File;
-import com.xjrsoft.module.system.entity.Stamp;
-import com.xjrsoft.module.system.service.IFileService;
-import com.xjrsoft.module.system.service.IStampService;
-import com.xjrsoft.module.workflow.constant.WorkflowConstant;
-import com.xjrsoft.module.workflow.dto.AddOrSubSignDto;
-import com.xjrsoft.module.workflow.dto.ApproveDto;
-import com.xjrsoft.module.workflow.dto.ApproveMultiDto;
-import com.xjrsoft.module.workflow.dto.ApproveMultiInfoDto;
-import com.xjrsoft.module.workflow.dto.ApproveUserDto;
-import com.xjrsoft.module.workflow.dto.ApproveUserMultiDto;
-import com.xjrsoft.module.workflow.dto.CirculatedTaskPageDto;
-import com.xjrsoft.module.workflow.dto.DeployDto;
-import com.xjrsoft.module.workflow.dto.DraftPageDto;
-import com.xjrsoft.module.workflow.dto.FinishedTaskPageDto;
-import com.xjrsoft.module.workflow.dto.FormFinishedTaskDto;
-import com.xjrsoft.module.workflow.dto.GetAssigneeDto;
-import com.xjrsoft.module.workflow.dto.LaunchDto;
-import com.xjrsoft.module.workflow.dto.LaunchRelationTaskDto;
-import com.xjrsoft.module.workflow.dto.MonitorPageDto;
-import com.xjrsoft.module.workflow.dto.MoveRecycleDto;
-import com.xjrsoft.module.workflow.dto.MyExaminePageDto;
-import com.xjrsoft.module.workflow.dto.MyProcessPageDto;
-import com.xjrsoft.module.workflow.dto.PendingTaskPageDto;
-import com.xjrsoft.module.workflow.dto.ReLaunchDto;
-import com.xjrsoft.module.workflow.dto.RecycleDeleteDto;
-import com.xjrsoft.module.workflow.dto.RecycleProcessPageDto;
-import com.xjrsoft.module.workflow.dto.RejectNodeDto;
-import com.xjrsoft.module.workflow.dto.RelationTaskInfoDto;
-import com.xjrsoft.module.workflow.dto.RelationTaskPageDto;
-import com.xjrsoft.module.workflow.dto.RestartDto;
-import com.xjrsoft.module.workflow.dto.SaveDraftDto;
-import com.xjrsoft.module.workflow.dto.SetAssigneeDto;
-import com.xjrsoft.module.workflow.dto.SetSuspendedDto;
-import com.xjrsoft.module.workflow.dto.TransferDto;
-import com.xjrsoft.module.workflow.dto.UpdateDraftDto;
-import com.xjrsoft.module.workflow.dto.WithdrawDto;
-import com.xjrsoft.module.workflow.entity.WorkflowApproveRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowCirculated;
-import com.xjrsoft.module.workflow.entity.WorkflowDelegate;
-import com.xjrsoft.module.workflow.entity.WorkflowDraft;
-import com.xjrsoft.module.workflow.entity.WorkflowExtra;
-import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
-import com.xjrsoft.module.workflow.entity.WorkflowRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.mapper.WorkflowDelegateMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowSchemaMapper;
-import com.xjrsoft.module.workflow.mapper.XjrWorkflowExtraMapper;
-import com.xjrsoft.module.workflow.model.ApiConfig;
-import com.xjrsoft.module.workflow.model.ApiRequestParamsConfig;
-import com.xjrsoft.module.workflow.model.AuthConfig;
-import com.xjrsoft.module.workflow.model.ButtonConfig;
-import com.xjrsoft.module.workflow.model.FormAssignmentConfig;
-import com.xjrsoft.module.workflow.model.FormConfig;
-import com.xjrsoft.module.workflow.model.MemberConfig;
-import com.xjrsoft.module.workflow.model.ProcessParamConfig;
-import com.xjrsoft.module.workflow.model.RelationProcessConfig;
-import com.xjrsoft.module.workflow.model.StartNodeConfig;
-import com.xjrsoft.module.workflow.model.UserTaskConfig;
-import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
-import com.xjrsoft.module.workflow.service.IWorkflowApproveRecordService;
-import com.xjrsoft.module.workflow.service.IWorkflowCirculatedService;
-import com.xjrsoft.module.workflow.service.IWorkflowDraftService;
-import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
-import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
-import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
-import com.xjrsoft.module.workflow.service.IWorkflowRecordService;
-import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
-import com.xjrsoft.module.workflow.vo.AllRecordListVo;
-import com.xjrsoft.module.workflow.vo.ApproveMultiInfoVo;
-import com.xjrsoft.module.workflow.vo.ApproveMultiVo;
-import com.xjrsoft.module.workflow.vo.CirculatedTaskPageVo;
-import com.xjrsoft.module.workflow.vo.DraftInfoVo;
-import com.xjrsoft.module.workflow.vo.DraftPageVo;
-import com.xjrsoft.module.workflow.vo.FinishedTaskPageVo;
-import com.xjrsoft.module.workflow.vo.FinishedTaskVo;
-import com.xjrsoft.module.workflow.vo.FormFinishedTaskVo;
-import com.xjrsoft.module.workflow.vo.GetAssigneeVo;
-import com.xjrsoft.module.workflow.vo.GetCountVo;
-import com.xjrsoft.module.workflow.vo.HistoryTaskVo;
-import com.xjrsoft.module.workflow.vo.LaunchAndApproveVo;
-import com.xjrsoft.module.workflow.vo.MonitorPageVo;
-import com.xjrsoft.module.workflow.vo.MyProcessPageVo;
-import com.xjrsoft.module.workflow.vo.PendingTaskVo;
-import com.xjrsoft.module.workflow.vo.ProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.ProcessRecordListVo;
-import com.xjrsoft.module.workflow.vo.RecycleProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.RecycleProcessPageVo;
-import com.xjrsoft.module.workflow.vo.RejectNodeVo;
-import com.xjrsoft.module.workflow.vo.RelationFormInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.RelationTaskPageVo;
-import com.xjrsoft.module.workflow.vo.RestartVo;
-import com.xjrsoft.module.workflow.vo.StartNodeFormInfoVo;
-import com.xjrsoft.module.workflow.vo.StartProcessInfoVo;
-import com.xjrsoft.module.workflow.vo.StartProcessRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.TaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskFormInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskInfoVo;
-import com.xjrsoft.module.workflow.vo.UserTaskRelationTaskVo;
-import com.xjrsoft.module.workflow.vo.WorkflowSchemaInfoVo;
-import lombok.AllArgsConstructor;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.tuple.ImmutableTriple;
-import org.apache.commons.lang3.tuple.Triple;
-import org.camunda.bpm.engine.HistoryService;
-import org.camunda.bpm.engine.RepositoryService;
-import org.camunda.bpm.engine.RuntimeService;
-import org.camunda.bpm.engine.TaskService;
-import org.camunda.bpm.engine.history.HistoricActivityInstance;
-import org.camunda.bpm.engine.history.HistoricProcessInstance;
-import org.camunda.bpm.engine.history.HistoricProcessInstanceQuery;
-import org.camunda.bpm.engine.history.HistoricTaskInstance;
-import org.camunda.bpm.engine.history.HistoricTaskInstanceQuery;
-import org.camunda.bpm.engine.history.HistoricVariableInstance;
-import org.camunda.bpm.engine.impl.persistence.entity.HistoricVariableInstanceEntity;
-import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;
-import org.camunda.bpm.engine.repository.Deployment;
-import org.camunda.bpm.engine.repository.ProcessDefinition;
-import org.camunda.bpm.engine.runtime.ActivityInstance;
-import org.camunda.bpm.engine.runtime.ProcessInstance;
-import org.camunda.bpm.engine.runtime.VariableInstance;
-import org.camunda.bpm.engine.task.Task;
-import org.camunda.bpm.engine.task.TaskQuery;
-import org.camunda.bpm.engine.variable.VariableMap;
-import org.camunda.bpm.engine.variable.Variables;
-import org.camunda.bpm.model.bpmn.BpmnModelInstance;
-import org.camunda.bpm.model.bpmn.impl.instance.FlowNodeImpl;
-import org.camunda.bpm.model.bpmn.instance.SequenceFlow;
-import org.camunda.bpm.model.xml.instance.ModelElementInstance;
-import org.camunda.commons.utils.IoUtil;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.ssssssss.magicapi.core.service.MagicAPIService;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @Author: tzx
- * @Date: 2022/9/8 14:25
- */
-@Slf4j
-@Service
-@AllArgsConstructor
-public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
-
-    private final WorkflowSchemaMapper workflowSchemaMapper;
-
-    private final RuntimeService runtimeService;
-
-    private final RepositoryService repositoryService;
-
-    private final TaskService taskService;
-
-    private final IFormExecuteService formExecuteService;
-
-    private final RedisUtil redisUtil;
-
-    private final WorkflowExtraMapper workflowExtraMapper;
-
-    private final HistoryService historyService;
-
-    private final FormTemplateMapper formTemplateMapper;
-
-    private final IWorkflowDraftService workflowDraftService;
-
-    private final WorkflowDelegateMapper workflowDelegateMapper;
-
-    private final WorkflowRecordMapper workflowRecordMapper;
-
-    private final IWorkflowCirculatedService circulatedService;
-
-    private final IWorkflowApproveRecordService approveRecordService;
-
-    private final IStampService stampService;
-
-    private final IWorkflowExtraService extraService;
-
-
-    private final IFileService fileService;
-
-    private final IWorkflowFormRelationService formRelationService;
-
-    private final IUserService userService;
-
-    private final ObjectMapper objectMapper;
-
-    private final XjrWorkflowExtraMapper xjrWorkflowExtraMapper;
-    /**
-     * 数据库存储xml字段的后缀
-     */
-    private static final String DB_FIELD_XML_PREFIX = "xml";
-
-
-    @Override
-    public boolean deploy(DeployDto dto) {
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectById(dto.getSchemaId());
-
-        Deployment deploy = repositoryService.createDeployment().name(workflowSchema.getName()).addInputStream(workflowSchema.getName() + StringPool.DOT + WorkflowConstant.WORKFLOW_SUFFIX, IoUtil.stringAsInputStream(workflowSchema.getXmlContent())).deploy();
-        workflowSchema.setDeploymentId(deploy.getId());
-
-        return workflowSchemaMapper.updateById(workflowSchema) > 0;
-    }
-
-    @Override
-    public String preview(Long schemaId) {
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId).select(x -> x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        return workflowSchema.getXmlContent();
-    }
-
-    @Override
-    public StartProcessInfoVo getStartProcessInfo(Long schemaId) {
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId));
-
-        StartProcessInfoVo vo = new StartProcessInfoVo();
-
-        vo.setWorkflowChat(workflowSchema.getWorkflowChat());
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-        //流程参数  发布时  存到变量中
-
-        List<RelationProcessConfig> relationProcessConfig = workflowSchemaConfig.getProcessConfig().getRelationProcessConfigs();
-
-        List<Long> relationSchemaIds = relationProcessConfig.stream().map(RelationProcessConfig::getId).collect(Collectors.toList());
-
-        if (relationSchemaIds.size() > 0) {
-            LambdaQueryWrapper<WorkflowSchema> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.in(WorkflowSchema::getId, relationSchemaIds);
-            queryWrapper.select(WorkflowSchema::getId, WorkflowSchema::getName);
-            List<WorkflowSchema> workflowSchemas = workflowSchemaMapper.selectList(queryWrapper);
-
-            List<StartProcessRelationTaskVo> relationTasks = new ArrayList<>(workflowSchemas.size());
-            for (WorkflowSchema schema : workflowSchemas) {
-                StartProcessRelationTaskVo relationTaskVo = new StartProcessRelationTaskVo();
-                relationTaskVo.setSchemaId(schema.getId());
-                relationTaskVo.setSchemaName(schema.getName());
-                relationTasks.add(relationTaskVo);
-            }
-            vo.setRelationTasks(relationTasks);
-        }
-
-
-        Optional<Map<String, Object>> startNodeConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(WorkflowConstant.START_NODE_DEFAULT_ID)).findFirst();
-
-        if (!startNodeConfigMap.isPresent()) {
-            throw new MyException("找不到当前流程的开始节点配置!");
-        }
-
-        //将map 转为 java类
-        StartNodeConfig startNodeConfig = Convert.convert(StartNodeConfig.class, startNodeConfigMap.get());
-
-        List<Long> formIds = startNodeConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-        List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-        List<StartNodeFormInfoVo> formInfoVos = new ArrayList<>(startNodeConfig.getFormConfigs().size());
-
-
-        for (FormConfig formConfig : startNodeConfig.getFormConfigs()) {
-
-            StartNodeFormInfoVo formInfoVo = new StartNodeFormInfoVo();
-            formInfoVo.setFormType(formConfig.getFormType());
-            formInfoVo.setFormConfig(formConfig);
-
-            //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-            }
-
-            formInfoVos.add(formInfoVo);
-        }
-        vo.setFormInfos(formInfoVos);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-
-        //获取流程数据
-        List<FormAssignmentConfig> formAssignmentConfigs = startNodeConfig.getAssignmentConfig().getFormAssignmentConfigs();
-
-        //是否有表单赋值
-        if (formAssignmentConfigs.size() > 0) {
-
-            List<ProcessParamConfig> processParamConfigs = workflowSchemaConfig.getProcessConfig().getProcessParamConfigs();
-
-            long count = historyService.createHistoricProcessInstanceQuery().count();
-            Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1, null);
-
-            Map<String, Map<String, Object>> formAssignmentData = new HashMap<>();
-
-            for (FormAssignmentConfig formAssignmentConfig : formAssignmentConfigs) {
-
-                if (formAssignmentData.containsKey(formAssignmentConfig.getTarget().getFormId())) {
-                    Map<String, Object> thisFormAssignmentData = formAssignmentData.get(formAssignmentConfig.getTarget().getFormId());
-                    thisFormAssignmentData.put(formAssignmentConfig.getTarget().getFormField(), processParam.get(formAssignmentConfig.getSource()));
-                } else {
-                    Map<String, Object> thisFormAssignmentData = new HashMap<>();
-                    thisFormAssignmentData.put(formAssignmentConfig.getTarget().getFormField(), processParam.get(formAssignmentConfig.getSource()));
-                    formAssignmentData.put(formAssignmentConfig.getTarget().getFormId(), thisFormAssignmentData);
-                }
-
-            }
-
-            vo.setFormAssignmentData(formAssignmentData);
-
-        }
-
-
-        return vo;
-    }
-
-
-    @Override
-    public UserTaskInfoVo getApproveProcessInfo(String taskId) {
-
-        HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
-        if (task == null) {
-            throw new MyException("找不到该流程!");
-        }
-        List<HistoricVariableInstance> variableInstanceList = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceId(task.getProcessInstanceId())
-                .variableNameIn(WorkflowConstant.PROCESS_SCHEMA_ID_KEY, WorkflowConstant.RELATION_TASK_KEY)
-                .list();
-
-        Optional<HistoricVariableInstance> schemaIdVar = variableInstanceList.stream().filter(x -> x.getName().equals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY)).findFirst();
-
-        if (!schemaIdVar.isPresent()) {
-            throw new MyException("找不到此模板!");
-        }
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaIdVar.get().getValue()));
-
-        UserTaskInfoVo vo = new UserTaskInfoVo();
-        vo.setWorkflowChat(workflowSchema.getWorkflowChat());
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        Optional<HistoricVariableInstance> relationTasksOp = variableInstanceList.stream().filter(x -> x.getName().equals(WorkflowConstant.RELATION_TASK_KEY)).findFirst();
-
-        //如果关联任务不为空
-        if (relationTasksOp.isPresent()) {
-            List<LaunchRelationTaskDto> relationTasks = Convert.toList(LaunchRelationTaskDto.class, relationTasksOp.get().getValue());
-
-            if (relationTasks != null && relationTasks.size() > 0) {
-
-                List<Long> relationSchemaIds = relationTasks.stream().map(LaunchRelationTaskDto::getSchemaId).collect(Collectors.toList());
-
-                LambdaQueryWrapper<WorkflowSchema> queryWrapper = new LambdaQueryWrapper<>();
-                queryWrapper.in(WorkflowSchema::getId, relationSchemaIds);
-                queryWrapper.select(WorkflowSchema::getId, WorkflowSchema::getName);
-                List<WorkflowSchema> workflowSchemas = workflowSchemaMapper.selectList(queryWrapper);
-                List<UserTaskRelationTaskVo> relationTasksVo = new ArrayList<>(workflowSchemas.size());
-
-                for (LaunchRelationTaskDto relationTask : relationTasks) {
-                    UserTaskRelationTaskVo relationTaskVo = new UserTaskRelationTaskVo();
-                    relationTaskVo.setTaskId(relationTask.getTaskId());
-                    relationTaskVo.setSchemaId(relationTask.getSchemaId());
-                    Optional<WorkflowSchema> thisSchema = workflowSchemas.stream().filter(schema -> schema.getId().equals(relationTask.getSchemaId())).findFirst();
-                    thisSchema.ifPresent(schema -> {
-                        relationTaskVo.setSchemaName(schema.getName());
-                    });
-                    relationTasksVo.add(relationTaskVo);
-                }
-                vo.setRelationTasks(relationTasksVo);
-            }
-
-        }
-
-        Optional<Map<String, Object>> taskNodeConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(task.getTaskDefinitionKey())).findFirst();
-
-        if (!taskNodeConfigMap.isPresent()) {
-            throw new MyException("找不到当前节点的配置信息!");
-        }
-
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, taskNodeConfigMap.get());
-
-        List<Long> formIds = userTaskConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-        String[] formKeys = userTaskConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-        List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-        List<HistoricVariableInstance> allFormData = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceId(task.getProcessInstanceId())
-                .variableNameIn(formKeys)
-                .list();
-
-
-        List<UserTaskFormInfoVo> formInfoVos = new ArrayList<>(userTaskConfig.getFormConfigs().size());
-        for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-            UserTaskFormInfoVo formInfoVo = new UserTaskFormInfoVo();
-            formInfoVo.setFormType(formConfig.getFormType());
-            formInfoVo.setFormConfig(formConfig);
-
-            if (allFormData.stream().anyMatch(x -> x.getName().equals(formConfig.getKey()))) {
-                HistoricVariableInstance historicVariableInstance = allFormData.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst().orElse(new HistoricVariableInstanceEntity());
-                formInfoVo.setFormData(Convert.toMap(String.class, Object.class, historicVariableInstance.getValue()));
-            }
-
-            //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-            }
-
-            formInfoVos.add(formInfoVo);
-        }
-        vo.setFormInfos(formInfoVos);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-        vo.setOpinionConfig(userTaskConfig.getOpinionConfig());
-
-        //如果是多实例的
-        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
-            vo.setIsAddOrSubSign(userTaskConfig.getCountersignConfig().getAddOrRemove());
-            //如果不是none  就代表是会签节点
-            vo.setIsCountersign(Boolean.TRUE);
-            vo.setButtonConfigs(userTaskConfig.getButtonConfigs().stream().filter(ButtonConfig::getChecked).filter(buttonConfig -> buttonConfig.getApproveType() == WorkflowApproveType.AGREE.getCode() || buttonConfig.getApproveType() == WorkflowApproveType.DISAGREE.getCode()).collect(Collectors.toList()));
-
-        } else {
-            vo.setIsCountersign(Boolean.FALSE);
-            vo.setButtonConfigs(userTaskConfig.getButtonConfigs().stream().filter(ButtonConfig::getChecked).collect(Collectors.toList()));
-
-        }
-
-        if (userTaskConfig.getOpinionConfig().getEnabled()) {
-            MPJLambdaWrapper<WorkflowApproveRecord> workflowApproveRecordMPJLambdaWrapper = MPJWrappers.<WorkflowApproveRecord>lambdaJoin()
-                    .disableSubLogicDel()
-                    .eq(WorkflowApproveRecord::getProcessId, task.getProcessInstanceId())
-                    .select(WorkflowApproveRecord::getId)
-                    .select(WorkflowApproveRecord.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowApproveRecord.class).contains(x.getProperty()))
-                    .selectAs(User::getName, WorkflowApproveRecord::getApproveUserName)
-                    .leftJoin(User.class, User::getId, WorkflowApproveRecord::getApproveUserId)
-                    .selectAs(Stamp::getFileUrl, WorkflowApproveRecord::getApproveStampUrl)
-                    .leftJoin(Stamp.class, Stamp::getId, WorkflowApproveRecord::getApproveStamp);
-
-            List<WorkflowApproveRecord> approveRecords = approveRecordService.selectJoinList(WorkflowApproveRecord.class, workflowApproveRecordMPJLambdaWrapper);
-
-            //取时间最大值 不好取  目前还是全部查出来 然后根据时间 倒序 取第一条数据
-            if (userTaskConfig.getOpinionConfig().getShowType() == 1 && approveRecords.size() > 0) {
-                WorkflowApproveRecord approveRecord = approveRecords.stream().sorted(Comparator.comparing(WorkflowApproveRecord::getApproveTime).reversed()).collect(Collectors.toList()).get(0);
-                List<WorkflowApproveRecord> onlyOne = new ArrayList<>();
-                onlyOne.add(approveRecord);
-                vo.setTaskApproveOpinions(onlyOne);
-            } else {
-                vo.setTaskApproveOpinions(approveRecords);
-            }
-        }
-
-        //获取流程数据
-        List<FormAssignmentConfig> formAssignmentConfigs = userTaskConfig.getAssignmentConfig().getFormAssignmentConfigs();
-
-        long taskSize = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).count();
-        //是否有表单赋值
-        if (formAssignmentConfigs.size() > 0 && taskSize > 0) {//有任务才给表单进行赋值,防止结束之后点击查看时获取不到对应的流程参数。
-
-            Object variable = taskService.getVariable(taskId, WorkflowConstant.PROCESS_PARAM_KEY);
-            Map<String, Object> processParam = Convert.toMap(String.class, Object.class, variable);
-
-            Map<String, Map<String, Object>> formAssignmentData = new HashMap<>();
-
-            for (FormAssignmentConfig formAssignmentConfig : formAssignmentConfigs) {
-
-                if (formAssignmentData.containsKey(formAssignmentConfig.getTarget().getFormId())) {
-                    Map<String, Object> thisFormAssignmentData = formAssignmentData.get(formAssignmentConfig.getTarget().getFormId());
-                    thisFormAssignmentData.put(formAssignmentConfig.getTarget().getFormField(), processParam.get(formAssignmentConfig.getSource()));
-                } else {
-                    Map<String, Object> thisFormAssignmentData = new HashMap<>();
-                    thisFormAssignmentData.put(formAssignmentConfig.getTarget().getFormField(), processParam.get(formAssignmentConfig.getSource()));
-                    formAssignmentData.put(formAssignmentConfig.getTarget().getFormId(), thisFormAssignmentData);
-                }
-
-            }
-
-            vo.setFormAssignmentData(formAssignmentData);
-
-        }
-
-        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
-
-        String superProcessInstanceId = historicProcessInstance.getSuperProcessInstanceId();
-
-        List<Map<String, Object>> otherProcessApproveRecord = new ArrayList<>();
-
-        //此流程 是否有主流程  如果有 代表他是某个流程的子流程
-        if (StrUtil.isNotBlank(superProcessInstanceId)) {
-
-            HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
-            //获取主流程审批记录
-            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
-
-            Map<String, Object> superProcessMap = new HashMap<>();
-            superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
-            superProcessMap.put("records", processRecordListVos);
-
-            otherProcessApproveRecord.add(superProcessMap);
-
-        }
-
-        //查看当前流程 是否包含子流程
-        List<HistoricProcessInstance> childProcess = historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(task.getProcessInstanceId()).list();
-
-        if (childProcess.size() > 0) {
-            String[] strings = childProcess.stream().map(HistoricProcessInstance::getId).toArray(String[]::new);
-
-            List<HistoricVariableInstance> childSchemaNameVarList = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(strings).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).list();
-
-            for (HistoricProcessInstance process : childProcess) {
-                Optional<HistoricVariableInstance> varOp = childSchemaNameVarList.stream().filter(x -> x.getProcessInstanceId().equals(process.getId())).findFirst();
-
-                varOp.ifPresent(schemaNameVar -> {
-                    Map<String, Object> superProcessMap = new HashMap<>();
-                    superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
-
-                    //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
-                    superProcessMap.put("records", processRecordListVos);
-
-                    otherProcessApproveRecord.add(superProcessMap);
-                });
-            }
-        }
-        //TODO  新增返回值  返回 主/子 流程 审批记录
-
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
-        vo.setTaskRecords(recordListVos);
-        vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
-        return vo;
-
-    }
-
-
-    @Override
-    public UserTaskInfoVo getApproveProcessInfoByProcessId(String processId) {
-
-        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult();
-
-        List<HistoricVariableInstance> variableInstanceList = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceId(processId)
-                .variableNameIn(WorkflowConstant.PROCESS_SCHEMA_ID_KEY, WorkflowConstant.RELATION_TASK_KEY)
-                .list();
-
-        Optional<HistoricVariableInstance> schemaIdVar = variableInstanceList.stream().filter(x -> x.getName().equals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY)).findFirst();
-
-
-        if (!schemaIdVar.isPresent()) {
-            throw new MyException("找不到此模板!");
-        }
-
-        //查询当前流程是否包含父亲流程
-        String superProcessInstanceId = historicProcessInstance.getSuperProcessInstanceId();
-
-        //查看当前流程 是否包含子流程
-        List<HistoricProcessInstance> childProcess = historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(processId).list();
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaIdVar.get().getValue()));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        UserTaskInfoVo vo = new UserTaskInfoVo();
-        vo.setWorkflowChat(workflowSchema.getWorkflowChat());
-        //如果 所有 节点 包含 用户任务 || 外部流程 ||子流程
-        if (workflowSchemaConfig.getChildNodeConfig().stream().anyMatch(x -> x.containsValue(WorkflowConstant.BPMN_XML_USER_TASK_TYPE_NAME) || x.containsValue(WorkflowConstant.BPMN_XML_CALL_ACTIVITY_TYPE_NAME) || x.containsValue(WorkflowConstant.BPMN_XML_SUB_PROCESS_TYPE_NAME))) {
-//            ActivityInstance activityInstance = runtimeService.getActivityInstance(processId);
-//
-//
-//            //如果没有使用processId 查询 基本可以代表 当前节点 不是用户任务节点  是外部任务 子任务节点
-//            ActivityInstance childActivityInstance = activityInstance.getChildActivityInstances()[0];
-
-
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, processId));
-
-            //找到当前流程的 最新的一个用户任务数据
-            Optional<WorkflowExtra> lastUserTaskOp = workflowExtras.stream()
-                    .filter(e -> e.getProcessId().equals(processId) && StrUtil.isNotBlank(e.getTaskId()))
-                    .max(Comparator.comparing(WorkflowExtra::getStartTime));
-
-            //如果不为空 能找到  就使用这个用户任务 查看流程
-            if (lastUserTaskOp.isPresent()) {
-
-                WorkflowExtra workflowExtra = lastUserTaskOp.get();
-
-                Optional<HistoricVariableInstance> relationTasksOp = variableInstanceList.stream().filter(x -> x.getName().equals(WorkflowConstant.RELATION_TASK_KEY)).findFirst();
-
-                //如果关联任务不为空
-                if (relationTasksOp.isPresent()) {
-                    List<LaunchRelationTaskDto> relationTasks = Convert.toList(LaunchRelationTaskDto.class, relationTasksOp.get().getValue());
-
-                    if (relationTasks != null && relationTasks.size() > 0) {
-
-                        List<Long> relationSchemaIds = relationTasks.stream().map(LaunchRelationTaskDto::getSchemaId).collect(Collectors.toList());
-
-                        LambdaQueryWrapper<WorkflowSchema> queryWrapper = new LambdaQueryWrapper<>();
-                        queryWrapper.in(WorkflowSchema::getId, relationSchemaIds);
-                        queryWrapper.select(WorkflowSchema::getId, WorkflowSchema::getName);
-                        List<WorkflowSchema> workflowSchemas = workflowSchemaMapper.selectList(queryWrapper);
-                        List<UserTaskRelationTaskVo> relationTasksVo = new ArrayList<>(workflowSchemas.size());
-
-                        for (LaunchRelationTaskDto relationTask : relationTasks) {
-                            UserTaskRelationTaskVo relationTaskVo = new UserTaskRelationTaskVo();
-                            relationTaskVo.setTaskId(relationTask.getTaskId());
-                            relationTaskVo.setSchemaId(relationTask.getSchemaId());
-                            Optional<WorkflowSchema> thisSchema = workflowSchemas.stream().filter(schema -> schema.getId().equals(relationTask.getSchemaId())).findFirst();
-                            thisSchema.ifPresent(schema -> {
-                                relationTaskVo.setSchemaName(schema.getName());
-                            });
-                            relationTasksVo.add(relationTaskVo);
-                        }
-                        vo.setRelationTasks(relationTasksVo);
-                    }
-
-                }
-
-                //如果有taskId,表明不是纯粹的脚本任务,走以下逻辑
-                HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery().taskId(workflowExtra.getTaskId()).singleResult();
-
-                Optional<Map<String, Object>> taskNodeConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(task.getTaskDefinitionKey())).findFirst();
-
-                if (!taskNodeConfigMap.isPresent()) {
-                    throw new MyException("找不到当前节点的配置信息!");
-                }
-
-                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, taskNodeConfigMap.get());
-
-                List<Long> formIds = userTaskConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-                String[] formKeys = userTaskConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-                List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-                List<HistoricVariableInstance> allFormData = historyService.createHistoricVariableInstanceQuery()
-                        .processInstanceId(processId)
-                        .variableNameIn(formKeys)
-                        .list();
-
-
-                List<UserTaskFormInfoVo> formInfoVos = new ArrayList<>(userTaskConfig.getFormConfigs().size());
-                for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-                    UserTaskFormInfoVo formInfoVo = new UserTaskFormInfoVo();
-                    formInfoVo.setFormType(formConfig.getFormType());
-                    formInfoVo.setFormConfig(formConfig);
-
-                    if (allFormData.stream().anyMatch(x -> x.getName().equals(formConfig.getKey()))) {
-                        HistoricVariableInstance historicVariableInstance = allFormData.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst().orElse(new HistoricVariableInstanceEntity());
-                        formInfoVo.setFormData(Convert.toMap(String.class, Object.class, historicVariableInstance.getValue()));
-                    }
-
-                    //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-                    if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                        Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                        templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-                    }
-
-                    formInfoVos.add(formInfoVo);
-                }
-                vo.setFormInfos(formInfoVos);
-                vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-                vo.setButtonConfigs(userTaskConfig.getButtonConfigs().stream().filter(ButtonConfig::getChecked).collect(Collectors.toList()));
-                vo.setOpinionConfig(userTaskConfig.getOpinionConfig());
-
-                //如果是多实例的
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
-                    vo.setIsAddOrSubSign(userTaskConfig.getCountersignConfig().getAddOrRemove());
-                }
-
-                if (userTaskConfig.getOpinionConfig().getEnabled()) {
-                    MPJLambdaWrapper<WorkflowApproveRecord> workflowApproveRecordMPJLambdaWrapper = MPJWrappers.<WorkflowApproveRecord>lambdaJoin()
-                            .disableSubLogicDel()
-                            .eq(WorkflowApproveRecord::getProcessId, processId)
-                            .select(WorkflowApproveRecord::getId)
-                            .select(WorkflowApproveRecord.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowApproveRecord.class).contains(x.getProperty()))
-                            .selectAs(User::getName, WorkflowApproveRecord::getApproveUserName)
-                            .leftJoin(User.class, User::getId, WorkflowApproveRecord::getApproveUserId)
-                            .selectAs(Stamp::getFileUrl, WorkflowApproveRecord::getApproveStampUrl)
-                            .leftJoin(Stamp.class, Stamp::getId, WorkflowApproveRecord::getApproveStamp);
-
-                    List<WorkflowApproveRecord> approveRecords = approveRecordService.selectJoinList(WorkflowApproveRecord.class, workflowApproveRecordMPJLambdaWrapper);
-
-                    //取时间最大值 不好取  目前还是全部查出来 然后根据时间 倒序 取第一条数据
-                    if (userTaskConfig.getOpinionConfig().getShowType() == 1 && approveRecords.size() > 0) {
-                        WorkflowApproveRecord approveRecord = approveRecords.stream().sorted(Comparator.comparing(WorkflowApproveRecord::getApproveTime).reversed()).collect(Collectors.toList()).get(0);
-                        List<WorkflowApproveRecord> onlyOne = new ArrayList<>();
-                        onlyOne.add(approveRecord);
-                        vo.setTaskApproveOpinions(onlyOne);
-                    } else {
-                        vo.setTaskApproveOpinions(approveRecords);
-                    }
-                }
-
-                //获取流程数据
-                List<FormAssignmentConfig> formAssignmentConfigs = userTaskConfig.getAssignmentConfig().getFormAssignmentConfigs();
-
-                long taskSize = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).count();
-
-                //是否有表单赋值
-                if (formAssignmentConfigs.size() > 0 && taskSize > 0) {
-
-                    Object variable = taskService.getVariable(workflowExtra.getTaskId(), WorkflowConstant.PROCESS_PARAM_KEY);
-                    Map<String, Object> processParam = Convert.toMap(String.class, Object.class, variable);
-
-                    Map<String, Map<String, Object>> formAssignmentData = new HashMap<>();
-
-                    for (FormAssignmentConfig formAssignmentConfig : formAssignmentConfigs) {
-
-                        if (formAssignmentData.containsKey(formAssignmentConfig.getTarget().getFormId())) {
-                            Map<String, Object> thisFormAssignmentData = formAssignmentData.get(formAssignmentConfig.getTarget().getFormId());
-                            thisFormAssignmentData.put(formAssignmentConfig.getTarget().getFormField(), processParam.get(formAssignmentConfig.getSource()));
-                        } else {
-                            Map<String, Object> thisFormAssignmentData = new HashMap<>();
-                            thisFormAssignmentData.put(formAssignmentConfig.getTarget().getFormField(), processParam.get(formAssignmentConfig.getSource()));
-                            formAssignmentData.put(formAssignmentConfig.getTarget().getFormId(), thisFormAssignmentData);
-                        }
-
-                    }
-
-                    vo.setFormAssignmentData(formAssignmentData);
-
-                }
-
-
-                List<Map<String, Object>> otherProcessApproveRecord = new ArrayList<>();
-
-                //此流程 是否有主流程  如果有 代表他是某个流程的子流程
-                if (StrUtil.isNotBlank(superProcessInstanceId)) {
-
-                    HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
-                    //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
-
-                    Map<String, Object> superProcessMap = new HashMap<>();
-                    superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
-                    superProcessMap.put("records", processRecordListVos);
-
-                    otherProcessApproveRecord.add(superProcessMap);
-
-                }
-
-
-                if (childProcess.size() > 0) {
-                    String[] strings = childProcess.stream().map(HistoricProcessInstance::getId).toArray(String[]::new);
-
-                    List<HistoricVariableInstance> childSchemaNameVarList = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(strings).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).list();
-
-                    for (HistoricProcessInstance process : childProcess) {
-                        Optional<HistoricVariableInstance> varOp = childSchemaNameVarList.stream().filter(x -> x.getProcessInstanceId().equals(process.getId())).findFirst();
-
-                        varOp.ifPresent(schemaNameVar -> {
-                            Map<String, Object> superProcessMap = new HashMap<>();
-                            superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
-
-                            //获取主流程审批记录
-                            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
-                            superProcessMap.put("records", processRecordListVos);
-
-                            otherProcessApproveRecord.add(superProcessMap);
-                        });
-                    }
-                }
-                //TODO  新增返回值  返回 主/子 流程 审批记录
-
-                List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
-                vo.setTaskRecords(recordListVos);
-                vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
-            }
-            //如果找不到 就代表  开始节点之后 就是外部流程 或者 子流程  所以 返回开始节点数据就行
-            else {
-                Optional<HistoricVariableInstance> relationTasksOp = variableInstanceList.stream().filter(x -> x.getName().equals(WorkflowConstant.RELATION_TASK_KEY)).findFirst();
-
-                //如果关联任务不为空
-                if (relationTasksOp.isPresent()) {
-                    List<LaunchRelationTaskDto> relationTasks = Convert.toList(LaunchRelationTaskDto.class, relationTasksOp.get().getValue());
-
-                    if (relationTasks != null && relationTasks.size() > 0) {
-
-                        List<Long> relationSchemaIds = relationTasks.stream().map(LaunchRelationTaskDto::getSchemaId).collect(Collectors.toList());
-
-                        LambdaQueryWrapper<WorkflowSchema> queryWrapper = new LambdaQueryWrapper<>();
-                        queryWrapper.in(WorkflowSchema::getId, relationSchemaIds);
-                        queryWrapper.select(WorkflowSchema::getId, WorkflowSchema::getName);
-                        List<WorkflowSchema> workflowSchemas = workflowSchemaMapper.selectList(queryWrapper);
-                        List<UserTaskRelationTaskVo> relationTasksVo = new ArrayList<>(workflowSchemas.size());
-
-                        for (LaunchRelationTaskDto relationTask : relationTasks) {
-                            UserTaskRelationTaskVo relationTaskVo = new UserTaskRelationTaskVo();
-                            relationTaskVo.setTaskId(relationTask.getTaskId());
-                            relationTaskVo.setSchemaId(relationTask.getSchemaId());
-                            Optional<WorkflowSchema> thisSchema = workflowSchemas.stream().filter(schema -> schema.getId().equals(relationTask.getSchemaId())).findFirst();
-                            thisSchema.ifPresent(schema -> {
-                                relationTaskVo.setSchemaName(schema.getName());
-                            });
-                            relationTasksVo.add(relationTaskVo);
-                        }
-                        vo.setRelationTasks(relationTasksVo);
-                    }
-
-                }
-
-                //如果没有用户任务  开始节点可能会有表单  查看必须显示开始节点表单数据
-                Optional<Map<String, Object>> startNodeConfig = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(WorkflowConstant.START_NODE_DEFAULT_ID)).findFirst();
-
-                if (!startNodeConfig.isPresent()) {
-                    throw new MyException("找不到当前节点的配置信息!");
-                }
-
-                StartNodeConfig startEventConfig = Convert.convert(StartNodeConfig.class, startNodeConfig.get());
-
-                List<Long> formIds = startEventConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-                String[] formKeys = startEventConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-                List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-                List<HistoricVariableInstance> allFormData = historyService.createHistoricVariableInstanceQuery()
-                        .processInstanceId(processId)
-                        .variableNameIn(formKeys)
-                        .list();
-
-
-                List<UserTaskFormInfoVo> formInfoVos = new ArrayList<>(startEventConfig.getFormConfigs().size());
-                for (FormConfig formConfig : startEventConfig.getFormConfigs()) {
-
-                    UserTaskFormInfoVo formInfoVo = new UserTaskFormInfoVo();
-                    formInfoVo.setFormType(formConfig.getFormType());
-                    formInfoVo.setFormConfig(formConfig);
-
-                    if (allFormData.stream().anyMatch(x -> x.getName().equals(formConfig.getKey()))) {
-                        HistoricVariableInstance historicVariableInstance = allFormData.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst().orElse(new HistoricVariableInstanceEntity());
-                        formInfoVo.setFormData(Convert.toMap(String.class, Object.class, historicVariableInstance.getValue()));
-                    }
-
-                    //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-                    if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                        Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                        templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-                    }
-
-                    formInfoVos.add(formInfoVo);
-                }
-                vo.setFormInfos(formInfoVos);
-                vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-
-                List<Map<String, Object>> otherProcessApproveRecord = new ArrayList<>();
-
-                //此流程 是否有主流程  如果有 代表他是某个流程的子流程
-                if (StrUtil.isNotBlank(superProcessInstanceId)) {
-
-                    HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
-                    //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
-
-                    Map<String, Object> superProcessMap = new HashMap<>();
-                    superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
-                    superProcessMap.put("records", processRecordListVos);
-
-                    otherProcessApproveRecord.add(superProcessMap);
-
-                }
-
-
-                if (childProcess.size() > 0) {
-                    String[] strings = childProcess.stream().map(HistoricProcessInstance::getId).toArray(String[]::new);
-
-                    List<HistoricVariableInstance> childSchemaNameVarList = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(strings).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).list();
-
-                    for (HistoricProcessInstance process : childProcess) {
-                        Optional<HistoricVariableInstance> varOp = childSchemaNameVarList.stream().filter(x -> x.getProcessInstanceId().equals(process.getId())).findFirst();
-
-                        varOp.ifPresent(schemaNameVar -> {
-                            Map<String, Object> superProcessMap = new HashMap<>();
-                            superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
-
-                            //获取主流程审批记录
-                            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
-                            superProcessMap.put("records", processRecordListVos);
-
-                            otherProcessApproveRecord.add(superProcessMap);
-                        });
-                    }
-                }
-                //TODO  新增返回值  返回 主/子 流程 审批记录
-
-                List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
-                vo.setTaskRecords(recordListVos);
-                vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
-            }
-        }
-        //判断流程是否完全没有用户任务
-        else {
-            Optional<HistoricVariableInstance> relationTasksOp = variableInstanceList.stream().filter(x -> x.getName().equals(WorkflowConstant.RELATION_TASK_KEY)).findFirst();
-
-
-            //如果关联任务不为空
-            if (relationTasksOp.isPresent()) {
-                List<LaunchRelationTaskDto> relationTasks = Convert.toList(LaunchRelationTaskDto.class, relationTasksOp.get().getValue());
-
-                if (relationTasks != null && relationTasks.size() > 0) {
-
-                    List<Long> relationSchemaIds = relationTasks.stream().map(LaunchRelationTaskDto::getSchemaId).collect(Collectors.toList());
-
-                    LambdaQueryWrapper<WorkflowSchema> queryWrapper = new LambdaQueryWrapper<>();
-                    queryWrapper.in(WorkflowSchema::getId, relationSchemaIds);
-                    queryWrapper.select(WorkflowSchema::getId, WorkflowSchema::getName);
-                    List<WorkflowSchema> workflowSchemas = workflowSchemaMapper.selectList(queryWrapper);
-                    List<UserTaskRelationTaskVo> relationTasksVo = new ArrayList<>(workflowSchemas.size());
-
-                    for (LaunchRelationTaskDto relationTask : relationTasks) {
-                        UserTaskRelationTaskVo relationTaskVo = new UserTaskRelationTaskVo();
-                        relationTaskVo.setTaskId(relationTask.getTaskId());
-                        relationTaskVo.setSchemaId(relationTask.getSchemaId());
-                        Optional<WorkflowSchema> thisSchema = workflowSchemas.stream().filter(schema -> schema.getId().equals(relationTask.getSchemaId())).findFirst();
-                        thisSchema.ifPresent(schema -> {
-                            relationTaskVo.setSchemaName(schema.getName());
-                        });
-                        relationTasksVo.add(relationTaskVo);
-                    }
-                    vo.setRelationTasks(relationTasksVo);
-                }
-
-            }
-
-            //如果没有用户任务  开始节点可能会有表单  查看必须显示开始节点表单数据
-            Optional<Map<String, Object>> startNodeConfig = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(WorkflowConstant.START_NODE_DEFAULT_ID)).findFirst();
-
-            if (!startNodeConfig.isPresent()) {
-                throw new MyException("找不到当前节点的配置信息!");
-            }
-
-            StartNodeConfig startEventConfig = Convert.convert(StartNodeConfig.class, startNodeConfig.get());
-
-            List<Long> formIds = startEventConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-            String[] formKeys = startEventConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-            List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-            List<HistoricVariableInstance> allFormData = historyService.createHistoricVariableInstanceQuery()
-                    .processInstanceId(processId)
-                    .variableNameIn(formKeys)
-                    .list();
-
-
-            List<UserTaskFormInfoVo> formInfoVos = new ArrayList<>(startEventConfig.getFormConfigs().size());
-            for (FormConfig formConfig : startEventConfig.getFormConfigs()) {
-
-                UserTaskFormInfoVo formInfoVo = new UserTaskFormInfoVo();
-                formInfoVo.setFormType(formConfig.getFormType());
-                formInfoVo.setFormConfig(formConfig);
-
-                if (allFormData.stream().anyMatch(x -> x.getName().equals(formConfig.getKey()))) {
-                    HistoricVariableInstance historicVariableInstance = allFormData.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst().orElse(new HistoricVariableInstanceEntity());
-                    formInfoVo.setFormData(Convert.toMap(String.class, Object.class, historicVariableInstance.getValue()));
-                }
-
-                //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-                if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                    Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                    templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-                }
-
-                formInfoVos.add(formInfoVo);
-            }
-            vo.setFormInfos(formInfoVos);
-            vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-
-            List<Map<String, Object>> otherProcessApproveRecord = new ArrayList<>();
-
-            //此流程 是否有主流程  如果有 代表他是某个流程的子流程
-            if (StrUtil.isNotBlank(superProcessInstanceId)) {
-
-                HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
-                //获取主流程审批记录
-                List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
-
-                Map<String, Object> superProcessMap = new HashMap<>();
-                superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
-                superProcessMap.put("records", processRecordListVos);
-
-                otherProcessApproveRecord.add(superProcessMap);
-
-            }
-
-
-            if (childProcess.size() > 0) {
-                String[] strings = childProcess.stream().map(HistoricProcessInstance::getId).toArray(String[]::new);
-
-                List<HistoricVariableInstance> childSchemaNameVarList = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(strings).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).list();
-
-                for (HistoricProcessInstance process : childProcess) {
-                    Optional<HistoricVariableInstance> varOp = childSchemaNameVarList.stream().filter(x -> x.getProcessInstanceId().equals(process.getId())).findFirst();
-
-                    varOp.ifPresent(schemaNameVar -> {
-                        Map<String, Object> superProcessMap = new HashMap<>();
-                        superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
-
-                        //获取主流程审批记录
-                        List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
-                        superProcessMap.put("records", processRecordListVos);
-
-                        otherProcessApproveRecord.add(superProcessMap);
-                    });
-                }
-            }
-            //TODO  新增返回值  返回 主/子 流程 审批记录
-
-            List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
-            vo.setTaskRecords(recordListVos);
-            vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
-
-        }
-
-
-        return vo;
-
-    }
-
-    @Override
-    public AllRecordListVo getAllRecordInfoByProcessId(String processId) {
-        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult();
-        //查询当前流程是否包含父亲流程
-        String superProcessInstanceId = historicProcessInstance.getSuperProcessInstanceId();
-        //查看当前流程 是否包含子流程
-        List<HistoricProcessInstance> childProcess = historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(processId).list();
-
-        AllRecordListVo vo = new AllRecordListVo();
-        List<Map<String, Object>> otherProcessApproveRecord = new ArrayList<>();
-        //此流程 是否有主流程  如果有 代表他是某个流程的子流程
-        if (StrUtil.isNotBlank(superProcessInstanceId)) {
-
-            HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
-            //获取主流程审批记录
-            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 1);
-
-            Map<String, Object> superProcessMap = new HashMap<>();
-            superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
-            superProcessMap.put("records", processRecordListVos);
-
-            otherProcessApproveRecord.add(superProcessMap);
-
-        }
-
-        if (childProcess.size() > 0) {
-            String[] strings = childProcess.stream().map(HistoricProcessInstance::getId).toArray(String[]::new);
-
-            List<HistoricVariableInstance> childSchemaNameVarList = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(strings).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).list();
-
-            for (HistoricProcessInstance process : childProcess) {
-                Optional<HistoricVariableInstance> varOp = childSchemaNameVarList.stream().filter(x -> x.getProcessInstanceId().equals(process.getId())).findFirst();
-
-                varOp.ifPresent(schemaNameVar -> {
-                    Map<String, Object> superProcessMap = new HashMap<>();
-                    superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
-
-                    //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 1);
-                    superProcessMap.put("records", processRecordListVos);
-
-                    otherProcessApproveRecord.add(superProcessMap);
-                });
-            }
-        }
-        //TODO  新增返回值  返回 主/子 流程 审批记录
-
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 1);
-        vo.setTaskRecords(recordListVos);
-        vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
-        return vo;
-    }
-
-    @Override
-    public RecycleProcessInfoVo getRecycleProcessInfo(String processId) {
-
-        RecycleProcessInfoVo vo = new RecycleProcessInfoVo();
-
-        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId)
-                .variableNameLike(WorkflowConstant.PROCESS_FORMDATA_PREFIX_KEY + StringPool.PERCENT).list();
-        HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceId(processId)
-                .variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
-
-
-        if (historicVariableInstance == null) {
-            throw new MyException("找不到当前模板id");
-
-        }
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, historicVariableInstance.getValue()));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        List<RelationProcessConfig> relationProcessConfig = workflowSchemaConfig.getProcessConfig().getRelationProcessConfigs();
-
-        List<Long> relationSchemaIds = relationProcessConfig.stream().map(RelationProcessConfig::getId).collect(Collectors.toList());
-
-        if (relationSchemaIds.size() > 0) {
-            LambdaQueryWrapper<WorkflowSchema> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.in(WorkflowSchema::getId, relationSchemaIds);
-            queryWrapper.select(WorkflowSchema::getId, WorkflowSchema::getName);
-            List<WorkflowSchema> workflowSchemas = workflowSchemaMapper.selectList(queryWrapper);
-
-            List<StartProcessRelationTaskVo> relationTasks = new ArrayList<>(workflowSchemas.size());
-            for (WorkflowSchema schema : workflowSchemas) {
-                StartProcessRelationTaskVo relationTaskVo = new StartProcessRelationTaskVo();
-                relationTaskVo.setSchemaId(schema.getId());
-                relationTaskVo.setSchemaName(schema.getName());
-                relationTasks.add(relationTaskVo);
-            }
-            vo.setRelationTasks(relationTasks);
-        }
-
-
-        Map<String, Map<String, Object>> formDatas = new HashMap<>();
-        for (HistoricVariableInstance variableInstance : list) {
-            formDatas.put(variableInstance.getName(), Convert.toMap(String.class, Object.class, variableInstance.getValue()));
-        }
-
-
-        vo.setFormDatas(formDatas);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-        return vo;
-    }
-
-
-    @Override
-    @SneakyThrows
-    @Transactional(rollbackFor = Exception.class)
-    public List<LaunchAndApproveVo> newLaunch(LaunchDto dto) {
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectById(dto.getSchemaId());
-
-        if (workflowSchema == null) {
-            throw new MyException("找不到此流程!");
-        }
-
-        //如果当前模板被禁用 无法发起流程
-        if (workflowSchema.getEnabledMark() == EnabledMark.DISABLED.getCode()) {
-            throw new MyException("流程被禁用!");
-        }
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-        //将工作流模板存入缓存
-        redisUtil.set(WorkflowConstant.SCHEMA_CACHE_PREFIX + workflowSchema.getId(), workflowSchema);
-
-        AuthConfig authConfig = workflowSchemaConfig.getProcessConfig().getAuthConfig();
-
-        //判断是否有发起流程的权限
-        if (!WorkFlowUtil.hasPermissions(authConfig)) {
-            throw new MyException("没有此流程权限!");
-        }
-        //获取到流程定义
-        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(workflowSchema.getDeploymentId()).singleResult();
-
-        //流程参数  发布时  存到变量中
-        List<ProcessParamConfig> processParamConfigs = workflowSchemaConfig.getProcessConfig().getProcessParamConfigs();
-
-        long count = historyService.createHistoricProcessInstanceQuery().count();
-        Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1, null);
-
-        //表单赋值
-//        initFormAssignment(dto.getFormData(), workflowSchema, workflowSchemaConfig, processParam);
-
-        //构建流程默认参数 (全局变量 发起人id、发起人名、模板id 、模板名、页面配置参数值、流水号)等
-        VariableMap variableMap = initDefaultParam(workflowSchema, processParam, count);
-        FormTemplate formTemplate = formTemplateMapper.selectById(workflowSchema.getFormId());
-
-        //根据规则生成流程名称
-        String processName = WorkFlowUtil.generatorProcessName(workflowSchema, workflowSchemaConfig, count + 1, dto);
-        //根据规则生成流程名称
-        variableMap.putValue(WorkflowConstant.PROCESS_NAME, processName);
-
-        Optional<Map<String, Object>> startNodeMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(WorkflowConstant.BPMN_XML_START_EVENT_TYPE_NAME)).findFirst();
-
-        if (!startNodeMap.isPresent()) {
-            throw new MyException("当前任务没有开始节点");
-        }
-
-        //如果关联任务不为空 并且有数据
-        if (dto.getRelationTasks() != null && dto.getRelationTasks().size() > 0) {
-            variableMap.putValue(WorkflowConstant.RELATION_TASK_KEY, dto.getRelationTasks());
-        }
-
-
-        //将map 转为 java类
-        StartNodeConfig startNodeConfig = Convert.convert(StartNodeConfig.class, startNodeMap.get());
-
-        //定义sessionList  存储所有表提交的session  用于最后提交commit  保证事务
-        List<Session> sessionList = new ArrayList<>(dto.getFormData().size());
-
-        //定义map 用于存储 formId以及 主键keyValue {formId:keyValue}
-//        Map<String, Long> keyValueMap = new HashMap<>(dto.getFormData().size());
-
-        List<WorkflowFormRelation> relations = new ArrayList<>(dto.getFormData().size());
-
-        //提交表单数据  在发起任务之前  原因
-        //  1、需要提交数据之后的主键数据也塞入到map中
-        //  2、有可能流程图 开始节点之后就是网关 需要提前配置好网关的流转条件  需要提前配置好变量才能发起流程  不然影响流程走向
-        //  3、功能页面发起 数据会自带主键  需要调用更新接口
-        for (FormConfig formConfig : startNodeConfig.getFormConfigs()) {
-            Map<String, Object> thisFormData = dto.getFormData().get(formConfig.getKey());
-
-
-            //如果其中某一个事务出错,所有表单提交全部回滚
-            //formData 新增之后 会将主键加入到 map  所以不需要管
-            try {
-
-                //如果提交过 默认是update
-                FormExecuteWorkflowUpdateDto executeWorkflowUpdateDto = new FormExecuteWorkflowUpdateDto();
-                executeWorkflowUpdateDto.setFormId(formConfig.getFormId());
-                executeWorkflowUpdateDto.setFormData(thisFormData);
-                variableMap.putValue(formConfig.getKey(), thisFormData);
-
-                Triple<Session, Boolean, Long> sessionLongLongTriple = formExecuteService.workflowAddOrUpdate(executeWorkflowUpdateDto);
-
-                sessionList.add(sessionLongLongTriple.getLeft());
-
-                WorkflowFormRelation formRelation = new WorkflowFormRelation();
-                formRelation.setFormId(formConfig.getFormId());
-                formRelation.setFormKey(formConfig.getKey());
-                formRelation.setFormKeyValue(sessionLongLongTriple.getRight().toString());
-
-                relations.add(formRelation);
-            } catch (Exception e) {
-                log.error("提交表单数据失败(newLaunch):",e);
-                for (Session session : sessionList) {
-                    session.quietRollback();
-                }
-                throw new MyException("【表单id: " + formConfig.getFormId() + "】 提交错误, 请联系管理员!");
-            }
-
-        }
-
-        //将formid 以及 表单主键 存储到变量中
-//        variableMap.putValue(WorkflowConstant.PROCESS_FOMRID_KEYVALUE_KEY, keyValueMap);
-
-        //如果没有报错  所有表单提交事务 一起提交  提交有错误 也统一回滚
-
-
-        try {
-            //表单提交完毕后 发起流程
-            ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variableMap);
-
-            List<Task> list = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
-
-//            List<LaunchAndApproveVo> result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
-
-            //如果不需要指定审批人 默认走自动同意规则
-            invokeAutoAgree(processInstance.getId(), workflowSchema.getId(), workflowSchemaConfig, list);
-
-            //重新获取任务节点,判断是否需要指定下一审批人
-            list = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
-
-            List<LaunchAndApproveVo> result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
-
-            updateFileInfo(dto.getFileFolderIds(), processInstance.getId());
-
-            //保存 流程 表单 关联 数据
-            for (WorkflowFormRelation relation : relations) {
-                relation.setProcessId(processInstance.getId());
-            }
-
-            formRelationService.saveBatch(relations);
-
-            for (Session session : sessionList) {
-                session.getConnection().setAutoCommit(Boolean.FALSE);
-                session.commit();
-                session.close();
-            }
-
-            return result;
-        } catch (Exception e) {
-            for (Session session : sessionList) {
-                session.quietRollback();
-            }
-            if (ObjectUtil.isNotEmpty(e.getMessage()) && e.getMessage().contains("sequence flow")) {
-                throw new MyException("流转条件错误,请检查流转条件设置!");
-            } else {
-                throw new MyException("表单提交错误, 请联系系统管理员!");
-            }
-        }
-
-    }
-
-    @Override
-    @SneakyThrows
-    @Transactional(rollbackFor = Exception.class)
-    public List<LaunchAndApproveVo> reLaunch(ReLaunchDto dto) {
-
-
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectById(dto.getSchemaId());
-
-        if (workflowSchema == null) {
-            throw new MyException("找不到此流程!");
-        }
-
-        //如果当前模板被禁用 无法发起流程
-        if (workflowSchema.getEnabledMark() == EnabledMark.DISABLED.getCode()) {
-            throw new MyException("流程被禁用!");
-        }
-
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-        //将工作流模板存入缓存
-        redisUtil.set(WorkflowConstant.SCHEMA_CACHE_PREFIX + workflowSchema.getId(), workflowSchema);
-
-        AuthConfig authConfig = workflowSchemaConfig.getProcessConfig().getAuthConfig();
-
-        //判断是否有发起流程的权限
-        if (!WorkFlowUtil.hasPermissions(authConfig)) {
-            throw new MyException("没有此流程权限!");
-        }
-
-        //获取到流程定义
-        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(workflowSchema.getDeploymentId()).singleResult();
-
-        //流程参数  发布时  存到变量中
-        List<ProcessParamConfig> processParamConfigs = workflowSchemaConfig.getProcessConfig().getProcessParamConfigs();
-
-        long count = historyService.createHistoricProcessInstanceQuery().count();
-
-        Map<String, Object> processParam = WorkFlowUtil.getProcessParam(processParamConfigs, workflowSchema, count + 1, null);
-
-        //表单赋值
-//        initFormAssignment(dto.getFormData(), workflowSchema, workflowSchemaConfig, processParam);
-
-        //构建流程默认参数 (全局变量 发起人id、发起人名、模板id 、模板名、页面配置参数值、流水号)等
-        VariableMap variableMap = initDefaultParam(workflowSchema, processParam, count);
-
-        //根据规则生成流程名称
-        String processName = WorkFlowUtil.generatorProcessName(workflowSchema, workflowSchemaConfig, count + 1, null);
-        //根据规则生成流程名称
-        variableMap.putValue(WorkflowConstant.PROCESS_NAME, processName);
-
-        Optional<Map<String, Object>> startNodeMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(WorkflowConstant.BPMN_XML_START_EVENT_TYPE_NAME)).findFirst();
-
-        if (!startNodeMap.isPresent()) {
-            throw new MyException("当前任务没有开始节点");
-        }
-
-        //如果关联任务不为空 并且有数据
-        if (dto.getRelationTasks() != null && dto.getRelationTasks().size() > 0) {
-            variableMap.putValue(WorkflowConstant.RELATION_TASK_KEY, dto.getRelationTasks());
-        }
-
-        //将map 转为 java类
-        StartNodeConfig startNodeConfig = Convert.convert(StartNodeConfig.class, startNodeMap.get());
-
-        //定义sessionList  存储所有表提交的session  用于最后提交commit  保证事务
-        List<Session> sessionList = new ArrayList<>(dto.getFormData().size());
-
-        //定义map 用于存储 formId以及 主键keyValue {formId:keyValue}
-//        Map<String, Long> keyValueMap = new HashMap<>(dto.getFormData().size());
-
-        List<WorkflowFormRelation> relations = new ArrayList<>(dto.getFormData().size());
-
-        //提交表单数据  在发起任务之前  原因
-        //  1、需要提交数据之后的主键数据也塞入到map中
-        //  2、有可能流程图 开始节点之后就是网关 需要提前配置好网关的流转条件  需要提前配置好变量才能发起流程  不然影响流程走向
-        //  3、功能页面发起 数据会自带主键  需要调用更新接口
-        for (FormConfig formConfig : startNodeConfig.getFormConfigs()) {
-            Map<String, Object> thisFormData = dto.getFormData().get(formConfig.getKey());
-
-
-            //如果其中某一个事务出错,所有表单提交全部回滚
-            //formData 新增之后 会将主键加入到 map  所以不需要管
-            try {
-
-                //如果提交过 默认是update
-                FormExecuteWorkflowUpdateDto executeWorkflowUpdateDto = new FormExecuteWorkflowUpdateDto();
-                executeWorkflowUpdateDto.setFormId(formConfig.getFormId());
-                executeWorkflowUpdateDto.setFormData(thisFormData);
-                variableMap.putValue(formConfig.getKey(), thisFormData);
-
-                Triple<Session, Boolean, Long> sessionLongLongTriple = formExecuteService.workflowAddOrUpdate(executeWorkflowUpdateDto);
-
-                sessionList.add(sessionLongLongTriple.getLeft());
-
-                WorkflowFormRelation formRelation = new WorkflowFormRelation();
-                formRelation.setFormId(formConfig.getFormId());
-                formRelation.setFormKey(formConfig.getKey());
-                formRelation.setFormKeyValue(sessionLongLongTriple.getRight().toString());
-
-                relations.add(formRelation);
-            } catch (Exception e) {
-                log.error("提交表单数据失败(reLaunch):",e);
-                for (Session session : sessionList) {
-                    session.quietRollback();
-                }
-                throw new MyException("【表单id: " + formConfig.getFormId() + "】 提交错误, 请联系管理员!");
-            }
-
-        }
-
-        //将formid 以及 表单主键 存储到变量中
-//        variableMap.putValue(WorkflowConstant.PROCESS_FOMRID_KEYVALUE_KEY, keyValueMap);
-
-        //如果没有报错  所有表单提交事务 一起提交  提交有错误 也统一回滚
-
-
-        try {
-
-            //表单提交完毕后 发起流程
-            ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variableMap);
-
-            List<Task> list = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
-
-            List<LaunchAndApproveVo> result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
-
-            //如果不需要指定审批人 默认走自动同意规则
-            invokeAutoAgree(processInstance.getId(), workflowSchema.getId(), workflowSchemaConfig, list);
-
-            updateFileInfo(dto.getFileFolderIds(), processInstance.getId());
-
-            //保存 流程 表单 关联 数据
-            for (WorkflowFormRelation relation : relations) {
-                relation.setProcessId(processInstance.getId());
-            }
-
-            formRelationService.saveBatch(relations);
-
-
-            for (Session session : sessionList) {
-                session.getConnection().setAutoCommit(Boolean.FALSE);
-                session.commit();
-                session.close();
-            }
-
-            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
-            List<HistoricProcessInstance> childProcessinstance = historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(dto.getProcessId()).list();
-
-            for (HistoricProcessInstance processInstance1 : childProcessinstance) {
-
-                //获取到当前活动的实例
-                ActivityInstance activityInstance = runtimeService.getActivityInstance(processInstance1.getId());
-
-                //先停止当前活动示例  然后  关闭流程
-                runtimeService.createProcessInstanceModification(processInstance1.getId())
-                        .cancelActivityInstance(activityInstance.getId())
-                        .cancelAllForActivity(activityInstance.getId())
-                        .setAnnotation("【重新发起流程】")
-                        .execute();
-            }
-
-
-            //获取到当前活动的实例
-            ActivityInstance activityInstance = runtimeService.getActivityInstance(dto.getProcessId());
-
-            //如果获取不到当前活动实例  证明此流程  当前可能是在外部流程中  无需其他操作 关闭子流程 即可
-            if (activityInstance != null) {
-                runtimeService.deleteProcessInstance(dto.getProcessId(), "【重新发起流程】");
-            }
-
-            return result;
-        } catch (Exception e) {
-            for (Session session : sessionList) {
-                session.quietRollback();
-            }
-            if (e.getMessage().contains("No outgoing sequence flow")) {
-                throw new MyException("流转条件错误,请检查流转条件设置!");
-            } else {
-                throw new MyException("表单提交错误, 请联系系统管理员!");
-            }
-        }finally {
-            for (Session session : sessionList) {
-                session.close();
-            }
-        }
-
-    }
-
-
-    private void updateFileInfo(List<Long> fileFolderIds, String processId) {
-        if (fileFolderIds != null && fileFolderIds.size() > 0) {
-            File file = new File();
-            file.setProcessId(processId);
-            LambdaQueryWrapper<File> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-            lambdaQueryWrapper.in(File::getFolderId, fileFolderIds);
-            fileService.update(file, lambdaQueryWrapper);
-        }
-    }
-
-    @Override
-    public long pendingCount() {
-
-        SaSession tokenSession = StpUtil.getTokenSession();
-        User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        TaskQuery taskQuery = taskService.createTaskQuery()
-                .active()
-                .taskVariableValueEquals(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-                .processVariableValueEquals(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.NO.getCode())
-                .taskVariableValueLike(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StringPool.PERCENT + user.getId() + StringPool.PERCENT);
-        return taskQuery.count();
-    }
-
-    @Override
-    public PageOutput<PendingTaskVo> pending(PendingTaskPageDto dto) {
-
-        SaSession tokenSession = StpUtil.getTokenSession();
-        User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        TaskQuery taskQuery = taskService.createTaskQuery()
-                .active()
-                .taskVariableValueEquals(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-                .processVariableValueEquals(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.NO.getCode())
-                .taskVariableValueLike(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StringPool.PERCENT + user.getId() + StringPool.PERCENT);
-        //
-        if (dto.getStartTime() != null) {
-            taskQuery.taskCreatedAfter(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-        }
-        if (dto.getEndTime() != null) {
-            taskQuery.taskCreatedBefore(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-
-        if (StrUtil.isNotBlank(dto.getKeyword())) {
-            taskQuery.or()
-                    .processVariableValueLike(WorkflowConstant.PROCESS_NAME, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT)
-                    .endOr();
-        } else {
-            if (StrUtil.isNotBlank(dto.getSerialNumber()) && StrUtil.isNumeric(dto.getSerialNumber())) {//数字类型,直接查询
-                taskQuery.processVariableValueEquals(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY, Long.valueOf(dto.getSerialNumber()));
-            }
-            if (StrUtil.isNotBlank(dto.getName())) {
-                taskQuery.processVariableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getName() + StringPool.PERCENT);
-            }
-            if (StrUtil.isNotBlank(dto.getOriginator())) {
-                taskQuery.or()
-                        .processVariableValueEquals(WorkflowConstant.PROCESS_START_USER_NAME_KEY, dto.getOriginator())
-                        .processVariableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, dto.getOriginator())
-                        .endOr();
-            }
-            if (StrUtil.isNotBlank(dto.getTaskName())) {
-                taskQuery.taskNameLike(StringPool.PERCENT + dto.getTaskName() + StringPool.PERCENT);
-            }
-        }
-
-
-        long count = taskQuery.count();
-
-        List<Task> tasks = taskQuery.orderByTaskCreateTime().desc().listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
-
-
-        List<PendingTaskVo> result = new ArrayList<>(tasks.size());
-
-        //获取到所有taskid  去extra表一次性查出数据
-        List<String> taskIds = tasks.stream().map(Task::getId).collect(Collectors.toList());
-
-        if (taskIds.size() > 0) {
-
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getTaskId, taskIds));
-            for (Task task : tasks) {
-                PendingTaskVo vo = new PendingTaskVo();
-                Optional<WorkflowExtra> extra = workflowExtras.stream().filter(x -> x.getTaskId().equals(task.getId())).findFirst();
-                extra.ifPresent(x -> {
-                    vo.setId(x.getId());
-                    vo.setSerialNumber(x.getSerialNumber());
-                    vo.setSchemaName(x.getSchemaName());
-                    vo.setStartUserName(x.getStartUserName());
-                    vo.setSchemaId(x.getSchemaId());
-                    vo.setSerialNumber(x.getSerialNumber());
-                    vo.setCurrentProgress(x.getCurrentProgress());
-                    vo.setProcessName(x.getProcessName());
-                });
-                vo.setProcessId(task.getProcessInstanceId());
-                vo.setTaskId(task.getId());
-                vo.setTaskName(task.getName());
-                vo.setStartTime(DateUtil.toLocalDateTime(task.getCreateTime()));
-                result.add(vo);
-            }
-        }
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())) {//流水号不为数字类型,直接对结果集置空
-            result.clear();
-        }
-        PageOutput<PendingTaskVo> output = new PageOutput<>();
-        output.setCurrentPage(dto.getLimit());
-        output.setPageSize(dto.getSize());
-        output.setTotal(Convert.toInt(count));
-        output.setList(result);
-        return output;
-    }
-
-    @Override
-    public Page<PendingTaskVo> myExamine(Page<PendingTaskVo> page, MyExaminePageDto dto) {
-        //获取登录者信息
-        SaSession tokenSession = StpUtil.getTokenSession();
-        User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        List<String> taskIds = new ArrayList<>();
-        List<WorkflowApproveRecord> list = approveRecordService.list(
-            new QueryWrapper<WorkflowApproveRecord>().lambda()
-            .eq(WorkflowApproveRecord::getApproveUserId, user.getId())
-        );
-        taskIds = list.stream().map(WorkflowApproveRecord::getTaskId).collect(Collectors.toList());
-//        if(dto.getStatus() != null && dto.getStatus() == 1){
-//
-//        }else if(dto.getStatus() != null && dto.getStatus() == 0){
-//            TaskQuery taskQuery = taskService.createTaskQuery()
-//                    .active()
-//                    .taskVariableValueEquals(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-//                    .processVariableValueEquals(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.NO.getCode())
-//                    .taskVariableValueLike(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StringPool.PERCENT + user.getId() + StringPool.PERCENT);
-//            //
-//            if (dto.getStartTime() != null) {
-//                taskQuery.taskCreatedAfter(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-//            }
-//            if (dto.getEndTime() != null) {
-//                taskQuery.taskCreatedBefore(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-//            }
-//
-//            if (StrUtil.isNotBlank(dto.getKeyword())) {
-//                taskQuery.or()
-//                        .processVariableValueLike(WorkflowConstant.PROCESS_NAME, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT)
-//                        .endOr();
-//            } else {
-//                if (StrUtil.isNotBlank(dto.getSerialNumber()) && StrUtil.isNumeric(dto.getSerialNumber())) {//数字类型,直接查询
-//                    taskQuery.processVariableValueEquals(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY, Long.valueOf(dto.getSerialNumber()));
-//                }
-//                if (StrUtil.isNotBlank(dto.getName())) {
-//                    taskQuery.processVariableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getName() + StringPool.PERCENT);
-//                }
-//                if (StrUtil.isNotBlank(dto.getOriginator())) {
-//                    taskQuery.or()
-//                            .processVariableValueEquals(WorkflowConstant.PROCESS_START_USER_NAME_KEY, dto.getOriginator())
-//                            .processVariableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, dto.getOriginator())
-//                            .endOr();
-//                }
-//                if (StrUtil.isNotBlank(dto.getTaskName())) {
-//                    taskQuery.taskNameLike(StringPool.PERCENT + dto.getTaskName() + StringPool.PERCENT);
-//                }
-//            }
-//
-//            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());
-//        }
-        dto.setTaskIds(taskIds);
-        return xjrWorkflowExtraMapper.myApproveRecord(page, dto);
-    }
-
-
-    @Override
-    @SneakyThrows
-    @Transactional(rollbackFor = Exception.class)
-    public List<LaunchAndApproveVo> newApprove(ApproveDto dto) {
-        //根据taskid  获取任务信息
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-
-        if (task == null) {
-            throw new MyException("找不到此任务!");
-        }
-
-        //获取当前任务变量中的  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)));
-
-//        //获取工作流配置信息
-//        WorkflowSchema workflowSchema = workflowSchemaMapper.selectById(schemaId);
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-        //找到当前用户任务节点的配置信息
-        Optional<Map<String, Object>> userTaskMapOptional = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-        //判断是否找得到此任务节点 没有则报错
-        if (!userTaskMapOptional.isPresent()) {
-            throw new MyException("【任务id :" + task.getId() + "】 用户任务节点配置有误,请联系管理员!");
-        }
-
-        //将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskMapOptional.get());
-
-        //判断 如果有开启签章  就判断签章 和 密码是否正确
-        if (userTaskConfig.getOpinionConfig().getEnabled() && userTaskConfig.getOpinionConfig().getSignature() == YesOrNoEnum.YES.getCode() && ObjectUtil.isNotNull(dto.getStampId())) {
-            Stamp stamp = stampService.getById(dto.getStampId());
-            if (ObjectUtil.isNull(stamp)) {
-                throw new MyException("找不到此签章!");
-            }
-            if (!StrUtil.equals(stamp.getPassword(), dto.getStampPassword())) {
-                throw new MyException("签章密码错误!");
-            }
-        }
-
-        //查出所有表单数据
-        VariableMap variableMap = Variables.createVariables();
-
-        //查出所有表单数据
-        List<VariableInstance> allFormVar = runtimeService.createVariableInstanceQuery()
-                .processInstanceIdIn(task.getProcessInstanceId())
-                .variableNameLike(WorkflowConstant.PROCESS_FORMDATA_PREFIX_KEY + StringPool.PERCENT)
-                .list();
-
-        for (VariableInstance variableInstance : allFormVar) {
-            variableMap.putValue(variableInstance.getName(), variableInstance.getValue());
-        }
-
-        //定义sessionList  存储所有表提交的session  用于最后提交commit  保证事务
-        List<Session> sessionList = new ArrayList<>(userTaskConfig.getFormConfigs().size());
-
-        //获取流程变量的值
-        Object variable = runtimeService.getVariable(task.getProcessInstanceId(), WorkflowConstant.PROCESS_PARAM_KEY);
-
-        Map<String, Object> processParam = Convert.toMap(String.class, Object.class, variable);
-//        WorkFlowUtil.invokeFormAssignment(dto.getFormData(), userTaskConfig.getAssignmentConfig(), userTaskConfig.getFormConfigs(), processParam);
-
-        //获取到整个流程已经新增过的表单数据
-//        Object keyValueMapObject = runtimeService.getVariable(task.getProcessInstanceId(), WorkflowConstant.PROCESS_FOMRID_KEYVALUE_KEY);
-//        Map<String, Long> keyValueMap = Convert.toMap(String.class, Long.class, keyValueMapObject);
-//        if (keyValueMap == null) {
-//            keyValueMap = new HashMap<>();
-//        }
-
-        ButtonConfig buttonConfig = userTaskConfig.getButtonConfigs().stream().filter(b -> b.getButtonCode().equals(dto.getApprovedResult())).findFirst().orElse(new ButtonConfig());
-
-        //如果是其他按钮
-        if (dto.getApprovedType() == WorkflowApproveType.OTHER.getCode()) {
-
-            //如果是执行api
-            if (buttonConfig.getButtonType() == 2) {
-                ApiConfig apiConfig = buttonConfig.getApiConfig();
-                IMagicApiService magicApiService = SpringUtil.getBean(IMagicApiService.class);
-                MagicAPIService magicAPIService = SpringUtil.getBean(MagicAPIService.class);
-
-                Object varObj = runtimeService.getVariables(task.getProcessInstanceId());
-                Map<String, Object> varMap = Convert.toMap(String.class, Object.class, varObj);
-
-                MagicApiInfoVo info = magicApiService.info(apiConfig.getId());
-
-                Map<String, Object> params = new HashMap<>();
-
-                for (ApiRequestParamsConfig requestParamsConfig : apiConfig.getRequestParamsConfigs()) {
-                    WorkFlowUtil.initApiParams(processParam, varMap, params, requestParamsConfig);
-                }
-                for (ApiRequestParamsConfig requestHeaderConfig : apiConfig.getRequestHeaderConfigs()) {
-                    WorkFlowUtil.initApiParams(processParam, varMap, params, requestHeaderConfig);
-                }
-                for (ApiRequestParamsConfig requestBodyConfig : apiConfig.getRequestBodyConfigs()) {
-                    WorkFlowUtil.initApiParams(processParam, varMap, params, requestBodyConfig);
-                }
-                magicAPIService.execute(info.getMethod(), info.getPath(), params);
-            }
-            //如果是执行脚本
-            else {
-                Map<String, Object> param = new HashMap<>();
-                param.put("language", buttonConfig.getScriptLanguage());
-                param.put("content", buttonConfig.getScriptContent());
-                redisUtil.set(WorkflowConstant.BUTTON_EVENT_CACHE_PRE + task.getId(), param, 10);
-            }
-        }
-
-        LambdaQueryWrapper<WorkflowFormRelation> eq = Wrappers.lambdaQuery(WorkflowFormRelation.class).eq(WorkflowFormRelation::getProcessId, task.getProcessInstanceId());
-        List<WorkflowFormRelation> formRelationList = formRelationService.list(eq);
-        List<WorkflowFormRelation> newFormRelationList = new ArrayList<>();
-
-        List<LaunchAndApproveVo> result = new ArrayList<>();
-
-        try {
-            for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-                Map<String, Object> formData = dto.getFormData().get(formConfig.getKey());
-                variableMap.putValue(formConfig.getKey(), formData);
-
-                //判断此表单是否已经提交过
-
-                if (formRelationList.stream().anyMatch(r -> Objects.equals(r.getFormId(), formConfig.getFormId()) && r.getFormKey().equals(formConfig.getKey()))) {
-
-                    //如果提交过 默认是update
-                    FormExecuteWorkflowUpdateDto executeWorkflowUpdateDto = new FormExecuteWorkflowUpdateDto();
-                    executeWorkflowUpdateDto.setFormId(formConfig.getFormId());
-                    executeWorkflowUpdateDto.setFormData(formData);
-
-                    Triple<Session, Long, Long> sessionLongLongTriple = formExecuteService.workflowUpdate(executeWorkflowUpdateDto);
-                    //如果是已经提交过的表单 变量keyValueMap 已经存在 没有必要在新增
-                    sessionList.add(sessionLongLongTriple.getLeft());
-
-                } else {
-                    //如果没有提交过 默认是add
-                    FormExecuteWorkflowAddDto executeWorkflowAddDto = new FormExecuteWorkflowAddDto();
-                    executeWorkflowAddDto.setFormId(formConfig.getFormId());
-                    executeWorkflowAddDto.setFormData(formData);
-
-                    Triple<Session, Long, Long> sessionLongLongTriple = formExecuteService.workflowAdd(executeWorkflowAddDto);
-                    sessionList.add(sessionLongLongTriple.getLeft());
-
-                    WorkflowFormRelation relation = new WorkflowFormRelation();
-                    relation.setProcessId(task.getProcessInstanceId());
-                    relation.setFormId(formConfig.getFormId());
-                    relation.setFormKey(formConfig.getKey());
-                    relation.setFormKeyValue(sessionLongLongTriple.getRight().toString());
-
-                    newFormRelationList.add(relation);
-
-//                    keyValueMap.put(formConfig.getKey(), sessionLongLongTriple.getRight());
-
-                }
-            }
-
-            formRelationService.saveBatch(newFormRelationList);
-
-            //将formid 以及 表单主键 存储到变量中
-//            variableMap.putValue(WorkflowConstant.PROCESS_FOMRID_KEYVALUE_KEY, keyValueMap);
-
-//            //----------------------------------参数赋值------------------------------------------------
-//            WorkFlowUtil.invokeParamAssignment(userTaskConfig.getAssignmentConfig(), processParam,workflowSchema);
-//
-//            variableMap.putValue(WorkflowConstant.PROCESS_PARAM_KEY, processParam);
-//
-//            //----------------------------------参数赋值------------------------------------------------
-
-            WorkFlowUtil.cacheTaskAssigneeRecord(task.getProcessInstanceId(), task.getId(), StpUtil.getLoginIdAsLong());
-
-            WorkFlowUtil.cacheTaskApproveType(task.getProcessInstanceId(), task.getId(), dto.getApprovedType());
-
-            User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-            //将表单数据 | 流程线数据 | keyValueMap 存入变量
-            runtimeService.setVariables(task.getProcessInstanceId(), variableMap);
-
-
-            List<String> variableNames = ListUtil.toList(
-                    WorkflowConstant.PROCESS_SCHEMA_ID_KEY,
-                    WorkflowConstant.PROCESS_START_USER_ID_KEY,
-                    WorkflowConstant.PROCESS_START_USER_NAME_KEY,
-                    WorkflowConstant.PROCESS_SCHEMA_NAME_KEY,
-                    WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY);
-
-            Map<String, Object> variableMaps = runtimeService.getVariables(task.getProcessInstanceId(), variableNames);
-            //如果有设置 传阅人  加入到变量中
-            String circulateMessage = "";
-            if (dto.getCirculateConfigs().size() > 0) {
-                circulateMessage = initCirculate(task, dto.getCirculateConfigs(), workflowSchemaConfig, userTaskConfig, variableMaps);
-            }
-
-
-            //任务设置审批意见
-            taskService.createComment(task.getId(), task.getProcessInstanceId(), dto.getApprovedContent());
-
-
-            //新增任务审批记录
-            WorkflowApproveRecord approveRecord = new WorkflowApproveRecord();
-            approveRecord.setSchemaId(schemaId);
-            approveRecord.setCurrentProgress(userTaskConfig.getCurrentProgress());
-            approveRecord.setSerialNumber(MapUtil.getLong(variableMaps, WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY));
-            approveRecord.setApproveComment(dto.getApprovedContent());
-            approveRecord.setApproveTime(LocalDateTime.now());
-            approveRecord.setApproveUserId(StpUtil.getLoginIdAsLong());
-            approveRecord.setApproveStamp(dto.getStampId());
-            approveRecord.setProcessId(task.getProcessInstanceId());
-            approveRecord.setTaskId(task.getId());
-            approveRecord.setTaskDefinitionKey(task.getTaskDefinitionKey());
-            approveRecord.setTaskName(task.getName());
-            approveRecord.setStartUserId(MapUtil.getLong(variableMaps, WorkflowConstant.PROCESS_START_USER_ID_KEY));
-            approveRecord.setApproveUserPostId(user.getPostId());
-            approveRecord.setApproveType(dto.getApprovedType());
-            approveRecord.setApproveResult(buttonConfig.getButtonName());
-
-            approveRecordService.save(approveRecord);
-
-            WorkflowExtra extra = new WorkflowExtra();
-            extra.setEndTime(LocalDateTime.now());
-            extraService.update(extra, Wrappers.lambdaQuery(WorkflowExtra.class).eq(WorkflowExtra::getTaskId, dto.getTaskId()));
-
-            String resultVarName = task.getTaskDefinitionKey() +
-                    StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                    WorkflowConstant.BUTTON_APPROVE_VAR_FLAG +
-                    StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                    WorkflowConstant.BUTTON_APPROVE_RESULT_VAR_FLAG;
-
-            //审批所选按钮需要保存到变量表中  因为流程线可能用上
-            // 先判断是否为会签节点  如果是会签节点 变量数据 会有审批结果
-            //  审批结果
-            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-                String buttonVarName = task.getTaskDefinitionKey() + StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE + WorkflowConstant.BUTTON_APPROVE_VAR_FLAG;
-                runtimeService.setVariable(task.getProcessInstanceId(), buttonVarName, dto.getApprovedResult());
-            } else {
-                String agreeButtonVarName = task.getTaskDefinitionKey() +
-                        StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                        WorkflowConstant.BUTTON_APPROVE_VAR_FLAG +
-                        StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                        WorkflowConstant.BUTTON_AGREE_APPROVE_VAR_FLAG;
-
-                String rejectButtonVarName = task.getTaskDefinitionKey() +
-                        StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                        WorkflowConstant.BUTTON_APPROVE_VAR_FLAG +
-                        StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                        WorkflowConstant.BUTTON_REJECT_APPROVE_VAR_FLAG;
-
-                //如果是点击的同意  默认查询同意 总和 如果有 就 +1  如果没有 设置为1
-                if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
-                    Object agreeObj = runtimeService.getVariable(task.getProcessInstanceId(), agreeButtonVarName);
-                    int nowAgreeCount = Convert.toInt(agreeObj) + 1;
-                    runtimeService.setVariable(task.getProcessInstanceId(), agreeButtonVarName, nowAgreeCount);
-
-
-                    //如果是全部 需要全部同意
-                    if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.ALL.getCode()) {
-                        Object nrOfInstances = runtimeService.getVariable(task.getExecutionId(), WorkflowConstant.MULTI_INSTANCE_VAR_KEY);
-                        if (Objects.equals(nowAgreeCount, Convert.toInt(nrOfInstances))) {
-                            runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.TRUE);
-                        }
-                    }
-
-                    //如果是单个 代码只要能执行到此处 就代表已经会签通过了
-                    if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.SINGLE.getCode()) {
-                        runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.TRUE);
-                    }
-
-                    //如果是百分比
-                    if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.PERCENTAGE.getCode()) {
-                        Object nrOfInstances = runtimeService.getVariable(task.getExecutionId(), WorkflowConstant.MULTI_INSTANCE_VAR_KEY);
-
-                        //判断是否达到百分比
-                        if ((Convert.toDouble(nowAgreeCount) / Convert.toDouble(nrOfInstances) * 100) > Convert.toDouble(userTaskConfig.getCountersignConfig().getPercentage())) {
-                            runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.TRUE);
-                        }
-
-                    }
-
-                } else {
-                    Object rejectObj = runtimeService.getVariable(task.getProcessInstanceId(), rejectButtonVarName);
-                    int nowRejectCount = Convert.toInt(rejectObj) + 1;
-                    runtimeService.setVariable(task.getProcessInstanceId(), rejectButtonVarName, nowRejectCount);
-
-                    //如果是全部 需要全部同意 只要代码进入这里 就代表  已经 会签不通过
-                    if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.ALL.getCode()) {
-                        runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.FALSE);
-                    }
-                }
-
-            }
-
-            Object resultName = new Object();
-            //获取会签流程的结果,防止会签节点后面直接跟结束节点,导致拿不到流程数据
-            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
-                resultName = runtimeService.getVariable(task.getProcessInstanceId(), resultVarName);
-            }
-
-            //如果是同意  || 拒绝  || 其他  默认都是流程往下走
-            if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.OTHER.getCode()) {
-
-                //新增流程发起流程记录
-                WorkflowRecord record = new WorkflowRecord();
-                record.setNodeId(task.getId());
-                record.setNodeName(task.getName());
-                record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-                record.setProcessId(task.getProcessInstanceId());
-                record.setSchemaId(schemaId);
-                record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-                //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
-                record.setRecordTime(LocalDateTime.now());
-                //当前任务的名称
-                String oldTaskName = task.getName();
-                record.setCirculateMessage(circulateMessage);
-
-                taskService.complete(task.getId());
-                List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-                result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
-
-                //下一个节点的任务名称集合
-                List<String> nextTaskNameList = list.stream().map(Task::getName).collect(Collectors.toList());
-
-                //如果不需要指定审批人 默认走自动同意规则
-                invokeAutoAgree(task.getProcessInstanceId(), workflowSchema.getId(), workflowSchemaConfig, list);
-
-                //新增工作流程信息数据
-                addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, oldTaskName, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
-
-            }
-
-            //如果是驳回
-            if (dto.getApprovedType() == WorkflowApproveType.REJECT.getCode()) {
-                //获取到当前活动的实例
-                ActivityInstance activityInstance = runtimeService.getActivityInstance(task.getProcessInstanceId());
-
-                //先停止当前活动示例  然后  测回流程到指定节点
-                runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
-                        .cancelActivityInstance(activityInstance.getId())
-                        .setAnnotation("【审批人:" + user.getName() + "】 驳回 【任务:" + task.getId() + "】")
-                        .startBeforeActivity(dto.getRejectNodeActivityId())
-                        .execute();
-
-
-                Optional<Map<String, Object>> rejectNodeMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(dto.getRejectNodeActivityId())).findFirst();
-
-                rejectNodeMap.ifPresent(node -> {
-                    //将map 转为 java类
-                    UserTaskConfig rejectUserTaskConfig = Convert.convert(UserTaskConfig.class, node);
-
-                    //新增流程发起流程记录
-                    WorkflowRecord record = new WorkflowRecord();
-                    record.setNodeId(task.getId());
-                    record.setNodeName(task.getName());
-                    record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-                    record.setProcessId(task.getProcessInstanceId());
-                    record.setSchemaId(schemaId);
-                    record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-                    record.setRecordTime(LocalDateTime.now().minusSeconds(+1));//时间设置提前1秒钟,好排序
-
-//                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
-                    record.setMessage("审批信息:【" + user.getName() + "】【驳回】审批,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
-                    workflowRecordMapper.insert(record);
-                });
-
-            }
-            //如果是结束
-            if (dto.getApprovedType() == WorkflowApproveType.FINISH.getCode()) {
-                //获取到当前活动的实例
-                ActivityInstance activityInstance = runtimeService.getActivityInstance(task.getProcessInstanceId());
-
-                //先停止当前活动示例  然后  关闭流程
-                runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
-                        .cancelActivityInstance(activityInstance.getId())
-                        .cancelAllForActivity(activityInstance.getId())
-                        .setAnnotation("【审批人:" + user.getName() + "】 结束 【任务:" + task.getId() + "】")
-                        .execute();
-
-                //新增流程发起流程记录
-                WorkflowRecord record = new WorkflowRecord();
-                record.setNodeId(task.getId());
-                record.setNodeName(task.getName());
-                record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-                record.setProcessId(task.getProcessInstanceId());
-                record.setSchemaId(schemaId);
-                record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-                record.setRecordTime(LocalDateTime.now());
-
-                record.setMessage("【审批人:" + user.getName() + "】 结束 【任务:" + task.getName() + "】");
-
-                workflowRecordMapper.insert(record);
-
-            }
-
-            updateFileInfo(dto.getFileFolderIds(), task.getProcessInstanceId());
-
-            for (Session session : sessionList) {
-                session.getConnection().setAutoCommit(Boolean.FALSE);
-                session.commit();
-                session.close();
-            }
-
-        } catch (Exception e) {
-            for (Session session : sessionList) {
-                session.quietRollback();
-            }
-            if (e.getMessage().contains("sequence flow")) {
-                throw new MyException("流转条件错误,请检查流转条件设置!");
-            } else {
-                throw new MyException("表单提交错误, 请联系系统管理员!");
-            }
-        }
-
-
-        return result;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public List<ApproveMultiVo> approveMulti(ApproveMultiDto dto) {
-
-        List<Task> taskList = taskService.createTaskQuery().taskIdIn(dto.getTaskIds().toArray(new String[0])).list();
-
-
-        List<String> variableNames = ListUtil.toList(
-                WorkflowConstant.PROCESS_SCHEMA_ID_KEY,
-                WorkflowConstant.PROCESS_START_USER_ID_KEY,
-                WorkflowConstant.PROCESS_START_USER_NAME_KEY,
-                WorkflowConstant.PROCESS_SCHEMA_NAME_KEY,
-                WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY,
-                WorkflowConstant.PROCESS_PARAM_KEY);
-
-        List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceIdIn(taskList.stream().map(Task::getProcessInstanceId).toArray(String[]::new))
-                .variableNameIn(variableNames.toArray(new String[0]))
-                .list();
-
-        List<HistoricVariableInstance> formDataList = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceIdIn(taskList.stream().map(Task::getProcessInstanceId).toArray(String[]::new))
-                .variableNameLike(WorkflowConstant.PROCESS_FORMDATA_PREFIX_KEY + StringPool.PERCENT)
-                .list();
-
-        List<Object> allSchemaId = varList.stream().filter(x -> x.getName().equals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY)).map(HistoricVariableInstance::getValue).collect(Collectors.toList());
-
-        //排除xml 查出数据
-        List<WorkflowSchema> workflowSchemaList = workflowSchemaMapper.selectList(Wrappers.lambdaQuery(WorkflowSchema.class).in(WorkflowSchema::getId, allSchemaId).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        //定义sessionList  存储所有表提交的session  用于最后提交commit  保证事务
-        List<Session> sessionList = new ArrayList<>();
-        List<ApproveMultiVo> approveMultiVoList = new ArrayList<>();
-        try {
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getTaskId, dto.getTaskIds()));
-            for (String taskId : dto.getTaskIds()) {
-                Task task = taskList.stream().filter(t -> t.getId().equals(taskId)).findFirst().orElse(new TaskEntity());
-                HistoricVariableInstance schemaIdInstance = varList.stream().filter(v -> v.getName().equals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY) && v.getProcessInstanceId().equals(task.getProcessInstanceId())).findFirst().orElse(new HistoricVariableInstanceEntity());
-
-                //获取当前任务变量中的  schemaId
-                Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-
-                WorkflowSchema workflowSchema = workflowSchemaList.stream().filter(w -> w.getId().equals(Convert.toLong(schemaIdInstance.getValue()))).findFirst().orElse(new WorkflowSchema());
-                //获取到整个流程模板的配置
-                WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-                //找到当前用户任务节点的配置信息
-                Optional<Map<String, Object>> userTaskMapOptional = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-                //判断是否找得到此任务节点 没有则报错
-                if (!userTaskMapOptional.isPresent()) {
-                    throw new MyException("【任务id :" + task.getId() + "】 用户任务节点配置有误,请联系管理员!");
-                }
-
-                //将map 转为 java类
-                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskMapOptional.get());
-
-                //判断 如果有开启签章  就判断签章 和 密码是否正确
-                if (userTaskConfig.getOpinionConfig().getEnabled() && userTaskConfig.getOpinionConfig().getSignature() == YesOrNoEnum.YES.getCode() && ObjectUtil.isNotNull(dto.getStampId())) {
-                    Stamp stamp = stampService.getById(dto.getStampId());
-                    if (ObjectUtil.isNull(stamp)) {
-                        throw new MyException("找不到此签章!");
-                    }
-                    if (!StrUtil.equals(stamp.getPassword(), dto.getStampPassword())) {
-                        throw new MyException("签章密码错误!");
-                    }
-                }
-
-                HistoricVariableInstance processParamInstance = varList.stream().filter(v -> v.getName().equals(WorkflowConstant.PROCESS_PARAM_KEY) && v.getProcessInstanceId().equals(task.getProcessInstanceId())).findFirst().orElse(new HistoricVariableInstanceEntity());
-                //获取流程变量的值
-                Map<String, Object> processParam = Convert.toMap(String.class, Object.class, processParamInstance.getValue());
-
-                //获取到当前流程的所有表单数据
-                List<HistoricVariableInstance> thisTaskFormData = formDataList.stream().filter(x -> x.getProcessInstanceId().equals(task.getProcessInstanceId())).collect(Collectors.toList());
-
-                //拼凑成表单 Map<String, Map<String, Object>> 类型
-                Map<String, Map<String, Object>> allFormData = new HashMap<>();
-                VariableMap variableMap = Variables.createVariables();
-
-                for (HistoricVariableInstance variableInstance : thisTaskFormData) {
-                    allFormData.put(variableInstance.getName(), Convert.toMap(String.class, Object.class, variableInstance.getValue()));
-                }
-
-                WorkFlowUtil.invokeFormAssignment(allFormData, userTaskConfig.getAssignmentConfig(), userTaskConfig.getFormConfigs(), processParam);
-
-
-                for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-                    Map<String, Object> formData = allFormData.get(formConfig.getKey());
-
-                    variableMap.putValue(formConfig.getKey(), formData);
-
-                    //表单已经提交过 默认是update
-                    FormExecuteWorkflowUpdateDto executeWorkflowUpdateDto = new FormExecuteWorkflowUpdateDto();
-                    executeWorkflowUpdateDto.setFormId(formConfig.getFormId());
-                    executeWorkflowUpdateDto.setFormData(formData);
-
-                    Triple<Session, Boolean, Long> sessionLongLongTriple = formExecuteService.workflowAddOrUpdate(executeWorkflowUpdateDto);
-                    //如果是已经提交过的表单 变量keyValueMap 已经存在 没有必要在新增
-                    sessionList.add(sessionLongLongTriple.getLeft());
-                }
-
-//                //----------------------------------参数赋值------------------------------------------------
-//                WorkFlowUtil.invokeParamAssignment(userTaskConfig.getAssignmentConfig(), processParam,workflowSchema);
-//
-//                variableMap.putValue(WorkflowConstant.PROCESS_PARAM_KEY, processParam);
-//
-//                //----------------------------------参数赋值------------------------------------------------
-
-                WorkFlowUtil.cacheTaskAssigneeRecord(task.getProcessInstanceId(), task.getId(), StpUtil.getLoginIdAsLong());
-
-                WorkFlowUtil.cacheTaskApproveType(task.getProcessInstanceId(), task.getId(), dto.getApprovedType());
-
-                //将表单数据 | 流程线数据 | keyValueMap 存入变量
-                runtimeService.setVariables(task.getProcessInstanceId(), variableMap);
-
-                //任务设置审批意见
-                taskService.createComment(task.getId(), task.getProcessInstanceId(), dto.getApprovedContent());
-
-                HistoricVariableInstance serialNumberInstance = varList.stream().filter(v -> v.getName().equals(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY) && v.getProcessInstanceId().equals(task.getProcessInstanceId())).findFirst().orElse(new HistoricVariableInstanceEntity());
-                HistoricVariableInstance startUserIdInstance = varList.stream().filter(v -> v.getName().equals(WorkflowConstant.PROCESS_START_USER_ID_KEY) && v.getProcessInstanceId().equals(task.getProcessInstanceId())).findFirst().orElse(new HistoricVariableInstanceEntity());
-
-                //新增任务审批记录
-                WorkflowApproveRecord approveRecord = new WorkflowApproveRecord();
-                approveRecord.setSchemaId(Convert.toLong(schemaIdInstance.getValue()));
-                approveRecord.setCurrentProgress(userTaskConfig.getCurrentProgress());
-                approveRecord.setSerialNumber(Convert.toLong(serialNumberInstance.getValue()));
-                approveRecord.setApproveComment(dto.getApprovedContent());
-                approveRecord.setApproveTime(LocalDateTime.now());
-                approveRecord.setApproveUserId(StpUtil.getLoginIdAsLong());
-                approveRecord.setApproveUserPostId(user.getPostId());
-                approveRecord.setApproveStamp(dto.getStampId());
-                approveRecord.setProcessId(task.getProcessInstanceId());
-                approveRecord.setTaskId(task.getId());
-                approveRecord.setTaskDefinitionKey(task.getTaskDefinitionKey());
-                approveRecord.setTaskName(task.getName());
-                approveRecord.setStartUserId(Convert.toLong(startUserIdInstance.getValue()));
-
-                Optional<ButtonConfig> buttonConfig = userTaskConfig.getButtonConfigs().stream().filter(b -> b.getApproveType() == dto.getApprovedType()).findFirst();
-                buttonConfig.ifPresent(button -> {
-                    approveRecord.setApproveResult(button.getButtonName());
-                });
-
-                approveRecordService.save(approveRecord);
-
-                WorkflowExtra extra = new WorkflowExtra();
-                extra.setEndTime(LocalDateTime.now());
-                extraService.update(extra, Wrappers.lambdaQuery(WorkflowExtra.class).eq(WorkflowExtra::getTaskId, taskId));
-
-                String resultVarName = task.getTaskDefinitionKey() +
-                        StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                        WorkflowConstant.BUTTON_APPROVE_VAR_FLAG +
-                        StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                        WorkflowConstant.BUTTON_APPROVE_RESULT_VAR_FLAG;
-
-                //审批所选按钮需要保存到变量表中  因为流程线可能用上
-                // 先判断是否为会签节点  如果是会签节点 变量数据 会有审批结果
-                //  审批结果
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-                    String buttonVarName = task.getTaskDefinitionKey() + StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE + WorkflowConstant.BUTTON_APPROVE_VAR_FLAG;
-                    if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
-                        runtimeService.setVariable(task.getProcessInstanceId(), buttonVarName, "agree");
-                    }
-                    if (dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode()) {
-                        runtimeService.setVariable(task.getProcessInstanceId(), buttonVarName, "disagree");
-                    }
-                } else {
-                    String agreeButtonVarName = task.getTaskDefinitionKey() +
-                            StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                            WorkflowConstant.BUTTON_APPROVE_VAR_FLAG +
-                            StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                            WorkflowConstant.BUTTON_AGREE_APPROVE_VAR_FLAG;
-
-                    String rejectButtonVarName = task.getTaskDefinitionKey() +
-                            StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                            WorkflowConstant.BUTTON_APPROVE_VAR_FLAG +
-                            StringPool.UNDERSCORE + StringPool.UNDERSCORE + StringPool.UNDERSCORE +
-                            WorkflowConstant.BUTTON_REJECT_APPROVE_VAR_FLAG;
-
-
-                    //如果是点击的同意  默认查询同意 总和 如果有 就 +1  如果没有 设置为1
-                    if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
-                        Object agreeObj = runtimeService.getVariable(task.getProcessInstanceId(), agreeButtonVarName);
-                        int nowAgreeCount = Convert.toInt(agreeObj) + 1;
-                        runtimeService.setVariable(task.getProcessInstanceId(), agreeButtonVarName, nowAgreeCount);
-
-
-                        //如果是全部 需要全部同意
-                        if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.ALL.getCode()) {
-                            Object nrOfInstances = runtimeService.getVariable(task.getExecutionId(), WorkflowConstant.MULTI_INSTANCE_VAR_KEY);
-                            if (Objects.equals(nowAgreeCount, Convert.toInt(nrOfInstances))) {
-                                runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.TRUE);
-                            }
-                        }
-
-                        //如果是单个 代码只要能执行到此处 就代表已经会签通过了
-                        if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.SINGLE.getCode()) {
-                            runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.TRUE);
-                        }
-
-                        //如果是百分比
-                        if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.PERCENTAGE.getCode()) {
-                            Object nrOfInstances = runtimeService.getVariable(task.getExecutionId(), WorkflowConstant.MULTI_INSTANCE_VAR_KEY);
-
-                            //判断是否达到百分比
-                            if ((Convert.toDouble(nowAgreeCount) / Convert.toDouble(nrOfInstances) * 100) > Convert.toDouble(userTaskConfig.getCountersignConfig().getPercentage())) {
-                                runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.TRUE);
-                            }
-
-                        }
-
-                    } else {
-                        Object rejectObj = runtimeService.getVariable(task.getProcessInstanceId(), rejectButtonVarName);
-                        int nowRejectCount = Convert.toInt(rejectObj) + 1;
-                        runtimeService.setVariable(task.getProcessInstanceId(), rejectButtonVarName, nowRejectCount);
-
-                        //如果是全部 需要全部同意 只要代码进入这里 就代表  已经 会签不通过
-                        if (userTaskConfig.getCountersignConfig().getFinishType() == WorkflowMultiInstanceFinishType.ALL.getCode()) {
-                            runtimeService.setVariable(task.getProcessInstanceId(), resultVarName, Boolean.FALSE);
-                        }
-                    }
-
-                }
-
-                Object resultName = new Object();
-                //获取会签流程的结果,防止会签节点后面直接跟结束节点,导致拿不到流程数据
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
-                    resultName = runtimeService.getVariable(task.getProcessInstanceId(), resultVarName);
-                }
-
-                //如果是同意  || 拒绝  || 其他  默认都是流程往下走
-                if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode() || dto.getApprovedType() == WorkflowApproveType.OTHER.getCode()) {
-
-                    taskService.complete(task.getId());
-                    List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-                    //如果不需要指定审批人 默认走自动同意规则
-                    invokeAutoAgree(task.getProcessInstanceId(), workflowSchema.getId(), workflowSchemaConfig, list);
-
-                    //下一个节点的任务名称集合
-                    List<String> nextTaskNameList = list.stream().map(Task::getName).collect(Collectors.toList());
-
-                    //批量审批流程信息记录
-                    WorkflowRecord record = new WorkflowRecord();
-                    record.setNodeId(task.getId());
-                    record.setNodeName(task.getName());
-                    record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-                    record.setProcessId(task.getProcessInstanceId());
-                    record.setSchemaId(schemaId);
-                    record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-                    //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
-                    record.setRecordTime(LocalDateTime.now());
-
-                    //新增审批详情返回给前端
-                    ApproveMultiVo approveMultiVo = new ApproveMultiVo();
-                    WorkflowExtra extraFirst = workflowExtras.stream().filter(x -> x.getTaskId().equals(task.getId())).findFirst().orElse(new WorkflowExtra());
-                    approveMultiVo.setStartUserName(extraFirst.getStartUserName());
-                    approveMultiVo.setSchemaName(workflowSchema.getName());
-                    approveMultiVo.setCurrentNodeName(task.getName());
-                    if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
-                        //新增工作流程信息数据
-                        addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "同意", dto.getApprovedContent(), task, resultName);
-
-                        if (nextTaskNameList.size() == 0) {
-                            String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
-                            approveMultiVo.setApproveDetail(message);
-                        }
-                        //单流向
-                        if (nextTaskNameList.size() == 1) {
-                            String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            approveMultiVo.setApproveDetail(message);
-                        }//多流向
-                        if (nextTaskNameList.size() > 1) {
-                            String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            for (int i = 1; i < nextTaskNameList.size(); i++) {
-                                message = message + "、【" + nextTaskNameList.get(i) + "】";
-                            }
-                            approveMultiVo.setApproveDetail(message);
-                        }
-                        approveMultiVo.setApproveResult("审核成功");
-                    }
-                    if (dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode()) {
-                        //新增工作流程信息数据
-                        addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "拒绝", dto.getApprovedContent(), task, resultName);
-                        if (nextTaskNameList.size() == 0) {
-                            String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
-                            approveMultiVo.setApproveDetail(message);
-                        }
-                        //单流向
-                        if (nextTaskNameList.size() == 1) {
-                            String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            approveMultiVo.setApproveDetail(message);
-                        }//多流向
-                        if (nextTaskNameList.size() > 1) {
-                            String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            for (int i = 1; i < nextTaskNameList.size(); i++) {
-                                message = message + "、【" + nextTaskNameList.get(i) + "】";
-                            }
-                            approveMultiVo.setApproveDetail(message);
-                        }
-                        approveMultiVo.setApproveResult("审核成功");
-                    }
-                    approveMultiVoList.add(approveMultiVo);
-                }
-            }
-
-            for (Session session : sessionList) {
-                //TODO  如果审批接口 出现Can't call commit when autocommit=true 错误  也可以像这样设置解决
-                session.getConnection().setAutoCommit(false);
-                session.commit();
-                session.close();
-            }
-        } catch (Exception e) {
-            for (Session session : sessionList) {
-                session.quietRollback();
-            }
-            if (e instanceof MyException) {
-                throw (MyException) e;
-            } else if (e.getMessage().contains("No outgoing sequence flow")) {
-                throw new MyException("流转条件错误,请检查流转条件设置!");
-            } else {
-                throw new MyException("表单提交错误, 请联系系统管理员!");
-            }
-        }finally {
-            for (Session session : sessionList) {
-                session.close();
-            }
-        }
-
-
-        return approveMultiVoList;
-    }
-
-    @Override
-    public ApproveMultiInfoVo approveMultiInfo(ApproveMultiInfoDto dto) {
-        String[] taskIdArray = dto.getTaskIds().split(StringPool.COMMA);
-        List<Task> taskList = taskService.createTaskQuery().taskIdIn(taskIdArray).list();
-
-
-        List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceIdIn(taskList.stream().map(Task::getProcessInstanceId).toArray(String[]::new))
-                .variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY)
-                .list();
-
-
-        List<Object> allSchemaId = varList.stream().filter(x -> x.getName().equals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY)).map(HistoricVariableInstance::getValue).collect(Collectors.toList());
-
-        //排除xml 查出数据
-        List<WorkflowSchema> workflowSchemaList = workflowSchemaMapper.selectList(Wrappers.lambdaQuery(WorkflowSchema.class).in(WorkflowSchema::getId, allSchemaId).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        ApproveMultiInfoVo vo = new ApproveMultiInfoVo();
-        for (String taskId : taskIdArray) {
-            Task task = taskList.stream().filter(t -> t.getId().equals(taskId)).findFirst().orElse(new TaskEntity());
-            HistoricVariableInstance schemaIdInstance = varList.stream().filter(v -> v.getName().equals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY) && v.getProcessInstanceId().equals(task.getProcessInstanceId())).findFirst().orElse(new HistoricVariableInstanceEntity());
-
-            WorkflowSchema workflowSchema = workflowSchemaList.stream().filter(w -> w.getId().equals(Convert.toLong(schemaIdInstance.getValue()))).findFirst().orElse(new WorkflowSchema());
-            //获取到整个流程模板的配置
-            WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-            //找到当前用户任务节点的配置信息
-            Optional<Map<String, Object>> userTaskMapOptional = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-            //判断是否找得到此任务节点 没有则报错
-            if (!userTaskMapOptional.isPresent()) {
-                throw new MyException("【任务id :" + task.getId() + "】 用户任务节点配置有误,请联系管理员!");
-            }
-
-            //将map 转为 java类
-            UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskMapOptional.get());
-
-            if (userTaskConfig.getOpinionConfig().getEnabled()) {
-                vo.setNeedStamp(Boolean.TRUE);//需要电子签章
-
-                if (userTaskConfig.getOpinionConfig().getSignature() == YesOrNoEnum.YES.getCode()) {
-                    vo.setNeedPassword(Boolean.TRUE);//需要电子签章密码
-                }
-                break;
-            }
-
-        }
-
-        return vo;
-    }
-
-
-    @Override
-    public boolean setApproveUser(ApproveUserDto dto) {
-        Object schemaId = taskService.getVariable(dto.getTaskId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY);
-
-        //获取任务信息
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-
-        //查询下一个节点审批人 委托 数据  将被委托人加入到 审批人数据中
-        LambdaQueryWrapper<WorkflowDelegate> wrapper = Wrappers.lambdaQuery(WorkflowDelegate.class)
-                .in(WorkflowDelegate::getUserId, dto.getApprovedUsers())
-                .gt(WorkflowDelegate::getStartTime, DateUtil.parse(DateUtil.now()).toJdkDate())
-                .lt(WorkflowDelegate::getEndTime, DateUtil.parse(DateUtil.now()).toJdkDate())
-                .like(WorkflowDelegate::getSchemaIds, schemaId)
-                .select(WorkflowDelegate::getDelegateUserIds);
-
-        List<WorkflowDelegate> workflowDelegates = workflowDelegateMapper.selectList(wrapper);
-
-        if (workflowDelegates.size() > 0) {
-
-            List<String> allDelegateStr = workflowDelegates.stream().map(WorkflowDelegate::getDelegateUserIds).collect(Collectors.toList());
-
-            List<Long> allDelegateUserIds = Arrays.stream(StrUtil.join(StringPool.COMMA, allDelegateStr).split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
-            dto.getApprovedUsers().addAll(allDelegateUserIds);
-
-            //新增流程发起流程记录
-            //获取当前用户的信息
-            User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-            //获取用户id对应的用户名
-            String allDelegateUserNames = getAllUserNamesByIds(allDelegateUserIds);
-            String message = "【" + user.getName() + "】通过【流程委托】委托【" + allDelegateUserNames + "】作为审批人";
-            //新增流程发起流程记录
-            WorkflowRecord record = new WorkflowRecord();
-            record.setRecordTime(LocalDateTime.now());
-            addProcessRecord(task, Convert.toLong(schemaId), message, record);
-        }
-        //包括
-        String allUserIds = StrUtil.join(StringPool.COMMA, dto.getApprovedUsers());
-
-        VariableMap variableMap = Variables.createVariables()
-                .putValue(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-                .putValue(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, allUserIds);
-        taskService.setVariablesLocal(dto.getTaskId(), variableMap);
-
-        //这里不再写 发送消息的逻辑 默认使用一个 redis key 使用redis过期策略 执行发送消息的功能 解耦 偷懒
-        //每个消息默认相隔一秒 等于队列一样的逻辑
-        redisUtil.set(dto.getTaskId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, dto.getTaskId(), 1);
-        return true;
-    }
-
-    @Override
-    public boolean setApproveUserMulti(ApproveUserMultiDto dto) {
-        List<ApproveUserDto> approveUserList = dto.getApproveUserList();
-        if (approveUserList == null || approveUserList.size() == 0) {
-            throw new MyException("指定审批人不能为空!");
-        }
-
-        List<Long> allUser = new ArrayList<>();
-        for (ApproveUserDto approveUserDto : approveUserList) {
-            allUser.addAll(approveUserDto.getApprovedUsers());
-
-            //指定审批人、流程发起后、需记录指定的人的流转信息
-            String approveName = WorkFlowUtil.getAllUserNamesByIds(approveUserDto.getApprovedUsers());
-            //查询到对应task的流转信息,将message重新设值,将设置的审批人加入到里面,如果没有直接新增一条,所以需要先查询再修改
-            QueryWrapper<WorkflowRecord> wrapper = new QueryWrapper<WorkflowRecord>()
-                    .eq("node_id", approveUserDto.getTaskId())
-                    .like("message", "准备审批");
-            WorkflowRecord records = workflowRecordMapper.selectOne(wrapper);
-            if (ObjectUtil.isEmpty(records)) {
-                Object schemaId = taskService.getVariable(approveUserDto.getTaskId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY);
-                //获取任务信息
-                Task task = taskService.createTaskQuery().taskId(approveUserDto.getTaskId()).singleResult();
-                //新增流程发起流程记录
-                WorkflowRecord record = new WorkflowRecord();
-                record.setRecordTime(LocalDateTime.now());
-                addProcessRecord(task, Convert.toLong(schemaId), "【" + approveName + "】" + "准备审批", record);
-            } else {
-                //修改原本的流转记录
-                records.setMessage("【" + approveName + "】" + "准备审批");
-                workflowRecordMapper.updateById(records);
-            }
-        }
-
-        //查询下一个节点审批人 委托 数据  将被委托人加入到 审批人数据中
-        LambdaQueryWrapper<WorkflowDelegate> wrapper = Wrappers.lambdaQuery(WorkflowDelegate.class)
-                .in(WorkflowDelegate::getUserId, allUser)
-                .gt(WorkflowDelegate::getStartTime, DateUtil.parse(DateUtil.now()).toJdkDate())
-                .lt(WorkflowDelegate::getEndTime, DateUtil.parse(DateUtil.now()).toJdkDate())
-                .like(WorkflowDelegate::getSchemaIds, dto.getSchemaId())
-                .select(WorkflowDelegate::getDelegateUserIds);
-
-        List<WorkflowDelegate> workflowDelegates = workflowDelegateMapper.selectList(wrapper);
-
-        int i = 1;
-        //获取当前用户的信息
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        for (ApproveUserDto item : approveUserList) {
-
-            if (workflowDelegates.size() > 0) {
-                List<String> allDelegateStr = workflowDelegates.stream()
-                        .filter(d -> item.getApprovedUsers().contains(d.getUserId()))
-                        .map(WorkflowDelegate::getDelegateUserIds).collect(Collectors.toList());
-                List<Long> allDelegateUserIds = Arrays.stream(StrUtil.join(StringPool.COMMA, allDelegateStr).split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
-                item.getApprovedUsers().addAll(allDelegateUserIds);
-
-                //新增流程发起流程记录
-                //获取用户id对应的用户名
-                String allDelegateUserNames = getAllUserNamesByIds(allDelegateUserIds);
-                String message = "【" + user.getName() + "】通过【流程委托】委托【" + allDelegateUserNames + "】作为审批人";
-                //获取任务信息
-                Task task = taskService.createTaskQuery().taskId(item.getTaskId()).singleResult();
-                //新增流程发起流程记录
-                WorkflowRecord record = new WorkflowRecord();
-                record.setRecordTime(LocalDateTime.now());
-                addProcessRecord(task, Convert.toLong(dto.getSchemaId()), message, record);
-            }
-            String userIds = StrUtil.join(StringPool.COMMA, item.getApprovedUsers());
-
-            VariableMap variableMap = Variables.createVariables()
-                    .putValue(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-                    .putValue(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, userIds);
-
-            taskService.setVariablesLocal(item.getTaskId(), variableMap);
-            //到期未指定的任务 将变量设置为不需要指定
-            taskService.setVariableLocal(item.getTaskId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
-
-            //这里不再写 发送消息的逻辑 默认使用一个 redis key 使用redis过期策略 执行发送消息的功能 解耦 偷懒
-            //每个消息默认相隔一秒 等于队列一样的逻辑
-            redisUtil.set(item.getTaskId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, item.getTaskId(), i);
-            i++;
-        }
-        return true;
-    }
-
-    @Override
-    public PageOutput<RelationTaskPageVo> getRelationTaskPage(RelationTaskPageDto dto) {
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, dto.getSchemaId()).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        List<RelationProcessConfig> relationProcessConfigList = workflowSchemaConfig.getProcessConfig().getRelationProcessConfigs();
-
-        //获取到当前关联任务的设置  判断是 审批中 还是审批结束
-        Optional<RelationProcessConfig> thisRelationProcessOp = relationProcessConfigList.stream().filter(x -> x.getId().equals(dto.getRelationSchemaId())).findFirst();
-
-        HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery()
-                .processVariableValueEquals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY, dto.getRelationSchemaId());
-
-
-        //
-        if (dto.getStartTime() != null) {
-            historicTaskInstanceQuery.startedAfter(dto.getStartTime());
-        }
-        if (dto.getEndTime() != null) {
-            historicTaskInstanceQuery.startedBefore(dto.getEndTime());
-        }
-        if (StrUtil.isNotBlank(dto.getKeyword())) {
-            historicTaskInstanceQuery.processVariableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT);
-        }
-
-        if (thisRelationProcessOp.isPresent()) {
-            //如果是需要已经审批完成的
-            if (thisRelationProcessOp.get().getProcessStatus() == YesOrNoEnum.YES.getCode()) {
-                historicTaskInstanceQuery.finished();
-            } else {
-                historicTaskInstanceQuery.unfinished();
-            }
-        }
-
-        //如果是查询发起人自己的
-        Optional<RelationProcessConfig> relationProcessConfigOptional = relationProcessConfigList.stream().filter(x -> x.getId().equals(dto.getRelationSchemaId())).findFirst();
-
-        relationProcessConfigOptional.ifPresent(config -> {
-            if (config.getProcessAuth() == WorkflowRelationAuthType.ORIGINATOR.getCode()) {
-                historicTaskInstanceQuery.processVariableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, StpUtil.getLoginIdAsLong());
-            }
-        });
-//        for (RelationProcessConfig relationProcessConfig : relationProcessConfigList) {
-//            if (relationProcessConfig.getProcessAuth() == WorkflowRelationAuthType.ORIGINATOR.getCode()) {
-//                taskQuery.processVariableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, StpUtil.getLoginId());
-//            }
-//        }
-
-        long count = historicTaskInstanceQuery.count();
-        List<HistoricTaskInstance> historicTaskInstances = historicTaskInstanceQuery.orderByHistoricActivityInstanceStartTime().desc().listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
-//        List<Task> tasks = taskQuery.listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
-
-        List<RelationTaskPageVo> result = new ArrayList<>(historicTaskInstances.size());
-        //获取到所有taskid  去extra表一次性查出数据
-        List<String> taskIds = historicTaskInstances.stream().map(HistoricTaskInstance::getId).collect(Collectors.toList());
-
-
-        if (taskIds.size() > 0) {
-
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getTaskId, taskIds));
-
-            for (HistoricTaskInstance task : historicTaskInstances) {
-                RelationTaskPageVo vo = new RelationTaskPageVo();
-                Optional<WorkflowExtra> extra = workflowExtras.stream().filter(x -> x.getTaskId().equals(task.getId())).findFirst();
-                extra.ifPresent(x -> {
-                    vo.setSchemaName(x.getSchemaName());
-                    vo.setOriginator(x.getStartUserName());
-                });
-                vo.setProcessId(task.getProcessInstanceId());
-                vo.setTaskName(task.getName());
-                vo.setTaskId(task.getId());
-                vo.setCreateTime(task.getStartTime());
-                result.add(vo);
-            }
-        }
-
-        PageOutput<RelationTaskPageVo> output = new PageOutput<>();
-        output.setCurrentPage(dto.getLimit());
-        output.setPageSize(dto.getSize());
-        output.setTotal(Convert.toInt(count));
-        output.setList(result);
-        return output;
-    }
-
-
-    @Override
-    public RelationTaskInfoVo getRelationTaskInfo(RelationTaskInfoDto dto) {
-        RelationTaskInfoVo vo = new RelationTaskInfoVo();
-
-        HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery().taskId(dto.getTaskId()).singleResult();
-
-//        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-        HistoricVariableInstance schemaIdVar = historyService.createHistoricVariableInstanceQuery()
-                .processInstanceId(task.getProcessInstanceId())
-                .variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
-//        Object schemaId = taskService.getVariable(dto.getTaskId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY);
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaIdVar.getValue()));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        Optional<Map<String, Object>> userNodeConfigOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(task.getTaskDefinitionKey())).findFirst();
-
-        if (!userNodeConfigOp.isPresent()) {
-            throw new MyException("当前任务没有开始节点");
-        }
-
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
-        vo.setTaskRecords(recordListVos);
-
-        //将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userNodeConfigOp.get());
-
-        List<Long> formIds = userTaskConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-        String[] allVarKey = userTaskConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-
-        List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-        List<HistoricVariableInstance> formDataList = historyService.createHistoricVariableInstanceQuery().processInstanceId(task.getProcessInstanceId()).variableNameIn(allVarKey).list();
-//        Map<String, Object> allFormData = taskService.getVariables(dto.getTaskId(), allVarKey);
-
-        List<RelationFormInfoVo> formInfoVos = new ArrayList<>(userTaskConfig.getFormConfigs().size());
-        for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-            RelationFormInfoVo formInfoVo = new RelationFormInfoVo();
-            formInfoVo.setFormType(formConfig.getFormType());
-            formInfoVo.setFormConfig(formConfig);
-
-            //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> f.getId().equals(formConfig.getFormId())).findFirst();
-                templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-
-                Optional<HistoricVariableInstance> thisFormData = formDataList.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst();
-
-                thisFormData.ifPresent(form -> {
-                    Map<String, Object> formData = Convert.toMap(String.class, Object.class, form.getValue());
-                    formInfoVo.setFormData(formData);
-                });
-
-            }
-            formInfoVos.add(formInfoVo);
-        }
-        vo.setFormInfos(formInfoVos);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-
-        return vo;
-    }
-
-    @Override
-    public TaskInfoVo getTaskInfo(String taskId) {
-        TaskInfoVo vo = new TaskInfoVo();
-
-        HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
-
-        WorkflowExtra extra = extraService.getOne(Wrappers.lambdaQuery(WorkflowExtra.class).eq(WorkflowExtra::getTaskId, taskId).select(WorkflowExtra::getSchemaId));
-
-//        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-//        Object schemaId = taskService.getVariable(taskId, WorkflowConstant.PROCESS_SCHEMA_ID_KEY);
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, extra.getSchemaId()));
-//        WorkflowSchema workflowSchema = redisUtil.get(WorkflowConstant.SCHEMA_CACHE_PREFIX + extra.getSchemaId(), WorkflowSchema.class);
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        Optional<Map<String, Object>> userNodeConfigOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(task.getTaskDefinitionKey())).findFirst();
-
-        if (!userNodeConfigOp.isPresent()) {
-            throw new MyException("当前任务没有开始节点");
-        }
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
-        vo.setTaskRecords(recordListVos);
-
-        //查询任务关联任务
-        vo.setRelationTaskInfo(getRelationTaskVos(task.getProcessInstanceId()));
-
-        //将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userNodeConfigOp.get());
-
-        List<Long> formIds = userTaskConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-        String[] allVarKey = userTaskConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-        List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().variableNameIn(allVarKey).list();
-//        Map<String, Object> allFormData = taskService.getVariables(taskId, allVarKey);
-
-        List<RelationFormInfoVo> formInfoVos = new ArrayList<>(userTaskConfig.getFormConfigs().size());
-        for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-            RelationFormInfoVo formInfoVo = new RelationFormInfoVo();
-            formInfoVo.setFormType(formConfig.getFormType());
-            formInfoVo.setFormConfig(formConfig);
-
-            //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-
-                Optional<HistoricVariableInstance> thisFormData = list.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst();
-
-                thisFormData.ifPresent(data -> {
-                    Map<String, Object> formData = Convert.toMap(String.class, Object.class, data.getValue());
-                    formInfoVo.setFormData(formData);
-                });
-
-            }
-
-            formInfoVos.add(formInfoVo);
-
-        }
-        //如果是多实例的
-        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
-            vo.setIsAddOrSubSign(userTaskConfig.getCountersignConfig().getAddOrRemove());
-        }
-        vo.setFormInfos(formInfoVos);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-
-        vo.setOpinionConfig(userTaskConfig.getOpinionConfig());
-
-        //如果是多实例的
-        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() != WorkflowMultiInstanceType.NONE.getCode()) {
-            vo.setIsAddOrSubSign(userTaskConfig.getCountersignConfig().getAddOrRemove());
-        }
-
-        if (userTaskConfig.getOpinionConfig().getEnabled()) {
-            MPJLambdaWrapper<WorkflowApproveRecord> workflowApproveRecordMPJLambdaWrapper = MPJWrappers.<WorkflowApproveRecord>lambdaJoin()
-                    .disableSubLogicDel()
-                    .eq(WorkflowApproveRecord::getProcessId, task.getProcessInstanceId())
-                    .select(WorkflowApproveRecord::getId)
-                    .select(WorkflowApproveRecord.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowApproveRecord.class).contains(x.getProperty()))
-                    .selectAs(User::getName, WorkflowApproveRecord::getApproveUserName)
-                    .leftJoin(User.class, User::getId, WorkflowApproveRecord::getApproveUserId)
-                    .selectAs(Stamp::getFileUrl, WorkflowApproveRecord::getApproveStampUrl)
-                    .leftJoin(Stamp.class, Stamp::getId, WorkflowApproveRecord::getApproveStamp);
-
-            List<WorkflowApproveRecord> approveRecords = approveRecordService.selectJoinList(WorkflowApproveRecord.class, workflowApproveRecordMPJLambdaWrapper);
-
-            //取时间最大值 不好取  目前还是全部查出来 然后根据时间 倒序 取第一条数据
-            if (userTaskConfig.getOpinionConfig().getShowType() == 1 && approveRecords.size() > 0) {
-                WorkflowApproveRecord approveRecord = approveRecords.stream().sorted(Comparator.comparing(WorkflowApproveRecord::getApproveTime).reversed()).collect(Collectors.toList()).get(0);
-                List<WorkflowApproveRecord> onlyOne = new ArrayList<>();
-                onlyOne.add(approveRecord);
-                vo.setTaskApproveOpinions(onlyOne);
-            } else {
-                vo.setTaskApproveOpinions(approveRecords);
-            }
-        }
-        return vo;
-    }
-
-    @Override
-    public ProcessInfoVo getProcessInfo(String processId) {
-        ProcessInfoVo vo = new ProcessInfoVo();
-
-        HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, historicVariableInstance.getValue()));
-//        WorkflowSchema workflowSchema = redisUtil.get(WorkflowConstant.SCHEMA_CACHE_PREFIX + extra.getSchemaId(), WorkflowSchema.class);
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
-        vo.setTaskRecords(recordListVos);
-
-        List<Object> allFormConfigs = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsKey("formConfigs")).map(x -> x.get("formConfigs")).collect(Collectors.toList());
-        List<FormConfig> formConfigs = new ArrayList<>();
-
-
-        for (Object allFormConfig : allFormConfigs) {
-            List<FormConfig> thisNodeFormConfigs = Convert.toList(FormConfig.class, allFormConfig);
-
-            for (FormConfig thisNodeFormConfig : thisNodeFormConfigs) {
-                if (formConfigs.stream().noneMatch(x -> x.getKey().equals(thisNodeFormConfig.getKey()))) {
-
-                    formConfigs.add(thisNodeFormConfig);
-
-                }
-            }
-        }
-
-
-        String[] allFormKey = formConfigs.stream().map(FormConfig::getKey).toArray(String[]::new);
-
-        List<Long> formIds = formConfigs.stream().map(FormConfig::getFormId).collect(Collectors.toList());
-        List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-
-        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableNameIn(allFormKey).list();
-//        Map<String, Object> allFormData = taskService.getVariables(taskId, allVarKey);
-
-        List<RelationFormInfoVo> formInfoVos = new ArrayList<>(allFormKey.length);
-        for (FormConfig formConfig : formConfigs) {
-
-            RelationFormInfoVo formInfoVo = new RelationFormInfoVo();
-            formInfoVo.setFormType(formConfig.getFormType());
-            formInfoVo.setFormConfig(formConfig);
-
-            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-
-                Optional<HistoricVariableInstance> thisFormData = list.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst();
-
-                thisFormData.ifPresent(data -> {
-                    Map<String, Object> formData = Convert.toMap(String.class, Object.class, data.getValue());
-                    formInfoVo.setFormData(formData);
-                });
-
-            }
-
-            formInfoVos.add(formInfoVo);
-
-        }
-
-        vo.setFormInfos(formInfoVos);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-        vo.setWorkflowChat(workflowSchema.getWorkflowChat());
-
-        return vo;
-    }
-
-    @Override
-    public TaskInfoVo getCirculatedTaskInfo(String taskId) {
-        TaskInfoVo vo = new TaskInfoVo();
-
-        HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
-        WorkflowExtra extra = extraService.getOne(Wrappers.lambdaQuery(WorkflowExtra.class).eq(WorkflowExtra::getTaskId, taskId).select(WorkflowExtra::getSchemaId));
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, extra.getSchemaId()));
-
-//        WorkflowSchema workflowSchema = redisUtil.get(WorkflowConstant.SCHEMA_CACHE_PREFIX + extra.getSchemaId(), WorkflowSchema.class);
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        Optional<Map<String, Object>> userNodeConfigOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(historicTaskInstance.getTaskDefinitionKey())).findFirst();
-
-        if (!userNodeConfigOp.isPresent()) {
-            throw new MyException("当前任务没有开始节点");
-        }
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(historicTaskInstance.getProcessInstanceId(), 0);
-        vo.setTaskRecords(recordListVos);
-
-        //查询任务关联任务
-        vo.setRelationTaskInfo(getRelationTaskVos(historicTaskInstance.getId()));
-
-        //将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userNodeConfigOp.get());
-
-        List<Long> formIds = userTaskConfig.getFormConfigs().stream().map(FormConfig::getFormId).collect(Collectors.toList());
-        String[] allVarKey = userTaskConfig.getFormConfigs().stream().map(FormConfig::getKey).toArray(String[]::new);
-        List<FormTemplate> formTemplates = formTemplateMapper.selectList(Wrappers.lambdaQuery(FormTemplate.class).in(formIds.size() > 0, FormTemplate::getId, formIds));
-
-        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().variableNameIn(allVarKey).list();
-
-        List<RelationFormInfoVo> formInfoVos = new ArrayList<>(userTaskConfig.getFormConfigs().size());
-        for (FormConfig formConfig : userTaskConfig.getFormConfigs()) {
-
-            RelationFormInfoVo formInfoVo = new RelationFormInfoVo();
-            formInfoVo.setFormType(formConfig.getFormType());
-            formInfoVo.setFormConfig(formConfig);
-
-            //TODO 系统表单 和 自定义表单 走同一套流程  都是使用json  以后看能否有更好的解决方案 解决用户手动修改系统表单代码
-            if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
-                Optional<FormTemplate> templateOp = formTemplates.stream().filter(f -> Objects.equals(f.getId(), formConfig.getFormId())).findFirst();
-                templateOp.ifPresent(t -> formInfoVo.setFormJson(t.getFormJson()));
-
-                Optional<HistoricVariableInstance> thisFormData = list.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst();
-
-                thisFormData.ifPresent(data -> {
-                    Map<String, Object> formData = Convert.toMap(String.class, Object.class, data.getValue());
-                    formInfoVo.setFormData(formData);
-                });
-
-            }
-
-            formInfoVos.add(formInfoVo);
-
-        }
-        vo.setFormInfos(formInfoVos);
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-
-        LambdaQueryWrapper<WorkflowCirculated> queryWrapper = Wrappers.lambdaQuery(WorkflowCirculated.class)
-                .eq(WorkflowCirculated::getTaskId, taskId)
-                .eq(WorkflowCirculated::getCirculatedUserId, StpUtil.getLoginIdAsLong())
-                .select(WorkflowCirculated::getId);
-
-        WorkflowCirculated thisCirculated = circulatedService.getOne(queryWrapper);
-        thisCirculated.setIsRead(YesOrNoEnum.YES.getCode());
-        circulatedService.updateById(thisCirculated);
-
-        return vo;
-    }
-
-    /**
-     * 根据任务id 查询关联任务信息
-     *
-     * @param processId
-     * @return
-     */
-    private List<TaskInfoRelationTaskVo> getRelationTaskVos(String processId) {
-        List<TaskInfoRelationTaskVo> relationTaskVos = new ArrayList<>();
-        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName(WorkflowConstant.RELATION_TASK_KEY).list();
-
-        if (list != null && list.size() > 0) {
-            List<Object> allRelationTaskInfo = list.stream().map(HistoricVariableInstance::getValue).collect(Collectors.toList());
-            List<LaunchRelationTaskDto> launchRelationTaskDtos = Convert.toList(LaunchRelationTaskDto.class, allRelationTaskInfo);
-
-            List<String> allTaskId = launchRelationTaskDtos.stream().map(LaunchRelationTaskDto::getTaskId).collect(Collectors.toList());
-
-            List<WorkflowExtra> allRelationTask = extraService.list(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getTaskId, allTaskId));
-
-            for (WorkflowExtra extra : allRelationTask) {
-                TaskInfoRelationTaskVo relationTaskVo = new TaskInfoRelationTaskVo();
-                relationTaskVo.setTaskId(extra.getTaskId());
-                relationTaskVo.setTaskName(extra.getTaskName());
-                relationTaskVos.add(relationTaskVo);
-            }
-        }
-        return relationTaskVos;
-    }
-
-    @Override
-    public FinishedTaskVo getFinishedTask(String processInstanceId) {
-        FinishedTaskVo vo = new FinishedTaskVo();
-        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
-        if (historicProcessInstance == null) {
-            throw new MyException("流程id不存在!");
-        }
-        List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).list();
-
-        BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(activityInstanceList.get(0).getProcessDefinitionId());
-
-        List<String> finishedActivity = activityInstanceList.stream().filter(ins -> !ins.isCanceled()).map(ins -> {
-            if (ins.getActivityId().contains(WorkflowConstant.MULTI_INSTANCE_STRING)) {
-                return StrUtil.replace(ins.getActivityId(), WorkflowConstant.MULTI_INSTANCE_STRING, StringPool.EMPTY);
-            } else {
-                return ins.getActivityId();
-            }
-        }).collect(Collectors.toList());
-
-        List<String> outgoingList = new ArrayList<>();
-        for (HistoricActivityInstance historicActivityInstance : activityInstanceList) {//先保存所有已走过节点的outgoing数据
-            ModelElementInstance modelElementById = bpmnModelInstance.getModelElementById(historicActivityInstance.getActivityId());
-
-            //如果包含了多实例的关键字
-            if (historicActivityInstance.getActivityId().contains(WorkflowConstant.MULTI_INSTANCE_STRING)) {
-                String replace = StrUtil.replace(historicActivityInstance.getActivityId(), WorkflowConstant.MULTI_INSTANCE_STRING, StringPool.EMPTY);
-                modelElementById = bpmnModelInstance.getModelElementById(replace);
-            }
-            Collection<SequenceFlow> outgoing = ((FlowNodeImpl) modelElementById).getOutgoing();
-            if (outgoing != null && outgoing.size() > 0) {
-                for (SequenceFlow sequenceFlow : outgoing) {
-                    outgoingList.add(sequenceFlow.getId());
-                }
-            }
-        }
-
-        for (HistoricActivityInstance historicActivityInstance : activityInstanceList) {
-            ModelElementInstance modelElementById = bpmnModelInstance.getModelElementById(historicActivityInstance.getActivityId());
-
-            //如果包含了多实例的关键字
-            if (historicActivityInstance.getActivityId().contains(WorkflowConstant.MULTI_INSTANCE_STRING)) {
-                String replace = StrUtil.replace(historicActivityInstance.getActivityId(), WorkflowConstant.MULTI_INSTANCE_STRING, StringPool.EMPTY);
-                modelElementById = bpmnModelInstance.getModelElementById(replace);
-            }
-            Collection<SequenceFlow> incoming = ((FlowNodeImpl) modelElementById).getIncoming();
-
-            if (incoming != null && incoming.size() > 0) {
-                if (incoming.size() > 1) {
-                    //查询已经走过的节点的outgoing数据
-                    if (CollectionUtil.isNotEmpty(outgoingList)) {
-                        for (SequenceFlow sequenceFlow : incoming) {
-                            if (outgoingList.contains(sequenceFlow.getId())) {
-                                finishedActivity.add(sequenceFlow.getId());
-                            }
-                        }
-                    }
-                } else {
-                    for (SequenceFlow sequenceFlow : incoming) {
-                        finishedActivity.add(sequenceFlow.getId());
-                    }
-                }
-            }
-        }
-        vo.setFinishedNodes(finishedActivity);
-        //如果已经流程结束  就代表没有当前节点
-        if (historicProcessInstance.getEndTime() != null) {
-            return vo;
-        }
-        List<Task> list = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
-        List<String> currentTask = list.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
-        vo.setCurrentNodes(currentTask);
-
-        return vo;
-    }
-
-    @Override
-    public FormFinishedTaskVo getFormFinishedTask(FormFinishedTaskDto dto) {
-
-        FormFinishedTaskVo vo = new FormFinishedTaskVo();
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getFormId, dto.getFormId()));
-
-        vo.setXmlContent(workflowSchema.getXmlContent());
-
-        WorkflowFormRelation formRelation = formRelationService.getOne(Wrappers.lambdaQuery(WorkflowFormRelation.class).eq(WorkflowFormRelation::getFormId, dto.getFormId()).eq(WorkflowFormRelation::getFormKeyValue, dto.getKeyValue()));
-
-        //如果包含 表单数据 主键值  需要返回 所有已经完成的流程节点内容
-        if (StrUtil.isNotBlank(dto.getKeyValue())) {
-            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(formRelation.getProcessId()).singleResult();
-            if (historicProcessInstance == null) {
-                throw new MyException("流程id不存在!");
-            }
-            List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(formRelation.getProcessId()).list();
-
-            BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(activityInstanceList.get(0).getProcessDefinitionId());
-
-            List<String> finishedActivity = activityInstanceList.stream().filter(ins -> !ins.isCanceled()).map(ins -> {
-                if (ins.getActivityId().contains(WorkflowConstant.MULTI_INSTANCE_STRING)) {
-                    return StrUtil.replace(ins.getActivityId(), WorkflowConstant.MULTI_INSTANCE_STRING, StringPool.EMPTY);
-                } else {
-                    return ins.getActivityId();
-                }
-            }).collect(Collectors.toList());
-
-            for (HistoricActivityInstance historicActivityInstance : activityInstanceList) {
-                ModelElementInstance modelElementById = bpmnModelInstance.getModelElementById(historicActivityInstance.getActivityId());
-
-                //如果包含了多实例的关键字
-                if (historicActivityInstance.getActivityId().contains(WorkflowConstant.MULTI_INSTANCE_STRING)) {
-                    String replace = StrUtil.replace(historicActivityInstance.getActivityId(), WorkflowConstant.MULTI_INSTANCE_STRING, StringPool.EMPTY);
-                    modelElementById = bpmnModelInstance.getModelElementById(replace);
-                }
-                Collection<SequenceFlow> incoming = ((FlowNodeImpl) modelElementById).getIncoming();
-                if (incoming != null && incoming.size() > 0) {
-                    for (SequenceFlow sequenceFlow : incoming) {
-                        finishedActivity.add(sequenceFlow.getId());
-                    }
-                }
-            }
-            vo.setFinishedNodes(finishedActivity);
-            //如果已经流程结束  就代表没有当前节点
-            if (historicProcessInstance.getEndTime() != null) {
-                return vo;
-            }
-            List<Task> list = taskService.createTaskQuery().processInstanceId(formRelation.getProcessId()).list();
-            List<String> currentTask = list.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
-            vo.setCurrentNodes(currentTask);
-        }
-
-        return vo;
-    }
-
-    @Override
-    public List<ProcessRecordListVo> getProcessRecord(String processInstanceId) {
-        return getProcessRecordListVos(processInstanceId, 0);
-    }
-
-    @Override
-    public PageOutput<CirculatedTaskPageVo> getCirculatedTaskPage(CirculatedTaskPageDto dto) {
-
-        if (ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime())) {
-            dto.setStartTime(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-            dto.setEndTime(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-
-        //因为多表关联 会有多个表都使用了id字段,  所以必须专门指定主表的Id
-        IPage<CirculatedTaskPageVo> page = circulatedService.selectJoinListPage(ConventPage.getPage(dto), CirculatedTaskPageVo.class,
-                MPJWrappers.<WorkflowCirculated>lambdaJoin()
-                        .orderByDesc(WorkflowCirculated::getId)
-                        .like(StrUtil.isNotBlank(dto.getTaskName()), WorkflowCirculated::getTaskName, dto.getTaskName())
-                        .like(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .like(StrUtil.isNotBlank(dto.getKeyword()), WorkflowSchema::getName, dto.getKeyword())
-                        .eq(StrUtil.isNotBlank(dto.getOriginator()), User::getId, dto.getOriginator())
-                        .eq(StrUtil.isNotBlank(dto.getSerialNumber()), WorkflowCirculated::getSerialNumber, dto.getSerialNumber())
-                        .between(ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime()), WorkflowCirculated::getCreateTime, dto.getStartTime(), dto.getEndTime())
-                        .eq(WorkflowCirculated::getCirculatedUserId, StpUtil.getLoginIdAsLong())
-                        .select(WorkflowCirculated::getId)
-                        .select(WorkflowCirculated.class, x -> VoToColumnUtil.fieldsToColumns(CirculatedTaskPageVo.class).contains(x.getProperty()))
-                        .selectAs(WorkflowCirculated::getTaskName, CirculatedTaskPageVo::getCurrentTaskName)
-                        .selectAs(WorkflowSchema::getName, CirculatedTaskPageVo::getSchemaName)
-                        .selectAs(User::getName, CirculatedTaskPageVo::getOriginator)
-                        .leftJoin(User.class, User::getId, WorkflowCirculated::getStartUserId)
-                        .leftJoin(WorkflowSchema.class, WorkflowSchema::getId, WorkflowCirculated::getSchemaId));
-
-        String[] taskIds = page.getRecords().stream().map(CirculatedTaskPageVo::getTaskId).toArray(String[]::new);
-        List<Task> list = taskService.createTaskQuery().taskIdIn(taskIds).list();
-        for (CirculatedTaskPageVo record : page.getRecords()) {
-            Optional<Task> thisTask = list.stream().filter(x -> x.getId().equals(record.getTaskId())).findFirst();
-            if (thisTask.isPresent()) {
-                if (thisTask.get().isSuspended()) {
-                    record.setStatus(2);
-                } else {
-                    record.setStatus(0);
-                }
-            } else {
-                record.setStatus(1);
-            }
-
-        }
-
-        return ConventPage.getPageOutput(page);
-    }
-
-    @Override
-    public PageOutput<FinishedTaskPageVo> getFinishedTaskPage(FinishedTaskPageDto dto) {
-
-//        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
-//                .taskVariableValueLike(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StringPool.PERCENT + StpUtil.getLoginIdAsLong() + StringPool.PERCENT)
-//                .list();
-//        List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
-//                .processInstanceId(dto.getProcessId())
-//                .activityType(WorkflowConstant.BPMN_USER_TASK_TYPE_NAME)
-//                .finished()
-//                .orderByHistoricActivityInstanceEndTime()
-//                .asc()
-//                .list();
-//
-
-        if (ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime())) {
-            dto.setStartTime(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-            dto.setEndTime(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-
-        //因为多表关联 会有多个表都使用了id字段,  所以必须专门指定主表的Id
-        IPage<FinishedTaskPageVo> page = approveRecordService.selectJoinListPage(ConventPage.getPage(dto), FinishedTaskPageVo.class,
-                MPJWrappers.<WorkflowApproveRecord>lambdaJoin()
-                        .disableSubLogicDel()
-                        .distinct()
-                        .orderByDesc(WorkflowApproveRecord::getId)
-                        .like(StrUtil.isNotBlank(dto.getTaskName()), WorkflowCirculated::getTaskName, dto.getTaskName())
-                        .like(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .like(StrUtil.isNotBlank(dto.getKeyword()), WorkflowSchema::getName, dto.getKeyword())
-                        .eq(StrUtil.isNotBlank(dto.getOriginator()), WorkflowExtra::getStartUserId, dto.getOriginator())
-                        .eq(StrUtil.isNotBlank(dto.getSerialNumber()), WorkflowCirculated::getSerialNumber, dto.getSerialNumber())
-                        .between(ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime()), WorkflowExtra::getLaunchTime, dto.getStartTime(), dto.getEndTime())
-                        .eq(WorkflowApproveRecord::getApproveUserId, StpUtil.getLoginIdAsLong())
-                        .select(WorkflowApproveRecord::getId)
-                        .select(WorkflowApproveRecord.class, x -> VoToColumnUtil.fieldsToColumns(FinishedTaskPageVo.class).contains(x.getProperty()))
-                        .selectAs(WorkflowSchema::getName, FinishedTaskPageVo::getSchemaName)
-                        .selectAs(WorkflowExtra::getCurrentProgress, FinishedTaskPageVo::getCurrentProgress)
-                        .selectAs(WorkflowExtra::getTaskName, FinishedTaskPageVo::getCurrentTaskName)
-                        .selectAs(WorkflowExtra::getLaunchTime, FinishedTaskPageVo::getCreateTime)
-                        .selectAs(WorkflowExtra::getProcessName, FinishedTaskPageVo::getProcessName)
-                        .selectAs(User::getName, FinishedTaskPageVo::getOriginator)
-                        .leftJoin(User.class, User::getId, WorkflowApproveRecord::getStartUserId)
-                        .leftJoin(WorkflowExtra.class, WorkflowExtra::getTaskId, WorkflowApproveRecord::getTaskId)
-                        .leftJoin(WorkflowSchema.class, WorkflowSchema::getId, WorkflowApproveRecord::getSchemaId));
-
-        return ConventPage.getPageOutput(page);
-
-    }
-
-
-    @Override
-    public PageOutput<MyProcessPageVo> getMyProcessPage(MyProcessPageDto dto) {
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
-                .variableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, StpUtil.getLoginIdAsLong())
-                .variableValueEquals(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.NO.getCode());
-
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && StrUtil.isNumeric(dto.getSerialNumber())) {//数字类型
-            historicProcessInstanceQuery.variableValueEquals(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY, Long.valueOf(dto.getSerialNumber()));
-        }
-        if (!ObjectUtil.isNull(dto.getStartTime())) {
-            historicProcessInstanceQuery.startedAfter(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-        }
-        if (!ObjectUtil.isNull(dto.getEndTime())) {
-            historicProcessInstanceQuery.startedBefore(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-        if (StrUtil.isNotBlank(dto.getName())) {
-            historicProcessInstanceQuery.variableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getName() + StringPool.PERCENT);
-        }
-        if (StrUtil.isNotBlank(dto.getSchemaId())) {
-            historicProcessInstanceQuery.variableValueEquals(WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Convert.toLong(dto.getSchemaId()));
-        }
-        if (StrUtil.isNotBlank(dto.getKeyword())) {
-            historicProcessInstanceQuery.variableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT);
-        }
-        if (StrUtil.isNotBlank(dto.getOriginator())) {
-            historicProcessInstanceQuery.or()
-                    .variableValueEquals(WorkflowConstant.PROCESS_START_USER_NAME_KEY, dto.getOriginator())
-                    .variableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, dto.getOriginator())
-                    .endOr();
-        }
-
-        if (!ObjectUtil.isNull(dto.getType()) && dto.getType() == 1) {
-            historicProcessInstanceQuery.finished();
-        }
-        if (!ObjectUtil.isNull(dto.getType()) && dto.getType() == 2) {
-            historicProcessInstanceQuery.unfinished();
-        }
-
-
-        long count = historicProcessInstanceQuery.count();
-        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.orderByProcessInstanceStartTime().desc().listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
-
-        //获取到所有流程id
-        List<String> processIds = historicProcessInstances.stream().map(HistoricProcessInstance::getId).collect(Collectors.toList());
-
-
-        List<MyProcessPageVo> result = new ArrayList<>(historicProcessInstances.size());
-        if (processIds.size() > 0) {
-
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, processIds));
-
-            for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
-
-                //找到当前流程的 任务开始时间 最大值  为当前审批节点
-                workflowExtras.stream()
-                        .filter(e -> e.getProcessId().equals(historicProcessInstance.getId()))
-                        .max(Comparator.comparing(WorkflowExtra::getStartTime))
-                        .ifPresent(e -> {
-                            MyProcessPageVo vo = new MyProcessPageVo();
-                            vo.setId(e.getId());
-                            vo.setSerialNumber(e.getSerialNumber());
-                            vo.setSchemaName(e.getSchemaName());
-                            vo.setOriginator(e.getStartUserName());
-                            vo.setSchemaId(e.getSchemaId());
-
-                            vo.setTaskName(e.getTaskName());
-                            vo.setCurrentTaskName(e.getTaskName());
-                            vo.setTaskId(e.getTaskId());
-                            vo.setCreateTime(e.getStartTime());
-                            vo.setProcessId(e.getProcessId());
-                            vo.setProcessName(e.getProcessName());
-
-                            //如果是已经完成的任务 默认是100进度
-                            if (ObjectUtil.isNotNull(historicProcessInstance.getEndTime())) {
-                                vo.setCurrentProgress(100);
-                                vo.setCurrentTaskName(WorkflowConstant.END_NODE_TYPE_NAME);
-                            } else {
-                                vo.setCurrentProgress(e.getCurrentProgress());
-                            }
-
-                            result.add(vo);
-                        });
-
-
-                MyProcessPageVo vo = new MyProcessPageVo();
-
-            }
-        }
-
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())) {//非数字类型置空
-            result.clear();
-        }
-        PageOutput<MyProcessPageVo> output = new PageOutput<>();
-        output.setCurrentPage(dto.getLimit());
-        output.setPageSize(dto.getSize());
-        output.setTotal(Convert.toInt(count));
-        output.setList(result);
-        return output;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean moveRecycle(MoveRecycleDto dto) {
-
-
-//        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-//
-//        Object startUserId = runtimeService.getVariable(processInstanceId, WorkflowConstant.PROCESS_START_USER_ID_KEY);
-//
-//        //判断是否为发起人
-//        if (!ObjectUtil.equals(startUserId, user.getId())) {
-//            throw new MyException("您不是发起人 无法移入回收站!");
-//        }
-
-        //此代码为适配老版本功能  将移入回收站的流程挂起
-        {
-            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
-
-            if (processInstance != null) {
-                VariableMap variableMap = Variables.createVariables().putValue(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.YES.getCode());
-
-                runtimeService.setVariables(dto.getProcessId(), variableMap);
-//                runtimeService.deleteProcessInstance(dto.getProcessId(), "流程移入回收站");
-
-            } else {
-                HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
-                if (historicProcessInstance.getEndTime() != null) {
-                    throw new MyException("流程已结束不能放入回收站!");
-                } else {
-                    throw new MyException("找不到此流程!");
-                }
-            }
-
-
-        }
-
-        //此代码为直接关闭流程代码
-        {
-//        //获取到当前活动的实例
-//        ActivityInstance activityInstance = runtimeService.getActivityInstance(processInstanceId);
-//
-//        //先停止当前活动示例  然后  关闭流程
-//        runtimeService.createProcessInstanceModification(processInstanceId)
-//                .cancelAllForActivity(activityInstance.getId())
-//                .setAnnotation("【发起人:" + user.getName() + "】 将 【流程:" + processInstanceId + "】 移入回收站 所有流程关闭!" )
-//                .execute();
-        }
-
-        return true;
-    }
-
-    @Override
-    public PageOutput<RecycleProcessPageVo> getRecycleProcessPage(RecycleProcessPageDto dto) {
-
-        if (ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime())) {
-            dto.setStartTime(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-            dto.setEndTime(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
-                .variableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, user.getId())
-                .variableValueEquals(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.YES.getCode());
-
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && StrUtil.isNumeric(dto.getSerialNumber())) {
-            historicProcessInstanceQuery.variableValueEquals(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY, Long.valueOf(dto.getSerialNumber()));
-        }
-        if (!ObjectUtil.isNull(dto.getStartTime())) {
-            historicProcessInstanceQuery.startedAfter(dto.getStartTime());
-        }
-        if (!ObjectUtil.isNull(dto.getEndTime())) {
-            historicProcessInstanceQuery.startedBefore(dto.getEndTime());
-        }
-        if (StrUtil.isNotBlank(dto.getName())) {
-            historicProcessInstanceQuery.variableValueEquals(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getName() + StringPool.PERCENT);
-        }
-        if (StrUtil.isNotBlank(dto.getInitiator())) {
-            historicProcessInstanceQuery.variableValueEquals(WorkflowConstant.PROCESS_START_USER_NAME_KEY, dto.getInitiator());
-        }
-
-        long count = historicProcessInstanceQuery.count();
-        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
-
-        //获取到所有流程id
-        List<String> processIds = historicProcessInstances.stream().map(HistoricProcessInstance::getId).collect(Collectors.toList());
-
-
-        List<RecycleProcessPageVo> result = new ArrayList<>(historicProcessInstances.size());
-        if (processIds.size() > 0) {
-
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, processIds));
-
-            for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
-
-                //找到当前流程的 任务开始时间 最大值  为当前审批节点
-                workflowExtras.stream()
-                        .filter(e -> e.getProcessId().equals(historicProcessInstance.getId()))
-                        .max(Comparator.comparing(WorkflowExtra::getStartTime))
-                        .ifPresent(e -> {
-                            RecycleProcessPageVo vo = new RecycleProcessPageVo();
-                            vo.setSerialNumber(e.getSerialNumber());
-                            vo.setSchemaName(e.getSchemaName());
-                            vo.setOriginator(e.getStartUserName());
-                            vo.setSchemaId(e.getSchemaId());
-                            vo.setCurrentProgress(e.getCurrentProgress());
-                            vo.setTaskName(e.getTaskName());
-                            vo.setProcessId(e.getProcessId());
-                            vo.setCreateTime(e.getLaunchTime());
-                            vo.setCurrentTaskName(e.getTaskName());
-                            vo.setTaskId(e.getTaskId());
-                            vo.setProcessName(e.getProcessName());
-                            result.add(vo);
-                        });
-            }
-        }
-        if (StrUtil.isNotBlank(dto.getSerialNumber()) && !StrUtil.isNumeric(dto.getSerialNumber())) {
-            result.clear();
-        }
-
-        PageOutput<RecycleProcessPageVo> output = new PageOutput<>();
-        output.setCurrentPage(dto.getLimit());
-        output.setPageSize(dto.getSize());
-        output.setTotal(Convert.toInt(count));
-        result.sort((t1, t2) -> t2.getCreateTime().compareTo(t1.getCreateTime()));
-        output.setList(result);
-        return output;
-    }
-
-    @Override
-    public RestartVo restart(RestartDto dto) {
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, dto.getSchemaId()).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
-
-        Optional<Map<String, Object>> startNodeMapOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(historicProcessInstance.getStartActivityId())).findFirst();
-
-        if (!startNodeMapOp.isPresent()) {
-            throw new MyException("找不到开始节点的配置信息");
-        }
-
-        //将map 转为 java类
-        StartNodeConfig startNodeConfig = Convert.convert(StartNodeConfig.class, startNodeMapOp.get());
-
-        RestartVo vo = new RestartVo();
-        vo.setFormDatas(new HashMap<>());
-
-        String[] startNodeFormKey = startNodeConfig.getFormConfigs().stream().map(c -> WorkflowConstant.PROCESS_FORMDATA_PREFIX_KEY + c.getFormId()).toArray(String[]::new);
-
-        List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableNameIn(startNodeFormKey).list();
-
-        for (HistoricVariableInstance historicVariableInstance : list) {
-            vo.getFormDatas().put(historicVariableInstance.getName(), Convert.toMap(String.class, Object.class, historicVariableInstance.getValue()));
-        }
-
-
-        vo.setSchemaInfo(BeanUtil.toBean(workflowSchema, WorkflowSchemaInfoVo.class));
-        return vo;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Boolean recycleDelete(RecycleDeleteDto dto) {
-
-        for (String processId : dto.getProcessIds()) {
-            runtimeService.deleteProcessInstance(processId, "流程移入回收站");
-        }
-        return true;
-    }
-
-    @Override
-    public List<HistoryTaskVo> getHistoryTask(String schemaId, String processInstanceId) {
-
-        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list();
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, schemaId));
-//        WorkflowSchema workflowSchema = redisUtil.get(WorkflowConstant.SCHEMA_CACHE_PREFIX + schemaId, WorkflowSchema.class);
-
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        List<HistoryTaskVo> result = new ArrayList<>();
-
-        for (HistoricTaskInstance task : list) {
-            Optional<Map<String, Object>> taskConfigMapOp = workflowSchemaConfig.getChildNodeConfig()
-                    .stream()
-                    .filter(n -> n.containsValue(task.getTaskDefinitionKey()))
-                    .findFirst();
-
-            taskConfigMapOp.ifPresent(map -> {
-                //将map 转为 java类
-                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, map);
-                HistoryTaskVo vo = new HistoryTaskVo();
-                //必须非会签系节点
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-                    vo.setTaskId(task.getId());
-                    vo.setTaskName(task.getName());
-                    result.add(vo);
-                }
-
-            });
-        }
-
-        return result;
-    }
-
-    @Override
-    public boolean withdraw(WithdrawDto dto) {
-
-        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
-
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        if (historicProcessInstance.getEndTime() != null) {
-            throw new MyException("流程已经结束  无法撤回!");
-        }
-        //如果是简单流程 无多实例 无网关等组件 默认可以根据审批时间
-
-        //获取到当前活动的实例
-        ActivityInstance activityInstance = runtimeService.getActivityInstance(dto.getProcessId());
-
-        //获取当前活动的任务信息
-        List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
-        //找到当前流程的 任务开始时间 最大值  为当前审批节点
-        WorkflowExtra workflowExtra = workflowExtras.stream()
-                .filter(e -> e.getProcessId().equals(dto.getProcessId()))
-                .max(Comparator.comparing(WorkflowExtra::getStartTime)).orElse(new WorkflowExtra());
-        //新增流程发起流程记录
-        WorkflowRecord record = new WorkflowRecord();
-        record.setNodeId(workflowExtra.getTaskId());
-        record.setNodeName(workflowExtra.getTaskName());
-        record.setNodeType(workflowExtra.getTaskName());
-        record.setProcessId(dto.getProcessId());
-        record.setSchemaId(workflowExtra.getSchemaId());
-        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-        record.setRecordTime(LocalDateTime.now());
-        String oldTaskName = workflowExtra.getTaskName();
-        //如果传入的是开始节点的值  默认是关闭流程  重新发起
-        if (StrUtil.equals(dto.getActivityId(), historicProcessInstance.getStartActivityId())) {
-
-            runtimeService.deleteProcessInstance(historicProcessInstance.getId(), "【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到  开始节点!");
-//            //先停止当前活动示例  然后  将流程撤回到开始节点
-//            runtimeService.createProcessInstanceModification(dto.getProcessId())
-//                    .cancelActivityInstance(activityInstance.getId())
-//                    .setAnnotation("【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到  开始节点!")
-//                    .startBeforeActivity(historicProcessInstance.getStartActivityId())
-//                    .setVariableLocal(WorkflowConstant.TASK_IS_APPOINT_APPROVE,YesOrNoEnum.NO.getCode())
-//                    .execute();
-            record.setMessage("【" + user.getName() + "】 将当前流程从【" + oldTaskName + "】 撤回 到 【开始节点】!");
-        } else {
-            //先停止当前活动示例  然后  将流程撤回到某个节点
-            runtimeService.createProcessInstanceModification(historicProcessInstance.getId())
-                    .cancelActivityInstance(activityInstance.getId())
-                    .setAnnotation("【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到 【任务:" + activityInstance.getActivityName() + "】!")
-                    .startBeforeActivity(dto.getActivityId())
-                    .setVariableLocal(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-                    .execute();
-
-            //获取当前活动的任务信息
-            List<WorkflowExtra> workflowExtrasNew = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
-            //找到当前流程的 任务开始时间 最大值  为当前审批节点
-            WorkflowExtra workflowExtraNew = workflowExtrasNew.stream()
-                    .filter(e -> e.getProcessId().equals(dto.getProcessId()))
-                    .max(Comparator.comparing(WorkflowExtra::getStartTime)).orElse(new WorkflowExtra());
-            record.setMessage("【" + user.getName() + "】 将当前流程从【" + oldTaskName + "】撤回 到【" + workflowExtraNew.getTaskName() + "】!");
-        }
-        //保存流程撤回信息
-        workflowRecordMapper.insert(record);
-        return true;
-    }
-
-    @Override
-    public boolean saveDraft(SaveDraftDto dto) {
-
-        WorkflowDraft draft = BeanUtil.toBean(dto, WorkflowDraft.class);
-        draft.setFormData(JSONUtil.toJsonStr(dto.getFormData()));
-
-        return workflowDraftService.save(draft);
-    }
-
-    @Override
-    public boolean updateDraft(UpdateDraftDto dto) {
-
-        WorkflowDraft draft = new WorkflowDraft();
-        draft.setId(dto.getId());
-        draft.setFormData(JSONUtil.toJsonStr(dto.getFormData()));
-
-        return workflowDraftService.updateById(draft);
-
-    }
-
-    @Override
-    public PageOutput<DraftPageVo> draftPage(DraftPageDto dto) {
-
-        if (ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime())) {
-            dto.setStartTime(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-            dto.setEndTime(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-
-        List<Long> ids = new ArrayList<>();
-        //发起人分割数组
-        if (StrUtil.isNotBlank(dto.getOriginator())) {
-            String allUserIdStr = StrUtil.join(StringPool.COMMA, dto.getOriginator());
-            ids = Arrays.stream(allUserIdStr.split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
-        }
-        ids.add(StpUtil.getLoginIdAsLong());
-
-        //因为多表关联 会有多个表都使用了id字段,  所以必须专门指定主表的Id
-        IPage<DraftPageVo> page = workflowDraftService.selectJoinListPage(ConventPage.getPage(dto), DraftPageVo.class,
-                MPJWrappers.<WorkflowDraft>lambdaJoin()
-                        .disableSubLogicDel()
-                        .eq(StrUtil.isNotBlank(dto.getName()), WorkflowSchema::getName, dto.getName())
-                        .in(CollectionUtil.isNotEmpty(ids), WorkflowDraft::getCreateUserId, ids)
-                        .between(ObjectUtil.isNotNull(dto.getStartTime()) && ObjectUtil.isNotNull(dto.getEndTime()), WorkflowDraft::getCreateDate, dto.getStartTime(), dto.getEndTime())
-                        .orderByDesc(WorkflowDraft::getCreateDate)
-                        .select(WorkflowDraft::getId)
-                        .select(WorkflowDraft.class, x -> VoToColumnUtil.fieldsToColumns(DraftPageVo.class).contains(x.getProperty()))
-                        .selectAs(WorkflowSchema::getName, DraftPageVo::getSchemaName)
-                        .selectAs(User::getName, DraftPageVo::getOriginator)
-                        .leftJoin(WorkflowSchema.class, WorkflowSchema::getId, WorkflowDraft::getSchemaId)
-                        .leftJoin(User.class, User::getId, WorkflowDraft::getCreateUserId));
-
-        return ConventPage.getPageOutput(page);
-
-    }
-
-    @Override
-    public boolean deleteDraft(List<Long> ids) {
-        return workflowDraftService.removeBatchByIds(ids);
-    }
-
-    @Override
-    public DraftInfoVo draftData(Long id) {
-        WorkflowDraft draft = workflowDraftService.getById(id);
-        return BeanUtil.toBean(draft, DraftInfoVo.class);
-    }
-
-    @Override
-    public PageOutput<MonitorPageVo> getProcessMonitorPage(MonitorPageDto dto) {
-
-        HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery();
-
-        if (!ObjectUtil.isNull(dto.getStartTime())) {
-            historicProcessInstanceQuery.startedAfter(WorkFlowUtil.getStartOfDay(dto.getStartTime()));
-        }
-        if (!ObjectUtil.isNull(dto.getEndTime())) {
-            historicProcessInstanceQuery.startedBefore(WorkFlowUtil.getEndOfDay(dto.getEndTime()));
-        }
-        if (StrUtil.isNotBlank(dto.getKeyword())) {
-            historicProcessInstanceQuery
-                    .or()
-                    .variableValueLike(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT)
-                    .variableValueLike(WorkflowConstant.PROCESS_START_USER_NAME_KEY, StringPool.PERCENT + dto.getKeyword() + StringPool.PERCENT)
-                    .variableValueEquals(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY, StrUtil.isNumeric(dto.getKeyword()) ? Convert.toLong(dto.getKeyword()) : 0L)
-                    .endOr();
-        }
-        if (dto.getType() == 1) {
-            historicProcessInstanceQuery.finished();
-        }
-        if (dto.getType() == 0) {
-            historicProcessInstanceQuery.unfinished();
-        }
-
-        long count = historicProcessInstanceQuery.count();
-//        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage(Convert.toInt((dto.getLimit() - 1) * dto.getSize()), dto.getSize());
-        List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.list();
-
-        //获取到所有流程id
-        List<String> processIds = historicProcessInstances.stream().map(HistoricProcessInstance::getId).collect(Collectors.toList());
-
-
-        List<MonitorPageVo> result = new ArrayList<>(historicProcessInstances.size());
-        if (processIds.size() > 0) {
-
-            List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, processIds));
-
-            for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
-
-
-                //找到当前流程的 任务开始时间 最大值  为当前审批节点
-                workflowExtras.stream()
-                        .filter(e -> e.getProcessId().equals(historicProcessInstance.getId()))
-                        .max(Comparator.comparing(WorkflowExtra::getStartTime))
-                        .ifPresent(e -> {
-                            MonitorPageVo vo = new MonitorPageVo();
-                            vo.setProcessId(e.getProcessId());
-                            vo.setTaskId(e.getTaskId());
-                            vo.setSerialNumber(e.getSerialNumber());
-                            vo.setSchemaName(e.getSchemaName());
-                            vo.setOriginator(e.getStartUserName());
-                            vo.setSchemaId(e.getSchemaId());
-
-                            //如果是已经完成的任务 默认是100进度
-                            if (ObjectUtil.isNotNull(historicProcessInstance.getEndTime())) {
-                                vo.setCurrentProgress(100);
-                            } else {
-                                vo.setCurrentProgress(e.getCurrentProgress());
-                            }
-                            vo.setCurrentTaskName(e.getTaskName());
-
-                            //如果当前任务是外部流程任务
-                            if (StrUtil.isBlank(e.getTaskId())) {//只有可能是外部流程任务或者脚本任务,但脚本任务会直接完成度100%,所以直接设值为外部流程任务
-                                vo.setCurrentTaskName(WorkflowConstant.CALL_ACTIVITY_TYPE_NAME);
-                            }
-                            vo.setStatus(historicProcessInstance.getState());
-                            vo.setStatusMessage(historicProcessInstance.getState().equals("SUSPENDED") ? "挂起" : "");
-                            vo.setCreateDate(e.getStartTime());
-
-                            result.add(vo);
-                        });
-            }
-        }
-        result.sort((t1, t2) -> t2.getCreateDate().compareTo(t1.getCreateDate()));
-        PageOutput<MonitorPageVo> output = new PageOutput<>();
-        output.setCurrentPage(dto.getLimit());
-        output.setPageSize(dto.getSize());
-        output.setTotal(Convert.toInt(count));
-        output.setList(result);
-        return output;
-    }
-
-    @Override
-    public boolean setAssignee(SetAssigneeDto dto) {
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-        if (task == null) {
-            throw new MyException("找不到此流程!");
-        }
-        if (task.isSuspended()) {
-            throw new MyException("流程已挂起,无法指定审批人!");
-        }
-
-        Object assigneesObject = taskService.getVariable(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-
-        List<String> assignees = ListUtil.toList(Convert.toStr(assigneesObject).split(StringPool.COMMA));
-        assignees.addAll(dto.getAssignees());
-        taskService.setVariable(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StrUtil.join(StringPool.COMMA, assignees));
-
-        Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-        //获取当前用户的信息
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        //新增流程发起流程记录
-        WorkflowRecord record = new WorkflowRecord();
-        record.setNodeId(task.getId());
-        record.setNodeName(task.getName());
-        record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-        record.setProcessId(task.getProcessInstanceId());
-        record.setSchemaId(schemaId);
-        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-        record.setRecordTime(LocalDateTime.now());
-        //[操作人名称] 通过[指派审核人] 指派[被指派人名称]作为审核人
-        List<Long> allAssigneesUserIds = dto.getAssignees().stream().mapToLong(t -> Long.parseLong(t.trim())).boxed().collect(Collectors.toList());
-        String allAssigneesUserNames = getAllUserNamesByIds(allAssigneesUserIds);
-        record.setMessage("【" + user.getName() + "】通过【指派审核人】指派【" + allAssigneesUserNames + "】作为审核人");
-
-        workflowRecordMapper.insert(record);
-        return true;
-    }
-
-    @Override
-    public boolean setSuspended(SetSuspendedDto dto) {
-
-        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
-
-        List<Task> taskList = taskService.createTaskQuery()
-                .processInstanceId(dto.getProcessId())
-                .list();
-        Task task = taskList.stream().filter(x -> x.getProcessInstanceId().equals(dto.getProcessId())).findFirst().orElse(new TaskEntity());
-        //获取当前用户的信息
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-        //新增流程发起流程记录
-        WorkflowRecord record = new WorkflowRecord();
-        record.setNodeId(task.getId());
-        record.setNodeName(task.getName());
-        record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-        record.setProcessId(task.getProcessInstanceId());
-        record.setSchemaId(schemaId);
-        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-        record.setRecordTime(LocalDateTime.now());
-
-        if (processInstance.isSuspended()) {
-            runtimeService.activateProcessInstanceById(dto.getProcessId());
-            //[操作人名称] 将流程恢复
-            record.setMessage("【" + user.getName() + "】将流程恢复");
-            workflowRecordMapper.insert(record);
-        } else {
-            runtimeService.suspendProcessInstanceById(dto.getProcessId());
-            //[操作人名称] 将流程挂起
-            record.setMessage("【" + user.getName() + "】将流程挂起");
-            workflowRecordMapper.insert(record);
-        }
-
-        return true;
-    }
-
-    @Override
-    public List<GetAssigneeVo> getAssignee(GetAssigneeDto dto) {
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, dto.getSchemaId()).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        if (workflowSchema == null) {
-            throw new MyException("找不到此流程模板!");
-        }
-
-        //如果当前模板被禁用 无法操作流程
-        if (workflowSchema.getEnabledMark() == EnabledMark.DISABLED.getCode()) {
-            throw new MyException("流程被禁用!");
-        }
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-
-        Optional<Map<String, Object>> userTaskConfigOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(task.getTaskDefinitionKey())).findFirst();
-
-        if (!userTaskConfigOp.isPresent()) {
-            throw new MyException("找不到当前节点配置!");
-        }
-        //    将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigOp.get());
-
-        List<User> users = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
-        });
-        List<GetAssigneeVo> result = new ArrayList<>();
-
-        //如果是单实例任务
-        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-            Object assigneeObj = taskService.getVariable(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-            List<String> taskAssignee = StrUtil.split(Convert.toStr(assigneeObj), StringPool.COMMA);
-
-
-            List<User> assigneeUserInfo = users.stream().filter(u -> taskAssignee.contains(StrUtil.toString(u.getId()))).collect(Collectors.toList());
-
-            for (User user : assigneeUserInfo) {
-                GetAssigneeVo vo = BeanUtil.toBean(user, GetAssigneeVo.class);
-
-                //如果不是当前登录用户 就可以移除
-                vo.setCanRemove(StpUtil.getLoginIdAsLong() != user.getId());
-                result.add(vo);
-            }
-
-        }
-        //如果是多实例任务
-        else {
-
-            Object assigneeObj = runtimeService.getVariable(task.getProcessInstanceId(), WorkflowConstant.TASK_MULTI_ASSIGNEE_VAR_KEY + task.getTaskDefinitionKey());
-            List<Long> taskAssignee = Convert.toList(Long.class, assigneeObj);
-
-            List<User> assigneeUserInfo = users.stream().filter(u -> taskAssignee.contains(u.getId())).collect(Collectors.toList());
-
-            //查询审批记录表,xjr_workflow_approve_record,流程id和节点的key值查询有哪些用户审批过了
-            List<WorkflowApproveRecord> list = approveRecordService.list(Wrappers.lambdaQuery(WorkflowApproveRecord.class)
-                    .eq(WorkflowApproveRecord::getProcessId, task.getProcessInstanceId())
-                    .eq(WorkflowApproveRecord::getTaskDefinitionKey, task.getTaskDefinitionKey())
-            );
-
-            List<Long> approveUserIds = new ArrayList<>();
-            if (list.size() != 0) {
-                //已审批的用户id
-                approveUserIds = list.stream().map(WorkflowApproveRecord::getApproveUserId).collect(Collectors.toList());
-            }
-            for (User user : assigneeUserInfo) {
-                GetAssigneeVo vo = BeanUtil.toBean(user, GetAssigneeVo.class);
-
-                //同步都不能减签
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.PARALLEL.getCode()) {
-                    vo.setCanRemove(Boolean.FALSE);
-                } else {
-                    //异步不能减签已经审批的和当前审批登录人
-                    //如果人员已经审批了  或者  审批人是当前登陆人 不能移除
-                    if (approveUserIds.contains(user.getId()) || StpUtil.getLoginIdAsLong() == user.getId()) {
-                        vo.setCanRemove(Boolean.FALSE);
-                    } else {
-                        vo.setCanRemove(Boolean.TRUE);
-                    }
-                }
-
-                result.add(vo);
-            }
-
-
-        }
-        return result;
-    }
-
-    @Override
-    public boolean addOrSubSign(AddOrSubSignDto dto) {
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, dto.getSchemaId()).select(x -> !x.getProperty().startsWith(DB_FIELD_XML_PREFIX)));
-
-        if (workflowSchema == null) {
-            throw new MyException("找不到此流程模板!");
-        }
-        //如果当前模板被禁用 无法操作流程
-        if (workflowSchema.getEnabledMark() == EnabledMark.DISABLED.getCode()) {
-            throw new MyException("流程被禁用!");
-        }
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-
-        Optional<Map<String, Object>> userTaskConfigOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(task.getTaskDefinitionKey())).findFirst();
-
-        if (!userTaskConfigOp.isPresent()) {
-            throw new MyException("找不到当前节点配置!");
-        }
-        //    将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigOp.get());
-
-        if (!userTaskConfig.getCountersignConfig().getAddOrRemove()) {
-            throw new MyException("当前节点不允许加减签!");
-        }
-
-        //如果是单实例任务
-        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-            Object assigneeObj = taskService.getVariable(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-            List<String> taskAssigneeStrList = StrUtil.split(Convert.toStr(assigneeObj), StringPool.COMMA);
-
-            List<Long> assigneeList = Convert.toList(Long.class, taskAssigneeStrList);
-            assigneeList.removeAll(dto.getUserIds());
-
-            taskService.setVariableLocal(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StrUtil.join(StringPool.COMMA, assigneeList));
-        } else {
-
-            Object assigneeObj = runtimeService.getVariable(task.getProcessInstanceId(), WorkflowConstant.TASK_MULTI_ASSIGNEE_VAR_KEY + task.getTaskDefinitionKey());
-            List<Long> taskAssignee = Convert.toList(Long.class, assigneeObj);
-
-            //取交集 不用动
-            Collection<Long> intersection = CollectionUtil.intersection(taskAssignee, dto.getUserIds());
-
-            //使用交集 与 原审批人 取差集  就是需要减签的成员
-            List<Long> removeUser = CollectionUtil.subtractToList(taskAssignee, intersection);
-            //使用交集 与 新审批人 取差集  就是需要加签的成员
-            List<Long> addUser = CollectionUtil.subtractToList(dto.getUserIds(), intersection);
-
-            int instancesCount = 0;
-            Object allInstances = runtimeService.getVariable(task.getExecutionId(), WorkflowConstant.MULTI_INSTANCE_VAR_KEY);
-
-
-            //如果是串行(异步)
-            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.SEQUENTIAL.getCode()) {
-                //减签
-                taskAssignee.removeAll(removeUser);
-                instancesCount = Convert.toInt(allInstances) - removeUser.size();
-
-                //加签
-                taskAssignee.addAll(addUser);
-                instancesCount += addUser.size();
-                runtimeService.setVariable(task.getProcessInstanceId(), WorkflowConstant.TASK_MULTI_ASSIGNEE_VAR_KEY + task.getTaskDefinitionKey(), taskAssignee);
-
-            }
-            //同步需要直接开一个任务
-            else {
-                //减签
-                for (Long userId : removeUser) {
-                    Task removeTask = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).taskVariableValueEquals(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StrUtil.toString(userId)).singleResult();
-
-                    //获取到 activityinstanceId
-                    HistoricActivityInstance historicActivityInstance = historyService.createHistoricActivityInstanceQuery()
-                            .processInstanceId(removeTask.getProcessInstanceId())
-                            .activityId(task.getTaskDefinitionKey())
-                            .executionId(removeTask.getExecutionId()).singleResult();
-
-                    runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
-                            .cancelActivityInstance(historicActivityInstance.getId())
-                            .execute();
-                }
-                instancesCount = Convert.toInt(allInstances) - removeUser.size();
-                taskAssignee.removeAll(removeUser);
-
-                //加签
-                for (Long userId : addUser) {
-                    runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
-                            .startBeforeActivity(task.getTaskDefinitionKey())
-                            .setVariableLocal(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, userId)
-                            .execute();
-                }
-                //加签
-                taskAssignee.addAll(addUser);
-                instancesCount += addUser.size();
-                runtimeService.setVariable(task.getProcessInstanceId(), WorkflowConstant.TASK_MULTI_ASSIGNEE_VAR_KEY + task.getTaskDefinitionKey(), taskAssignee);
-            }
-            runtimeService.setVariable(task.getExecutionId(), WorkflowConstant.MULTI_INSTANCE_VAR_KEY, instancesCount);
-
-        }
-        return true;
-    }
-
-    @Override
-    public List<RejectNodeVo> getRejectNode(RejectNodeDto dto) {
-
-        ActivityInstance activityInstance = runtimeService.getActivityInstance(dto.getProcessId());
-        if (activityInstance == null) {
-            throw new MyException("流程已经结束,不允许撤回!");
-        }
-
-        HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
-
-        //排除xml 查出数据
-        WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, historicVariableInstance.getValue()));
-
-        //获取到整个流程模板的配置
-        WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-
-        List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
-                .processInstanceId(dto.getProcessId())
-                .activityType(WorkflowConstant.BPMN_USER_TASK_TYPE_NAME)
-                .finished()
-                .orderByHistoricActivityInstanceEndTime()
-                .desc()
-                .list();
-
-        String taskDefinitionKey;
-        if (ObjectUtil.isNotNull(dto.getTaskId())) {
-            HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskId(dto.getTaskId()).singleResult();
-            taskDefinitionKey = historicTaskInstance.getTaskDefinitionKey();
-        } else {
-            //一个用户任务也不存在的情况。只有可能是纯粹的脚本任务和开始节点后面直接接外部流程的情况,直接不允许撤回
-            if (list.size() == YesOrNoEnum.NO.getCode()) {
-                throw new MyException("当前流程不允许撤回 ");
-            } else {//正在进行外部流程的子流程运行中
-                throw new MyException("当前流程有其他外部流程 或者 子流程 正在运行,不允许撤回!");
-            }
-//            taskDefinitionKey = activityInstance.getChildActivityInstances()[0].getActivityId();
-        }
-
-//        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-
-        Optional<Map<String, Object>> userTaskConfigOp = workflowSchemaConfig.getChildNodeConfig().stream().filter(c -> c.containsValue(taskDefinitionKey)).findFirst();
-
-        if (!userTaskConfigOp.isPresent()) {
-            throw new MyException("找不到当前节点配置!");
-        }
-        //    将map 转为 java类
-        UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigOp.get());
-
-        List<RejectNodeVo> voList = new ArrayList<>();
-
-        List<HistoricProcessInstance> subProcess = historyService.createHistoricProcessInstanceQuery()
-                .superProcessInstanceId(dto.getProcessId()).list();
-
-        //当前流程是否有父级流程,就是外部流程或者子流程。外部流程或者子流程不能撤回到开始节点,不新增开始节点
-        if (subProcess.size() < 1) {
-            //获取到当前流程发起人  如果操作人 是发起人 默认新增开始节点
-            Object startUserId = runtimeService.getVariable(dto.getProcessId(), WorkflowConstant.PROCESS_START_USER_ID_KEY);
-            if (StpUtil.getLoginIdAsLong() == Convert.toLong(startUserId)) {
-
-                List<HistoricActivityInstance> startList = historyService.createHistoricActivityInstanceQuery()
-                        .processInstanceId(dto.getProcessId())
-                        .activityType(WorkflowConstant.BPMN_START_EVENT_TYPE_NAME)
-                        .finished()
-                        .orderByHistoricActivityInstanceEndTime()
-                        .desc()
-                        .list();
-
-                HistoricActivityInstance historicActivityInstance = startList.get(0);
-
-                RejectNodeVo vo = new RejectNodeVo();
-                vo.setActivityId(historicActivityInstance.getActivityId());
-                vo.setActivityName(historicActivityInstance.getActivityName());
-                voList.add(vo);
-            }
-        }
-
-        if (list == null || list.size() == 0) {
-            return voList;
-        }
-
-        List<ButtonConfig> buttonConfigs = userTaskConfig.getButtonConfigs();
-
-        if (CollectionUtil.isNotEmpty(buttonConfigs)) {
-            Optional<ButtonConfig> rejectButton = buttonConfigs.stream().filter(ButtonConfig::getChecked).filter(x -> x.getApproveType() == WorkflowApproveType.REJECT.getCode()).filter(x -> x.getButtonOpera().equals(YesOrNoEnum.YES.getCode())).findFirst();
-
-            //如果有配置驳回按钮 并且 设置只能驳回上一节点
-            if (rejectButton.isPresent()) {
-                HistoricActivityInstance historicActivityInstance = list.get(0);
-
-                if (!historicActivityInstance.isCanceled() && !activityInstance.getChildActivityInstances()[0].getActivityId().equals(historicActivityInstance.getActivityId())) {
-                    RejectNodeVo vo = new RejectNodeVo();
-                    vo.setActivityId(historicActivityInstance.getActivityId());
-                    vo.setActivityName(historicActivityInstance.getActivityName());
-                    voList.add(vo);
-                }
-                return voList;
-            }
-        }
-
-
-        for (HistoricActivityInstance historicActivityInstance : list) {
-
-            if (!historicActivityInstance.isCanceled() && !activityInstance.getChildActivityInstances()[0].getActivityId().equals(historicActivityInstance.getActivityId())) {
-                RejectNodeVo vo = new RejectNodeVo();
-                vo.setActivityId(historicActivityInstance.getActivityId());
-                vo.setActivityName(historicActivityInstance.getActivityName());
-                voList.add(vo);
-            }
-
-        }
-        //多次驳回之后需要对返回的节点进行去重操作
-        List<RejectNodeVo> collect = voList.stream().distinct().collect(Collectors.toList());
-        return collect;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Boolean transfer(TransferDto dto) {
-        Object assigneeObj = taskService.getVariableLocal(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-
-        String newAssignee = StrUtil.toString(assigneeObj).replace(StpUtil.getLoginIdAsString(), dto.getUserId());
-
-        taskService.setVariableLocal(dto.getTaskId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, newAssignee);
-
-        //根据taskid  获取任务信息
-        Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
-        Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-        //获取当前用户的信息
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        //根据转办人的id获取用户名称
-        List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
-        });
-        List<String> collect = userList.stream().filter(u -> dto.getUserId().equals(Convert.toStr(u.getId()))).map(User::getName).collect(Collectors.toList());
-        //转办人名称
-        String newAssigneeName = collect.get(0);
-        //新增流程发起流程记录
-        WorkflowRecord record = new WorkflowRecord();
-        record.setNodeId(task.getId());
-        record.setNodeName(task.getName());
-        record.setNodeType(WorkflowConstant.START_EVENT_TYPE_NAME);
-        record.setProcessId(task.getProcessInstanceId());
-        record.setSchemaId(schemaId);
-        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-        record.setRecordTime(LocalDateTime.now());
-        //[操作人名称]将[节点名称] 转交给[被作人名称]办理
-        String message = "【" + user.getName() + "】将【" + task.getName() + "】转交给【" + newAssigneeName + "】办理";
-        record.setMessage(message);
-
-        workflowRecordMapper.insert(record);
-        return true;
-    }
-
-    @Override
-    public GetCountVo getCount() {
-        GetCountVo vo = new GetCountVo();
-//        SaSession tokenSession = StpUtil.getTokenSession();
-//        User user = tokenSession.get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        TaskQuery taskQuery = taskService.createTaskQuery()
-                .active()
-                .taskVariableValueEquals(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
-                .processVariableValueEquals(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.NO.getCode())
-                .taskVariableValueLike(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StringPool.PERCENT + StpUtil.getLoginIdAsLong() + StringPool.PERCENT);
-
-        vo.setPendingCount(taskQuery.count());
-
-
-        LambdaQueryWrapper<WorkflowDelegate> delegateQueryWrapper = Wrappers.lambdaQuery(WorkflowDelegate.class).like(WorkflowDelegate::getDelegateUserIds, StpUtil.getLoginIdAsLong());
-
-        vo.setDelegateCount(workflowDelegateMapper.selectCount(delegateQueryWrapper));
-
-
-        LambdaQueryWrapper<WorkflowApproveRecord> recordQueryWrapper = Wrappers.lambdaQuery(WorkflowApproveRecord.class).eq(WorkflowApproveRecord::getApproveUserId, StpUtil.getLoginIdAsLong());
-        vo.setFinishedCount(approveRecordService.count(recordQueryWrapper));
-
-
-        return vo;
-    }
-
-
-    /**
-     * 根据流程id  获取流程流转信息
-     *
-     * @param processInstanceId
-     * @return
-     */
-    private List<ProcessRecordListVo> getProcessRecordListVos(String processInstanceId, int onlySelf) {
-
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        List<Long> roleIds = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_ROLE_ID_KEY, new ArrayList<>());
-        LambdaQueryWrapper<WorkflowRecord> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-        if (onlySelf == YesOrNoEnum.YES.getCode()) {//仅查看本人
-            if (roleIds.contains(GlobalConstant.SUPER_ADMIN_ROLE_ID)) {//管理员数据
-                lambdaQueryWrapper.eq(WorkflowRecord::getProcessId, processInstanceId)
-                        .orderByAsc(WorkflowRecord::getRecordTime)
-                        .like(WorkflowRecord::getMessage, user.getName())
-                        .or()
-                        .like(WorkflowRecord::getMessage, "流程结束")
-                        .eq(WorkflowRecord::getProcessId, processInstanceId)
-                        .or()
-                        .like(WorkflowRecord::getMessage, "脚本节点")
-                        .eq(WorkflowRecord::getCreateUserId, StpUtil.getLoginIdAsLong())//脚本任务
-                        .eq(WorkflowRecord::getProcessId, processInstanceId);
-            } else {//其他人数据
-                lambdaQueryWrapper.eq(WorkflowRecord::getProcessId, processInstanceId)
-                        .orderByAsc(WorkflowRecord::getRecordTime)
-                        .eq(WorkflowRecord::getCreateUserId, StpUtil.getLoginIdAsLong())
-                        .like(WorkflowRecord::getMessage, user.getName())
-                        .or()
-                        .like(WorkflowRecord::getMessage, user.getName())
-                        .eq(WorkflowRecord::getProcessId, processInstanceId)
-                        .or()
-                        .like(WorkflowRecord::getMessage, "脚本节点")
-                        .eq(WorkflowRecord::getCreateUserId, StpUtil.getLoginIdAsLong())//脚本任务
-                        .eq(WorkflowRecord::getProcessId, processInstanceId);
-            }
-        } else {
-            lambdaQueryWrapper.eq(WorkflowRecord::getProcessId, processInstanceId)
-                    .orderByAsc(WorkflowRecord::getRecordTime);
-        }
-
-        List<WorkflowRecord> workflowRecords = workflowRecordMapper.selectList(lambdaQueryWrapper);
-
-        List<ProcessRecordListVo> recordListVos = new ArrayList<>(workflowRecords.size());
-        for (WorkflowRecord workflowRecord : workflowRecords) {
-            ProcessRecordListVo recordListVo = new ProcessRecordListVo();
-            recordListVo.setNodeType(workflowRecord.getNodeType());
-            recordListVo.setNodeName(workflowRecord.getNodeName());
-            recordListVo.setComment(workflowRecord.getMessage());
-            recordListVo.setStartTime(workflowRecord.getRecordTime());
-            recordListVo.setCirculateMessage(workflowRecord.getCirculateMessage());
-            recordListVos.add(recordListVo);
-        }
-        return recordListVos;
-    }
-
-
-    private void invokeAutoAgree(String processInstanceId, Long schemaId, WorkflowSchemaConfig workflowSchemaConfig, List<Task> taskList) {
-
-        if (taskList.size() == 0) {
-        } else if (taskList.size() == 1) {
-            Task task = taskList.get(0);
-            Optional<Map<String, Object>> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-            User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-            if (!userTaskConfigMap.isPresent()) {
-                throw new MyException("当前任务没有开始节点");
-            }
-            //将map 转为 java类
-            UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap.get());
-            List<Integer> userAutoAgree = userTaskConfig.getAutoAgreeRule();
-            List<Integer> processAutoAgree = workflowSchemaConfig.getProcessConfig().getAutoAgreeRule();
-
-            if (userAutoAgree != null && userAutoAgree.size() > 0) {
-                isAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, task, user, userAutoAgree);
-                return;
-            }
-            if (processAutoAgree != null && processAutoAgree.size() > 0) {
-                isAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, task, user, processAutoAgree);
-            }
-        } else {
-            for (Task task : taskList) {
-                Optional<Map<String, Object>> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-                User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-                if (!userTaskConfigMap.isPresent()) {
-                    throw new MyException("当前任务没有开始节点");
-                }
-                //将map 转为 java类
-                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap.get());
-                List<Integer> userAutoAgree = userTaskConfig.getAutoAgreeRule();
-                List<Integer> processAutoAgree = workflowSchemaConfig.getProcessConfig().getAutoAgreeRule();
-
-                if (userAutoAgree != null && userAutoAgree.size() > 0) {
-                    isAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, task, user, userAutoAgree);
-                    return;
-                }
-                if (processAutoAgree != null && processAutoAgree.size() > 0) {
-                    isAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, task, user, processAutoAgree);
-                }
-            }
-        }
-    }
-
-    private void isAutoAgree(String processInstanceId, Long schemaId, WorkflowSchemaConfig workflowSchemaConfig, Task task, User user, List<Integer> autoAgreeConfig) {
-        Object approveUserIdsObj = taskService.getVariable(task.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY);
-        Object startUserIdObj = taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_START_USER_ID_KEY);
-        List<Long> approveUserIds = Arrays.stream(Convert.toStr(approveUserIdsObj).split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
-        Long startUserId = Convert.toLong(startUserIdObj);
-        String opinion = StringPool.EMPTY;
-        boolean isAgree = Boolean.FALSE;
-
-        List<String> opinions = new ArrayList<>();//所有选择的自动同意规则
-        List<Long> allUserIds = new ArrayList<>();//所有自动同意审批的用户id
-        //新增流程发起流程记录
-        WorkflowRecord record = new WorkflowRecord();
-        //候选审批人包含流程任务发起人
-        if (autoAgreeConfig.contains(WorkflowAutoAgreeType.APPROVED_INCLUDE_INITIATOR.getCode())) {
-            if (approveUserIds.contains(startUserId)) {
-                allUserIds.add(startUserId);
-                taskService.createComment(task.getId(), task.getProcessInstanceId(), "候选审批人包含流程任务发起人---自动同意");
-                //自动同意缓存流程审批人记录
-                WorkFlowUtil.cacheTaskAssigneeRecord(processInstanceId, task.getId(), startUserId);
-                opinion = "候选审批人包含流程任务发起人";
-                opinions.add(opinion);
-                isAgree = Boolean.TRUE;
-            }
-        }
-        //候选审批人包含上一节点审批人
-        if (autoAgreeConfig.contains(WorkflowAutoAgreeType.APPROVED_INCLUDE_PREV.getCode())) {
-            //上一节点审批人 都是当前操作人。  因为此方法 只会在 发起  和  审批节点 执行
-            if (approveUserIds.contains(StpUtil.getLoginIdAsLong())) {
-                allUserIds.add(StpUtil.getLoginIdAsLong());
-                taskService.createComment(task.getId(), task.getProcessInstanceId(), "候选审批人包含上一节点审批人---自动同意");
-                //自动同意缓存流程审批人记录
-                WorkFlowUtil.cacheTaskAssigneeRecord(processInstanceId, task.getId(), StpUtil.getLoginIdAsLong());
-                opinion = "候选审批人包含上一节点审批人";
-                opinions.add(opinion);
-                isAgree = Boolean.TRUE;
-            }
-        }
-        String approveName = "";
-        if (autoAgreeConfig.contains(WorkflowAutoAgreeType.APPROVED_IN_PROCESS.getCode())) {
-
-            Map<String, List<Long>> taskAssigneeRecordMap = redisUtil.get(processInstanceId + WorkflowConstant.TASK_ASSIGNEE_RECORD_VAR_KEY, new TypeReference<Map<String, List<Long>>>() {
-            });
-
-            //如果为空 代表是开始节点  还未有审批人
-            if (taskAssigneeRecordMap == null) {
-                if (approveUserIds.contains(Convert.toLong(startUserId))) {
-                    allUserIds.add(Convert.toLong(startUserId));
-                    taskService.createComment(task.getId(), task.getProcessInstanceId(), "候选审批人在此流程中审批过---自动同意");
-                    WorkFlowUtil.cacheTaskAssigneeRecord(processInstanceId, task.getId(), startUserId);
-                    opinion = "候选审批人在此流程中审批过";
-                    opinions.add(opinion);
-                    isAgree = Boolean.TRUE;
-                }
-            } else {
-                Collection<List<Long>> assigneeList = taskAssigneeRecordMap.values();
-                List<Long> allAssignee = new ArrayList<>();
-                allAssignee.add(startUserId);
-                for (List<Long> assignee : assigneeList) {
-                    allAssignee.addAll(assignee);
-                }
-                //并集 就是在流程中审批过的人
-                Collection<Long> intersection = CollectionUtil.intersection(allAssignee, approveUserIds);
-                //获取自动审批的人员名称,给流程信息使用
-                List<Long> list = intersection.stream().collect(Collectors.toList());
-                allUserIds.addAll(list);
-                if (intersection.size() > 0) {
-                    //在流转到下一个任务前设置好流程信息时间
-                    taskService.createComment(task.getId(), task.getProcessInstanceId(), "候选审批人在此流程中审批过---自动同意");
-                    List<Long> assigneeInApprove = new ArrayList<>(intersection);
-                    WorkFlowUtil.cacheTaskAssigneeRecord(processInstanceId, task.getId(), assigneeInApprove.get(0));
-                    isAgree = Boolean.TRUE;
-                    opinion = "候选审批人在此流程中审批过";
-                    opinions.add(opinion);
-                }
-            }
-        }
-        if (isAgree) {
-            //自动同意之后完成本次任务
-            record.setRecordTime(LocalDateTime.now());
-            taskService.complete(task.getId());
-            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-            String allOpinions = StringPool.EMPTY;
-            if (opinions.size() > 0) {
-                String chineseDot = "、";
-                allOpinions = StrUtil.join(chineseDot, opinions);
-            }
-            approveName = WorkFlowUtil.getAllUserNamesByIds(allUserIds);
-            //如果找不到任务了 默认流程已经结束
-            if (list.size() > 0) {
-                String allNextTaskName = StrUtil.join(StringPool.SPACE, list.parallelStream().map(t -> "【" + t.getName() + "】").collect(Collectors.toList()));
-
-                String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 " + allNextTaskName;
-                addProcessRecord(task, schemaId, message, record);
-                // 如果还有用户任务  则递归调用
-                invokeAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, list);
-            } else {
-                String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 结束节点";
-                addProcessRecord(task, schemaId, message, record);
-            }
-        }
-
-    }
-
-
-    /**
-     * 判断是否由需要指定审批人 老版
-     *
-     * @param workflowSchemaConfig
-     * @param processInstanceId
-     * @return
-     */
-    private ImmutableTriple<String, Boolean, Boolean> isPrevChooseApproveBackUp(WorkflowSchemaConfig workflowSchemaConfig, String processInstanceId, List<Task> list) {
-
-        //left==taskId | middle == 是否需要指定 | right == 是否多实例
-        //如果一个任务都没有 证明了流程走完了  如果list 大于1  也证明任务的下一节点是多实例  多实例无法指定审批人
-        if (list.size() == 0) {
-            return new ImmutableTriple<>("", Boolean.FALSE, Boolean.FALSE);
-        } else if (list.size() > 1) {
-            return new ImmutableTriple<>("", Boolean.FALSE, Boolean.TRUE);
-        } else {
-            Task task = list.get(0);
-
-            Optional<Map<String, Object>> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-            if (!userTaskConfigMap.isPresent()) {
-                throw new MyException("找不到下一个用户任务的配置!");
-            }
-            UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap.get());
-            //只有非会签流程  才需要判断 是否指定审批人 是否无对应处理人  判断完 前两者 再判断是否自动同意
-            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-                VariableInstance variableInstance = runtimeService.createVariableInstanceQuery().taskIdIn(task.getId()).variableName(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY).singleResult();
-                //如果审批人变量不为空
-                if (variableInstance != null) {
-                    if (
-                            userTaskConfig.getIsPrevChooseNext() == WorkflowIsPrevChooseNextType.PREV.getCode() ||
-                                    workflowSchemaConfig.getProcessConfig().getIsPrevChooseNext() == WorkflowIsPrevChooseNextType.PREV.getCode()
-                    ) {
-                        return new ImmutableTriple<>(task.getId(), Boolean.TRUE, Boolean.FALSE);
-                    }
-
-                } else {
-                    //
-                    if (userTaskConfig.getNoHandler() == WorkflowNoHandlerType.PREV.getCode() ||
-                            workflowSchemaConfig.getProcessConfig().getNoHandler() == WorkflowNoHandlerType.PREV.getCode()
-                    ) {
-                        return new ImmutableTriple<>(task.getId(), Boolean.TRUE, Boolean.FALSE);
-                    }
-                }
-                return new ImmutableTriple<>(task.getId(), Boolean.FALSE, Boolean.FALSE);
-            } else {
-                return new ImmutableTriple<>("", Boolean.FALSE, Boolean.TRUE);
-            }
-        }
-    }
-
-    /**
-     * 判断是否由需要指定审批人
-     *
-     * @param workflowSchemaConfig
-     * @param list
-     * @return
-     */
-    private List<LaunchAndApproveVo> isPrevChooseApprove(WorkflowSchemaConfig workflowSchemaConfig, List<Task> list, VariableMap variableMap) {
-        List<LaunchAndApproveVo> voList = new ArrayList<>();
-
-        //left==taskId | middle == 是否需要指定 | right == 是否多实例
-        //如果一个任务都没有 证明了流程走完了  如果list 大于1  也证明任务的下一节点是多实例  多实例无法指定审批人
-        if (list.size() == 0) {
-            return voList;
-        } else if (list.size() > 1) {
-            String[] taskIds = list.stream().map(Task::getId).toArray(String[]::new);
-            List<VariableInstance> variableInstanceList = runtimeService.createVariableInstanceQuery().taskIdIn(taskIds).variableName(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY).list();
-            for (Task task : list) {
-                LaunchAndApproveVo vo = new LaunchAndApproveVo();
-                Optional<Map<String, Object>> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-                if (!userTaskConfigMap.isPresent()) {
-                    throw new MyException("找不到下一个用户任务的配置!");
-                }
-                UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap.get());
-                Optional<VariableInstance> variableInstanceOptional = variableInstanceList.stream()
-                        .filter(v -> v.getTaskId().equals(task.getId()))
-                        .filter(v -> v.getName().equals(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY))
-                        .findFirst();
-
-                //只有非会签流程  才需要判断 是否指定审批人 是否无对应处理人  判断完 前两者 再判断是否自动同意
-                if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-
-                    //如果设置了指定审批人
-                    if (
-                            userTaskConfig.getIsPrevChooseNext() == WorkflowIsPrevChooseNextType.PREV.getCode() ||
-                                    workflowSchemaConfig.getProcessConfig().getIsPrevChooseNext() == WorkflowIsPrevChooseNextType.PREV.getCode()
-                    ) {
-                        vo.setTaskName(task.getName());
-                        vo.setTaskId(task.getId());
-                        vo.setIsAppoint(Boolean.TRUE);
-                        vo.setIsMultiInstance(Boolean.FALSE);
-                        vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-                        variableInstanceOptional.ifPresent(var -> {
-                            vo.setApproveUserIds(Convert.toStr(var.getValue()));
-                        });
-                        voList.add(vo);
-
-
-                        //如果是需要指定审批人 默认设置变量
-                        taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                        //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                        redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
-//                            redisUtil.set(GlobalConstant.CAPTCHA + StringPool.UNDERSCORE + mobile, code, 6000L);
-                        continue;
-                    }
-
-                    //如果没有设置过审批人  需要走无对应处理人逻辑
-                    if (userTaskConfig.getApproverConfigs() == null || userTaskConfig.getApproverConfigs().size() == 0) {
-                        // 如果需要指定审批人
-                        if (userTaskConfig.getNoHandler() == WorkflowNoHandlerType.PREV.getCode()) {
-                            vo.setTaskName(task.getName());
-                            vo.setTaskId(task.getId());
-                            vo.setIsAppoint(Boolean.TRUE);
-                            vo.setIsMultiInstance(Boolean.FALSE);
-                            vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-
-                            variableInstanceOptional.ifPresent(var -> {
-                                vo.setApproveUserIds(Convert.toStr(var.getValue()));
-                            });
-                            voList.add(vo);
-
-                            //如果是需要指定审批人 默认设置变量
-                            taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                            //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                            redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
-                            continue;
-                        } else {
-                            List<UserRoleRelation> userRoleRelations = redisUtil.get(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, new TypeReference<List<UserRoleRelation>>() {
-                            });
-                            //获取超级管理员成员
-                            List<Long> adminUserIds = userRoleRelations.stream().filter(x -> x.getRoleId().equals(GlobalConstant.SUPER_ADMIN_ROLE_ID)).map(UserRoleRelation::getUserId).collect(Collectors.toList());
-                            taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StrUtil.join(StringPool.COMMA, adminUserIds));
-                        }
-                    }
-                    vo.setTaskName(task.getName());
-                    vo.setTaskId(task.getId());
-                    vo.setIsAppoint(Boolean.FALSE);
-                    vo.setIsMultiInstance(Boolean.FALSE);
-                    vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-                    taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
-                    voList.add(vo);
-
-                } else {
-                    vo.setTaskName(task.getName());
-                    vo.setTaskId(task.getId());
-                    vo.setIsAppoint(Boolean.FALSE);
-                    vo.setIsMultiInstance(Boolean.TRUE);
-                    vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-                    taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
-                    voList.add(vo);
-                }
-
-                //记录一下需要发送消息(不需要指定审批人的)的任务id
-//                if (variableInstanceOptional.isPresent()) {
-//
-//                    List<String> approveIds = ListUtil.toList(Convert.toStr(variableInstanceOptional.get().getValue()).split(StringPool.COMMA));
-//
-//                    NoticePolicyParam param = new NoticePolicyParam();
-//                    param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
-//                    param.setTaskId(task.getId());
-//                    param.setTaskName(task.getName());
-//                    param.setProcessId(task.getProcessInstanceId());
-//                    param.setTaskName(task.getName());
-//                    param.setSchemaId(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
-//                    param.setSchemaName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
-//                    param.setStartUserName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
-//
-//                    param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
-//                    WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
-//                }
-
-            }
-
-            return voList;
-        } else {
-            Task task = list.get(0);
-
-            LaunchAndApproveVo vo = new LaunchAndApproveVo();
-
-            Optional<Map<String, Object>> userTaskConfigMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-            if (!userTaskConfigMap.isPresent()) {
-                throw new MyException("找不到下一个用户任务的配置!");
-            }
-            UserTaskConfig userTaskConfig = Convert.convert(UserTaskConfig.class, userTaskConfigMap.get());
-            VariableInstance variableInstance = runtimeService.createVariableInstanceQuery().taskIdIn(task.getId()).variableName(WorkflowConstant.TASK_ASSIGNEE_VAR_KEY).singleResult();
-
-            //只有非会签流程  才需要判断 是否指定审批人 是否无对应处理人  判断完 前两者 再判断是否自动同意
-            if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-
-                if (
-                        userTaskConfig.getIsPrevChooseNext() == WorkflowIsPrevChooseNextType.PREV.getCode() ||
-                                workflowSchemaConfig.getProcessConfig().getIsPrevChooseNext() == WorkflowIsPrevChooseNextType.PREV.getCode()
-                ) {
-                    vo.setTaskName(task.getName());
-                    vo.setTaskId(task.getId());
-                    vo.setIsAppoint(Boolean.TRUE);
-                    vo.setIsMultiInstance(Boolean.FALSE);
-                    vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-                    if (variableInstance != null) {
-                        vo.setApproveUserIds(Convert.toStr(variableInstance.getValue()));
-                    } else {
-                        vo.setProvisionalApprover(Boolean.TRUE);
-                    }
-
-                    voList.add(vo);
-
-                    //如果是需要指定审批人 默认设置变量
-                    taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                    //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                    redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
-                    return voList;
-                }
-
-                //如果没有设置过审批人  需要走无对应处理人逻辑
-                if (userTaskConfig.getApproverConfigs() == null || userTaskConfig.getApproverConfigs().size() == 0) {
-
-                    if (userTaskConfig.getNoHandler() == WorkflowNoHandlerType.PREV.getCode()
-                    ) {
-                        vo.setTaskName(task.getName());
-                        vo.setTaskId(task.getId());
-                        vo.setIsAppoint(Boolean.TRUE);
-                        vo.setIsMultiInstance(Boolean.FALSE);
-                        vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-
-                        if (variableInstance != null) {
-                            vo.setApproveUserIds(Convert.toStr(variableInstance.getValue()));
-                        } else {
-                            vo.setProvisionalApprover(Boolean.TRUE);
-                        }
-                        voList.add(vo);
-
-                        //如果是需要指定审批人 默认设置变量
-                        taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.YES.getCode());
-                        //默认定时10分钟  如果不指定审批人 就会使用原审批人
-                        redisUtil.set(task.getId() + StringPool.UNDERSCORE + WorkflowConstant.TASK_IS_APPOINT_APPROVE, task.getId(), 10 * 60);
-                        return voList;
-                    } else {
-                        List<UserRoleRelation> userRoleRelations = redisUtil.get(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, new TypeReference<List<UserRoleRelation>>() {
-                        });
-                        //获取超级管理员成员
-                        List<Long> adminUserIds = userRoleRelations.stream().filter(x -> x.getRoleId().equals(GlobalConstant.SUPER_ADMIN_ROLE_ID)).map(UserRoleRelation::getUserId).collect(Collectors.toList());
-                        taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_ASSIGNEE_VAR_KEY, StrUtil.join(StringPool.COMMA, adminUserIds));
-                    }
-                }
-                vo.setTaskName(task.getName());
-                vo.setTaskId(task.getId());
-                vo.setIsAppoint(Boolean.FALSE);
-                vo.setIsMultiInstance(Boolean.FALSE);
-                vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-                voList.add(vo);
-                taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
-
-
-            } else {
-                vo.setTaskName(task.getName());
-                vo.setTaskId(task.getId());
-                vo.setIsAppoint(Boolean.FALSE);
-                vo.setIsMultiInstance(Boolean.TRUE);
-                vo.setProvisionalApprover(userTaskConfig.getProvisionalApprover());
-                voList.add(vo);
-                taskService.setVariableLocal(task.getId(), WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode());
-
-
-            }
-            //如果审批人变量不为空  并且不需要指定审批人 就发送消息
-//            if (variableInstance != null) {
-//                List<String> approveIds = ListUtil.toList(Convert.toStr(variableInstance.getValue()).split(StringPool.COMMA));
-//
-//                NoticePolicyParam param = new NoticePolicyParam();
-//                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
-//                param.setTaskId(task.getId());
-//                param.setTaskName(task.getName());
-//                param.setProcessId(task.getProcessInstanceId());
-//                param.setTaskName(task.getName());
-//                param.setSchemaId(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
-//                param.setSchemaName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
-//                param.setStartUserName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
-//                param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
-//                WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
-//
-//            }
-
-
-            return voList;
-
-        }
-    }
-
-    /**
-     * 添加流程记录
-     */
-    private void addProcessRecord(Task task, Long schemaId, String message, WorkflowRecord record) {
-
-        IWorkflowRecordService workflowRecordService = SpringUtil.getBean(IWorkflowRecordService.class);
-        //新增流程发起流程记录
-        record.setNodeId(task.getId());
-        record.setNodeName(task.getName());
-        record.setNodeType(WorkflowConstant.START_EVENT_TYPE_NAME);
-        record.setProcessId(task.getProcessInstanceId());
-        record.setSchemaId(schemaId);
-        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-
-        record.setMessage(message);
-
-        workflowRecordService.save(record);
-
-
-    }
-
-
-    /**
-     * 记录开始节点
-     *
-     * @param workflowSchema
-     * @param startNodeConfig
-     * @param processInstance
-     */
-    private void startNodeRecord(WorkflowSchema workflowSchema, StartNodeConfig startNodeConfig, ProcessInstance processInstance, User user) {
-
-        //新增流程发起流程记录
-        WorkflowRecord startRecord = new WorkflowRecord();
-        startRecord.setNodeId(startNodeConfig.getId());
-        startRecord.setNodeName(startNodeConfig.getName());
-        startRecord.setNodeType(WorkflowConstant.START_EVENT_TYPE_NAME);
-        startRecord.setProcessId(processInstance.getId());
-        startRecord.setSchemaId(workflowSchema.getId());
-        startRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-        startRecord.setRecordTime(LocalDateTime.now());
-        startRecord.setMessage("【" + user.getName() + "】 创建流程");
-
-        workflowRecordMapper.insert(startRecord);
-    }
-
-    /**
-     * 构建流程默认参数 (全局变量 发起人id、发起人名、模板id 、模板名、页面配置参数值、流水号)等
-     *
-     * @param workflowSchema
-     * @return
-     */
-    private VariableMap initDefaultParam(WorkflowSchema workflowSchema, Map<String, Object> processParam, long count) {
-
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-
-        //设定全局变量 发起人id、发起人名、模板id 、模板名、页面配置参数值、流水号
-        return Variables.createVariables()
-                .putValue(WorkflowConstant.PROCESS_START_USER_ID_KEY, user.getId())
-                .putValue(WorkflowConstant.PROCESS_START_USER_NAME_KEY, user.getName())
-                .putValue(WorkflowConstant.PROCESS_START_USER_POST_ID_KEY, user.getPostId())
-                .putValue(WorkflowConstant.PROCESS_SCHEMA_ID_KEY, workflowSchema.getId())
-                .putValue(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, workflowSchema.getName())
-                .putValue(WorkflowConstant.PROCESS_PARAM_KEY, processParam)
-                .putValue(WorkflowConstant.PROCESS_ISRECYCLE_FLAG_KEY, WorkflowIsRecycleType.NO.getCode())
-                .putValue(WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY, count + 1);
-    }
-
-    /***
-     * 表单赋值逻辑
-     * @param formData 表单数据
-     * @param workflowSchema
-     * @param workflowSchemaConfig
-     */
-    private void initFormAssignment(Map<String, Map<String, Object>> formData, WorkflowSchema workflowSchema, WorkflowSchemaConfig workflowSchemaConfig, Map<String, Object> processParam) {
-        //获取所有节点配置
-        List<Map<String, Object>> childNodeConfig = workflowSchemaConfig.getChildNodeConfig();
-        Optional<Map<String, Object>> startNodeMap = childNodeConfig.stream().filter(x -> x.containsValue(WorkflowConstant.BPMN_XML_START_EVENT_TYPE_NAME)).findFirst();
-
-        if (!startNodeMap.isPresent()) {
-            throw new MyException("当前任务没有开始节点");
-        }
-        //将map 转为 java类
-        StartNodeConfig startNodeConfig = Convert.convert(StartNodeConfig.class, startNodeMap.get());
-
-
-        WorkFlowUtil.invokeFormAssignment(formData, startNodeConfig.getAssignmentConfig(), startNodeConfig.getFormConfigs(), processParam);
-
-
-    }
-
-    /**
-     * 构建传阅人
-     *
-     * @param task
-     * @param circulateConfigs
-     * @param workflowSchemaConfig
-     * @param userTaskConfig
-     */
-    private String initCirculate(Task task, List<MemberConfig> circulateConfigs, WorkflowSchemaConfig workflowSchemaConfig, UserTaskConfig userTaskConfig, Map<String, Object> variableMaps) {
-        //获取到需要追加的传阅人
-        List<Long> appendUserTaskCirculated = WorkFlowUtil.getUserIdsByMemberConfig(circulateConfigs, workflowSchemaConfig.getChildNodeConfig(), task.getProcessInstanceId());
-
-        List<WorkflowCirculated> circulatedList = circulatedService.list(Wrappers.lambdaQuery(WorkflowCirculated.class).eq(WorkflowCirculated::getTaskId, task.getId()));
-
-        //获取当前用户的信息
-        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
-        Long schemaId = Convert.toLong(taskService.getVariable(task.getId(), WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-
-        String circulatedName = "";//添加的传阅人姓名
-        String circulateMessage = "";//传阅信息
-        //获取用户id对应的用户名
-        circulatedName = getAllUserNamesByIds(appendUserTaskCirculated);
-        if (circulatedList == null || circulatedList.size() == 0) {
-
-            circulatedList = new ArrayList<>();
-            for (Long userId : appendUserTaskCirculated) {
-                WorkflowCirculated workflowCirculated = new WorkflowCirculated();
-                workflowCirculated.setProcessId(task.getProcessInstanceId());
-                workflowCirculated.setCreateTime(DateUtil.toLocalDateTime(task.getCreateTime()));
-                workflowCirculated.setTaskId(task.getId());
-                workflowCirculated.setCurrentProgress(userTaskConfig.getCurrentProgress());
-                workflowCirculated.setTaskName(task.getName());
-                workflowCirculated.setIsRead(YesOrNoEnum.NO.getCode());
-                workflowCirculated.setSchemaId(MapUtil.getLong(variableMaps, WorkflowConstant.PROCESS_SCHEMA_ID_KEY));
-                workflowCirculated.setCirculatedUserId(userId);
-                workflowCirculated.setStartUserId(MapUtil.getLong(variableMaps, WorkflowConstant.PROCESS_START_USER_ID_KEY));
-                workflowCirculated.setSerialNumber(MapUtil.getLong(variableMaps, WorkflowConstant.PROCESS_SERIAL_NUMBER_KEY));
-
-                circulatedList.add(workflowCirculated);
-            }
-            circulatedService.saveBatch(circulatedList);
-            //[操作人名称] 添加了传阅人[添加传人名称],当前传阅人[所有传问人名称]
-            if (StrUtil.isNotBlank(circulatedName)) {
-                circulateMessage = "【" + user.getName() + "】添加了传阅人【" + circulatedName + "】,当前传阅人【" + circulatedName + "】";
-            }
-//            String message = "【" + user.getName() + "】添加了传阅人【" + circulatedName + ",当前传阅人【" + circulatedName + "】";
-//            addProcessRecord(task, schemaId, message);
-        } else {
-            List<WorkflowCirculated> newList = new ArrayList<>();
-            for (Long userId : appendUserTaskCirculated) {
-                WorkflowCirculated workflowCirculated = BeanUtil.toBean(circulatedList.get(0), WorkflowCirculated.class);
-                workflowCirculated.setCirculatedUserId(userId);
-                workflowCirculated.setId(null);
-                newList.add(workflowCirculated);
-            }
-            circulatedService.saveBatch(newList);
-            //[操作人名称] 添加了传阅人[添加传人名称],当前传阅人[所有传问人名称] = 需要追加的传阅人 + 原本的传阅人
-            for (WorkflowCirculated workflowCirculated : circulatedList) {
-                //将原本的传阅人加入到需要追加的传阅人中
-                appendUserTaskCirculated.add(workflowCirculated.getCirculatedUserId());
-            }
-            String addCirculatedName = getAllUserNamesByIds(appendUserTaskCirculated); //增加后的当前传阅人
-//            String message = "【" + user.getName() + "】添加了传阅人【" + circulatedName + "】,当前传阅人【" + addCirculatedName + "】";
-//            addProcessRecord(task, schemaId, message);
-            if (StrUtil.isNotBlank(addCirculatedName)) {
-                circulateMessage = "【" + user.getName() + "】添加了传阅人【" + circulatedName + "】,当前传阅人【" + addCirculatedName + "】";
-            }
-        }
-        return circulateMessage;
-    }
-
-    /**
-     * 根据用户id获取对应的用户名,并进行拼接输出
-     *
-     * @param allUserIds 用户ids
-     * @return 用户名(张三、李四)
-     */
-    private String getAllUserNamesByIds(List<Long> allUserIds) {
-        String allDelegateUserNames = "";
-        List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
-        });
-        //如果缓存中不存在用户信息,就直接去数据库查询
-        if (userList.size() == 0) {
-            userList = userService.list();
-            redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
-        }
-        if (allUserIds.size() > 0) {
-            //获取用户id对应的用户名
-            List<String> allUserName = userList.stream().filter(u -> allUserIds.contains(u.getId())).map(User::getName).collect(Collectors.toList());
-            if (allUserName.size() > 0) {
-                allDelegateUserNames = StrUtil.join("、", allUserName);
-            }
-        }
-        return allDelegateUserNames;
-    }
-
-    /**
-     * 新增工作流程信息数据
-     *
-     * @param userTaskConfig   用户任务配置信息
-     * @param nextTaskNameList 下一个节点的名称集合
-     * @param user             当前用户的对象
-     * @param record           工作流程信息的对象
-     * @param oldTaskName      前一个节点的名称
-     * @param buttonName       按钮名称
-     */
-    private void addWorkflowRecord(UserTaskConfig userTaskConfig, List<String> nextTaskNameList, User user, WorkflowRecord record, String oldTaskName, String buttonName, String approvedContent, Task task, Object resultName) {
-        //单实例
-        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
-            //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
-            if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
-                String message = "【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】“";
-                record.setMessage(message);
-            }
-            //单流向
-            if (nextTaskNameList.size() == 1) {
-                String message = "【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】”,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                record.setMessage(message);
-            }//多流向
-            if (nextTaskNameList.size() > 1) {
-                String message = "【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】”,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                for (int i = 1; i < nextTaskNameList.size(); i++) {
-                    message = message + "、【" + nextTaskNameList.get(i) + "】";
-                }
-                record.setMessage(message);
-            }
-        }
-        //多实例,判断是不是会签流程,以及会签流程的状态
-        else {
-            //判断是否达到完成条件
-            List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(task.getProcessInstanceId()).list();
-            Boolean getCompleteConditional = isGetCompleteConditional(userTaskConfig, list);
-
-            //审批但未达到完成条件;审批信息:[会签][用户名] [审批按钮名称]审批,审批意见为:“[审批意见]”。
-            if (getCompleteConditional) {
-                //获取当前节点是否完成会签或者会签失败
-                if (ObjectUtil.isNotEmpty(resultName)) { //resultName只能从这个节点拿,不然会签节点后直接结束流程,就会拿不到流程变量信息
-                    Boolean isSuccess = new Boolean(resultName.toString());
-                    //审批达到完成条件,完成会签;审批信息:[会签][用户名] [审按名称]审批,审批见为:[审批意见]”,达到会签完成条件,由[上一节点名称]流转到下,多流向的情况则由[上一节点名称] 流转到[多流向节点名称]。
-                    if (isSuccess) {
-                        //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
-                        if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
-                            String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】“,达到会签完成条件";
-                            record.setMessage(message);
-                        }
-                        //单流向
-                        if (nextTaskNameList.size() == 1) {
-                            String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】”,达到会签完成条件,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            record.setMessage(message);
-                        }//多流向
-                        if (nextTaskNameList.size() > 1) {
-                            String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】”,达到会签完成条件,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            for (int i = 1; i < nextTaskNameList.size(); i++) {
-                                message = message + "、【" + nextTaskNameList.get(i) + "】";
-                            }
-                            record.setMessage(message);
-                        }
-                    }
-                    //审批达到完成条件,会签失败;例如:审批信息:[会签][用户名][审按名称]审批,审批意见为:“[审批意见]”,未达到会签完成条件,由[管理层审批]流转到(部门审批]
-                    if (buttonName.equals(WorkflowApproveType.DISAGREE.getValue())) {
-                        //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
-                        if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
-                            String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】“,未达到会签完成条件";
-                            record.setMessage(message);
-                        }
-                        //单流向
-                        if (nextTaskNameList.size() == 1) {
-                            String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】”,未达到会签完成条件,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            record.setMessage(message);
-                        }//多流向
-                        if (nextTaskNameList.size() > 1) {
-                            String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】”,未达到会签完成条件,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                            for (int i = 1; i < nextTaskNameList.size(); i++) {
-                                message = message + "、【" + nextTaskNameList.get(i) + "】";
-                            }
-                            record.setMessage(message);
-                        }
-                    }
-                }
-            } else {
-                //审批但未达到完成条件;审批信息:[会签][用户名] [审批按钮名称]审批,审批意见为:“[审批意见]”。
-                String message = "【会签】【" + user.getName() + "】【" + buttonName + "】审批,审批意见为:“【" + approvedContent + "】“";
-                record.setMessage(message);
-            }
-        }
-        workflowRecordMapper.insert(record);
-    }
-
-    /**
-     * 判断多实例是否达到完成条件
-     *
-     * @param userTaskConfig
-     * @param list
-     * @return
-     */
-    private Boolean isGetCompleteConditional(UserTaskConfig userTaskConfig, List<HistoricVariableInstance> list) {
-        int nrOfInstances = 0;
-        int nrOfCompletedInstances = 0;
-        int nrOfActiviteInstances = 0;
-        for (HistoricVariableInstance historicVariableInstance : list) {
-            //nrOfInstances:总共的实例数;
-            if (historicVariableInstance.getName().equals(WorkflowConstant.MULTI_INSTANCE_VAR_KEY)) {
-                nrOfInstances = Integer.parseInt(String.valueOf(historicVariableInstance.getValue()));
-            }
-            //nrOfCompletedInstances:已完成的实例数;
-            if (historicVariableInstance.getName().equals(WorkflowConstant.MULTI_COMPLETED_INSTANCE_VAR_KEY)) {
-                nrOfCompletedInstances = Integer.parseInt(String.valueOf(historicVariableInstance.getValue()));
-            }
-            //nrOfActiviteInstances;当前活动的实例数量,即还没有完成的实例数量
-            if (historicVariableInstance.getName().equals(WorkflowConstant.MULTI_ACTIVE_INSTANCE_VAR_KEY)) {
-                nrOfActiviteInstances = Integer.parseInt(String.valueOf(historicVariableInstance.getValue()));
-            }
-        }
-        //获取流程参数中的完成条件,完成条件 0 全部  1 单个 2百分比
-        if (userTaskConfig.getCountersignConfig().getFinishType() == 0) {
-            if (nrOfActiviteInstances == 0) {
-                return true;
-            }
-        } else if (userTaskConfig.getCountersignConfig().getFinishType() == 1) {
-            if (nrOfCompletedInstances > 0) {
-                return true;
-            }
-        } else if (userTaskConfig.getCountersignConfig().getFinishType() == 2) {
-            //判断完成百分比是否达到
-            if ((nrOfCompletedInstances / nrOfInstances) * 100 > userTaskConfig.getCountersignConfig().getPercentage()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public Boolean dealTimeoutTask(Integer handleType, String taskId) {
-        //根据taskid  获取任务信息
-        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
-
-        if (task == null) {
-            throw new MyException("找不到此任务!");
-        }
-
-        //获取当前任务变量中的  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 = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
-        //找到当前用户任务节点的配置信息
-        Optional<Map<String, Object>> userTaskMapOptional = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(task.getTaskDefinitionKey())).findFirst();
-        //判断是否找得到此任务节点 没有则报错
-        if (!userTaskMapOptional.isPresent()) {
-            throw new MyException("【任务id :" + task.getId() + "】 用户任务节点配置有误,请联系管理员!");
-        }
-
-        //查出所有表单数据
-        VariableMap variableMap = Variables.createVariables();
-
-        List<LaunchAndApproveVo> result = new ArrayList<>();
-
-        if (handleType == 1) {//自动驳回
-            //获取到当前活动的实例
-            ActivityInstance activityInstance = runtimeService.getActivityInstance(task.getProcessInstanceId());
-
-            //获取所有已办任务节点
-            List<HistoricActivityInstance> resultList = historyService
-                    .createHistoricActivityInstanceQuery()
-                    .processInstanceId(task.getProcessInstanceId())
-                    .activityType("userTask")
-                    .finished()
-                    .orderByHistoricActivityInstanceEndTime()
-                    .asc()
-                    .list();
-
-            if (null == resultList || resultList.size() == 0) {
-                throw new MyException("当前任务之前不存在用户任务无法驳回!");
-            }
-            //得到第一个任务节点的id
-            HistoricActivityInstance historicActivityInstance = resultList.get(0);
-            String startActId = historicActivityInstance.getActivityId();
-            if (startActId.equals(task.getTaskDefinitionKey())) {
-                throw new MyException("开始节点无法驳回!");
-            }
-
-            //得到上一个任务节点的ActivityId和待办人
-            Map<String, String> lastNode = getLastNode(resultList, task.getTaskDefinitionKey());
-            if (null == lastNode) {
-                throw new MyException("回退节点异常!");
-            }
-            String toActId = lastNode.get("toActId");
-            String assignee = lastNode.get("assignee");
-            //设置流程中的可变参数
-            Map<String, Object> taskVariable = new HashMap<>(2);
-            taskVariable.put("user", assignee);
-            taskService.createComment(task.getId(), task.getProcessInstanceId(), "驳回原因:" + "自动驳回");
-
-            //先停止当前活动示例  然后撤回流程到上个节点
-            runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
-                    .cancelActivityInstance(getInstanceIdForActivity(activityInstance, task.getTaskDefinitionKey()))//关闭相关任务
-                    .setAnnotation("系统" + "】 自动驳回 【任务:" + task.getId() + "】")
-                    .startBeforeActivity(toActId) //上一个节点
-                    .setVariables(taskVariable)//流程的可变参数赋值
-                    .execute();
-
-            Optional<Map<String, Object>> rejectNodeMap = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsValue(toActId)).findFirst();
-
-            rejectNodeMap.ifPresent(node -> {
-                //将map 转为 java类
-                UserTaskConfig rejectUserTaskConfig = Convert.convert(UserTaskConfig.class, node);
-
-                //新增流程发起流程记录
-                WorkflowRecord record = new WorkflowRecord();
-                record.setNodeId(task.getId());
-                record.setNodeName(task.getName());
-                record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-                record.setProcessId(task.getProcessInstanceId());
-                record.setSchemaId(schemaId);
-                record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-                record.setRecordTime(LocalDateTime.now().minusSeconds(+1));//时间设置提前1秒钟,好排序
-
-//                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
-                record.setMessage("审批信息:由于审批超时,【系统】【自动驳回】审批,审批意见为:“系统自动驳回审批”,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
-                workflowRecordMapper.insert(record);
-            });
-        } else if (handleType == 2) {//同意
-            //新增流程发起流程记录
-            WorkflowRecord record = new WorkflowRecord();
-            record.setNodeId(task.getId());
-            record.setNodeName(task.getName());
-            record.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
-            record.setProcessId(task.getProcessInstanceId());
-            record.setSchemaId(schemaId);
-            record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
-            //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
-            record.setRecordTime(LocalDateTime.now());
-            //当前任务的名称
-            String oldTaskName = task.getName();
-
-            taskService.complete(task.getId());
-            List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
-            result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
-
-            //下一个节点的任务名称集合
-            List<String> nextTaskNameList = list.stream().map(Task::getName).collect(Collectors.toList());
-
-            //如果不需要指定审批人 默认走自动同意规则
-//            invokeAutoAgree(task.getProcessInstanceId(), workflowSchema.getId(), workflowSchemaConfig, list);
-
-            //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
-            if (nextTaskNameList.size() == 0) {
-                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" + oldTaskName + "】 流转到【" + "结束节点" + "】";
-                record.setMessage(message);
-            }
-            //单流向
-            if (nextTaskNameList.size() == 1) {
-                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                record.setMessage(message);
-            }//多流向
-            if (nextTaskNameList.size() > 1) {
-                String message = "审批信息:由于审批超时,【系统】【自动同意】审批,审批意见为:“系统自动同意审批”,由【" + oldTaskName + "】 流转到【" + nextTaskNameList.get(0) + "】";
-                for (int i = 1; i < nextTaskNameList.size(); i++) {
-                    message = message + "、【" + nextTaskNameList.get(i) + "】";
-                }
-                record.setMessage(message);
-            }
-
-            workflowRecordMapper.insert(record);
-        }
-        return true;
-    }
-
-    /**
-     * 获取上一节点信息
-     * 分两种情况:
-     * 1、当前节点不在历史节点里
-     * 2、当前节点在历史节点里
-     * 比如,resultList={1,2,3}
-     * (1)当前节点是4,表示3是完成节点,4驳回需要回退到3
-     * (2)当前节点是2,表示3是驳回节点,3驳回到当前2节点,2驳回需要回退到1
-     * 其他驳回过的情况也都包含在情况2中。
-     *
-     * @param resultList        历史节点列表
-     * @param currentActivityId 当前待办节点ActivityId
-     * @return 返回值:上一节点的ActivityId和待办人(toActId, assignee)
-     */
-    private static Map<String, String> getLastNode(List<HistoricActivityInstance> resultList, String currentActivityId) {
-        Map<String, String> backNode = new HashMap<>();
-        //新建一个有序不重复集合
-        LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap();
-        for (HistoricActivityInstance hai : resultList) {
-            linkedHashMap.put(hai.getActivityId(), hai.getAssignee());
-        }
-        //分两种情况:当前节点在不在历史节点里面,当前节点在历史节点里
-        //情况1、当前节点不在历史节点里
-        int originSize = resultList.size();
-        int duplicateRemovalSize = linkedHashMap.size();
-        //判断历史节点中是否有重复节点
-        //if(originSize == duplicateRemovalSize){
-        boolean flag = false;
-        for (Map.Entry entry : linkedHashMap.entrySet()) {
-            if (currentActivityId.equals(entry.getKey())) {
-                flag = true;
-                break;
-            }
-        }
-        if (!flag) {
-            //当前节点不在历史节点里:最后一个节点是完成节点
-            HistoricActivityInstance historicActivityInstance = resultList.get(originSize - 1);
-            backNode.put("toActId", historicActivityInstance.getActivityId());
-            backNode.put("assignee", historicActivityInstance.getAssignee());
-            return backNode;
-        }
-        //情况2、当前节点在历史节点里(已回退过的)
-        return currentNodeInHis(linkedHashMap, currentActivityId);
-    }
-
-    private String getInstanceIdForActivity(ActivityInstance activityInstance, String activityId) {
-        ActivityInstance instance = getChildInstanceForActivity(activityInstance, activityId);
-        if (instance != null) {
-            return instance.getId();
-        }
-        return null;
-    }
-
-    private ActivityInstance getChildInstanceForActivity(ActivityInstance activityInstance, String activityId) {
-        if (activityId.equals(activityInstance.getActivityId())) {
-            return activityInstance;
-        }
-        for (ActivityInstance childInstance : activityInstance.getChildActivityInstances()) {
-            ActivityInstance instance = getChildInstanceForActivity(childInstance, activityId);
-            if (instance != null) {
-                return instance;
-            }
-        }
-        return null;
-    }
-
-    private static Map<String, String> currentNodeInHis(LinkedHashMap<String, String> linkedHashMap, String currentActivityId) {
-        //情况2、当前节点在历史节点里(已回退过的)
-        Map<String, String> backNode = new HashMap<>();
-        ListIterator<Map.Entry<String, String>> li = new ArrayList<>(linkedHashMap.entrySet()).listIterator();
-        //System.out.println("已回退过的");
-        while (li.hasNext()) {
-            Map.Entry<String, String> entry = li.next();
-            if (currentActivityId.equals(entry.getKey())) {
-                li.previous();
-                Map.Entry<String, String> previousEntry = li.previous();
-                backNode.put("toActId", previousEntry.getKey());
-                backNode.put("assignee", previousEntry.getValue());
-                return backNode;
-            }
-        }
-        return null;
-    }
-}

+ 12 - 0
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowFormRelationServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.workflow.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
@@ -17,4 +18,15 @@ import org.springframework.stereotype.Service;
 @Service
 public class WorkflowFormRelationServiceImpl extends ServiceImpl<WorkflowFormRelationMapper, WorkflowFormRelation> implements IWorkflowFormRelationService {
 
+    /**
+     * 更新流程状态
+     */
+    public boolean updateCurrentState(WorkflowFormRelation relation) {
+        return this.update(Wrappers.<WorkflowFormRelation>lambdaUpdate()
+                .set(WorkflowFormRelation::getCurrentState, relation.getCurrentState())
+                .set(WorkflowFormRelation::getStartTime, relation.getStartTime())
+                .set(WorkflowFormRelation::getEndTime, relation.getEndTime())
+                .eq(WorkflowFormRelation::getProcessId, relation.getProcessId())
+        );
+    }
 }

+ 0 - 1
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowRecordServiceImpl.java

@@ -16,5 +16,4 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class WorkflowRecordServiceImpl extends ServiceImpl<WorkflowRecordMapper, WorkflowRecord> implements IWorkflowRecordService {
-
 }

+ 3 - 3
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -22,7 +22,7 @@ public class FreeMarkerGeneratorTest {
     public void generateCodesTest() throws IOException {
         List<TableConfig> tableConfigs = new ArrayList<>();
         TableConfig mainTable = new TableConfig();
-        mainTable.setTableName("xjr_oa_news");
+        mainTable.setTableName("xjr_workflow_form_relation");
         mainTable.setIsMain(true);
         mainTable.setPkField(GlobalConstant.DEFAULT_PK);
         mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);
@@ -45,7 +45,7 @@ public class FreeMarkerGeneratorTest {
         childTable2.setRelationTableField(GlobalConstant.DEFAULT_PK);
 
         tableConfigs.add(mainTable);
-        tableConfigs.add(childTable1);
+//        tableConfigs.add(childTable1);
 //        tableConfigs.add(childTable2);
 
         ApiGenerateCodesDto params = new ApiGenerateCodesDto();
@@ -55,7 +55,7 @@ public class FreeMarkerGeneratorTest {
         params.setPage(true);
         params.setImport(true);
         params.setExport(true);
-        params.setOutMainDir(true);
+        params.setOutMainDir(false);
         params.setDs(ds);