# 动态领域模型

本系统基于 JDBC 自研的 ORM 框架,可以在界面上动态的创建 & 修改领域模型定义。

# 目标读者

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

以下描述了,领域模型支持相关功能的一些开发说明,当前包括

  • 领域模型字段属性设置
  • 领域模型扩展元数据配置

可以参考以下视频了解如何快速创建并使用一个领域模型:

# 领域模型字段属性

在创建领域模型时,只需要填写模型的简略名称、字段属性列表及扩展元数据即可。

提示

系统会根据用户输入的简略名称,自动生成其完整名称、保存的数据库表名及显示名称,这 些信息在创建后不可修改。

# 领域模型字段属性设置

# 字段属性设置

字段名 描述
名称(Name) 字段的名称,用于在代码中引用该字段。在同一领域模型中,字段名称不能重复。
数据类型(DataType) 字段的数据类型,详细类型见下文。
字段关联类型(Reference Domain) 当数据类型为 DOMAIN_OBJECTDOMAIN_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 的字段,可以配 置 scaleprecision 信息,其配置格式为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"
}
1
2
3
4
5
6
7
8
9
10
11
12

其中 scale 表示小数位数, precision 表示精度(整数位数+小数位数)。

# 领域模型元数据

领域模型扩展元数据需要在 extInfo 中进行配置:

  1. 通过 Domain 中静态的 labelField 属性指定在前端的对象控件上,显示对象的哪个属性 作为标识。

  2. 通过 Domain 中静态的 inlineSearchColumns 属性指定在前端的对象输入控件中,快捷搜 索对象时,搜索哪些属性。

  3. 通过 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'],
}
1
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: "'{ }'"
  }
  // ....
}
1
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 字段。

  1. 通常使用 name 字段用于在 csv 文件中与其他对象进行外键关联的指定,具体在 CSV 文件中指定外键关联可参考 关联对象的查询 章节,name 字段通常设计为不可更新。
  2. 通常使用 label 字段用于在界面的 Object 显示控件中显示该对象的摘要。
  3. 通常使用 description 字段来存储业务上的描述或帮助信息等。
  4. 通常将 namelabel 字段均加入 Domain 的 inlineSearchColumns 属性中。
  5. 通常将 label 字段设置为 Domain 的 labelField.

# enableLogic 约定

在使用 DynamicLogic 进行业务判断时,使用 enableLogic 判断该定制、动态动作 (Dynamic Action) 、定时任务(Dynamic Task) 等是否执行或显示,当前支持使用 enableLogic 进行启用及显示逻辑定制的包括:

  1. DynamicTask
  2. DynamicAction
  3. DynamicIntegration
  4. DynamicFormGroup
  5. 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 中的 objectTypeobjectIds 字段用于记录该消 息所关联的对象的类型及 id。
  • tech.muyan.comment.DomainComment 中的 objectTypeobjectId 字段用于记 录该评论所关联的对象的类型及 id。
  • tech.muyan.dynamic.hook.DynamicObjectHook 中的 objectType 字段用于记录该客 制化钩子所关联的对象的类型。

# isSystem 约定

针对某些数据,是系统运行所必须的,不允许用户进行删除或者修改,通常使用 名为 isSystemboolean 字段进行标识

系统提供了名为 beforeDeleteObjectWithIsSystembeforeDeleteDynamicLogic ,可用于在删除 Domain 对象前,进行如下检查: 如果 isSystem 为 true, 则不允许删除。

Last Updated: 2024/12/4 13:00:56