逻辑编排

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

约定

  1. 示例中约定应用根目录为 /data/app, 实际编写时需替换为应用根目录。
  2. 使用 <> 标识自行替换的内容。 例如: icon-<图标名称>, 实际编写时应替换为: icon-foo, icon-bar ...
  3. 文件.yao的后缀和格式和.json结构是一样的,不影响使用都可以兼容。

使用 Flow

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

新建 Flow DSL 文件

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

/data/app/flows/product.flow.yao

{
"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}}"
}

运行调试

yao run flows.product

上下文数据引用

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

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

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

{
"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.admin.user.Find",
"args": ["{{$res.产品.data[0].user_id}}", { "select": ["id", "name"] }]
}
],
"output": {
"产品": "{{$res.产品}}",
"用户": "{{$res.用户}}"
}
}

运行调试

yao run flows.query.search

Flow 处理器传参

使用参数表

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

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

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

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

运行调试

yao run flows.query.args 1

使用 Map 参数

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

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

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

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

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

运行调试

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

查看 Flow Widget 手册

使用 Script

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

新建 Script 脚本文件

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

/data/app/scripts/query.js

/**
* 查询产品信息
*/
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;
}

运行调试

yao run scripts.query.Product

参数表

在文件中添加一个 Args 函数

/data/app/scripts/query.js

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

运行调试

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

查看 JSAPI 手册

逻辑编排

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

约定

  1. 示例中约定应用根目录为 /data/app, 实际编写时需替换为应用根目录。
  2. 使用 <> 标识自行替换的内容。 例如: icon-<图标名称>, 实际编写时应替换为: icon-foo, icon-bar ...
  3. 文件.yao的后缀和格式和.json结构是一样的,不影响使用都可以兼容。

使用 Flow

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

新建 Flow DSL 文件

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

/data/app/flows/product.flow.yao

{
"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}}"
}

运行调试

yao run flows.product

上下文数据引用

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

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

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

{
"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.admin.user.Find",
"args": ["{{$res.产品.data[0].user_id}}", { "select": ["id", "name"] }]
}
],
"output": {
"产品": "{{$res.产品}}",
"用户": "{{$res.用户}}"
}
}

运行调试

yao run flows.query.search

Flow 处理器传参

使用参数表

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

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

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

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

运行调试

yao run flows.query.args 1

使用 Map 参数

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

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

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

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

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

运行调试

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

查看 Flow Widget 手册

使用 Script

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

新建 Script 脚本文件

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

/data/app/scripts/query.js

/**
* 查询产品信息
*/
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;
}

运行调试

yao run scripts.query.Product

参数表

在文件中添加一个 Args 函数

/data/app/scripts/query.js

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

运行调试

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

查看 JSAPI 手册