# 动态领域模型
本系统基于 JDBC 自研的 ORM 框架,可以在界面上动态的创建 & 修改领域模型定义。
# 目标读者
本文档的目标读者为:本系统的实施和开发人员
以下描述了,领域模型支持相关功能的一些开发说明,当前包括
- 领域模型字段属性设置
- 领域模型扩展元数据配置
可以参考以下视频了解如何快速创建并使用一个领域模型:
# 领域模型字段属性
在创建领域模型时,只需要填写模型的简略名称、字段属性列表及扩展元数据即可。
提示
系统会根据用户输入的简略名称,自动生成其完整名称、保存的数据库表名及显示名称,这 些信息在创建后不可修改。
# 领域模型字段属性设置
# 字段属性设置
字段名 | 描述 |
---|---|
名称(Name) | 字段的名称,用于在代码中引用该字段。在同一领域模型中,字段名称不能重复。 |
数据类型(DataType) | 字段的数据类型,详细类型见下文。 |
字段关联类型(Reference Domain) | 当数据类型为 DOMAIN_OBJECT 或 DOMAIN_OBJECT_LIST 时,需要通过该字段关联领域模型对象。 |
可空(Nullable) | 该字段是否可为空。 |
可修改(Editable) | 创建后是否可编辑该字段。 |
默认值(Default Value) | 字段的默认值。 |
可选值(Options) | 该字段的可选值列表,为json array字符串,格式如: ["option1", "option2"] 。 |
扩展信息(Ext Info) | 其他额外配置信息,不同数据类型可能有不同扩展信息。 |
# 数据类型详细说明
# 字段数据类型
系统支持的 字段数据类型
包括:
数据类型 | 描述 |
---|---|
STRING | 表示字符串 |
BOOLEAN | 表示布尔值(true 或 false) |
BIG_DECIMAL | 表示不可变的高精度十进制数 |
INTEGER | 表示整数值 |
LONG | 表示长整型值 |
DOUBLE | 表示双精度浮点数 |
LOCAL_DATE | 表示没有时间和时区信息的日期 |
ZONED_DATETIME | 表示带有时区信息的日期和时间 |
JSON_STRING | 表示JSON字符串 |
DOMAIN_OBJECT | 表示对域对象的引用 |
DOMAIN_OBJECT_LIST | 表示域对象列表 |
FILE | 附件类型 |
FILE_LIST | 多个附件 |
ENUM | 枚举类型 |
# 扩展信息(Ext Info) 字段
不同数据类型可能有不同的扩展信息配置,当前对于类型为 BIG_DECIMAL
的字段,可以配
置 scale
和 precision
信息,其配置格式为JSON,如下所示:
{
// 适用于 Decimal 类型的字段,设置小数位数为 2
// Applicable to Decimal type fields, set the number of decimal places to 2
"scale": 2,
// 适用于 Decimal 类型的字段,设置精度为 10
// Applicable to Decimal type fields, set the precision to 10
"precision": 10
// 指定 ENUM 类型的字段的 Java 枚举类型定义
// Specify the Java enum type definition of the ENUM type field
// 该枚举类的定义可以放在动态插件中
// The enum class definition can be in a dynamic plugin
"enumClass": "tech.muyan.mes.enums.WorkTaskStatusEnum"
}
2
3
4
5
6
7
8
9
10
11
12
其中 scale
表示小数位数, precision
表示精度(整数位数+小数位数)。
# 领域模型元数据
领域模型扩展元数据需要在 extInfo
中进行配置:
通过 Domain 中静态的
labelField
属性指定在前端的对象控件上,显示对象的哪个属性 作为标识。通过 Domain 中静态的
inlineSearchColumns
属性指定在前端的对象输入控件中,快捷搜 索对象时,搜索哪些属性。通过 Domain 中静态的
loadAfter
属性指定在导入种子数据时,该类型的对象需要在哪些类型的对象 之后导入。具体描述请参考 导入顺序及依赖。
样例如下:
{
// 用户快捷搜索时,使用 name 和 label 两个字段进行搜索匹配
// When users perform quick search, use the name and label fields for search matching
"inlineSearchColumns": ['name', 'label'],
// 界面上显示 Object 控件时,显示其 label 字段的值作为标识
// When displaying Object controls on the interface, show the value of its label field as identifier
"labelField": 'label',
// 导入 CSV 数据时,当前 Domain 会在 DynamicLogic 和 DynamicFieldDefinition 之后加载
// When importing CSV data, the current Domain will be loaded after DynamicLogic and DynamicFieldDefinition
"loadAfter": ['DynamicLogic', 'DynamicFieldDefinition'],
}
2
3
4
5
6
7
8
9
10
# Domain 设计相关约定
# extInfo 约定
使用 extInfo 字段来存储结构比较复杂,异构、或者与 Domain 的特定子类型相关,但又 需要进行结构化存储的信息。
该字段的相关定义样例如下
// 如下是在平台中实际实现的 extInfo 字段的样例
// Example of the extInfo field actually implemented in the platform
class DynamicFormField implements MultiTenant<DynamicFormField>,
Auditable, Stampable<DynamicFormField>, Serializable {
// ....
// Java 的字段类型为 String
// The Java field type is String
String extInfo
// 设置为可以为 null, 但是不能为空字符
// Set to be nullable, but not blank
static constraints = {
extInfo nullable: true, blank: false
}
static mapping = {
// 使用 jsonb 类型的数据库字段,数据库会自动增加相关校验,并提供 JSON 查询相关功能
// 在转换为 Java 对象时,会被转换为 String 类型
// Use jsonb field, the database will automatically add relevant checks and provide JSON query related functions
// When converted to a Java object, it will be converted to a String type
extInfo type: 'tech.muyan.rdbms.postgres.JSONBType', sqlType: "jsonb", defaultValue: "'{ }'"
}
// ....
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# displaySequence 约定
通常使用 displaySequence 字段来指定字段、字段组、树节点、DynamicAction 等在前端 的显示顺序
# name / label / description 约定
Domain 字段常设计不可更新的 name 字段和可更新的 label 字段。
- 通常使用
name
字段用于在 csv 文件中与其他对象进行外键关联的指定,具体在 CSV 文件中指定外键关联可参考 关联对象的查询 章节,name
字段通常设计为不可更新。 - 通常使用
label
字段用于在界面的 Object 显示控件中显示该对象的摘要。 - 通常使用
description
字段来存储业务上的描述或帮助信息等。 - 通常将
name
和label
字段均加入 Domain 的inlineSearchColumns
属性中。 - 通常将
label
字段设置为 Domain 的labelField
.
# enableLogic 约定
在使用 DynamicLogic 进行业务判断时,使用 enableLogic 判断该定制、动态动作 (Dynamic Action) 、定时任务(Dynamic Task) 等是否执行或显示,当前支持使用 enableLogic 进行启用及显示逻辑定制的包括:
DynamicTask
DynamicAction
DynamicIntegration
DynamicFormGroup
DynamicDashboardWidget
# objectType/objectId(s) 约定
针对某一些特定的业务场景,需要在某些 Domain 中记录其关联的对象的类型及 id,通常 使用 objectType/objectId(s) 字段的组合来记录。
objectType
通常使用objectType
字段来记录对象的类型,该字段为指向tech.muyan.DomainClass
类型对象的外键引用。objectId(s)
通常使用objectId(s)
字段来记录对象的一个或者多个 id,如果有多 个 id 需要记录,使用逗号分隔的 id 列表形式进行存储。
该约定在系统中的使用举例如下:
tech.muyan.message.Message
中的objectType
和objectIds
字段用于记录该消 息所关联的对象的类型及 id。tech.muyan.comment.DomainComment
中的objectType
和objectId
字段用于记 录该评论所关联的对象的类型及 id。tech.muyan.dynamic.hook.DynamicObjectHook
中的objectType
字段用于记录该客 制化钩子所关联的对象的类型。
# isSystem 约定
针对某些数据,是系统运行所必须的,不允许用户进行删除或者修改,通常使用
名为 isSystem
的 boolean
字段进行标识
系统提供了名为 beforeDeleteObjectWithIsSystem
的 beforeDelete
的
DynamicLogic
,可用于在删除 Domain 对象前,进行如下检查: 如果 isSystem
为
true, 则不允许删除。