Dot Walking Script
Dot walking script(简称DW) 可以使用原生的groovy和我们内置函数,可以在groovy脚本和flow input中使用。
1 使用场景
在input和groovy中也是可以使用$.xx.xx的方式来传递数据的,其中数组的取值传递是通过$.xx.xx[n].xx的方式来传递的
1.1 在Flow input中使用
input 切换到groovy,然后在groovy中可以使用$.xx.xx的方式来传递数据

1.2 在Groovy脚本中使用
在groovy sdk中可以使用输入字段的方式传递参数

1.3 不支持的传参方式
在groovy脚本中定义的参数是不支持传递的,比如这个例子中epicData,同理在flow input中定义的参数也是不支持传递的

2 示例表单,后续举例说明以这4个表单为主
这里有四个表,每个表的字段名和它的 token 相同,只是 token 的首字母是小写的。例如,Epic 表的 Title 字段对应的 token 是 title。
对于字段名中的 ACL、Select 和 Editable,前面的单词表示数据来源,中间的部分表示是否多选,后面的部分表示组件类型。例如:
FeatureACL表示数据来源是 Feature,单选,组件类型是 ACL。FeatureMultiACL表示数据来源是 Feature,多选,组件类型是 ACL。FeatureEditable表示数据来源是 Feature,组件类型是 Editable。
2.1 Epic
pbcToken:dot-walking formEntityToken:epic

2.2 Feature
pbcToken:dot-walking formEntityToken:feature

2.3 User Story
pbcToken:dot-walking formEntityToken:userStory

2.4 Task
pbcToken:dot-walking formEntityToken:task

