# 开发速查手册

以下是系统开发中常用接口及数据格式说明

# 目标读者

本文档的目标读者为:本系统的开发和实施人员

# 字段级联

详细信息请参考 客制化字段联动

# 注入变量

变量名称 变量类型 描述
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"
      }
  ]
]
1
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 对象
  ]
]
1
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: "校验失败的界面提示信息"
]
1
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]
1

# 对象创建 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
1
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
  ]
] //本行代码返回允许用户更新该对象,但不允许用户删除该对象
1
2
3
4
5

# 定时任务启用逻辑

更多信息请参考 定时任务启用逻辑

# 注入变量

# 返回结果

// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
1

# 定时任务核心逻辑

更多信息请参考 定时任务核心逻辑

# 注入变量

变量名称 变量类型 描述
triggerDatetime java.time.LocalDateTime 定时任务的触发时间
task tech.muyan.dynamic.task.DynamicTask 触发定时任务实例
application grails.core.GrailsApplication 当前的 grails 应用上下文
log Closure<?> 用于打印执行日志的 log 闭包

# 返回结果

return [
  execResult: 'OK, Result' //执行结果,类型为文本
]
1
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]
1
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]
1

# 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
]
1
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
]
1
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 名称,
  //前台会根据此返回值,调整步骤之间的跳转逻辑,可返回此参数用来实现决策树
]
1
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 是否显示逻辑

# 注入变量

变量名称 变量类型 描述
userContext grails.plugin.springsecurity.userdetails.GrailsUser 当前操作的用户信息
application grails.core.GrailsApplication 当前的 grails 应用上下文
widget tech.muyan.dynamic.form.DynamicDashboardWidget widget 对象

# 返回结果

// 表示该 action 或 task 或 widget 是否启用
[result: true | false]
1

# Widget 核心逻辑

# 注入变量

变量名称 变量类型 描述
userContext grails.plugin.springsecurity.userdetails.GrailsUser 当前操作的用户信息
application grails.core.GrailsApplication 当前的 grails 应用上下文
widget tech.muyan.dynamic.form.DynamicDashboardWidget 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]
1

# 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]
1

# Core Logic 返回结果

[
  requestNeeded? : true | false //是否需要平台调用集成的目标 Http 接口
  headers? : Map<String, String> //如需平台调用集成的目标 Http 接口,使用的请求头列表
  body? : Map<String, Object> //如需平台调用集成的目标 Http 接口,使用的请求体或请求参数及值列表
]
1
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]
  }
}
1
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');
1
2
3
4

# 后台获取配置

更多信息请参考 后台获取配置 Api

  1. 在后台 Service 或 Controller 中,可直接注入 Bean DynamicConfigService, 或者调用 ConfigHelper.getDynamicConfigService(grailsApplication) 获取该 Bean。

  2. 在客制化代码中,可以通过如下方式获取系统配置中的值

 import tech.muyan.ConfigHelper
 String frontendUrl = ConfigHelper.getDynamicConfigService(grailsApplication)
                                  .getConfig("mail.frontend_url", String.class, "https://muyan.muyan.cloud")   
1
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']
}
1
2
3
4
5
6
7

更多信息请参考 DomainClass 可用的 extInfo 列表

# DomainClass 字段属性定义中

{
  // 适用于 Decimal 类型的字段,设置小数位数为 2
  "scale": 2,
 // 适用于 Decimal 类型的字段,设置精度为 10
  "precision": 10
}
1
2
3
4
5

更多信息请参考 领域模型字段属性定义中的 extInfo

# Dynamic Action 定义中

更多信息请参考 DynamicAction 可用的 extInfo 列表

{
  /** 前台是否显示该 Action 的 label, 默认为 true, 如果只希望显示 Action 图标,可设置 displayLabel 为 false */
  "displayLabel"?: true | false,
  /** 是否在执行该 Action 后,刷新当前页面, 默认为 true, 如果 action 执行不更新显示数据,可以无需刷新页面 */
  "refreshPage"?: true | false
}
1
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;
}
1
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;
}
1
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;
}
1
2
3
4
5
6
7
8

# Dashboard From 属性

{
  /** dashboard的自动刷新间隔 */
  "refreshInterval"?: number;
}
1
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;
  };
}
1
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;
      ...
   }
}
1
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;
}
1
2
3
4
5
6
7
8
9
10

# code 字段

type 为 code 时,可以通过如下的 extInfo 设定高亮语法

{
  /** 代码编辑器控件显示时的高亮语法 */
  "codeLanguage"?: "css" | "javascript" | "markdown" | "groovy" .....,
  /** 是否在图标后,同时显示代码开始的 20 个字符 */
  "showBrief"?: boolean;
}
1
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
}
1
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"
}
1
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
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Last Updated: 2024/7/14 12:09:51