首页
/ 飞龙工作流FlowLong:网关路由配置

飞龙工作流FlowLong:网关路由配置

2026-02-04 04:09:19作者:农烁颖Land

概述

飞龙工作流FlowLong作为国产无代码工作流引擎,提供了强大的网关路由功能,能够满足复杂业务流程的分支控制需求。网关路由是工作流引擎的核心组件,负责根据条件判断将流程导向不同的分支路径,实现智能化的流程决策。

网关路由类型

FlowLong支持四种主要的网关路由类型,每种类型都有其特定的应用场景:

网关类型 描述 应用场景
条件分支(排它分支) 根据条件选择一个分支执行,用于实现决策逻辑 审批流程中的条件判断、异常处理分支
并行分支 将流程分成多条并行分支,支持分叉和汇聚 需要同时处理多个任务的场景
包容分支 条件分支和并行分支的结合体,支持选择多条分支 复杂的多条件并行处理
路由分支 根据条件重定向到指定节点或继续默认分支 流程跳转、动态路由

条件节点模型

FlowLong使用ConditionNode模型来定义网关路由的条件配置:

public class ConditionNode implements Serializable {
    private String nodeName;          // 节点名称
    private String nodeKey;           // 节点key(路由分支格式:route:targetNodeKey)
    private Integer type;             // 节点类型
    private Integer priorityLevel;    // 优先级
    private List<List<NodeExpression>> conditionList; // 条件表达式列表
    private NodeModel childNode;      // 子节点
}

条件表达式配置

条件表达式支持复杂的逻辑组合,采用双层List结构:

{
  "conditionList": [
    [
      {"field": "amount", "operator": ">", "value": "10000"},
      {"field": "department", "operator": "=", "value": "finance"}
    ],
    [
      {"field": "amount", "operator": "<=", "value": "10000"}
    ]
  ]
}

外层List表示或关系,内层List表示且关系

条件类型支持

FlowLong支持两种条件类型:

classDiagram
    class ConditionType {
        <<enumeration>>
        custom
        form
        eq(String type) boolean
        ne(String type) boolean
    }
  • custom: 自定义条件字段
  • form: 表单条件字段

路由分支配置示例

基本路由配置

{
  "nodeKey": "route:approval_node",
  "nodeName": "金额审批路由",
  "conditionList": [
    [
      {"field": "amount", "operator": ">", "value": "5000", "type": "form"}
    ]
  ],
  "childNode": {
    "type": 1,
    "nodeName": "主管审批",
    "nodeKey": "approval_node"
  }
}

多条件路由配置

{
  "nodeKey": "route:multi_approval",
  "nodeName": "多条件路由",
  "conditionList": [
    [
      {"field": "amount", "operator": ">", "value": "10000"},
      {"field": "projectType", "operator": "=", "value": "important"}
    ],
    [
      {"field": "department", "operator": "=", "value": "finance"},
      {"field": "urgency", "operator": "=", "value": "high"}
    ]
  ],
  "childNode": {
    "type": 1,
    "nodeName": "财务总监审批",
    "nodeKey": "finance_director_approval"
  }
}

路由处理逻辑

FlowLong的路由处理采用优先级匹配机制:

flowchart TD
    A[开始路由判断] --> B{是否存在指定路由key?}
    B -->|是| C[按key精确匹配]
    B -->|否| D[按优先级排序匹配]
    C --> E[执行匹配的路由分支]
    D --> F[遍历条件表达式]
    F --> G{条件满足?}
    G -->|是| E
    G -->|否| H[检查下一个条件]
    H --> F
    E --> I[执行子节点流程]

路由处理核心代码

public Optional<ConditionNode> matchConditionNode(FlowLongContext context, 
                                                 Execution execution, 
                                                 List<ConditionNode> conditionNodes) {
    // 检查是否存在指定的路由key
    String conditionNodeKey = FlowDataTransfer.get(FlowConstants.processSpecifyConditionNodeKey);
    if (conditionNodeKey != null) {
        FlowDataTransfer.removeByKey(FlowConstants.processSpecifyConditionNodeKey);
        return conditionNodes.stream()
                .filter(t -> Objects.equals(t.getNodeKey(), conditionNodeKey))
                .findFirst();
    }
    
    // 按优先级排序并匹配条件
    return conditionNodes.stream()
            .sorted(Comparator.comparing(ConditionNode::getPriorityLevel))
            .filter(conditionNode -> evaluateConditions(context, execution, conditionNode))
            .findFirst();
}