3 语法
DW 是由属性(在 formEntity 中的字段 token)和函数(如 _filter、_findOne、_resolve)组成的调用链。所有的属性和方法返回两种类型的值:
- DATA:与 formEntityData 相关的值。
- DWR:DW 对象(即 Dot Walking Reference)。
3.1 InputField控件类型
CETA 平台中表单输入控件分成两种类型,分别是引用类型和基本类型
3.1.1 引用类型 返回值是DWR
select(多选或单选)
acl(多选或单选)
editable(始终多选)
3.1.2 基本类型 返回值是DATA
input
number
date
time
upload
checkBox
textArea
radio
switch
rate
3.2 自定义函数
3.2.1 DW的入口函数_(data) 返回值是DWR
_(data) 是 Dot Walking 脚本的入口函数。它的参数 data 是一个 Map 类型的对象,包含以下信息:
pbcToken必填formEntityToken必填id(这是 formEntityDataId)必填
3.2.2 _filter(closure) 过滤函数 返回值是DATA
在 Groovy 中,it 是闭包默认的参数名称,用于表示传递给闭包的单个参数。对于 _filter(closure) 这个过滤函数,closure 是一个闭包,而 it 代表集合中的当前元素 formEntityData。你可以在 it 后面直接对 formEntityData 中的字段进行操作,并使用 &&、||、! 等运算符来连接每个操作。这样可以更方便地进行条件判断和过滤。
在下面的表格中,例子只展示了 _filter 部分。为了便于理解并减少代码量,前面的部分是:
_(["pbcToken":"dot-walking","formEntityToken":"epic","id":200821]).featureMultiACL.
表示查找 Epic 表中 id 为 200821 的记录 featureMultiACL,并筛选出满足 _filter 条件的 feature。
| 运算符 | 描述 | 参数 | InputField控件类型 | 示例 |
|---|---|---|---|---|
== | 等于 | 无 | 基本类 | _filter{it.title=='Dot Walking'} feature的title等于Dot Walking |
!= | 不等于 | 无 | 基本类 | _filter{it.title !='Dot Walking'} feature的title不等于Dot Walking |
> | 大于 | 无 | 基本类 | _filter{it.priority >5} feature的priority大于5 |
< | 小于 | 无 | 基本类 | _filter{it.priority <5} feature的priority小于5 |
>= | 大于或等于 | 无 | 基本类 | _filter{it.priority >=5} feature的priority大于等于5 |
<= | 小于或等于 | 无 | 基本类 | _filter{it.priority <=5} feature的priority小于等于5 |
_contains(condition) | 包含 | string | 基本类 | _filter{it.title._contains("Dot")} feature的title包含Dot |
_notContains(condition) | 不包含 | string | 基本类 | _filter{it.title._notContains("Dot")} feature的title不包含Dot |
_in(List<condition>) | 之内 | array[string] | 基本类 | _filter{it.priority._in(5,6,7)} feature的priority为5,6,7 |
_between(condition1,condition2) | 区间 | number1,number2 | 基本类 | _filter{it.priority._between(5,7)} feature的priority大于5小于7 |
_startsWith(condition1) | 以开头 | string | 基本类 | _filter{it.title._startsWith("Dot")} feature的title以Dot开头 |
_endsWith(condition1) | 以结尾 | string | 基本类 | _filter{it.title._endsWith("Dot")} feature的title以Dot结尾 |
_blank() | 为空 | 无 | 基本类 | _filter{it.title._blank()} feature的title为空 |
_notBlank() | 不为空 | 无 | 基本类 | _filter{it.title._notBlank()} feature的title不为空 |
_exists() | 存在 | closure | 引用类型 | _filter{it.userStory._exists{it.owner=="Bot"}} feature存在userStory(userStory的onwer等于Bot) |
_notExists() | 不存在 | closure | 引用类型 | _filter{it.userStory._notExists{it.owner=="Bot"}} feature存在userStory(userStory的onwer不等于Bot) |
3.2.2.1
例子1:
要查询 Epic 表中 ID 为 200821 的记录的 featureACL,需要满足以下条件:
feature表的title字段等于 "Dot Walking"。feature表的status字段不为空。userStoryACL字段存在,并且满足:userStory表的title字段以 "DOT" 开头,或者以 "WALKING" 结尾。
_(["pbcToken":"dot-walking","formEntityToken":"epic","id":200821]).featureACL._filter { //data是一个Map类型的对象,包含了pbcToken,formEntityToken,id
it.title == "Dot Walking" //feature表的title字段等于"Dot Walking"
&& it.status._notBlank() //feature表的status字段不为空
&& it.userStoryACL._exists //feature表的userStoryACL字段存在
{
it.title._startsWith("DOT") //userStory表的title字段以"DOT"开头
|| it.title._endsWith("WALKING") //userStory表的title字段以"WALKING"结尾
}
}
3.2.3 _findOne(closure)查找单个 返回值是DWR
这个函数的用法和 _filter 类似,但有几点不同:
- 返回值是 DWR。
- 如果找到多个结果,会报错。
- 如果没有找到结果,返回
null(基本类型)或[](引用类型) - 预期是查询到一个结果。
3.2.4 _resolve() 返回值是DATA
返回调用_resolve()方法属性的formEntityData集合
3.3语法规则
DW 的调用链由属性和函数组成,用 '.' 连接:
_(data)函数后只能调用inputField属性。- 如果属性是基本类型,调用结束,返回 DATA。
- 如果是多选引用类型,可以调用
_filter(closure)、_resolve()、_findOne(closure)等函数:- 调用
_filter(closure)或_resolve()后,调用结束,返回 DATA。 - 调用
_findOne(closure)后,可以继续调用关联数据源的inputField属性,重复第 2 步。
- 调用
- 如果是单选引用类型,可以继续调用关联数据源的
inputField属性或_resolve(),然后重复第 2 步。
3.4 示例
下面例子中的data都为["pbcToken":"dot-walking","formEntityToken":"epic","id":200821]
3.4.1 示例1
从 Epic 记录(id 为 200821)中,获取所有 userStoryMultiACL 字段关联的userStory表的内容
_(data).featureACL.userStoryMultiACL._resolve()
3.4.2 示例2
要查询 Epic 表中 ID 为 200821 的记录中的 featureMultiACL,并过滤 title 为 "Dot Walking" 的记录,然后获取所有的 userStoryMultiACL,步骤如下:
- 从 Epic 记录(ID 为 200821)中找到
featureMultiACL。 - 使用
_findOne函数过滤出title等于 "Dot Walking" 的项。 - 获取该项下所有的
userStoryMultiACL。
与示例1相比,由于 featureMultiACL 是多选的,所以需要先用 _findOne 进行筛选,而 featureACL 是单选的,不需要此步骤。
_(data).featureMultiACL._findOne({it.title=="Dot Walking"}).userStoryMultiACL._resolve()
3.4.2 示例3
要查询 Epic 表中 ID 为 200821 的记录中的 featureACL,并获取所有满足以下条件的 userStoryMultiACL,步骤如下:
- 查找
featureACL中的所有userStoryMultiACL。 - 筛选出
userStory表中title等于 "Dot Walking" 且status等于 "Active" 的记录。 - 确保
taskMultiACL中存在至少一个任务,其task表中的title以 "DOT" 开头或以 "WALKING" 结尾。
这样,你就能找到符合这些条件的所有 userStoryMultiACL。
_(data).featureACL.userStoryMultiACL._filter{it.title=="Dot Walking" && it.status=="Active" && it.taskMultiACL._exists{
it.title._startsWith("DOT") || it.title._endsWith("WALKING")
}}
3.5 在 Form 中使用
在 Form 中,input 为 select/acl 组件支持表达式:
3.5.1 语法
- 在
select/acl的mapping中,除了默认的label,value外,还可以自定义键值对。 - 值的表达式语法不同于 DW 表达式,采用当前关联数据源
formEntity的fieldToken.fieldToken..点点形式,如果遇到fieldToken是基本类型(3.1.2 基本类型)则停止点点,如果是引用类型(3.1.1 引用类型)可以继续点点
示例:
"mapping": {
"value": "id", //默认
"label": "title",//默认
"featureTitle": "title", // Feature 的 title 字段
"featureUserStoryACL": "userStoryACL", // Feature 的 userStoryACL 字段
"featureUserStoryACLTitle": "userStoryACL.title", // Feature 的 userStoryACL 关联的 Story 的 title
"featureUserStoryACLTaskACL": "userStoryACL.taskACL" // Feature 的 userStoryACL 关联的 Story 的 taskACL
}
3.5.2 使用方法
- 可以在 json 模式下,或者在
select/acl组件关联的数据源的文本区域中编写表达式。
