Skip to content

逻辑编排

使用数据流 Flow 或 Script 编排处理器调用逻辑,实现复杂数据查询、处理。

约定

  1. 示例中约定应用根目录为 /data/app, 实际编写时需替换为应用根目录。
  2. 使用 <> 标识自行替换的内容。 例如: icon-<图标名称>, 实际编写时应替换为: icon-foo, icon-bar ...

使用 Flow

使用 Flow DSL 编写处理器,编排数据查询逻辑。

新建 Flow DSL 文件

flows 目录下, 创建一个 Flow DSL 文件,编排数据查询逻辑。

/data/app/flows/product.flow.json

json
{
  "label": "演示",
  "version": "1.0.0",
  "description": "数据查询",
  "nodes": [
    {
      "name": "添加数据",
      "process": "models.product.Insert",
      "args": [
        ["name", "remark", "user_id"],
        [
          ["遗落的南境三部曲一", "(美) 杰夫·范德米尔", 1],
          ["遗落的南境三部曲二", "(美) 杰夫·范德米尔", 1],
          ["遗落的南境三部曲三", "(美) 杰夫·范德米尔", 1],
          ["没药花园案件:罪恶", "没药花园 著,博集天", 1],
          ["那不勒斯四部曲", "【意】埃莱娜·费兰特", 1]
        ]
      ]
    },
    {
      "name": "分页查询",
      "process": "models.product.Paginate",
      "args": [
        {
          "select": ["id", "name", "remark", "user_id"],
          "wheres": [{ "column": "name", "op": "match", "value": "三部曲" }]
        },
        1,
        2
      ]
    }
  ],
  "output": "{{$res}}"
}

运行调试

bash
yao run flows.product

上下文数据引用

使用 {{$res.<节点名称>}} 变量访问数据流节点的查询结果。

flows/query 目录下, 新建一个 Flow DSL 文件。

/data/app/flows/query/search.flow.json

json
{
  "label": "演示",
  "version": "1.0.0",
  "description": "数据查询",
  "nodes": [
    {
      "name": "产品",
      "process": "models.product.Paginate",
      "args": [
        {
          "select": ["id", "name", "remark", "user_id"],
          "wheres": [{ "column": "name", "op": "match", "value": "三部曲" }]
        },
        1,
        2
      ]
    },
    {
      "name": "打印",
      "process": "utils.fmt.Print",
      "args": ["{{$res.产品.data[0]}}"]
    },
    {
      "name": "用户",
      "process": "models.xiang.user.Find",
      "args": ["{{$res.产品.data[0].user_id}}", { "select": ["id", "name"] }]
    }
  ],
  "output": {
    "产品": "{{$res.产品}}",
    "用户": "{{$res.用户}}"
  }
}

运行调试

bash
yao run flows.query.search

Flow 处理器传参

使用参数表

使用 {{$in[<参数表下标>]}} 变量访问传入参数

flows/query 目录下, 新建一个 Flow DSL 文件。

/data/app/flows/query/args.flow.json

json
{
  "label": "演示",
  "version": "1.0.0",
  "description": "数据查询",
  "nodes": [
    {
      "name": "用户",
      "process": "models.xiang.user.Find",
      "args": ["{{$in[0]}}", { "select": ["id", "name"] }]
    }
  ],
  "output": {
    "参数表": "{{$in}}",
    "用户": "{{$res.用户}}"
  }
}

运行调试

bash
yao run flows.query.args 1

使用 Map 参数

如果参数表中 只有一个 Map 类型参数, 可以直接使用 KEY 作为变量名称。

flows/query 目录下, 新建一个 Flow DSL 文件。

/data/app/flows/query/args_map.flow.json

json
{
  "label": "演示",
  "version": "1.0.0",
  "description": "数据查询",
  "nodes": [
    {
      "name": "用户",
      "process": "models.xiang.user.Find",
      "args": ["{{$id}}", { "select": ["id", "name"] }]
    }
  ],
  "output": {
    "参数表": "{{$in}}",
    "用户": "{{$res.用户}}",
    "ID": {
      "$id": "{{$id}}",
      "$in[0].id": "{{$in[0].id}}"
    }
  }
}

本例中 {{$id}}{{$in[0].id}} 等效

运行调试

bash
yao run flows.query.args_map '::{"id":1}'

使用 Script

对于逻辑较为复杂的场景,可以使用 JavaScript 脚本编写处理器,实现逻辑编排。

新建 Script 脚本文件

scirpts 目录下, 新建一个 JS 文件。

/data/app/scripts/query.js

javascript
/**
 * 查询产品信息
 */
function Product() {
  let res = Process(
    'models.product.Insert',
    ['name', 'remark', 'user_id'],
    [
      ['手艺里的中国:指尖', '李武望 著 时代华语', 2],
      ['(限时包邮)在印度', '随水 著,书田文化', 2]
    ]
  );

  let products = Process('models.product.Get', {
    select: ['id', 'name', 'remark', 'user_id'],
    wheres: [{ column: 'user_id', value: 2 }]
  });

  let result = [];
  products.forEach((item) => {
    result.push(`${item.id} - ${item.name} ( ${item.remark} )`);
  });
  return result;
}

运行调试

bash
yao run scripts.query.Product

参数表

在文件中添加一个 Args 函数

/data/app/scripts/query.js

javascript
/**
 * 传参演示
 */
function Args(...args) {
  return args;
}

运行调试

bash
yao run scripts.query.Args "hello" '::{"foo":"bar"}'