跳到主要内容

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的方式来传递数据 Flow input

1.2 在Groovy脚本中使用

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

1.3 不支持的传参方式

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

2 示例表单,后续举例说明以这4个表单为主

这里有四个表,每个表的字段名和它的 token 相同,只是 token 的首字母是小写的。例如,Epic 表的 Title 字段对应的 token 是 title。 对于字段名中的 ACLSelectEditable,前面的单词表示数据来源,中间的部分表示是否多选,后面的部分表示组件类型。例如:

  • FeatureACL 表示数据来源是 Feature,单选,组件类型是 ACL。
  • FeatureMultiACL 表示数据来源是 Feature,多选,组件类型是 ACL。
  • FeatureEditable 表示数据来源是 Feature,组件类型是 Editable。

2.1 Epic

pbcToken:dot-walking formEntityToken:epic Epic

2.2 Feature

pbcToken:dot-walking formEntityToken:feature Feature

2.3 User Story

pbcToken:dot-walking formEntityToken:userStory User Story

2.4 Task

pbcToken:dot-walking formEntityToken:task Task

3 语法

DW 是由属性(在 formEntity 中的字段 token)和函数(如 _filter_findOne_resolve)组成的调用链。所有的属性和方法返回两种类型的值:

  1. DATA:与 formEntityData 相关的值。
  2. 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,需要满足以下条件:

  1. feature 表的 title 字段等于 "Dot Walking"。
  2. feature 表的 status 字段不为空。
  3. 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 的调用链由属性和函数组成,用 '.' 连接:

  1. _(data) 函数后只能调用 inputField 属性。
  2. 如果属性是基本类型,调用结束,返回 DATA。
  3. 如果是多选引用类型,可以调用 _filter(closure)_resolve()_findOne(closure) 等函数:
    • 调用 _filter(closure)_resolve() 后,调用结束,返回 DATA。
    • 调用 _findOne(closure) 后,可以继续调用关联数据源的 inputField 属性,重复第 2 步。
  4. 如果是单选引用类型,可以继续调用关联数据源的 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,步骤如下:

  1. 从 Epic 记录(ID 为 200821)中找到 featureMultiACL
  2. 使用 _findOne 函数过滤出 title 等于 "Dot Walking" 的项。
  3. 获取该项下所有的 userStoryMultiACL

与示例1相比,由于 featureMultiACL 是多选的,所以需要先用 _findOne 进行筛选,而 featureACL 是单选的,不需要此步骤。

_(data).featureMultiACL._findOne({it.title=="Dot Walking"}).userStoryMultiACL._resolve()

3.4.2 示例3

要查询 Epic 表中 ID 为 200821 的记录中的 featureACL,并获取所有满足以下条件的 userStoryMultiACL,步骤如下:

  1. 查找 featureACL 中的所有 userStoryMultiACL
  2. 筛选出 userStory 表中 title 等于 "Dot Walking" 且 status 等于 "Active" 的记录。
  3. 确保 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 表达式,采用当前关联数据源 formEntityfieldToken.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 组件关联的数据源的文本区域中编写表达式。

Select or acl expression