# 开发速查手册
以下是系统开发中常用接口及数据格式说明
# 目标读者
本文档的目标读者为:本系统的开发和实施人员
# 字段级联
详细信息请参考 客制化字段联动
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
domainName | java.lang.String | 不包含package 部分的,当前操作的对象类型 |
sourceColumn | java.lang.String | 驱动列,该字段的变化触发了该客制化 |
destColumn | java.lang.String | 目标列,客制化的返回结果会作用于该列 |
sourceColumnValue | java.lang.String | 驱动列的值 |
object | org.grails.web.json.JSONObject | 用户正在编辑的对象当前界面上各个字段的值 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
return [
//指定该字段的显示状态:hide 为隐藏、show 为显示且可编辑、readonly 为只读
display: hide | show | readonly
// 指定该字段是否必填, true 表示必填,false 表示非必填
required: true | false
// 指定该字段的值,如果是个多选字段,可以使用 [] 的形式来指定多个值
value: [] 或者 xxx,
// 如果该字段是个选择类型的字段,如下的返回值指定其备选项,
// 每个备选项均包括显示给用户看的 Label 属性和实际保存的 value 属性
options: [
{
"value": "ABSTRACT_DATE",
"label": "Abstract date"
},
{
"value": "ABSTRACT_DATE_TIME",
"label": "Abstract date with time"
}
]
]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 字段搜索
详细信息请参考 字段快捷搜索逻辑
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
ownerClass | java.lang.Class<?> | 该字段所属的对象类型 |
fieldName | java.lang.String | 在对象中,待搜索字段的字段名称 |
fieldClass | java.lang.Class<?> | 待搜索字段的字段类型 |
keyword | java.lang.String | 搜索关键字 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
return [
// 包含且仅包含一个 key 为 result 的数组
'result': [// result 中是一个数组
// 数组中每个元素都是一个 domain 对象
]
]
2
3
4
5
# 字段校验
详细信息请参考 客制化字段校验
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
domainName | java.lang.String | 当前操作的对象类型名称 |
destColumn | java.lang.String | 校验的目标列名称 |
destColumnValue | java.lang.Object | 目标列的值 |
create | boolean | 是否是创建操作,如为 false 表示更新操作 |
requestData | java.lang.Object | 前台表单所有字段值的 JSON 序列化 |
objectId | java.lang.Long | 校验的对象 id, 对于创建操作,值为 -1 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
// result key 对应的 value 即为系统会传递到前台的默认值
return [
valid: true | false,
message: "校验失败的界面提示信息"
]
2
3
4
# 字段默认值
详细信息请参考 客制化字段默认值
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
objectType | tech.muyan.DomainClass | 当前操作的对象类型 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
destColumn | java.lang.String | 设定默认值的目标列 |
destColumnType | java.lang.String | 目标列的完整类型名称 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
// result key 对应的 value 即为系统会传递到前台的默认值
return [result: xxx]
# 对象创建 Hook
详细信息请参考 对象生命周期客制化
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
object | <? extends GormEntity> | 对象实例 |
dynamicFieldValues | List<tech.muyan.dynamic.field.DynamicFieldValue> | 所有动态字段的值 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
hookType | tech.muyan.enums.ObjectHookType | 当前执行的 object hook 的类型 |
# 异常处理
在操作前的客制化逻辑中,可以直接修改操作的对象实例参数实现客制化,对对象实例的修 改会被保存到数据库中。
在操作前和操作后的客制化代码的逻辑执行中,均可使用抛出异常的方式中断系统对该对象 的操作过程,详述如下:
若
tech.muyan.exception.CustomLogicInterruptException
或其子类型的异常被捕获 到,则该对象的操作过程会被中断,该操作不会被保存到数据库中,且该异常的 Message 会 被在前台作为错误显示给用户。若
tech.muyan.exception.CustomLogicWarningException
或其子类型的异常被捕获到, 则该对象的操作过程不会被中断,但该异常的 Message 会被在前台作为警告显示给用户。
# 对象更新 Hook
详细信息请参考 对象生命周期客制化
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
oldObject | <? extends GormEntity> | 更新前的对象实例的拷贝 |
newObject | <? extends GormEntity> | 包括动态字段的,更新后的对象实例 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
hookType | tech.muyan.enums.ObjectHookType | 当前执行的 object hook 的类型 |
# 异常处理
在操作前的客制化逻辑中,可以直接修改操作的对象实例参数实现客制化,对对象实例的修 改会被保存到数据库中。
在操作前和操作后的客制化代码的逻辑执行中,均可使用抛出异常的方式中断系统对该对象 的操作过程,详述如下:
若
tech.muyan.exception.CustomLogicInterruptException
或其子类型的异常被捕获 到,则该对象的操作过程会被中断,该操作不会被保存到数据库中,且该异常的 Message 会 被在前台作为错误显示给用户。若
tech.muyan.exception.CustomLogicWarningException
或其子类型的异常被捕获到, 则该对象的操作过程不会被中断,但该异常的 Message 会被在前台作为警告显示给用户。
# 对象删除 Hook
详细信息请参考 对象生命周期客制化
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
object | <? extends GormEntity> | 待删除的对象 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
hookType | tech.muyan.enums.ObjectHookType | 当前执行的 object hook 的类型 |
# 异常处理
在操作前的客制化逻辑中,可以直接修改操作的对象实例参数实现客制化,对对象实例的修 改会被保存到数据库中。
在操作前和操作后的客制化代码的逻辑执行中,均可使用抛出异常的方式中断系统对该对象 的操作过程,详述如下:
若
tech.muyan.exception.CustomLogicInterruptException
或其子类型的异常被捕获 到,则该对象的操作过程会被中断,该操作不会被保存到数据库中,且该异常的 Message 会 被在前台作为错误显示给用户。若
tech.muyan.exception.CustomLogicWarningException
或其子类型的异常被捕获到, 则该对象的操作过程不会被中断,但该异常的 Message 会被在前台作为警告显示给用户。
# 对象接口返回数据
更多信息请参考 对象接口返回数据客制化
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
object | <? extends GormEntity> | 接口待返回的对象实例 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
page | tech.muyan.enums.CustomRenderPageType | 调用该 render 方法的页面 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
ownerClass | java.lang.Class<? extends GormEntity> | 对于搜索页面, 搜索字段所属对象 |
fieldName | java.lang.String | 对于搜索页面, 搜索字段的字段名 |
fetchType | tech.muyan.enums.FetchType | 获取数据的类型 |
fetchType
参数是根据界面的不同业务场景,选择返回的数据的范围,当前可选值说明如下:
值 | 说明 |
---|---|
ONLY_LABEL_FIELD | 只获取 Label 字段和 id |
EXCLUDE_ARRAY_COLUMNS | 返回除了一对多和多对多的关联对象外的其他字段值 |
ALL_COLUMNS | 返回所有字段值 |
page 参数的可选值如下:
值 | 说明 |
---|---|
RELATED_SEARCH | 关联对象列表页面带搜索条件 |
RELATED | 关联对象列表页面带 |
LIST_SEARCH | 主列表页面带搜索条件 |
LIST | 主列表页面 |
FINDER | 搜索页面 |
FINDER_SEARCH | 搜索页面带搜索条件 |
DETAIL | 详情或者编辑页面 |
SHOW_MULTIPLE | Show multiple API 的返回值 |
# 返回结果
// 该客制化代码需要返回的结果为一个 Map, key 为 result, value 中为 [返回字段名: 字段值] 的 Map 的格式返回结果
[
result: [
columnName: columnValue,
// 对象类型的子字段返回一个只包含 id 的子 map
objectField: [
id: objectId
],
// 用于 card list view 进行 HTML 渲染的属性
"@HTML_CONTENT@": ""
]
]
// 或者直接为一个 org.grails.datastore.gorm.GormEntity 对象的实例
return object
2
3
4
5
6
7
8
9
10
11
12
13
# 对象详情访问 Hook
更多信息请参考 对象详情访问
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
object | <? extends GormEntity> | 对象实例 |
renderedObject | <? extends GormEntity> 或 Map<String, Object> | Render API 返回的对象实例或包含对象数据的 Map 对象 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
fetchType | tech.muyan.enums.FetchType | 获取数据的类型 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
hookType | tech.muyan.enums.ObjectHookType.ACCESS | 当前执行的 object hook 的类型 |
# 动态创建权限
详细信息请参考 动态创建权限
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
objectType | Class<?> | 当前操作的对象类型 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
return ['create': true] //本行代码返回允许用户创建该对象
# 动态修改和删除权限
详细信息请参考 动态修改和删除权限
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
objectType | Class<?> | 当前操作的对象类型 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
objectValue | grails.core.GrailsDomainClass | 请使用 object 参数 已弃用 |
object | grails.core.GrailsDomainClass | 当前操作的对象,类型为当前操作对象的类型 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
return [
result: [
'update': true,
'delete': false
]
] //本行代码返回允许用户更新该对象,但不允许用户删除该对象
2
3
4
5
# 定时任务启用逻辑
更多信息请参考 定时任务启用逻辑
# 注入变量
# 返回结果
// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
# 定时任务核心逻辑
更多信息请参考 定时任务核心逻辑
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
triggerDatetime | java.time.LocalDateTime | 定时任务的触发时间 |
task | tech.muyan.dynamic.task.DynamicTask | 触发定时任务实例 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
return [
execResult: 'OK, Result' //执行结果,类型为文本
]
2
# 表单字段组显示逻辑
更多信息请参考 字段组显示逻辑客制化
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
application | grails.core.GrailsApplication | grails 应用上下文 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
objectType | tech.muyan.DomainClass | 表单关联的 Domain 对象信息 |
formType | tech.muyan.enums.FormType | 表单类型,CREATE 或 UPDATE |
objectId | java.lang.Long | 运行的目标 domain 对象 id |
object | <? extends DefaultGrailsDomainClass> | 运行的目标 domain 对象 |
group | tech.muyan.dynamic.form.DynamicFormGroup | 当前待判断的字段组对象 |
# 返回结果
// 表示该字段组在界面上的显示模式,可编辑, 隐藏或者只读
// Represents the display mode of the field group on the interface, editable, hidden, or read-only
return [result: editable | readonly | hide]
2
# Dynamic Action 显示逻辑
更多信息请参考 Dynamic Action
# 注入变量
enable Logic 和 core Logic 的注入变量差别是, coreLogic 注入了 parameters 参数, 而 enableLogic 不会注入该变量
变量名称 | 变量类型 | 描述 |
---|---|---|
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
action | tech.muyan.dynamic.action.DynamicAction | 运行的 action 定义 |
objectIds | List<java.lang.Long> | 目标 domain 对象 id 列表 |
objects | List<? extends GormEntity> | 目标 domain 对象列表 |
objectType | tech.muyan.DomainClass | 目标 domain 对象的类型信息 |
parameters | Map<String, Object> | 用户前台输入的 action 运行参数(仅 core Logic 可用) |
ownerInfo | tech.muyan.importexport.OwnerInfo | 当前显示列表的关联主对象 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
# Dynamic Action 核心逻辑
# 注入变量
enable Logic 和 core Logic 的注入变量差别是, enableLogic 注入了 objectId, 而 coreLogic 不会注入该变量
变量名称 | 变量类型 | 描述 |
---|---|---|
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
action | tech.muyan.dynamic.action.DynamicAction | 运行的 action 定义 |
objectIds | List<java.lang.Long> | 目标 domain 对象 id 列表 |
objects | List<? extends GormEntity> | 目标 domain 对象列表 |
objectType | tech.muyan.DomainClass | 目标 domain 对象的类型信息 |
parameters | Map<String, Object> | 用户前台输入的 action 运行参数(仅 core Logic 可用) |
ownerInfo | tech.muyan.importexport.OwnerInfo | 当前显示列表的关联主对象 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# 返回结果
// execResult 为字符类型
// redirect 为字符类型
[
execResult: "执行的结果"
redirect: "执行后的跳转页面",
download: "执行后返回前端的文件" //类型为tech.muyan.storage.StorageFieldValue
]
2
3
4
5
6
# Dynamic Action 外部命令替换
# 替换变量
占位符 | 替换目标 |
---|---|
${username} | 用户的用户名 |
${roles} | 用户的角色列表,逗号分隔 |
${object} | Domain Object 的 JSON 序列化字符串 |
${parameterName} | 前台传入的用户输入参数 |
# Dynamic Action 返回结果
// execResult 为字符类型
// redirect 为字符类型
[
execResult: "执行的结果"
redirect: "执行后的跳转页面",
download: "执行后返回前端的文件" //类型为tech.muyan.storage.StorageFieldValue
]
2
3
4
5
6
# Wizard 处理逻辑
关于向导处理逻辑的更多信息请参考 向导定义
# 注入变量
# 返回结果
return [
message: "string", // 状态为 warning 或者 error 时,前台显示的警告或者错误信息
formValues: [ //经过逻辑处理之后的表单数据,可以修改之前所有步骤收集的字段值
//如果设置了某个在下一步骤会显示的字段的值,则该值会作为下一步骤表单显示的默认值
df_<dynamicFieldDefinition1Name>: "xx",
df_<dynamicFieldDefinition2Name>: 123
],
// 如果需要在下一步骤显示某个字段的下拉选项,可以在此返回,格式如下
options: [
{
fieldName: "xxx",
options: [
{
label: "xxx1",
value: "xxx1"
},
{
label: "xxx2",
value: "xxx2"
},
]
}
],
// 如果需要在下一步骤中渲染某个瞬态字段,可以在此返回,格式如下
// 生成 meta 可以调用 DomainMetaService.buildFieldMeta 方法
metas: [
{
title: "yyy",
dataIndex: "yyy",
key: "yyy",
editable: true,
display: true,
updatable: true,
}
]
nextStepName: 'Step 2' //下一步骤的 step 名称,
//前台会根据此返回值,调整步骤之间的跳转逻辑,可返回此参数用来实现决策树
]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Widget 是否显示逻辑
# 注入变量
# 返回结果
// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
# Widget 核心逻辑
# 注入变量
# 返回结果
Widget 的核心逻辑返回结果的结构根据每种 widget 类型不同而不同,
- 非图表类可参考 非图表类 widget 属性结构
- 图表类可参考 图表类 widget 属性结构
# 传入系统集成
更多信息请参考 传入系统集成
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
integration | tech.muyan.dynamic.integration.DynamicIntegration | 当前执行的集成对象定义 |
headers | Map<String, String> | 请求头 |
parameters | java.lang.Object | 请求体或请求参数 |
requestTime | java.time.LocalDateTime | 请求的时间 |
requestUrl | java.lang.String | 不包含 queryString 的请求 URL |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
organization | tech.muyan.Organization | 执行集成对象的所属组织 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# Enable Logic 返回结果
// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
# Core Logic 返回结果
集成定义的 core logic 运行后,应返回 Map<String, Object>
类型的结果给系统,系
统会直接将该结果进行 JSON 化,并返回给调用方。
# 传出系统集成
更多信息请参考 传出系统集成
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
integration | tech.muyan.dynamic.integration.DynamicIntegration | 当前执行的集成对象定义 |
object | <? extends GormEntity> | 触发集成的对象实例 |
oldObject | <? extends GormEntity> | 修改前的对象(只包含被修改的属性) |
newObject | <? extends GormEntity> | 修改后的对象 |
objectType | tech.muyan.DomainClass | 当前操作的对象类型 |
eventType | tech.muyan.enums.OutgoingIntegrationListenEvent | 触发集成的 Domain CUD 事件 |
userContext | grails.plugin.springsecurity.userdetails.GrailsUser | 当前操作的用户信息 |
organization | tech.muyan.Organization | 执行集成对象的所属组织 |
application | grails.core.GrailsApplication | 当前的 grails 应用上下文 |
log | Closure<?> | 用于打印执行日志的 log 闭包 |
# Enable Logic 返回结果
// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
# Core Logic 返回结果
[
requestNeeded? : true | false //是否需要平台调用集成的目标 Http 接口
headers? : Map<String, String> //如需平台调用集成的目标 Http 接口,使用的请求头列表
body? : Map<String, Object> //如需平台调用集成的目标 Http 接口,使用的请求体或请求参数及值列表
]
2
3
4
# 动态服务
更多信息请参考 动态服务定制
# 注入变量
变量名称 | 变量类型 | 描述 |
---|---|---|
name | String | 服务唯一名称 |
logic | tech.muyan.dynamic.DynamicLogic | 服务的执行逻辑 |
active | Boolean | 是否激活 |
# 动态过滤条件定义
动态过滤的条件定义格式如下所示, 更多信息请参考 动态过滤定义
// 下面的动态过滤条件的说明:
// 1. 状态字段等于 SUCCESS
// 2. type 是 FINDER, UPDATE 中的一个
{
"status": { // key 是列名称: status
"columnKey": "status", // 过滤的目标列
"matchMode": "=", // 匹配规则:等于
"value": "SUCCESS", // 匹配的目标值: SUCCESS
},
"type": { // key 是列名称: type
"columnKey": "type", // 过滤的目标列, 与上一行的 key 相同
"matchMode": "isOneOf", // 过滤的匹配规则:isOneOf (是其中某一个)
"value": ["FINDER", "UPDATE"] // 过滤的目标值: [FINDER, UPDATE]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 动态匹配条件列表
如下列出了可在动态过滤中使用的,运行时动态渲染的匹配条件列表, 更多信息请参考 动态匹配条件
# 获取动态配置
更多详细信息请参考 获取动态配置
# 前端获取配置
更多信息请参考 前台获取配置 Api
import { useConfig } from "@utils/hooks";
// 举例如下: 获取系统配置中,key 为 register.self_register 的配置值
// 备注: 对于系统内置配置,前台会自动转换配置值的类型,如上述代码调用
// `useConfig` 返回的 `registerEnable` 变量,其类型为 `boolean`。
const { value: registerEnable } = useConfig('register.self_register');
2
3
4
# 后台获取配置
更多信息请参考 后台获取配置 Api
在后台 Service 或 Controller 中,可直接注入 Bean
DynamicConfigService
, 或者调用ConfigHelper.getDynamicConfigService(grailsApplication)
获取该 Bean。在客制化代码中,可以通过如下方式获取系统配置中的值
import tech.muyan.ConfigHelper
String frontendUrl = ConfigHelper.getDynamicConfigService(grailsApplication)
.getConfig("mail.frontend_url", String.class, "https://muyan.muyan.cloud")
2
3
# 全局配置或数据共享
详细信息请参考 在 Dynamic Logic 执行间共享全局配置、连接、或进行数据缓存
当前系统提供了 tech.muyan.helper.RegistryHelper
类来进行全局共享数据的管理,可以通过
RegistryHelper.memoryGet(key)
来获取缓存数据,RegistryHelper.memoryPut(key, value)
来设置缓存数据,并返回当前已经保存的数据,RegistryHelper.memoryRemove(key)
来移除缓存数据。
# 可用 extInfo 列表
提示
详述配置中的 xxx?:
中的 ?
表示该配置是可选的,如果不配置则使用默认值,在 extInfo
字段的内容中,不应包含 ?
字符
# DomainClass 定义中
{
// 用户快捷搜索时,使用 name 和 label 两个字段进行搜索匹配
"inlineSearchColumns": ['name', 'label'],
// 界面上显示 Object 控件时,显示其 label 字段的值作为标识
"labelField": 'label',
// 导入 CSV 数据时,当前 Domain 会在 DynamicLogic 和 DynamicFieldDefinition 之后加载
"loadAfter": ['DynamicLogic', 'DynamicFieldDefinition']
}
2
3
4
5
6
7
更多信息请参考 DomainClass 可用的 extInfo 列表
# DomainClass 字段属性定义中
{
// 适用于 Decimal 类型的字段,设置小数位数为 2
"scale": 2,
// 适用于 Decimal 类型的字段,设置精度为 10
"precision": 10
}
2
3
4
5
更多信息请参考 领域模型字段属性定义中的 extInfo
# Dynamic Action 定义中
更多信息请参考 DynamicAction 可用的 extInfo 列表
{
/** 前台是否显示该 Action 的 label, 默认为 true, 如果只希望显示 Action 图标,可设置 displayLabel 为 false */
"displayLabel"?: true | false,
/** 是否在执行该 Action 后,刷新当前页面, 默认为 true, 如果 action 执行不更新显示数据,可以无需刷新页面 */
"refreshPage"?: true | false
}
2
3
4
5
# Dynamic Form 定义中
# 通用属性
更多详细信息请参考 表单的 extInfo 支持
{
/** form 默认的隐含过滤条件, 该过滤条件不会在界面上显示, 用户不可见 */
"conditions": {
"fieldName": {
/** 匹配的值 */
"value": xxxx,
/** 匹配的字段名称, 支持 dot(.) 方式引用关联字段的某字段 */
/** 如 organization.name 引用 organization 字段的 name */
"columnKey": "xxx",
/** 匹配规则 */
"matchMode": matchMode
}
},
/** 列表类型表单的表头中显示的 domain 标题,如果不想显示 domainTitle, 将其设置为空字符串即可 */
"domainTitle"?: string;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# List form 属性
{
/** 是否支持 realtime 实时刷新数据模式,当前为 beta 功能,只支持在列表页面启用 */
/** 默认的显示模式,realtime: 默认实时模式,manual: 手动刷新模式,不支持实时模式(默认模式) */
/** auto 默认手动刷新模式,可切换为实时模式,disable: 禁用,等同不设置 */
"dataRefreshMode"?: "auto" | "realtime" | "manual" | "disable";
/** 默认显示模式 */
"defaultTableMode"?: "table-list" | "card-list";
/** card Form 每行的显示条数 */
"defaultRecordsPerRow"?: number;
/** 指定在该表单显示页面上方点击创建按钮使用的创建表单名称 */
"createFormName"?: string;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# MasterDetail From 属性
{
/** 对于 master detail 类型的 form, 其detail 部分的组件 form 类型 */
/** 当前经测试可正常工作的可选值为 INLINE_DISPLAY | FULL_TEXT_SEARCH_LIST | Update */
"detailFormType": formType;
/** 对于 master detail 类型的 form, 其 detail 部分的组件对应的字段的名称*/
"detailField"?: string;
/** 对于 master detail 类型的 form, 其 detail 部分的组件是否显示为可编辑组件 */
"detailUpdatable"?: boolean;
}
2
3
4
5
6
7
8
# Dashboard From 属性
{
/** dashboard的自动刷新间隔 */
"refreshInterval"?: number;
}
2
3
# Gantt From 属性
{
/** 甘特图相关配置 */
"gantt"?: {
/** 默认显示的甘特图中的开始时间, ISO8601 和 GB/T 7408-2005格式,例如 2023-05-22T00:00:00+08:00 */
"viewDateStart"?: string;
/** 默认显示的甘特图的时间长度, ISO8601 和 GB/T 7408-2005 格式,例如 P5D */
"viewDuration"?: string;
/** 左侧行列表展示字段,默认显示 gantt 表单关联领域模型的所有字段 */
"rowListDisplayColumns"?: [{
// 字段名
"key": string,
// 显示名
"title": string,
}];
/** 任务展示字段,默认显示被 hover 的 task 领域模型的所有字段 */
"tooltipDisplayColumns"?: [{
// 字段名
"key": string,
// 显示名
"title": string,
}];
/** 任务组字段 */
"taskGroupColumnKey"?: string;
/** 任务是否可以更新, Since version 0.29 */
"taskUpdatable"?: boolean;
};
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Dynamic Form Field 定义中
Dynamic Form Field 可用的 extInfo 与字段的类型关联, 分类型详述如下:
更新详细信息请参考 表单字段的 extInfo 支持
# 通用属性
所有类型的字段,其 extInfo 中均可使用的扩展属性如下
{
// 设定本字段是否显示右边的 detailPanel,
// 无该属性时,值为 false, 本属性为 true 时,
// 需要对应字段控件实现了右边详情面板的显示控件
"hasDetailPanel"?: true | false;
// 设置某字段支持按需显示,此处的设置值是支持按需显示的字段在全部内容未显示前,显示的概要信息
// 对于设置了该属性的表单字段,如果从后端返回的数据中,此处所设置的字段的值为 null, 则在前端针对该对象,不启用按需显示
// 举例如下:
// 如对于文章对象,其内容 (content) 字段可能非常长,为了前端的用户体验考虑,考虑针对该字段启用按需显示,
// 此时可以在 content 表单字段的 extInfo 中设置如下:
// "summayField": "summaryContent"
// 表示使用名为 summaryContent 的字段作为 content 字段显示全部内容前的摘要字段,此时:
// 1. 如果后端返回的数据中,summaryContent 字段的值不为 null, 则在前端默认不显示全部 content 字段的内容,
只显示 summaryContent 字段,用户可点击界面控件,以查看 content 字段的内容
// 2. 如果后端返回的数据中,summaryContent 字段的值为 null, 则在前端不启用按需显示,
直接显示 content 字段的内容
"summayField"?: string;
// meta 用于覆盖系统自动生成的表单字段的元数据,或者补充某一些属性,如 title, dataIndex, editable, updatable, elementType 等
// 在运行时,系统会将 meta 中的属性覆盖或者补充到系统自动生成的表单字段的元数据中
"meta"?: {
// 字段名
"key": string;
// 字段显示名
"title": string;
// 字段在表单中的名字,应该和 key 一致
"dataIndex": string;
// 可编辑
"editable"?: boolean;
// 可更新
"updatable"?: boolean;
...
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# file 字段
type 为 file 或 tech_muyan_storage_StorageFieldValue 时,可使用如下的 json 来设定控件的相关属性
{
/** 接受的附件类型, 可参考 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept */
"accept"?: string;
/** 单个的最大文件大小, 单位 MB */
"maxSizeMB"?: number;
/** multiple 为 true 时, 单个字段中, 可上传的最大文件数量, 如果没有设置,默认为 20 */
/** multiple 根据关联关系的类型或者动态字段定义 (Dynamic Field Instance) 中的 multiple 属性确定 */
"maxCount"?: number;
/** 总的文件大小, 单位 MB */
"totalMaxSizeMB"?: number;
}
2
3
4
5
6
7
8
9
10
# code 字段
type 为 code 时,可以通过如下的 extInfo 设定高亮语法
{
/** 代码编辑器控件显示时的高亮语法 */
"codeLanguage"?: "css" | "javascript" | "markdown" | "groovy" .....,
/** 是否在图标后,同时显示代码开始的 20 个字符 */
"showBrief"?: boolean;
}
2
3
4
5
# object 字段
对于对象选择控件,可以使用如下的 extInfo 定义来设定其选择控件中的默认选项
{
/** 默认显示的 options 的过滤条件 */
/** 系统打开页面时, 系统会使用该查询条件查询对象列表并作为对象选择控件的默认选项 */
"defaultOptionsCondition"?: {
"fieldName" : {
/** 匹配的值 */
"value": xxxx,
/** 匹配的字段名称, 支持 dot(.) 方式引用关联字段的某字段 */
/** 如 organization.name 引用 organization 字段的 name */
"columnKey": "xxx",
/** 匹配规则 */
"matchMode": matchMode
}
},
/** 是否禁用对象搜索功能, Since version 0.29 */
"disableObjectSearch"?: boolean
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 一对多对象字段
type 为 array 时(一对多的对象字段),可以使用如下的 extInfo 定义来设定其关联 列表的显示
{
/** 在弹出抽屉中显示的关联对象列表中,显示时所使用的 form 名称 */
"displayForm"?: "Form used to display the list of objects"
}
2
3
# 子表字段
{
/** 子表中的显示字段定义的表单名 */
/** Name of the form defining the display fields in the sub-table */
"displayForm"?: "Form used to display the list of objects",
/** 子表控件的相关属性 */
/** Related properties of the sub-table control */
"subTable"?: {
/** 子表中是否可创建、编辑、删除、搜索现有行 */
/** Whether rows in the sub-table can be created, edited, deleted, or searched */
"updatable"?: true | false,
"creatable"?: true | false,
"deletable"?: true | false,
"searchModal"?: true | false,
/** 子表中的排序字段,默认为 displaySequence, 可以设置为其他字段 */
/** Sorting field in the sub-table, default is displaySequence, can be set to other fields */
"sortBy"?: "排序字段的 key" // Key of the sorting field
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
← 🌐 线上快速体验 ❓ FAQ 常见问题 →