Skip to main content

扩展字段

应用场景

扩展字段可以视为隐藏表单项,即业务中需要用到这个字段,但是这个字段无需在表单详情页中展示。与普通的表单项一样,可以参与公式运算,作为查询条件,用于打印输出(自定义布局打印)。

字段设计

扩展字段配置表单中配置项说明:

属性名称属性说明
字段标题中文标题
字段标识具有唯一性,需要注意不要与其他扩展字段或普通的表单项标识重复
默认值表达式用于生成扩展字段的默认值
值同步实时计算扩展字段的值
备注扩展字段的校验提示信息
数据尺寸扩展字段在数据库中保存的数据长度
查询条件渲染组件扩展字段作为查询条件时,展示的表单项

默认值表达式

扩展字段的默认值表达式与普通的字段中默认值中的插值表达式一样,支持插值表达式公式两种表达方式。

插值表达式

以花括号包裹的默认值表达式我们就会认为是插值表达式。格式{表达式的值}。插值表达式只能是获取单个对象的值。下面章节中会详细介绍插值表达式支持的字段。

公式

非花括号包裹的默认值公式我们都认为是公式表达式,可以使用javaScript的编码方式来编写业务逻辑。比如说扩展字段的默认值格式为:当前登录人的部门名称全路径+登录人姓名,我们可以使用如下的公式来表达:

currentUser.deptInfoName.join('/') + '/' + currentUser.userName;

默认值表达式只在表单新建的时候触发一次,后续表单流转过程中不会再次调用

值同步

值同步允许我们采用公式的方式来根据当前表单的值和用户信息实时生成对应的值。与默认值表达式中的公式使用方法一样。 下面章节中会详细介绍公式中支持的字段和方法。

值同步只要表单值发生变化就会触发解析并生成对应的值

使用方法

插值表达式支持的字段

表达式
拟稿人当前登录人姓名
填报人当前登录人姓名
创建人当前登录人姓名
当前登录人当前登录人姓名
流程发起人当前登录人姓名
办理人当前登录人姓名
发送人当前登录人姓名
拟稿人部门当前登录人的部门名称
填报人部门当前登录人的部门名称
流程发起人部门当前登录人的部门名称
创建部门当前登录人的部门名称
创建人部门当前登录人的部门名称
完整部门当前登录人的完整部门名称全路径
创建人完整部门当前登录人的完整部门名称全路径
创建时间表单的起草时间
拟稿时间表单的起草时间
年份当前时间的年份
季度当前时间的季度
月份当前时间的月份

公式支持的字段

表达式
填报人表单起草人名称
填报人角色表单起草人角色
填报人单位表单起草人的部门信息
填报人单位类型表单起草人的部门类型:总行、分行
填报时间表单起草时间
流程发起人当前登录人的名称
流程发起人单位当前登录人的部门信息
流程发起人单位类型当前登录人的部门类型:总行、分行
流程发送时间当前系统时间
已经途经节点表单流转中途经的节点名称集合
currentUser当前登录人
各个表单项的 fieldName对应的表单项的值

公式支持的方法

字符串操作方法

方法名说明使用示例
trim去除字符串前后空格。参数:要处理的字符串trim(" abc ")
replace替换字符串中的字串。参数:需要处理的字符串;被替换的字串;替换后的内容replace("abc","c","z")
split拆分字符串。参数:需要拆分的字符串;分隔符split("a.b.c",".")
substring字符串截取。参数:需要被截取的字符串;截取开始位置;截取结束位置,不指定则截取到字符串末尾。(注意:截取的字串是不包含结束位置对应的字符的)substring("abc",0,1)
toLower转换成小写的字符串。参数:需要转换的字符串toLower("ABC")
toUpper转换成大写的字符串。参数:需要转换的字符串toUpper("abc")

日期操作方法

方法名说明使用示例
now返回当前时间now()
dateFormat格式化日期,返回日期字符串。参数:要格式化的日期;日期格式dateFormat("2022-05-12","YYYY-MM")
parseDate以指定的日期格式解析日期字符串,返回日期。参数:日期字符串;日期格式parseDate("2022-05-12","YYYY-MM-DD")
dateYear获取年度。参数:日期或日期格式的字符串dateYear('2022-05-12')
dateMonth获取月份。参数:日期或日期格式的字符串dateMonth("2022-05-12")
dateQuarter获取季度dateQuarter("2022-05-12")
dateDiff获取两个日期之间的差异。参数:需要比较的日期;需要比较的日期;差异的单位dateDiff("2022-05-12","2022-06-15","day")

数组操作方法

方法名说明使用示例
every判断数组中的每一条数据是否都满足断言。参数:要遍历的数据;断言方法every([1,2],(item)=> item>1)
filter返回数组中满足断言的所有元素。参数:要遍历的数据;断言方法filter([1,2],(item)=> item > 1)
find遍历数组,返回第一个满足断言的元素。参数:要遍历的数据;断言方法find([1,2],(item)=> item > 1)
join将数组中所有元素使用指定的分隔符拼接成字符串。参数:要拼接的数据;分隔符join([1,2],",")
map根据迭代函数生成新的数组。参数:原始的数组;生成新元素的迭代函数map([1,2],(item)=> item*2)
reduce对数据进行累计运算,得到一个最终值。参数:数组;迭代函数;初始值reduce([1,2],(pre, cur)=>pre + cur, 0)
reverse反转数组或字符串。参数:数组reverse([1,2])
skip跳过数组中的前几个元素,组成新的列表。参数:数组;需要跳过的元素数量skip([1,2],1)
some判断数组中的元素是否有一条数据满足断言。参数:数组;断言方法some([1,2],(item)=> item > 1)
take从数组的起始位置开始提取指定数量的元素生成一个新的数组。参数:数组;要提取的元素个数take([1,2],1)
peek获取指定索引的元素。参数:数组;索引peek([1,2],1)

对象操作方法

方法名说明使用示例
keys获取对象所有的属性名称。参数:对象keys({a:1,b:2})
prop获取对象属性值。参数:对象;属性名或属性名路径prop({a:{b:{c:3}}},"a","b","c")
toPairs获取对象所有的属性名和属性值。参数:对象toPairs({a:1,b:2})
values获取对象所有的值。参数:对象values({a:1,b:2})

逻辑操作方法

方法名说明使用示例
defaultTo如果值为空,则返回默认值。参数:可能为空的值;默认值defaultTo("","xxx")
isNull判断值是否为 null 或 undefined。参数:需要判断的值isNull("xxx")
isEmpty判断值是否为为 null 或者是空数组、空字符串。参数:需要判断的值isEmpty('xxx')
isIn判断数组是否包含指定项。参数:数组;指定项isIn([1,2],2)

管道操作符 |

管道操作符的作用是将上一个表达式的值作为参数交给下一个表达式。对于比较复杂的公式,如果使用普通的编码方式可能会产生很多方法的嵌套,导致可读性比较差,这个时候使用管道操作符改写,可以让代码的可读性大大提升。

下面我们以一个实际的需求来演示一下两种不同的写法。

需求:获取当前用户信息中的二级部门,如果没有的话,就使用用户的当前部门。

传统的编码方式:

peek(reverse(currentUser.deptInfo), 1) || currentUser.deptId;

使用管道符:

currentUser.deptInfo | reverse | peek(1) | defaultTo(currentUser.deptId);

注意事项

公式暂不支持解析单引号