Enums
Enums dienen dazu, eine Menge vordefinierter Konstanten festzulegen, die verschiedene Zustände, Typen oder Konfigurationen innerhalb der Bibliothek repräsentieren können. Enums sind in ein Runtime Entity Object eingebettet und benötigen keine Navigation über Assoziationen.
Typischerweise werden Enums verwendet, um Folgendes zu definieren:
- Zustände: Enums können den Zustand eines Objekts definieren, etwa
Active,Inactive,Pendingusw. - Konfigurationen: Enums können Konfigurationen definieren, etwa
High,Medium,Lowusw. - Status: Enums können den Status eines Objekts definieren, etwa
Success,Failure,Pendingusw. - Kategorien: Enums können Kategorien definieren, etwa
Electronics,Clothing,Furnitureusw. - Berechtigungen: Enums können Berechtigungen definieren, etwa
Read,Write,Deleteusw. - Priorität: Enums können Prioritätsstufen definieren, etwa
High,Medium,Lowusw. - Schweregrad: Enums können Schweregrade definieren, etwa
Critical,Major,Minorusw. - Häufigkeit: Enums können die Häufigkeit definieren, etwa
Daily,Weekly,Monthlyusw. - Richtung: Enums können die Richtung definieren, etwa
Inbound,Outbound,Bidirectionalusw.
Enums erstellen
Erstellen Sie eine YAML-Datei und fügen Sie den folgenden Inhalt hinzu, um ein Enum zu definieren:
$schema: https://schemas.meshmakers.cloud/construction-kit-elements.schema.json
enums:
- enumId: Priority
useFlags: false
isExtensible: false
values:
- key: 1
name: Low
description: Low priority
- key: 2
name: Medium
description: Medium priority
- key: 3
name: High
description: High priority
Die folgende Tabelle beschreibt die Felder in der Enum-Definition:
| Feld | Beschreibung | Pflichtfeld | Standardwert |
|---|---|---|---|
| enumId | Der eindeutige Bezeichner für das Enum. | Ja | |
| useFlags | Ein boolescher Wert, der angibt, ob das Enum als Flags verwendet werden soll. | Nein | false |
| isExtensible | Ein boolescher Wert, der angibt, ob das Enum über die API erweiterbar ist | Nein | false |
| values | Ein Array aus Schlüssel-Wert-Paaren, die die Werte des Enums definieren. | Ja | |
| key | Der Schlüssel für den Enum-Wert. Muss eine innerhalb der Liste eindeutige Ganzzahl sein | Ja | |
| name | Der Name des Enum-Werts. Muss ein Name ohne Sonderzeichen oder Leerzeichen sein | Ja | |
| description | Die Beschreibung des Enum-Werts. | Nein |
Customization Extensions
Customization Extensions dienen dazu, die Werteliste eines vordefinierten Enums zu erweitern.
Diese Funktion ist nützlich, um Stammdaten zu erstellen, die sich nicht stark ändern. Es wird nicht empfohlen, diese Funktion für sich häufig ändernde Daten zu verwenden, da ein vollständiges Neuladen des Tenants erforderlich ist, um die Änderungen anzuwenden.
Das folgende Beispiel zeigt, wie man das Priority-Enum um einen neuen Wert erweitert:
Schritt 1: Die Enum-Definition erweiterbar machen
Wir erstellen eine neue Enum-Definition für das Priority-Enum, bei der das Feld isExtensible auf true gesetzt ist.
$schema: https://schemas.meshmakers.cloud/construction-kit-elements.schema.json
enums:
- enumId: Priority
useFlags: false
isExtensible: true # This field is updated to true
values:
- key: 1
name: Low
description: Low priority
- key: 2
name: Medium
description: Medium priority
- key: 3
name: High
description: High priority
Schritt 2: Den Construction Kit in OctoMesh importieren
Nachdem Sie die Enum-Definition aktualisiert haben, kompilieren Sie den Construction Kit und importieren Sie ihn in OctoMesh. Das Priority-Enum ist nun erweiterbar, und Sie können ihm über die API neue Werte hinzufügen.
octo-cli -c importck -f '<path of directory for construction kit>' -w
Weitere Informationen finden Sie unter Construction Kits importieren.
Schritt 3: Das Enum über die API erweitern
Wir erstellen über die API einen neuen Wert namens Urgent mit dem Schlüssel 1 für das Priority-Enum. Wir verwenden die INSERT-Operation, um den neuen Wert zum Enum hinzuzufügen.
mutation {
constructionKit {
enums(ckId: "ConstructionKitLibrary/Priority") {
updateValueExtensions(
values: [
{
operation: INSERT
value: { key: 4, name: "Urgent", description: "Urgent priority" }
}
]
) {
ckEnumId
isExtensible
values {
key
name
description
isExtension
}
}
}
}
}
Das Ergebnis dieser Abfrage sieht wie folgt aus
{
"data": {
"constructionKit": {
"enums": {
"updateValueExtensions": [
{
"ckEnumId": "ConstructionKitLibrary/Priority",
"isExtensible": true,
"values": [
{
"key": 1,
"name": "Low",
"description": "Low priority",
"isExtension": false
},
{
"key": 2,
"name": "Medium",
"description": "Medium priority",
"isExtension": false
},
{
"key": 3,
"name": "High",
"description": "High priority",
"isExtension": false
},
{
"key": 4,
"name": "Urgent",
"description": "Urgent priority",
"isExtension": true
}
]
}
]
}
}
}
}
Beachten Sie:
- Der Name muss innerhalb des Enums eindeutig sein. Wenn Sie versuchen, einen Wert mit einem bereits vorhandenen Namen einzufügen, schlägt die Operation fehl.
- Der Name darf nicht leer sein und keine Sonderzeichen oder Leerzeichen enthalten. Regex-Muster:
^[_a-zA-Z][_a-zA-Z0-9]*$ - Der Schlüssel muss innerhalb des Enums eindeutig sein. Wenn Sie versuchen, einen Wert mit einem bereits vorhandenen Schlüssel einzufügen, schlägt die Operation fehl.
- Der Schlüssel muss eine Ganzzahl größer als 0 sein.
Es ist außerdem möglich, Werte eines Enums zu löschen oder zu aktualisieren. Das folgende Beispiel zeigt, wie man einen Wert im Priority-Enum löscht und einfügt:
mutation {
constructionKit {
enums(ckId: "ConstructionKitLibrary/Priority") {
updateValueExtensions(
values: [
{
operation: DELETE
value: { key: 4, name: "Urgent", description: "Urgent priority" }
},
{
operation: INSERT
value: { key: 4, name: "Critical", description: "Critical priority" }
}
]
) {
ckEnumId
isExtensible
values {
key
name
description
isExtension
}
}
}
}
}
Verhalten beim Import eines Construction Kits
Wenn Sie ein Construction-Kit-Modell importieren oder aktualisieren, bewahrt das System benutzerdefinierte Erweiterungswerte, die über die API hinzugefügt wurden. So bleiben Ihre Anpassungen über Modellaktualisierungen hinweg erhalten.
Erweiterungswerte bleiben erhalten
Wenn eine neue Version eines Construction Kits importiert wird:
- Erweiterungswerte werden automatisch bewahrt: Alle Werte mit
isExtension: truewerden vor dem Import gespeichert und danach wiederhergestellt. - Neue CK-definierte Werte werden hinzugefügt: Werte, die im neuen Construction-Kit-Modell definiert sind, werden normal importiert.
- Erweiterungswerte haben Vorrang: Hat ein Erweiterungswert denselben Schlüssel wie ein CK-definierter Wert, überschreibt der Erweiterungswert den CK-definierten Wert.
Beispielszenario
Betrachten Sie ein Enum Priority mit den folgenden anfänglichen CK-definierten Werten:
| Key | Name | IsExtension |
|---|---|---|
| 1 | Low | false |
| 2 | Medium | false |
| 3 | High | false |
Sie fügen über die API einen benutzerdefinierten Erweiterungswert hinzu:
| Key | Name | IsExtension |
|---|---|---|
| 4 | Critical | true |
Nun importieren Sie eine neue Version des Construction Kits, die einen neuen Wert mit dem Schlüssel 4 hinzufügt:
| Key | Name | IsExtension |
|---|---|---|
| 1 | Low | false |
| 2 | Medium | false |
| 3 | High | false |
| 4 | VeryHigh | false |
Nach dem Import lautet das Ergebnis:
| Key | Name | IsExtension |
|---|---|---|
| 1 | Low | false |
| 2 | Medium | false |
| 3 | High | false |
| 4 | Critical | true |
Der Erweiterungswert Critical (Schlüssel 4) überschreibt den CK-definierten Wert VeryHigh, weil Erweiterungswerte Vorrang haben.
Wählen Sie beim Hinzufügen von Erweiterungswerten Schlüssel, die voraussichtlich nicht mit künftigen CK-Aktualisierungen kollidieren. Erwägen Sie, für benutzerdefinierte Erweiterungen höhere Schlüsselwerte zu verwenden (z. B. beginnend bei 100 oder 1000).
Wenn Sie einen bestimmten Schlüssel verwenden müssen, der im Construction Kit definiert ist, können Sie ihn mit einem Erweiterungswert überschreiben. Beachten Sie jedoch, dass dies zu Problemen führen kann, wenn der CK-definierte Wert eine bestimmte Bedeutung in der Systemlogik hat.