循环

循环相当编程语言中的 for/while/forEach 等语法结构,当需要一定次数或针对某个数据集合(数组)重复执行一些操作时,可以使用循环节点。

创建节点

在工作流配置界面中,点击流程中的加号(“+”)按钮,添加“循环”节点:

创建循环节点后,会生成一个循环内部的分支,可以在分支中增加任意多个节点,这些节点除了可以使用流程上下文的变量,还可以使用循环上下文的局部变量,例如循环集合中每次循环到的数据对象,或者是循环次数的索引(索引从 0 开始计数)。局部变量的作用域仅限于循环内部,如果有多层循环嵌套,可以按层使用具体循环的局部变量。

节点配置

循环对象

循环会以循环对象不同数据类型做不同的处理:

  1. 数组:最常见的情况,通常是可以选择流程上下文的变量,比如查询节点的多条数据结果,或者预加载的对多关系数据。如果选择的是数组,循环节点会遍历数组中的每个元素,每次循环都会将当前元素赋值给循环上下文的局部变量。

  2. 数字:当选择的变量是一个数字是,会以该数字为循环次数,局域变量中的循环次数的索引也即循环对象的值。

  3. 字符串:当选择的变量是一个字符串时,会以该字符串的长度为循环次数,每次按索引处理字符串中的每一个字符。

  4. 其他:其他类型的值(包括对象类型)都仅作为单次处理的循环对象,也只会循环一次,通常这种情况不需要使用循环。

除了选择变量,针对数字和字符串类型也可以直接输入常量,例如输入 5(数字类型),循环节点会循环 5 次,输入 abc(字符串类型),循环节点会循环 3 次,分别处理 abc 三个字符。在选择变量的工具中选择希望使用常量的类型。

示例

例如在订单下单时,需要对订单中的每个商品进行库存检查,如果库存充足则扣减库存,否则订单明细内的商品更新为无效。

  1. 创建三张表,商品表 <-(1:m)-- 订单明细表 --(m:1)-> 订单表,数据模型如下:

    字段名称字段类型
    订单商品明细多对一(明细)
    订单总价数字
    字段名称字段类型
    商品一对多(商品)
    数量数字
    字段名称字段类型
    商品名称单行文本
    价格数字
    库存整数
  2. 创建工作流,触发器选择“数据表事件”,选择“订单”表“新增数据时”触发,并且需要配置上预加载“订单明细”表和明细下的商品表的关系数据:

  3. 创建循环节点,选择循环对象为“触发数据 / 订单明细”,即对订单明细表中的每一条数据:

  4. 循环节点内部创建一个“条件判断”节点,判断商品的库存是否充足:

  5. 如果充足则在“是”的分支中创建一个“计算节点”和一个“更新数据”节点,将计算完扣减的库存更新至对应商品的记录:

  6. 否则在“否”的分支中创建一个“更新数据”节点,更新订单明细的状态为“无效”:

总的流程结构如下图:

配置完成并激活该流程后,当创建新订单时,会自动检查订单明细中的商品库存,如果库存充足则扣减库存,否则订单明细内的商品更新为无效(以便计算有效的订单总价)。