From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OperatorUtil.java | 6858 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 6,858 insertions(+), 0 deletions(-)

diff --git a/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OperatorUtil.java b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OperatorUtil.java
new file mode 100644
index 0000000..bf4218f
--- /dev/null
+++ b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OperatorUtil.java
@@ -0,0 +1,6858 @@
+package jnpf.flowable.util;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import jnpf.base.ActionResult;
+import jnpf.base.Pagination;
+import jnpf.base.UserInfo;
+import jnpf.base.entity.VisualdevEntity;
+import jnpf.base.model.ColumnDataModel;
+import jnpf.base.model.VisualDevJsonModel;
+import jnpf.base.model.VisualWebTypeEnum;
+import jnpf.base.model.flow.FlowFormDataModel;
+import jnpf.base.model.flow.FlowStateModel;
+import jnpf.base.model.schedule.ScheduleNewCrForm;
+import jnpf.constant.DataInterfaceVarConst;
+import jnpf.constant.JnpfConst;
+import jnpf.constant.MsgCode;
+import jnpf.constant.PermissionConst;
+import jnpf.database.model.query.SuperJsonModel;
+import jnpf.database.model.query.SuperQueryJsonModel;
+import jnpf.exception.WorkFlowException;
+import jnpf.flowable.entity.*;
+import jnpf.flowable.enums.*;
+import jnpf.flowable.job.FlowJobUtil;
+import jnpf.flowable.mapper.*;
+import jnpf.flowable.model.candidates.CandidateCheckFo;
+import jnpf.flowable.model.candidates.CandidateCheckVo;
+import jnpf.flowable.model.candidates.CandidateListModel;
+import jnpf.flowable.model.candidates.CandidateUserVo;
+import jnpf.flowable.model.flowable.*;
+import jnpf.flowable.model.free.FreeConnect;
+import jnpf.flowable.model.message.FlowMsgModel;
+import jnpf.flowable.model.operator.AddSignModel;
+import jnpf.flowable.model.free.FreeModel;
+import jnpf.flowable.model.record.NodeRecordModel;
+import jnpf.flowable.model.record.RecordVo;
+import jnpf.flowable.model.task.*;
+import jnpf.flowable.model.templatejson.FlowFormModel;
+import jnpf.flowable.model.templatejson.FlowParamModel;
+import jnpf.flowable.model.templatenode.FlowErrorModel;
+import jnpf.flowable.model.templatenode.TemplateNodeUpFrom;
+import jnpf.flowable.model.templatenode.nodejson.*;
+import jnpf.flowable.model.trigger.*;
+import jnpf.flowable.model.util.*;
+import jnpf.flowable.model.xml.FlowXmlUtil;
+import jnpf.flowable.model.xml.XmlModel;
+import jnpf.message.model.SentMessageForm;
+import jnpf.model.visualjson.FieLdsModel;
+import jnpf.model.visualjson.FormDataModel;
+import jnpf.model.visualjson.TableFields;
+import jnpf.model.visualjson.TableModel;
+import jnpf.model.visualjson.config.ConfigModel;
+import jnpf.onlinedev.model.PaginationModel;
+import jnpf.permission.entity.*;
+import jnpf.util.*;
+import jnpf.util.text.CharsetKit;
+import jnpf.util.visiual.JnpfKeyConsts;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.net.URLDecoder;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class OperatorUtil {
+
+
+    private final ServiceUtil serviceUtil;
+
+    private final MsgUtil msgUtil;
+
+    private final FlowAbleUrl flowAbleUrl;
+
+    private final RedisUtil redisUtil;
+
+    private final ConditionUtil conditionUtil;
+
+    private final FlowUtil flowUtil;
+
+    private final TaskUtil taskUtil;
+
+
+    private final CandidatesMapper candidatesMapper;
+
+    private final LaunchUserMapper launchUserMapper;
+
+    private final RecordMapper recordMapper;
+
+    private final TaskMapper taskMapper;
+
+    private final OperatorMapper operatorMapper;
+
+    private final TemplateMapper templateMapper;
+
+    private final TemplateJsonMapper templateJsonMapper;
+
+    private final TemplateNodeMapper templateNodeMapper;
+
+    private final TaskLineMapper taskLineMapper;
+
+    private final RevokeMapper revokeMapper;
+
+    private final NodeRecordMapper nodeRecordMapper;
+
+    private final SubtaskDataMapper subtaskDataMapper;
+
+    private final CirculateMapper circulateMapper;
+
+    private final RejectDataMapper rejectDataMapper;
+
+    private final EventLogMapper eventLogMapper;
+
+    private final TriggerTaskMapper triggerTaskMapper;
+
+    private final TriggerRecordMapper triggerRecordMapper;
+
+    private final TriggerLaunchflowMapper triggerLaunchflowMapper;
+
+
+    //-------------------------------operatorUtil------------------------------------------------------------
+
+    // 缁勫缓FlowMethod
+    public FlowMethod getFlowMethod(FlowMethod flowMethod) {
+        FlowModel flowModel = flowMethod.getFlowModel();
+        String nodeCode = flowMethod.getNodeCode();
+        Map<String, NodeModel> nodes = flowMethod.getNodes();
+        FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+        model.setHandleOpinion("绯荤粺瀹℃壒");
+        model.setSignImg(null);
+        model.setFileList(null);
+        model.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+        model.setTaskEntity(flowMethod.getTaskEntity());
+        model.setFlowableTaskId(flowMethod.getFlowableTaskId());
+        FlowMethod method = new FlowMethod();
+        method.setFlowModel(model);
+        NodeModel nodeModel = nodes.get(nodeCode);
+        method.setNodeModel(nodeModel);
+        method.setNodeCode(nodeCode);
+        return method;
+    }
+
+    // 澶勭悊鎾ら攢鐨勭粡鍔�
+    public void handleRevokeOperator(FlowMethod flowMethod) throws WorkFlowException {
+        FlowModel flowModel = flowMethod.getFlowModel();
+        String taskId = flowMethod.getTaskId();
+        TaskEntity taskEntity = flowMethod.getTaskEntity();
+        String instanceId = taskEntity.getInstanceId();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+        List<OperatorEntity> operatorEntities = new ArrayList<>();
+        // 鐢熸垚缁忓姙锛岃幏鍙栦箣鍓嶅悓鎰忕殑缁忓姙锛屽啀娆$敓鎴愮粡鍔�
+        List<OperatorEntity> operatorList = operatorMapper.getList(taskId)
+                .stream().filter(e -> ObjectUtil.equals(e.getHandleStatus(), FlowNature.AUDIT_COMPLETION)
+                        && !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.FUTILITY.getCode())).collect(Collectors.toList());
+        List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
+
+        // 鍘熸潵鐨勫綋鍓嶈妭鐐�
+        List<String> srcCurrentList = StringUtils.isNotEmpty(taskEntity.getCurrentNodeCode()) ?
+                Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList()) : new ArrayList<>();
+
+        updateCurrentNode(taskModelList, nodes, taskEntity);
+
+        List<NodeRecordEntity> nodeRecordList = nodeRecordMapper.getList(taskId);
+        nodeRecordList = nodeRecordList.stream()
+                .sorted(Comparator.comparing(NodeRecordEntity::getCreatorTime).reversed()).collect(Collectors.toList());
+
+        for (FlowableTaskModel flowableTaskModel : taskModelList) {
+            TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                    .filter(e -> ObjectUtil.equals(e.getNodeCode(), flowableTaskModel.getTaskKey())).findFirst().orElse(null);
+
+            // 褰撳墠鑺傜偣宸插瓨鍦紝璺宠繃
+            if ((CollUtil.isNotEmpty(srcCurrentList) && srcCurrentList.contains(flowableTaskModel.getTaskKey()))
+                    || (null == nodeEntity)) {
+                continue;
+            }
+            // 澶勭悊瀛愭祦绋嬨�佸姙鐞嗚妭鐐广�佸閮ㄨ妭鐐�
+            List<String> typeList = ImmutableList.of(NodeEnum.SUB_FLOW.getType(), NodeEnum.PROCESSING.getType(), NodeEnum.OUTSIDE.getType());
+            if (typeList.contains(nodeEntity.getNodeType())) {
+
+                CompleteFo completeFo = new CompleteFo();
+                completeFo.setTaskId(flowableTaskModel.getTaskId());
+                flowAbleUrl.complete(completeFo);
+                this.handleRevokeOperator(flowMethod);
+                continue;
+            }
+
+            String nodeCode = flowableTaskModel.getTaskKey();
+            String nodeId = flowableTaskModel.getTaskId();
+            flowMethod.setFlowableTaskId(flowableTaskModel.getTaskId());
+            flowMethod.setNodes(nodes);
+            flowMethod.setNodeCode(nodeCode);
+            // 鍒ゆ柇鎷掔粷
+            NodeRecordEntity nodeRecord = nodeRecordList.stream()
+                    .filter(e -> ObjectUtil.equals(e.getNodeCode(), flowableTaskModel.getTaskKey())).findFirst().orElse(new NodeRecordEntity());
+            if (ObjectUtil.equals(nodeRecord.getNodeStatus(), NodeStateEnum.REJECT.getCode())) {
+                // 绯荤粺閫氳繃
+                FlowMethod method = this.getFlowMethod(flowMethod);
+                this.autoAudit(method);
+                continue;
+            }
+            List<OperatorEntity> list = operatorList.stream()
+                    .filter(e -> ObjectUtil.equals(e.getNodeCode(), nodeCode)).collect(Collectors.toList());
+            if (CollUtil.isNotEmpty(list)) {
+                if ((list.size() == 1 && ObjectUtil.equals(list.get(0).getHandleId(), FlowNature.SYSTEM_CODE))) {
+                    // 绯荤粺閫氳繃
+                    FlowMethod method = this.getFlowMethod(flowMethod);
+                    this.autoAudit(method);
+                    continue;
+                }
+                List<String> userIdList = list.stream().map(OperatorEntity::getHandleId).distinct().collect(Collectors.toList());
+                for (String userId : userIdList) {
+                    OperatorEntity operator = list.stream().filter(e -> StringUtils.equals(e.getHandleId(), userId)).findFirst().orElse(null);
+                    if (operator != null) {
+                        OperatorEntity operatorEntity = this.createOperator(operator, OperatorStateEnum.REVOKE.getCode(), operator.getHandleId(), global);
+                        operatorEntity.setTaskId(taskEntity.getId());
+                        operatorEntity.setNodeId(nodeId);
+                        operatorEntity.setParentId(FlowNature.PARENT_ID);
+                        operatorEntities.add(operatorEntity);
+                    }
+                }
+            }
+        }
+        if (CollUtil.isNotEmpty(operatorEntities)) {
+            operatorMapper.insert(operatorEntities);
+            addOperatorList(operatorEntities, flowModel);
+            // 娑堟伅
+            FlowMsgModel flowMsgModel = new FlowMsgModel();
+            flowMsgModel.setNodeList(nodeEntityList);
+            flowMsgModel.setTaskEntity(taskEntity);
+            flowMsgModel.setUserInfo(flowModel.getUserInfo());
+            flowMsgModel.setOperatorList(operatorEntities);
+            flowMsgModel.setFormData(FlowContextHolder.getAllData());
+            msgUtil.message(flowMsgModel);
+        }
+    }
+
+    // 鏍¢獙缁忓姙
+    public OperatorEntity checkOperator(String id) throws WorkFlowException {
+        OperatorEntity operator = operatorMapper.getInfo(id);
+        if (null == operator) {
+            throw new WorkFlowException(MsgCode.FA001.get());
+        }
+        if (null == operator.getSignTime()) {
+            throw new WorkFlowException(MsgCode.WF087.get());
+        }
+        if (null == operator.getStartHandleTime()) {
+            throw new WorkFlowException(MsgCode.WF088.get());
+        }
+        if (null != operator.getHandleStatus()) {
+            throw new WorkFlowException(MsgCode.WF031.get());
+        }
+        return operator;
+    }
+
+
+    //楠岃瘉娴佺▼鏉冮檺
+    public void checkOperatorPermission(String id) throws WorkFlowException {
+        OperatorEntity operator = operatorMapper.getInfo(id);
+        if (Objects.equals(operator.getHandleId(), UserProvider.getLoginUserId())) {
+            return;
+        }
+        List<DelegateEntity> delegateList = flowUtil.getByToUserId(UserProvider.getLoginUserId());
+        List<String> handleId = new ArrayList<>();
+        Map<String, String[]> delegateListAll = new HashMap<>();
+        for (DelegateEntity delegate : delegateList) {
+            if (StringUtils.isNotEmpty(delegate.getFlowId())) {
+                String[] flowIds = delegate.getFlowId().split(",");
+                delegateListAll.put(delegate.getUserId(), flowIds);
+            } else {
+                handleId.add(delegate.getUserId());
+            }
+        }
+        if (handleId.contains(operator.getHandleId())) {
+            return;
+        }
+        boolean isCheckOperator = false;
+        TaskEntity task = taskMapper.getInfo(operator.getTaskId());
+        for (Map.Entry<String, String[]> stringEntry : delegateListAll.entrySet()) {
+            String userId = stringEntry.getKey();
+            List<String> templateId = Arrays.asList(delegateListAll.get(userId));
+            if (Objects.equals(userId, operator.getHandleId()) && templateId.contains(task.getTemplateId())) {
+                isCheckOperator = true;
+                break;
+            }
+        }
+        if (!isCheckOperator) {
+            throw new WorkFlowException(MsgCode.AD104.get());
+        }
+    }
+
+    // 鍒涘缓缁忓姙
+    public List<OperatorEntity> createOperator(FlowMethod flowMethod) {
+        List<String> userIds = flowMethod.getUserIds();
+        NodeModel nodeModel = flowMethod.getNodeModel();
+        FlowModel flowModel = flowMethod.getFlowModel();
+        List<OperatorEntity> entityList = new ArrayList<>();
+        if (userIds.isEmpty()) {
+            return entityList;
+        }
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        String flowableTaskId = flowModel.getFlowableTaskId();
+        NodeModel global = flowModel.getNodes().get(NodeEnum.GLOBAL.getType());
+
+        // 鏄惁绛炬敹
+        Boolean signFor = global.getHasSignFor();
+        flowMethod.setTaskEntity(taskEntity);
+        flowMethod.setSignFor(signFor);
+        flowMethod.setFlowableTaskId(flowableTaskId);
+
+        if (nodeModel.getCounterSign().equals(FlowNature.IMPROPER_APPROVER)) {
+            List<String> list = improperSort(userIds, nodeModel);
+            if (CollUtil.isNotEmpty(list)) {
+                OperatorEntity entity = this.createOperatorEntity(flowMethod);
+                entity.setHandleId(list.get(0));
+                entity.setHandleAll(String.join(",", list));
+                entity.setParentId(FlowNature.PARENT_ID);
+                entityList.add(entity);
+            }
+        } else {
+            // 鎴栫銆佷細绛�
+            for (String userId : userIds) {
+                OperatorEntity entity = this.createOperatorEntity(flowMethod);
+                entity.setHandleId(userId);
+                entity.setParentId(FlowNature.PARENT_ID);
+                entityList.add(entity);
+            }
+        }
+
+        if (CollUtil.isNotEmpty(entityList)) {
+            operatorMapper.insert(entityList);
+        }
+        return entityList;
+    }
+
+    public OperatorEntity createOperatorEntity(FlowMethod flowMethod) {
+        TaskEntity taskEntity = flowMethod.getTaskEntity();
+        TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
+        NodeModel nodeModel = flowMethod.getNodeModel();
+        Boolean signFor = flowMethod.getSignFor();
+        String flowableTaskId = flowMethod.getFlowableTaskId();
+        OperatorEntity entity = new OperatorEntity();
+        entity.setId(RandomUtil.uuId());
+        entity.setIsProcessing(ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.PROCESSING.getType()) ? FlowNature.PROCESSING : FlowNature.NOT_PROCESSING);
+        entity.setNodeId(flowableTaskId);
+        entity.setNodeName(nodeModel.getNodeName());
+        entity.setNodeCode(nodeEntity.getNodeCode());
+        entity.setStatus(OperatorStateEnum.RUNING.getCode());
+        Boolean flowTodo = serviceUtil.getFlowTodo();
+        if (Boolean.TRUE.equals(flowTodo)) {
+            entity.setSignTime(new Date());
+            entity.setStartHandleTime(new Date());
+        } else {
+            Boolean flowSign = serviceUtil.getFlowSign();
+            if (Boolean.TRUE.equals(flowSign)) {
+                entity.setSignTime(new Date());
+            } else {
+                if (Boolean.FALSE.equals(signFor)) {
+                    entity.setSignTime(new Date());
+                }
+            }
+        }
+        entity.setCompletion(FlowNature.NORMAL);
+        entity.setTaskId(taskEntity.getId());
+        entity.setEngineType(taskEntity.getEngineType());
+        return entity;
+    }
+
+    // 鍒ゆ柇鑺傜偣鐨勫鎵圭粨鏋�
+    public boolean checkAudit(FlowMethod flowMethod) throws WorkFlowException {
+        OperatorEntity operator = flowMethod.getOperatorEntity();
+        NodeModel nodeModel = flowMethod.getNodeModel();
+        NodeModel global = flowMethod.getNodes().get(NodeEnum.GLOBAL.getType());
+        Integer handleStatus = flowMethod.getHandleStatus();
+        boolean result = false;
+
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
+                .eq(OperatorEntity::getNodeCode, operator.getNodeCode())
+                .eq(OperatorEntity::getParentId, FlowNature.PARENT_ID)
+                .ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode());
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+
+        Boolean auditFlag = flowMethod.getAuditFlag();
+        if (Boolean.TRUE.equals(auditFlag)) {
+            for (OperatorEntity entity : list) {
+                if (ObjectUtil.equals(entity.getId(), operator.getId())) {
+                    entity.setHandleStatus(operator.getHandleStatus());
+                    break;
+                }
+            }
+        }
+        List<LaunchUserEntity> stepUserList = launchUserMapper.getTaskList(operator.getTaskId());
+        LaunchUserEntity launchUser = stepUserList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null);
+
+        boolean isStep = Objects.equals(OperatorEnum.STEP.getCode(), nodeModel.getAssigneeType());
+        Integer counterSign = isStep ? FlowNature.FIXED_APPROVER : nodeModel.getCounterSign();
+        if (FlowNature.FIXED_APPROVER.equals(counterSign)) {
+            // 鎴栫锛屼竴浜哄悓鎰忔垨鎷掔粷
+            if (Boolean.TRUE.equals(auditFlag)) {
+                result = checkStep(list, nodeModel, launchUser);
+            } else {
+                result = operator.getHandleStatus().equals(handleStatus);
+            }
+        } else if (FlowNature.FIXED_JOINTLY_APPROVER.equals(counterSign)) {
+            // 浼氱
+            long numAudit;
+            long numReject;
+            if (Boolean.TRUE.equals(auditFlag)) {
+                numAudit = list.stream().filter(e -> FlowNature.AUDIT_COMPLETION.equals(e.getHandleStatus())).count();
+                numReject = list.stream().filter(e -> FlowNature.REJECT_COMPLETION.equals(e.getHandleStatus())).count();
+            } else {
+                numAudit = list.stream()
+                        .filter(e -> FlowNature.AUDIT_COMPLETION.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
+                numReject = list.stream()
+                        .filter(e -> FlowNature.REJECT_COMPLETION.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
+            }
+            CounterSignConfig config = nodeModel.getCounterSignConfig();
+
+            // 鍒ゆ柇璁$畻鏂瑰紡锛屽欢鍚庤绠楋紙鍦ㄦ墍鏈夊鎵逛汉瀹℃壒瀹屾垚鍚庤繘琛岃鍒欏垽鏂級
+            int type = config.getCalculateType();
+            if (ObjectUtil.equals(type, FlowNature.DELAY)) {
+                int auditCount = (int) list.stream().filter(e -> null != e.getHandleStatus()).count();
+                if (list.size() != auditCount) {
+                    return false;
+                }
+            }
+
+            int auditNum = config.getAuditNum();
+            int auditRatio = config.getAuditRatio();
+            int rejectNum = config.getRejectNum();
+            int rejectRatio = config.getRejectRatio();
+
+            if (config.getAuditType().equals(FlowNature.PERCENT)) {
+                // 鐧惧垎姣�
+                int res = (int) (numAudit * 100 / list.size());
+                result = res >= auditRatio;
+            } else if (config.getAuditType().equals(FlowNature.NUMBER)) {
+                // 浜烘暟
+                result = numAudit >= auditNum;
+            }
+            // 鍚屾剰姣斾緥娌¢�氳繃锛屽啀璁$畻鎷掔粷鐨勬瘮渚�
+            if (!result) {
+                if (config.getRejectType().equals(FlowNature.PERCENT)) {
+                    // 鐧惧垎姣�
+                    int res = (int) (numReject * 100 / list.size());
+                    result = res >= rejectRatio;
+                } else if (config.getRejectType().equals(FlowNature.NUMBER)) {
+                    // 浜烘暟
+                    result = numReject >= rejectNum;
+                } else {
+                    // 鍚屾剰鍙栧弽
+                    if (numReject > 0) {
+                        if (config.getAuditType().equals(FlowNature.PERCENT)) {
+                            int res = (int) (numReject * 100 / list.size());
+                            result = res >= (100 - auditRatio);
+                        } else if (config.getAuditType().equals(FlowNature.NUMBER)) {
+                            result = numReject >= (list.size() - auditNum);
+                        }
+                    }
+                }
+                if (result && ObjectUtil.equals(type, FlowNature.DELAY)) {
+                    flowMethod.setHandleStatus(FlowNature.REJECT_COMPLETION);
+                }
+            } else {
+                if (ObjectUtil.equals(type, FlowNature.DELAY)) {
+                    flowMethod.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+                }
+            }
+        } else if (FlowNature.IMPROPER_APPROVER.equals(counterSign)) {
+            // 渚濇瀹℃壒
+            if (ObjectUtil.equals(handleStatus, FlowNature.REJECT_COMPLETION)) {
+                // 鎷掔粷鐩存帴杩斿洖true锛屾牴鎹嫆缁濇槸鍚︾户缁祦杞紝鐩存帴缁撴潫 鎴� 娴佽浆涓�涓嬭妭鐐�
+                return true;
+            }
+            List<String> allList = StringUtils.isNotEmpty(operator.getHandleAll()) ? Arrays.stream(operator.getHandleAll().split(",")).collect(Collectors.toList()) : new ArrayList<>();
+
+            String userId = operator.getHandleId();
+            // 杞鐨勭粡鍔烇紝閫氳繃璁板綍鑾峰彇鍘熸潵鐨勫鎵逛汉
+            if (ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.TRANSFER.getCode())) {
+                RecordEntity transferRecord = recordMapper.getTransferRecord(operator.getId());
+                String handleId = transferRecord.getHandleId();
+                if (StringUtils.isNotBlank(handleId)) {
+                    userId = handleId;
+                }
+            }
+            int index = allList.indexOf(userId);
+            // 鏈�鍚庝竴浜虹洿鎺ヨ繑鍥�
+            if (index == allList.size() - 1) {
+                return true;
+            }
+            if (Boolean.TRUE.equals(auditFlag)) {
+                return false;
+            }
+            String handleId = "";
+            if (index != -1) {
+                handleId = allList.get(index + 1);
+            }
+            OperatorEntity entity = this.createOperator(operator, OperatorStateEnum.RUNING.getCode(), handleId, global);
+            operatorMapper.insert(entity);
+
+            this.improperApproverMessage(flowMethod, entity);
+        }
+        if (Boolean.FALSE.equals(auditFlag)) {
+            flowMethod.setTaskId(operator.getTaskId());
+            flowMethod.setNodeCode(operator.getNodeCode());
+            if (result) {
+                // 缁撴潫璇ヨ妭鐐圭殑鍏朵粬缁忓姙
+                endOperator(flowMethod);
+            } else {
+                //褰撳墠瀹℃壒瀹岋紝缁撴潫鍗忓姙鏁版嵁
+                endAssist(flowMethod);
+            }
+        }
+        return result;
+    }
+
+    //鍒ゆ柇閫愮骇
+    public boolean checkStep(List<OperatorEntity> list, NodeModel nodeModel, LaunchUserEntity launchUser) {
+        if (null != launchUser) {
+            String positionId = launchUser.getPositionId();
+            List<String> positionList = Arrays.asList(positionId.split(","));
+            String organizeId = launchUser.getOrganizeId();
+            List<String> organizeList = Arrays.asList(organizeId.split(","));
+            //鍒ゆ柇缁撴潫灞傜骇
+            ApproversConfig approversConfig = nodeModel.getApproversConfig();
+            Integer end = approversConfig.getEnd();
+            boolean isOrganize = Objects.equals(end, FlowNature.ORGANIZATION);
+            int endLevel = isOrganize ? approversConfig.getOriginLevel() : approversConfig.getLevel();
+            int totalLevel = positionList.size() + organizeList.size() - 1;
+            int level = totalLevel - list.size();
+            //鍒ゆ柇閫愮骇鏄惁缁撴潫
+            int i = positionList.size() == 1 ? 1 : 0;
+            boolean result = isOrganize ? level > endLevel : list.size() < Math.min(totalLevel - (i), endLevel);
+            return !result;
+        }
+        return true;
+    }
+
+    // 渚濇瀹℃壒娑堟伅
+    public void improperApproverMessage(FlowMethod flowMethod, OperatorEntity entity) throws WorkFlowException {
+        FlowModel flowModel = flowMethod.getFlowModel();
+        List<CirculateEntity> circulateList = flowMethod.getCirculateList();
+        TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
+        TaskEntity taskEntity = flowMethod.getTaskEntity();
+        List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
+
+        List<OperatorEntity> entityList = new ArrayList<>();
+        entityList.add(entity);
+        // 娑堟伅
+        FlowMsgModel flowMsgModel = new FlowMsgModel();
+        flowMsgModel.setNodeList(nodeEntityList);
+        flowMsgModel.setCirculateList(circulateList);
+        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+        flowMsgModel.setTaskEntity(taskEntity);
+        flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
+        flowMsgModel.setOperatorList(entityList);
+        flowMsgModel.setCopy(true);
+        flowMsgModel.setApprove(true);
+        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+        msgUtil.message(flowMsgModel);
+    }
+
+    // 缁撴潫鍗忓姙
+    public void endAssist(FlowMethod flowMethod) {
+        OperatorEntity operator = flowMethod.getOperatorEntity();
+        String taskId = flowMethod.getTaskId();
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).eq(OperatorEntity::getParentId, operator.getId())
+                .eq(OperatorEntity::getStatus, OperatorStateEnum.ASSIST.getCode());
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        if (CollUtil.isNotEmpty(list)) {
+            for (OperatorEntity entity : list) {
+                entity.setCompletion(FlowNature.ACTION);
+            }
+            operatorMapper.updateById(list);
+        }
+    }
+
+    // 缁撴潫缁忓姙
+    public void endOperator(FlowMethod flowMethod) {
+        String taskId = flowMethod.getTaskId();
+        String nodeCode = flowMethod.getNodeCode();
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
+                .isNull(OperatorEntity::getHandleStatus);
+        if (StringUtils.isNotEmpty(nodeCode)) {
+            queryWrapper.lambda().eq(OperatorEntity::getNodeCode, nodeCode);
+        }
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        if (CollUtil.isNotEmpty(list)) {
+            for (OperatorEntity entity : list) {
+                entity.setCompletion(FlowNature.ACTION);
+            }
+            operatorMapper.updateById(list);
+        }
+    }
+
+    // 缁撴潫鍔犵缁忓姙
+    public void endAddSign(String parentId) {
+        List<OperatorEntity> list = new ArrayList<>();
+        this.getAddSignChildren(parentId, list);
+        if (CollUtil.isNotEmpty(list)) {
+            operatorMapper.updateById(list);
+        }
+    }
+
+    // 鎾ゅ洖澶嶅師
+    public void recallRestore(OperatorEntity operator, String nodeId, List<String> userIds) {
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
+                .eq(OperatorEntity::getNodeCode, operator.getNodeCode()).eq(OperatorEntity::getNodeId, nodeId)
+                .eq(OperatorEntity::getCompletion, FlowNature.ACTION).isNull(OperatorEntity::getHandleTime);
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        if (CollUtil.isEmpty(list)) {
+            return;
+        }
+
+        List<OperatorEntity> updateList = new ArrayList<>();
+        for (OperatorEntity operatorEntity : list) {
+            if (ObjectUtil.equals(operatorEntity.getParentId(), operator.getParentId())) {
+                updateList.add(operatorEntity);
+                if (null != userIds) {
+                    userIds.add(operatorEntity.getHandleId());
+                }
+            }
+        }
+
+        if (CollUtil.isNotEmpty(updateList)) {
+            Date date = new Date();
+            UpdateWrapper<OperatorEntity> wrapper = new UpdateWrapper<>();
+            List<String> ids = updateList.stream().map(OperatorEntity::getId).collect(Collectors.toList());
+            wrapper.lambda().in(OperatorEntity::getId, ids)
+                    .set(OperatorEntity::getCreatorTime, date)
+                    .set(OperatorEntity::getStatus, OperatorStateEnum.RUNING.getCode())
+                    .set(OperatorEntity::getCompletion, FlowNature.NORMAL)
+                    .set(OperatorEntity::getHandleStatus, null);
+            operatorMapper.update(wrapper);
+            // 浣滃簾璁板綍
+            recordMapper.invalid(updateList);
+        }
+
+        List<OperatorEntity> deleteList = new ArrayList<>();
+        if (CollUtil.isNotEmpty(updateList)) {
+            for (OperatorEntity op : updateList) {
+                this.getAddSignChildren(op.getId(), deleteList);
+            }
+            if (CollUtil.isNotEmpty(deleteList)) {
+                deleteList.forEach(e -> e.setStatus(OperatorStateEnum.FUTILITY.getCode()));
+                operatorMapper.updateById(deleteList);
+                // 浣滃簾璁板綍
+                recordMapper.invalid(deleteList);
+            }
+        }
+    }
+
+    public List<OperatorEntity> getAddSignChildren(String operatorId, List<OperatorEntity> list) {
+        list = null == list ? new ArrayList<>() : list;
+        List<OperatorEntity> childList = this.getChildList(operatorId);
+        if (CollUtil.isNotEmpty(childList)) {
+            for (OperatorEntity operator : childList) {
+                operator.setCompletion(FlowNature.ACTION);
+                list.add(operator);
+                this.getAddSignChildren(operator.getId(), list);
+            }
+        }
+        return list;
+    }
+
+    // 鍒ゆ柇鑷姩瀹℃壒
+    public int checkAuto(FlowMethod flowMethod) {
+        NodeModel nodeModel = flowMethod.getNodeModel();
+        if (Boolean.TRUE.equals(nodeModel.getHasAutoApprover())) {
+            AutoAuditRule autoAuditRule = nodeModel.getAutoAuditRule();
+            if (null != autoAuditRule) {
+                List<ProperCond> conditions = autoAuditRule.getConditions();
+                flowMethod.setConditions(conditions);
+                flowMethod.setMatchLogic(autoAuditRule.getMatchLogic());
+                if (conditionUtil.hasCondition(flowMethod)) {
+                    return 1;
+                }
+            }
+            AutoAuditRule autoRejectRule = nodeModel.getAutoRejectRule();
+            if (null != autoRejectRule) {
+                List<ProperCond> conditions = autoRejectRule.getConditions();
+                flowMethod.setConditions(conditions);
+                flowMethod.setMatchLogic(autoRejectRule.getMatchLogic());
+                if (conditionUtil.hasCondition(flowMethod)) {
+                    return 2;
+                }
+            }
+        }
+        return 3;
+    }
+
+    // 鑺傜偣鐨勮嚜鍔ㄥ鎵�
+    public void autoAudit(FlowMethod flowMethod) throws WorkFlowException {
+        FlowModel flowModel = flowMethod.getFlowModel();
+
+        OperatorEntity entity = this.saveSystemOperator(flowMethod);
+        if (null == entity) {
+            return;
+        }
+        audit(entity, flowModel);
+    }
+
+    public void autoAudit(OperatorEntity entity, FlowModel flowModel) throws WorkFlowException {
+        if (null == entity || null == flowModel) {
+            return;
+        }
+        audit(entity, flowModel);
+    }
+
+    public void audit(OperatorEntity operator, FlowModel flowModel) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        //鍒ゆ柇鏄惁瀹℃壒杩�
+        if (null != operator.getHandleStatus()) {
+            return;
+        }
+        flowUtil.isSuspend(taskEntity);
+        flowUtil.isCancel(taskEntity);
+        flowUtil.isTrigger(taskEntity, ImmutableList.of(operator.getNodeCode()));
+
+        if (null == flowModel.getUserInfo()) {
+            flowModel.setUserInfo(UserProvider.getUser());
+        }
+        RevokeEntity revokeEntity = revokeMapper.getRevokeTask(taskEntity.getId());
+        if (null != revokeEntity) {
+            // 澶勭悊鎾ら攢鐨勭粡鍔�
+            addTask(ImmutableList.of(revokeEntity.getTaskId()));
+            handleRevoke(flowModel, operator, revokeEntity);
+            return;
+        }
+
+        String nodeCode = operator.getNodeCode();
+        addTask(ImmutableList.of(taskEntity.getId()));
+
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(e.getNodeCode(), nodeCode)).findFirst().orElse(null);
+        if (nodeEntity == null) {
+            throw new WorkFlowException(MsgCode.WF076.get());
+        }
+
+        TemplateNodeEntity startEntity = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(e.getNodeType(), NodeEnum.START.getType())).findFirst().orElse(null);
+        if (startEntity == null) {
+            throw new WorkFlowException(MsgCode.WF076.get());
+        }
+
+        flowModel.setNodeEntity(nodeEntity);
+        String deploymentId = flowModel.getDeploymentId();
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        NodeModel nodeModel = nodes.get(operator.getNodeCode());
+        // 鍏ㄥ眬鑺傜偣
+        TemplateNodeEntity globalEntity = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(NodeEnum.GLOBAL.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+        NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
+        // 琛ㄥ崟
+        Map<String, Object> formData = flowModel.getFormData();
+
+        if (CollUtil.isNotEmpty(flowModel.getCandidateList()) && ObjectUtil.equals(nodeModel.getCounterSign(), FlowNature.FIXED_APPROVER)) {
+            NextOrPrevFo nextOrPrevFo = new NextOrPrevFo();
+            nextOrPrevFo.setDeploymentId(flowModel.getDeploymentId());
+            nextOrPrevFo.setTaskKey(operator.getNodeCode());
+            List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(nextOrPrevFo);
+            List<String> nextCodes = nextModels.stream().map(FlowableNodeModel::getId).collect(Collectors.toList());
+            if (CollUtil.isNotEmpty(nextCodes)) {
+                candidatesMapper.deleteByCodes(operator.getTaskId(), nextCodes);
+            }
+        }
+
+        // 淇濆瓨鍊欓�変汉銆佸紓甯镐汉
+        flowUtil.create(flowModel, operator.getTaskId(), nodeEntityList, operator);
+
+        // 娴佺▼鍙傛暟
+        updateGlobalParam(taskEntity, nodeModel, global, flowModel.getFormData());
+        flowModel.setTaskEntity(taskEntity);
+
+        FlowMethod flowMethod = new FlowMethod();
+        Integer handleStatus = flowModel.getHandleStatus();
+        boolean isAudit = handleStatus.equals(FlowNature.AUDIT_COMPLETION);
+        if (isAudit) {
+            operator.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+            flowMethod.setType(RecordEnum.AUDIT.getCode());
+            flowModel.setEventStatus(EventEnum.APPROVE.getStatus());
+        } else {
+            operator.setHandleStatus(FlowNature.REJECT_COMPLETION);
+            flowMethod.setType(RecordEnum.REJECT.getCode());
+            flowModel.setEventStatus(EventEnum.REJECT.getStatus());
+        }
+
+        // 鍚屾剰銆佹嫆缁�
+        operator.setHandleTime(new Date());
+        operator.setCompletion(FlowNature.ACTION);
+        operatorMapper.updateById(operator);
+        if (StringUtils.isNotBlank(operator.getDraftData())) {
+            // 娓呴櫎鑽夌鏁版嵁
+            UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId())
+                    .set(OperatorEntity::getDraftData, null);
+            operatorMapper.update(updateWrapper);
+        }
+        // 璁板綍
+        flowMethod.setFlowModel(flowModel);
+        flowMethod.setOperatorEntity(operator);
+        recordMapper.createRecord(flowMethod);
+
+        flowMethod.setTaskEntity(taskEntity);
+        flowMethod.setNodeEntity(nodeEntity);
+        flowMethod.setNodeEntityList(nodeEntityList);
+        flowMethod.setDeploymentId(deploymentId);
+        flowMethod.setFormData(formData);
+        flowMethod.setNodes(nodes);
+        flowMethod.setNodeCode(operator.getNodeCode());
+        flowMethod.setNodeModel(nodeModel);
+        flowMethod.setHandleStatus(handleStatus);
+        // 鎶勯��
+        List<CirculateEntity> circulateList = new ArrayList<>();
+        if (Boolean.TRUE.equals(flowModel.getCopyMsgFlag())) {
+            circulateList = circulateList(flowMethod);
+        }
+        flowMethod.setCirculateList(circulateList);
+
+        //娑堟伅鏁版嵁
+        FlowMsgModel flowMsgModel = new FlowMsgModel();
+        flowMsgModel.setNodeList(nodeEntityList);
+        flowMsgModel.setCirculateList(circulateList);
+        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+        flowMsgModel.setTaskEntity(taskEntity);
+        flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
+        flowMsgModel.setCopy(true);
+        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+
+        // 鍒ゆ柇鍔犵姣斾緥
+        if (!StringUtils.equals(operator.getParentId(), FlowNature.PARENT_ID)) {
+            handleAddCounterSign(operator, flowModel);
+            msgUtil.message(flowMsgModel);
+            return;
+        }
+        // 閫夋嫨鍒嗘敮
+        candidatesMapper.createBranch(flowModel.getBranchList(), operator);
+
+        // 鎸囨淳鐨勭粡鍔炴棤闇�璁$畻姣斾緥锛屾垨绯荤粺瀹℃壒
+        if (!ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.ASSIGNED.getCode())
+                || ObjectUtil.equals(operator.getHandleId(), FlowNature.SYSTEM_CODE)) {
+            // 鍒ゆ柇姣斾緥
+            boolean auditRes = checkAudit(flowMethod);
+            if (!auditRes) {
+                msgUtil.message(flowMsgModel);
+                return;
+            }
+            //閫愮骇瀹℃壒杩�
+            List<LaunchUserEntity> launchUserList = launchUserMapper.getTaskList(operator.getTaskId());
+            LaunchUserEntity launchUser = launchUserList.stream().filter(e -> Objects.equals(e.getNodeCode(), nodeCode)).findFirst().orElse(null);
+            if ((launchUser != null) && (isAudit || Boolean.TRUE.equals(global.getHasContinueAfterReject()))) {
+                QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+                queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
+                        .eq(OperatorEntity::getNodeCode, operator.getNodeCode())
+                        .eq(OperatorEntity::getParentId, FlowNature.PARENT_ID)
+                        .ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode());
+                List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+                boolean result = checkStep(list, nodeModel, launchUser);
+                if (!result) {
+                    String positionId = launchUser.getPositionId() != null ? launchUser.getPositionId() : "";
+                    List<String> positionList = Arrays.asList(positionId.split(","));
+                    String organizeId = launchUser.getOrganizeId() != null ? launchUser.getOrganizeId() : "";
+                    List<String> organizeList = Arrays.asList(organizeId.split(","));
+                    //鑾峰彇閫愮骇涓嬩釜瀹℃壒浜�
+                    FlowMethod jsonToBean = new FlowMethod();
+                    flowModel.setFlowableTaskId(operator.getNodeId());
+                    jsonToBean.setTaskEntity(flowMethod.getTaskEntity());
+                    jsonToBean.setFlowModel(flowModel);
+                    jsonToBean.setNodeEntityList(flowMethod.getNodeEntityList());
+                    jsonToBean.setNodeEntity(flowMethod.getNodeEntity());
+                    jsonToBean.setSubFormData(flowMethod.getSubFormData());
+                    jsonToBean.setExtraRule(true);
+                    jsonToBean.setNodeModel(nodeModel);
+                    jsonToBean.setOperatorEntity(operator);
+                    UserEntity userEntity = new UserEntity();
+                    userEntity.setPositionId(positionList.get(positionList.size() - 1));
+                    userEntity.setOrganizeId(organizeList.get(organizeList.size() - 1));
+                    String managerByLevel = flowUtil.getManagerByLevel(userEntity, list.size() + 1);
+                    UserEntity userInfo = serviceUtil.getUserInfo(managerByLevel);
+                    if (userInfo == null) {
+                        throw new WorkFlowException(MsgCode.WF153.get());
+                    }
+                    jsonToBean.setUserIds(ImmutableList.of(managerByLevel));
+                    List<OperatorEntity> entityList = createOperator(jsonToBean);
+                    for (OperatorEntity entity : entityList) {
+                        entity.setHandleAll(operator.getId());
+                    }
+                    operatorMapper.updateById(entityList);
+                    addOperatorList(entityList, flowModel);
+
+                    // 娑堟伅
+                    flowMsgModel.setOperatorList(entityList);
+                    if (isAudit) {
+                        flowMsgModel.setApprove(true);
+                    } else {
+                        flowMsgModel.setReject(true);
+                    }
+                    msgUtil.message(flowMsgModel);
+                    return;
+                }
+            }
+
+        }
+        //瀹℃壒浜嬩欢
+        addEvent(flowModel);
+        Integer tempStatus = flowMethod.getHandleStatus() != null ? flowMethod.getHandleStatus() : handleStatus;
+        // 鍒ゆ柇鎷掔粷鍚庢槸鍚︾户缁祦杞�
+        if (FlowNature.REJECT_COMPLETION.equals(tempStatus) && Boolean.TRUE.equals(!global.getHasContinueAfterReject())) {
+            flowMethod.setOperatorEntity(operator);
+            flowMethod.setFlowModel(flowModel);
+            handleEndTask(flowMethod);
+            launchUserMapper.deleteStepUser(taskEntity.getId());
+            return;
+        }
+
+        //鑷敱鑺傜偣锛屼笉鏄粨鏉燂紝鍙樻洿娴佺▼
+        if (Objects.equals(taskEntity.getFlowType(), FlowNature.FREE)) {
+            FreeModel freeParameter = flowModel.getFreeFlowConfig() != null ? flowModel.getFreeFlowConfig() : new FreeModel();
+            if (Boolean.TRUE.equals(!freeParameter.getIsEnd()) && !freeParameter.getApprovers().isEmpty()) {
+                freeParameter.setIsEnd(null);
+                TemplateJsonEntity templateJson = templateJsonMapper.getInfo(taskEntity.getFlowId());
+                String flowXml = templateJson.getFlowXml();
+                String freeCode = taskEntity.getFreeCode();
+                if (StringUtils.isNotEmpty(flowXml)) {
+                    try {
+                        flowXml = URLDecoder.decode(flowXml, StringPool.UTF_8);
+                    } catch (Exception e) {
+                        log.info(e.getMessage());
+                    }
+                    XmlModel xmlModel = FlowXmlUtil.model(flowXml, taskEntity.getCurrentNodeCode(), false);
+                    String newLineCode = xmlModel.getNewLineCode();
+                    String newNodeCode = xmlModel.getNewNodeCode();
+                    Map<String, NodeModel> nodeMode = new HashMap<>();
+                    Map<String, Map<String, Object>> flowNodes = new HashMap<>();
+                    String freeNodeName = "鑷敱鑺傜偣";
+                    for (TemplateNodeEntity templateNode : nodeEntityList) {
+                        Map<String, Object> map = JsonUtil.stringToMap(templateNode.getNodeJson());
+                        flowNodes.put(templateNode.getNodeCode(), map);
+                        if (Objects.equals(nodeEntity.getNodeType(), NodeEnum.APPROVER.getType())) {
+                            NodeModel model = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+                            freeNodeName = model.getNodeName().replaceAll(nodeModel.getNodeId(), "");
+                        }
+                        nodeMode.put(templateNode.getNodeCode(), JsonUtil.getJsonToBean(map, NodeModel.class));
+                    }
+
+                    Map<String, Object> freeMap = flowNodes.get(taskEntity.getCurrentNodeCode());
+                    if (CollUtil.isNotEmpty(freeMap)) {
+                        freeParameter.setNodeId(newNodeCode);
+                        freeParameter.setNodeName(freeNodeName + newNodeCode);
+                        if (Objects.equals(freeParameter.getCounterSign(), FlowNature.IMPROPER_APPROVER)) {
+                            freeParameter.setApproversSortList(freeParameter.getApprovers());
+                        }
+                        Map<String, Object> parameter = JsonUtil.entityToMap(freeParameter);
+                        Map<String, Object> nodeModelMap = new HashMap<>(freeMap);
+                        nodeModelMap.putAll(parameter);
+                        flowNodes.put(newNodeCode, nodeModelMap);
+                        nodeMode.put(newNodeCode, JsonUtil.getJsonToBean(nodeModelMap, NodeModel.class));
+                    }
+                    List<String> connectList = new ArrayList<>(global.getConnectList());
+                    connectList.add(newLineCode);
+                    FreeConnect freeConnect = new FreeConnect();
+                    freeConnect.setConnectList(connectList);
+                    Map<String, Object> connectMap = JsonUtil.entityToMap(freeConnect);
+                    Map<String, Object> globalMap = flowNodes.get(NodeEnum.GLOBAL.getType());
+                    globalMap.putAll(connectMap);
+                    templateNodeMapper.deleteByIds(nodeEntityList);
+                    flowUtil.craeteNodeModel(flowNodes, taskEntity.getFlowId());
+
+                    //-----------------------------鎿嶄綔flowable鏁版嵁搴撳紑濮�--------------------------------------
+                    //鏇存柊鐗堟湰閮ㄧ讲id
+                    String xml = FlowXmlUtil.xml(xmlModel);
+                    String flowableId = flowAbleUrl.deployFlowAble(xml, RandomUtil.uuId());
+
+                    // 鍚姩娴佺▼绀轰緥
+                    FlowMethod method = new FlowMethod();
+                    method.setDeploymentId(flowableId);
+                    method.setFormData(flowMethod.getFormData());
+                    method.setNodeCode(startEntity.getNodeCode());
+                    method.setNodes(nodeMode);
+                    method.setTaskEntity(taskEntity);
+                    Map<String, Boolean> resMap = conditionUtil.handleCondition(method); //// 鍒ゆ柇鏉′欢
+                    // 鍒ゆ柇鏉′欢銆佸�欓�変汉
+                    try {
+                        conditionUtil.checkCondition(resMap, nodeMode);
+                    } catch (WorkFlowException e) {
+                        throw new WorkFlowException(MsgCode.WF133.get());
+                    }
+                    String instanceId = flowAbleUrl.startInstance(flowableId, new HashMap<>(resMap));
+
+                    //鏇存敼瀹炰緥
+                    UpdateWrapper<TaskEntity> taskWrapper = new UpdateWrapper<>();
+                    taskWrapper.lambda().eq(TaskEntity::getId, taskEntity.getId());
+                    taskWrapper.lambda().set(TaskEntity::getInstanceId, instanceId);
+                    taskMapper.update(taskWrapper);
+
+                    //鎸囧悜寰呭姙鑺傜偣
+                    List<String> sourceTaskCode = new ArrayList<>();
+                    if (StringUtils.isNotEmpty(freeCode)) {
+                        sourceTaskCode.add(freeCode);
+                    } else {
+                        List<FlowableTaskModel> currentTask = flowAbleUrl.getCurrentTask(instanceId);
+                        sourceTaskCode.addAll(currentTask.stream().map(FlowableTaskModel::getTaskKey).collect(Collectors.toList()));
+                    }
+                    JumpFo jumpFo = new JumpFo();
+                    jumpFo.setInstanceId(instanceId);
+                    jumpFo.setSource(sourceTaskCode);
+                    jumpFo.setTarget(Arrays.asList(taskEntity.getCurrentNodeCode().split(",")));
+                    flowAbleUrl.jump(jumpFo);
+
+                    List<FlowableTaskModel> approverTask = flowAbleUrl.getCurrentTask(instanceId);
+
+                    //鏇存柊鏁版嵁
+                    for (FlowableTaskModel taskModel : approverTask) {
+                        if (Objects.equals(taskModel.getTaskKey(), operator.getNodeCode())) {
+                            //鏇存敼浠e姙
+                            UpdateWrapper<OperatorEntity> operatorWrapper = new UpdateWrapper<>();
+                            operatorWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId());
+                            operatorWrapper.lambda().eq(OperatorEntity::getNodeId, operator.getNodeId());
+                            operatorWrapper.lambda().set(OperatorEntity::getNodeId, taskModel.getTaskId());
+                            operatorMapper.update(operatorWrapper);
+                            //璁板綍
+                            UpdateWrapper<RecordEntity> recordWrapper = new UpdateWrapper<>();
+                            recordWrapper.lambda().eq(RecordEntity::getTaskId, operator.getTaskId());
+                            recordWrapper.lambda().eq(RecordEntity::getNodeId, operator.getNodeId());
+                            recordWrapper.lambda().set(RecordEntity::getNodeId, taskModel.getTaskId());
+                            recordMapper.update(recordWrapper);
+                            //鎶勯��
+                            UpdateWrapper<CirculateEntity> circulateWrapper = new UpdateWrapper<>();
+                            circulateWrapper.lambda().eq(CirculateEntity::getTaskId, operator.getTaskId());
+                            circulateWrapper.lambda().eq(CirculateEntity::getNodeId, operator.getNodeId());
+                            circulateWrapper.lambda().set(CirculateEntity::getNodeId, taskModel.getTaskId());
+                            circulateMapper.update(circulateWrapper);
+
+                            //鏇存柊nodeId
+                            operator.setNodeId(taskModel.getTaskId());
+                        }
+                    }
+
+                    //鏇存敼xml鍜岄儴缃瞚d
+                    UpdateWrapper<TemplateJsonEntity> jsonWrapper = new UpdateWrapper<>();
+                    jsonWrapper.lambda().eq(TemplateJsonEntity::getId, taskEntity.getFlowId());
+                    jsonWrapper.lambda().set(TemplateJsonEntity::getFlowableId, flowableId);
+                    jsonWrapper.lambda().set(TemplateJsonEntity::getFlowXml, xml);
+                    templateJsonMapper.update(jsonWrapper);
+
+                    //鑾峰彇鏈�鏂版暟鎹�
+                    flowUtil.setFlowModel(operator.getTaskId(), flowModel);
+
+                    flowMethod.setDeploymentId(flowModel.getDeploymentId());
+                    flowMethod.setNodes(flowModel.getNodes());
+                    flowMethod.setTaskEntity(flowModel.getTaskEntity());
+
+                }
+            }
+        }
+
+        flowModel.setOperatorEntity(operator);
+        boolean isRejectDataId = taskEntity.getRejectDataId() != null;
+        if (isRejectDataId) {
+            handleRejectData(flowModel);
+        } else {
+            List<String> branchList = candidatesMapper.getBranch(operator.getTaskId(), operator.getNodeCode());
+            Map<String, Boolean> resMap;
+            if (branchList.isEmpty()) {
+                resMap = conditionUtil.handleCondition(flowMethod);
+                conditionUtil.checkCondition(resMap, nodes);
+            } else {
+                resMap = conditionUtil.getForBranch(flowMethod, branchList);
+            }
+            taskLineMapper.create(taskEntity.getId(), resMap);
+
+            // 瀹屾垚
+            CompleteFo fo = new CompleteFo();
+            fo.setTaskId(operator.getNodeId());
+            fo.setVariables(new HashMap<>(resMap));
+            flowAbleUrl.complete(fo);
+        }
+        // 鑺傜偣璁板綍
+        NodeRecordModel nodeRecordModel = new NodeRecordModel();
+        nodeRecordModel.setTaskId(operator.getTaskId());
+        nodeRecordModel.setNodeId(operator.getNodeId());
+        nodeRecordModel.setNodeCode(operator.getNodeCode());
+        nodeRecordModel.setNodeName(operator.getNodeName());
+        nodeRecordModel.setNodeStatus(ObjectUtil.equals(flowMethod.getHandleStatus(), FlowNature.AUDIT_COMPLETION) ? NodeStateEnum.PASS.getCode() : NodeStateEnum.REJECT.getCode());
+        nodeRecordMapper.create(nodeRecordModel);
+
+        // 鐢熸垚涓嬩竴鑺傜偣
+        List<OperatorEntity> entityList = this.handleOperator(flowModel);
+        // 鍒犻櫎閫夋嫨鍒嗘敮
+        candidatesMapper.deleteBranch(operator.getTaskId(), operator.getNodeCode());
+
+        //鍒犻櫎閫愮骇鏁版嵁
+        launchUserMapper.delete(operator.getTaskId(), ImmutableList.of(operator.getNodeCode()));
+
+        if (!isRejectDataId) {
+            boolean isProcessing = ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.PROCESSING.getType());
+            Integer i = isProcessing ? ActionEnum.PROCESSING.getCode() : ActionEnum.AUDIT.getCode();
+            flowModel.setAction(ObjectUtil.equals(handleStatus, FlowNature.REJECT_COMPLETION) ? ActionEnum.REJECT.getCode() : i);
+            handleTrigger(operator, flowModel);
+        }
+
+        // 鍒ゆ柇浠诲姟鏄惁缁撴潫
+        flowModel.setHandleStatus(flowMethod.getHandleStatus() != null ? flowMethod.getHandleStatus() : handleStatus);
+        isFinished(flowModel);
+
+        // 娑堟伅
+        flowMsgModel.setOperatorList(entityList);
+        flowMsgModel.setNodeList(flowModel.getNodeEntityList());
+        if (isAudit) {
+            flowMsgModel.setApprove(true);
+        } else {
+            flowMsgModel.setReject(true);
+        }
+        msgUtil.message(flowMsgModel);
+
+        // 绯荤粺瀹℃壒
+        systemAudit();
+    }
+
+    // 閫�鍥�
+    public void back(String id, FlowModel flowModel) throws WorkFlowException {
+        Boolean triggerBack = flowModel.getTriggerBack();
+        OperatorEntity operator = checkOperator(id);
+
+        flowUtil.setFlowModel(operator.getTaskId(), flowModel);
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        checkTemplateHide(taskEntity.getTemplateId());
+        flowUtil.isSuspend(taskEntity);
+        flowUtil.isCancel(taskEntity);
+        flowUtil.isTrigger(taskEntity);
+        if (null != taskEntity.getRejectDataId()) {
+            throw new WorkFlowException(MsgCode.WF083.get());
+        }
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        String deploymentId = flowModel.getDeploymentId();
+
+        NodeModel nodeModel = nodes.get(operator.getNodeCode());
+        TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                .filter(e -> ObjectUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
+        flowModel.setNodeEntity(nodeEntity);
+
+        TemplateNodeEntity start = nodeEntityList.stream().filter(e -> e.getNodeType().equals(NodeEnum.START.getType())).findFirst().orElse(null);
+        if (null == start) {
+            throw new WorkFlowException(MsgCode.WF076.get());
+        }
+
+        Integer backType = flowModel.getBackType();
+        String backStep = flowModel.getBackNodeCode();
+        boolean isPresentType = FlowNature.PRESENT_TYPE.equals(backType);
+        List<String> stepList = new ArrayList<>();
+        if (FlowNature.START.equals(backStep)) {
+            stepList.add(start.getNodeCode());
+        } else {
+            stepList = StringUtils.isNotEmpty(backStep) ? Arrays.stream(backStep.split(",")).collect(Collectors.toList()) : new ArrayList<>();
+            // 鍒ゆ柇娌℃湁缁忚繃鐨勮妭鐐癸紝涓嶈兘閫�鍥�
+            List<String> nodeCodeList = operatorMapper.getList(taskEntity.getId()).stream()
+                    .filter(e -> !e.getStatus().equals(OperatorStateEnum.FUTILITY.getCode()))
+                    .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
+            nodeCodeList.add(start.getNodeCode());
+            for (String step : stepList) {
+                if (!nodeCodeList.contains(step)) {
+                    throw new WorkFlowException(MsgCode.WF047.get());
+                }
+            }
+        }
+
+        flowModel.setAction(ActionEnum.BACK.getCode());
+        flowModel.setOperatorEntity(operator);
+        if (null != nodeEntity) {
+            Map<String, Object> map = serviceUtil.infoData(nodeEntity.getFormId(), operator.getTaskId());
+            FlowContextHolder.addChildData(operator.getTaskId(), nodeEntity.getFormId(), map, nodeModel.getFormOperates(), false);
+            flowModel.setFormData(map);
+        }
+
+        if (Boolean.TRUE.equals(!triggerBack) && !isPresentType) {
+            handleTrigger(operator, flowModel);
+        }
+
+        //鑾峰彇鏄惁瑙﹀彂鏁版嵁
+        List<TriggerLaunchflowEntity> launchFlowList = getLaunchFlowList(taskEntity.getId());
+
+        AfterFo afterFo = new AfterFo();
+        afterFo.setDeploymentId(deploymentId);
+        afterFo.setTaskKeys(stepList);
+        // 鑾峰彇鐩爣鑺傜偣涔嬪悗鐨勬墍鏈夎妭鐐癸紝灏嗚繖浜涜妭鐐圭殑缁忓姙鍏ㄩ儴淇濆瓨銆佹洿鏂扮姸鎬�
+        List<String> afterListAll = flowAbleUrl.getAfter(afterFo);
+        List<String> deleteAfterList = new ArrayList<>(afterListAll);
+        Set<String> afterCodeList = new HashSet<>();
+        afterCodeList.addAll(stepList);
+        afterCodeList.addAll(afterListAll);
+        List<String> afterList = new ArrayList<>(afterCodeList);
+
+        QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
+                .in(OperatorEntity::getNodeCode, afterList);
+        List<OperatorEntity> list = operatorMapper.selectList(wrapper);
+
+        // 褰撳墠瀹℃壒鏃�  淇濆瓨 浠诲姟銆佺粡鍔炪�佸閮� 杞琷son
+        QueryWrapper<EventLogEntity> logWrapper = new QueryWrapper<>();
+        logWrapper.lambda().eq(EventLogEntity::getTaskId, operator.getTaskId())
+                .in(EventLogEntity::getNodeCode, afterList);
+        logWrapper.lambda().select(EventLogEntity::getId, EventLogEntity::getNodeCode);
+        List<EventLogEntity> logList = eventLogMapper.selectList(logWrapper);
+
+        if (Boolean.FALSE.equals(triggerBack)) {
+            // 璁板綍
+            FlowMethod flowMethod = new FlowMethod();
+            flowMethod.setType(RecordEnum.BACK.getCode());
+            flowMethod.setFlowModel(flowModel);
+            flowMethod.setOperatorEntity(operator);
+            recordMapper.createRecord(flowMethod);
+        }
+
+        if (!isPresentType) {
+            // 瀛愭祦绋嬪鐞嗭紝閲嶆柊瀹℃壒锛氬瓙娴佺▼闇�鍒犻櫎锛屽綋鍓嶅鎵癸細鏃犻渶缁堟
+            deleteSubflow(taskEntity.getId(), afterList);
+            // 璁板綍浣滃簾
+            recordMapper.updateStatusToInvalid(taskEntity.getId(), afterList);
+            // 鏇存敼缁忓姙鐨勬搷浣�
+            for (OperatorEntity operatorEntity : list) {
+                operatorEntity.setCompletion(FlowNature.ACTION);
+                // 鍒犻櫎瓒呮椂鐩稿叧
+                FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil);
+            }
+            operatorMapper.updateById(list);
+        }
+
+        if (!launchFlowList.isEmpty()) {
+            return;
+        }
+
+        // 鑺傜偣璁板綍
+        NodeRecordModel nodeRecordModel = new NodeRecordModel();
+        nodeRecordModel.setTaskId(operator.getTaskId());
+        nodeRecordModel.setNodeId(operator.getNodeId());
+        nodeRecordModel.setNodeCode(operator.getNodeCode());
+        nodeRecordModel.setNodeName(operator.getNodeName());
+        nodeRecordModel.setNodeStatus(NodeStateEnum.BACK.getCode());
+        nodeRecordMapper.create(nodeRecordModel);
+
+        addTask(ImmutableList.of(taskEntity.getId()));
+
+        RejectDataEntity rejectDataEntity = null;
+        if (isPresentType) {
+            rejectDataEntity = rejectDataMapper.create(taskEntity, list, logList, stepList.get(0));
+            //鏇存柊澶栭儴鑺傜偣
+            UpdateWrapper<EventLogEntity> updateLogWrapper = new UpdateWrapper<>();
+            updateLogWrapper.lambda().eq(EventLogEntity::getTaskId, operator.getTaskId());
+            updateLogWrapper.lambda().in(EventLogEntity::getNodeCode, afterList);
+            updateLogWrapper.lambda().set(EventLogEntity::getNodeCode, null);
+            eventLogMapper.update(updateLogWrapper);
+        } else {
+            // 閲嶆柊瀹℃壒锛屽垹闄ゅ�欓�変汉銆侀�愮骇銆佸閮�
+            if (CollUtil.isNotEmpty(deleteAfterList)) {
+                candidatesMapper.deleteByCodes(taskEntity.getId(), deleteAfterList);
+                launchUserMapper.delete(taskEntity.getId(), deleteAfterList);
+                eventLogMapper.delete(taskEntity.getId(), deleteAfterList);
+            }
+        }
+
+        // 鏇存敼鐘舵�� state 杞� -1
+        for (OperatorEntity operatorEntity : list) {
+            operatorEntity.setStatus(OperatorStateEnum.FUTILITY.getCode());
+            // 鍒犻櫎瓒呮椂鐩稿叧
+            FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil);
+        }
+        operatorMapper.updateById(list);
+
+        UpdateWrapper<TaskEntity> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(TaskEntity::getId, operator.getTaskId());
+        if (null != rejectDataEntity) {
+            updateWrapper.lambda().set(TaskEntity::getRejectDataId, rejectDataEntity.getId());
+        }
+        FlowMsgModel flowMsgModel = new FlowMsgModel();
+
+        // 寮�濮嬭妭鐐�
+        if (stepList.size() == 1 && stepList.get(0).equals(start.getNodeCode())) {
+            // 鏇存柊浠诲姟
+            updateWrapper.lambda()
+                    .set(TaskEntity::getCurrentNodeName, FlowNature.START_NAME)
+                    .set(TaskEntity::getCurrentNodeCode, FlowNature.START_CODE)
+                    .set(TaskEntity::getStatus, TaskStatusEnum.BACKED.getCode());
+            if (rejectDataEntity == null) {
+                updateWrapper.lambda().set(TaskEntity::getInstanceId, null);
+            }
+            taskMapper.update(updateWrapper);
+
+            List<OperatorEntity> entityList = new ArrayList<>();
+            OperatorEntity operatorEntity = new OperatorEntity();
+            operatorEntity.setNodeCode(start.getNodeCode());
+            operatorEntity.setHandleId(taskEntity.getCreatorUserId());
+            entityList.add(operatorEntity);
+            flowMsgModel.setOperatorList(entityList);
+            flowMsgModel.setWait(false);
+
+            if (!isPresentType) {
+                // 鍒犻櫎鍙戣捣鐢ㄦ埛
+                launchUserMapper.delete(taskEntity.getId());
+            }
+            // 鍒犻櫎寮曟搸瀹炰緥
+            if (rejectDataEntity == null) {
+                String instanceId = taskEntity.getInstanceId();
+                flowAbleUrl.deleteInstance(instanceId, "back");
+            }
+        } else {
+            String sourceId = StringUtils.isNotEmpty(flowModel.getBackId()) ? flowModel.getBackId() : operator.getNodeId();
+            BackFo fo = new BackFo();
+            fo.setTaskId(sourceId);
+            fo.setTargetKey(backStep);
+            flowAbleUrl.back(fo);
+            List<OperatorEntity> entityList = this.handleOperator(flowModel);
+
+            // 鏇存柊鐘舵�佷负閫�鍥炵姸鎬�
+            for (OperatorEntity entity : entityList) {
+                entity.setStatus(OperatorStateEnum.BACK.getCode());
+            }
+            operatorMapper.updateById(entityList);
+
+            flowMsgModel.setOperatorList(entityList);
+            addOperatorList(entityList, flowModel);
+
+            if (null != rejectDataEntity) {
+                taskMapper.update(updateWrapper);
+            }
+        }
+
+        // 娑堟伅
+        flowMsgModel.setNodeList(nodeEntityList);
+        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+        flowMsgModel.setTaskEntity(taskEntity);
+        flowMsgModel.setNodeCode(nodeModel.getNodeId());
+        flowMsgModel.setBack(true);
+        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+        msgUtil.message(flowMsgModel);
+
+        //閫�鍥炰簨浠�
+        flowModel.setEventStatus(EventEnum.BACK.getStatus());
+        addEvent(flowModel);
+    }
+
+    // 绯荤粺瀹℃壒
+    public void systemAudit() {
+        List<SystemAuditModel> systemList = SystemAuditHolder.getAll();
+        if (CollUtil.isNotEmpty(systemList)) {
+            List<SystemAuditModel> jsonToList = JsonUtil.getJsonToList(systemList, SystemAuditModel.class);
+
+            SystemAuditHolder.clear();
+            Map<String, TaskEntity> taskMap = new HashMap<>();
+            for (SystemAuditModel model : jsonToList) {
+                OperatorEntity operator = model.getOperator();
+                FlowModel flowModel = model.getFlowModel();
+                try {
+                    String taskId = operator.getTaskId();
+                    TaskEntity task = taskMap.get(taskId) != null ? taskMap.get(taskId) : taskMapper.getInfo(taskId);
+                    if (Objects.equals(task.getStatus(), TaskStatusEnum.REJECTED.getCode())) {
+                        continue;
+                    }
+                    flowModel.setTaskEntity(task);
+                    this.autoAudit(operator, flowModel);
+                    taskMap.put(taskId, task);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    public OperatorEntity saveSystemOperator(FlowMethod flowMethod) {
+        NodeModel nodeModel = flowMethod.getNodeModel();
+        FlowModel flowModel = flowMethod.getFlowModel();
+
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        String flowableTaskId = flowModel.getFlowableTaskId();
+
+        OperatorEntity entity = new OperatorEntity();
+        entity.setStatus(OperatorStateEnum.RUNING.getCode());
+        entity.setCompletion(FlowNature.ACTION);
+        entity.setParentId(FlowNature.PARENT_ID);
+
+        entity.setTaskId(taskEntity.getId());
+        entity.setNodeCode(nodeModel.getNodeId());
+        entity.setNodeId(flowableTaskId);
+        entity.setNodeName(nodeModel.getNodeName());
+        entity.setEngineType(taskEntity.getEngineType());
+
+        entity.setSignTime(new Date());
+        entity.setStartHandleTime(new Date());
+        entity.setHandleId(FlowNature.SYSTEM_CODE);
+        entity.setHandleTime(new Date());
+        entity.setIsProcessing(ObjectUtil.equals(nodeModel.getType(), NodeEnum.PROCESSING.getType()) ? FlowNature.PROCESSING : FlowNature.NOT_PROCESSING);
+
+        operatorMapper.insert(entity);
+
+        return entity;
+    }
+
+    // 鍏ㄥ眬灞炴�х殑鑷姩瀹℃壒
+    public boolean handleGlobalAuto(FlowMethod flowMethod) throws WorkFlowException {
+        OperatorEntity entity = flowMethod.getOperatorEntity();
+        NodeModel global = flowMethod.getNodeModel();
+        FlowModel flowModel = flowMethod.getFlowModel();
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        String deploymentId = flowModel.getDeploymentId();
+        if (null == entity.getSignTime()) {
+            entity.setSignTime(new Date());
+        }
+
+        // 鑷姩鎻愪氦瑙勫垯
+        AutoSubmitConfig autoSubmitConfig = global.getAutoSubmitConfig();
+        // 鐩搁偦鑺傜偣瀹℃壒浜洪噸澶�
+        if (Boolean.TRUE.equals(autoSubmitConfig.getAdjacentNodeApproverRepeated())) {
+            // 鑾峰彇涓婁竴绾ц妭鐐圭紪鐮�
+            List<String> nodeCodeList = new ArrayList<>();
+            flowUtil.prevNodeList(deploymentId, entity.getNodeCode(), nodeEntityList, nodeCodeList);
+            if (CollUtil.isNotEmpty(nodeCodeList)) {
+                QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+                queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
+                        .eq(OperatorEntity::getHandleId, entity.getHandleId()).isNotNull(OperatorEntity::getHandleStatus)
+                        .ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode())
+                        .in(OperatorEntity::getNodeCode, nodeCodeList);
+                long count = operatorMapper.selectCount(queryWrapper);
+                if (count > 0) {
+                    entity.setStartHandleTime(new Date());
+                    return true;
+                }
+            }
+        }
+        // 瀹℃壒浜哄鎵硅繃璇ユ祦绋�
+        if (Boolean.TRUE.equals(autoSubmitConfig.getApproverHasApproval())) {
+            QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
+                    .eq(OperatorEntity::getHandleId, entity.getHandleId()).ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode())
+                    .isNotNull(OperatorEntity::getHandleStatus);
+            long count = operatorMapper.selectCount(queryWrapper);
+            if (count > 0) {
+                entity.setStartHandleTime(new Date());
+                return true;
+            }
+        }
+        // 鍙戣捣浜轰笌瀹℃壒浜洪噸澶�
+        if (Boolean.TRUE.equals(autoSubmitConfig.getInitiatorApproverRepeated())
+                && StringUtils.equals(taskEntity.getCreatorUserId(), entity.getHandleId())) {
+            entity.setStartHandleTime(new Date());
+            return true;
+        }
+
+        return false;
+    }
+
+    public List<OperatorEntity> getChildList(String id) {
+        QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(OperatorEntity::getParentId, id)
+                .ne(OperatorEntity::getStatus, OperatorStateEnum.ASSIST.getCode());
+        return operatorMapper.selectList(wrapper);
+    }
+
+    // 澶勭悊鍔犵瀹℃壒姣斾緥
+    public void handleAddCounterSign(OperatorEntity operator, FlowModel flowModel) throws WorkFlowException {
+        if (null == operator.getParentId()) {
+            return;
+        }
+        OperatorEntity parentEntity = operatorMapper.getInfo(operator.getParentId());
+        if (null == parentEntity) {
+            return;
+        }
+        String handleParameter = parentEntity.getHandleParameter();
+        AddSignModel addSignModel = JsonUtil.getJsonToBean(handleParameter, AddSignModel.class);
+        if (null == addSignModel) {
+            return;
+        }
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        List<OperatorEntity> list = this.getChildList(operator.getParentId());
+
+        int total = list.size();
+        long countAudit = list.stream().filter(e -> FlowNature.AUDIT_COMPLETION.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
+        long countReject = list.stream().filter(e -> FlowNature.REJECT_COMPLETION.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
+
+        FlowMethod flowMethod = new FlowMethod();
+        flowMethod.setAddSignModel(addSignModel);
+        flowMethod.setOperatorEntity(parentEntity);
+        flowMethod.setFlowModel(flowModel);
+        if (ObjectUtil.equals(addSignModel.getCounterSign(), FlowNature.IMPROPER_APPROVER)) {
+            if (ObjectUtil.equals(flowModel.getHandleStatus(), FlowNature.REJECT_COMPLETION)) {
+                Map<String, NodeModel> nodes = flowModel.getNodes();
+                NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+                // 101003鍓嶅姞绛剧粰10001銆�10002銆�10003锛屼笉绠℃槸鍚﹀紑鍚嫆缁濈户缁祦杞紝10001閫氳繃锛�10002鎷掔粷锛屽簲璇ュ洖鍒�101003閭i噷
+                // 鍚庡姞绛鹃�昏緫锛氭祦绋嬭缃户缁祦杞紝渚濇瀹℃壒涓彧瑕佹湁浜烘嫆缁濓紝鍏朵粬瀹℃壒浜轰笉鐢ㄥ鎵规祦绋嬪氨娴佽浆涓嬩竴鑺傜偣锛涙祦绋嬫湭璁剧疆缁х画娴佽浆锛屼緷娆″鎵逛腑鍙鏈変汉鎷掔粷锛屽氨鎷掔粷鍥炲彂璧疯妭鐐�
+                if (Boolean.FALSE.equals(global.getHasContinueAfterReject())) {
+                    if (ObjectUtil.equals(addSignModel.getAddSignType(), FlowNature.LATER)) {
+                        flowMethod.setTaskEntity(taskEntity);
+                        handleEndTask(flowMethod);
+                    } else {
+                        this.handleAddSign(flowMethod);
+                    }
+                } else {
+                    this.handleAddSign(flowMethod);
+                }
+                return;
+            }
+            String userId = operator.getHandleId();
+            // 杞鐨勭粡鍔烇紝閫氳繃璁板綍鑾峰彇鍘熸潵鐨勫鎵逛汉
+            if (ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.TRANSFER.getCode())) {
+                RecordEntity transferRecord = recordMapper.getTransferRecord(operator.getId());
+                String handleId = transferRecord.getHandleId();
+                if (StringUtils.isNotBlank(handleId)) {
+                    userId = handleId;
+                }
+            }
+            List<String> idList = addSignModel.getAddSignUserIdList();
+            int index = idList.indexOf(userId);
+            if (index == idList.size() - 1) {
+                // 渚濇瀹℃壒鏈�鍚庝竴涓汉
+                this.handleAddSign(flowMethod);
+            } else {
+                NodeModel global = flowModel.getNodes().get(NodeEnum.GLOBAL.getType());
+                String handleId = idList.get(index + 1);
+                OperatorEntity entity = this.createOperator(operator, OperatorStateEnum.ADD_SIGN.getCode(), handleId, global);
+                operatorMapper.insert(entity);
+                flowMethod.setNodeEntity(flowModel.getNodeEntity());
+                flowMethod.setTaskEntity(taskEntity);
+                flowMethod.setNodeEntityList(flowModel.getNodeEntityList());
+                this.improperApproverMessage(flowMethod, entity);
+            }
+        } else if (ObjectUtil.equals(addSignModel.getCounterSign(), FlowNature.FIXED_JOINTLY_APPROVER)) {
+            // 浼氱
+            Integer ratio = addSignModel.getAuditRatio();
+
+            int rejectRatio = 100 - ratio;
+            int rejectRes = (int) (countReject * 100 / total);
+            if (rejectRes != 0 && rejectRes >= rejectRatio) {
+                // 鐩存帴鎷掔粷
+                flowMethod.setHandleStatus(FlowNature.REJECT_COMPLETION);
+                this.handleAddSign(flowMethod);
+                this.endAddSign(parentEntity.getId());
+                return;
+            }
+
+            int res = (int) (countAudit * 100 / total);
+            if (res >= ratio) {
+                flowMethod.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+                this.handleAddSign(flowMethod);
+                this.endAddSign(parentEntity.getId());
+            }
+        } else {
+            int auditFlag = FlowNature.AUDIT_COMPLETION;
+            // 鎴栫
+            if (countReject >= 1) {
+                auditFlag = FlowNature.REJECT_COMPLETION;
+            }
+            flowMethod.setHandleStatus(auditFlag);
+            this.handleAddSign(flowMethod);
+            this.endAddSign(parentEntity.getId());
+        }
+    }
+
+    public void handleAddSign(FlowMethod flowMethod) throws WorkFlowException {
+        AddSignModel addSignModel = flowMethod.getAddSignModel();
+        OperatorEntity parentEntity = flowMethod.getOperatorEntity();
+        FlowModel flowModel = flowMethod.getFlowModel();
+        if (addSignModel.getAddSignType().equals(FlowNature.LATER)) {
+            // 鍚庡姞绛鹃渶瑕侀粯璁ゅ悓鎰�
+            flowModel.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+            UserEntity userEntity = serviceUtil.getUserInfo(parentEntity.getHandleId());
+            UserInfo userInfo = JsonUtil.getJsonToBean(UserProvider.getUser(), UserInfo.class);
+            userInfo.setUserId(userEntity.getId());
+            userInfo.setUserName(userEntity.getRealName());
+            flowModel.setUserInfo(userInfo);
+            flowModel.setCopyMsgFlag(false);
+            parentEntity.setHandleStatus(null);
+            audit(parentEntity, flowModel);
+            flowModel.setCopyMsgFlag(true);
+        } else {
+            UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().eq(OperatorEntity::getId, parentEntity.getId())
+                    .set(OperatorEntity::getCreatorTime, new Date())
+                    .set(OperatorEntity::getCompletion, FlowNature.NORMAL);
+            NodeModel global = flowModel.getNodes().get(NodeEnum.GLOBAL.getType());
+            Boolean flowTodo = serviceUtil.getFlowTodo();
+            if (Boolean.FALSE.equals(flowTodo)) {
+                updateWrapper.lambda().set(OperatorEntity::getStartHandleTime, null);
+                Boolean flowSign = serviceUtil.getFlowSign();
+                if (Boolean.FALSE.equals(flowSign) && global != null && Boolean.TRUE.equals(global.getHasSignFor())) {
+                    updateWrapper.lambda().set(OperatorEntity::getSignTime, null);
+                }
+
+            }
+            operatorMapper.update(updateWrapper);
+            parentEntity = operatorMapper.selectById(parentEntity.getId());
+            // 瓒呮椂缁忓姙
+            List<OperatorEntity> list = new ArrayList<>();
+            list.add(parentEntity);
+            for (OperatorEntity operatorEntity : list) {
+                FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil);
+            }
+            TaskEntity taskEntity = flowModel.getTaskEntity();
+            UserEntity userEntity = serviceUtil.getUserInfo(taskEntity.getCreatorUserId());
+            if (null != userEntity) {
+                FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+                UserInfo userInfo = model.getUserInfo();
+                userInfo.setUserName(userEntity.getRealName());
+                userInfo.setUserAccount(userEntity.getAccount());
+                userInfo.setUserId(userEntity.getId());
+                model.setUserInfo(userInfo);
+                addOperatorList(list, model);
+            }
+        }
+    }
+
+    // 璁剧疆鍙噺绛剧殑浜哄憳鍚嶇О
+    public List<CandidateUserVo> getReduceUsers(List<OperatorEntity> todoList, Pagination pagination) {
+        List<String> ids = todoList.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList());
+        return getUserModel(ids, pagination);
+    }
+
+
+    // 澶勭悊閫�鍥炴暟鎹紝褰撳墠鐨勭粡鍔為�氳繃璁$畻姣斾緥鍚庤繘鍏ヨ鏂规硶锛屾棤闇�鍙樻洿鐘舵��
+    public void handleRejectData(FlowModel flowModel) throws WorkFlowException {
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        OperatorEntity operatorEntity = flowModel.getOperatorEntity();
+
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        String currentNodeCode = taskEntity.getCurrentNodeCode();
+        // 寰呮彁浜わ紙鍗虫湭鍙戣捣锛夐噸鏂板彂璧凤紝闇�瑕佽幏鍙栧綋鍓嶈妭鐐�
+        String instanceId = taskEntity.getInstanceId();
+        if (instanceId != null) {
+            List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
+            List<String> currentCodes = taskModelList.stream().map(FlowableTaskModel::getTaskKey).collect(Collectors.toList());
+            currentNodeCode = String.join(",", currentCodes);
+        }
+
+        String rejectDataId = taskEntity.getRejectDataId();
+
+        RejectDataEntity rejectData = rejectDataMapper.getInfo(taskEntity.getRejectDataId());
+        if (!ObjectUtil.equals(rejectData.getNodeCode(), operatorEntity.getNodeCode())) {
+            throw new WorkFlowException("褰撳墠鑺傜偣鏃犳硶鎿嶄綔");
+        }
+        String taskJson = rejectData.getTaskJson();
+        String operatorJson = rejectData.getOperatorJson();
+        String eventJson = rejectData.getEventLogJson();
+
+        List<OperatorEntity> srcOperatorList = JsonUtil.getJsonToList(operatorJson, OperatorEntity.class);
+        // 鑾峰彇琚��鍥炵殑鑺傜偣缂栫爜锛岀敤浜庤〃鍗曞�间紶閫�
+        List<String> nodeCodes = srcOperatorList.stream().sorted(Comparator.comparing(OperatorEntity::getCreatorTime))
+                .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
+
+        List<EventLogEntity> srcEventList = JsonUtil.getJsonToList(eventJson, EventLogEntity.class);
+
+        TaskEntity srcTask = JsonUtil.getJsonToBean(taskJson, TaskEntity.class);
+        String srcCurrentNodeCode = srcTask.getCurrentNodeCode();
+        // 璺宠浆
+        JumpFo fo = new JumpFo();
+        fo.setInstanceId(instanceId);
+        List<String> sourceList = StringUtils.isNotEmpty(currentNodeCode) ? Arrays.stream(currentNodeCode.split(",")).collect(Collectors.toList()) : new ArrayList<>();
+        List<String> targetList = StringUtils.isNotEmpty(srcCurrentNodeCode) ? Arrays.stream(srcCurrentNodeCode.split(",")).collect(Collectors.toList()) : new ArrayList<>();
+
+        List<String> source = sourceList.stream().filter(e -> !targetList.contains(e)).collect(Collectors.toList());
+        List<String> target = targetList.stream().filter(e -> !sourceList.contains(e)).collect(Collectors.toList());
+        fo.setSource(source);
+        fo.setTarget(target);
+        flowAbleUrl.jump(fo);
+
+        // 璺宠浆鍚庯紝鑾峰彇褰撳墠鐨勮妭鐐逛俊鎭紝鏇存柊缁忓姙
+        List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
+        if (CollUtil.isNotEmpty(taskModelList)) {
+            for (OperatorEntity operator : srcOperatorList) {
+                FlowableTaskModel model = taskModelList.stream()
+                        .filter(e -> ObjectUtil.equals(e.getTaskKey(), operator.getNodeCode())).findFirst().orElse(null);
+                if (null != model) {
+                    operator.setNodeId(model.getTaskId());
+                }
+                operator.setCreatorTime(new Date());
+            }
+        }
+        // 杩樺師缁忓姙
+        operatorMapper.updateById(srcOperatorList);
+
+        //杩樺師澶栭儴鑺傜偣
+        eventLogMapper.updateById(srcEventList);
+
+        // 杩樺師浠诲姟
+        UpdateWrapper<TaskEntity> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(TaskEntity::getId, srcTask.getId())
+                .set(TaskEntity::getInstanceId, instanceId)
+                .set(TaskEntity::getCurrentNodeCode, srcTask.getCurrentNodeCode())
+                .set(TaskEntity::getCurrentNodeName, srcTask.getCurrentNodeName())
+                .set(TaskEntity::getStatus, srcTask.getStatus())
+                .set(TaskEntity::getStartTime, srcTask.getStartTime())
+                .set(TaskEntity::getRejectDataId, null);
+        taskMapper.update(updateWrapper);
+
+        // 璧嬪�兼洿鏂板悗鐨勪换鍔�
+        flowModel.setTaskEntity(srcTask);
+
+        rejectDataMapper.deleteById(rejectDataId);
+
+        // 澶勭悊琛ㄥ崟鍊间紶閫�
+        for (TemplateNodeEntity nodeEntity : nodeEntityList) {
+            if (nodeCodes.contains(nodeEntity.getNodeCode())) {
+                FlowMethod flowMethod = new FlowMethod();
+                flowMethod.setTaskEntity(taskEntity);
+                flowMethod.setNodeEntity(nodeEntity);
+                flowMethod.setNodeEntityList(nodeEntityList);
+                flowMethod.setFlowModel(flowModel);
+                flowMethod.setIsAssign(true);
+                dataTransfer(flowMethod);
+            }
+        }
+    }
+
+    // 鑾峰彇浠诲姟 鑺傜偣涓嬬殑缁忓姙
+    public List<OperatorEntity> getByNodeCode(String taskId, String nodeCode) {
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
+                .eq(OperatorEntity::getNodeCode, nodeCode)
+                .ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode());
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        if (CollUtil.isNotEmpty(list)) {
+            return list;
+        }
+        return new ArrayList<>();
+    }
+
+    // 澶勭悊鎸囨淳
+    public OperatorEntity handleAssign(FlowModel flowModel) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        NodeModel global = flowModel.getNodes().get(NodeEnum.GLOBAL.getType());
+        String nodeCode = flowModel.getNodeCode();
+        String assignUserId = flowModel.getHandleIds();
+        NodeModel nodeModel = flowModel.getNodes().get(nodeCode);
+        Integer transferState = ObjectUtil.equals(nodeModel.getType(), NodeEnum.PROCESSING.getType()) ?
+                OperatorStateEnum.TRANSFER_PROCESSING.getCode() : OperatorStateEnum.TRANSFER.getCode();
+
+        Integer state = Boolean.FALSE.equals(flowModel.getAutoTransferFlag()) ? OperatorStateEnum.ASSIGNED.getCode() : transferState;
+
+        List<OperatorEntity> operatorList = this.getByNodeCode(taskEntity.getId(), nodeCode);
+        if (CollUtil.isNotEmpty(operatorList)) {
+            // 浣滃簾璁板綍
+            recordMapper.invalid(operatorList);
+            // 鍒犻櫎鍘熸潵鐨勭粡鍔�
+            operatorMapper.deleteByIds(operatorList);
+
+            OperatorEntity operator = operatorList.get(0);
+            operator.setParentId(FlowNature.PARENT_ID);
+            // 鐢熸垚鎸囨淳缁忓姙
+            OperatorEntity entity = this.createOperator(operator, state, assignUserId, global);
+
+            operatorMapper.insert(entity);
+            return entity;
+        } else {
+            OperatorEntity entity = new OperatorEntity();
+            entity.setId(RandomUtil.uuId());
+            NodeModel node = flowModel.getNodes().get(nodeCode);
+            entity.setNodeName(node.getNodeName());
+            List<FlowableTaskModel> currentTask = flowAbleUrl.getCurrentTask(taskEntity.getInstanceId());
+            FlowableTaskModel model = currentTask.stream().filter(e -> e.getTaskKey().equals(nodeCode)).findFirst().orElse(null);
+            if (null == model) {
+                throw new WorkFlowException(MsgCode.FA001.get());
+            }
+            entity.setNodeId(model.getTaskId());
+            entity.setNodeCode(nodeCode);
+            entity.setStatus(state);
+            entity.setTaskId(taskEntity.getId());
+            entity.setEngineType(taskEntity.getEngineType());
+            Boolean flowTodo = serviceUtil.getFlowTodo();
+            if (Boolean.TRUE.equals(flowTodo)) {
+                entity.setSignTime(new Date());
+                entity.setStartHandleTime(new Date());
+            } else {
+                Boolean flowSign = serviceUtil.getFlowSign();
+                if (Boolean.TRUE.equals(flowSign)) {
+                    entity.setSignTime(new Date());
+                } else {
+                    if (global != null && !global.getHasSignFor()) {
+                        entity.setSignTime(new Date());
+                    }
+                }
+            }
+            if (node.getCounterSign().equals(FlowNature.IMPROPER_APPROVER)) {
+                entity.setHandleAll(assignUserId);
+            }
+            entity.setHandleId(assignUserId);
+            entity.setParentId(FlowNature.PARENT_ID);
+            entity.setCompletion(FlowNature.NORMAL);
+            operatorMapper.insert(entity);
+            return entity;
+        }
+    }
+
+    public void handleRevoke(FlowModel flowModel, OperatorEntity operator, RevokeEntity revokeEntity) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        Integer handleStatus = flowModel.getHandleStatus();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
+
+        FlowMethod flowMethod = new FlowMethod();
+        flowMethod.setNodeEntity(nodeEntity);
+        flowMethod.setNodeEntityList(nodeEntityList);
+
+        FlowMsgModel flowMsgModel = new FlowMsgModel();
+        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+        flowMsgModel.setNodeList(nodeEntityList);
+        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+        flowMsgModel.setTaskEntity(taskEntity);
+        flowMsgModel.setNodeCode(operator.getNodeCode());
+        flowMsgModel.setWait(false);
+        List<OperatorEntity> operatorList = new ArrayList<>();
+        OperatorEntity entity = new OperatorEntity();
+        entity.setNodeCode(operator.getNodeCode());
+        entity.setHandleId(taskEntity.getCreatorUserId());
+        operatorList.add(entity);
+        flowMsgModel.setOperatorList(operatorList);
+
+        TaskEntity task = taskMapper.selectById(revokeEntity.getTaskId());
+        boolean endFlag = false;
+        if (ObjectUtil.equals(handleStatus, FlowNature.AUDIT_COMPLETION)) {
+            flowMsgModel.setApprove(true);
+            // 娑堟伅
+            msgUtil.message(flowMsgModel);
+            operator.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+            flowMethod.setType(RecordEnum.AUDIT.getCode());
+        } else {
+            operator.setHandleStatus(FlowNature.REJECT_COMPLETION);
+            flowMethod.setType(RecordEnum.REJECT.getCode());
+            // 缁撴潫
+            endFlag = true;
+        }
+
+        // 缁忓姙璁板綍
+        flowMethod.setFlowModel(flowModel);
+        flowMethod.setOperatorEntity(operator);
+        recordMapper.createRecord(flowMethod);
+
+        operator.setHandleTime(new Date());
+        operator.setCompletion(FlowNature.ACTION);
+        operatorMapper.updateById(operator);
+
+        flowMethod.setTaskEntity(taskEntity);
+        List<CirculateEntity> circulateList = circulateList(flowMethod);
+        flowMethod.setCirculateList(circulateList);
+
+        if (endFlag) {
+            flowMethod.setIsRevoke(true);
+            handleEndTask(flowMethod);
+            revokeMapper.deleteRevoke(taskEntity.getId());
+            return;
+        }
+        // 鍒ゆ柇鎾ら攢缁忓姙鐨勬瘮渚�
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getNodeCode, operator.getNodeCode())
+                .ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode());
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+
+        long count = list.stream().filter(e -> ObjectUtil.equals(e.getHandleStatus(), FlowNature.AUDIT_COMPLETION)).count();
+        if (count == list.size()) {
+            // 鑺傜偣璁板綍
+            NodeRecordModel nodeRecordModel = new NodeRecordModel();
+            nodeRecordModel.setTaskId(operator.getTaskId());
+            nodeRecordModel.setNodeId(operator.getNodeId());
+            nodeRecordModel.setNodeCode(operator.getNodeCode());
+            nodeRecordModel.setNodeName(operator.getNodeName());
+            nodeRecordModel.setNodeStatus(NodeStateEnum.PASS.getCode());
+            nodeRecordMapper.create(nodeRecordModel);
+
+            // 鑺傜偣閫氳繃
+            CompleteFo fo = new CompleteFo();
+            fo.setTaskId(operator.getNodeId());
+            flowAbleUrl.complete(fo);
+
+            flowMethod.setTaskId(revokeEntity.getTaskId());
+            flowMethod.setTaskEntity(taskEntity);
+            this.handleRevokeOperator(flowMethod);
+
+            // 鍒ゆ柇缁撴潫锛屾洿鏂版簮浠诲姟鐨勭姸鎬�
+            if (isFinished(flowModel) && null != task) {
+
+                endRevoke(task);
+
+            }
+        }
+    }
+
+    public OperatorEntity createOperator(OperatorEntity operator, Integer state, String handleId, NodeModel global) {
+        OperatorEntity entity = new OperatorEntity();
+        entity.setId(RandomUtil.uuId());
+        entity.setNodeName(operator.getNodeName());
+        entity.setNodeId(operator.getNodeId());
+        entity.setNodeCode(operator.getNodeCode());
+        entity.setStatus(state);
+        entity.setTaskId(operator.getTaskId());
+        entity.setIsProcessing(operator.getIsProcessing());
+        entity.setEngineType(operator.getEngineType());
+        Boolean flowTodo = serviceUtil.getFlowTodo();
+        if (Boolean.TRUE.equals(flowTodo)) {
+            entity.setSignTime(new Date());
+            entity.setStartHandleTime(new Date());
+        } else {
+            Boolean flowSign = serviceUtil.getFlowSign();
+            if (Boolean.TRUE.equals(flowSign)) {
+                entity.setSignTime(new Date());
+            } else {
+                if (global != null && !global.getHasSignFor()) {
+                    entity.setSignTime(new Date());
+                }
+            }
+        }
+        entity.setHandleId(handleId);
+        entity.setHandleAll(operator.getHandleAll());
+        entity.setParentId(operator.getParentId());
+        entity.setCompletion(FlowNature.NORMAL);
+        return entity;
+    }
+
+    // 澶勭悊瀛愭祦绋�
+    public void handleSubFlow(TemplateNodeEntity nodeEntity, FlowModel flowModel) throws WorkFlowException {
+        if (!nodeEntity.getNodeType().equals(NodeEnum.SUB_FLOW.getType())) {
+            return;
+        }
+        NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        Map<String, List<String>> errorRuleUserList = flowModel.getErrorRuleUserList();
+
+        String templateId = nodeModel.getFlowId();
+        TemplateEntity template = templateMapper.selectById(templateId);
+        if (null == template) {
+            return;
+        }
+        if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.UP.getCode())) {
+            throw new WorkFlowException(MsgCode.WF140.get());
+        }
+        String flowId = template.getFlowId();
+
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(flowId);
+        if (null == jsonEntity) {
+            return;
+        }
+        List<TemplateNodeEntity> subNodeEntityList = templateNodeMapper.getList(jsonEntity.getId());
+        Map<String, NodeModel> subNodes = new HashMap<>();
+        for (TemplateNodeEntity node : subNodeEntityList) {
+            subNodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
+        }
+        FlowMethod method = new FlowMethod();
+        method.setDeploymentId(jsonEntity.getFlowableId());
+        TemplateNodeEntity subStart = subNodeEntityList.stream()
+                .filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+        method.setNodes(subNodes);
+        method.setTaskEntity(flowModel.getTaskEntity());
+        method.setNodeCode(subStart.getNodeCode());
+        method.setNodeEntityList(subNodeEntityList);
+
+        List<NodeModel> nextApprover = flowUtil.getNextApprover(method);
+        boolean autoSubmit = ObjectUtil.equals(nodeModel.getAutoSubmit(), 1);
+        if (autoSubmit) {
+            if (flowUtil.checkBranch(subStart)) {
+                throw new WorkFlowException(MsgCode.WF121.get());
+            }
+            if (!flowUtil.checkNextCandidates(nextApprover)) {
+                throw new WorkFlowException(MsgCode.WF121.get());
+            }
+        }
+
+        String nodeCode = nodeModel.getNodeId();
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        String deploymentId = flowModel.getDeploymentId();
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        String flowableTaskId = flowModel.getFlowableTaskId();
+
+        FlowMethod flowMethod = new FlowMethod();
+        flowMethod.setFlowModel(flowModel);
+        flowMethod.setTaskEntity(taskEntity);
+        flowMethod.setNodeEntity(nodeEntity);
+        flowMethod.setNodeEntityList(nodeEntityList);
+        flowMethod.setErrorRule(true);
+        flowMethod.setExtraRule(true);
+        // 鑾峰彇涓婁竴绾ц妭鐐�
+        List<String> nodeCodeList = new ArrayList<>();
+        flowUtil.prevNodeList(deploymentId, nodeCode, nodeEntityList, nodeCodeList);
+        nodeCodeList = nodeCodeList.stream().distinct().collect(Collectors.toList());
+        String parentCode;
+        if (nodeCodeList.size() == 1) {
+            parentCode = nodeCodeList.get(0);
+        } else if (nodeCodeList.size() > 1) {
+            // 濡傛灉瀛愭祦绋嬫槸鍚堟祦鑺傜偣 灏卞瓨鏈�鍚庝竴涓鎵圭殑鍒嗘祦鑺傜偣
+            QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
+                    .in(OperatorEntity::getNodeCode, nodeCodeList).isNotNull(OperatorEntity::getHandleStatus)
+                    .orderByDesc(OperatorEntity::getHandleTime);
+            List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+            if (CollUtil.isNotEmpty(list)) {
+                parentCode = list.get(0).getNodeCode();
+            } else {
+                parentCode = null;
+            }
+        } else {
+            TemplateNodeEntity startNode = nodeEntityList.stream()
+                    .filter(e -> StringUtils.equals(e.getNodeType(), NodeEnum.START.getType())).findFirst().orElse(new TemplateNodeEntity());
+            parentCode = startNode.getNodeCode();
+        }
+        TemplateNodeEntity parentNode = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(e.getNodeCode(), parentCode)).findFirst().orElse(new TemplateNodeEntity());
+        String formId = parentNode.getFormId();
+        Map<String, Boolean> resMap = new HashMap<>();
+        Map<String, Map<String, Object>> allData = FlowContextHolder.getAllData();
+        Map<String, Object> formData = allData.get(taskEntity.getId() + JnpfConst.SIDE_MARK + formId);
+        if (nodeModel.getIsAsync().equals(FlowNature.CHILD_ASYNC)) {
+            flowMethod.setDeploymentId(deploymentId);
+            flowMethod.setNodeCode(nodeCode);
+            flowMethod.setFormData(formData);
+            flowMethod.setNodes(nodes);
+            flowMethod.setTaskEntity(taskEntity);
+            resMap = conditionUtil.handleCondition(flowMethod);
+            conditionUtil.checkCondition(resMap, nodes);
+        }
+        // 琛ㄥ崟鏁版嵁浼犻��
+        formData = flowUtil.createOrUpdate(flowMethod);
+        flowMethod.setSubFormData(formData);
+
+        List<String> userIds = flowUtil.userListAll(flowMethod);
+        List<UserEntity> userList = serviceUtil.getUserName(userIds, true);
+        if (userList.isEmpty()) {
+            userIds.add(serviceUtil.getAdmin());
+        }
+
+        Integer createRule = nodeModel.getCreateRule();
+        boolean inTurn = ObjectUtil.equals(createRule, 1);
+        int flag = 0;
+        List<FlowModel> subTaskData = new ArrayList<>();
+
+        UserInfo userInfo = flowModel.getUserInfo();
+
+        Map<String, FlowModel> taskMap = new HashMap<>();
+        for (UserEntity user : userList) {
+            flag++;
+            FlowModel model = new FlowModel();
+            model.setSubCode(nodeCode);
+            model.setParentId(taskEntity.getId());
+            model.setDeploymentId(jsonEntity.getFlowableId());
+
+            Map<String, Object> map = new HashMap<>();
+            if (CollUtil.isNotEmpty(formData)) {
+                map = new HashMap<>(formData);
+            }
+            map.put(FlowFormConstant.FLOWID, flowId);
+            model.setFormData(map);
+            model.setFlowId(flowId);
+            model.setErrorRuleUserList(errorRuleUserList);
+
+            // 鑷姩鎻愪氦 0.鍚�
+            if (autoSubmit) {
+                model.setStatus(TaskStatusEnum.RUNNING.getCode());
+            } else {
+                model.setSubFlow(true);
+            }
+
+            SubParameterModel subParameter = new SubParameterModel();
+            subParameter.setParentCode(parentCode);
+            subParameter.setNodeId(flowableTaskId);
+            model.setSubParameter(subParameter);
+
+            UserInfo info = JsonUtil.getJsonToBean(userInfo, UserInfo.class);
+            info.setUserName(user.getRealName());
+            info.setUserAccount(user.getAccount());
+            info.setUserId(user.getId());
+            model.setUserInfo(info);
+
+            model.setIsAsync(nodeModel.getIsAsync());
+            model.setIsFlow(1);
+
+            TaskEntity subTask = new TaskEntity();
+            subTask.setCreatorUserId(user.getId());
+            model.setTaskEntity(subTask);
+
+            // 渚濇鍒涘缓锛屽彧鍒涘缓绗竴涓汉鐨勶紝瀛樺偍鍚庣画鐨勪汉鍛樺弬鏁�
+            if (inTurn && flag > 1) {
+                subTaskData.add(model);
+                continue;
+            }
+
+            if (nodeModel.getAutoSubmit().equals(1)) {
+                model.setNodeEntityList(subNodeEntityList);
+                if (flowUtil.checkNextError(model, nextApprover, false, false) != 0) {
+                    throw new WorkFlowException(MsgCode.WF121.get());
+                }
+            }
+
+            UserProvider.setLocalLoginUser(info);
+            // 鐢熸垚浠诲姟锛屾牴鎹槸鍚﹁嚜鍔ㄥ彂璧疯繘琛屾彁浜�
+            try {
+                saveOrSubmit(model);
+                // 缁勮娑堟伅鍙戦�佺殑浜�
+                OperatorEntity operator = new OperatorEntity();
+                operator.setHandleId(user.getId());
+                operator.setNodeCode(nodeEntity.getNodeCode());
+                // 瀛愭祦绋嬩换鍔�
+                TaskEntity task = model.getTaskEntity();
+                operator.setTaskId(task.getId());
+
+                List<OperatorEntity> operatorList = new ArrayList<>();
+                operatorList.add(operator);
+
+                // 娑堟伅
+                if (ObjectUtil.equals(nodeModel.getAutoSubmit(), 0)) {
+                    FlowMsgModel flowMsgModel = new FlowMsgModel();
+                    flowMsgModel.setOperatorList(operatorList);
+                    flowMsgModel.setNodeList(nodeEntityList);
+                    flowMsgModel.setUserInfo(flowModel.getUserInfo());
+                    flowMsgModel.setTaskEntity(task);
+                    flowMsgModel.setNodeCode(nodeCode);
+                    flowMsgModel.setWait(false);
+                    flowMsgModel.setLaunch(true);
+                    flowMsgModel.setFormData(FlowContextHolder.getAllData());
+                    msgUtil.message(flowMsgModel);
+                }
+
+                taskMap.put(task.getId(), model);
+            } catch (WorkFlowException e) {
+                throw new WorkFlowException(MsgCode.WF121.get());
+            }
+        }
+
+        // 淇濆瓨渚濇鍒涘缓鐨勫瓙娴佺▼鏁版嵁
+        subtaskDataMapper.save(subTaskData);
+        for (Map.Entry<String, FlowModel> stringFlowModelEntry : taskMap.entrySet()) {
+            String taskId = stringFlowModelEntry.getKey();
+            FlowModel model = taskMap.get(taskId);
+            if (model == null) {
+                continue;
+            }
+            this.autoAudit(model);
+        }
+
+        UserProvider.setLocalLoginUser(userInfo);
+
+        // 寮傛锛岀洿鎺ラ�氳繃鑺傜偣锛屽悗缁户缁�掑綊涓嬩竴绾ц妭鐐圭敓鎴愮粡鍔�
+        if (nodeModel.getIsAsync().equals(FlowNature.CHILD_ASYNC)) {
+            flowMethod.setFlowableTaskId(flowableTaskId);
+            flowMethod.setResMap(resMap);
+            completeNode(flowMethod);
+        }
+
+        //瀛愭祦绋嬭嚜鍔ㄥ鎵癸紝鏇存柊涓绘祦绋嬬殑褰撳墠鑺傜偣
+        String instanceId = taskEntity.getInstanceId();
+        List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
+        if (CollUtil.isEmpty(taskModelList)) {
+            return;
+        }
+        updateCurrentNode(taskModelList, nodes, taskEntity);
+    }
+
+    // 瀹屾垚鑺傜偣
+    public void completeNode(FlowMethod flowMethod) throws WorkFlowException {
+        FlowModel flowModel = flowMethod.getFlowModel();
+        String flowableTaskId = flowMethod.getFlowableTaskId();
+        Map<String, Boolean> resMap = flowMethod.getResMap();
+        TaskEntity taskEntity = flowMethod.getTaskEntity();
+        taskLineMapper.create(taskEntity.getId(), resMap);
+        CompleteFo completeFo = new CompleteFo();
+        completeFo.setTaskId(flowableTaskId);
+        completeFo.setVariables(new HashMap<>(resMap));
+        flowAbleUrl.complete(completeFo);
+
+        this.addTask(ImmutableList.of(taskEntity.getId()));
+        if (isFinished(flowModel)) {
+            return;
+        }
+
+        // 鐢熸垚缁忓姙
+        List<OperatorEntity> operatorEntities = handleOperator(flowModel);
+
+        List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
+        FlowMsgModel flowMsgModel = new FlowMsgModel();
+        flowMsgModel.setNodeList(nodeEntityList);
+        flowMsgModel.setTaskEntity(taskEntity);
+        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+        flowMsgModel.setOperatorList(operatorEntities);
+        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+        msgUtil.message(flowMsgModel);
+
+        if (taskEntity.getRejectDataId() == null) {
+            this.autoAudit(flowModel);
+        }
+    }
+
+    public void autoAudit(FlowModel flowModel) throws WorkFlowException {
+        flowModel.setAutoAudit(true);
+        this.autoAudit(flowModel, true);
+    }
+
+    public void autoAudit(FlowModel flowModel, Boolean flag) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        if (null == taskEntity) {
+            return;
+        }
+        flowModel.setBranchList(new ArrayList<>());
+        String taskId = taskEntity.getId();
+        List<OperatorEntity> operatorList = operatorMapper.getList(taskId);
+        operatorList = operatorList.stream().filter(e -> !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.BACK.getCode())
+                && !ObjectUtil.equals(e.getCompletion(), FlowNature.ACTION)).collect(Collectors.toList());
+        this.autoAudit(flowModel, operatorList, flag);
+    }
+
+    @DSTransactional
+    public void autoAudit(FlowModel flowModel, List<OperatorEntity> operatorList, Boolean flag) throws WorkFlowException {
+        // flag鏍囪瘑涓簍rue鏃� 闇�瑕佹帓闄ゆ湭婵�娲荤殑缁忓姙
+        if (Boolean.TRUE.equals(flag)) {
+            operatorList = operatorList.stream()
+                    .filter(e -> !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.WAITING.getCode())).collect(Collectors.toList());
+        }
+        if (CollUtil.isEmpty(operatorList)) {
+            return;
+        }
+        String deploymentId = flowModel.getDeploymentId();
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        TemplateNodeEntity globalEntity = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(NodeEnum.GLOBAL.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+
+        flowModel.setSignImg(null);
+        flowModel.setFileList(null);
+        Map<String, List<OperatorEntity>> map = operatorList.stream().collect(Collectors.groupingBy(OperatorEntity::getNodeCode));
+        List<String> handleIds = operatorList.stream().map(OperatorEntity::getHandleId).distinct().collect(Collectors.toList());
+        List<UserEntity> users = serviceUtil.getUserName(handleIds);
+        for (Map.Entry<String, List<OperatorEntity>> entry : map.entrySet()) {
+            String key = entry.getKey();
+
+            NodeModel model = nodes.get(key);
+            String modelFormId = model.getFormId();
+            modelFormId = StringUtils.isNotBlank(modelFormId) ? modelFormId : globalEntity.getFormId();
+            Map<String, Object> formData = serviceUtil.infoData(modelFormId, taskEntity.getId());
+            // 鑾峰彇娴佺▼鍙傛暟
+            getGlobalParam(taskEntity, model, global, formData);
+            flowModel.setTaskEntity(taskEntity);
+            FlowMethod flowMethod = new FlowMethod();
+            flowMethod.setTaskEntity(taskEntity);
+            flowMethod.setFormData(formData);
+            flowMethod.setDeploymentId(deploymentId);
+            flowMethod.setNodeCode(key);
+            flowMethod.setNodes(nodes);
+            // 鍒ゆ柇鑺傜偣鐨勭嚎鐨勬潯浠�
+            Map<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
+            try {
+                conditionUtil.checkCondition(resMap, nodes);
+            } catch (WorkFlowException e) {
+                continue;
+            }
+            List<NodeModel> nextApprover;
+            boolean mark = true;
+            try {
+                nextApprover = flowUtil.getNextApprover(flowMethod);
+            } catch (WorkFlowException e) {
+                nextApprover = null;
+                mark = false;
+            }
+            if (!mark) {
+                continue;
+            }
+            List<OperatorEntity> list = map.get(key);
+            if (CollUtil.isNotEmpty(list)) {
+                flowModel.setOperatorEntity(list.get(0));
+            }
+            boolean isBranch = flowUtil.checkBranch(model);
+            boolean nextCandidates = flowUtil.checkNextCandidates(nextApprover);
+            int nextError = flowUtil.checkNextError(flowModel, nextApprover, false, false);
+            if (!isBranch && nextCandidates && nextError == 0) {
+                for (OperatorEntity operator : list) {
+                    operator = operatorMapper.selectById(operator.getId());
+                    if (null == operator || ObjectUtil.equals(operator.getCompletion(), FlowNature.ACTION)) {
+                        continue;
+                    }
+                    String handleId = operator.getHandleId();
+                    String username = "";
+                    String userId = "";
+                    String userName = "";
+                    String userAccount = "";
+                    UserEntity user = users.stream().filter(e -> ObjectUtil.equals(e.getId(), handleId)).findFirst().orElse(null);
+                    if (user != null) {
+                        username = user.getAccount() + "(" + user.getRealName() + ")";
+                        userId = user.getId();
+                        userName = user.getRealName();
+                        userAccount = user.getAccount();
+                    }
+                    String str = ObjectUtil.equals(operator.getIsProcessing(), FlowNature.NOT_PROCESSING) ? "鑷姩瀹℃壒閫氳繃" : "鑷姩鍔炵悊閫氳繃";
+                    flowModel.setHandleOpinion(username + str);
+                    FlowMethod method = new FlowMethod();
+                    method.setOperatorEntity(operator);
+                    method.setNodeModel(global);
+                    method.setFlowModel(flowModel);
+                    if (this.handleGlobalAuto(method)) {
+                        if (taskEntity.getEndTime() != null) {
+                            return;
+                        }
+                        UserInfo userInfo = flowModel.getUserInfo();
+                        UserInfo info = JsonUtil.getJsonToBean(userInfo, UserInfo.class);
+                        info.setUserId(userId);
+                        info.setUserAccount(userAccount);
+                        info.setUserName(userName);
+                        UserProvider.setLocalLoginUser(info);
+
+                        flowModel.setUserInfo(info);
+                        flowModel.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+                        audit(operator, flowModel);
+                        UserProvider.setLocalLoginUser(userInfo);
+                        if (taskEntity.getRejectDataId() == null) {
+                            this.autoAudit(flowModel);
+                        }
+                    }
+                }
+            }
+
+        }
+
+    }
+
+    // 寮傚父琛ュ伩
+    public void compensate(TaskEntity taskEntity) throws WorkFlowException {
+        String instanceId = taskEntity.getInstanceId();
+        CompensateFo fo = new CompensateFo();
+        fo.setInstanceId(instanceId);
+        List<String> sourceList = Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList());
+        fo.setSource(sourceList);
+        List<FlowableTaskModel> models = flowAbleUrl.compensate(fo);
+
+        if (CollUtil.isNotEmpty(models)) {
+            FlowableTaskModel flowableTaskModel = models.get(0);
+            // 瀹炰緥ID涓嶄竴鏍凤紝鏇存柊
+            String newInstanceId = flowableTaskModel.getInstanceId();
+            if (StringUtils.isNotBlank(newInstanceId) && !instanceId.equals(newInstanceId)) {
+                taskEntity.setInstanceId(newInstanceId);
+                taskMapper.updateById(taskEntity);
+            }
+            List<NodeRecordEntity> nodeRecords = nodeRecordMapper.getNodeRecord(taskEntity.getId());
+            List<String> nodeIds = nodeRecords.stream().map(NodeRecordEntity::getNodeId).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+            // 鏇存柊缁忓姙鍏宠仈鐨刦lowable鐨勪换鍔d
+            List<OperatorEntity> operatorList = operatorMapper.getList(taskEntity.getId());
+            List<OperatorEntity> updateList = new ArrayList<>();
+            // 鏇存柊璁板綍鍏宠仈鐨刦lowable鐨勪换鍔d
+            List<RecordEntity> recordList = recordMapper.getList(taskEntity.getId());
+            List<RecordEntity> updateRecordList = new ArrayList<>();
+            //澶栭儴鑺傜偣
+            List<EventLogEntity> eventLogList = eventLogMapper.getList(taskEntity.getId());
+            List<EventLogEntity> updateEventLogList = new ArrayList<>();
+
+            if (CollUtil.isNotEmpty(nodeIds)) {
+                // 鍦ㄨ妭鐐硅褰曚腑鐨勫瓨鍦ㄧ殑nodeId锛屼笉闇�瑕佹洿鏂�
+                operatorList = operatorList.stream().filter(e -> !nodeIds.contains(e.getNodeId())).collect(Collectors.toList());
+                recordList = recordList.stream().filter(e -> !nodeIds.contains(e.getNodeId())).collect(Collectors.toList());
+            }
+
+            for (FlowableTaskModel model : models) {
+                List<OperatorEntity> list = operatorList.stream()
+                        .filter(e -> e.getNodeCode().equals(model.getTaskKey())).collect(Collectors.toList());
+                list.forEach(e -> e.setNodeId(model.getTaskId()));
+                updateList.addAll(list);
+                // 璁板綍淇敼
+                List<RecordEntity> collect = recordList.stream()
+                        .filter(e -> e.getNodeCode().equals(model.getTaskKey())).collect(Collectors.toList());
+                collect.forEach(e -> e.setNodeId(model.getTaskId()));
+                updateRecordList.addAll(collect);
+                //澶栭儴鑺傜偣
+                List<EventLogEntity> logList = eventLogList.stream()
+                        .filter(e -> e.getNodeCode().equals(model.getTaskKey())).collect(Collectors.toList());
+                logList.forEach(e -> e.setNodeId(model.getTaskId()));
+                updateEventLogList.addAll(logList);
+            }
+            operatorMapper.updateById(updateList);
+            recordMapper.updateRecords(updateRecordList);
+            eventLogMapper.updateById(updateEventLogList);
+        }
+        if (!ObjectUtil.equals(taskEntity.getParentId(), FlowNature.PARENT_ID)) {
+            TaskEntity parent = taskMapper.selectById(taskEntity.getParentId());
+            if (null == parent) {
+                return;
+            }
+            this.compensate(parent);
+            List<FlowableTaskModel> currentModel = flowAbleUrl.getCurrentTask(parent.getInstanceId());
+            FlowableTaskModel model = currentModel.stream().filter(e -> ObjectUtil.equals(taskEntity.getSubCode(), e.getTaskKey())).findFirst().orElse(null);
+            if (null != model) {
+                SubParameterModel subParameter = JsonUtil.getJsonToBean(taskEntity.getSubParameter(), SubParameterModel.class);
+                subParameter.setNodeId(model.getTaskId());
+                taskEntity.setSubParameter(JsonUtil.getObjectToString(subParameter));
+                taskMapper.updateById(taskEntity);
+            }
+        }
+    }
+
+    /**
+     * 鏍¢獙缁忓姙鐨勪换鍔℃槸鍚︽殏鍋�
+     *
+     * @param ids     缁忓姙涓婚敭闆嗗悎
+     * @param resList 缁撴灉缁忓姙涓婚敭闆嗗悎
+     * @param flag    true鍒欏垽鏂��绛�
+     */
+    public void checkBatch(List<String> ids, List<String> resList, Boolean flag) throws WorkFlowException {
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().in(OperatorEntity::getId, ids);
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        List<String> taskIds = list.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
+        List<TaskEntity> taskEntityList = taskIds.isEmpty() ? new ArrayList<>() : taskMapper.selectByIds(taskIds);
+
+        for (OperatorEntity operator : list) {
+            TaskEntity taskEntity = taskEntityList.stream()
+                    .filter(e -> !Objects.equals(e.getStatus(), TaskStatusEnum.PAUSED.getCode())
+                            && e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
+            if (null != taskEntity) {
+                resList.add(operator.getId());
+            }
+        }
+        if (CollUtil.isEmpty(resList)) {
+            throw new WorkFlowException(MsgCode.WF112.get());
+        }
+
+        if (Boolean.TRUE.equals(flag)) {
+            resList.clear();
+            List<String> flowIds = taskEntityList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
+            List<TemplateNodeEntity> globalList = templateNodeMapper.getList(flowIds, NodeEnum.GLOBAL.getType());
+            for (OperatorEntity operator : list) {
+                TaskEntity taskEntity = taskEntityList.stream()
+                        .filter(e -> e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
+                if (null != taskEntity) {
+                    TemplateNodeEntity globalEntity = globalList.stream()
+                            .filter(e -> e.getFlowId().equals(taskEntity.getFlowId())).findFirst().orElse(null);
+                    if (null != globalEntity) {
+                        NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
+                        // 寮�鍚鏀讹紝鍏佽閫�绛�
+                        if (Boolean.TRUE.equals(global.getHasSignFor())) {
+                            resList.add(operator.getId());
+                        }
+                    }
+                }
+            }
+            if (CollUtil.isEmpty(resList)) {
+                throw new WorkFlowException(MsgCode.WF080.get());
+            }
+        }
+    }
+
+    public void checkBatchRevoke(List<String> ids, List<String> resList, Integer batchType) throws WorkFlowException {
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().in(OperatorEntity::getId, ids);
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        List<Integer> status = ImmutableList.of(2, 3);
+        for (OperatorEntity operator : list) {
+            if (status.contains(batchType) && ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.REVOKE.getCode())) {
+                continue;
+            }
+            resList.add(operator.getId());
+        }
+        if (CollUtil.isEmpty(resList)) {
+            if (ObjectUtil.equals(batchType, 2)) {
+                throw new WorkFlowException(MsgCode.WF126.get());
+            } else if (ObjectUtil.equals(batchType, 3)) {
+                throw new WorkFlowException(MsgCode.WF127.get());
+            }
+        }
+    }
+
+    // 鍒ゆ柇缁堟
+    public void checkCancel(List<String> ids, List<String> resList) throws WorkFlowException {
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().in(OperatorEntity::getId, ids);
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        List<String> taskIds = list.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
+        List<TaskEntity> taskEntityList = taskIds.isEmpty() ? new ArrayList<>() : taskMapper.selectByIds(taskIds);
+
+        for (OperatorEntity operator : list) {
+            TaskEntity taskEntity = taskEntityList.stream()
+                    .filter(e -> !Objects.equals(e.getStatus(), TaskStatusEnum.CANCEL.getCode())
+                            && e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
+            if (null != taskEntity) {
+                resList.add(operator.getId());
+            }
+        }
+        if (CollUtil.isEmpty(resList)) {
+            throw new WorkFlowException(MsgCode.WF123.get());
+        }
+    }
+
+    // 鏇存柊缁忓姙鐨勬帴鏀舵椂闂�
+    public void updateCreateTime(FlowModel flowModel) {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        String taskId = taskEntity.getId();
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
+                .isNull(OperatorEntity::getHandleStatus);
+        List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+        if (CollUtil.isNotEmpty(list)) {
+            list.forEach(e -> e.setCreatorTime(new Date()));
+            operatorMapper.updateById(list);
+            addOperatorList(list, flowModel);
+        }
+    }
+
+    /**
+     * 娣诲姞浜嬩欢鍒扮嚎绋嬪彉閲�
+     */
+    public void addEvent(FlowModel flowModel) {
+        Integer status = flowModel.getEventStatus();
+        FlowModel model = new FlowModel();
+        model.setTaskEntity(flowModel.getTaskEntity());
+        model.setNodeEntity(flowModel.getNodeEntity());
+        model.setNodes(flowModel.getNodes());
+        model.setFormData(flowModel.getFormData());
+        if (ObjectUtil.equals(EventEnum.END.getStatus(), status)) {
+            List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+            TemplateNodeEntity start = nodeEntityList.stream()
+                    .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.START.getType())).findFirst().orElse(null);
+            if (null != start) {
+                model.setNodeEntity(start);
+            }
+        }
+        FlowEventHolder.addEvent(status, model, FlowContextHolder.getAllData());
+    }
+
+    /**
+     * 澶勭悊绾跨▼鍙橀噺涓殑瓒呮椂
+     */
+    public void handleOperator() {
+        List<FlowOperatorModel> operatorListAll = FlowOperatorHolder.getOperatorList();
+        for (FlowOperatorModel model : operatorListAll) {
+            List<OperatorEntity> list = model.getList() != null ? model.getList() : new ArrayList<>();
+            Map<String, Map<String, Object>> allData = model.getAllData();
+            Map<String, List<OperatorEntity>> taskMap = list.stream().collect(Collectors.groupingBy(OperatorEntity::getTaskId));
+            for (Map.Entry<String, List<OperatorEntity>> stringListEntry : taskMap.entrySet()) {
+                String taskId = stringListEntry.getKey();
+
+                List<OperatorEntity> operatorList = taskMap.get(taskId) != null ? taskMap.get(taskId) : new ArrayList<>();
+                Map<String, List<OperatorEntity>> operatorMap = operatorList.stream().collect(Collectors.groupingBy(OperatorEntity::getNodeCode));
+                for (Map.Entry<String, List<OperatorEntity>> entry : operatorMap.entrySet()) {
+                    String nodeCode = entry.getKey();
+
+                    List<OperatorEntity> operator = operatorMap.get(nodeCode) != null ? operatorMap.get(nodeCode) : new ArrayList<>();
+                    if (operator.isEmpty()) {
+                        continue;
+                    }
+                    FlowModel flowModel = JsonUtil.getJsonToBean(model.getFlowModel(), FlowModel.class);
+                    Map<String, NodeModel> nodes = flowModel.getNodes();
+                    NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+                    NodeModel nodeModel = nodes.get(nodeCode);
+                    String modelFormId = nodeModel.getFormId();
+                    modelFormId = StringUtils.isNotBlank(modelFormId) ? modelFormId : global.getFormId();
+                    Map<String, Object> formData = allData.get(taskId + JnpfConst.SIDE_MARK + modelFormId);
+                    if (formData != null) {
+                        flowModel.setFormData(formData);
+                    }
+                    TimeUtil.timeModel(operator, flowModel, redisUtil);
+
+                }
+
+
+            }
+
+
+        }
+        FlowOperatorHolder.clear();
+    }
+
+    /**
+     * 娣诲姞瓒呮椂鍒扮嚎绋嬪彉閲�
+     */
+    public void addOperatorList(List<OperatorEntity> list, FlowModel flowModel) {
+        if (!list.isEmpty()) {
+            FlowOperatorModel model = new FlowOperatorModel();
+            model.setList(JsonUtil.getJsonToList(list, OperatorEntity.class));
+            model.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class));
+            FlowOperatorHolder.addOperator(model, FlowContextHolder.getAllData());
+        }
+    }
+
+    //淇濆瓨娴佺▼id
+    public void addTask(List<String> taskIdList) {
+        FlowStatusHolder.addTaskIdList(taskIdList);
+    }
+
+    //鍒犻櫎娴佺▼id
+    public void addDelTask(String taskId, String flowId) {
+        FlowStatusHolder.addDelTaskIdList(taskId, flowId);
+    }
+
+    public List<OperatorEntity> getList(String taskId, List<String> nodeCodes) {
+        if (StringUtils.isEmpty(taskId)) {
+            return new ArrayList<>();
+        }
+        QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).ne(OperatorEntity::getStatus, OperatorStateEnum.FUTILITY.getCode());
+        if (CollUtil.isNotEmpty(nodeCodes)) {
+            queryWrapper.lambda().in(OperatorEntity::getNodeCode, nodeCodes);
+        }
+        queryWrapper.lambda().orderByDesc(OperatorEntity::getCreatorTime);
+        return operatorMapper.selectList(queryWrapper);
+    }
+
+    public void deleteInTurnOperator(OperatorEntity operator, String handleId) {
+        List<String> handleAll = new ArrayList<>();
+        if (operator.getHandleAll() != null) {
+            handleAll = Arrays.stream(operator.getHandleAll().split(",")).collect(Collectors.toList());
+        } else {
+            String handleParameter = operator.getHandleParameter();
+            AddSignModel addSignModel = JsonUtil.getJsonToBean(handleParameter, AddSignModel.class);
+            if (ObjectUtil.equals(addSignModel.getCounterSign(), FlowNature.IMPROPER_APPROVER)) {
+                handleAll = addSignModel.getAddSignUserIdList();
+            }
+        }
+        int index = handleAll.indexOf(handleId);
+        if (index != -1 && index < handleAll.size() - 1) {
+            String nextHandleId = handleAll.get(index + 1);
+            QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(OperatorEntity::getNodeId, operator.getNodeId())
+                    .eq(OperatorEntity::getHandleId, nextHandleId);
+            List<OperatorEntity> deleteList = operatorMapper.selectList(queryWrapper);
+            if (CollUtil.isNotEmpty(deleteList)) {
+                operatorMapper.deleteByIds(deleteList);
+            }
+        }
+    }
+
+    public void deleteStepOperator(OperatorEntity operator) {
+        if (operator != null) {
+            QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId());
+            List<OperatorEntity> list = operatorMapper.selectList(queryWrapper);
+            List<OperatorEntity> deleteList = list.stream().filter(e -> Objects.equals(e.getHandleAll(), operator.getId())).collect(Collectors.toList());
+            if (CollUtil.isNotEmpty(deleteList)) {
+                operatorMapper.deleteByIds(deleteList);
+            }
+        }
+    }
+
+    // 澶勭悊宓屽叆鐨勪换鍔℃祦绋�
+    public void handleTrigger(OperatorEntity operatorEntity, FlowModel flowModel) throws WorkFlowException {
+        String nodeCode = operatorEntity.getNodeCode();
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        List<String> nextList = new ArrayList<>();
+        nextList = getNextList(flowModel.getDeploymentId(), nodeCode, nodes, nextList);
+        if (CollUtil.isEmpty(nextList)) {
+            return;
+        }
+
+        Integer action = flowModel.getAction();
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        String flowId = taskEntity.getFlowId();
+        Map<String, Object> formData = flowModel.getFormData();
+        List<SystemAuditModel> systemList = SystemAuditHolder.getAll();
+
+        // 瀛樺湪鍚屾
+        boolean isAsync = false;
+
+        List<String> approveNode = new ArrayList<>();
+        Map<String, NodeModel> triggers = new HashMap<>();
+        for (String next : nextList) {
+            NodeModel nodeModel = nodes.get(next);
+            if (null != nodeModel) {
+                if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.TRIGGER.getType())) {
+                    if (ObjectUtil.equals(nodeModel.getIsAsync(), FlowNature.CHILD_SYNC)) {
+                        isAsync = true;
+                    }
+                    triggers.put(next, nodeModel);
+                } else {
+                    approveNode.add(nodeModel.getNodeId());
+                }
+            }
+        }
+
+        if (CollUtil.isEmpty(triggers)) {
+            return;
+        }
+        //娓呯┖绯荤粺瀹℃壒
+        SystemAuditHolder.clear();
+        Boolean rejectTrigger = flowModel.getRejectTrigger();
+        boolean isBack = ObjectUtil.equals(action, ActionEnum.BACK.getCode());
+        if (isBack || Boolean.TRUE.equals(rejectTrigger)) {
+            OutgoingFlowsFo flowsFo = new OutgoingFlowsFo();
+            flowsFo.setDeploymentId(flowModel.getDeploymentId());
+            flowsFo.setTaskKey(nodeCode);
+            List<String> outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo);
+            Map<String, Boolean> variables = new HashMap<>();
+            for (String line : outgoingFlows) {
+                variables.put(line, true);
+            }
+            if (isBack) {
+                List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+                TemplateNodeEntity end = nodeEntityList.stream()
+                        .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.END.getType())).findFirst().orElse(null);
+                if (null != end) {
+                    // 灏嗙洰鏍囨槸缁撴潫鑺傜偣鐨勭嚎 鐨勫�煎彉鏇翠负false
+                    FlowableNodeModel info = flowAbleUrl.getElementInfo(flowModel.getDeploymentId(), end.getNodeCode());
+                    List<String> incomingList = info.getIncomingList();
+                    if (CollUtil.isNotEmpty(incomingList)) {
+                        for (String key : variables.keySet()) {
+                            if (incomingList.contains(key)) {
+                                variables.put(key, false);
+                            }
+                        }
+                    }
+                }
+            }
+            taskLineMapper.create(taskEntity.getId(), variables);
+            complete(operatorEntity.getNodeId(), new HashMap<>(variables));
+        } else {
+            // 寮傛澶勭悊
+            if (!isAsync && CollUtil.isNotEmpty(systemList)) {
+                for (SystemAuditModel model : systemList) {
+                    try {
+                        this.autoAudit(model.getOperator(), model.getFlowModel());
+                    } catch (Exception e) {
+                        e.getMessage();
+                    }
+                }
+                systemList = new ArrayList<>();
+            }
+        }
+
+        UserInfo userInfo = UserProvider.getUser();
+        List<ExecuteModel> list = new ArrayList<>();
+        for (String key : triggers.keySet()) {
+            NodeModel nodeModel = nodes.get(key);
+            if (null == nodeModel || (ObjectUtil.equals(nodeModel.getTriggerEvent(), 2)
+                    && !nodeModel.getActionList().contains(action))) {
+                continue;
+            }
+
+            List<OperatorEntity> operatorList = new ArrayList<>();
+            List<TaskEntity> subTaskList = new ArrayList<>();
+            Boolean sync = ObjectUtil.equals(nodeModel.getIsAsync(), FlowNature.CHILD_SYNC);
+            if (Boolean.TRUE.equals(sync) && CollUtil.isNotEmpty(approveNode)) {
+                // 瀛愭祦绋嬬殑澶勭悊
+                List<TaskEntity> childTaskList = new ArrayList<>();
+                childTaskList.addAll(taskMapper.getSubTask(taskEntity.getId(), approveNode));
+                if (CollUtil.isNotEmpty(childTaskList)) {
+                    List<String> idAll = new ArrayList<>();
+                    taskMapper.deleTaskAll(childTaskList.stream().map(TaskEntity::getId).collect(Collectors.toList()), idAll);
+                    if (!idAll.isEmpty()) {
+                        QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.lambda().in(TaskEntity::getId, idAll);
+                        subTaskList.addAll(taskMapper.selectList(queryWrapper));
+                        for (TaskEntity subTask : subTaskList) {
+                            Integer status = subTask.getStatus();
+                            subTask.setHisStatus(status);
+                            subTask.setStatus(TaskStatusEnum.WAITING.getCode());
+                            operatorList.addAll(operatorMapper.getList(subTask.getId()));
+                        }
+                        taskMapper.updateById(subTaskList);
+                    }
+                }
+                //瀹℃壒鏁版嵁,鎺掗櫎绯荤粺鐢ㄦ埛
+                operatorList.addAll(this.getList(taskEntity.getId(), approveNode).stream().filter(e -> !Objects.equals(FlowNature.SYSTEM_CODE, e.getHandleId())).collect(Collectors.toList()));
+                if (CollUtil.isNotEmpty(operatorList)) {
+                    for (OperatorEntity operator : operatorList) {
+                        operator.setStatus(OperatorStateEnum.WAITING.getCode());
+                    }
+                    operatorMapper.updateById(operatorList);
+                }
+            }
+            List<Map<String, Object>> dataList = new ArrayList<>();
+            dataList.add(formData);
+            FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+            model.setUserInfo(userInfo);
+            ExecuteModel executeModel = new ExecuteModel();
+            executeModel.setFlowId(flowId);
+            executeModel.setDataList(dataList);
+            executeModel.setTaskId(taskEntity.getId());
+            executeModel.setInstanceId(taskEntity.getInstanceId());
+            executeModel.setGroupId(nodeModel.getGroupId());
+            executeModel.setNodeCode(nodeCode);
+            executeModel.setNodeId(operatorEntity.getNodeId());
+            executeModel.setOperatorId(operatorEntity.getId());
+            executeModel.setTriggerKey(key);
+            executeModel.setIsAsync(nodeModel.getIsAsync());
+            executeModel.setFlowModel(model);
+            executeModel.setSync(sync);
+            if (isBack || Boolean.TRUE.equals(rejectTrigger)) {
+                try {
+                    operatorExecute(executeModel);
+                } catch (Exception e) {
+                    e.getMessage();
+                }
+                flowModel.setBackId(executeModel.getCurrentNodeId());
+            } else {
+                if (Boolean.TRUE.equals(sync)) {
+                    executeModel.setOperatorList(operatorList);
+                    executeModel.setSubTaskList(subTaskList);
+                    executeModel.setSystemList(systemList);
+                }
+                list.add(executeModel);
+            }
+        }
+        List<Boolean> resultList = new ArrayList<>();
+        try {
+            for (ExecuteModel model : list) {
+                boolean async = this.operatorExecute(model);
+                if (!async) {
+                    resultList.add(async);
+                }
+            }
+        } catch (Exception e) {
+            e.getMessage();
+        }
+        if (resultList.isEmpty()) {
+            List<TriggerLaunchflowEntity> launchFlowList = getLaunchFlowList(taskEntity.getId());
+            if (launchFlowList.isEmpty()) {
+                executeAudit(list, flowModel);
+            }
+        }
+    }
+
+    public List<TriggerLaunchflowEntity> getLaunchFlowList(String taskId) {
+        List<TriggerTaskEntity> triggerList = triggerTaskMapper.getListByTaskId(taskId, null);
+        List<String> triggerIdList = triggerList.stream().map(TriggerTaskEntity::getId).collect(Collectors.toList());
+        return triggerLaunchflowMapper.getTriggerList(triggerIdList);
+    }
+
+    // 閫氳繃taskId
+    public List<TriggerLaunchflowEntity> getTaskList(String taskId) {
+        return getTaskList(taskId, null);
+    }
+
+    // 閫氳繃taskId
+    public List<TriggerLaunchflowEntity> getTaskList(String taskId, List<String> nodeCode) {
+        return triggerLaunchflowMapper.getTaskList(ImmutableList.of(taskId), nodeCode);
+    }
+
+    public boolean operatorExecute(ExecuteModel model) throws WorkFlowException {
+        boolean result = true;
+        Boolean isAsync = model.getSync();
+        FlowModel flowModel = model.getFlowModel();
+        try {
+            execute(model);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 缁堟娴佺▼
+            if (Boolean.TRUE.equals(isAsync)) {
+                TaskEntity taskEntity = flowModel.getTaskEntity();
+                cancel(taskEntity.getId(), flowModel, true);
+                result = false;
+            }
+        }
+        return result;
+    }
+
+    public void executeAudit(List<ExecuteModel> list, FlowModel flowModel) {
+        for (ExecuteModel model : list) {
+            List<OperatorEntity> operatorList = model.getOperatorList();
+            if (CollUtil.isNotEmpty(operatorList)) {
+                for (OperatorEntity operator : operatorList) {
+                    operator.setStatus(OperatorStateEnum.RUNING.getCode());
+                }
+                operatorMapper.updateById(operatorList);
+            }
+            List<TaskEntity> subTaskList = model.getSubTaskList();
+            if (CollUtil.isNotEmpty(subTaskList)) {
+                for (TaskEntity taskEntity : subTaskList) {
+                    Integer hisStatus = taskEntity.getHisStatus();
+                    taskEntity.setStatus(hisStatus);
+                }
+                taskMapper.updateById(subTaskList);
+            }
+            List<SystemAuditModel> systemList = model.getSystemList();
+            if (CollUtil.isNotEmpty(systemList)) {
+                for (SystemAuditModel systemAuditModel : systemList) {
+                    try {
+                        autoAudit(systemAuditModel.getOperator(), systemAuditModel.getFlowModel());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+            try {
+                autoAudit(flowModel, true);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 鍏堝皢娴佺▼鐘舵�佸悓姝ュ埌涓氬姟琛紝鍐嶆淳鍙戠嚎绋嬪彉閲忎腑鐨勬祦绋嬩簨浠躲��
+     */
+    public void handleTaskStatusThenEvent() {
+        handleTaskStatus();
+        handleEvent();
+    }
+
+    /**
+     * 鍏堝皢娴佺▼鐘舵�佸悓姝ュ埌涓氬姟琛紝鍐嶆淳鍙戝彂璧枫�佹挙鍥炵瓑鐩存帴浜嬩欢銆�
+     */
+    public void handleTaskStatusThenEvent(FlowModel flowModel, Integer eventStatus) {
+        handleTaskStatus();
+        flowUtil.event(flowModel, eventStatus);
+    }
+
+    //鏇存敼鐘舵��
+    public void handleTaskStatus() {
+        Map<String, String> delTaskMap = FlowStatusHolder.getDelTaskMap();
+        for (Map.Entry<String, String> stringStringEntry : delTaskMap.entrySet()) {
+            String taskId = stringStringEntry.getKey();
+            String flowId = delTaskMap.get(taskId);
+            if (StringUtils.isEmpty(flowId)) {
+                continue;
+            }
+            List<String> flowIdList = ImmutableList.of(flowId);
+            List<TemplateNodeEntity> list = templateNodeMapper.getList(flowIdList, null);
+            Set<String> formIds = list.stream().map(TemplateNodeEntity::getFormId).collect(Collectors.toSet());
+            FlowStateModel model = new FlowStateModel(new ArrayList<>(formIds), taskId, 0);
+            serviceUtil.saveState(model);
+
+        }
+
+
+        List<String> taskIdList = FlowStatusHolder.getTaskList();
+        if (!taskIdList.isEmpty()) {
+            List<TaskEntity> taskList = taskMapper.getInfosSubmit(taskIdList.toArray(new String[]{}), TaskEntity::getId, TaskEntity::getStatus, TaskEntity::getFlowId);
+            List<String> flowIdList = taskList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
+            List<TemplateNodeEntity> list = templateNodeMapper.getList(flowIdList, null);
+            for (TaskEntity task : taskList) {
+                String id = task.getId();
+                String flowId = task.getFlowId();
+                Integer status = task.getStatus();
+                Set<String> formIds = list.stream().filter(e -> e.getFlowId().equals(flowId)).map(TemplateNodeEntity::getFormId).collect(Collectors.toSet());
+                FlowStateModel model = new FlowStateModel(new ArrayList<>(formIds), id, status);
+                serviceUtil.saveState(model);
+            }
+        }
+        FlowStatusHolder.clear();
+    }
+
+    /**
+     * 澶勭悊绾跨▼鍙橀噺涓殑浜嬩欢
+     */
+    public void handleEvent() {
+        List<EventModel> allEvent = FlowEventHolder.getAllEvent();
+        for (EventModel eventModel : allEvent) {
+            String type = eventModel.getType();
+            if (Objects.equals(NodeEnum.APPROVER.getType(), type)) {
+                flowUtil.event(eventModel.getFlowModel(), eventModel.getStatus(), eventModel.getAllData());
+            } else if (Objects.equals(NodeEnum.OUTSIDE.getType(), type)) {
+                String interId = eventModel.getInterfaceId();
+                Map<String, String> parameterMap = eventModel.getParameterData();
+                String id = eventModel.getId();
+                ActionResult<Object> result = serviceUtil.infoToId(interId, parameterMap);
+                EventLogEntity eventLog = eventLogMapper.selectById(id);
+                if (eventLog != null) {
+                    eventLog.setResult(JsonUtil.getObjectToString(result));
+                    boolean retryResult = Objects.equals(200, result.getCode());
+                    eventLog.setStatus(retryResult ? FlowNature.SUCCESS : FlowNature.LOSE);
+                    eventLogMapper.updateById(eventLog);
+                }
+            }
+        }
+        FlowEventHolder.clear();
+    }
+
+    /**
+     * 澶栭儴鑺傜偣鍙傛暟
+     */
+    public Map<String, String> outsideData(FlowModel flowModel, List<TemplateJsonModel> templateJsonModelList, Map<String, Map<String, Object>> allData, String resultNodeCode, String eventId) {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        TemplateNodeEntity startNode = nodeEntityList.stream()
+                .filter(e -> Objects.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+        String startNodeFormId = startNode.getFormId();
+        String taskId = taskEntity.getId();
+        Map<String, Object> formData = flowModel.getFormData();
+        formData.put(FlowConstant.START_NODE_FORM_ID, startNodeFormId);
+        TemplateNodeEntity prevNode = nodeEntityList.stream()
+                .filter(e -> Objects.equals(resultNodeCode, e.getNodeCode())).findFirst().orElse(new TemplateNodeEntity());
+        formData.put(FlowConstant.PREV_NODE_FORM_ID, prevNode.getFormId());
+        String nodeCode = flowModel.getNodeCode();
+        RecordEntity recordEntity = new RecordEntity();
+        recordEntity.setNodeCode(nodeCode);
+        recordEntity.setNodeId(eventId);
+        Map<String, Object> parameterData = new HashMap<>();
+        for (TemplateJsonModel templateJsonModel : templateJsonModelList) {
+            if (Objects.equals(FieldEnum.FIELD.getCode(), templateJsonModel.getSourceType())) {
+                String relationField = templateJsonModel.getRelationField();
+                String[] split = relationField.split("\\|");
+                if (split.length > 1) {
+                    String formId = split[split.length - 1];
+                    String field = split[0];
+                    Map<String, Object> dataMap = allData.get(taskId + JnpfConst.SIDE_MARK + formId) != null ? allData.get(taskId + JnpfConst.SIDE_MARK + formId) : serviceUtil.infoData(formId, taskId);
+                    parameterData.put(relationField, dataMap.get(field));
+                } else {
+                    String field = split[split.length - 1];
+                    parameterData.put(relationField, formData.get(field));
+                }
+            }
+        }
+        Map<String, Object> dataMap = new HashMap<>(formData);
+        dataMap.putAll(parameterData);
+        FlowModel parameterModel = new FlowModel();
+        parameterModel.setFormData(dataMap);
+        parameterModel.setRecordEntity(recordEntity);
+        parameterModel.setTaskEntity(taskEntity);
+        return flowUtil.parameterMap(parameterModel, templateJsonModelList);
+    }
+
+    /**
+     * 澶勭悊鍚屾鐨勮Е鍙戞祦绋�
+     */
+    public void launchTrigger(FlowModel flowModel) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        if (taskEntity == null) {
+            return;
+        }
+        List<TriggerLaunchflowEntity> triggerList = triggerLaunchflowMapper.getTaskIds(taskEntity.getId());
+        if (CollUtil.isEmpty(triggerList)) {
+            return;
+        }
+        for (TriggerLaunchflowEntity entity : triggerList) {
+            List<String> taskIdList = JsonUtil.getJsonToList(entity.getTaskIds(), String.class);
+            List<TaskEntity> launchTaskList = taskMapper.getInfosSubmit(taskIdList.toArray(new String[]{}), TaskEntity::getId, TaskEntity::getEndTime, TaskEntity::getStatus);
+            boolean isFlowEnd = launchTaskList.stream().noneMatch(e -> e.getEndTime() == null);
+            if (isFlowEnd) {
+                ExtraData extraData = JsonUtil.getJsonToBean(entity.getExtraData(), ExtraData.class);
+                ExecuteModel model = getExecuteModel(extraData);
+                if (model != null) {
+                    triggerLaunchflowMapper.delete(entity);
+                    TaskEntity launchTaskEntity = model.getTaskEntity();
+                    if (null != launchTaskEntity && ObjectUtil.equals(launchTaskEntity.getStatus(), TaskStatusEnum.CANCEL.getCode())) {
+                        return;
+                    }
+                    FlowModel launchFlowModel = model.getFlowModel();
+                    model.setNodeRetry(true);
+                    boolean result = true;
+                    try {
+                        result = this.operatorExecute(model);
+                    } catch (Exception e) {
+                        log.info(e.getMessage());
+                    }
+                    if (!result) {
+                        return;
+                    }
+                    if (Objects.equals(FlowNature.CHILD_SYNC, model.getIsAsync())) {
+                        List<TriggerRecordEntity> triggerRecordList = triggerRecordMapper.getList(entity.getTriggerId());
+                        List<String> nodeCode = triggerRecordList.stream().map(TriggerRecordEntity::getNodeCode).collect(Collectors.toList());
+                        boolean isExecuteAudit = getTaskList(entity.getTaskId(), nodeCode).isEmpty();
+                        if (isExecuteAudit) {
+                            List<String> operatorIdList = extraData.getOperatorIdList();
+                            if (CollUtil.isNotEmpty(operatorIdList)) {
+                                QueryWrapper<OperatorEntity> operatorWrapper = new QueryWrapper<>();
+                                operatorWrapper.lambda().in(OperatorEntity::getId, operatorIdList);
+                                List<OperatorEntity> operatorList = new ArrayList<>();
+                                List<OperatorEntity> list = operatorMapper.selectList(operatorWrapper);
+                                for (OperatorEntity operator : list) {
+                                    if (Objects.equals(operator.getStatus(), OperatorStateEnum.WAITING.getCode())) {
+                                        operatorList.add(operator);
+                                    }
+                                }
+                                model.setOperatorList(operatorList);
+                            }
+                            List<String> subTaskIdList = extraData.getSubTaskIdList();
+                            if (CollUtil.isNotEmpty(subTaskIdList)) {
+                                QueryWrapper<TaskEntity> taskWrapper = new QueryWrapper<>();
+                                taskWrapper.lambda().in(TaskEntity::getId, subTaskIdList);
+                                List<TaskEntity> taskList = new ArrayList<>();
+                                List<TaskEntity> list = taskMapper.selectList(taskWrapper);
+                                taskList.addAll(list);
+                                model.setSubTaskList(taskList);
+                            }
+                            Map<String, FlowModel> systemMap = extraData.getSystemMap();
+                            if (CollUtil.isNotEmpty(systemMap)) {
+                                List<SystemAuditModel> systemList = new ArrayList<>();
+                                for (Map.Entry<String, FlowModel> stringFlowModelEntry : systemMap.entrySet()) {
+                                    String operatorId = stringFlowModelEntry.getKey();
+                                    OperatorEntity operator = operatorMapper.selectById(operatorId);
+                                    FlowModel systemFlowModel = systemMap.get(operatorId);
+                                    if (operator != null && systemFlowModel != null && Objects.equals(operator.getStatus(), OperatorStateEnum.RUNING.getCode())) {
+                                        SystemAuditModel systemAuditModel = new SystemAuditModel();
+                                        flowUtil.setFlowModel(operator.getTaskId(), systemFlowModel);
+                                        systemAuditModel.setFlowModel(systemFlowModel);
+                                        systemAuditModel.setOperator(operator);
+                                        systemList.add(systemAuditModel);
+                                    }
+                                }
+                                model.setSystemList(systemList);
+                            }
+
+                            //鍚屾剰銆佹嫆缁�
+                            Boolean rejectTrigger = launchFlowModel.getRejectTrigger();
+                            Integer action = launchFlowModel.getAction();
+                            launchFlowModel.setTriggerBack(true);
+                            List<Integer> actionList = ImmutableList.of(ActionEnum.AUDIT.getCode(), ActionEnum.REJECT.getCode(), ActionEnum.PROCESSING.getCode());
+                            if (actionList.contains(action)) {
+                                if (Boolean.TRUE.equals(rejectTrigger)) {
+                                    launchFlowModel.setHandleStatus(FlowNature.REJECT_COMPLETION);
+                                    launchFlowModel.setFinishFlag(false);
+                                } else {
+                                    executeAudit(ImmutableList.of(model), launchFlowModel);
+                                }
+                                TaskEntity task = launchFlowModel.getTaskEntity();
+                                if (task != null && task.getEndTime() == null) {
+                                    isFinished(launchFlowModel);
+                                }
+
+                            }
+
+                            //閫�鍥�
+                            if (Objects.equals(ActionEnum.BACK.getCode(), action)) {
+                                String operatorId = model.getOperatorId();
+                                back(operatorId, launchFlowModel);
+                            }
+                            handleOperator();
+                            handleTaskStatusThenEvent();
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    //-------------------------------taskUtil------------------------------------------------------------
+
+    public void cancel(String id, FlowModel flowModel, boolean isCancel) throws WorkFlowException {
+        if (isCancel) {
+            // 浠诲姟娴佺▼鐨勭粓姝�
+            TriggerTaskEntity triggerTask = triggerTaskMapper.selectById(id);
+            if (null != triggerTask) {
+                triggerTask.setStatus(TaskStatusEnum.CANCEL.getCode());
+                triggerTaskMapper.updateById(triggerTask);
+                return;
+            }
+        }
+        flowUtil.setFlowModel(id, flowModel);
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        flowUtil.isSuspend(taskEntity);
+
+        // 涓嬫灦鐨勫垽鏂�
+        if (!isCancel) {
+            TemplateEntity template = templateMapper.selectById(taskEntity.getTemplateId());
+            if (null != template && !ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.UP.getCode())) {
+                throw new WorkFlowException(MsgCode.WF140.get());
+            }
+
+        }
+
+        List<String> idList = ImmutableList.of(id);
+
+        List<TaskEntity> taskList = new ArrayList<>();
+        // 閫掑綊鑾峰彇瀛愭祦绋�
+        for (String taskId : idList) {
+            List<String> childAllList = taskMapper.getChildAllList(taskId);
+            taskList.addAll(taskMapper.getOrderStaList(childAllList));
+        }
+
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+
+        for (TaskEntity entity : taskList) {
+            flowUtil.isSuspend(entity);
+            // 璁板綍
+            FlowMethod flowMethod = new FlowMethod();
+            flowMethod.setFlowModel(flowModel);
+            Integer type = isCancel ? RecordEnum.CANCEL.getCode() : RecordEnum.ACTIVATE.getCode();
+            flowMethod.setType(type);
+            OperatorEntity operatorEntity = new OperatorEntity();
+            String code = StringUtils.isNotEmpty(entity.getCurrentNodeCode()) ? entity.getCurrentNodeCode() : FlowNature.START_CODE;
+            operatorEntity.setNodeCode(code);
+            String name = StringUtils.isNotEmpty(entity.getCurrentNodeName()) ? entity.getCurrentNodeName() : FlowNature.START_NAME;
+            operatorEntity.setNodeName(name);
+            operatorEntity.setTaskId(entity.getId());
+            operatorEntity.setHandleId(UserProvider.getLoginUserId());
+            flowMethod.setOperatorEntity(operatorEntity);
+            recordMapper.createRecord(flowMethod);
+
+            if (isCancel) {
+                // 缁堟锛屾洿鏂板疄渚�
+                entity.setHisStatus(entity.getStatus());
+                entity.setStatus(TaskStatusEnum.CANCEL.getCode());
+                taskMapper.updateById(entity);
+
+                // 娑堟伅
+                FlowMsgModel flowMsgModel = new FlowMsgModel();
+                flowMsgModel.setNodeList(nodeEntityList);
+                flowMsgModel.setUserInfo(flowModel.getUserInfo());
+                flowMsgModel.setTaskEntity(entity);
+                flowMsgModel.setEnd(true);
+                msgUtil.message(flowMsgModel);
+            } else {
+                // 澶嶆椿
+                entity.setStatus(entity.getHisStatus());
+                taskMapper.updateById(entity);
+                updateCreateTime(flowModel);
+            }
+            addTask(ImmutableList.of(entity.getId()));
+        }
+    }
+
+
+    // 鎻愪氦鎾ら攢娴佺▼
+    public void submitOfRevoke(FlowModel flowModel) throws WorkFlowException {
+        TaskEntity task = flowModel.getTaskEntity();
+        List<TaskLineEntity> lineList = taskLineMapper.getList(task.getId());
+        if (CollUtil.isEmpty(lineList)) {
+            throw new WorkFlowException("鏃犳硶鎾ら攢");
+        }
+        // 濮旀墭浜虹殑澶勭悊
+        UserInfo userInfo = flowModel.getUserInfo();
+        String creatorUserId = task.getCreatorUserId();
+        String delegateUserId = task.getDelegateUserId();
+        boolean isDelegate = !ObjectUtil.equals(userInfo.getUserId(), creatorUserId);
+        if (isDelegate && StringUtils.isNotEmpty(delegateUserId)) {
+            String token = AuthUtil.loginTempUser(task.getCreatorUserId(), UserProvider.getUser().getTenantId());
+            userInfo = UserProvider.getUser(token);
+            flowModel.setUserInfo(userInfo);
+        }
+
+
+        Map<String, Object> variables = new HashMap<>();
+        for (TaskLineEntity condition : lineList) {
+            variables.put(condition.getLineKey(), Boolean.valueOf(condition.getLineValue()));
+        }
+
+        TaskEntity entity = new TaskEntity();
+        entity.setId(RandomUtil.uuId());
+        entity.setType(1);
+        entity.setUrgent(task.getUrgent());
+        entity.setCreatorUserId(task.getCreatorUserId());
+        entity.setStartTime(new Date());
+        entity.setCreatorTime(new Date());
+        entity.setFullName(task.getFullName() + "鐨勬挙閿�鐢宠");
+        entity.setFlowCategory(task.getFlowCategory());
+        entity.setFlowCode(task.getFlowCode());
+        entity.setFlowName(task.getFlowName());
+        entity.setFlowVersion(task.getFlowVersion());
+        entity.setFlowId(task.getFlowId());
+        entity.setTemplateId(task.getTemplateId());
+        entity.setParentId(task.getParentId());
+        entity.setFlowType(task.getFlowType());
+        entity.setStatus(TaskStatusEnum.RUNNING.getCode());
+        entity.setEngineType(task.getEngineType());
+        if (isDelegate) {
+            entity.setDelegateUserId(delegateUserId);
+        }
+
+        TemplateJsonEntity jsonEntity = templateJsonMapper.getInfo(task.getFlowId());
+        String instanceId = flowAbleUrl.startInstance(jsonEntity.getFlowableId(), variables);
+        entity.setInstanceId(instanceId);
+
+        if (taskMapper.insert(entity) > 0) {
+            List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+            TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                    .filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+            NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+            // 璁板綍
+            FlowMethod method = new FlowMethod();
+            method.setFlowModel(flowModel);
+            method.setType(RecordEnum.SUBMIT.getCode());
+            OperatorEntity operatorEntity = new OperatorEntity();
+            operatorEntity.setNodeCode(nodeEntity.getNodeCode());
+            operatorEntity.setNodeName(nodeModel.getNodeName());
+            operatorEntity.setTaskId(entity.getId());
+            operatorEntity.setHandleId(entity.getCreatorUserId());
+            if (StringUtils.isNotBlank(flowModel.getUserId())) {
+                method.setHandId(flowModel.getUserId());
+            }
+            operatorEntity.setHandleTime(entity.getStartTime());
+            method.setOperatorEntity(operatorEntity);
+            recordMapper.createRecord(method);
+            // 鑺傜偣璁板綍
+            NodeRecordModel nodeRecordModel = new NodeRecordModel();
+            nodeRecordModel.setTaskId(entity.getId());
+            nodeRecordModel.setNodeCode(nodeEntity.getNodeCode());
+            nodeRecordModel.setNodeName(nodeModel.getNodeName());
+            nodeRecordModel.setNodeStatus(NodeStateEnum.SUBMIT.getCode());
+            nodeRecordMapper.create(nodeRecordModel);
+            // 淇濆瓨鍒版挙閿�琛�
+            RevokeEntity revokeEntity = new RevokeEntity();
+            revokeEntity.setId(RandomUtil.uuId());
+            revokeEntity.setTaskId(task.getId());
+            revokeEntity.setRevokeTaskId(entity.getId());
+
+            RevokeFormDataModel model = new RevokeFormDataModel();
+            String billNumber = serviceUtil.getBillNumber();
+            model.setBillRule(billNumber);
+            model.setHandleOpinion(flowModel.getHandleOpinion());
+            Date date = new Date();
+            model.setCreatorTime(date.getTime());
+            model.setRevokeTaskId(task.getId());
+            model.setRevokeTaskName(task.getFullName());
+            String str = JsonUtil.getObjectToString(model);
+            revokeEntity.setFormData(str);
+            revokeMapper.insert(revokeEntity);
+            // 澶勭悊鎾ら攢缁忓姙
+            FlowMethod flowMethod = new FlowMethod();
+            flowMethod.setFlowModel(flowModel);
+            flowMethod.setTaskId(task.getId());
+            flowMethod.setTaskEntity(entity);
+            handleRevokeOperator(flowMethod);
+            // 鑷姩瀹℃壒
+            FlowModel revokeModel = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+            revokeModel.setTaskEntity(entity);
+            autoAudit(revokeModel);
+            // 鍒ゆ柇缁撴潫
+            flowModel.setTaskEntity(entity);
+            if (this.isFinished(flowModel)) {
+                this.endRevoke(task);
+            }
+        }
+    }
+
+    public void endRevoke(TaskEntity task) {
+        QueryWrapper<TaskEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().in(TaskEntity::getParentId, task.getId());
+        List<TaskEntity> subTaskList = taskMapper.selectList(wrapper);
+        // 鍙樻洿瀛愭祦绋嬩换鍔$姸鎬�
+        if (CollUtil.isNotEmpty(subTaskList)) {
+            for (TaskEntity subTask : subTaskList) {
+                subTask.setStatus(TaskStatusEnum.REVOKED.getCode());
+            }
+            taskMapper.updateById(subTaskList);
+        }
+        task.setStatus(TaskStatusEnum.REVOKED.getCode());
+        taskMapper.updateById(task);
+    }
+
+
+    // 鏇存柊褰撳墠鑺傜偣
+    public void updateCurrentNode(List<FlowableTaskModel> taskModelList, Map<String, NodeModel> nodes, TaskEntity taskEntity) {
+        List<String> currentNodeList = new ArrayList<>();
+        List<String> currentNodeNameList = new ArrayList<>();
+
+        List<String> nodeTypes = ImmutableList.of(NodeEnum.APPROVER.getType(), NodeEnum.SUB_FLOW.getType(), NodeEnum.PROCESSING.getType(), NodeEnum.OUTSIDE.getType());
+        for (FlowableTaskModel model : taskModelList) {
+            NodeModel nodeModel = nodes.get(model.getTaskKey());
+            if (null != nodeModel && nodeTypes.contains(nodeModel.getType())) {
+                currentNodeList.add(nodeModel.getNodeId());
+                currentNodeNameList.add(nodeModel.getNodeName());
+            }
+        }
+        if (CollUtil.isNotEmpty(currentNodeList)) {
+            // 鏇存柊浠诲姟鐨勫綋鍓嶈妭鐐逛俊鎭�
+            taskEntity.setCurrentNodeName(String.join(",", currentNodeNameList));
+            taskEntity.setCurrentNodeCode(String.join(",", currentNodeList));
+            taskMapper.updateById(taskEntity);
+        }
+    }
+
+
+    // 鎷掔粷缁撴潫娴佺▼
+    public void handleEndTask(FlowMethod flowMethod) throws WorkFlowException {
+        OperatorEntity operator = flowMethod.getOperatorEntity();
+        List<CirculateEntity> circulateList = flowMethod.getCirculateList();
+        FlowModel flowModel = flowMethod.getFlowModel();
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+
+        // 瑙﹀彂
+        if (Boolean.FALSE.equals(flowMethod.getIsRevoke())) {
+            flowModel.setAction(ActionEnum.REJECT.getCode());
+            flowModel.setRejectTrigger(true);
+            handleTrigger(operator, flowModel);
+        }
+
+        // 鐩存帴缁撴潫娴佺▼
+        flowMethod.setState(TaskStatusEnum.REJECTED.getCode());
+        boolean isEnd = getTaskList(operator.getTaskId()).isEmpty();
+        this.endTask(flowMethod, isEnd);
+        // 澶勭悊褰撳墠鑺傜偣
+        flowModel.setFinishFlag(false);
+        List<String> codes = Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList());
+        codes.remove(operator.getNodeCode());
+        taskEntity.setCurrentNodeCode(String.join(",", codes));
+
+        // 鑺傜偣璁板綍
+        NodeRecordModel nodeRecordModel = new NodeRecordModel();
+        nodeRecordModel.setTaskId(operator.getTaskId());
+        nodeRecordModel.setNodeId(operator.getNodeId());
+        nodeRecordModel.setNodeCode(operator.getNodeCode());
+        nodeRecordModel.setNodeName(operator.getNodeName());
+        nodeRecordModel.setNodeStatus(NodeStateEnum.REJECT.getCode());
+        nodeRecordMapper.create(nodeRecordModel);
+
+        FlowMsgModel flowMsgModel = new FlowMsgModel();
+        flowMsgModel.setNodeList(nodeEntityList);
+        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+        flowMsgModel.setTaskEntity(taskEntity);
+        flowMsgModel.setNodeCode(operator.getNodeCode());
+        flowMsgModel.setWait(false);
+        flowMsgModel.setReject(true);
+        flowMsgModel.setCopy(true);
+        List<OperatorEntity> operatorList = new ArrayList<>();
+        OperatorEntity entity = new OperatorEntity();
+        entity.setNodeCode(operator.getNodeCode());
+        entity.setHandleId(taskEntity.getCreatorUserId());
+        operatorList.add(entity);
+        flowMsgModel.setOperatorList(operatorList);
+        flowMsgModel.setCirculateList(circulateList);
+        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+        msgUtil.message(flowMsgModel);
+
+        this.isFinished(flowModel);
+    }
+
+
+    public void updateGlobalParam(TaskEntity taskEntity, NodeModel nodeModel, NodeModel global, Map<String, Object> formData) {
+        this.getGlobalParam(taskEntity, nodeModel, global, formData);
+        taskMapper.updateById(taskEntity);
+    }
+
+
+    public void getGlobalParam(TaskEntity taskEntity, NodeModel nodeModel, NodeModel global, Map<String, Object> formData) {
+        List<FlowParamModel> paramModelList = global.getGlobalParameterList();
+        if (CollUtil.isEmpty(paramModelList)) {
+            return;
+        }
+        formData = formData == null ? new HashMap<>() : formData;
+        List<TemplateJsonModel> list = new ArrayList<>();
+        for (GroupsModel group : nodeModel.getParameterList()) {
+            TemplateJsonModel model = new TemplateJsonModel();
+            model.setField(group.getField());
+            model.setSourceType(Objects.equals(FieldEnum.CONDITION.getCode(), group.getFieldValueType()) ? FieldEnum.SYSTEM.getCode() : group.getFieldValueType());
+            model.setRelationField(String.valueOf(group.getFieldValue()));
+            list.add(model);
+        }
+        Map<String, Object> taskMap = taskEntity.getGlobalParameter() != null ? JsonUtil.stringToMap(taskEntity.getGlobalParameter()) : new HashMap<>();
+        if (CollUtil.isEmpty(taskMap)) {
+            for (FlowParamModel model : paramModelList) {
+                if (model.getDefaultValue() != null) {
+                    taskMap.put(model.getFieldName(), model.getDefaultValue());
+                }
+            }
+        }
+        RecordEntity recordEntity = new RecordEntity();
+        recordEntity.setNodeCode(nodeModel.getNodeId());
+        FlowModel parameterModel = new FlowModel();
+        parameterModel.setFormData(formData);
+        parameterModel.setRecordEntity(recordEntity);
+        parameterModel.setTaskEntity(taskEntity);
+        Map<String, String> map = flowUtil.parameterMap(parameterModel, list);
+        taskMap.putAll(map);
+        for (FlowParamModel model : paramModelList) {
+            if (ObjectUtil.equals(model.getDataType(), "datetime")) {
+                String fieldName = model.getFieldName();
+                Long longVal = Long.valueOf(String.valueOf(taskMap.get(fieldName)));
+                taskMap.put(fieldName, longVal);
+            }
+        }
+        taskEntity.setGlobalParameter(JsonUtil.getObjectToString(taskMap));
+    }
+
+    /**
+     * 渚濇瀹℃壒鐨勬帓搴�
+     *
+     * @param userIds   鐢ㄦ埛涓婚敭闆嗗悎
+     * @param nodeModel 鑺傜偣灞炴��
+     */
+    public List<String> improperSort(List<String> userIds, NodeModel nodeModel) {
+        List<String> list = new ArrayList<>();
+        List<String> sortList = nodeModel.getApproversSortList();
+        if (sortList.isEmpty()) {
+            return userIds;
+        }
+        for (String id : sortList) {
+            List<String> collect = userIds.stream().filter(id::contains).collect(Collectors.toList());
+            list.addAll(collect);
+        }
+        return list.stream().distinct().collect(Collectors.toList());
+    }
+
+    // 缁撴潫浠诲姟
+    public void endTask(FlowMethod flowMethod, boolean isEnd) throws WorkFlowException {
+        TaskEntity taskEntity = flowMethod.getTaskEntity();
+        Integer state = flowMethod.getState();
+        taskEntity.setStatus(state);
+        taskEntity.setEndTime(new Date());
+        if (taskMapper.updateById(taskEntity) > 0) {
+            flowMethod.setTaskId(taskEntity.getId());
+            flowMethod.setNodeCode(null);
+            endOperator(flowMethod);
+            if (isEnd) {
+                flowAbleUrl.deleteInstance(taskEntity.getInstanceId(), "reject");
+            }
+        }
+    }
+
+    /**
+     * 鍒ゆ柇浠诲姟鏄惁缁撴潫
+     *
+     * @param flowModel 鍙傛暟
+     */
+    public boolean isFinished(FlowModel flowModel) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        if (null == taskEntity.getId()) {
+            return false;
+        }
+        TaskEntity task = taskMapper.selectById(taskEntity.getId());
+        if (null != task && ObjectUtil.equals(task.getStatus(), TaskStatusEnum.CANCEL.getCode())) {
+            return false;
+        }
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        String instanceId = taskEntity.getInstanceId();
+        boolean flag;
+        FlowableInstanceModel instance = flowAbleUrl.getInstance(instanceId);
+        if (null != instance && null != instance.getEndTime()) {
+            flag = true;
+        } else {
+            List<String> historicEnd = flowAbleUrl.getHistoricEnd(instanceId);
+            flag = CollUtil.isNotEmpty(historicEnd);
+        }
+        if (flag) {
+            TemplateNodeEntity endNodeEntity = nodeEntityList.stream()
+                    .filter(e -> StringUtils.equals(e.getNodeType(), NodeEnum.END.getType())).findFirst().orElse(null);
+            if (null != endNodeEntity) {
+                boolean finishFlag = flowModel.getFinishFlag();
+                boolean isEnd = getTaskList(taskEntity.getId()).isEmpty();
+                boolean isPass = finishFlag && isEnd;
+                if (finishFlag) {
+                    taskEntity.setCurrentNodeCode(FlowNature.END_CODE);
+                    taskEntity.setCurrentNodeName(FlowNature.END_NAME);
+                    if (!isEnd) {
+                        taskEntity.setCurrentNodeCode(FlowNature.TRIGGER_CODE);
+                        taskEntity.setCurrentNodeName(FlowNature.TRIGGER_NAME);
+                    }
+                }
+                if (isPass) {
+                    Integer status = flowModel.getHandleStatus().equals(FlowNature.AUDIT_COMPLETION) ?
+                            TaskStatusEnum.PASSED.getCode() : TaskStatusEnum.REJECTED.getCode();
+                    taskEntity.setStatus(status);
+                    taskEntity.setEndTime(new Date());
+                }
+                if (taskMapper.updateById(taskEntity) > 0) {
+                    if (isPass || !finishFlag) {
+                        this.subFlowOfEnd(flowModel);
+                        //缁撴潫浜嬩欢
+                        flowModel.setEventStatus(EventEnum.END.getStatus());
+                        addEvent(flowModel);
+                        // 鍙戦�佺粨鏉熸秷鎭�
+                        FlowMsgModel flowMsgModel = new FlowMsgModel();
+                        flowMsgModel.setNodeList(nodeEntityList);
+                        flowMsgModel.setTaskEntity(taskEntity);
+                        flowMsgModel.setUserInfo(flowModel.getUserInfo());
+                        flowMsgModel.setEnd(true);
+                        flowMsgModel.setFormData(FlowContextHolder.getAllData());
+                        msgUtil.message(flowMsgModel);
+                    }
+                    return isEnd;
+                }
+            }
+        }
+        return false;
+    }
+
+
+    // 鍒ゆ柇鑳藉惁褰掓。
+    public AuditModel getAuditModel(String taskId, FlowModel flowModel, OperatorEntity operator) {
+        TaskEntity task = taskMapper.selectById(taskId);
+        AuditModel model = new AuditModel();
+        if (operator != null && ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.REVOKE.getCode())) {
+            return model;
+        }
+        if (task != null) {
+            model.setTaskId(taskId);
+            if (task.getEndTime() != null) {
+                NodeModel global = flowModel.getNodes().get(NodeEnum.GLOBAL.getType());
+                FileConfig config = global.getFileConfig();
+                if (Boolean.TRUE.equals(config.getOn()) && StringUtils.isNotBlank(config.getTemplateId())) {
+                    model.setIsEnd(true);
+                }
+            }
+        }
+        return model;
+    }
+
+    // 瀛愭祦绋嬬粨鏉� 瑕佸鐞嗙殑浜嬫儏
+    public void subFlowOfEnd(FlowModel flowModel) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        if (StringUtils.equals(FlowNature.PARENT_ID, taskEntity.getParentId())) {
+            return;
+        }
+        // 鑾峰彇鐖剁骇鑺傜偣闆嗗悎
+        TaskEntity parentTask = taskMapper.getInfo(taskEntity.getParentId());
+        if (null == parentTask) {
+            throw new WorkFlowException(MsgCode.FA001.get());
+        }
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(parentTask.getFlowId());
+        String deploymentId = jsonEntity.getFlowableId();
+        List<TemplateNodeEntity> parentNodeList = templateNodeMapper.getList(parentTask.getFlowId());
+
+        String subCode = taskEntity.getSubCode();
+        SubParameterModel subParameter = JsonUtil.getJsonToBean(taskEntity.getSubParameter(), SubParameterModel.class);
+        String flowableTaskId = subParameter.getNodeId();
+        String parentCode = subParameter.getParentCode();
+
+        TemplateNodeEntity parentNode = parentNodeList.stream()
+                .filter(e -> e.getNodeCode().equals(parentCode)).findFirst().orElse(new TemplateNodeEntity());
+        TemplateNodeEntity subNode = parentNodeList.stream()
+                .filter(e -> e.getNodeCode().equals(subCode)).findFirst().orElse(new TemplateNodeEntity());
+        NodeModel nodeModel = JsonUtil.getJsonToBean(subNode.getNodeJson(), NodeModel.class);
+        if (nodeModel == null) {
+            return;
+        }
+        // 鍒ゆ柇鏄惁渚濇鍒涘缓锛屽瓨鍦ㄤ緷娆″垱寤虹殑瀛愭祦绋嬫暟鎹紝鍒欏彂璧峰瓙娴佺▼
+        if (!ObjectUtil.equals(nodeModel.getCreateRule(), FlowNature.CHILD_SYNC)) {
+            List<SubtaskDataEntity> list = subtaskDataMapper.getList(taskEntity.getParentId(), subCode);
+            if (CollUtil.isNotEmpty(list)) {
+                SubtaskDataEntity subtaskData = list.get(0);
+                FlowModel model = JsonUtil.getJsonToBean(subtaskData.getSubtaskJson(), FlowModel.class);
+                batchSaveOrSubmit(model);
+                subtaskDataMapper.deleteById(subtaskData);
+                autoAudit(model);
+                return;
+            }
+        }
+
+        // 鍒ゆ柇涓嬩竴绾ф槸鍚﹀瓙娴佺▼鑺傜偣锛屼笖鏄惁瀛樺湪鍊欓�変汉
+        NextOrPrevFo fo = new NextOrPrevFo();
+        fo.setDeploymentId(deploymentId);
+        fo.setTaskKey(subCode);
+        List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(fo);
+
+        for (FlowableNodeModel nextModel : nextModels) {
+            TemplateNodeEntity nodeEntity = parentNodeList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), nextModel.getId()))
+                    .findFirst().orElse(new TemplateNodeEntity());
+            if (ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.SUB_FLOW.getType())) {
+                NodeModel subFlow = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+                TemplateEntity template = templateMapper.selectById(subFlow.getFlowId());
+                TemplateJsonEntity subJsonEntity = templateJsonMapper.selectById(template.getFlowId());
+                List<TemplateNodeEntity> subNodeList = templateNodeMapper.getList(template.getFlowId());
+                Map<String, NodeModel> subNodes = new HashMap<>();
+                for (TemplateNodeEntity node : subNodeList) {
+                    subNodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
+                }
+                TemplateNodeEntity subStart = subNodeList.stream()
+                        .filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+
+                FlowMethod method = new FlowMethod();
+                method.setDeploymentId(subJsonEntity.getFlowableId());
+                method.setNodes(subNodes);
+                method.setNodeEntityList(subNodeList);
+                method.setNodeCode(subStart.getNodeCode());
+
+                if (flowUtil.checkBranch(subStart)) {
+                    throw new WorkFlowException(MsgCode.WF121.get());
+                }
+                List<NodeModel> nextApprover = flowUtil.getNextApprover(method);
+                if (!flowUtil.checkNextCandidates(nextApprover)) {
+                    throw new WorkFlowException(MsgCode.WF121.get());
+                }
+                FlowModel model = new FlowModel();
+                model.setDeploymentId(flowModel.getDeploymentId());
+                model.setNodeEntityList(subNodeList);
+                if (flowUtil.checkNextError(model, nextApprover, false, false) != 0) {
+                    throw new WorkFlowException(MsgCode.WF121.get());
+                }
+            }
+        }
+
+        if (nodeModel.getIsAsync().equals(FlowNature.CHILD_ASYNC)) {
+            // 寮傛宸茬粡瀹屾垚鑺傜偣
+            return;
+        }
+        // 鐖惰妭鐐逛笅鐨勫瓙娴佺▼
+        QueryWrapper<TaskEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(TaskEntity::getParentId, taskEntity.getParentId())
+                .eq(TaskEntity::getSubCode, subCode);
+        List<TaskEntity> subList = taskMapper.selectList(wrapper);
+        // 鏈鎵归泦鍚�
+        List<TaskEntity> unfinishedList = subList.stream()
+                .filter(e -> !e.getStatus().equals(TaskStatusEnum.PASSED.getCode()) && !e.getStatus().equals(TaskStatusEnum.REJECTED.getCode()))
+                .collect(Collectors.toList());
+        if (unfinishedList.isEmpty()) {
+            FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+            model.setFinishFlag(true);
+            subList = subList.stream().filter(e -> null != e.getEndTime())
+                    .sorted(Comparator.comparing(TaskEntity::getEndTime).reversed()).collect(Collectors.toList());
+            if (CollUtil.isNotEmpty(subList)) {
+                TaskEntity finalTask = subList.get(0);
+                model.setHandleStatus(ObjectUtil.equals(finalTask.getStatus(), TaskStatusEnum.PASSED.getCode()) ? 1 : 0);
+            } else {
+                model.setHandleStatus(1);
+            }
+            String formId = parentNode.getFormId();
+            flowUtil.setFlowModel(parentTask.getId(), model);
+            Map<String, NodeModel> nodes = model.getNodes();
+            Map<String, Object> formData = serviceUtil.infoData(formId, parentTask.getId());
+            model.setFormData(formData);
+            FlowMethod flowMethod = new FlowMethod();
+            flowMethod.setDeploymentId(model.getDeploymentId());
+            flowMethod.setNodeCode(subCode);
+            flowMethod.setFormData(formData);
+            flowMethod.setNodes(nodes);
+            flowMethod.setTaskEntity(parentTask);
+            Map<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
+            conditionUtil.checkCondition(resMap, nodes);
+            flowMethod.setFlowModel(model);
+            flowMethod.setFlowableTaskId(flowableTaskId);
+            flowMethod.setResMap(resMap);
+            flowMethod.setNodeEntityList(parentNodeList);
+            // 閫掑綊subCode鐨勬墍鏈変笂绾ц妭鐐癸紝鑾峰彇瀹℃壒鑺傜偣鐨勭粡鍔�
+            model.setOperatorEntity(new OperatorEntity());
+            List<String> nodeCodeList = new ArrayList<>();
+            flowUtil.prevNodeList(flowModel.getDeploymentId(), subCode, parentNodeList, nodeCodeList);
+            if (CollUtil.isNotEmpty(nodeCodeList)) {
+                List<OperatorEntity> list = getList(parentTask.getId(), nodeCodeList);
+                if (CollUtil.isNotEmpty(list)) {
+                    model.setOperatorEntity(list.get(0));
+                }
+            }
+            completeNode(flowMethod);
+        }
+    }
+
+    // 鍒犻櫎瀛愭祦绋嬶紙閫�鍥炴椂鑻ユ槸閲嶆柊瀹℃壒锛�
+    public void deleteSubflow(String taskId, List<String> nodeCodeList) {
+        QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(TaskEntity::getParentId, taskId);
+        if (CollUtil.isNotEmpty(nodeCodeList)) {
+            queryWrapper.lambda().in(TaskEntity::getSubCode, nodeCodeList);
+        }
+        List<TaskEntity> list = taskMapper.selectList(queryWrapper);
+        if (CollUtil.isNotEmpty(list)) {
+            List<String> idList = list.stream().map(TaskEntity::getId).distinct().collect(Collectors.toList());
+            List<String> idAll = new ArrayList<>();
+            taskMapper.deleTaskAll(idList, idAll);
+            List<TaskEntity> childList = taskMapper.getInfosSubmit(idAll.toArray(new String[]{}), TaskEntity::getId, TaskEntity::getFlowId);
+            for (TaskEntity entity : childList) {
+                addDelTask(entity.getId(), entity.getFlowId());
+            }
+            taskMapper.setIgnoreLogicDelete().deleteByIds(idAll);
+            taskMapper.clearIgnoreLogicDelete();
+        }
+    }
+
+    public void getByRule(List<String> userIdAll, UserEntity flowUser, int rule) {
+        if (flowUser != null) {
+            String userId = flowUser.getId();
+            //闄勫姞鏉′欢
+            switch (ExtraRuleEnum.getByCode(rule)) {
+                case ROLE:
+                    List<String> roleId = serviceUtil.getRoleObjectId(ImmutableList.of(userId)).stream().map(RoleRelationEntity::getRoleId).collect(Collectors.toList());
+                    List<String> userIdList = serviceUtil.getListByRoleId(roleId).stream().map(RoleRelationEntity::getObjectId).collect(Collectors.toList());
+                    List<String> roleUserId = userIdList.stream().filter(e -> !ObjectUtil.equals(e, userId)).collect(Collectors.toList());
+                    userIdAll.addAll(roleUserId);
+                    break;
+                case ORGANIZE:
+                case GROUP:
+                case POSITION:
+                    String type = Objects.equals(ExtraRuleEnum.GROUP.getCode(), rule) ? PermissionConst.GROUP : PermissionConst.POSITION;
+                    List<UserRelationEntity> userRelationList = serviceUtil.getListByUserIdAll(ImmutableList.of(userId));
+                    List<String> objectIdList = new ArrayList<>();
+                    List<String> idList = userRelationList.stream().filter(e -> ObjectUtil.equals(e.getObjectType(), type))
+                            .map(UserRelationEntity::getObjectId).collect(Collectors.toList());
+                    if (Objects.equals(ExtraRuleEnum.ORGANIZE.getCode(), rule)) {
+                        List<PositionEntity> positionList = serviceUtil.getPosList(idList);
+                        List<String> organizeList = positionList.stream().map(PositionEntity::getOrganizeId).collect(Collectors.toList());
+                        List<String> orgList = serviceUtil.getOrganizeList(organizeList).stream().filter(e -> Objects.equals(e.getCategory(), PermissionConst.DEPARTMENT)).map(OrganizeEntity::getId).collect(Collectors.toList());
+                        objectIdList.addAll(orgList);
+                    } else {
+                        objectIdList.addAll(idList);
+                    }
+                    List<String> userIds = serviceUtil.getListByObjectIdAll(objectIdList).stream().map(UserRelationEntity::getUserId)
+                            .filter(e -> !ObjectUtil.equals(e, userId)).collect(Collectors.toList());
+                    userIdAll.addAll(userIds);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    //灏佽鐢ㄦ埛瀵硅薄
+    public List<CandidateUserVo> getUserModel(List<String> ids, Pagination pagination) {
+        List<String> userIds = serviceUtil.getUserListAll(ids);
+        return getUserModelByUserIds(userIds, pagination);
+    }
+
+    /**
+     * 灏佽宸茶В鏋愮殑鐢ㄦ埛瀵硅薄锛岄伩鍏嶅皢鐢ㄦ埛涓婚敭鍐嶆鎸夌粍缁囥�佸矖浣嶃�佽鑹查�夋嫨鍊煎睍寮�銆�
+     */
+    public List<CandidateUserVo> getUserModelByUserIds(List<String> ids, Pagination pagination) {
+        List<String> userIds = CollUtil.isEmpty(ids) ? new ArrayList<>()
+                : ids.stream().filter(StringUtils::isNotBlank).distinct().collect(Collectors.toList());
+        List<UserEntity> userList = serviceUtil.getUserName(userIds, pagination);
+        pagination.setTotal(pagination.getTotal());
+        if (CollUtil.isEmpty(userList)) {
+            return new ArrayList<>();
+        }
+        List<String> userIdList = userList.stream().map(UserEntity::getId).collect(Collectors.toList());
+        List<UserRelationEntity> userRelationList = serviceUtil.getListByUserIdAll(userIdList);
+        Map<String, List<UserRelationEntity>> userMap = userRelationList.stream()
+                .filter(t -> PermissionConst.POSITION.equals(t.getObjectType())).collect(Collectors.groupingBy(UserRelationEntity::getUserId));
+
+        List<String> positionIds = userRelationList.stream()
+                .filter(t -> PermissionConst.POSITION.equals(t.getObjectType()))
+                .map(UserRelationEntity::getObjectId).filter(StringUtils::isNotBlank).distinct().collect(Collectors.toList());
+        Map<String, PositionEntity> positionMap = getPositionMap(positionIds);
+
+        List<String> positionTreeIds = positionMap.values().stream()
+                .map(PositionEntity::getPositionIdTree).filter(StringUtils::isNotBlank)
+                .flatMap(value -> Arrays.stream(value.split(","))).filter(StringUtils::isNotBlank)
+                .distinct().collect(Collectors.toList());
+        positionMap.putAll(getPositionMap(positionTreeIds));
+
+        List<String> organizeIds = positionMap.values().stream().map(PositionEntity::getOrganizeId)
+                .filter(StringUtils::isNotBlank).distinct().collect(Collectors.toList());
+        Map<String, OrganizeEntity> organizeMap = getOrganizeMap(organizeIds);
+        List<String> organizeTreeIds = organizeMap.values().stream()
+                .map(OrganizeEntity::getOrganizeIdTree).filter(StringUtils::isNotBlank)
+                .flatMap(value -> Arrays.stream(value.split(","))).filter(StringUtils::isNotBlank)
+                .distinct().collect(Collectors.toList());
+        organizeMap.putAll(getOrganizeMap(organizeTreeIds));
+
+        List<CandidateUserVo> list = new ArrayList<>();
+        for (UserEntity user : userList) {
+            CandidateUserVo vo = JsonUtil.getJsonToBean(user, CandidateUserVo.class);
+            vo.setFullName(user.getRealName() + "/" + user.getAccount());
+            vo.setHeadIcon(UploaderUtil.uploaderImg(user.getHeadIcon()));
+            List<UserRelationEntity> listByUserId = userMap.get(user.getId()) != null ? userMap.get(user.getId()) : new ArrayList<>();
+            StringJoiner joiner = new StringJoiner(",");
+            for (UserRelationEntity relation : listByUserId) {
+                StringJoiner name = new StringJoiner("/");
+                PositionEntity position = positionMap.get(relation.getObjectId());
+                if (position != null) {
+                    OrganizeEntity organize = organizeMap.get(position.getOrganizeId());
+                    if (organize != null) {
+                        List<String> organizeIdTree = new ArrayList<>(Arrays.asList(organize.getOrganizeIdTree().split(",")));
+                        for (String organizeId : organizeIdTree) {
+                            OrganizeEntity entity = organizeMap.get(organizeId);
+                            if (entity != null) {
+                                name.add(entity.getFullName());
+                            }
+                        }
+                    }
+                    List<String> positionIdTree = new ArrayList<>(Arrays.asList(position.getPositionIdTree().split(",")));
+                    for (String positionId : positionIdTree) {
+                        PositionEntity entity = positionMap.get(positionId);
+                        if (entity != null) {
+                            name.add(entity.getFullName());
+                        }
+                    }
+                }
+                joiner.add(name.toString());
+            }
+            vo.setOrganize(joiner.toString());
+            list.add(vo);
+        }
+        return list;
+    }
+
+    private Map<String, PositionEntity> getPositionMap(List<String> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return new HashMap<>();
+        }
+        List<PositionEntity> list = new ArrayList<>();
+        for (int index = 0; index < ids.size(); index += 1000) {
+            list.addAll(serviceUtil.getPosList(ids.subList(index, Math.min(index + 1000, ids.size()))));
+        }
+        return list.stream().collect(Collectors.toMap(PositionEntity::getId, item -> item, (first, second) -> first));
+    }
+
+    private Map<String, OrganizeEntity> getOrganizeMap(List<String> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return new HashMap<>();
+        }
+        List<OrganizeEntity> list = new ArrayList<>();
+        for (int index = 0; index < ids.size(); index += 1000) {
+            list.addAll(serviceUtil.getOrganizeList(ids.subList(index, Math.min(index + 1000, ids.size()))));
+        }
+        return list.stream().collect(Collectors.toMap(OrganizeEntity::getId, item -> item, (first, second) -> first));
+    }
+
+    /**
+     * 澶勭悊鏁版嵁浼犻�掞紝骞跺瓨鍌ㄥ湪绾跨▼锛屽悗缁繚瀛樻暟鎹簱
+     */
+    public Map<String, Object> dataTransfer(FlowMethod flowMethod) throws WorkFlowException {
+        List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
+        FlowModel flowModel = flowMethod.getFlowModel();
+        Map<String, Object> formData = flowModel.getFormData();
+        TemplateNodeEntity globalEntity = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.GLOBAL.getType())).findFirst().orElse(null);
+        // 鍒ゆ柇鏄惁鑳芥暟鎹紶閫�
+        if (null != globalEntity) {
+            NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
+            if (Boolean.FALSE.equals(global.getHasAloneConfigureForms())) {
+                return formData;
+            }
+        }
+        TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
+        NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+        if (CollUtil.isEmpty(nodeModel.getAssignList())) {
+            return formData;
+        }
+        TaskEntity taskEntity = flowMethod.getTaskEntity();
+        String rejectDataId = taskEntity.getRejectDataId();
+        //淇濆瓨鏁版嵁鐨勮〃鍗�
+        String formId = nodeEntity.getFormId();
+        String taskId = taskEntity.getId();
+        boolean isAssign = flowMethod.getIsAssign();
+        Map<String, Object> data = flowUtil.createOrUpdate(flowMethod);
+        String resultNodeCode = flowMethod.getResultNodeCode();
+        //鍒ゆ柇鏄惁鏄閮ㄨ妭鐐规渶鍚庝竴涓鎵�
+        TemplateNodeEntity resultNode = nodeEntityList.stream().filter(e -> Objects.equals(e.getNodeCode(), resultNodeCode)).findFirst().orElse(null);
+        if (resultNode != null && Objects.equals(resultNode.getNodeType(), NodeEnum.OUTSIDE.getType()) && StringUtils.isNotEmpty(rejectDataId)) {
+            return formData;
+        }
+
+        List<String> typeList = ImmutableList.of(NodeEnum.END.getType(), NodeEnum.SUB_FLOW.getType());
+        if (isAssign) {
+            boolean isWrite = !typeList.contains(nodeModel.getType());
+            FlowContextHolder.addChildData(taskId, formId, data, new ArrayList<>(), isWrite);
+        }
+        return data;
+    }
+
+    // 鍒犻櫎琛ㄥ崟鏁版嵁
+    public void deleteFormData(List<TaskEntity> taskList) {
+        if (taskList.isEmpty()) {
+            return;
+        }
+        List<TemplateNodeEntity> nodeEntityList = new ArrayList<>();
+        List<String> flowIds = taskList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
+        if (!flowIds.isEmpty()) {
+            nodeEntityList = templateNodeMapper.getList(flowIds, null);
+        }
+
+        for (TaskEntity taskEntity : taskList) {
+            List<String> formIds = nodeEntityList.stream().filter(e -> e.getFlowId().equals(taskEntity.getFlowId()) && StringUtils.isNotBlank(e.getFormId())).map(TemplateNodeEntity::getFormId).distinct().collect(Collectors.toList());
+            for (String formId : formIds) {
+                serviceUtil.deleteFormData(formId, taskEntity.getId());
+            }
+        }
+    }
+
+    public List<String> getNextList(String deploymentId, String nodeCode, Map<String, NodeModel> nodes, List<String> nextList) throws WorkFlowException {
+        nextList = nextList != null ? nextList : new ArrayList<>();
+        NextOrPrevFo fo = new NextOrPrevFo();
+        fo.setDeploymentId(deploymentId);
+        fo.setTaskKey(nodeCode);
+        List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(fo);
+        for (FlowableNodeModel next : nextModels) {
+
+            NodeModel nodeModel = nodes.get(next.getId());
+            if (null != nodeModel) {
+                // 瀛愭祦绋嬪線涓嬮�掑綊
+                List<String> typeList = ImmutableList.of(NodeEnum.SUB_FLOW.getType());
+                if (typeList.contains(nodeModel.getType())) {
+                    nextList.add(next.getId());
+                    getNextList(deploymentId, next.getId(), nodes, nextList);
+                } else {
+                    nextList.add(next.getId());
+                }
+            }
+        }
+        return nextList;
+    }
+
+    public void checkTemplateHide(String templateId) throws WorkFlowException {
+        TemplateEntity template = templateMapper.selectById(templateId);
+        if (null != template) {
+            List<Integer> templateStatus = ImmutableList.of(TemplateStatueEnum.UP.getCode(), TemplateStatueEnum.DOWN_CONTINUE.getCode());
+            if (!templateStatus.contains(template.getStatus())) {
+                throw new WorkFlowException(MsgCode.WF140.get());
+            }
+        }
+    }
+
+    public ActionResult<Object> launchFlow(FlowModel flowModel) throws WorkFlowException {
+        String templateId = flowModel.getTemplateId();
+        List<String> userIds = flowModel.getUserIds();
+        List<Map<String, Object>> formDataList = flowModel.getFormDataList();
+        if (CollUtil.isEmpty(formDataList)) {
+            return ActionResult.fail("鏈�夋嫨璁板綍锛屽彂璧峰け璐�");
+        }
+        TemplateEntity template = templateMapper.selectById(templateId);
+        if (null == template) {
+            return ActionResult.fail(MsgCode.WF122.get());
+        }
+        if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.UP.getCode())) {
+            throw new WorkFlowException(MsgCode.WF140.get());
+        }
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(template.getFlowId());
+        List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(jsonEntity.getId());
+        Map<String, NodeModel> nodes = new HashMap<>();
+        for (TemplateNodeEntity node : nodeEntityList) {
+            nodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
+        }
+        FlowMethod method = new FlowMethod();
+        method.setDeploymentId(jsonEntity.getFlowableId());
+        TemplateNodeEntity startNode = nodeEntityList.stream().filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+        if (flowUtil.checkBranch(startNode)) {
+            throw new WorkFlowException(MsgCode.WF147.get());
+        }
+        method.setNodeCode(startNode.getNodeCode());
+        method.setNodes(nodes);
+        method.setNodeEntityList(nodeEntityList);
+        Map<String, Boolean> resMap = conditionUtil.handleCondition(method);
+        // 鍒ゆ柇鏉′欢銆佸�欓�変汉
+        try {
+            conditionUtil.checkCondition(resMap, nodes);
+        } catch (WorkFlowException e) {
+            throw new WorkFlowException(MsgCode.WF133.get());
+        }
+        method.setNextSubFlow(true);
+        List<NodeModel> nextApprover = flowUtil.getNextApprover(method);
+        if (!flowUtil.checkNextCandidates(nextApprover)) {
+            throw new WorkFlowException(MsgCode.WF134.get());
+        }
+
+        String flowId = jsonEntity.getId();
+        // 鍒ゆ柇娴佺▼鏉冮檺
+        List<String> userListAll = serviceUtil.getUserListAll(userIds);
+        FlowFormModel formIdAndFlowId = flowUtil.getFormIdAndFlowId(userListAll, templateId);
+        List<UserEntity> userList = serviceUtil.getUserName(Boolean.TRUE.equals(flowModel.getHasPermission()) ? formIdAndFlowId.getUserId() : formIdAndFlowId.getUserIdAll(), true);
+        if (CollUtil.isEmpty(userList)) {
+            throw new WorkFlowException(MsgCode.WF136.get());
+        }
+        for (UserEntity user : userList) {
+            UserInfo userInfo = new UserInfo();
+            userInfo.setUserId(user.getId());
+            userInfo.setUserName(user.getRealName());
+
+            FlowModel model = new FlowModel();
+            model.setUserInfo(userInfo);
+            model.setFlowId(flowId);
+            model.setStatus(TaskStatusEnum.RUNNING.getCode());
+            model.setDeploymentId(jsonEntity.getFlowableId());
+            model.setNodeEntityList(nodeEntityList);
+            for (Map<String, Object> formData : formDataList) {
+                model.setFormData(formData);
+                if (flowUtil.checkNextError(model, nextApprover, false, false) != 0) {
+                    throw new WorkFlowException(MsgCode.WF135.get());
+                }
+                batchSaveOrSubmit(model);
+                handleTaskStatusThenEvent(model, EventEnum.INIT.getStatus());
+                TaskEntity taskEntity = model.getTaskEntity();
+                if (taskEntity.getRejectDataId() == null) {
+                    autoAudit(model);
+                    handleTaskStatusThenEvent();
+                } else {
+                    handleTaskStatus();
+                }
+            }
+        }
+        return ActionResult.success(MsgCode.SU006.get());
+    }
+
+    public void batchSaveOrSubmit(FlowModel flowModel) throws WorkFlowException {
+        UserInfo userInfo = flowModel.getUserInfo();
+        if (null == userInfo) {
+            userInfo = UserProvider.getUser();
+            flowModel.setUserInfo(userInfo);
+        }
+
+        String delegateUser = flowModel.getDelegateUser();
+        if (StringUtils.isBlank(delegateUser)) {
+            this.saveOrSubmit(flowModel);
+        } else {
+            FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+            model.setDelegateUser(userInfo.getUserId());
+            model.setUserId(delegateUser);
+            UserEntity userEntity = serviceUtil.getUserInfo(delegateUser);
+            if (null != userEntity) {
+                UserInfo info = model.getUserInfo();
+                info.setUserName(userEntity.getRealName());
+                info.setUserAccount(userEntity.getAccount());
+                info.setUserId(userEntity.getId());
+                model.setUserInfo(info);
+            }
+            this.saveOrSubmit(model);
+            // 璧嬪�肩粰鍘熸潵鐨凢lowModel
+            BeanUtil.copyProperties(model, flowModel);
+        }
+        // 淇濆瓨琛ㄥ崟鏁版嵁
+        FlowContextHolder.deleteFormOperator();
+        Map<String, Map<String, Object>> allData = FlowContextHolder.getAllData();
+        Map<String, List<Map<String, Object>>> formOperates = FlowContextHolder.getFormOperates();
+        List<String> writeIdList = FlowContextHolder.getWriteIdList();
+        for (String idAll : writeIdList) {
+            String[] idList = idAll.split(JnpfConst.SIDE_MARK);
+            List<Map<String, Object>> operates = formOperates.get(idAll);
+            Map<String, Object> formData = allData.get(idAll);
+            formData = formData == null ? new HashMap<>() : formData;
+            String flowId = (String) formData.get(FlowFormConstant.FLOWID);
+            FlowFormDataModel formDataModel = FlowFormDataModel.builder().formId(idList[1]).id(idList[0]).map(formData).formOperates(operates).flowId(flowId).isTransfer(true).build();
+            serviceUtil.saveOrUpdateFormData(formDataModel);
+        }
+        FlowContextHolder.clearAll();
+    }
+
+    // 鎻愪氦鎴栨殏瀛�
+    public void saveOrSubmit(FlowModel flowModel) throws WorkFlowException {
+        TemplateEntity templateEntity = null;
+
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(flowModel.getFlowId());
+        if (null == jsonEntity) {
+            templateEntity = templateMapper.getInfo(flowModel.getFlowId());
+            jsonEntity = templateJsonMapper.getInfo(templateEntity.getFlowId());
+        } else {
+            templateEntity = templateMapper.getInfo(jsonEntity.getTemplateId());
+        }
+
+        UserInfo userInfo = flowModel.getUserInfo();
+        List<String> branchList = flowModel.getBranchList();
+        String version = jsonEntity.getVersion();
+
+        //鑷敱娴佺▼
+        if (Objects.equals(templateEntity.getType(), FlowNature.FREE) && Objects.equals(TaskStatusEnum.RUNNING.getCode(), flowModel.getStatus())) {
+            TaskEntity task = taskMapper.selectById(flowModel.getId());
+            if (task == null || Objects.equals(task.getStatus(), TaskStatusEnum.TO_BE_SUBMIT.getCode())) {
+                FreeModel freeParameter = flowModel.getFreeFlowConfig() != null ? flowModel.getFreeFlowConfig() : new FreeModel();
+                freeParameter.setIsEnd(null);
+                String flowId = RandomUtil.uuId();
+
+                List<TemplateNodeEntity> list = templateNodeMapper.getList(jsonEntity.getId());
+
+                String freeNodeName = "鑷敱鑺傜偣";
+                Map<String, Map<String, Object>> approverMap = new HashMap<>();
+                Map<String, Map<String, Object>> flowNodes = new HashMap<>();
+                for (TemplateNodeEntity nodeEntity : list) {
+                    NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+                    Map<String, Object> map = JsonUtil.stringToMap(nodeEntity.getNodeJson());
+                    if (Objects.equals(nodeEntity.getNodeType(), NodeEnum.APPROVER.getType())) {
+                        approverMap.put(nodeEntity.getNodeCode(), map);
+                        freeNodeName = nodeModel.getNodeName().replaceAll(nodeModel.getNodeId(), "");
+                        continue;
+                    }
+                    flowNodes.put(nodeEntity.getNodeCode(), map);
+                }
+                String flowXml = jsonEntity.getFlowXml();
+                for (Map.Entry<String, Map<String, Object>> stringMapEntry : approverMap.entrySet()) {
+                    String key = stringMapEntry.getKey();
+
+                    try {
+                        flowXml = URLDecoder.decode(jsonEntity.getFlowXml(), CharsetKit.UTF_8);
+                        XmlModel model = FlowXmlUtil.model(flowXml, key, true);
+                        String newNodeCode = model.getNewNodeCode();
+                        freeParameter.setNodeId(newNodeCode);
+                        freeParameter.setNodeName(freeNodeName + newNodeCode);
+                        if (Objects.equals(freeParameter.getCounterSign(), FlowNature.IMPROPER_APPROVER)) {
+                            freeParameter.setApproversSortList(freeParameter.getApprovers());
+                        }
+                        flowXml = FlowXmlUtil.xml(model);
+                        Map<String, Object> nodeModel = approverMap.get(key);
+                        Map<String, Object> parameter = JsonUtil.entityToMap(freeParameter);
+                        nodeModel.putAll(parameter);
+                        flowNodes.put(newNodeCode, nodeModel);
+                        flowModel.setFreeCode(newNodeCode);
+                    } catch (Exception e) {
+                        log.info(e.getMessage());
+                    }
+
+                }
+
+
+                TemplateNodeUpFrom form = new TemplateNodeUpFrom();
+                form.setFlowNodes(flowNodes);
+                form.setFlowXml(flowXml);
+                form.setId(templateEntity.getId());
+                form.setFlowId(flowId);
+                form.setIsAddVersion(false);
+                flowUtil.create(form);
+                String deploymentId = flowAbleUrl.deployFlowAble(form.getFlowXml(), RandomUtil.uuId());
+
+                UpdateWrapper<TemplateJsonEntity> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().eq(TemplateJsonEntity::getId, flowId);
+                updateWrapper.lambda().set(TemplateJsonEntity::getState, TemplateJsonStatueEnum.HISTORY.getCode());
+                updateWrapper.lambda().set(TemplateJsonEntity::getFlowableId, deploymentId);
+                templateJsonMapper.update(updateWrapper);
+
+                //璧嬪�艰嚜鐢辨祦绋嬪彂甯冪増鏈�
+                jsonEntity.setId(flowId);
+                jsonEntity.setFlowableId(deploymentId);
+                jsonEntity.setVersion(version);
+                templateEntity.setFlowId(flowId);
+            }
+        }
+
+        // 鑾峰彇鑺傜偣
+        List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(jsonEntity.getId());
+        if (CollUtil.isEmpty(nodeEntityList)) {
+            throw new WorkFlowException(MsgCode.WF076.get());
+        }
+        Map<String, NodeModel> nodes = new HashMap<>();
+        for (TemplateNodeEntity nodeEntity : nodeEntityList) {
+            nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
+        }
+
+        flowModel.setJsonEntity(jsonEntity);
+        TaskEntity entity = flowUtil.createEntity(flowModel, templateEntity, nodes);
+        // 寮�濮嬭妭鐐�
+        TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(null);
+        if (null == nodeEntity) {
+            throw new WorkFlowException(MsgCode.WF076.get());
+        }
+        String nodeCode = nodeEntity.getNodeCode();
+        // 浼犻�掗儴缃瞚d銆佽妭鐐归泦鍚�
+        String deploymentId = jsonEntity.getFlowableId();
+        flowModel.setDeploymentId(deploymentId);
+        flowModel.setNodeEntityList(nodeEntityList);
+        flowModel.setNodes(nodes);
+        flowModel.setNodeEntity(nodeEntity);
+
+        NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+        // 琛ㄥ崟涓婚敭
+        String formId = nodeEntity.getFormId();
+
+        Map<String, Object> data = flowModel.getFormData();
+        data.put(FlowFormConstant.FLOWID, jsonEntity.getId());
+        FlowMethod flowMethod = new FlowMethod();
+        flowMethod.setDeploymentId(deploymentId);
+        flowMethod.setNodeCode(nodeCode);
+        flowMethod.setFormData(data);
+        flowMethod.setNodes(nodes);
+        flowMethod.setTaskEntity(entity);
+
+        addTask(ImmutableList.of(entity.getId()));
+        FlowFormDataModel model = new FlowFormDataModel();
+        model.setFormId(formId);
+        model.setId(entity.getId());
+        model.setFormOperates(nodeModel.getFormOperates());
+        model.setMap(flowModel.getFormData());
+        model.setFlowId(jsonEntity.getId());
+
+        if (ObjectUtil.equals(TaskStatusEnum.TO_BE_SUBMIT.getCode(), flowModel.getStatus())) {
+            // 鐢熸垚浠诲姟锛屼繚瀛樿〃鍗曟暟鎹�
+            if (Boolean.TRUE.equals(flowModel.getSubFlow())) {
+                model.setIsTransfer(true);
+            }
+            // 鑿滃崟鍏ュ彛銆佺紪杈�
+            if (Objects.equals(flowModel.getIsFlow(), 0)) {
+                serviceUtil.saveOrUpdateFormData(model);
+                entity.setLastModifyTime(new Date());
+                entity.setLastModifyUserId(null != userInfo ? userInfo.getUserId() : UserProvider.getLoginUserId());
+                taskMapper.updateById(entity);
+                flowModel.setTaskEntity(entity);
+                return;
+            }
+
+            if (StringUtils.isEmpty(flowModel.getId())) {
+                entity.setStatus(TaskStatusEnum.TO_BE_SUBMIT.getCode());
+                if (taskMapper.insert(entity) > 0) {
+                    // 淇濆瓨琛ㄥ崟鏁版嵁
+                    serviceUtil.saveOrUpdateFormData(model);
+                }
+            } else {
+                // 鎴戝彂璧风殑鏆傚瓨 鐩存帴淇敼琛ㄥ崟鏁版嵁
+                serviceUtil.saveOrUpdateFormData(model);
+            }
+            flowModel.setTaskEntity(entity);
+        } else if (ObjectUtil.equals(TaskStatusEnum.RUNNING.getCode(), flowModel.getStatus())) {
+            // 閫�鍥炲埌鍙戣捣
+            if (null != entity.getRejectDataId()) {
+                serviceUtil.saveOrUpdateFormData(model);
+                RejectDataEntity rejectData = rejectDataMapper.getInfo(entity.getRejectDataId());
+                String taskJson = rejectData.getTaskJson();
+
+                TaskEntity srcTask = JsonUtil.getJsonToBean(taskJson, TaskEntity.class);
+                srcTask.setRejectDataId(rejectData.getId());
+
+                OperatorEntity operator = new OperatorEntity();
+                operator.setNodeCode(rejectData.getNodeCode());
+
+
+                flowModel.setOperatorEntity(operator);
+                flowModel.setTaskEntity(srcTask);
+                handleRejectData(flowModel);
+
+
+                // 璁板綍
+                flowMethod.setFlowModel(flowModel);
+                flowMethod.setType(RecordEnum.SUBMIT.getCode());
+                OperatorEntity operatorEntity = new OperatorEntity();
+                operatorEntity.setNodeCode(nodeEntity.getNodeCode());
+                operatorEntity.setNodeName(nodeModel.getNodeName());
+                operatorEntity.setTaskId(entity.getId());
+                if (StringUtils.isNotBlank(flowModel.getUserId())) {
+                    flowMethod.setHandId(flowModel.getUserId());
+                }
+                flowMethod.setOperatorEntity(operatorEntity);
+                recordMapper.createRecord(flowMethod);
+
+                return;
+            }
+
+            // 鍒ゆ柇鏉′欢
+            Map<String, Boolean> resMap = new HashMap<>();
+            if (branchList.isEmpty()) {
+                resMap.putAll(conditionUtil.handleCondition(flowMethod));
+                // 鍏ㄦ槸false锛岃鏄庢病鏈夊垎鏀彲璧�
+                conditionUtil.checkCondition(resMap, nodes);
+            } else {
+                // 閫夋嫨鍒嗘敮鐨勫鐞�
+                resMap.putAll(conditionUtil.getForBranch(flowMethod, branchList));
+            }
+            // 寮曟搸鍚姩鐨勫彉閲�
+            Map<String, Object> variables = new HashMap<>(resMap);
+            // 鐢熸垚寮曟搸瀹炰緥
+            String instanceId = entity.getInstanceId();
+            if (entity.getInstanceId() == null) {
+                taskLineMapper.create(entity.getId(), resMap);
+                instanceId = flowAbleUrl.startInstance(jsonEntity.getFlowableId(), variables);
+                entity.setInstanceId(instanceId);
+            }
+            entity.setEngineType(1);
+            entity.setStatus(TaskStatusEnum.RUNNING.getCode());
+            entity.setStartTime(new Date());
+            // 鐢熸垚浠诲姟
+            try {
+                TaskEntity task = taskMapper.selectById(entity.getId());
+                if (null == task) {
+                    taskMapper.insert(entity);
+                } else {
+                    entity.setStatus(TaskStatusEnum.RUNNING.getCode());
+                    taskMapper.updateById(entity);
+                }
+                flowModel.setTaskEntity(entity);
+                serviceUtil.saveOrUpdateFormData(model);
+                data = serviceUtil.infoData(formId, entity.getId());
+                // 琛ㄥ崟鏁版嵁瀛樺偍
+                data.put(FlowFormConstant.FLOWID, jsonEntity.getId());
+                FlowContextHolder.addChildData(entity.getId(), nodeEntity.getFormId(), data, nodeModel.getFormOperates(), false);
+                flowModel.setFormData(data);
+                // 娴佺▼鍙傛暟
+                NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+                updateGlobalParam(entity, nodeModel, global, flowModel.getFormData());
+                // 璁板綍
+                flowMethod.setFlowModel(flowModel);
+                flowMethod.setType(RecordEnum.SUBMIT.getCode());
+                OperatorEntity operatorEntity = new OperatorEntity();
+                operatorEntity.setNodeCode(nodeEntity.getNodeCode());
+                operatorEntity.setNodeName(nodeModel.getNodeName());
+                operatorEntity.setTaskId(entity.getId());
+                if (StringUtils.isNotBlank(flowModel.getUserId())) {
+                    flowMethod.setHandId(flowModel.getUserId());
+                }
+                operatorEntity.setHandleTime(entity.getStartTime());
+                flowMethod.setOperatorEntity(operatorEntity);
+                recordMapper.createRecord(flowMethod);
+                // 鑺傜偣璁板綍
+                NodeRecordModel nodeRecordModel = new NodeRecordModel();
+                nodeRecordModel.setTaskId(entity.getId());
+                nodeRecordModel.setNodeCode(nodeEntity.getNodeCode());
+                nodeRecordModel.setNodeName(nodeModel.getNodeName());
+                nodeRecordModel.setNodeStatus(NodeStateEnum.SUBMIT.getCode());
+                nodeRecordMapper.create(nodeRecordModel);
+
+                // 淇濆瓨鍊欓�変汉銆佸紓甯镐汉
+                flowUtil.create(flowModel, entity.getId(), nodeEntityList, null);
+                // 淇濆瓨鍙戣捣鐢ㄦ埛淇℃伅
+                flowUtil.createLaunchUser(entity.getId(), entity.getCreatorUserId());
+
+                // 鐢熸垚缁忓姙
+                List<OperatorEntity> operatorEntities = handleOperator(flowModel);
+
+                // 绯荤粺瀹℃壒
+                systemAudit();
+                // 娑堟伅
+                FlowMsgModel flowMsgModel = new FlowMsgModel();
+                flowMsgModel.setNodeList(nodeEntityList);
+                flowMsgModel.setTaskEntity(entity);
+                flowMsgModel.setUserInfo(flowModel.getUserInfo());
+                flowMsgModel.setOperatorList(operatorEntities);
+                flowMsgModel.setFormData(FlowContextHolder.getAllData());
+                msgUtil.message(flowMsgModel);
+
+            } catch (WorkFlowException e) {
+                // 寮傚父锛屾墜鍔ㄥ垹闄ゅ疄渚�
+                flowAbleUrl.deleteInstance(instanceId, "submitException");
+                throw e;
+            }
+        }
+    }
+
+    public List<OperatorEntity> handleOperator(FlowModel flowModel) throws WorkFlowException {
+        TaskEntity taskEntity = flowModel.getTaskEntity();
+        List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
+        Map<String, NodeModel> nodes = flowModel.getNodes();
+        Map<String, Object> formData = flowModel.getFormData();
+        String instanceId = taskEntity.getInstanceId();
+        String deploymentId = flowModel.getDeploymentId();
+        NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+        OperatorEntity operatorEntity = flowModel.getOperatorEntity();
+        // 鏈�缁堣杩斿洖涓�涓墍鏈夎妭鐐逛笅鐨勫鎵逛汉鐨勯泦鍚�
+        List<OperatorEntity> list = new ArrayList<>();
+
+        // 鍘熸潵鐨勫綋鍓嶈妭鐐�
+        List<String> srcCurrentList = StringUtils.isNotEmpty(taskEntity.getCurrentNodeCode()) ? Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList()) : new ArrayList<>();
+
+        // 鑾峰彇寮曟搸褰撳墠浠诲姟
+        List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
+        if (CollUtil.isEmpty(taskModelList)) {
+            return list;
+        }
+        updateCurrentNode(taskModelList, nodes, taskEntity);
+        List<String> types = ImmutableList.of(NodeEnum.SUB_FLOW.getType(), NodeEnum.APPROVER.getType(), NodeEnum.PROCESSING.getType(), NodeEnum.OUTSIDE.getType());
+        List<FlowErrorModel> errorList = new ArrayList<>();
+        //绯荤粺鐢ㄦ埛
+        List<SystemAuditModel> systemList = new ArrayList<>();
+        // 鐢熸垚缁忓姙
+        for (FlowableTaskModel model : taskModelList) {
+            // 褰撳墠鑺傜偣宸插瓨鍦紝璺宠繃
+            if (CollUtil.isNotEmpty(srcCurrentList) && srcCurrentList.contains(model.getTaskKey())) {
+                continue;
+            }
+            // 鑾峰彇瀵瑰簲鐨勮妭鐐逛俊鎭�
+            TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                    .filter(e -> e.getNodeCode().equals(model.getTaskKey())).findFirst().orElse(null);
+            if (null == nodeEntity) {
+                continue;
+            }
+            NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+            if (nodeModel == null) {
+                continue;
+            }
+            // 涓嶆槸瀹℃壒銆佸瓙娴佺▼銆佸閮ㄣ�佸姙鐞嗚妭鐐�
+            if (!types.contains(nodeModel.getType())) {
+                continue;
+            }
+            FlowMethod flowMethod = new FlowMethod();
+            flowMethod.setTaskEntity(taskEntity);
+            flowMethod.setNodeEntity(nodeEntity);
+            flowMethod.setNodeEntityList(nodeEntityList);
+            flowMethod.setFlowModel(flowModel);
+            // 娴佺▼鍙傛暟
+            updateGlobalParam(taskEntity, nodeModel, global, flowModel.getFormData());
+            flowModel.setFlowableTaskId(model.getTaskId());
+            List<String> typeList = ImmutableList.of(NodeEnum.SUB_FLOW.getType(), NodeEnum.OUTSIDE.getType());
+            // 澶勭悊瀛愭祦绋嬭妭鐐广�佸閮ㄨ妭鐐癸紝浼犻�掕〃鍗曟暟鎹�
+            boolean isOutside = Objects.equals(nodeModel.getType(), NodeEnum.OUTSIDE.getType());
+            if (typeList.contains(nodeModel.getType())) {
+                if (StringUtils.isEmpty(taskEntity.getRejectDataId()) && CollUtil.isEmpty(flowModel.getErrorRuleUserList())) {
+                    FlowMethod method = new FlowMethod();
+                    method.setDeploymentId(flowModel.getDeploymentId());
+                    method.setNodeCode(nodeModel.getNodeId());
+                    method.setNodes(flowModel.getNodes());
+                    method.setFormData(flowModel.getFormData());
+                    List<NodeModel> nextApprover = flowUtil.getNextApprover(method);
+                    int nextError = flowUtil.checkNextError(flowModel, nextApprover, true, true, true);
+                    if (nextError == 3) {
+                        errorList.addAll(flowModel.getErrorList());
+                        flowModel.setErrorList(new ArrayList<>());
+                        continue;
+                    } else if (nextError == 2) {
+                        throw new WorkFlowException(MsgCode.WF061.get());
+                    }
+                }
+                flowModel.setOperatorEntity(operatorEntity);
+                if (isOutside) {
+                    //澶栭儴鑺傜偣
+                    String eventId = RandomUtil.uuId();
+                    Map<String, List<TemplateJsonModel>> outsideOptions = nodeModel.getOutsideOptions();
+                    String resultNodeCode = flowUtil.resultNodeCode(flowMethod);
+                    List<TemplateJsonModel> templateJsonModelList = outsideOptions.get(resultNodeCode) != null ? outsideOptions.get(resultNodeCode) : new ArrayList<>();
+                    FlowModel outsideModel = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+                    outsideModel.setNodeCode(nodeModel.getNodeId());
+                    TemplateNodeEntity resultNode = nodeEntityList.stream().filter(e -> Objects.equals(e.getNodeCode(), resultNodeCode)).findFirst().orElse(null);
+                    if (resultNode != null) {
+                        outsideModel.setFormData(flowUtil.infoData(resultNode.getFormId(), taskEntity.getId()));
+                    }
+                    Map<String, String> parameterData = outsideData(outsideModel, templateJsonModelList, FlowContextHolder.getAllData(), resultNodeCode, eventId);
+                    //淇濆瓨澶栭儴鑺傜偣浜嬩欢鏁版嵁
+                    EventLogEntity eventLog = new EventLogEntity();
+                    eventLog.setId(eventId);
+                    eventLog.setTaskId(taskEntity.getId());
+                    eventLog.setNodeId(model.getTaskId());
+                    eventLog.setNodeName(nodeModel.getNodeName());
+                    eventLog.setNodeCode(nodeModel.getNodeId());
+                    eventLog.setType(nodeModel.getType());
+                    eventLog.setUpNode(resultNodeCode);
+                    eventLog.setInterfaceId(nodeModel.getFormId());
+                    eventLog.setData(JsonUtil.getObjectToString(formData));
+                    eventLog.setStatus(FlowNature.LOSE);
+                    if (StringUtils.isNotEmpty(operatorEntity.getHandleId())) {
+                        eventLog.setCreatorUserId(operatorEntity.getHandleId());
+                    }
+                    eventLogMapper.create(eventLog);
+                    EventModel event = JsonUtil.getJsonToBean(eventLog, EventModel.class);
+                    event.setParameterData(parameterData);
+                    FlowEventHolder.addOutsideEvent(event, FlowContextHolder.getAllData());
+                } else {
+                    //瀛愭祦绋�
+                    handleSubFlow(nodeEntity, flowModel);
+                }
+                continue;
+            }
+            dataTransfer(flowMethod);
+            flowMethod.setNodeModel(nodeModel);
+            flowMethod.setFormData(formData);
+            flowMethod.setDeploymentId(deploymentId);
+            flowMethod.setNodeCode(nodeEntity.getNodeCode());
+            flowMethod.setNodes(nodes);
+            // 鑺傜偣鑷姩瀹℃壒
+            if (taskEntity.getRejectDataId() == null) {
+                flowMethod.setFormData(flowUtil.createOrUpdate(flowMethod));
+                int flag = checkAuto(flowMethod);
+                if (flag == 1 || flag == 2) {
+                    // 鍒ゆ柇涓嬩竴绾ф槸鍚﹀瓨鍦ㄥ�欓�変汉锛屽瓨鍦ㄥ�欓�変汉杩斿洖false
+                    List<NodeModel> nextApprover;
+                    boolean mark = true;
+                    try {
+                        nextApprover = flowUtil.getNextApprover(flowMethod);
+                    } catch (WorkFlowException e) {
+                        nextApprover = null;
+                        mark = false;
+                    }
+                    Map<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
+                    try {
+                        conditionUtil.checkCondition(resMap, nodes);
+                    } catch (WorkFlowException e) {
+                        mark = false;
+                    }
+                    // 涓嬩竴鑺傜偣鐨勬潯浠跺垽鏂笉婊¤冻锛屼笉瑙﹀彂绯荤粺瀹℃壒
+                    if (mark) {
+                        boolean isBranch = flowUtil.checkBranch(nodeModel);
+                        int nextError = flowUtil.checkNextError(flowModel, nextApprover, false, false);
+                        if (!isBranch && flowUtil.checkNextCandidates(nextApprover) && nextError == 0) {
+                            flowModel.setHandleOpinion("绯荤粺瀹℃壒");
+                            flowModel.setSignImg(null);
+                            flowModel.setFileList(null);
+                            flowModel.setHandleStatus(flag == 1 ? FlowNature.AUDIT_COMPLETION : FlowNature.REJECT_COMPLETION);
+                            flowMethod.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class));
+                            flowMethod.setNodeModel(nodeModel);
+                            OperatorEntity operator = saveSystemOperator(flowMethod);
+                            SystemAuditModel systemAuditModel = new SystemAuditModel();
+                            systemAuditModel.setOperator(operator);
+                            systemAuditModel.setFlowModel(flowMethod.getFlowModel());
+                            systemList.add(systemAuditModel);
+                            continue;
+                        }
+                    }
+                }
+            }
+
+            // 鑾峰彇瀹℃壒浜�
+            flowMethod.setErrorRule(true);
+            flowMethod.setExtraRule(true);
+            List<String> userIds = flowUtil.userListAll(flowMethod);
+            // 鑾峰彇姝e父鐨勭敤鎴�
+            List<UserEntity> users = serviceUtil.getUserName(userIds, true);
+            // 鍏ㄥ眬寮傚父澶勭悊
+            if (users.isEmpty()) {
+                // 鑷姩閫氳繃
+                Integer pass = flowMethod.getPass();
+                if (pass > 0) {
+                    // 鑷姩瀹℃壒 瑕佸垽鏂�欓�変汉绛�
+                    boolean mark = true;
+                    List<NodeModel> nextApprover;
+                    try {
+                        nextApprover = flowUtil.getNextApprover(flowMethod);
+                    } catch (WorkFlowException e) {
+                        // 寮傚父鑺傜偣锛堥粯璁ら�氳繃锛変笅鏉′欢涓嶆弧瓒炽�佸�欓�変汉锛岃蛋admin鍏滃簳鏂规
+                        nextApprover = null;
+                        mark = false;
+                    }
+                    Map<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
+                    try {
+                        conditionUtil.checkCondition(resMap, nodes);
+                    } catch (WorkFlowException e) {
+                        mark = false;
+                    }
+                    if (mark && !flowUtil.checkBranch(nodeModel) && flowUtil.checkNextCandidates(nextApprover)) {
+                        flowModel.setHandleOpinion(ObjectUtil.equals(nodeModel.getType(), NodeEnum.PROCESSING.getType()) ? "榛樿鍔炵悊閫氳繃" : "榛樿瀹℃壒閫氳繃");
+                        flowModel.setSignImg(null);
+                        flowModel.setFileList(null);
+                        flowModel.setHandleStatus(FlowNature.AUDIT_COMPLETION);
+                        flowMethod.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class));
+                        flowMethod.setNodeModel(nodeModel);
+                        OperatorEntity operator = saveSystemOperator(flowMethod);
+                        SystemAuditModel systemAuditModel = new SystemAuditModel();
+                        systemAuditModel.setOperator(operator);
+                        systemAuditModel.setFlowModel(flowMethod.getFlowModel());
+                        SystemAuditHolder.add(systemAuditModel);
+                        continue;
+                    } else {
+                        String admin = serviceUtil.getAdmin();
+                        UserEntity userEntity = serviceUtil.getUserInfo(admin);
+                        users.add(userEntity);
+                    }
+                }
+                // 涓婁竴鑺傜偣瀹℃壒浜烘寚瀹氬鐞嗕汉
+                Integer node = flowMethod.getNode();
+                if (node > 0) {
+                    flowUtil.handleErrorRule(nodeModel, errorList);
+                }
+                // 鏃犳硶鎻愪氦
+                Integer notSubmit = flowMethod.getNotSubmit();
+                if (notSubmit > 0) {
+                    throw new WorkFlowException(MsgCode.WF061.get());
+                }
+            }
+            userIds = users.stream().map(UserEntity::getId).collect(Collectors.toList());
+            flowMethod.setNodeModel(nodeModel);
+            flowMethod.setUserIds(userIds);
+            flowMethod.setFlowModel(flowModel);
+            List<OperatorEntity> operator = createOperator(flowMethod);
+            list.addAll(operator);
+            //淇濆瓨閫愮骇鐢ㄦ埛鏁版嵁
+            LaunchUserEntity launchUser = flowMethod.getLaunchUser();
+            if (launchUser != null) {
+                launchUserMapper.insert(launchUser);
+            }
+        }
+
+        //淇濆瓨绯荤粺鐢ㄦ埛
+        for (SystemAuditModel systemAuditModel : systemList) {
+            SystemAuditHolder.add(systemAuditModel);
+        }
+
+        if (!errorList.isEmpty()) {
+            AuditModel model = new AuditModel();
+            model.setErrorCodeList(new HashSet<>(errorList));
+            throw new WorkFlowException(200, JsonUtil.getObjectToString(model));
+        }
+        addOperatorList(list, flowModel);
+        return list;
+    }
+
+    public CandidateCheckVo checkCandidates(String id, CandidateCheckFo fo) throws WorkFlowException {
+        CandidateCheckVo vo = new CandidateCheckVo();
+        List<CandidateListModel> list = new ArrayList<>();
+
+        String flowId = fo.getFlowId();
+        String nodeCode = null;
+        Map<String, Object> formData = fo.getFormData();
+        String taskId = fo.getId();
+
+        TemplateEntity template;
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(flowId);
+        if (null == jsonEntity) {
+            template = templateMapper.getInfo(flowId);
+            jsonEntity = templateJsonMapper.getInfo(template.getFlowId());
+        } else {
+            template = templateMapper.getInfo(jsonEntity.getTemplateId());
+        }
+        if (ObjectUtil.equals(id, FlowNature.PARENT_ID)) {
+            if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.UP.getCode())) {
+                throw new WorkFlowException(MsgCode.WF140.get());
+            }
+        } else {
+            List<Integer> templateStatus = ImmutableList.of(TemplateStatueEnum.UP.getCode(), TemplateStatueEnum.DOWN_CONTINUE.getCode());
+            if (!templateStatus.contains(template.getStatus())) {
+                throw new WorkFlowException(MsgCode.WF140.get());
+            }
+        }
+        if (StringUtils.isNotBlank(fo.getDelegateUser())) {
+            List<String> launchPermission = serviceUtil.getPermission(fo.getDelegateUser());
+            if (ObjectUtil.equals(template.getVisibleType(), FlowNature.AUTHORITY) && !launchPermission.contains(template.getId())) {
+                throw new WorkFlowException(MsgCode.WF129.get());
+            }
+        }
+
+        List<TemplateNodeEntity> nodeEntities = templateNodeMapper.getList(jsonEntity.getId());
+
+        Map<String, NodeModel> nodes = new HashMap<>();
+        for (TemplateNodeEntity nodeEntity : nodeEntities) {
+            nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
+        }
+        NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+
+        TemplateNodeEntity currentNode;
+        OperatorEntity operatorEntity = new OperatorEntity();
+        // 榛樿鑾峰彇寮�濮嬭妭鐐圭紪鐮�
+        if (StringUtils.equals(id, FlowNature.PARENT_ID)) {
+            currentNode = nodeEntities.stream()
+                    .filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(null);
+        } else {
+            operatorEntity = operatorMapper.getInfo(id);
+            if (operatorEntity == null) {
+                throw new WorkFlowException(MsgCode.FA001.get());
+            }
+            // 鍔犵鐨勭粡鍔炴棤闇�閫夋嫨鍊欓�変汉
+            if (!ObjectUtil.equals(operatorEntity.getParentId(), FlowNature.PARENT_ID)) {
+                vo.setList(list);
+                return vo;
+            }
+            String finalNodeCode = operatorEntity.getNodeCode();
+            currentNode = nodeEntities.stream().filter(e -> StringUtils.equals(finalNodeCode, e.getNodeCode())).findFirst().orElse(null);
+            taskId = operatorEntity.getTaskId();
+        }
+        RevokeEntity revokeEntity = revokeMapper.getRevokeTask(taskId);
+        if (null != revokeEntity) {
+            vo.setList(list);
+            return vo;
+        }
+        if (null == currentNode) {
+            throw new WorkFlowException(MsgCode.WF076.get());
+        }
+        nodeCode = currentNode.getNodeCode();
+        NodeModel currentNodeModel = nodes.get(nodeCode);
+
+        UserInfo userInfo = UserProvider.getUser();
+        // 鍒ゆ柇鏉′欢
+        TaskEntity taskEntity = taskMapper.selectById(taskId);
+        if (taskEntity == null) {
+            FlowModel flowModel = new FlowModel();
+            flowModel.setFlowId(flowId);
+            flowModel.setFormData(formData);
+            flowModel.setDelegateUser(fo.getDelegateUser());
+            flowModel.setUserInfo(userInfo);
+            flowModel.setJsonEntity(jsonEntity);
+            taskEntity = flowUtil.createEntity(flowModel, template, nodes);
+            taskEntity.setStatus(TaskStatusEnum.TO_BE_SUBMIT.getCode());
+        }
+        if (ObjectUtil.isNotEmpty(taskEntity.getRejectDataId())) {
+            return vo;
+        }
+        getGlobalParam(taskEntity, nodes.get(nodeCode), nodes.get(NodeEnum.GLOBAL.getType()), formData);
+        FlowMethod flowMethod = new FlowMethod();
+        flowMethod.setDeploymentId(jsonEntity.getFlowableId());
+        flowMethod.setNodeCode(nodeCode);
+        flowMethod.setFormData(formData);
+        flowMethod.setNodes(nodes);
+        flowMethod.setTaskEntity(taskEntity);
+        flowMethod.setUserInfo(userInfo);
+        flowMethod.setAuditFlag(true);
+        Map<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
+
+        CounterSignConfig counterSignConfig = currentNodeModel.getCounterSignConfig();
+        boolean delay = ObjectUtil.equals(counterSignConfig.getCalculateType(), FlowNature.DELAY);
+
+        String divideRule = currentNodeModel.getDivideRule();
+        boolean branchFlow = ObjectUtil.equals(DivideRuleEnum.CHOOSE.getType(), divideRule);
+
+        //涓嬩竴涓妭鐐�
+        NextOrPrevFo nextOrPrevFo = new NextOrPrevFo();
+        nextOrPrevFo.setDeploymentId(jsonEntity.getFlowableId());
+        nextOrPrevFo.setTaskKey(currentNode.getNodeCode());
+        List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(nextOrPrevFo);
+        List<String> nextCodes = nextModels.stream().map(FlowableNodeModel::getId).collect(Collectors.toList());
+        //璧嬪��
+        operatorEntity.setHandleStatus(fo.getHandleStatus());
+        flowMethod.setOperatorEntity(operatorEntity);
+        flowMethod.setNodeModel(currentNodeModel);
+        flowMethod.setHandleStatus(fo.getHandleStatus());
+        // 鍒ゆ柇姣斾緥
+        boolean auditRes = checkAudit(flowMethod);
+        //鑷敱娴佺▼
+        if (Objects.equals(template.getType(), FlowNature.FREE)) {
+            if (auditRes) {
+                boolean isAudit = ObjectUtil.equals(flowMethod.getHandleStatus(), FlowNature.AUDIT_COMPLETION);
+                boolean isReject = !isAudit && Boolean.TRUE.equals(global.getHasContinueAfterReject());
+                if (isAudit || isReject) {
+                    List<NodeModel> nodeModels = new ArrayList<>(nodes.values());
+                    List<NodeModel> approverList = nodeModels.stream().filter(e -> Objects.equals(e.getType(), NodeEnum.APPROVER.getType())).collect(Collectors.toList());
+                    List<NodeModel> nextList = approverList.stream().filter(e -> nextCodes.contains(e.getNodeId())).collect(Collectors.toList());
+                    NodeModel approverNode = approverList.isEmpty() ? new NodeModel() : approverList.get(0);
+                    vo.setOneSelfEndApproval(approverNode.getOneSelfEndApproval());
+                    int approvaNumber = approverNode.getApprovalNumber();
+                    if (Objects.equals(TaskStatusEnum.TO_BE_SUBMIT.getCode(), taskEntity.getStatus())) {
+                        vo.setType(4);
+                    } else {
+                        boolean isNextApprover = approvaNumber > approverList.size() && nextList.isEmpty();
+                        if (isNextApprover) {
+                            vo.setType(4);
+                        }
+                    }
+                }
+            }
+            return vo;
+        }
+
+        // 鎷掔粷 涓� 閰嶇疆鎷掔粷涓嶅厑璁哥户缁祦杞� 鐩存帴杩斿洖
+        if (Boolean.FALSE.equals(global.getHasContinueAfterReject()) && ObjectUtil.equals(fo.getHandleStatus(), FlowNature.REJECT_COMPLETION)) {
+            vo.setList(list);
+            return vo;
+        }
+        // 鍏ㄦ槸false锛岃鏄庢病鏈夊垎鏀彲璧�
+        if (!branchFlow && !delay) {
+            conditionUtil.checkCondition(resMap, nodes);
+        } else {
+            // 閫夋嫨鍒嗘敮銆佷笖涓嶆槸鏈�鍚庝竴涓鎵逛汉锛岀洿鎺ヨ繑鍥�
+            // 鍒犻櫎鍘熷厛瀛樺湪鐨勪笅涓�绾у�欓�変汉
+            if (CollUtil.isNotEmpty(nextCodes)) {
+                candidatesMapper.deleteByCodes(taskId, nextCodes);
+            }
+            if (!auditRes) {
+                return vo;
+            }
+        }
+        List<String> typeList = ImmutableList.of(NodeEnum.EVENT_TRIGGER.getType(), NodeEnum.TIME_TRIGGER.getType(),
+                NodeEnum.NOTICE_TRIGGER.getType(), NodeEnum.WEBHOOK_TRIGGER.getType(), NodeEnum.TRIGGER.getType());
+        List<String> connectList = global.getConnectList();
+        List<String> flows = flowMethod.getOutgoingFlows();
+        // 鍒ゆ柇鎺掍粬
+        boolean isExclusive = ObjectUtil.equals(currentNodeModel.getDivideRule(), DivideRuleEnum.EXCLUSIVE.getType());
+        boolean exclusive = false;
+        // 鏍规嵁true鐨勫垎鏀幏鍙栬妭鐐�
+        for (String key : flows) {
+            if (!connectList.contains(key)) {
+                continue;
+            }
+            if (!branchFlow) {
+                if (Boolean.FALSE.equals(resMap.get(key))) {
+                    continue;
+                }
+                if (exclusive) { // 鏍囪瘑涓簍rue锛岃鏄庢帓浠栫殑绗竴涓潯浠朵负true
+                    break;
+                }
+                if (isExclusive) {// 鎺掍粬缃戝叧 鍙樻洿鏍囪瘑
+                    exclusive = true;
+                }
+            }
+            // 鑾峰彇杩炴帴绾跨殑鐩爣鑺傜偣
+            List<String> nodeKey = flowAbleUrl.getTaskKeyAfterFlow(jsonEntity.getFlowableId(), key);
+            if (CollUtil.isEmpty(nodeKey)) {
+                continue;
+            }
+            NodeModel nodeModel = nodes.get(nodeKey.get(0));
+            if (null == nodeModel) {
+                continue;
+            }
+            if (typeList.contains(nodeModel.getType())) {
+                continue;
+            }
+            //澶勭悊鍏ㄥ眬鐨勬暟鎹紶閫�
+            Map<String, Object> dataMap = new HashMap<>();
+            for (Map.Entry<String, Object> stringObjectEntry : formData.entrySet()) {
+                String dataKey = stringObjectEntry.getKey();
+                dataMap.put(dataKey, formData.get(dataKey));
+                dataMap.put(dataKey + FlowNature.FORM_FIELD_SUFFIX, formData.get(dataKey));
+            }
+            FlowMethod jsonToBean = JsonUtil.getJsonToBean(flowMethod, FlowMethod.class);
+            jsonToBean.setNodeModel(nodeModel);
+            jsonToBean.setNodeEntityList(nodeEntities);
+            jsonToBean.setDeploymentId(jsonEntity.getFlowableId());
+            List<Assign> assignList = nodeModel.getAssignList().stream().filter(t -> t.getNodeId().equals(currentNode.getNodeCode())).collect(Collectors.toList());
+            Map<String, Object> nodeDataAll = flowUtil.formData(dataMap, assignList, taskEntity, jsonToBean);
+            getGlobalParam(taskEntity, nodeModel, nodes.get(NodeEnum.GLOBAL.getType()), nodeDataAll);
+            operatorEntity.setHandleId(StringUtils.isEmpty(operatorEntity.getHandleId()) ? taskEntity.getCreatorUserId() : operatorEntity.getHandleId());
+            jsonToBean.setNodeEntityList(nodeEntities);
+            jsonToBean.setNodeEntity(nodeEntities.stream().filter(t -> t.getNodeCode().equals(nodeKey.get(0))).findFirst().orElse(new TemplateNodeEntity()));
+            FlowModel flowModel = new FlowModel();
+            flowModel.setOperatorEntity(operatorEntity);
+            flowModel.setDeploymentId(jsonEntity.getFlowableId());
+            flowModel.setFormData(nodeDataAll);
+            jsonToBean.setFlowModel(flowModel);
+            getCandidateListModel(jsonToBean, list);
+            List<String> nextTypeList = ImmutableList.of(NodeEnum.SUB_FLOW.getType());
+            if (nextTypeList.contains(nodeModel.getType())) {
+                // 鍒ゆ柇瀛愭祦绋嬨�佸閮ㄨ妭鐐癸紝鑾峰彇瀹℃壒鑺傜偣
+                jsonToBean.setNodeCode(nodeModel.getNodeId());
+                jsonToBean.setNextSubFlow(true);
+                List<NodeModel> nextApprover = flowUtil.getNextApprover(jsonToBean);
+                for (NodeModel node : nextApprover) {
+                    List<Assign> nodeAssignList = node.getAssignList().stream().filter(t -> t.getNodeId().equals(currentNode.getNodeCode())).collect(Collectors.toList());
+                    flowModel.setFormData(flowUtil.formData(dataMap, nodeAssignList, taskEntity, jsonToBean));
+                    getGlobalParam(taskEntity, node, nodes.get(NodeEnum.GLOBAL.getType()), nodeDataAll);
+                    jsonToBean.setNodeModel(node);
+                    jsonToBean.setNodeEntity(nodeEntities.stream().filter(t -> t.getNodeCode().equals(node.getNodeId())).findFirst().orElse(new TemplateNodeEntity()));
+                    getCandidateListModel(jsonToBean, list);
+                }
+            }
+        }
+        // 鑾峰彇宸查�夋嫨鐨勫�欓�変汉
+        Integer counterSign = currentNodeModel.getCounterSign();
+        if (StringUtils.isNotBlank(taskId) && !ObjectUtil.equals(counterSign, FlowNature.FIXED_APPROVER)) {
+            for (CandidateListModel model : list) {
+                List<CandidatesEntity> candidates = candidatesMapper.getList(taskId, model.getNodeCode());
+                String candidateStr = candidates.stream().map(CandidatesEntity::getCandidates).collect(Collectors.joining(","));
+                if (StringUtils.isNotEmpty(candidateStr)) {
+                    List<String> selected = new ArrayList<>();
+                    List<String> userIds = Arrays.stream(candidateStr.split(",")).distinct().collect(Collectors.toList());
+                    List<UserEntity> userList = serviceUtil.getUserName(userIds);
+                    for (UserEntity user : userList) {
+                        selected.add(user.getRealName() + "/" + user.getAccount());
+                    }
+                    model.setSelected(String.join(";", selected));
+                }
+            }
+        }
+        if (branchFlow) {
+            vo.setType(1);
+            for (CandidateListModel model : list) {
+                model.setIsBranchFlow(true);
+            }
+        } else {
+            CandidateListModel listModel = list.stream().filter(e -> ObjectUtil.equals(e.getIsCandidates(), true)).findFirst().orElse(null);
+            if (null != listModel) {
+                vo.setType(2);
+            }
+        }
+
+        vo.setList(list);
+        return vo;
+    }
+
+    public void getCandidateListModel(FlowMethod flowMethod, List<CandidateListModel> list) throws WorkFlowException {
+        NodeModel nodeModel = flowMethod.getNodeModel();
+        CandidateListModel listModel = list.stream().filter(e -> ObjectUtil.equals(nodeModel.getNodeId(), e.getNodeCode())).findFirst().orElse(null);
+        if (null != listModel) {
+            return;
+        }
+        CandidateListModel model = new CandidateListModel();
+        model.setNodeCode(nodeModel.getNodeId());
+        model.setNodeName(nodeModel.getNodeName());
+        boolean isCandidate = nodeModel.getIsCandidates();
+        model.setIsCandidates(isCandidate);
+        if (isCandidate) {
+            List<String> userIds = flowUtil.userListAll(flowMethod);
+            List<UserEntity> users = serviceUtil.getUserName(userIds, true);
+            model.setHasCandidates(!users.isEmpty());
+            model.setSelectIdList(users.stream().map(UserEntity::getId).collect(Collectors.toList()));
+        }
+        list.add(model);
+    }
+
+    //-------------------------------circulateUtil------------------------------------------------------------
+
+    public List<CirculateEntity> circulateList(FlowMethod flowMethod) throws WorkFlowException {
+        FlowModel flowModel = flowMethod.getFlowModel();
+        List<CirculateEntity> circulateList = new ArrayList<>();
+        TaskEntity task = flowMethod.getTaskEntity();
+        OperatorEntity operator = flowMethod.getOperatorEntity();
+        TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
+        NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+        List<String> userIdAll = new ArrayList<>();
+        //闄勫姞瑙勫垯
+        if (!ObjectUtil.equals(flowMethod.getType(), RecordEnum.REJECT.getCode())) {
+            userIdAll = serviceUtil.getUserListAll(nodeModel.getCirculateUser());
+            flowUtil.rule(userIdAll, task.getId(), nodeModel.getExtraCopyRule());
+            //鎶勯�佽嚜宸�
+            if (Boolean.TRUE.equals(nodeModel.getIsInitiatorCopy())) {
+                userIdAll.add(task.getCreatorUserId());
+            }
+            //鎶勯�佽〃鍗曞彉閲�
+            if (Boolean.TRUE.equals(nodeModel.getIsFormFieldCopy())) {
+                flowMethod.setIsAssign(false);
+                Map<String, Object> dataAll = flowUtil.createOrUpdate(flowMethod);
+                Object data = dataAll.get(nodeModel.getCopyFormField() + FlowNature.FORM_FIELD_SUFFIX);
+                if (data != null) {
+                    List<String> list = new ArrayList<>();
+                    try {
+                        list.addAll(JsonUtil.getJsonToList(String.valueOf(data), String.class));
+                    } catch (Exception e) {
+                        e.getMessage();
+                    }
+                    if (data instanceof List) {
+                        list.addAll((List) data);
+                    } else {
+                        list.addAll(Arrays.asList(String.valueOf(data).split(",")));
+                    }
+                    List<String> id = new ArrayList<>();
+                    for (String s : list) {
+                        id.add(s.split("--")[0]);
+                    }
+                    List<UserRelationEntity> listByObjectIdAll = serviceUtil.getListByObjectIdAll(id);
+                    List<String> userList = serviceUtil.getUserListAll(list);
+                    List<String> userPosition = listByObjectIdAll.stream().map(UserRelationEntity::getUserId).collect(Collectors.toList());
+                    List<String> handleIdAll = new ArrayList<>();
+                    handleIdAll.addAll(userPosition);
+                    handleIdAll.addAll(id);
+                    handleIdAll.addAll(userList);
+                    userIdAll.addAll(handleIdAll);
+                }
+            }
+        }
+        //鎸囧畾浼犻槄浜�
+        userIdAll.addAll(Arrays.asList(StringUtils.isNotEmpty(flowModel.getCopyIds()) ? flowModel.getCopyIds().split(",") : new String[]{}));
+        //鑾峰彇鏈�鏂扮敤鎴�
+        List<UserEntity> userList = serviceUtil.getUserName(userIdAll, true);
+        List<String> userIdList = circulateMapper.getNodeList(operator.getTaskId(), operator.getNodeId()).stream().map(CirculateEntity::getUserId).collect(Collectors.toList());
+        for (UserEntity userEntity : userList) {
+            if (userIdList.contains(userEntity.getId())) {
+                continue;
+            }
+            CirculateEntity circulate = new CirculateEntity();
+            circulate.setId(RandomUtil.uuId());
+            circulate.setUserId(userEntity.getId());
+            circulate.setNodeCode(nodeModel.getNodeId());
+            circulate.setNodeName(nodeModel.getNodeName());
+            circulate.setTaskId(task.getId());
+            circulate.setCirculateRead(0);
+            circulate.setOperatorId(operator.getId());
+            circulate.setNodeId(operator.getNodeId());
+            circulate.setCreatorTime(new Date());
+            circulateList.add(circulate);
+        }
+        circulateMapper.insert(circulateList);
+        return circulateList;
+    }
+
+    public List<RecordVo> getCirculateList(List<CirculateEntity> list) {
+        List<RecordVo> vos = new ArrayList<>();
+        if (CollUtil.isNotEmpty(list)) {
+            List<UserEntity> userList = serviceUtil.getUserName(list.stream().map(CirculateEntity::getUserId).collect(Collectors.toList()));
+            for (CirculateEntity circulate : list) {
+                RecordVo vo = JsonUtil.getJsonToBean(circulate, RecordVo.class);
+                UserEntity userEntity = userList.stream().filter(t -> t.getId().equals(circulate.getUserId())).findFirst().orElse(null);
+                vo.setUserName(userEntity != null ? userEntity.getRealName() + "/" + userEntity.getAccount() : "");
+                if (userEntity != null) {
+                    vo.setHeadIcon(UploaderUtil.uploaderImg(userEntity.getHeadIcon()));
+                }
+                vos.add(vo);
+            }
+        }
+        return vos;
+    }
+
+    //-------------------------------triggerUtil------------------------------------------------------------
+
+    public List<TriggerDataModel> getTriggerDataModel(TriggerDataFo fo) {
+        String modelId = fo.getModelId();
+        Integer trigger = fo.getTrigger();
+        List<String> dataId = fo.getDataId();
+        List<Map<String, Object>> dataMap = fo.getDataMap();
+        List<String> updateFields = fo.getUpdateFields();
+        List<TriggerDataModel> res = new ArrayList<>();
+        Map<String, NodeModel> triggerMap = this.getTriggerNode(modelId, trigger);
+        if (CollUtil.isNotEmpty(triggerMap)) {
+            for (Map.Entry<String, NodeModel> stringNodeModelEntry : triggerMap.entrySet()) {
+                String key = stringNodeModelEntry.getKey();
+
+                NodeModel nodeModel = triggerMap.get(key);
+                // 鍒ゆ柇鎸囧畾瀛楁淇敼
+                if (this.checkUpdateField(trigger, nodeModel, updateFields)) {
+                    continue;
+                }
+                if (CollUtil.isNotEmpty(dataMap)) {
+                    TriggerDataModel model = new TriggerDataModel();
+                    model.setData(JsonUtil.getObjectToString(dataMap));
+                    model.setFlowId(key);
+                    res.add(model);
+                    continue;
+                }
+                List<Map<String, Object>> dataList = this.getDataList(nodeModel, new HashMap<>(), dataId);
+                if (!dataList.isEmpty()) {
+                    TriggerDataModel model = new TriggerDataModel();
+                    model.setData(JsonUtil.getObjectToString(dataList));
+                    model.setFlowId(key);
+                    res.add(model);
+                }
+
+            }
+        }
+        return res;
+    }
+
+    // true琛ㄧず 鎸囧畾瀛楁娌℃湁鍙戠敓淇敼
+    public boolean checkUpdateField(Integer trigger, NodeModel nodeModel, List<String> updateFields) {
+        List<String> updateFieldList = nodeModel.getUpdateFieldList();
+        if (CollUtil.isEmpty(updateFieldList)) {
+            return false;
+        }
+        if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.EVENT_TRIGGER.getType()) && ObjectUtil.equals(trigger, 2)) {
+            // 浠绘剰瀛楁鍙戠敓淇敼锛岀粨鏋滈泦鍚堜负绌� 璇存槑鎸囧畾瀛楁锛坲pdateFieldList锛変笉瀛樺湪鍙戠敓淇敼鐨勫瓧娈碉紙updateFields锛変腑
+            List<String> list = updateFieldList.stream().filter(updateFields::contains).collect(Collectors.toList());
+            return CollUtil.isEmpty(list);
+        }
+        return false;
+    }
+
+    public Map<String, NodeModel> getTriggerNode(String formId, Integer trigger) {
+        QueryWrapper<TemplateNodeEntity> queryWrapper = new QueryWrapper<>();
+        List<String> typeList = ImmutableList.of(NodeEnum.EVENT_TRIGGER.getType());
+        queryWrapper.lambda().in(TemplateNodeEntity::getNodeType, typeList)
+                .eq(TemplateNodeEntity::getFormId, formId);
+        List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.selectList(queryWrapper);
+
+        List<String> flowIds = new ArrayList<>();
+        for (TemplateNodeEntity nodeEntity : nodeEntityList) {
+            NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+            if (ObjectUtil.equals(nodeModel.getTriggerFormEvent(), trigger)) {
+                flowIds.add(nodeEntity.getFlowId());
+            }
+        }
+        flowIds = flowIds.stream().distinct().collect(Collectors.toList());
+
+        // 鑾峰彇鍚敤鐨勪换鍔℃祦绋媔d锛岀敤浜庤繃婊よ妭鐐�
+        List<String> filterFlowIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(flowIds)) {
+            QueryWrapper<TemplateEntity> wrapper = new QueryWrapper<>();
+            wrapper.lambda().in(TemplateEntity::getFlowId, flowIds).eq(TemplateEntity::getType, FlowNature.QUEST);
+            List<TemplateEntity> templateList = templateMapper.selectList(wrapper);
+            filterFlowIds = templateList.stream().map(TemplateEntity::getFlowId).collect(Collectors.toList());
+        }
+
+        // Map<flowId, 瑙﹀彂鑺傜偣>
+        Map<String, NodeModel> map = new HashMap<>();
+        for (String flowId : filterFlowIds) {
+            TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                    .filter(e -> ObjectUtil.equals(e.getFlowId(), flowId)).findFirst().orElse(null);
+            if (null != nodeEntity) {
+                map.put(flowId, JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
+            }
+        }
+        return map;
+    }
+
+    public void handleTimeTrigger(TriggerModel triggerModel) throws WorkFlowException {
+        String flowId = triggerModel.getId();
+        UserInfo userInfo = triggerModel.getUserInfo();
+
+        List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(flowId);
+        TemplateNodeEntity timeTrigger = nodeEntityList.stream()
+                .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.TIME_TRIGGER.getType())).findFirst().orElse(null);
+        if (null == timeTrigger) {
+            return;
+        }
+
+        ExecuteModel model = new ExecuteModel();
+        model.setFlowId(flowId);
+        FlowModel flowModel = new FlowModel();
+        flowModel.setUserInfo(userInfo);
+        model.setFlowModel(flowModel);
+        this.execute(model);
+    }
+
+    public void handleTrigger(TriggerDataModel dataModel, UserInfo userInfo) throws WorkFlowException {
+        List<Map<String, Object>> dataList = JsonUtil.getJsonToListMap(dataModel.getData());
+        ExecuteModel model = new ExecuteModel();
+        model.setFlowId(dataModel.getFlowId());
+        model.setDataList(dataList);
+        FlowModel flowModel = new FlowModel();
+        flowModel.setUserInfo(userInfo);
+        model.setFlowModel(flowModel);
+        this.execute(model);
+    }
+
+    // 鎵ц
+    public void execute(ExecuteModel model) throws WorkFlowException {
+        Boolean nodeRetry = model.getNodeRetry();
+        String flowId = model.getFlowId();
+        List<Map<String, Object>> dataList = model.getDataList();
+        String parentId = model.getParentId();
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(flowId);
+        if (null != jsonEntity) {
+            TemplateEntity template = templateMapper.selectById(jsonEntity.getTemplateId());
+            if (template == null) {
+                return;
+            }
+            if (model.getTaskId() == null && !ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.UP.getCode())) {
+                return;
+            }
+            TaskEntity taskEntity = StringUtils.isNotEmpty(model.getTaskId()) ? taskMapper.selectById(model.getTaskId()) : null;
+            if (taskEntity != null) {
+                model.setTaskEntity(taskEntity);
+            }
+            model.setDeploymentId(jsonEntity.getFlowableId());
+            // 閲嶈瘯鍒ゆ柇
+            TriggerTaskEntity parentTask = triggerTaskMapper.selectById(parentId);
+            boolean isParentId = parentTask != null;
+
+            Map<String, NodeModel> nodes = new HashMap<>();
+            List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(flowId);
+            for (TemplateNodeEntity nodeEntity : nodeEntityList) {
+                nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
+            }
+            model.setNodes(nodes);
+            if (Boolean.FALSE.equals(nodeRetry)) {
+                // 淇濆瓨瑙﹀彂浠诲姟
+                TriggerTaskEntity entity = new TriggerTaskEntity();
+                entity.setId(RandomUtil.uuId());
+                entity.setFullName(template.getFullName());
+                entity.setParentId(isParentId ? parentTask.getId() : parentId);
+                entity.setParentTime(isParentId ? parentTask.getStartTime() : null);
+                entity.setFlowId(flowId);
+                entity.setStartTime(new Date());
+                entity.setData(JsonUtil.getObjectToString(dataList));
+                entity.setStatus(TaskStatusEnum.RUNNING.getCode());
+                entity.setTaskId(StringUtils.isNotEmpty(model.getTaskId()) ? model.getTaskId() : null);
+                entity.setNodeCode(StringUtils.isNotEmpty(model.getNodeCode()) ? model.getNodeCode() : null);
+                entity.setNodeId(StringUtils.isNotEmpty(model.getNodeId()) ? model.getNodeId() : null);
+
+                model.setTriggerTask(entity);
+
+                String deploymentId = jsonEntity.getFlowableId();
+                String instanceId = model.getInstanceId();
+                if (StringUtils.isEmpty(instanceId)) {
+                    TemplateNodeEntity start = nodeEntityList.stream()
+                            .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.START.getType())).findFirst().orElse(new TemplateNodeEntity());
+                    Map<String, Object> variables = this.getVariables(deploymentId, start.getNodeCode(), model);
+                    instanceId = flowAbleUrl.startInstance(deploymentId, variables);
+                }
+
+                entity.setInstanceId(instanceId);
+                model.setInstanceId(instanceId);
+                if (null != model.getIsAsync()) {
+                    entity.setIsAsync(model.getIsAsync());
+                }
+                entity.setEngineType(1);
+
+
+                FlowModel flowModel = model.getFlowModel();
+                UserInfo userInfo = flowModel.getUserInfo();
+                if (null != userInfo) {
+                    entity.setCreatorUserId(userInfo.getUserId());
+                }
+                triggerTaskMapper.saveTriggerTask(entity);
+
+                if (StringUtils.isEmpty(entity.getTaskId())) {
+                    triggerRecordMapper.createStart(entity.getId());
+                }
+
+                this.globalMsg(model, 1);
+            }
+            // 瑙﹀彂鑺傜偣
+            List<String> typeList = ImmutableList.of(NodeEnum.EVENT_TRIGGER.getType(), NodeEnum.TIME_TRIGGER.getType(),
+                    NodeEnum.NOTICE_TRIGGER.getType(), NodeEnum.WEBHOOK_TRIGGER.getType(), NodeEnum.TRIGGER.getType());
+
+            String triggerKey = model.getTriggerKey();
+
+            List<String> nodeCodeList = new ArrayList<>();
+            if (StringUtils.isNotEmpty(triggerKey)) {
+                nodeCodeList.add(triggerKey);
+            }
+            TemplateNodeEntity triggerNode = nodeEntityList.stream().filter(e -> typeList.contains(e.getNodeType())
+                    || nodeCodeList.contains(e.getNodeCode())).findFirst().orElse(null);
+            if (null != triggerNode) {
+                for (Map<String, Object> map : dataList) {
+                    map.put(DataInterfaceVarConst.FORM_ID, map.get(FlowFormConstant.ID));
+                }
+                executeNode(model);
+                TriggerHolder.clear();
+            }
+        }
+    }
+
+    public Map<String, Object> getVariables(String deploymentId, String nodeCode) throws WorkFlowException {
+        OutgoingFlowsFo flowsFo = new OutgoingFlowsFo();
+        flowsFo.setDeploymentId(deploymentId);
+        flowsFo.setTaskKey(nodeCode);
+        List<String> outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo);
+        Map<String, Object> variables = new HashMap<>();
+        for (String line : outgoingFlows) {
+            variables.put(line, true);
+        }
+        return variables;
+    }
+
+    public Map<String, Object> getVariables(String deploymentId, String nodeCode, ExecuteModel executeModel) throws WorkFlowException {
+        TaskEntity taskEntity = executeModel.getTaskEntity();
+        FlowModel flowModel = executeModel.getFlowModel();
+        Map<String, NodeModel> nodes = executeModel.getNodes();
+        TriggerTaskEntity triggerTask = executeModel.getTriggerTask();
+        FlowMethod flowMethod = new FlowMethod();
+        flowMethod.setFlowModel(flowModel);
+        flowMethod.setTaskEntity(taskEntity);
+        flowMethod.setDeploymentId(deploymentId);
+        flowMethod.setNodeCode(nodeCode);
+        flowMethod.setNodes(nodes);
+
+        Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+        Map<String, Object> result = getVariables(deploymentId, nodeCode);
+        Map<String, Boolean> variables = new HashMap<>();
+        for (String line : result.keySet()) {
+            NodeModel nodeModel = nodes.get(line);
+            boolean lineValue = true;
+            if (nodeModel != null) {
+                UserEntity user = new UserEntity();
+                TaskEntity task = new TaskEntity();
+                Map<String, Object> formData = new HashMap<>();
+                List<ProperCond> conditions = nodeModel.getConditions();
+                for (ProperCond cond : conditions) {
+                    List<GroupsModel> groups = cond.getGroups();
+                    for (GroupsModel groupsModel : groups) {
+                        String field = groupsModel.getField();
+                        String jnpfKey = groupsModel.getJnpfKey();
+                        String[] fieldSplit = field.split("\\|");
+                        if (fieldSplit.length > 1) {
+                            List<Map<String, Object>> maps = allData.get(fieldSplit[1]);
+                            if (CollUtil.isNotEmpty(maps)) {
+                                Map<String, Object> map = maps.get(0);
+                                Object oneData = this.getData(map, fieldSplit[0]);
+                                formData.put(field, oneData);
+                            }
+                        }
+                        if (Objects.equals(FieldEnum.FIELD.getCode(), groupsModel.getFieldValueType())) {
+                            Object fieldValue = groupsModel.getFieldValue();
+                            String[] fieldValueSplit = String.valueOf(fieldValue).split("\\|");
+                            if (fieldValueSplit.length > 1) {
+                                List<Map<String, Object>> maps = allData.get(fieldValueSplit[1]);
+                                if (CollUtil.isNotEmpty(maps)) {
+                                    Map<String, Object> map = maps.get(0);
+                                    Object oneData = this.getData(map, fieldValueSplit[0]);
+                                    formData.put(String.valueOf(fieldValue), oneData);
+                                }
+                            }
+                        }
+
+                        Object object = formData.get(field) != null ? formData.get(field) : "";
+                        List<String> keyList = ImmutableList.of(JnpfKeyConsts.CURRORGANIZE, JnpfKeyConsts.CURRPOSITION);
+                        if (keyList.contains(jnpfKey)) {
+                            groupsModel.setJnpfKey(JnpfKeyConsts.COM_INPUT);
+                        }
+                        if (JnpfKeyConsts.CREATETIME.equals(jnpfKey)) {
+                            if (object instanceof Long) {
+                                task.setCreatorTime(new Date((Long) object));
+                            }
+                        } else if (JnpfKeyConsts.CREATEUSER.equals(jnpfKey)) {
+                            task.setCreatorUserId(object != null ? object.toString() : "");
+                        } else if (JnpfKeyConsts.MODIFYTIME.equals(jnpfKey)) {
+                            if (object instanceof Long) {
+                                task.setLastModifyTime(new Date((Long) object));
+                            }
+                        } else if (JnpfKeyConsts.MODIFYUSER.equals(jnpfKey)) {
+                            task.setLastModifyUserId(object != null ? object.toString() : "");
+                        }
+                    }
+                }
+                flowMethod.setUserEntity(user);
+                flowMethod.setTaskEntity(task);
+                flowMethod.setFormData(formData);
+                flowMethod.setMatchLogic(nodeModel.getMatchLogic());
+                flowMethod.setConditions(conditions);
+                lineValue = conditionUtil.hasCondition(flowMethod) || conditions.isEmpty();
+            }
+            variables.put(line, lineValue);
+        }
+        // 鍒ゆ柇鑺傜偣鐨勭嚎鐨勬潯浠�
+        conditionUtil.checkCondition(variables, nodes);
+        String taskId = StringUtils.isNotEmpty(triggerTask.getTaskId()) ? triggerTask.getTaskId() : triggerTask.getId();
+        taskLineMapper.create(taskId, variables);
+        return new HashMap<>(variables);
+    }
+
+    public void complete(String id, Map<String, Object> variables) throws WorkFlowException {
+        CompleteFo fo = new CompleteFo();
+        fo.setTaskId(id);
+        fo.setVariables(variables);
+        flowAbleUrl.complete(fo);
+    }
+
+    public void executeNode(ExecuteModel model) throws WorkFlowException {
+        String deploymentId = model.getDeploymentId();
+        String instanceId = model.getInstanceId();
+        Map<String, NodeModel> nodes = model.getNodes();
+        TriggerTaskEntity triggerTask = model.getTriggerTask();
+
+        String groupId = model.getGroupId() != null ? model.getGroupId() : "";
+        String taskId = model.getTaskId();
+
+        FlowableInstanceModel instance = flowAbleUrl.getInstance(instanceId);
+        if (null != instance && null != instance.getEndTime()) {
+            triggerRecordMapper.createEnd(triggerTask.getId());
+            triggerTask.setStatus(TaskStatusEnum.PASSED.getCode());
+            triggerTaskMapper.updateTriggerTask(triggerTask);
+            return;
+        }
+
+        Map<String, List<Map<String, Object>>> dataMap = TriggerHolder.getData();
+        Map<String, List<Map<String, Object>>> nodeDataMap = model.getNodeDataMap() != null ? model.getNodeDataMap() : new HashMap<>();
+        for (Map.Entry<String, List<Map<String, Object>>> stringListEntry : nodeDataMap.entrySet()) {
+            String nodeCode = stringListEntry.getKey();
+            List<Map<String, Object>> dataList = dataMap.get(nodeCode);
+            if (dataList == null) {
+                List<Map<String, Object>> list = nodeDataMap.get(nodeCode);
+                if (list != null) {
+                    TriggerHolder.addData(nodeCode, list);
+                }
+            }
+        }
+
+
+        // 浠诲姟娴佺▼鐨勭姸鎬佷负缁堟锛屽垯缁撴潫
+        TriggerTaskEntity entity = triggerTaskMapper.selectById(triggerTask.getId());
+        if (null != entity && ObjectUtil.equals(entity.getStatus(), TaskStatusEnum.CANCEL.getCode())) {
+            return;
+        }
+
+        List<String> nodeTypes = ImmutableList.of(NodeEnum.GET_DATA.getType(), NodeEnum.ADD_DATA.getType(), NodeEnum.UPDATE_DATA.getType(), NodeEnum.DELETE_DATA.getType()
+                , NodeEnum.TRIGGER.getType(), NodeEnum.EVENT_TRIGGER.getType(), NodeEnum.TIME_TRIGGER.getType(), NodeEnum.NOTICE_TRIGGER.getType(), NodeEnum.WEBHOOK_TRIGGER.getType()
+                , NodeEnum.DATA_INTERFACE.getType(), NodeEnum.MESSAGE.getType(), NodeEnum.LAUNCH_FLOW.getType(), NodeEnum.SCHEDULE.getType());
+
+        Map<String, List<NodeModel>> groupMap = model.getGroupMap();
+
+        if (groupMap.isEmpty()) {
+            List<NodeModel> nodeList = new ArrayList<>(model.getNodes().values()).stream().filter(e -> nodeTypes.contains(e.getType())).collect(Collectors.toList());
+            for (NodeModel nodeModel : nodeList) {
+                String nodeGroupId = nodeModel.getGroupId() != null ? nodeModel.getGroupId() : "";
+                List<NodeModel> list = groupMap.get(nodeGroupId) != null ? groupMap.get(nodeGroupId) : new ArrayList<>();
+                list.add(nodeModel);
+                groupMap.put(nodeGroupId, list);
+            }
+        }
+
+        List<FlowableTaskModel> taskModelListAll = flowAbleUrl.getCurrentTask(instanceId);
+        List<NodeModel> list = groupMap.get(groupId) != null ? groupMap.get(groupId) : new ArrayList<>();
+        if (list.isEmpty()) {
+            return;
+        }
+
+        List<String> nodeCodeList = list.stream().map(NodeModel::getNodeId).collect(Collectors.toList());
+        List<FlowableTaskModel> taskModelList = taskModelListAll.stream().filter(e -> nodeCodeList.contains(e.getTaskKey())).collect(Collectors.toList());
+
+        if (CollUtil.isNotEmpty(taskModelList)) {
+            for (FlowableTaskModel taskModel : taskModelList) {
+                String taskKey = taskModel.getTaskKey();
+                List<TriggerRecordEntity> recordList = triggerRecordMapper.getList(triggerTask.getId());
+                TriggerRecordEntity triggerRecord = recordList.stream().filter(e -> Objects.equals(e.getNodeCode(), taskModel.getTaskKey())).findFirst().orElse(null);
+                boolean isRecord = triggerRecord == null;
+                NodeModel nodeModel = nodes.get(taskKey);
+                TriggerRecordEntity triggerRecordEntity = !isRecord ? triggerRecord : new TriggerRecordEntity();
+
+                //闃叉閲嶅璋冪敤
+                if (triggerRecordEntity.getEndTime() != null) {
+                    continue;
+                }
+
+                if (isRecord) {
+                    triggerRecordEntity.setId(RandomUtil.uuId());
+                    triggerRecordEntity.setStartTime(new Date());
+                    triggerRecordEntity.setStatus(TriggerRecordEnum.WAIT.getCode());
+                    triggerRecordEntity.setNodeId(taskModel.getTaskId());
+                    triggerRecordEntity.setNodeCode(taskModel.getTaskKey());
+                    triggerRecordEntity.setNodeName(nodeModel.getNodeName());
+                    triggerRecordEntity.setTriggerId(triggerTask.getId());
+                    if (StringUtils.isNotEmpty(triggerTask.getTaskId())) {
+                        triggerRecordEntity.setTaskId(triggerTask.getTaskId());
+                    }
+                    triggerRecordMapper.create(triggerRecordEntity);
+                }
+
+                model.setNodeModel(nodeModel);
+                model.setCurrentNodeId(taskModel.getTaskId());
+                model.setRecordId(triggerRecordEntity.getId());
+
+                NodeEnum node = NodeEnum.getNode(nodeModel.getType());
+                try {
+                    if (isRecord) {
+                        switch (node) {
+                            case TRIGGER:
+                            case EVENT_TRIGGER:
+                            case TIME_TRIGGER:
+                            case NOTICE_TRIGGER:
+                            case WEBHOOK_TRIGGER:
+                                List<Map<String, Object>> dataList = model.getDataList();
+                                TriggerHolder.addData(taskKey, dataList);
+                                break;
+                            case GET_DATA:
+                                List<Map<String, Object>> data = this.getData(model);
+                                TriggerHolder.addData(taskKey, data);
+                                break;
+                            case ADD_DATA:
+                                this.addData(model);
+                                break;
+                            case UPDATE_DATA:
+                                this.updateData(model);
+                                break;
+                            case DELETE_DATA:
+                                this.deleteData(model);
+                                break;
+                            case MESSAGE:
+                                this.message(model);
+                                break;
+                            case LAUNCH_FLOW:
+                                this.launchFlow(model);
+                                break;
+                            case DATA_INTERFACE:
+                                this.dataInterface(model);
+                                break;
+                            case SCHEDULE:
+                                this.createSchedule(model);
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                    triggerRecordEntity.setStatus(TriggerRecordEnum.PASSED.getCode());
+                    List<TriggerLaunchflowEntity> triggerList = triggerLaunchflowMapper.getTriggerList(ImmutableList.of(triggerTask.getId()));
+                    List<String> launchFlow = triggerList.stream().map(TriggerLaunchflowEntity::getNodeCode).collect(Collectors.toList());
+                    if (launchFlow.contains(taskModel.getTaskKey())) {
+                        continue;
+                    }
+                } catch (Exception e) {
+                    String msg = this.getErrMsg(e);
+                    String errorMsg = msg;
+                    if (e instanceof WorkFlowException) {
+                        WorkFlowException workException = ((WorkFlowException) e);
+                        errorMsg = workException.getDataMsg() != null ? workException.getDataMsg() : errorMsg;
+                    }
+                    triggerRecordEntity.setErrorTip(msg);
+                    triggerRecordEntity.setErrorData(errorMsg);
+                    triggerRecordEntity.setStatus(TriggerRecordEnum.EXCEPTION.getCode());
+                }
+                triggerRecordEntity.setEndTime(new Date());
+                boolean isException = ObjectUtil.equals(triggerRecordEntity.getStatus(), TriggerRecordEnum.EXCEPTION.getCode());
+                if (!isException) {
+                    if (StringUtils.isBlank(taskId)) {
+                        try {
+                            Map<String, Object> variables = this.getVariables(deploymentId, taskModel.getTaskKey(), model);
+                            this.complete(taskModel.getTaskId(), variables);
+                        } catch (WorkFlowException e) {
+                            String msg = this.getErrMsg(new WorkFlowException(MsgCode.WF159.get()));
+                            String errorMsg = e.getDataMsg() != null ? e.getDataMsg() : msg;
+                            triggerRecordEntity.setErrorTip(msg);
+                            triggerRecordEntity.setErrorData(errorMsg);
+                            triggerRecordEntity.setStatus(TriggerRecordEnum.EXCEPTION.getCode());
+                        }
+                    } else {
+                        // 宓屽叆鐨勪换鍔℃祦绋嬶紝鏈�鍚庣殑鎵ц鑺傜偣涓嶈兘閫氳繃锛屽惁鍒欓��鍥炰細鏈夐棶棰�
+                        NextOrPrevFo fo = new NextOrPrevFo();
+                        fo.setDeploymentId(deploymentId);
+                        fo.setTaskKey(taskModel.getTaskKey());
+                        List<FlowableNodeModel> next = flowAbleUrl.getNext(fo);
+                        if (CollUtil.isNotEmpty(next)) {
+                            try {
+                                Map<String, Object> variables = this.getVariables(deploymentId, taskModel.getTaskKey(), model);
+                                this.complete(taskModel.getTaskId(), variables);
+                            } catch (WorkFlowException e) {
+                                String msg = this.getErrMsg(new WorkFlowException(MsgCode.WF159.get()));
+                                String errorMsg = e.getDataMsg() != null ? e.getDataMsg() : msg;
+                                triggerRecordEntity.setErrorTip(msg);
+                                triggerRecordEntity.setErrorData(errorMsg);
+                                triggerRecordEntity.setStatus(TriggerRecordEnum.EXCEPTION.getCode());
+                            }
+                        }
+                    }
+                }
+                triggerRecordMapper.updateById(triggerRecordEntity);
+                if (ObjectUtil.equals(triggerRecordEntity.getStatus(), TriggerRecordEnum.EXCEPTION.getCode())) {
+                    this.globalMsg(model, 2);
+                    if (!ObjectUtil.equals(triggerTask.getStatus(), TaskStatusEnum.EXCEPTION.getCode())) {
+                        triggerTask.setStatus(TaskStatusEnum.EXCEPTION.getCode());
+                        triggerTaskMapper.updateTriggerTask(triggerTask);
+                        model.setTriggerTask(triggerTask);
+                    }
+                    return;
+                }
+                this.executeNode(model);
+            }
+        }
+    }
+
+    private String getErrMsg(Exception e) {
+        ActionResult<Object> result = new ActionResult<>();
+        result.setCode(400);
+        result.setMsg(e.getMessage());
+        return JsonUtil.getObjectToString(result);
+    }
+
+    // -----------------------------------------------------------------------------
+    // 鑾峰彇鏁版嵁
+    public List<Map<String, Object>> getData(ExecuteModel model) throws WorkFlowException {
+        List<Map<String, Object>> dataList = new ArrayList<>();
+
+        NodeModel nodeModel = model.getNodeModel();
+        Integer formType = nodeModel.getFormType();
+
+        switch (formType) {
+            case 1:
+            case 2:
+                List<Map<String, Object>> list = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>());
+                dataList.addAll(list);
+                break;
+            case 3:
+                List<ActionResult<Object>> resultList = this.interfaceTemplateJson(model, new HashMap<>());
+                List<String> errList = new ArrayList<>();
+                for (ActionResult<Object> result : resultList) {
+                    if (!ObjectUtil.equals(result.getCode(), 200)) {
+                        errList.add(result.getMsg());
+                        continue;
+                    }
+                    if (result.getData() instanceof List) {
+                        List<Map<String, Object>> maps = this.castListMap(result.getData());
+                        if (CollUtil.isNotEmpty(maps)) {
+                            dataList.addAll(maps);
+                        }
+                    }
+                }
+                if (CollUtil.isNotEmpty(errList)) {
+                    throw new WorkFlowException(errList.get(0));
+                }
+                break;
+            case 4:
+                List<Map<String, Object>> data = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>(), true);
+                String subTable = nodeModel.getSubTable();
+                for (Map<String, Object> map : data) {
+                    Object obj = map.get(subTable);
+                    if (null != obj) {
+                        List<Map<String, Object>> mapList = this.castListMap(obj);
+                        List<Map<String, Object>> resList = new ArrayList<>();
+                        for (Map<String, Object> objectMap : mapList) {
+                            Map<String, Object> resMap = new HashMap<>();
+                            for (Map.Entry<String, Object> stringObjectEntry : objectMap.entrySet()) {
+                                String key = stringObjectEntry.getKey();
+                                if (ObjectUtil.equals(key, FlowFormConstant.ID)) {
+                                    resMap.put(key, objectMap.get(key));
+                                } else {
+                                    resMap.put(subTable + "-" + key, objectMap.get(key));
+                                }
+                            }
+
+                            resMap.put(FlowNature.SUB_TABLE, subTable);
+                            resList.add(resMap);
+                        }
+                        dataList.addAll(resList);
+                    }
+                }
+                break;
+            default:
+                break;
+        }
+        for (Map<String, Object> map : dataList) {
+            map.put(DataInterfaceVarConst.FORM_ID, map.get(FlowFormConstant.ID));
+        }
+        return dataList;
+    }
+
+    public List<Map<String, Object>> castListMap(Object obj) {
+        return this.castListMap(obj, String.class, Object.class);
+    }
+
+    // 瀵硅薄杞琈ap绫诲瀷鐨凩ist
+    public <K, V> List<Map<K, V>> castListMap(Object obj, Class<K> kClazz, Class<V> vClazz) {
+        List<Map<K, V>> result = new ArrayList<>();
+        if (obj instanceof List<?>) {
+            for (Object o : (List<?>) obj) {
+                if (o instanceof Map<?, ?>) {
+                    Map<K, V> map = new HashMap<>(16);
+                    for (Map.Entry<?, ?> entry : ((Map<?, ?>) o).entrySet()) {
+                        map.put(kClazz.cast(entry.getKey()), vClazz.cast(entry.getValue()));
+                    }
+                    result.add(map);
+                }
+            }
+        }
+        return result;
+    }
+
+    // 鎺ュ彛鑾峰彇鏁版嵁
+    public List<ActionResult<Object>> interfaceTemplateJson(ExecuteModel executeModel, Map<String, Object> data) throws WorkFlowException {
+        NodeModel nodeModel = executeModel.getNodeModel();
+        TaskEntity taskEntity = executeModel.getTaskEntity();
+        String globalParameter = taskEntity.getGlobalParameter();
+        Map<String, Object> parameterData = StringUtils.isNotEmpty(globalParameter) ? JsonUtil.stringToMap(globalParameter) : new HashMap<>();
+        String interId = nodeModel.getFormId();
+        List<IntegrateTplModel> templateJson = nodeModel.getTemplateJson();
+        boolean isGetData = ObjectUtil.equals(nodeModel.getType(), NodeEnum.GET_DATA.getType());
+        if (isGetData) {
+            templateJson = nodeModel.getInterfaceTemplateJson();
+        }
+        Map<String, String> parameterMap = new HashMap<>();
+        Set<String> msg = new HashSet<>();
+        Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+        String dataSourceForm = nodeModel.getDataSourceForm();
+        List<Map<String, Object>> maps = allData.get(dataSourceForm);
+        List<ActionResult<Object>> resultList = new ArrayList<>();
+        if (StringUtils.isBlank(dataSourceForm)) {
+            maps = new ArrayList<>();
+            maps.add(new HashMap<>());
+        }
+        if (CollUtil.isNotEmpty(maps)) {
+            List<String> paramList = ImmutableList.of(
+                    DataInterfaceVarConst.USER,
+                    DataInterfaceVarConst.USERANDSUB,
+                    DataInterfaceVarConst.USERANDPROGENY,
+                    DataInterfaceVarConst.ORG,
+                    DataInterfaceVarConst.ORGANDSUB,
+                    DataInterfaceVarConst.ORGANIZEANDPROGENY,
+                    DataInterfaceVarConst.POSITIONID,
+                    DataInterfaceVarConst.POSITIONANDSUB,
+                    DataInterfaceVarConst.POSITIONANDPROGENY);
+            Map<String, String> paramDataMap = serviceUtil.getSystemFieldValue();
+            for (Map<String, Object> map : maps) {
+                Map<String, Object> tempMap = new HashMap<>(data);
+                tempMap.putAll(map);
+                for (IntegrateTplModel tpl : templateJson) {
+                    String fieldId = tpl.getField();
+                    Boolean required = tpl.getRequired();
+                    Integer sourceType = tpl.getSourceType();
+                    String relationField = tpl.getRelationField();
+                    Map<String, Object> dataMap = new HashMap<>(tempMap);
+                    String[] split = relationField.split("\\|");
+                    String dataValue;
+                    if (isGetData) {
+                        dataValue = this.getFieldValue(relationField, FieldEnum.FIELD.getCode(), allData);
+                    } else {
+                        dataValue = this.getStrData(dataMap, split[0]);
+                    }
+                    if (DataInterfaceVarConst.FORM_ID.equals(relationField)) {
+                        dataValue = String.valueOf(dataMap.get(FlowFormConstant.ID));
+                    } else if (paramList.contains(relationField)) {
+                        List<String> dataList = new ArrayList<>();
+                        String value = paramDataMap.get(relationField);
+                        if (StringUtils.isNotEmpty(value)) {
+                            try {
+                                List<String> list = JsonUtil.getJsonToList(value, String.class);
+                                dataList.addAll(list);
+                            } catch (Exception e) {
+                                dataList.add(value);
+                            }
+                        }
+                        dataValue = String.join(",", dataList);
+                    }
+                    String dataFieldValue = split[0];
+                    String parameterValue = parameterData.get(relationField) != null ? String.valueOf(parameterData.get(relationField)) : null;
+                    String s = Objects.equals(FieldEnum.GLOBAL.getCode(), sourceType) ? parameterValue : dataValue;
+                    String dataJson = !ObjectUtil.equals(tpl.getSourceType(), FieldEnum.CUSTOM.getCode()) ? s : dataFieldValue;
+                    String[] model = StringUtils.isNotEmpty(split[0]) ? split[0].split("-") : new String[]{};
+                    if (model.length > 1) {
+                        Object dataList = dataMap.get(model[0]);
+                        if (dataList instanceof List) {
+                            List<Map<String, Object>> listAll = (List<Map<String, Object>>) dataList;
+                            List<Object> dataListAll = new ArrayList<>();
+                            for (Map<String, Object> objectMap : listAll) {
+                                dataListAll.add(objectMap.get(model[1] + FlowNature.FORM_FIELD_SUFFIX));
+                            }
+                            if (Boolean.TRUE.equals(required) && ObjectUtil.isEmpty(dataListAll)) {
+                                msg.add(fieldId);
+                            }
+                            dataJson = String.valueOf(dataListAll);
+                        } else {
+                            // 瀛愯〃鏁版嵁鐨勫鐞�
+                            dataJson = this.getStrData(dataMap, split[0]);
+                        }
+                    }
+                    if (Boolean.TRUE.equals(required) && ObjectUtil.isEmpty(dataJson)) {
+                        msg.add(fieldId);
+                    }
+                    parameterMap.put(fieldId, dataJson);
+                }
+                this.errRequiredMsg(msg);
+                ActionResult<Object> result = serviceUtil.infoToId(interId, parameterMap);
+                if (!ObjectUtil.equals(result.getCode(), 200)) {
+                    resultList.add(result);
+                    return resultList;
+                }
+                if (result.getData() instanceof Map) {
+                    Map<String, Object> dataMap = (Map<String, Object>) result.getData();
+                    Integer code = (Integer) dataMap.get("code");
+                    if (ObjectUtil.equals(code, 400)) {
+                        ActionResult<Object> ar = new ActionResult<>();
+                        ar.setCode(code);
+                        ar.setMsg((String) dataMap.get("msg"));
+                        resultList.add(ar);
+                        return resultList;
+                    }
+                }
+                resultList.add(result);
+            }
+        }
+        return resultList;
+    }
+
+    private void errRequiredMsg(Set<String> msg) throws WorkFlowException {
+        if (!msg.isEmpty()) {
+            throw new WorkFlowException(new ArrayList<>(msg).get(0) + MsgCode.VS015.get());
+        }
+    }
+
+    public List<Map<String, Object>> getDataList(NodeModel nodeModel, Map<String, Object> data, List<String> dataId) {
+        return this.getDataList(nodeModel, data, dataId, false);
+    }
+
+    private List<Map<String, Object>> getDataList(NodeModel nodeModel, Map<String, Object> data, List<String> dataId, Boolean isSub) {
+        boolean idDelete = Objects.equals(nodeModel.getType(), NodeEnum.DELETE_DATA.getType());
+        String formId = nodeModel.getFormId();
+        List<SuperQueryJsonModel> ruleList = nodeModel.getRuleList();
+        String ruleMatchLogic = nodeModel.getRuleMatchLogic();
+        String flowId = "";
+        boolean isFlow = false;
+        if (ObjectUtil.equals(nodeModel.getFormType(), 2)) {
+            isFlow = true;
+            flowId = formId;
+            TemplateEntity template = templateMapper.selectById(flowId);
+            if (null != template) {
+                List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(template.getFlowId());
+                TemplateNodeEntity startNode = nodeEntityList.stream()
+                        .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.START.getType())).findFirst().orElse(null);
+                if (null != startNode) {
+                    formId = startNode.getFormId();
+                }
+            }
+        }
+        VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
+        if (Objects.equals(visualdevEntity.getType(), 2)) {
+            return new ArrayList<>();
+        }
+
+        // 鏉′欢閫夋嫨
+        for (SuperQueryJsonModel superQueryJsonModel : ruleList) {
+            List<FieLdsModel> groups = superQueryJsonModel.getGroups();
+            for (FieLdsModel fieLdsModel : groups) {
+                if (ObjectUtil.equals(fieLdsModel.getFieldValueType(), String.valueOf(FieldEnum.FIELD.getCode()))
+                        && null != fieLdsModel.getFieldValue()) {
+                    // 瀛楁鍚� | 鑺傜偣缂栫爜
+
+                    String[] split = fieLdsModel.getFieldValue().split("\\|");
+                    if (split.length > 1) {
+                        if (CollUtil.isNotEmpty(data)) {
+                            String obj = this.getStrData(data, split[0]);
+                            if (null != obj) {
+                                fieLdsModel.setFieldValue(obj);
+                            }
+                        } else {
+                            Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+                            List<Map<String, Object>> maps = allData.get(split[1]);
+                            if (CollUtil.isNotEmpty(maps)) {
+                                Map<String, Object> map = maps.get(0);
+                                String oneData = this.getStrData(map, split[0]);
+                                fieLdsModel.setFieldValue(oneData);
+                            }
+                        }
+                    }
+
+                }
+
+                //琛ㄥ崟id
+                if (Objects.equals(DataInterfaceVarConst.FORM_ID, fieLdsModel.getField())) {
+                    List<TableModel> tableModelList = JsonUtil.getJsonToList(visualdevEntity.getVisualTables(), TableModel.class);
+                    TableModel mainTable = tableModelList.stream().filter(t -> t.getTypeId().equals("1")).findFirst().orElse(null);
+                    if (mainTable != null) {
+                        TableFields tableFields = mainTable.getFields().stream().filter(t -> Objects.equals(t.getPrimaryKey(), 1)
+                                && !t.getField().toLowerCase().contains(TableFeildsEnum.TENANTID.getField())).findFirst().orElse(null);
+                        if (tableFields != null) {
+                            String field = tableFields.getField();
+                            String table = mainTable.getTable();
+                            ConfigModel config = new ConfigModel();
+                            config.setTableName(table);
+                            fieLdsModel.setVModel(field);
+                            fieLdsModel.setConfig(config);
+                        }
+                    }
+                }
+            }
+        }
+
+        SuperJsonModel superJsonModel = new SuperJsonModel();
+        superJsonModel.setConditionList(ruleList);
+        superJsonModel.setMatchLogic(StringUtils.isNotEmpty(ruleMatchLogic) ? ruleMatchLogic : superJsonModel.getMatchLogic());
+        PaginationModel paginationModel = new PaginationModel();
+        paginationModel.setDataType("1");
+        paginationModel.setSuperQueryJson(!ruleList.isEmpty() ? JsonUtil.getObjectToString(superJsonModel) : "");
+        String sidx = this.handleSort(nodeModel.getSortList());
+        paginationModel.setSidx(sidx);
+
+        VisualDevJsonModel visualJsonModel = this.getVisualJsonModel(visualdevEntity);
+        List<String> idAll = new ArrayList<>();
+        List<String> idList = new ArrayList<>();
+        List<Map<String, Object>> dataList = new ArrayList<>();
+        try {
+            if (!ruleList.isEmpty()) {
+                visualJsonModel.setSuperQuery(superJsonModel);
+            }
+            if (isFlow) {
+                List<String> flowVersionIds = templateJsonMapper.getListByTemplateIds(ImmutableList.of(flowId)).stream().map(TemplateJsonEntity::getId).collect(Collectors.toList());
+                visualJsonModel.setFlowVersionIds(flowVersionIds);
+                visualJsonModel.setEnableFlow(!flowVersionIds.isEmpty());
+            }
+            dataList.addAll(serviceUtil.getListWithTableList(visualJsonModel, paginationModel, UserProvider.getUser()));
+            if (Boolean.TRUE.equals(isSub)) {
+                return dataList;
+            }
+            idList.addAll(dataList.stream().map(t -> String.valueOf(t.get(FlowFormConstant.ID))).collect(Collectors.toList()));
+        } catch (Exception e) {
+            OperatorUtil.log.info("鏁版嵁鑾峰彇寮傚父:" + e);
+        }
+        List<String> intersection = idList.stream().filter(dataId::contains).collect(Collectors.toList());
+        if (!dataId.isEmpty()) {
+            idAll.addAll(intersection);
+        } else {
+            idAll.addAll(idList);
+        }
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (String id : idAll) {
+            List<Map<String, Object>> collect = dataList.stream().filter(t -> Objects.equals(String.valueOf(t.get(FlowFormConstant.ID)), id)).collect(Collectors.toList());
+            for (Map<String, Object> map : collect) {
+                boolean isAdd = true;
+                if (isFlow && !idDelete) {
+                    TaskEntity infoSubmit = taskMapper.getInfoSubmit(String.valueOf(map.get(FlowFormConstant.FLOWTASKID)), TaskEntity::getEndTime);
+                    isAdd = infoSubmit != null && infoSubmit.getEndTime() != null;
+                }
+                if (isAdd) {
+                    result.add(map);
+                }
+            }
+        }
+        return result;
+    }
+
+    public VisualDevJsonModel getVisualJsonModel(VisualdevEntity entity) {
+        VisualDevJsonModel jsonModel = new VisualDevJsonModel();
+        if (entity == null) {
+            return jsonModel;
+        }
+        if (entity.getColumnData() != null) {
+            jsonModel.setColumnData(JsonUtil.getJsonToBean(entity.getColumnData(), ColumnDataModel.class));
+        }
+        if (entity.getAppColumnData() != null) {
+            jsonModel.setAppColumnData(JsonUtil.getJsonToBean(entity.getAppColumnData(), ColumnDataModel.class));
+        }
+        FormDataModel formDataModel = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
+        jsonModel.setFormData(formDataModel);
+        if (!VisualWebTypeEnum.DATA_VIEW.getType().equals(entity.getWebType())) {
+            jsonModel.setFormListModels(JsonUtil.getJsonToList(formDataModel.getFields(), FieLdsModel.class));
+        }
+        jsonModel.setVisualTables(JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class));
+        jsonModel.setId(entity.getId());
+        jsonModel.setDbLinkId(entity.getDbLinkId());
+        jsonModel.setFullName(entity.getFullName());
+        jsonModel.setType(entity.getType());
+        jsonModel.setWebType(entity.getWebType());
+        return jsonModel;
+    }
+
+    private String handleSort(List<SortModel> sortList) {
+        List<String> list = new ArrayList<>();
+        for (SortModel sortModel : sortList) {
+            String field = sortModel.getField();
+            String sortType = sortModel.getSortType();
+            if (!ObjectUtil.equals(sortType, "asc")) {
+                field = "-" + field;
+            }
+            list.add(field);
+        }
+        return String.join(",", list);
+    }
+
+    public String getStrData(Map<String, Object> map, String key) {
+        Object oneData = getData(map, key);
+        if (null != oneData) {
+            if (oneData instanceof String) {
+                return oneData.toString();
+            } else {
+                return JsonUtil.getObjectToString(oneData);
+            }
+        }
+        return null;
+    }
+
+    public Object getData(Map<String, Object> map, String key) {
+        return flowUtil.getOneData(map, key);
+    }
+
+    // 鏁版嵁鎺ュ彛  --------------------------
+    public List<Map<String, Object>> dataInterface(ExecuteModel model) throws WorkFlowException {
+        List<Map<String, Object>> dataList = new ArrayList<>();
+        List<ActionResult<Object>> resultList = this.interfaceTemplateJson(model, new HashMap<>());
+        List<String> errList = new ArrayList<>();
+        for (ActionResult<Object> result : resultList) {
+            if (!ObjectUtil.equals(result.getCode(), 200)) {
+                errList.add(result.getMsg());
+                continue;
+            }
+            if (result.getData() instanceof List) {
+                List<Map<String, Object>> maps = this.castListMap(result.getData());
+                if (CollUtil.isNotEmpty(maps)) {
+                    dataList.addAll(maps);
+                }
+            }
+        }
+        if (CollUtil.isNotEmpty(errList)) {
+            throw new WorkFlowException(errList.get(0));
+        }
+        return dataList;
+    }
+
+    // 娑堟伅  -----------------------------
+    public void message(ExecuteModel model) throws WorkFlowException {
+        NodeModel nodeModel = model.getNodeModel();
+        if (null != nodeModel) {
+            String msgId = nodeModel.getMsgId();
+            List<IntegrateTplModel> templateJson = nodeModel.getMsgTemplateJson();
+            FlowModel flowModel = model.getFlowModel();
+            UserInfo userInfo = flowModel.getUserInfo();
+            Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+            Map<String, Object> parameterMap = this.templateJson(templateJson, allData, userInfo);
+
+            List<String> userIds = this.getUserList(nodeModel.getMsgUserIds(), nodeModel.getMsgUserIdsSourceType(), allData);
+            this.message(msgId, userIds, parameterMap, userInfo);
+        }
+    }
+
+    private void message(String msgId, List<String> userIdList, Map<String, Object> parameterMap, UserInfo userInfo) throws WorkFlowException {
+        List<SentMessageForm> formList = new ArrayList<>();
+        SentMessageForm sentMessageForm = new SentMessageForm();
+        sentMessageForm.setUserInfo(userInfo);
+        sentMessageForm.setTemplateId(msgId);
+        sentMessageForm.setToUserIds(userIdList);
+        sentMessageForm.setParameterMap(parameterMap);
+        sentMessageForm.setType(3);
+        sentMessageForm.setContentMsg(new HashMap<>());
+        sentMessageForm.setId(msgId);
+        sentMessageForm.setSysMessage(true);
+        formList.add(sentMessageForm);
+        List<String> errList = serviceUtil.sendDelegateMsg(formList);
+        if (CollUtil.isNotEmpty(errList)) {
+            throw new WorkFlowException(errList.get(0));
+        }
+    }
+
+    private Map<String, Object> templateJson(List<IntegrateTplModel> templateJson, Map<String, List<Map<String, Object>>> data, UserInfo userInfo) throws WorkFlowException {
+        Map<String, Object> parameterMap = new HashMap<>();
+        Set<String> msg = new HashSet<>();
+
+        for (IntegrateTplModel tplModel : templateJson) {
+            List<IntegrateParamModel> paramJson = tplModel.getParamJson();
+            for (IntegrateParamModel paramModel : paramJson) {
+                String field = paramModel.getField();
+                String relationField = paramModel.getRelationField() == null ? "" : paramModel.getRelationField();
+                if (ObjectUtil.equals(paramModel.getSourceType(), FieldEnum.CUSTOM.getCode())) {
+                    // 鍙傛暟鏉ユ簮涓鸿嚜瀹氫箟
+                    parameterMap.put(paramModel.getMsgTemplateId() + field, relationField);
+                    continue;
+                }
+                Boolean required = paramModel.getRequired();
+                String[] split = relationField.split("\\|");
+                if (split.length < 2) {
+                    continue;
+                }
+                List<Map<String, Object>> mapList = data.get(split[1]);
+                Map<String, Object> map = CollUtil.isNotEmpty(mapList) ? mapList.get(0) : new HashMap<>();
+                if (map == null) {
+                    map = new HashMap<>();
+                }
+                String dataValue = "";
+                if (DataInterfaceVarConst.FORM_ID.equals(split[0])) {
+                    dataValue = map.get(FlowFormConstant.ID) != null ? String.valueOf(map.get(FlowFormConstant.ID)) : "";
+                } else {
+                    if (map.get(split[0]) != null) {
+                        dataValue = String.valueOf(map.get(split[0]));
+                    }
+                }
+                if (Boolean.TRUE.equals(required) && ObjectUtil.isEmpty(dataValue)) {
+                    msg.add(field);
+                }
+                parameterMap.put(paramModel.getMsgTemplateId() + field, dataValue);
+            }
+            Map<String, String> paramMap = ImmutableMap.of(FlowConstant.CREATORUSERNAME, userInfo.getUserName(), FlowConstant.SENDTIME, DateUtil.getNow().substring(11));
+            for (Map.Entry<String, String> stringStringEntry : paramMap.entrySet()) {
+                String key = stringStringEntry.getKey();
+                parameterMap.put(tplModel.getId() + key, paramMap.get(key));
+            }
+
+
+        }
+        this.errRequiredMsg(msg);
+        return parameterMap;
+    }
+
+    // 鏂板鏁版嵁 -------------------
+    public void addData(ExecuteModel model) throws WorkFlowException {
+        NodeModel nodeModel = model.getNodeModel();
+        if (null == nodeModel) {
+            return;
+        }
+        String formId = nodeModel.getFormId();
+        List<TemplateJsonModel> transferList = nodeModel.getTransferList();
+        String dataSourceForm = nodeModel.getDataSourceForm();
+        List<SuperQueryJsonModel> ruleList = nodeModel.getRuleList();
+
+        VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
+        if (StringUtils.isBlank(dataSourceForm)) {
+            // 鏁版嵁婧愭病鏈夋暟鎹椂锛屽皢瀛楁璁剧疆涓殑鑷畾涔夋坊鍔犲埌鏁版嵁涓�
+            transferList = transferList.stream().filter(e -> ObjectUtil.equals(e.getSourceType(), 2)).collect(Collectors.toList());
+            Map<String, Object> data = new HashMap<>();
+            for (TemplateJsonModel TemplateJsonModel : transferList) {
+                data.put(TemplateJsonModel.getTargetField(), TemplateJsonModel.getSourceValue());
+            }
+            if (CollUtil.isNotEmpty(data)) {
+                serviceUtil.visualCreate(visualdevEntity, data);
+            }
+            return;
+        }
+
+        // 鏁版嵁婧愮殑鏁版嵁
+        Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+        List<Map<String, Object>> maps = allData.get(dataSourceForm) != null ? allData.get(dataSourceForm) : new ArrayList<>();
+
+        for (Map<String, Object> map : maps) {
+            List<Map<String, Object>> dataList = new ArrayList<>();
+            if (CollUtil.isNotEmpty(ruleList)) {
+                dataList = this.getDataList(nodeModel, map, new ArrayList<>());
+            }
+            if (dataList.isEmpty()) {
+                List<Map<String, Object>> list = this.handleAddData(map, transferList);
+                if (CollUtil.isNotEmpty(list)) {
+                    for (Map<String, Object> saveData : list) {
+                        serviceUtil.visualCreate(visualdevEntity, saveData);
+                    }
+                }
+            }
+        }
+    }
+
+    public List<Map<String, Object>> handleAddData(Map<String, Object> data, List<TemplateJsonModel> transferList) {
+        return this.handleData(data, new ArrayList<>(), transferList);
+    }
+
+    // 灏嗗悗缂�涓篲jnpfId鐨勫�艰祴缁欏師瀛楁
+    public Map<String, Object> setData(Map<String, Object> data) {
+        data = CollUtil.isNotEmpty(data) ? data : new HashMap<>();
+        for (Map.Entry<String, Object> stringObjectEntry : data.entrySet()) {
+            String key = stringObjectEntry.getKey();
+
+            Object o = data.get(key);
+            Object o1 = data.get(key + FlowNature.FORM_FIELD_SUFFIX);
+            if (o != null && o1 != null) {
+                data.put(key, o1);
+            }
+            if (o != null && key.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX) && o instanceof List) {
+                List<Map<String, Object>> subList = (List<Map<String, Object>>) o;
+                for (Map<String, Object> map : subList) {
+                    this.setData(map);
+                }
+            }
+
+
+        }
+
+        return data;
+    }
+
+    /**
+     * 瀛楁璁剧疆
+     *
+     * @param data         鏁版嵁婧�
+     * @param dataList     鐩爣鏁版嵁
+     * @param transferList 浼犻�掕鍒�
+     */
+    public List<Map<String, Object>> handleData(Map<String, Object> data, List<Map<String, Object>> dataList, List<TemplateJsonModel> transferList) {
+        boolean isAdd = CollUtil.isEmpty(dataList);
+        List<Map<String, Object>> list = new ArrayList<>(dataList);
+        Map<String, Object> oldData = new HashMap<>(data != null ? data : new HashMap<>());
+
+        int max = 1;
+        for (TemplateJsonModel TemplateJsonModel : transferList) {
+            Integer sourceType = TemplateJsonModel.getSourceType();
+            String sourceValue = TemplateJsonModel.getSourceValue();
+            String targetField = TemplateJsonModel.getTargetField();
+            if (ObjectUtil.equals(sourceType, FieldEnum.FIELD.getCode())) {
+                String[] sourceFieldList = sourceValue.split("-");
+                String[] targetFieldList = targetField.split("-");
+                if (sourceFieldList.length > 1 && targetFieldList.length == 1 && oldData.get(sourceFieldList[0]) instanceof List) {
+                    List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
+                    if (parentList.size() > max) {
+                        max = parentList.size();
+                    }
+                }
+
+            }
+        }
+
+        // 鏇存柊鎴栨柊澧炵殑鏁版嵁鏉℃暟 灏忎簬 缁撴灉鐨勬渶澶ф暟
+        int size = dataList.size();
+        if (size < max) {
+            for (int i = 0; i < max - size; i++) {
+                list.add(new HashMap<>());
+            }
+        }
+
+        if (isAdd) {
+            for (TemplateJsonModel TemplateJsonModel : transferList) {
+                Integer sourceType = TemplateJsonModel.getSourceType();
+                String sourceValue = TemplateJsonModel.getSourceValue();
+                String targetField = TemplateJsonModel.getTargetField();
+                if (ObjectUtil.equals(sourceType, FieldEnum.FIELD.getCode())) {
+                    String[] sourceFieldList = sourceValue.split("-");
+                    String[] targetFieldList = targetField.split("-");
+                    if (sourceFieldList.length > 1 && targetFieldList.length > 1) {
+                        int diff = 0;
+                        // 婧愭暟鎹�
+                        if (oldData.get(sourceFieldList[0]) instanceof List) {
+                            List<Map<String, Object>> sourceList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
+                            diff = sourceList.size();
+                        }
+                        for (Map<String, Object> map : list) {
+                            if (map.get(targetFieldList[0]) instanceof List) {
+                                List<Map<String, Object>> targetList = (List<Map<String, Object>>) map.get(targetFieldList[0]);
+                                int max1 = targetList.size() - diff;
+                                for (int i = 0; i < max1; i++) {
+                                    targetList.add(new HashMap<>());
+                                }
+                            } else {
+                                List<Map<String, Object>> childList = new ArrayList<>();
+                                for (int i = 0; i < diff; i++) {
+                                    childList.add(new HashMap<>());
+                                }
+                                map.put(targetFieldList[0], childList);
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+
+        for (TemplateJsonModel TemplateJsonModel : transferList) {
+            Integer sourceType = TemplateJsonModel.getSourceType();
+            String[] split = TemplateJsonModel.getSourceValue().split("\\|");
+            String sourceValue = split.length > 0 ? split[0] : TemplateJsonModel.getSourceValue();
+
+            boolean isData = ObjectUtil.equals(sourceType, FieldEnum.CUSTOM.getCode());
+            String[] sourceFieldList = isData ? new String[]{sourceValue} : sourceValue.split("-");
+
+            Object o = flowUtil.getOneData(data, sourceValue);
+            String targetField = TemplateJsonModel.getTargetField();
+            String[] targetFieldList = targetField.split("-");
+            Object object = DataInterfaceVarConst.FORM_ID.equals(sourceValue)
+                    ? data.get(FlowFormConstant.ID) : o;
+            Object childData = isData ? sourceValue : object;
+
+            // 鐩爣瀛楁涓哄瓙琛�
+            if (targetFieldList.length > 1) {
+                if (sourceFieldList.length > 1) {
+                    // 鏉ユ簮鏄瓙琛ㄣ�佺洰鏍囨槸瀛愯〃
+                    if (oldData.get(sourceFieldList[0]) instanceof List) {
+                        // 婧愭暟鎹�
+                        List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
+
+                        for (int i = 0; i < list.size(); i++) {
+                            Map<String, Object> targetMap = list.get(i);
+                            List<Map<String, Object>> childList = (List<Map<String, Object>>) targetMap.get(targetFieldList[0]);
+                            if (CollUtil.isNotEmpty(childList)) {
+                                for (int j = 0; j < parentList.size(); j++) {
+                                    Map<String, Object> sourceMap = parentList.get(j);
+                                    if (childList.size() > j) {
+                                        Map<String, Object> map = childList.get(j);
+                                        Object oneData = flowUtil.getOneData(sourceMap, sourceFieldList[1]);
+                                        map.put(targetFieldList[1], oneData);
+                                    }
+                                }
+                                targetMap.put(targetFieldList[0], childList);
+                            }
+                        }
+                    } else if (oldData.get(FlowNature.SUB_TABLE) != null) {
+                        for (Map<String, Object> map : list) {
+                            Object obj = flowUtil.getOneData(oldData, split[0]);
+                            if (map.get(targetFieldList[0]) instanceof List) {
+                                List<Map<String, Object>> childList = (List<Map<String, Object>>) map.get(targetFieldList[0]);
+                                if (CollUtil.isEmpty(childList)) {
+                                    childList.add(new HashMap<>());
+                                }
+                                for (Map<String, Object> objectMap : childList) {
+                                    objectMap.put(targetFieldList[1], obj);
+                                }
+                                map.put(targetFieldList[0], childList);
+                            }
+                        }
+                    }
+                } else {
+                    // 鏉ユ簮涓嶆槸瀛愯〃銆佺洰鏍囨槸瀛愯〃
+                    for (Map<String, Object> map : list) {
+                        if (null == map.get(targetFieldList[0])) {
+                            List<Map<String, Object>> childList = new ArrayList<>();
+                            Map<String, Object> child = new HashMap<>();
+                            child.put(targetFieldList[1], childData);
+                            childList.add(child);
+                            map.put(targetFieldList[0], childList);
+                            continue;
+                        }
+                        if (map.get(targetFieldList[0]) instanceof List) {
+                            // 鐩爣瀛愯〃鏁版嵁杩涜璧嬪��
+                            List<Map<String, Object>> childList = (List<Map<String, Object>>) map.get(targetFieldList[0]);
+                            for (Map<String, Object> childMap : childList) {
+                                childMap.put(targetFieldList[1], childData);
+                            }
+                        }
+                    }
+                }
+            } else {
+                if (sourceFieldList.length > 1) {
+                    // 鏉ユ簮鏄瓙琛ㄣ�佺洰鏍囦笉鏄瓙琛�
+                    if (oldData.get(sourceFieldList[0]) instanceof List) {
+                        List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
+                        // 鏂板鏃讹紝涓�涓�瀵瑰簲锛涙洿鏂版椂锛屽彇瀛愯〃绗竴鏉℃暟鎹�
+                        if (isAdd) {
+                            for (int i = 0; i < parentList.size(); i++) {
+                                if (list.size() > i) {
+                                    Map<String, Object> parentMap = parentList.get(i);
+                                    Map<String, Object> map = list.get(i);
+                                    Object oneData = flowUtil.getOneData(parentMap, sourceFieldList[1]);
+                                    map.put(targetField, oneData);
+                                }
+                            }
+                        } else {
+                            if (CollUtil.isNotEmpty(parentList)) {
+                                Map<String, Object> parentMap = parentList.get(0);
+                                for (Map<String, Object> map : list) {
+                                    Object oneData = flowUtil.getOneData(parentMap, sourceFieldList[1]);
+                                    map.put(targetField, oneData);
+                                }
+                            }
+                        }
+                    } else if (oldData.get(FlowNature.SUB_TABLE) != null) {
+                        for (Map<String, Object> map : list) {
+                            Object obj = flowUtil.getOneData(oldData, split[0]);
+                            map.put(targetFieldList[0], obj);
+                        }
+                    }
+                } else {
+                    // 鏉ユ簮涓嶆槸瀛愯〃銆佺洰鏍囦笉鏄瓙琛�
+                    for (Map<String, Object> map : list) {
+                        map.put(targetField, childData);
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    // 鏇存柊鏁版嵁 -------------------------------
+    public void updateData(ExecuteModel model) throws WorkFlowException {
+        NodeModel nodeModel = model.getNodeModel();
+        String formId = nodeModel.getFormId();
+        VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
+        String dataSourceForm = nodeModel.getDataSourceForm();
+        List<TemplateJsonModel> transferList = nodeModel.getTransferList();
+
+        // 娌℃湁鍙慨鏀圭殑鏁版嵁鏃讹紝鍚戝搴旇〃鍗曚腑鏂板涓�鏉℃暟鎹�
+        boolean unFoundRule = nodeModel.getUnFoundRule();
+
+        Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+        List<Map<String, Object>> maps = allData.get(dataSourceForm);
+
+        // 鏁版嵁婧愬彲浠ヤ笉閫夛紝涓嶉�夊垯鐩存帴鏇存柊鐩爣琛ㄥ崟鐨勬煇浜涙暟鎹�
+        if (StringUtils.isBlank(dataSourceForm)) {
+            transferList = transferList.stream().filter(e -> ObjectUtil.equals(e.getSourceType(), 2)).collect(Collectors.toList());
+            Map<String, Object> map = new HashMap<>();
+            for (TemplateJsonModel TemplateJsonModel : transferList) {
+                map.put(TemplateJsonModel.getTargetField(), TemplateJsonModel.getSourceValue());
+            }
+            maps = new ArrayList<>();
+            maps.add(map);
+        }
+
+        // 鏇存柊鏁版嵁
+        if (CollUtil.isNotEmpty(maps)) {
+            for (Map<String, Object> map : maps) {
+                List<Map<String, Object>> tempList = this.getDataList(nodeModel, map, new ArrayList<>());
+                for (Map<String, Object> tempMap : tempList) {
+                    this.setData(tempMap);
+                }
+                List<Map<String, Object>> list = this.handleData(map, tempList, transferList);
+                if (CollUtil.isNotEmpty(list)) {
+                    for (Map<String, Object> data : list) {
+                        if (null != data.get(FlowFormConstant.ID)) {
+                            String id = data.get(FlowFormConstant.ID).toString();
+                            serviceUtil.visualUpdate(visualdevEntity, data, id);
+                        } else {
+                            if (unFoundRule) {
+                                serviceUtil.visualCreate(visualdevEntity, data);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // 鍒犻櫎鏁版嵁 -------------------------------
+    public void deleteData(ExecuteModel model) throws WorkFlowException, SQLException {
+        NodeModel nodeModel = model.getNodeModel();
+        Integer deleteType = nodeModel.getDeleteType();
+
+        String formId = nodeModel.getFormId();
+        VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
+
+        // 鐩存帴鍒犻櫎琛�
+        if (ObjectUtil.equals(deleteType, 0)) {
+            Integer tableType = nodeModel.getTableType();
+            if (ObjectUtil.equals(tableType, 0)) {
+                // 鍒犻櫎涓昏〃
+                List<Map<String, Object>> dataList = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>());
+                if (CollUtil.isNotEmpty(dataList)) {
+                    serviceUtil.visualDelete(visualdevEntity, dataList);
+                }
+            } else {
+                // 鍒犻櫎瀛愯〃
+                FlowFormDataModel formDataModel = new FlowFormDataModel();
+                formDataModel.setTableName(nodeModel.getSubTable());
+                formDataModel.setFormId(nodeModel.getFormId());
+                formDataModel.setRuleMatchLogic(nodeModel.getRuleMatchLogic());
+                List<SuperQueryJsonModel> ruleList = nodeModel.getRuleList();
+                List<Map<String, Object>> list = JsonUtil.getJsonToListMap(JsonUtil.getObjectToString(ruleList));
+                formDataModel.setRuleList(list);
+                serviceUtil.deleteSubTable(formDataModel);
+            }
+        } else {
+            // 鎸夎妭鐐瑰垹闄�
+            Integer condition = nodeModel.getDeleteCondition();
+            String dataSourceForm = nodeModel.getDataSourceForm();
+
+            Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+            List<Map<String, Object>> maps = allData.get(dataSourceForm) != null ? allData.get(dataSourceForm) : new ArrayList<>();
+
+            // 鑾峰彇鏉′欢杩囨护鐨勭洰鏍囨暟鎹�
+            List<Map<String, Object>> dataList = new ArrayList<>();
+            for (Map<String, Object> map : maps) {
+                List<Map<String, Object>> data = this.getDataList(nodeModel, map, new ArrayList<>());
+                dataList.addAll(data);
+            }
+
+            // 鍏ㄩ儴鐩爣鏁版嵁
+            nodeModel.setRuleList(new ArrayList<>());
+            List<Map<String, Object>> targetData = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>());
+
+            List<Map<String, Object>> intersection;
+            List<Map<String, Object>> differentSet = new ArrayList<>();
+
+            if (ObjectUtil.equals(condition, 1)) {
+                // 瀛樺湪锛屽垹闄や氦闆�
+                intersection = dataList;
+                if (CollUtil.isNotEmpty(intersection)) {
+                    serviceUtil.visualDelete(visualdevEntity, intersection);
+                }
+            } else {
+                // 涓嶅瓨鍦紝鍒犻櫎宸泦
+                for (Map<String, Object> map : targetData) {
+                    String sourceId = map.get(FlowFormConstant.ID).toString();
+                    for (Map<String, Object> data : dataList) {
+                        String targetId = data.get(FlowFormConstant.ID).toString();
+                        if (!ObjectUtil.equals(sourceId, targetId)) {
+                            differentSet.add(map);
+                        }
+                    }
+                }
+                if (CollUtil.isNotEmpty(differentSet)) {
+                    serviceUtil.visualDelete(visualdevEntity, differentSet);
+                }
+            }
+        }
+    }
+
+    // 鍙戣捣瀹℃壒 -------------------------------
+    public void launchFlow(ExecuteModel model) throws WorkFlowException {
+        NodeModel nodeModel = model.getNodeModel();
+        TriggerTaskEntity triggerTask = model.getTriggerTask();
+        String flowId = nodeModel.getFlowId();
+        List<TemplateJsonModel> transferList = nodeModel.getTransferList();
+
+        TemplateEntity template = templateMapper.selectById(flowId);
+        if (null == template) {
+            return;
+        }
+        if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.UP.getCode())) {
+            throw new WorkFlowException(MsgCode.WF140.get());
+        }
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(template.getFlowId());
+        List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(jsonEntity.getId());
+        Map<String, NodeModel> nodes = new HashMap<>();
+        for (TemplateNodeEntity node : nodeEntityList) {
+            nodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
+        }
+        FlowMethod method = new FlowMethod();
+        method.setDeploymentId(jsonEntity.getFlowableId());
+        TemplateNodeEntity startNode = nodeEntityList.stream()
+                .filter(e -> StringUtils.equals(NodeEnum.START.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
+        if (flowUtil.checkBranch(startNode)) {
+            throw new WorkFlowException(MsgCode.WF147.get());
+        }
+        method.setNodeCode(startNode.getNodeCode());
+        method.setNodes(nodes);
+        method.setNodeEntityList(nodeEntityList);
+        method.setTaskEntity(model.getTaskEntity() != null ? model.getTaskEntity() : new TaskEntity());
+        Map<String, Boolean> resMap = conditionUtil.handleCondition(method);
+        // 鍒ゆ柇鏉′欢銆佸�欓�変汉
+        try {
+            conditionUtil.checkCondition(resMap, nodes);
+        } catch (WorkFlowException e) {
+            throw new WorkFlowException(MsgCode.WF133.get());
+        }
+        method.setNextSubFlow(true);
+        List<NodeModel> nextApprover = flowUtil.getNextApprover(method);
+        if (!flowUtil.checkNextCandidates(nextApprover)) {
+            throw new WorkFlowException(MsgCode.WF134.get());
+        }
+
+        // 鏁版嵁婧愭暟鎹�
+        String dataSourceForm = nodeModel.getDataSourceForm();
+        Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+        List<Map<String, Object>> maps = allData.get(dataSourceForm) != null ? allData.get(dataSourceForm) : new ArrayList<>();
+
+        List<Map<String, Object>> mapList = new ArrayList<>();
+
+        for (Map<String, Object> map : maps) {
+            List<Map<String, Object>> list = this.handleAddData(map, transferList);
+            mapList.addAll(list);
+        }
+        // 涓嶉�夋暟鎹簮鐨勫鐞�
+        if (StringUtils.isEmpty(dataSourceForm)) {
+            transferList = transferList.stream().filter(e -> ObjectUtil.equals(e.getSourceType(), FieldEnum.CUSTOM.getCode())).collect(Collectors.toList());
+            Map<String, Object> map = new HashMap<>();
+            for (TemplateJsonModel TemplateJsonModel : transferList) {
+                map.put(TemplateJsonModel.getTargetField(), TemplateJsonModel.getSourceValue());
+            }
+            mapList = new ArrayList<>();
+            mapList.add(map);
+        }
+        if (CollUtil.isEmpty(mapList)) {
+            return;
+        }
+        Set<String> userListAll = new HashSet<>();
+        if (OperatorEnum.NOMINATOR.getCode().equals(nodeModel.getAssigneeType())) {
+            userListAll.addAll(serviceUtil.getUserListAll(nodeModel.getInitiator()));
+        } else {
+            //琛ㄥ崟鏁版嵁鐢ㄦ埛
+            for (Map<String, Object> map : maps) {
+                Object data = flowUtil.getOneData(map, nodeModel.getFormField());
+                userListAll.addAll(flowUtil.getUserId(data));
+            }
+        }
+
+        // 鍒ゆ柇娴佺▼鏉冮檺
+        FlowFormModel formIdAndFlowId = flowUtil.getFormIdAndFlowId(new ArrayList<>(userListAll), flowId);
+        List<UserEntity> userList = serviceUtil.getUserName(Boolean.TRUE.equals(nodeModel.getHasPermission()) ? formIdAndFlowId.getUserId() : formIdAndFlowId.getUserIdAll(), true);
+        if (CollUtil.isEmpty(userList)) {
+            throw new WorkFlowException(MsgCode.WF136.get());
+        }
+        List<String> taskId = new ArrayList<>();
+
+        for (UserEntity user : userList) {
+            UserInfo userInfo = new UserInfo();
+            userInfo.setUserId(user.getId());
+            userInfo.setUserName(user.getRealName());
+
+            FlowModel flowModel = new FlowModel();
+            flowModel.setUserInfo(userInfo);
+            flowModel.setFlowId(flowId);
+            flowModel.setStatus(TaskStatusEnum.RUNNING.getCode());
+            flowModel.setDeploymentId(jsonEntity.getFlowableId());
+            flowModel.setNodeEntityList(nodeEntityList);
+            for (Map<String, Object> map : mapList) {
+                flowModel.setFormData(map);
+                if (flowUtil.checkNextError(flowModel, nextApprover, false, false) != 0) {
+                    throw new WorkFlowException(MsgCode.WF135.get());
+                }
+                batchSaveOrSubmit(flowModel);
+                TaskEntity taskEntity = flowModel.getTaskEntity();
+                if (taskEntity.getRejectDataId() == null) {
+                    autoAudit(flowModel);
+                    handleTaskStatusThenEvent();
+                } else {
+                    handleTaskStatus();
+                }
+                taskId.add(taskEntity.getId());
+            }
+        }
+        Integer isAsync = nodeModel.getIsAsync();
+        if (Objects.equals(FlowNature.CHILD_SYNC, isAsync)) {
+            List<TaskEntity> taskList = taskMapper.getInfosSubmit(taskId.toArray(new String[0]), TaskEntity::getId, TaskEntity::getEndTime, TaskEntity::getStatus);
+            boolean isFlowEnd = taskList.stream().anyMatch(e -> e.getEndTime() == null);
+            if (isFlowEnd) {
+                TriggerLaunchflowEntity launchflow = new TriggerLaunchflowEntity();
+                launchflow.setId(RandomUtil.uuId());
+                launchflow.setTriggerId(triggerTask.getId());
+                launchflow.setTaskId(triggerTask.getTaskId());
+                launchflow.setNodeId(model.getCurrentNodeId());
+                launchflow.setRecordId(model.getRecordId());
+                launchflow.setNodeCode(nodeModel.getNodeId());
+                launchflow.setNodeName(nodeModel.getNodeName());
+                Map<String, List<Map<String, Object>>> nodeDataMap = new HashMap<>();
+                Map<String, List<Map<String, Object>>> dataMap = TriggerHolder.getData();
+                for (Map.Entry<String, List<Map<String, Object>>> stringListEntry : dataMap.entrySet()) {
+                    String key = stringListEntry.getKey();
+                    List<Map<String, Object>> dataList = dataMap.get(key) != null ? dataMap.get(key) : new ArrayList<>();
+                    List<Map<String, Object>> list = new ArrayList<>();
+                    for (Map<String, Object> map : dataList) {
+                        Map<String, Object> data = new HashMap<>(map);
+                        list.add(data);
+                    }
+                    nodeDataMap.put(key, list);
+                }
+
+                model.setNodeDataMap(nodeDataMap);
+                model.setId(launchflow.getId());
+                ExtraData extraData = getExtraData(model);
+                launchflow.setExtraData(JsonUtil.getObjectToString(extraData));
+                launchflow.setTaskIds(JsonUtil.getObjectToString(taskId));
+                launchflow.setGroupId(nodeModel.getGroupId());
+                launchflow.setRatio(nodeModel.getCompleteRatio());
+
+                //瀛樹簨浠跺拰娑堟伅
+                TriggerEventModel eventModel = new TriggerEventModel();
+                launchflow.setEventModel(JsonUtil.getObjectToString(eventModel));
+                triggerLaunchflowMapper.insert(launchflow);
+            }
+        }
+    }
+
+    public ExtraData getExtraData(ExecuteModel executeModel) {
+        FlowModel flowModel = executeModel.getFlowModel();
+        FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+        model.setRecordEntity(null);
+        model.setTaskEntity(null);
+        model.setOperatorEntity(null);
+        model.setNodeEntity(null);
+        model.setNodeEntityList(null);
+        model.setNodes(null);
+        model.setJsonEntity(null);
+        model.setTemplateEntity(null);
+        model.setFileList(null);
+        model.setBranchList(new ArrayList<>());
+        model.setCandidateList(new HashMap<>());
+        model.setErrorRuleUserList(new HashMap<>());
+        model.setFormDataList(new ArrayList<>());
+        ExtraData extraData = JsonUtil.getJsonToBean(executeModel, ExtraData.class);
+        TriggerTaskEntity triggerTask = executeModel.getTriggerTask();
+        extraData.setTriggerId(triggerTask.getId());
+        Map<String, FlowModel> systemMap = new HashMap<>();
+        for (SystemAuditModel auditModel : executeModel.getSystemList()) {
+            OperatorEntity operator = auditModel.getOperator();
+            FlowModel systemModel = JsonUtil.getJsonToBean(auditModel.getFlowModel(), FlowModel.class);
+            if (operator != null) {
+                systemModel.setRecordEntity(null);
+                systemModel.setTaskEntity(null);
+                systemModel.setOperatorEntity(null);
+                systemModel.setNodeEntity(null);
+                systemModel.setNodeEntityList(null);
+                systemModel.setNodes(null);
+                systemModel.setJsonEntity(null);
+                systemModel.setTemplateEntity(null);
+                systemMap.put(operator.getId(), systemModel);
+            }
+        }
+        extraData.setSystemMap(systemMap);
+        List<String> operatorIdList = executeModel.getOperatorList().stream().map(OperatorEntity::getId).collect(Collectors.toList());
+        extraData.setOperatorIdList(operatorIdList);
+        List<String> subTaskIdList = executeModel.getSubTaskList().stream().map(TaskEntity::getId).collect(Collectors.toList());
+        extraData.setSubTaskIdList(subTaskIdList);
+        extraData.setFlowModel(model);
+        return extraData;
+    }
+
+    public ExecuteModel getExecuteModel(ExtraData extraData) throws WorkFlowException {
+        String flowId = extraData.getFlowId();
+        String triggerId = extraData.getTriggerId();
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(flowId);
+        if (jsonEntity != null) {
+            ExecuteModel executeModel = JsonUtil.getJsonToBean(extraData, ExecuteModel.class);
+            FlowModel flowModel = executeModel.getFlowModel();
+            String taskId = extraData.getTaskId();
+            Map<String, NodeModel> nodes = new HashMap<>();
+            if (StringUtils.isNotEmpty(taskId)) {
+                flowUtil.setFlowModel(taskId, flowModel);
+                nodes = flowModel.getNodes();
+            } else {
+                List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(flowId);
+                for (TemplateNodeEntity nodeEntity : nodeEntityList) {
+                    nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
+                }
+            }
+            executeModel.setTaskEntity(flowModel.getTaskEntity());
+            executeModel.setNodes(nodes);
+            TriggerTaskEntity triggerTask = triggerTaskMapper.selectById(triggerId);
+            executeModel.setTriggerTask(triggerTask);
+            return executeModel;
+        }
+        return null;
+    }
+
+
+    // 鍒涘缓鏃ョ▼ --------------------------
+    public void createSchedule(ExecuteModel model) throws WorkFlowException {
+        ScheduleNewCrForm fo = new ScheduleNewCrForm();
+        NodeModel nodeModel = model.getNodeModel();
+
+        Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
+
+        List<String> list = ImmutableList.of(nodeModel.getCreatorUserId());
+        List<String> creatorUserIds = this.getUserList(list, nodeModel.getCreatorUserIdSourceType(), allData);
+        if (CollUtil.isEmpty(creatorUserIds)) {
+            throw new WorkFlowException("鎵句笉鍒板垱寤轰汉");
+        }
+
+        Integer titleSourceType = nodeModel.getTitleSourceType();
+        String title = this.getFieldValue(nodeModel.getTitle(), titleSourceType, allData);
+        fo.setTitle(title);
+
+        String contents = this.getFieldValue(nodeModel.getContents(), nodeModel.getContentsSourceType(), allData);
+        fo.setContent(contents);
+
+        String startDay = this.getFieldValue(nodeModel.getStartDay(), nodeModel.getStartDaySourceType(), allData);
+        if (StringUtils.isBlank(startDay)) {
+            throw new WorkFlowException("寮�濮嬫椂闂翠笉鑳戒负绌�");
+        }
+        fo.setStartDay(Long.valueOf(StringUtils.isBlank(startDay) ? new Date().getTime() + "" : startDay));
+        fo.setStartTime(nodeModel.getStartTime());
+
+        String endDay = this.getFieldValue(nodeModel.getEndDay(), nodeModel.getEndDaySourceType(), allData);
+
+        if ((ObjectUtil.equals(nodeModel.getDuration(), -1) || ObjectUtil.equals(nodeModel.getAllDay(), 1)) && StringUtils.isBlank(endDay)) {
+            throw new WorkFlowException("缁撴潫鏃堕棿涓嶈兘涓虹┖");
+        }
+
+        fo.setEndDay(Long.valueOf(StringUtils.isBlank(endDay) ? new Date().getTime() + "" : endDay));
+        fo.setEndTime(nodeModel.getEndTime());
+        String category = nodeModel.getCategory();
+        fo.setCategory(StringUtils.isNotEmpty(category) ? category : "391233231405462789");
+
+        fo.setDuration(nodeModel.getDuration());
+        fo.setAllDay(nodeModel.getAllDay());
+        fo.setFiles(nodeModel.getFiles());
+
+        List<String> value = this.getUserList(nodeModel.getToUserIds(), nodeModel.getToUserIdsSourceType(), allData);
+        fo.setToUserIds(value);
+        fo.setColor(nodeModel.getColor());
+        fo.setReminderType(nodeModel.getReminderType());
+        fo.setReminderTime(nodeModel.getReminderTime());
+        fo.setSend(nodeModel.getSend());
+        fo.setSendName(nodeModel.getSendName());
+        fo.setRepetition(nodeModel.getRepetition());
+        fo.setRepeatTime(nodeModel.getRepeatTime());
+
+        for (String creatorUserId : creatorUserIds) {
+            ScheduleNewCrForm jsonToBean = JsonUtil.getJsonToBean(fo, ScheduleNewCrForm.class);
+            jsonToBean.setCreatorUserId(creatorUserId);
+            serviceUtil.createSchedule(jsonToBean);
+        }
+    }
+
+    public String getFieldValue(String value, Integer sourceType, Map<String, List<Map<String, Object>>> allData) {
+        if (ObjectUtil.equals(sourceType, FieldEnum.FIELD.getCode())) {
+            String[] split = value.split("\\|");
+            if (split.length > 1) {
+                List<Map<String, Object>> data = allData.get(split[1]);
+                if (CollUtil.isNotEmpty(data)) {
+                    Map<String, Object> map = data.get(0);
+                    if (ObjectUtil.equals(split[0], DataInterfaceVarConst.FORM_ID)) {
+                        value = map.get(FlowFormConstant.ID) + "";
+                    } else {
+                        value = this.getStrData(map, split[0]);
+                    }
+                    return value;
+                }
+            }
+            return null;
+        }
+        return value;
+    }
+
+    public List<String> getUserList(List<String> value, Integer sourceType, Map<String, List<Map<String, Object>>> allData) {
+        if (ObjectUtil.equals(sourceType, FieldEnum.FIELD.getCode()) && CollUtil.isNotEmpty(value)) {
+            List<String> userIdList = new ArrayList<>();
+            String str = value.get(0);
+            String[] split = str.split("\\|");
+            if (split.length > 1) {
+                List<Map<String, Object>> dataList = allData.get(split[1]);
+                if (ObjectUtil.isNotEmpty(dataList)) {
+                    Object obj = flowUtil.getOneData(dataList.get(0), split[0]);
+                    userIdList.addAll(flowUtil.getUserId(obj));
+                }
+            }
+            return serviceUtil.getUserName(userIdList, true).stream().map(UserEntity::getId).collect(Collectors.toList());
+        }
+        return value == null ? new ArrayList<>() : serviceUtil.getUserListAll(value);
+    }
+
+    // webhook瑙﹀彂--------------------------------------------
+//    @DSTransactional
+    public void handleWebhookTrigger(String id, String tenantId, Map<String, Object> body) throws WorkFlowException {
+        TemplateJsonEntity jsonEntity = templateJsonMapper.selectById(id);
+        if (null == jsonEntity) {
+            throw new WorkFlowException(MsgCode.VS016.get());
+        }
+        if (!ObjectUtil.equals(jsonEntity.getState(), TemplateJsonStatueEnum.START.getCode())) {
+            throw new WorkFlowException("鐗堟湰鏈惎鐢�");
+        }
+        List<TemplateNodeEntity> nodeEntityList = templateNodeMapper.getList(jsonEntity.getId());
+        TemplateNodeEntity nodeEntity = nodeEntityList.stream()
+                .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.WEBHOOK_TRIGGER.getType())).findFirst().orElse(null);
+        if (null != nodeEntity) {
+            NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+            List<Map<String, Object>> dataList = new ArrayList<>();
+            Map<String, Object> map = new HashMap<>();
+            List<FieLdsModel> formFieldList = nodeModel.getFormFieldList();
+            for (FieLdsModel fieLdsModel : formFieldList) {
+                map.put(fieLdsModel.getId(), body.get(fieLdsModel.getId()));
+            }
+            dataList.add(map);
+            String token = AuthUtil.loginTempUser(jsonEntity.getCreatorUserId(), tenantId);
+            UserInfo userInfo = UserProvider.getUser(token);
+            UserProvider.setLoginUser(userInfo);
+            UserProvider.setLocalLoginUser(userInfo);
+            ExecuteModel model = new ExecuteModel();
+            model.setFlowId(jsonEntity.getId());
+            model.setDataList(dataList);
+            FlowModel flowModel = new FlowModel();
+            flowModel.setUserInfo(userInfo);
+            model.setFlowModel(flowModel);
+            this.execute(model);
+        }
+    }
+
+    // 閫氱煡瑙﹀彂---------------------------------------------------------
+
+    public void msgTrigger(TemplateNodeEntity triggerNode, UserInfo userInfo) throws WorkFlowException {
+        String flowId = triggerNode.getFlowId();
+        ExecuteModel model = new ExecuteModel();
+        model.setFlowId(flowId);
+        FlowModel flowModel = new FlowModel();
+        flowModel.setUserInfo(userInfo);
+        model.setFlowModel(flowModel);
+        this.execute(model);
+    }
+
+    // 鍏ㄥ眬灞炴�ч厤缃殑娑堟伅閫氱煡锛宮ark 1.寮�濮嬫墽琛� 2.鎵ц澶辫触
+    public void globalMsg(ExecuteModel model, Integer mark) throws WorkFlowException {
+        TriggerTaskEntity triggerTask = model.getTriggerTask();
+        FlowModel flowModel = model.getFlowModel();
+        UserInfo userInfo = flowModel.getUserInfo();
+        Map<String, NodeModel> nodes = model.getNodes();
+
+        NodeModel global = nodes.get(NodeEnum.GLOBAL.getType());
+        if (null == global) {
+            return;
+        }
+
+        String code = ObjectUtil.equals(mark, 1) ? "PZXTJC002" : "PZXTJC001";
+        MsgConfig msgConfig;
+        if (ObjectUtil.equals(mark, 1)) {
+            msgConfig = global.getStartMsgConfig();
+        } else {
+            msgConfig = global.getFailMsgConfig();
+        }
+        Integer on = msgConfig.getOn();
+        boolean acquiesce = ObjectUtil.equals(on, 3);
+        String s = acquiesce ? code : msgConfig.getMsgId();
+        String msgId = ObjectUtil.equals(on, 0) ? "" : s;
+
+        List<String> msgUserType = global.getMsgUserType();
+        List<String> msgUserIds = global.getMsgUserIds();
+
+        Set<String> userIdList = new HashSet<>();
+        for (String type : msgUserType) {
+            switch (type) {
+                case "1":
+                    userIdList.add(triggerTask.getCreatorUserId());
+                    break;
+                case "2":
+                    userIdList.add(serviceUtil.getAdmin());
+                    break;
+                case "3":
+                    List<String> userList = serviceUtil.getUserListAll(msgUserIds);
+                    userIdList.addAll(userList);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        Map<String, Object> dataMap = ImmutableMap.of(FlowConstant.TITLE, triggerTask.getFullName(), FlowConstant.CREATORUSERNAME, "");
+
+        List<SendConfigJson> templateJson = msgConfig.getTemplateJson();
+        List<IntegrateTplModel> jsonToList = JsonUtil.getJsonToList(templateJson, IntegrateTplModel.class);
+
+        if (StringUtils.isNotEmpty(msgId) && CollUtil.isNotEmpty(userIdList)) {
+            Map<String, Object> map = acquiesce ? dataMap : this.templateJson(jsonToList, new HashMap<>(), userInfo);
+            try {
+                this.message(msgId, new ArrayList<>(userIdList), map, userInfo);
+            } catch (WorkFlowException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+}

--
Gitblit v1.8.0