Newer
Older
casic-metering / casic-metering-common / src / main / java / com / casic / missiles / utils / BpmnModelUtils.java
wangpeng on 5 Dec 2022 38 KB flowable集成
//package com.casic.missiles.utils;
//
//import cn.hutool.core.collection.CollUtil;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.casic.missiles.core.util.SpringContextHolder;
//import com.casic.missiles.dto.flowable.ChildNode;
//import com.casic.missiles.dto.flowable.ConditionInfo;
//import com.casic.missiles.dto.flowable.GroupsInfo;
//import com.casic.missiles.dto.flowable.Properties;
//import com.casic.missiles.enums.ModeEnums;
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import org.apache.commons.lang3.StringUtils;
//import org.flowable.bpmn.model.Process;
//import org.flowable.bpmn.model.*;
//import org.flowable.engine.delegate.ExecutionListener;
//import org.flowable.engine.delegate.TaskListener;
//import org.springframework.util.CollectionUtils;
//
//import java.lang.reflect.InvocationTargetException;
//import java.util.*;
//import java.util.stream.Collectors;
//
//import static com.casic.missiles.constants.WorkFlowConstants.*;
//import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
//
//
///**
// * @author LoveMyOrange
// * @create 2022-10-10 17:47
// */
//public class BpmnModelUtils {
//
//    private static String id(String prefix) {
//        return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase();
//    }
//
//    private static ServiceTask serviceTask(String name) {
//        ServiceTask serviceTask = new ServiceTask();
//        serviceTask.setName(name);
//        return serviceTask;
//    }
//
//    public static SequenceFlow connect(String from, String to, List<SequenceFlow> sequenceFlows, Map<String,ChildNode> childNodeMap, Process process) {
//        SequenceFlow flow = new SequenceFlow();
//        String  sequenceFlowId = id("sequenceFlow");
//        if(process.getFlowElement(from) !=null && process.getFlowElement(from) instanceof ExclusiveGateway){
//            ChildNode childNode = childNodeMap.get(to);
//            if(childNode!=null){
//                String parentId = childNode.getParentId();
//                if(StringUtils.isNotBlank(parentId)){
//                    ChildNode parentNode = childNodeMap.get(parentId);
//                    if(parentNode!=null){
//                        if(Type.CONDITION.type.equals(parentNode.getType())){
//                            sequenceFlowId=parentNode.getId();
//                            flow.setName(parentNode.getName());
//                            //解析条件表达式
//                            com.casic.missiles.dto.flowable.Properties props = parentNode.getProps();
//                            String expression = props.getExpression();
//                            List<GroupsInfo> groups = props.getGroups();
//                            String groupsType = props.getGroupsType();
//                            if(StringUtils.isNotBlank(expression)){
//                                flow.setConditionExpression("${"+expression+"}");
//                            }
//                            else {
//
//                                StringBuffer conditionExpression=new StringBuffer();
//                                conditionExpression.append("${ ");
//
//                                for (int i = 0; i < groups.size(); i++) {
//                                    conditionExpression.append(" ( ");
//                                    GroupsInfo group = groups.get(i);
//                                    List<String> cids = group.getCids();
//                                    String groupType = group.getGroupType();
//                                    List<ConditionInfo> conditions = group.getConditions();
//                                    for (int j = 0; j < conditions.size(); j++) {
//                                        conditionExpression.append(" ");
//                                        ConditionInfo condition = conditions.get(j);
//                                        String compare = condition.getCompare();
//                                        String id = condition.getId();
//                                        String title = condition.getTitle();
//                                        List<Object> value = condition.getValue();
//                                        String valueType = condition.getValueType();
//                                        if("String".equals(valueType)){
//                                            if("=".equals(compare)){
//                                                String str = StringUtils.join(value, ",");
//                                                str="'"+str+"'";
//                                                conditionExpression.append(" "+ EXPRESSION_CLASS+"strEqualsMethod("+id+","+str+") " );
//                                            }
//                                            else{
//                                                List<String> tempList=new ArrayList<>();
//                                                for (Object o : value) {
//                                                    String s = o.toString();
//                                                    s="'"+s+"'";
//                                                    tempList.add(s);
//                                                }
//                                                String str = StringUtils.join(tempList, ",");
////                                                String str = StringUtils.join(value, ",");
//                                                conditionExpression.append(" "+ EXPRESSION_CLASS+"strContainsMethod("+id+","+str+") " );
//                                            }
//                                        }
//                                        else if("Number".equals(valueType)){
//                                            String str = StringUtils.join(value, ",");
//                                            if("=".equals(compare)){
//                                                conditionExpression.append(" "+id+" == "+str+" ");
//                                            }
//                                            else if(">".equals(compare)){
//                                                conditionExpression.append(""+id+" > "+str+" ");
//                                            }
//                                            else if(">=".equals(compare)){
//                                                conditionExpression.append(" "+id+" >= "+str+" ");
//                                            }
//                                            else if("<".equals(compare)){
//                                                conditionExpression.append(" "+id+" < "+str+" ");
//                                            }
//                                            else if("<=".equals(compare)){
//                                                conditionExpression.append(" "+id+" <= "+str+" ");
//                                            }
//                                            else if("IN".equals(compare)){
//                                                conditionExpression.append(" "+ EXPRESSION_CLASS+"numberContains("+id+","+str+") " );
//                                            }
//                                            else if("B".equals(compare)){
//                                                conditionExpression.append("  "+ EXPRESSION_CLASS+"b("+id+","+str+") " );
//                                            }
//                                            else if("AB".equals(compare)){
//                                                conditionExpression.append("  "+ EXPRESSION_CLASS+"ab("+id+","+str+") " );
//                                            }
//                                            else if("BA".equals(compare)){
//                                                conditionExpression.append("  "+ EXPRESSION_CLASS+"ba("+id+","+str+") " );
//                                            }
//                                            else if("ABA".equals(compare)){
//                                                conditionExpression.append("  "+ EXPRESSION_CLASS+"b("+id+","+str+") " );
//                                            }
//                                        }
//                                        else if("User".equals(valueType)){
//                                            List<String> userIds=new ArrayList<>();
//                                            for (Object o : value) {
//                                                JSONObject obj=(JSONObject)o;
//                                                userIds.add(obj.getString("id"));
//                                            }
//                                            String str = StringUtils.join(userIds, ",");
//                                            conditionExpression.append(" "+ EXPRESSION_CLASS+"strContains("+id+","+str+") " );
//                                        }
//                                        else if("Dept".equals(valueType)){
//                                            List<String> userIds=new ArrayList<>();
//                                            List<String> deptIds=new ArrayList<>();
//                                            for (Object o : value) {
//                                                JSONObject obj=(JSONObject)o;
//                                                String type = obj.getString("type");
//                                                if("dept".equals(type)){
//                                                  deptIds.add(obj.getString("id"));
//                                                }
//                                                else{
//                                                    userIds.add(obj.getString("id"));
//                                                }
//                                            }
//
//                                            if(CollUtil.isNotEmpty(deptIds)){
//                                                UserService userService = SpringContextHolder
//                                                    .getBean(UserService.class);
//                                                LambdaQueryWrapper<Users> lambdaQueryWrapper=new LambdaQueryWrapper<>();
//                                                lambdaQueryWrapper.in(Users::getDepartmentIds,deptIds);
//                                                List<Users> list = userService
//                                                    .list(lambdaQueryWrapper);
//                                                for (Users users : list) {
//                                                    userIds.add(users.getUserId()+"");
//                                                }
//
//                                                if(userIds.isEmpty()){
//                                                    userIds.add("0");
//                                                }
//                                                String str = StringUtils.join(userIds, ",");
//                                                conditionExpression.append(" "+ EXPRESSION_CLASS+"strContains("+id+","+str+") " );
//                                            }
//
//                                        }
//                                        else{
//                                            continue;
//                                        }
//
//                                        if(conditions.size()>1 && j!=(conditions.size()-1)){
//                                            if("OR".equals(groupType)){
//                                                conditionExpression.append(" || ");
//                                            }
//                                            else {
//                                                conditionExpression.append(" && ");
//                                            }
//                                        }
//
//                                        if(i==(conditions.size()-1)){
//                                            conditionExpression.append(" ");
//                                        }
//                                    }
//
//
//                                    conditionExpression.append(" ) ");
//
//                                    if(groups.size()>1 && i!=(groups.size()-1) ){
//                                        if("OR".equals(groupsType)){
//                                            conditionExpression.append(" || ");
//                                        }
//                                        else {
//                                            conditionExpression.append(" && ");
//                                        }
//                                    }
//
//
//                                }
//                                conditionExpression.append("} ");
//                                flow.setConditionExpression(conditionExpression.toString());
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        flow.setId(sequenceFlowId);
//        flow.setSourceRef(from);
//        flow.setTargetRef(to);
//        sequenceFlows.add(flow);
//        return flow;
//    }
//
//    private static String stringEquals(ConditionInfo condition) {
//        return null;
//    }
//
//
//    public static StartEvent createStartEvent() {
//        StartEvent startEvent = new StartEvent();
//        startEvent.setId(START_EVENT_ID);
//        startEvent.setInitiator("applyUserId");
//        return startEvent;
//    }
//
//    public static EndEvent createEndEvent() {
//        EndEvent endEvent = new EndEvent();
//        endEvent.setId(END_EVENT_ID);
//        return endEvent;
//    }
//
//
//    public static String create(String fromId, ChildNode flowNode, Process process,BpmnModel bpmnModel,List<SequenceFlow> sequenceFlows,Map<String,ChildNode> childNodeMap) throws InvocationTargetException, IllegalAccessException {
//        String nodeType = flowNode.getType();
//        if (Type.CONCURRENTS.isEqual(nodeType)) {
//            return createParallelGatewayBuilder(fromId, flowNode,process,bpmnModel,sequenceFlows,childNodeMap);
//        } else if (Type.CONDITIONS.isEqual(nodeType)) {
//            return createExclusiveGatewayBuilder(fromId, flowNode,process,bpmnModel,sequenceFlows,childNodeMap);
//        } else if (Type.USER_TASK.isEqual(nodeType)) {
//            childNodeMap.put(flowNode.getId(),flowNode);
//            JSONObject incoming = flowNode.getIncoming();
//            incoming.put("incoming", Collections.singletonList(fromId));
//            String id = createTask(process,flowNode,sequenceFlows,childNodeMap);
//            // 如果当前任务还有后续任务,则遍历创建后续任务
//            ChildNode children = flowNode.getChildren();
//            if (Objects.nonNull(children) &&StringUtils.isNotBlank(children.getId())) {
//                return create(id, children,process,bpmnModel,sequenceFlows,childNodeMap);
//            } else {
//                return id;
//            }
//        }
//        else if(Type.ROOT.isEqual(nodeType)){
//            childNodeMap.put(flowNode.getId(),flowNode);
//            JSONObject incoming = flowNode.getIncoming();
//            incoming.put("incoming", Collections.singletonList(fromId));
//            String id = createTask(process,flowNode,sequenceFlows,childNodeMap);
//            // 如果当前任务还有后续任务,则遍历创建后续任务
//            ChildNode children = flowNode.getChildren();
//            if (Objects.nonNull(children) &&StringUtils.isNotBlank(children.getId())) {
//                return create(id, children,process,bpmnModel,sequenceFlows,childNodeMap);
//            } else {
//                return id;
//            }
//        }
//        else if(Type.DELAY.isEqual(nodeType)){
//            throw new WorkFlowException("还不想写这个功能");
////            childNodeMap.put(flowNode.getId(),flowNode);
////            JSONObject incoming = flowNode.getIncoming();
////            incoming.put("incoming", Collections.singletonList(fromId));
////            String id = createTask(process,flowNode,sequenceFlows,childNodeMap);
////            // 如果当前任务还有后续任务,则遍历创建后续任务
////            ChildNode children = flowNode.getChildren();
////            if (Objects.nonNull(children) &&StringUtils.isNotBlank(children.getId())) {
////                return create(id, children,process,bpmnModel,sequenceFlows,childNodeMap);
////            } else {
////                return id;
////            }
//        }
//        else if(Type.TRIGGER.isEqual(nodeType)){
//            throw new WorkFlowException("还不想写这个功能");
//        }
//        else if(Type.CC.isEqual(nodeType)){
//            childNodeMap.put(flowNode.getId(),flowNode);
//            JSONObject incoming = flowNode.getIncoming();
//            incoming.put("incoming", Collections.singletonList(fromId));
//            String id = createServiceTask(process,flowNode,sequenceFlows,childNodeMap);
//            // 如果当前任务还有后续任务,则遍历创建后续任务
//            ChildNode children = flowNode.getChildren();
//            if (Objects.nonNull(children) &&StringUtils.isNotBlank(children.getId())) {
//                return create(id, children,process,bpmnModel,sequenceFlows,childNodeMap);
//            } else {
//                return id;
//            }
//        }
//        else {
//            throw new RuntimeException("未知节点类型: nodeType=" + nodeType);
//        }
//    }
//
//    private static String createExclusiveGatewayBuilder(String formId,  ChildNode flowNode,Process process,BpmnModel bpmnModel,List<SequenceFlow> sequenceFlows,Map<String,ChildNode> childNodeMap) throws InvocationTargetException, IllegalAccessException {
//        childNodeMap.put(flowNode.getId(),flowNode);
//        String name =flowNode.getName();
//        String exclusiveGatewayId = flowNode.getId();
//        ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
//        exclusiveGateway.setId(exclusiveGatewayId);
//        exclusiveGateway.setName(name);
//        process.addFlowElement(exclusiveGateway);
//        process.addFlowElement(connect(formId, exclusiveGatewayId,sequenceFlows,childNodeMap,process));
//
//        if (Objects.isNull(flowNode.getBranchs()) && Objects.isNull(flowNode.getChildren())) {
//            return exclusiveGatewayId;
//        }
//        List<ChildNode> flowNodes = flowNode.getBranchs();
//        List<String> incoming = Lists.newArrayListWithCapacity(flowNodes.size());
//        List<JSONObject> conditions = Lists.newCopyOnWriteArrayList();
//        for (ChildNode element : flowNodes) {
//            childNodeMap.put(element.getId(),element);
//            ChildNode childNode = element.getChildren();
//
//            String nodeName = element.getName();
//            com.casic.missiles.dto.flowable.Properties props = element.getProps();
//            String expression = props.getExpression();
//
//
//            if (Objects.isNull(childNode) ||  StringUtils.isBlank(childNode.getId())) {
//
//                incoming.add(exclusiveGatewayId);
//                JSONObject condition = new JSONObject();
//                condition.fluentPut("nodeName", nodeName)
//                        .fluentPut("expression", expression)
//                        .fluentPut("groups",props.getGroups())
//                        .fluentPut("groupsType",props.getGroupsType());
//                conditions.add(condition);
//                continue;
//            }
//            // 只生成一个任务,同时设置当前任务的条件
//            JSONObject incomingObj = childNode.getIncoming();
//            incomingObj.put("incoming", Collections.singletonList(exclusiveGatewayId));
//            String identifier = create(exclusiveGatewayId, childNode,process,bpmnModel,sequenceFlows,childNodeMap);
//            List<SequenceFlow> flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef()))
//                    .collect(Collectors.toList());
//            flows.stream().forEach(
//                    e -> {
//                        if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) {
//                            e.setName(nodeName);
//                        }
//                        // 设置条件表达式
//                        if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) {
//                            e.setConditionExpression(expression);
//                        }
//                    }
//            );
//            if (Objects.nonNull(identifier)) {
//                incoming.add(identifier);
//            }
//        }
//
//
//        ChildNode childNode = flowNode.getChildren();
//
//        if (Objects.nonNull(childNode) &&StringUtils.isNotBlank(childNode.getId()) ) {
//            String parentId = childNode.getParentId();
//            ChildNode parentChildNode = childNodeMap.get(parentId);
//            boolean conFlag = Type.CONCURRENTS.type
//                .equals(parentChildNode.getType());
//            if(!conFlag) {
//                String type = childNode.getType();
//                if(!Type.EMPTY.type.equals(type)){
//                }
//                else{
//                    if(Type.CONDITIONS.type.equals(parentChildNode.getType())){
//                      String endExId=  parentChildNode.getId()+"end";
//                      process.addFlowElement(createExclusiveGateWayEnd(endExId));
//                        if (incoming == null || incoming.isEmpty()) {
//                            return create(exclusiveGatewayId, childNode, process, bpmnModel, sequenceFlows,
//                                childNodeMap);
//                        }
//                        else {
//                            JSONObject incomingObj = childNode.getIncoming();
//                            // 所有 service task 连接 end exclusive gateway
//                            incomingObj.put("incoming", incoming);
//                            FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
//                            // 1.0 先进行边连接, 暂存 nextNode
//                            ChildNode nextNode = childNode.getChildren();
//                            childNode.setChildren(null);
//                            String identifier = endExId;
//                            for (int i = 0; i < incoming.size(); i++) {
//                                process.addFlowElement(connect(incoming.get(i), identifier, sequenceFlows,childNodeMap,process));
//                            }
//
//                            //  针对 gateway 空任务分支 添加条件表达式
//                            if (!conditions.isEmpty()) {
//                                FlowElement flowElement1 = bpmnModel.getFlowElement(identifier);
//                                // 获取从 gateway 到目标节点 未设置条件表达式的节点
//                                List<SequenceFlow> flows = sequenceFlows.stream().filter(
//                                    flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef()))
//                                    .filter(
//                                        flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId))
//                                    .collect(Collectors.toList());
//                                flows.stream().forEach(sequenceFlow -> {
//                                    if (!conditions.isEmpty()) {
//                                        JSONObject condition = conditions.get(0);
//                                        String nodeName = condition.getString("nodeName");
//                                        String expression = condition.getString("expression");
//
//                                        if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils
//                                            .isNotBlank(nodeName)) {
//                                            sequenceFlow.setName(nodeName);
//                                        }
//                                        // 设置条件表达式
//                                        if (Objects.isNull(sequenceFlow.getConditionExpression())
//                                            && StringUtils.isNotBlank(expression)) {
//                                            sequenceFlow.setConditionExpression(expression);
//                                        }
//
//                                        conditions.remove(0);
//                                    }
//                                });
//
//                            }
//
//                            // 1.1 边连接完成后,在进行 nextNode 创建
//                            if (Objects.nonNull(nextNode) &&StringUtils.isNotBlank(nextNode.getId())) {
//                                return create(identifier, nextNode, process, bpmnModel, sequenceFlows,
//                                    childNodeMap);
//                            } else {
//                                return identifier;
//                            }
//                        }
//
//
//                    }
//                }
//            }
//            else{
//                System.err.println("-");
//            }
//        }
//        return exclusiveGatewayId;
//    }
//
//    public static ExclusiveGateway createExclusiveGateWayEnd(String id){
//        ExclusiveGateway exclusiveGateway=new ExclusiveGateway();
//        exclusiveGateway.setId(id);
//        return exclusiveGateway;
//    }
//
//    private static ParallelGateway createParallelGateWayEnd(String id){
//        ParallelGateway parallelGateway=new ParallelGateway();
//        parallelGateway.setId(id);
//        return parallelGateway;
//    }
//
//    private static String createParallelGatewayBuilder(String formId, ChildNode flowNode,Process process,BpmnModel bpmnModel,List<SequenceFlow> sequenceFlows,Map<String,ChildNode> childNodeMap) throws InvocationTargetException, IllegalAccessException {
//        childNodeMap.put(flowNode.getId(),flowNode);
//        String name = flowNode.getName();
//        ParallelGateway parallelGateway = new ParallelGateway();
//        String parallelGatewayId = flowNode.getId();
//        parallelGateway.setId(parallelGatewayId);
//        parallelGateway.setName(name);
//        process.addFlowElement(parallelGateway);
//        process.addFlowElement(connect(formId, parallelGatewayId,sequenceFlows,childNodeMap,process));
//
//        if (Objects.isNull(flowNode.getBranchs()) && Objects.isNull(flowNode.getChildren())) {
//            return parallelGatewayId;
//        }
//
//        List<ChildNode> flowNodes = flowNode.getBranchs();
//        List<String> incoming = Lists.newArrayListWithCapacity(flowNodes.size());
//        for (ChildNode element : flowNodes) {
//            childNodeMap.put(element.getId(),element);
//            ChildNode childNode = element.getChildren();
//            if (Objects.isNull(childNode) ||  StringUtils.isBlank(childNode.getId())) {
//                incoming.add(parallelGatewayId);
//                continue;
//            }
//            String identifier = create(parallelGatewayId, childNode,process,bpmnModel,sequenceFlows,childNodeMap);
//            if (Objects.nonNull(identifier)) {
//                incoming.add(identifier);
//            }
//        }
//
//        ChildNode childNode = flowNode.getChildren();
//        if (Objects.nonNull(childNode) &&StringUtils.isNotBlank(childNode.getId())) {
//            String parentId = childNode.getParentId();
//            ChildNode parentChildNode = childNodeMap.get(parentId);
//            boolean conFlag = Type.CONCURRENTS.type
//                .equals(parentChildNode.getType());
//            if(!conFlag){
//                String type = childNode.getType();
//                if(!Type.EMPTY.type.equals(type)){
//
//                }
//                else{
//                    if(Type.CONCURRENTS.type.equals(parentChildNode.getType())){
//                        String endExId=  parentChildNode.getId()+"end";
//                        process.addFlowElement(createParallelGateWayEnd(endExId));
//                        // 普通结束网关
//                        if (CollectionUtils.isEmpty(incoming)) {
//                            return create(parallelGatewayId, childNode,process,bpmnModel,sequenceFlows,childNodeMap);
//                        }
//                        else {
//                            JSONObject incomingObj = childNode.getIncoming();
//                            // 所有 service task 连接 end parallel gateway
//                            incomingObj.put("incoming", incoming);
//                            FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
//                            // 1.0 先进行边连接, 暂存 nextNode
//                            ChildNode nextNode = childNode.getChildren();
//                            childNode.setChildren(null);
//                            String identifier = endExId;
//                            for (int i = 0; i < incoming.size(); i++) {
//                                FlowElement flowElement1 = bpmnModel.getFlowElement(incoming.get(i));
//                                process.addFlowElement(connect(flowElement1.getId(), identifier,sequenceFlows,childNodeMap,process));
//                            }
//                            // 1.1 边连接完成后,在进行 nextNode 创建
//                            if (Objects.nonNull(nextNode)&&StringUtils.isNotBlank(nextNode.getId())) {
//                                return create(identifier, nextNode,process,bpmnModel,sequenceFlows,childNodeMap);
//                            } else {
//                                return identifier;
//                            }
//                        }
//                    }
//                }
//            }
//            else{
//                String type = childNode.getType();
//                if(!Type.EMPTY.type.equals(type)){
//
//                }
//                else{
//                    if(Type.CONCURRENTS.type.equals(parentChildNode.getType())){
//                        String endExId=  parentChildNode.getId()+"end";
//                        process.addFlowElement(createParallelGateWayEnd(endExId));
//                        // 普通结束网关
//                        if (CollectionUtils.isEmpty(incoming)) {
//                            return create(parallelGatewayId, childNode,process,bpmnModel,sequenceFlows,childNodeMap);
//                        }
//                        else {
//                            JSONObject incomingObj = childNode.getIncoming();
//                            // 所有 service task 连接 end parallel gateway
//                            incomingObj.put("incoming", incoming);
//                            FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
//                            // 1.0 先进行边连接, 暂存 nextNode
//                            ChildNode nextNode = childNode.getChildren();
//                            childNode.setChildren(null);
//                            String identifier = endExId;
//                            for (int i = 0; i < incoming.size(); i++) {
//                                FlowElement flowElement1 = bpmnModel.getFlowElement(incoming.get(i));
//                                process.addFlowElement(connect(flowElement1.getId(), identifier,sequenceFlows,childNodeMap,process));
//                            }
//                            // 1.1 边连接完成后,在进行 nextNode 创建
//                            if (Objects.nonNull(nextNode) &&StringUtils.isNotBlank(nextNode.getId())) {
//                                return create(identifier, nextNode,process,bpmnModel,sequenceFlows,childNodeMap);
//                            } else {
//                                return identifier;
//                            }
//                        }
//                    }
//                }
//            }
//
//        }
//        return parallelGatewayId;
//    }
//
//    private static String createTask(Process process,ChildNode flowNode,List<SequenceFlow> sequenceFlows,Map<String,ChildNode> childNodeMap) {
//        JSONObject incomingJson = flowNode.getIncoming();
//        List<String> incoming = incomingJson.getJSONArray("incoming").toJavaList(String.class);
//        // 自动生成id
////        String id = id("serviceTask");
//        String id=flowNode.getId();
//        if (incoming != null && !incoming.isEmpty()) {
//            UserTask userTask = new UserTask();
//            userTask.setName(flowNode.getName());
//            userTask.setId(id);
//            process.addFlowElement(userTask);
//            process.addFlowElement(connect(incoming.get(0), id,sequenceFlows,childNodeMap,process));
//
//            ArrayList<FlowableListener> taskListeners = new ArrayList<>();
//            FlowableListener taskListener = new FlowableListener();
//            // 事件类型,
//            taskListener.setEvent(TaskListener.EVENTNAME_CREATE);
//            // 监听器类型
//            taskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
//            // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean.
//            taskListener.setImplementation("${taskCreatedListener}");
//            taskListeners.add(taskListener);
//            userTask.setTaskListeners(taskListeners);
//            if("root".equalsIgnoreCase(id)){
//            }
//            else{
//                ArrayList<FlowableListener> listeners = new ArrayList<>();
//                FlowableListener activitiListener = new FlowableListener();
//                // 事件类型,
//                activitiListener.setEvent(ExecutionListener.EVENTNAME_START);
//                // 监听器类型
//                activitiListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
//                // 设置实现了,这里设置监听器的类型是delegateExpression,这样可以在实现类注入Spring bean.
//                activitiListener.setImplementation("${counterSignListener}");
//                listeners.add(activitiListener);
//                userTask.setExecutionListeners(listeners);
//                Properties props = flowNode.getProps();
//                String mode = props.getMode();
//                MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
//                // 审批人集合参数
//                multiInstanceLoopCharacteristics.setInputDataItem(userTask.getId()+"assigneeList");
//                // 迭代集合
//                multiInstanceLoopCharacteristics.setElementVariable("assigneeName");
//                // 并行
//                multiInstanceLoopCharacteristics.setSequential(false);
//                userTask.setAssignee("${assigneeName}");
//                // 设置多实例属性
//                userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
//                if(ModeEnums.OR.getTypeName().equals(mode)){
//                    multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}");
//                }
//                else if (ModeEnums.NEXT.getTypeName().equals(mode)){
//                    multiInstanceLoopCharacteristics.setSequential(true);
//                }
//            }
//        }
//        return id;
//    }
//
//    private static String createServiceTask(Process process,ChildNode flowNode,List<SequenceFlow> sequenceFlows,Map<String,ChildNode> childNodeMap) {
//        JSONObject incomingJson = flowNode.getIncoming();
//        List<String> incoming = incomingJson.getJSONArray("incoming").toJavaList(String.class);
//        String id=flowNode.getId();
//        if (incoming != null && !incoming.isEmpty()) {
//
//        }
//        return id;
//    }
//
//    private enum Type {
//
//        /**
//         * 并行事件
//         */
//        CONCURRENTS("CONCURRENTS", ParallelGateway.class),
//        CONCURRENT("CONCURRENT", SequenceFlow.class),
//        /**
//         * 排他事件
//         */
//        CONDITION("CONDITION", ExclusiveGateway.class),
//        CONDITIONS("CONDITIONS", ExclusiveGateway.class),
//        /**
//         * 任务
//         */
//        USER_TASK("APPROVAL", UserTask.class),
//        EMPTY("EMPTY", Object.class),
//        ROOT("ROOT", UserTask.class),
//        CC("CC", ServiceTask.class),
//        TRIGGER("TRIGGER", ServiceTask.class),
//        DELAY("DELAY", IntermediateCatchEvent.class);
//        private String type;
//
//        private Class<?> typeClass;
//
//        Type(String type, Class<?> typeClass) {
//            this.type = type;
//            this.typeClass = typeClass;
//        }
//
//        public final static Map<String, Class<?>> TYPE_MAP = Maps.newHashMap();
//
//        static {
//            for (Type element : Type.values()) {
//                TYPE_MAP.put(element.type, element.typeClass);
//            }
//        }
//
//        public boolean isEqual(String type) {
//            return this.type.equals(type);
//        }
//
//    }
//
//
//    public static  ChildNode getChildNode(ChildNode childNode,String nodeId){
//        Map<String,ChildNode> childNodeMap =new HashMap<>();
//        if(StringUtils.isNotBlank(childNode.getId())){
//            getChildNode(childNode,childNodeMap);
//        }
//
//        Set<String> set = childNodeMap.keySet();
//        for (String s : set) {
//            if(StringUtils.isNotBlank(s)){
//                if(s.equals(nodeId)){
//                    return childNodeMap.get(s);
//                }
//            }
//        }
//        return null;
//    }
//
//    private  static  void getChildNode(ChildNode childNode,Map<String,ChildNode> childNodeMap){
//        childNodeMap.put(childNode.getId(),childNode);
//        List<ChildNode> branchs = childNode.getBranchs();
//        ChildNode children = childNode.getChildren();
//        if(branchs!=null && branchs.size()>0){
//            for (ChildNode branch : branchs) {
//                if(StringUtils.isNotBlank(branch.getId())){
//                    childNodeMap.put(branch.getId(),branch);
//                    getChildNode(branch,childNodeMap);
//                }
//            }
//        }
//
//        if(children!=null ){
//            childNodeMap.put(children.getId(),children);
//            getChildNode(children,childNodeMap);
//        }
//
//    }
//
//}