包容分支处理

包容分支允许选择多个满足条件的分支执行:

public Optional<List<ConditionNode>> getInclusiveNodes(FlowLongContext context, 
                                                      Execution execution, 
                                                      NodeModel nodeModel) {
    final List<ConditionNode> inclusiveNodes = nodeModel.getInclusiveNodes();
    this.assertConditionNodes(inclusiveNodes);
    
    // 获取流程变量
    Map<String, Object> args = execution.getArgs();
    
    // 过滤满足条件的所有分支
    List<ConditionNode> matchedNodes = inclusiveNodes.stream()
            .filter(t -> flowLongExpression.eval(t.getConditionList(), args))
            .collect(Collectors.toList());
    
    // 如果没有分支满足条件,使用默认分支
    if (matchedNodes.isEmpty()) {
        matchedNodes = Collections.singletonList(defaultConditionNode(inclusiveNodes).get());
    }
    
    return Optional.of(matchedNodes);
}

实战配置案例

案例1:费用报销路由

{
  "nodeName": "费用报销路由",
  "nodeKey": "expense_route",
  "conditionNodes": [
    {
      "nodeKey": "route:director_approval",
      "nodeName": "总监审批",
      "priorityLevel": 1,
      "conditionList": [
        [
          {"field": "amount", "operator": ">", "value": "5000"}
        ]
      ],
      "childNode": {
        "type": 1,
        "nodeName": "财务总监审批",
        "setType": 1
      }
    },
    {
      "nodeKey": "route:manager_approval", 
      "nodeName": "经理审批",
      "priorityLevel": 2,
      "conditionList": [
        [
          {"field": "amount", "operator": ">", "value": "1000"},
          {"field": "amount", "operator": "<=", "value": "5000"}
        ]
      ],
      "childNode": {
        "type": 1,
        "nodeName": "部门经理审批",
        "setType": 1
      }
    },
    {
      "nodeKey": "route:default_approval",
      "nodeName": "默认审批",
      "priorityLevel": 3,
      "conditionList": [],
      "childNode": {
        "type": 1, 
        "nodeName": "主管审批",
        "setType": 1
      }
    }
  ]
}

案例2:采购审批路由

{
  "nodeName": "采购审批路由",
  "nodeKey": "purchase_route", 
  "inclusiveNodes": [
    {
      "nodeKey": "inclusive:quality_check",
      "nodeName": "质量检查",
      "conditionList": [
        [
          {"field": "productType", "operator": "=", "value": "electronic"}
        ]
      ],
      "childNode": {
        "type": 1,
        "nodeName": "质量部门检查",
        "setType": 1
      }
    },
    {
      "nodeKey": "inclusive:technical_review",
      "nodeName": "技术评审", 
      "conditionList": [
        [
          {"field": "complexity", "operator": "=", "value": "high"}
        ]
      ],
      "childNode": {
        "type": 1,
        "nodeName": "技术部门评审",
        "setType": 1  
      }
    }
  ]
}

最佳实践

1. 优先级设置原则

mindmap
  root(路由优先级配置)
    高优先级条件
      金额大于10000
      紧急项目
      重要客户
    中优先级条件
      金额5000-10000
      普通项目
    低优先级条件
      金额小于5000
      默认路由

2. 条件表达式优化

  • 使用明确的字段名和操作符
  • 避免过于复杂的嵌套条件
  • 为常用条件设置合适的优先级
  • 确保默认路由始终存在

3. 性能考虑

  • 条件表达式按优先级排序,高优先级条件放在前面
  • 使用索引字段进行条件判断
  • 避免在条件表达式中进行复杂计算

常见问题处理

路由匹配失败

当没有路由条件匹配时,系统会自动选择默认路由(优先级最低且无条件表达式的路由)。

条件表达式错误

确保条件表达式的字段存在于流程变量中,操作符支持包括:=, !=, >, >=, <, <=, in, not in等。

路由循环检测

FlowLong内置了路由循环检测机制,防止流程陷入无限循环。

总结

飞龙工作流FlowLong的网关路由配置提供了强大而灵活的业务流程控制能力。通过合理的路由配置,可以实现复杂的业务逻辑分支,满足各种审批场景的需求。掌握路由配置的技巧,能够大大提升工作流的设计效率和应用效果。

建议在实际项目中根据具体业务需求,灵活组合使用不同类型的网关路由,构建出既符合业务逻辑又高效可靠的流程系统。

登录后查看全文
热门项目推荐
相关项目推荐