# 排他网关

排他网关(Exclusive Gateway)是工作流中用于决策的节点,它根据预设条件从多个流出路径中​​仅选择唯一的一条​​路径继续执行流程

foo

# 工作原理

当流程实例执行到排他网关时,工作流引擎会启动一个条件评估过程: ​​1. 顺序评估​​:引擎按照排他网关流出顺序流(Sequence Flow)在BPMN模型中定义的​​先后顺序​​,依次评估每个顺序流上定义的条件表达式 ​​2. 选择第一条符合条件的路径​​:当找到第一个条件表达式计算结果为true的顺序流时,引擎立即选择该路径继续执行流程,​​停止后续条件的评估​​ ​​3. 单路径执行​​:排他网关​​只会选择一条顺序流​​执行,即使后续顺序流的条件也为true,引擎也会忽略它们

# 条件表达式

排他网关的分支条件通过​​条件表达式​​定义,这些表达式直接设置在从网关流出的顺序流上,而不是在网关上本身表达式通常使用统一表达式语言(UEL),基本格式为${expression},其中expression是返回布尔值的逻辑语句。

常见表达式

${approvalResult == 'approved'}- 字符串比较
${holiday.num > 3}- 数值比较
${order.amount > 1000 && order.priority == 'high'}- 复合条件
${userService.isManager(employeeId)}- 方法调用

# 异常处理机制

当所有外出顺序流的条件都不满足时,排他网关的行为如下 ​​检查默认序列流​​:引擎会检查是否存在标记为"默认流"的顺序流(在BPMN中通常通过箭头加"/"标识) ​​执行默认流​​:如果存在默认流,引擎会选择此路径继续执行流程,忽略条件表达式的值 ​​抛出异常​​:如果既没有条件为true的顺序流,也没有定义默认序列流,工作流引擎会抛出异常

# 最佳实践

​​1.条件顺序安排​​:将最可能被满足或最重要的条件放在前面,因为引擎按顺序评估且选择第一个满足的条件。例如,在紧急程度判断中,将"紧急"条件置于"普通"条件之前。 ​​2.避免条件重叠​​:确保条件之间互斥或明确优先级,尽管排他网关会选择第一个满足的条件,但清晰的条件设计能提高流程可读性 。例如

<!-- 不推荐:条件有重叠 -->
<conditionExpression>${days > 3}</conditionExpression>
<conditionExpression>${days > 5}</conditionExpression>

<!-- 推荐:条件互斥 -->
<conditionExpression>${days <= 3}</conditionExpression>
<conditionExpression>${days > 3 && days <= 10}</conditionExpression>
<conditionExpression>${days > 10}</conditionExpression>

3.​​始终定义默认流​​:为了防止因条件不满足导致的流程异常,建议总是为排他网关定义一个默认序列流。默认流可以用于处理异常情况、提供降级方案或记录未预期路径

# 实战案例

# 需求描述

现假设实现一个请假流程, 请假1天走直属领导审批,请假2天走HR审批, 其他情况走老板审批。

# 建模过程

  1. 将网关修改成排他网关用小扳手将网关的类型修改成排他网关 foo

  2. 设置请假申请节点的属性请假申请是一个用户任务节点,我们需要设置两部分信息,一个指定人assignee,一个用户提交的数据信息(使用内置表单) foo

  3. 设置排他网关的连线的条件 设置从排他网关流出的连线的条件信息, 如果是默认线路则不需要设置。 gateway-exclusive-3 foo

  4. 设置审批节点的属性信息在这里我们使用了服务任务来完成这个测试动作, 实际业务一般使用用户任务节点。

foo

# 演示效果

  1. 提交请假申请表单 用户登陆若依工作流演示站 (opens new window),找到菜单提交请假信息,此时会将登陆用户名赋予上面的${startUser} foo

  2. 最终效果 这个时候我们可以看到流程的高亮显示和路线选择是符合业务需求。 foo

在线体验,请访问ruoyiflow (opens new window)