# 引用值

在动态中可以用$字段名表示其值,根据字段的数据类型不同,在动态中的引用值具有不同的javascript类型;在动态的赋值,逻辑判断等方面都需要考虑值的类型来决定动态的书写。例如,开发者不能将一个string类型的值赋值给一个Code类型的字段,也不能将File类型的值赋值给一个数值类型的字段。

# 值的类型

字段值的类型可以分为简单类型和对象类型两种,前者包括number,string,boolean等,后者根据不同的数据类型有不同的对象结构。

# 简单类型

字段类型 值类型 备注 相关内置函数
string string 字符串 concat reduce length startWith endWith left right
XHTML string 富文本 同上
integer number 整数 isNaN parseInt abs等数学函数 sum avg等统计函数
double number 浮点数 isNaN parseFloat toFixed abs等数学函数 sum avg等统计函数
date number unix时间戳,1970年1月1日以来的秒数 formatDate dateSpan
datetime number unix时间戳,1970年1月1日以来的秒数 formatDate
time number 00:00:00以来的秒数 formatTime
boolean boolean 布尔 iif

# 对象类型

当字段的数据类型为CodeUserOrganizeFileThinganyURILocation时,动态中的引用值会具有对象类型,对象类型分以下几种:

# ValuePair

键值对类型,这个对象上包含value,displayValue属性,表示值和显示值。Code、User、Organize、Thing、Location都兼容ValuePair类型,即这些对象上都有value和displayValue属性

属性 描述
value
displayValue 显示值

# Code

Code(代码)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有code和name属性

属性 描述
value 代码值
code 代码值,与value等价
displayValue 代码名称,也即显示值
name 代码名称,与displayValue等价

相关内置函数:code

# User

User(用户)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有account和name属性,在动态中使用时推荐使用语义化更强的account和name属性

属性 描述
value 用户账号
account 用户账号,与value等价
displayValue 用户名称
name 用户名称,与displayValue等价

相关内置函数:user

# Organize

Organize(部门)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有code和name属性,在动态中使用时推荐使用语义化更强的code和name属性

属性 描述
value 部门编号
code 部门编号,与value等价
displayValue 部门名称
name 部门名称,与displayValue等价

相关内置函数:org

# Thing

Thing(物品)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有code和name属性,在动态中使用时推荐使用语义化更强的code和name属性

属性 描述
value 物品条形码(EAN-13)
code 物品条形码(EAN-13),与value等价
displayValue 物品名称
name 物品名称,与displayValue等价

# Location

Location(位置)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有name属性

属性 描述
value 定位点的值,格式是经度,维度,缩放系数
displayValue 定位点名称
name 定位点名称,与displayValue等价

# File

File(文件)类型对象结构如下表

属性 描述
id id
name 文件名
size 文件大小
uri 文件访问地址
mime 文件类型
createTime 文件创建时间,unix时间戳

# anyURI

anyURI对象上包含value和uri属性,它们是等价的

属性 描述
value URI地址
uri URI地址

# 值的属性

UserOrganizeCodeanyURI类型上都可以带有属性,其中User、Organize类型值上的属性值是固有的,Code类型值上的属性由代码表维护,anyURI的属性是由URI路径中的参数组装的。

# 属性对象

# expando

User、Organize、Code类型的所有属性都在值对象上的expando属性里,例如有一个Code类型的值,代码值是A,显示值是选项A,这个值里有2个属性count、amount,内容分别是100、200,那么该值的内容如下

{
    "value":"A",
    "code":"A",
    "displayValue" :"选项A",
    "name":"选项A",
    "expando": {
        "count":"100",
        "amount":"200"
    }
}
1
2
3
4
5
6
7
8
9
10

# 引用属性

如果用户想要在动态中引用这个字段(比如fieldA)值上的属性count,那么需要使用$fieldA.expando.count,为了方便开发者,我们组装动态上下文时将expando里的属性直接搬到了值上面,那么用户就可以用$fieldA.count来引用这个属性了,实际上用户使用的这个值的内容如下

{
    "value":"A",
    "code":"A",
    "displayValue":"选项A",
    "name":"选项A",
    "count":"100",
    "amount":"200",
    "expando": {
        "count":"100",
        "amount":"200"
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 属性冲突

当expando里的属性名称和值里的直接属性冲突时(例如,expando里也有一个叫做value的属性,值是300),此时value属性值会是原value属性值,而不会被expando里的value覆盖,此时该值的内容如下

{
    "value":"A",
    "code":"A",
    "displayValue":"选项A",
    "name":"选项A",
    "count":"100",
    "amount":"200",
    "expando": {
        "count":"100",
        "amount":"200",
        "value":"300"
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

但是以上冲突处理规则并不适用于anyURI类型的属性,也就是当uri路径中有一个value参数或者uri参数时,也会将其值搬到URI对象属性value或者uri上,这么做的原因是路径上的参数往往是动态关心的内容,而uri本身并不是非常重要。

# User

User类型的值对象上有着丰富的属性供表单动态使用,下表中类型带有(⤶)的说明多个值之间用\n(回车)分隔,类型带有[]的说明多个值以数组形式存放,注意下表中的Organize类型对象都是通过expando里相关属性直接组装到User上的,expando里是找不到这些Organize类型数据的,expando里都是string类型的原始数据。

属性名称 类型 描述
userCode string 学工号(所有三元组中索引最高的)
userCodes string(⤶) 学工号列表(所有三元组)
userCodesFiltered string(⤶) 学工号列表(UserFilters过滤后的三元组)
organizeCode string 所在部门代码(所有三元组中索引最高的)
organizeName string 所在部门名称(与organizeCode对应)
organize Organize[] 所在部门列表(所有三元组)
organizeFiltered Organize[] 所在部门列表(UserFilters过滤后的三元组)
indepOrganize Organize[] 所在独立部门/列表(所有三元组中索引最高的)
indepOrganizeFiltered Organize[] 所在独立部门/列表(UserFilter过滤后的三元组)
positions string(⤶) 用户完整三元组,UserFilters格式
formalPositions string(⤶) 用户身份三元组,UserFilters格式
title string 称谓,由用户的身份以及职务决定

# Organize

Organize类型的值上只有独立部门代码和独立部门名称两个属性。

属性名称 类型 描述
indepOrganize_Code string 独立部门代码
indepOrganize_Name string 独立部门名称

# Code

Code类型值的属性,如果是内部代码表由代码表维护,请参见此处;如果是外部代码表请在Messenger里组装代码表时自行组装属性。

# anyURI

anyURI类型值的属性是由URI路径中的参数以及hash#值组装的,如果路径参数和hash冲突,采用hash中的内容。例如路径为https://www.sjtu.edu.cn/query?param1=a&param2=b#param2=2&param3=3的值属性如下:

{
    "value":"https://www.sjtu.edu.cn/query?param1=a&param2=b",
    "uri":"https://www.sjtu.edu.cn/query?param1=a&param2=b",
    "param1":"a",
    "param2":"2",
    "param3":"3",
    "expando":{
        "param1":"a",
        "param2":"2",
        "param3":"3"
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13