元数据
低代码平台基础字段类型、属性与功能描述。
文本(text):普通的文本框字段。
长文本(textarea):多行文本框字段。
HTML文本(html):富文本框字段,页面内可包含图片、链接等。
选择框(select):下拉选择框字段,提供多个选项供用户选择,支持多选模式。
复选框(boolean):显示为勾选框,打勾选中保存为true,反之保存为false。
开关(toggle):显示为开关按钮,点击即可切换开关状态,开保存为true,反之保存为false。
日期(date):不带小时和分的日期字段,保存为Date类型值。
日期时间(datetime):带小时和分的日期字段,保存为Date类型值。
数值(number):显示为数值输入框,可以指定小数位,默认保留2位小数,不指定小数位数时按整数处理。
金额(currency):显示为数值输入框,可以指定小数位,默认保留2位小数,不指定小数位数时按2位小数处理。
百分比(percent):显示为数值输入框,可以指定小数位,默认保留2位小数,提供百分比的显示方式,保存的是普通的小数数值,比如0.20表示20%。
密码(password):显示为密码输入框,输入框中会显示*号,而不会显示具体密码值。
相关表(lookup):引用其他对象的外键字段,显示为关联表记录选项输入框,支持多选模式。
主表/子表(master_detail):与相关表字段一样,是一种外键字段,在子表对象上设置一个该类型的字段可以与主表对象建立主子表关系,与相关表字段唯一的区别是多了一层主子表从属关系。
自动编号(autonumber):显示为只读字段,管理员通过在该字段中配置编号规则公式来自动使该字段生成和保存为相关编号值,不支持手动编写该字段值。
网址(url):显示为普通文本输入框,只读时,以带有链接的url或二维码的形式呈现。
邮件地址(email):显示为普通文本输入框,只读时显示为链接,点击链接将自动打开邮件客户端,并将字段值带入收件人中。
图片(image):显示为图片上传控件,支持多选模式,只读时显示为图片或图片列表,数据库中该字段值保存为图片 _id
或 _id
数组。
附件(file):显示为附件上传控件,支持多选模式,只读时显示为附件或附件列表,支持附件下载,数据库中该字段值保存为附件 _id
或 _id
数组。。
公式(formula):显示为只读字段,业务人员通过在后台为该字段配置类似Excel公式的脚本,该脚本会在服务端执行并把执行结果保存为该字段值,用于快速实现一些简单的业务逻辑,比如自动根据其他字段值派生新值,或基于多个字段值按业务规则执行某种逻辑计算来派生新值,不支持手动编写该字段值。
累计汇总(summary):显示为只读字段,业务人员通过在后台为该字段配置一种累计汇总计算规则,可以对关联子表进行各种汇总计算,并把计算结果保存到该字段值中,具有求和(SUM)、计数(COUNT)、均值(AVG)、最大值(MAX)和最小值(MIN)五种汇总计算能力,当该字段上配置的汇总计算规则依赖的相关子表记录发生变化时,服务端会自动根据该字段上配置的规则重新执行汇总计算,不支持手动编写该字段值。
以上是低代码平台,各种字段类型的基本功能说明,其详细的元数据属性协议请参阅 对象元数据 - 字段。
以上字段类型中有些功能是部分字段特有的,下面是这些特别的字段类型的具体功能协议。
关于各种不同字段类型下元数据协议请参阅 字段元数据。
以下是该字段类型在 .field.yml
配置文件中才可配置的属性:
长文本字段类型可以在可视化界面额外配置以下属性:
以下是该字段类型在 .field.yml
配置文件中才可配置的属性:
包括数值、金额和百分比三种字段类型,可以在可视化界面额外配置以下属性:
以下是这三种字段类型在 .field.yml
配置文件中才可配置的属性:
其中百分比字段与普通数值在编辑时规则是一样的,只是显示时经过换算后显示成了%后缀格式,比如输入 0.20
会显示为 20%
。
网址字段类型可以在可视化界面额外配置以下属性:
图片和附件字段类型可以在可视化界面额外配置以下属性:
会保存为相关图片或附件的 _id
值数组,最终显示为图片列表或附件列表。
只有使用支持数组类型字段的数据库作为数据源才能开启该功能,比如mongodb数据库。当变更该属性时请注意历史数据,需要手动编辑历史数据或通过执行数据库脚本批量修正历史数据中该字段值。
当需要字段值不能用户随意输入的时候,可以设置一个字段的类型为选择框,设置固定的值供用户选择,支持为每个选项配置显示名、选项值和背景颜色。
在可视化界面可以为该字段类型额外配置以下属性:
只有使用支持数组类型字段的数据库作为数据源才能开启该功能,比如mongodb数据库。当变更该属性时请注意历史数据,需要手动编辑历史数据或通过执行数据库脚本批量修正历史数据中该字段值。
在为选择框类型字段配置选项时,可以为每个选项配置以下属性:
以下是该字段类型在 .field.yml
配置文件中才可配置的属性:
比如以下是名为数据类型的选择框字段配置文件内容,其 optionsFunction
属性描述了不同字段类型下支持的数据类型选项清单。
//date_type.field.yml
type: select
label: Data Type
inlineHelpText: This field must be filled when the field type is 'Formula'
depend_on:
- type
optionsFunction: !<tag:yaml.org,2002:js/function> |-
function (values) {
if(values.type === "select"){
return [
{
"label": "Checkbox",
"value": "boolean"
},
{
"label": "Number",
"value": "number"
},
{
"label": "Text",
"value": "text"
}
];
}
else{
return [
{
"label": "Checkbox",
"value": "boolean"
},
{
"label": "Number",
"value": "number"
},
{
"label": "Currency",
"value": "currency"
},
{
"label": "Percent",
"value": "percent"
},
{
"label": "Text",
"value": "text"
},
{
"label": "Date",
"value": "date"
},
{
"label": "Datetime",
"value": "datetime"
}
];
}
}
optionsFunction
函数重新执行,一般用于实现表单字段级联功能。当我们需要描述两个对象之间的关联关系时,可以在其中一个对象中创建一个“相关表”字段来关联两个对象。
比如每个“报价”记录都应该有对应的“所属客户”与之关联,此时我们可以在“报价”对象上创建一个“报价客户”字段跟“客户”对象关联起来。
在可视化界面可以为该字段类型额外配置以下属性:
只有使用支持数组类型字段的数据库作为数据源才能开启该功能,比如mongodb数据库。当变更该属性时请注意历史数据,需要手动编辑历史数据或通过执行数据库脚本批量修正历史数据中该字段值。
比如输入以下内容作为过滤器函数值可让用户在新建和编辑 “报价” 记录界面上填写“报价客户”字段值时只列出有效客户供选择。
function(filters, values){
return [["state","=","active"]];
}
关于该函数返回值,目前推荐使用数组语法。详情请查看 过滤条件规范。
比如输入以下内容作为选择项函数值可以实现上述过滤器函数中内容同样的效果。
function(values){
var result = [];
var queryFilters = [["state", "=", "active"]];
var steedosFilters = require("@steedos/filters");
var odataFilter = steedosFilters.formatFiltersToODataQuery(queryFilters);
var options = {
$select: 'name'
};
options.$filter = odataFilter;
var accounts = Creator.odata.query('accounts', options, true);
accounts.forEach(function (item) {
result.push({
label: item.name,
value: item._id
});
});
return result;
}
结合上面 filtersFunction
属性的描述,我们可以明显看出同样的需求使用 optionsFunction
来实现代码会多很多,该属性的价值主要体现在可以完全自定义下拉选项,甚至可以从第三方数据源接口中请求数据来列出相关选项。
需要注意的是配置了 optionsFunction
属性的相关表字段,其引用对象上开启 “启用弹出窗口查找模式 enable_enhanced_lookup” 的功能将失效,即始终会显示为下拉选项,而不是以弹出表格形式列出待选项。
以下是该字段类型在 .field.yml
配置文件中才可配置的属性:
optionsFunction
和 filtersFunction
函数重新执行,一般用于实现表单字段级联功能。比如有一个产品对象,我们希望新建产品记录时,用户在选择了产品类别后,可以在选择所属品牌时,只列出之前选好的产品类别下的品牌供用户选择,我们只要按下面的代码来配置产品类别和品牌字段即可:
category:
label: 产品类别
type: lookup
reference_to: categories
brand:
label: 品牌
type: lookup
reference_to: brands
depend_on:
- category
filtersFunction: !<tag:yaml.org,2002:js/function> |-
function (filters, values){
return [["category","=",values.category]]
}
filtersFunction
类似,可以在这里配置可选项范围。该属性需要填写的内容请参阅 过滤条件规范,另外可以把该属性配置为表单公式。
上面 depend_on
属性的示例是通过给字段配置 filtersFunction
属性,增加选项过滤逻辑来实现字段间选项级联效果,我们也可以把字段的 filters
属性配置为表单公式来实现一样的效果:
category:
label: 产品类别
type: lookup
reference_to: categories
brand:
label: 品牌
type: lookup
reference_to: brands
depend_on:
- category
filters: '{{[["category","=",formData.category]]}}'
_id
,表示要把对象上哪个字段值作为相关表的字段值保存到数据库中。比如“项目”对象上有一个名为 code__c
的字段表示项目编号,“项目任务”对象上有一个引用了“项目”对象的相关表字段,以下字段配置文件内容描述了这个字段配置。
//belong_to_project.field.yml
type: lookup
label: 所属项目
reference_to: project__c
//加上这行表示 belong_to_project 这个字段中保存的是关联记录,即所属项目上名为 code__c 的字段值。
reference_to_field: code__c
选项显示数量 reference_limit:当显示为下拉选项时,默认只会列出10个选项供选择,只有该字段的引用对象上没有开启 “启用弹出窗口查找模式 enable_enhanced_lookup”时该属性才生效。
是否显示图标 showIcon:每个对象上都可以配置图标,默认情况下相关表字段会在选项上显示引用对象的图标,配置该属性值为false可以隐藏选项上的图标。
相关表字段展示选择项时有两种模式:一种是 普通下拉选择框模式,另一种是 弹出窗口查找模式,该模式需要在相关表字段的“引用对象”属性关联的对象的设置界面上将“启用弹出窗口查找模式”功能开启,而不是在字段上开启该功能。
在相关表字段的基础上,我们可以通过创建一个“主表/子表”字段来描述两个对象间的主从关系,需要注意的是应该把“主表/子表”字段添加到“子表”对象侧,来表示“子表”对象是通过这个字段来关联其“主表”的。
比如 “报价行条目” 都应该有对应的 “报价” 与之关联,此时我们可以在 ”报价行条目“ 对象上建立一个 “报价名称” 字段,类型为主表/子表跟 “报价” 对象关联起来。
主表/子表字段类型是一种特殊的相关表字段类型,所以这种类型的字段具备相关表类型的字段上的所有属性及功能。
与相关表字段类型相比,在可视化界面可以为该字段类型额外配置以下属性:
“相关表”字段和“主表/子表”字段类型的字段也被称为外键字段,其值保存的是关联对象记录的主键字段值而不是名称字段值,详细请参阅 名称字段 及 主键/外键字段。
除了以上额外配置功能之外,“主表/子表”字段类型还有很多功能规范,详情请参阅 主表/子表字段功能协议。
自动编号,是一种特殊的数据规范,表单或报表中经常需要使用序列号,比如单号、编号等,当需要定义一个规则来自动生成所需的序列号时,我们称之为自动编号。
在可视化界面可以为该字段类型额外配置以下属性:
要实现自动编号需要先确定编号规则,通常来说有两种类型的编号规则,一种是按日期编号,另一种是按序号编号。
Y
表示当年,M
表示当月,D
表示当日,不支持小时、分和秒,用一对大括号包裹它们即可得到某种按日期编号的规则。比如 {YYYY}
表示像 2022
这种当年的四位年编号,{YY}
表示像 22
这种当年的两位年编号, {MM}
和 {DD}
则分别表示像 02
和 18
这种当月和当日的两位月和日编号
0
表示序号占位,用一对大括号包裹它们即可得到某种按序号编号的规则。比如 {0000}
和 {00}
分别表示以4位数和2位数的序号形式编号,每个编号会在前一个编号的基础上递增1,每个编号值前面会补0以填满占位数,默认起始编号为1,编号规则 {0000}
第一个编号为0001,第二个为0002。
当编号值太大造成占位不足时会自动扩充占位数,像上述 {0000}
这种编号规则的第一万个编号值为10000,第十万个编号值为100000。
比如可以新建一个合同编号字段,并在该字段“公式”文本框中输入{YYYY}-{0000}
, 当新建一个合同记录时,会为合同记录自动生成如 2022-0001
这样的编号值。
常用的合同编号规则还有 SN{YYYY}{MM}{DD}{000}
和 采购合同\[{YYYY}\]{000}号
,它们分别会生成像 SN20220408001
和 采购合同[2022]001
这样的编号值。
比如 {YYYY}-{0000}
这种编号规则,编号值会从 2022-0001
、2022-0002
、 … 一直递增其中的序号值。
但是当其中日期编号值变化时会重置序号值并进入新一轮的序号值递增,比如到2023年时,编号值会从 2023-0001
、2023-0002
、 … 重新开始递增。
比如编号规则 {YYYY}-{0000}-{000}
中包含了两组序号规则,它会生成 2022-0001-001
这种编号值,而不可能出现 2022-0001-002
这种各个序号值不相同的情况。
我们在自动编号字段的公式属性中可以直接输入自动编号规则,也可以输入一个返回自动编号规则的公式,这样不但可以实现更复杂的逻辑判断,在不同的情况下使用不同的编号规则,而且可以在编号规则中引用记录中的字段值。
比如以下公式直接返回合同编号规则:
"SN{YYYY}{MM}{DD}{000}"
下面的公式在以上合同编号规则基础上增加了逻辑判断,如果合同金额大于十万则把前缀 SN
换为 IM
以表示重要合同:
IF(amount > 100000, "IM{YYYY}{MM}{DD}{000}", "SN{YYYY}{MM}{DD}{000}")
以上公式优化后内容如下所示:
IF(amount > 100000, "IM", "SN") & "{YYYY}{MM}{DD}{000}"
我们还可以在公式中引用合同记录中的字段值,假设合同中有一个名为合同类型的选择框字段,以下公式进一步把合同类型加入到编号规则中:
IF(amount > 100000, "IM", "SN") & '-' & type & '-' & "{YYYY}{MM}{DD}{000}"
以下是一个类型为付款的重要合同的编号值:
IM-payment-20211208008
需要注意的是,自动编号字段只在记录初始创建的时候计算一次,这意味着其公式属性中如果引用了其他字段值的话,当相关字段值变更后,不会重新更新自动编号值。
关于起始编号
默认起始编号为1,需要变更起始编号时可以修改目标”自动编号“的“当前编号值”内容,设置方法就是下面的“自动编号配置”。
公式生效范围
使用{YYYY}等日期公式时,可以设置其生效范围,当无效时公式返回空字符串,设置方法就是下面的“自动编号配置”。
自动编号配置
需要变更起始编号或设置日期公式生效范围时需要编辑目标”自动编号“来配置相关属性,点开“设置-高级设置-自动编号”。
自动编号记录规则:当您为一个对象创建一个自动编号字段后,如果没有新建该对象记录,自动编号记录中不会生成该对象的自动编号记录。
如果您想变更起始编号,请在自动编号中新建一条记录,“对象名”、“自动编号字段”请输入对应您之前创建的那一个自动编号字段名及其对象名,“当前编号值”请输入起始编号。“日期范围开始日期”和“日期范围截止日期”如果不填就是默认当年的开始时间和结束时间。
如果您想中途变更编号,请在自动编号中筛选对应的记录,修改其“当前编号值”内容。
新建一条记录时,编号从1开始记录。如果输入的是100,表示从101开始记录。而且当前编号值会随着新增记录的增加而改变,比如已经有10条记录了,当前编号值会显示为10。
通常来说自动编号字段值是完全根据配置的编号规则自动计算出来的,也就是说它是不可以被用户在界面上编辑的。
不过实际业务场景中有可能会遇到某些情况下需要允许用户手动输入编号值以满足某些特殊情况下的编号值设定。
默认情况下,自动编号字段在记录创建的时候按编号规则计算出来结果保存其值之后,会始终显示为只读状态,再也不会也不允许用户在界面上修改该字段值。但是管理员可以通过配置 字段权限 来允许特定用户编辑该字段。
当用户在界面上编辑自动编号字段值时,遵循以下规范:
自动编号字段值是根据编号规则自动计算得到的,每次生成新的编号值时都遵循以下规范:
以下步骤描述了一个纯序号类型的编号规则是如何找到前一个编号值的:
对于包含日期和序号的编号规则,因为每一轮日期范围会重置一次序号值,所以它找到前一个编号值的过程与纯序号类型不一样,以下步骤描述了相关过程:
当通过字段权限配置来允许用户在界面上编辑自动编号字段值时,应该遵循以下规范以兼顾自动编号字段值计算规则:
因为自动编号字段值是在服务端自动计算生成的,所以不支持该字段类型的字段的必填属性,以避免新建记录时报错。
当我们因为业务需求变更需要变更编号规则时,就需要修改自动编号公式以制定新的编号规则。
但是如果这么做的话历史数据中已经有的记录中的自动编号字段值是不会重新计算的,所以系统正式上线前应该认真确认编号规则是否能满足业务需求以避免不必要的麻烦。
名称字段的作用是在对象列表中把该字段显示为链接,点击该链接可以跳转到记录详细页面。
名称字段并不是一种字段类型,而是字段上有一个名为 名称字段 is_name
的属性开关,勾选该属性后相关字段就变成名称字段了。
按低代码协议,所有对象上默认以名为 name
的字段作为”名称字段”。可以通过在对象设置界面编辑这个字段以外的其他字段的属性,勾选其“名称字段”属性来把其他字段设置为名称字段。
如果某个对象没有配置名称字段,那么该对象列表界面的列表中第一列,即序号列里面的序号值会显示为链接,点击这个链接一样可以跳转到记录详细页面。
支持配置为”名称字段“的字段类型有:文本、多行文本、自动编号、公式、日期、日期时间,不允许将其他类型的字段配置为名称字段。
与传统项目中表结构类似,低代码平台中每个对象都必须有一个主键字段来唯一标识其每条记录,默认数据源使用MongoDB作为数据库,所有对象的主键字段都是名为 _id
的字段,外部数据源可能使用关系型数据库,所以可以在对象设置中编辑字段属性,勾选其“外部数据源”栏的“主键”勾选框来把该字段设置为主键字段。
按照上面提到的“相关表”和“主表/子表”两种特殊的字段类型协议,通过这两种字段类型的字段可以把两个对象关联起来,所以它们也被称为外键字段,需要注意的是这个外键字段是配置在子表对象一侧的,其字段值保存的是其引用对象的主键字段值。
比如联系人对象上有一个名为“所属客户”(account)的“主表/子表”字段,该字段引用的是一个名为“业务伙伴”(accounts)的对象,假设有一条联系人记录“张三”,其“所属客户”是“中国石油”,那么“张三”这条记录中会在其“所属客户“字段中保存“中国石油”这个“业务伙伴”记录的主键字段值,即_id字段值。