Kapitel 12: Konferenzraumbuchung und Workflow
Sicher sind Sie inzwischen mit NocoBase bestens vertraut.
In diesem Kapitel setzen wir gemeinsam ein besonderes Szenario um: ein Modul zur Besprechungsverwaltung.
Dieses Modul umfasst Funktionen wie Konferenzraumbuchung und Benachrichtigungen. Wir bauen das Modul Schritt für Schritt von Grund auf, beginnen mit den Grundlagen und ergänzen schrittweise komplexere Funktionen. Zunächst entwerfen wir die grundlegende Datenstruktur.
12.1 Datenstruktur entwerfen
Die Datenstruktur bildet das Grundgerüst des Moduls. Wir konzentrieren uns auf die Konferenzraum-Tabelle und die Buchungstabelle und nutzen dabei neue Beziehungen wie Many-to-Many zur Benutzertabelle.

12.1.1 Konferenzraum-Tabelle
Die Konferenzraum-Tabelle speichert grundlegende Informationen aller Konferenzräume, einschließlich Name, Standort, Kapazität und Ausstattung.
Beispielstruktur
12.1.2 Buchungstabelle
Die Buchungstabelle speichert alle Buchungsdaten, einschließlich Konferenzraum, Teilnehmer, Zeitraum, Titel und Beschreibung.
Beispielstruktur
Many-to-Many-Beziehung
In der Buchungstabelle gibt es eine Many-to-Many-Beziehung: Ein Benutzer kann an mehreren Besprechungen teilnehmen, eine Besprechung kann mehrere Teilnehmer haben. Die Fremdschlüsselbeziehung muss korrekt konfiguriert sein. Zur einfacheren Verwaltung benennen wir die Zwischentabelle booking_users.

12.2 Modul zur Besprechungsverwaltung aufbauen
Nachdem die Datenstruktur entworfen ist, erstellen wir die beiden Tabellen und bauen das Modul „Besprechungsverwaltung" auf. Folgen Sie diesen Schritten:
12.2.1 Tabellenblöcke erstellen
Fügen Sie zunächst auf der Seite das Modul „Besprechungsverwaltung" hinzu und erstellen Sie jeweils einen Tabellenblock für Konferenzräume und einen Tabellenblock für Buchungen. Erstellen Sie außerdem einen Kalenderblock für die Buchungstabelle und stellen Sie die Standardansicht des Kalenders auf „Tag".

Verknüpfung der Konferenzraum-Tabelle einrichten
Verknüpfen Sie den Konferenzraum-Tabellenblock mit den anderen beiden Blöcken, sodass die zugehörigen Buchungen automatisch gefiltert werden. Anschließend können Sie Filter, CRUD-Operationen und die grundlegende Modulinteraktion testen.
Tipp Block-Verbindungen in NocoBase (empfohlen!):
Neben dem bisher gezeigten Filter-Block können auch Tabellenblöcke mit anderen Blöcken verbunden werden, um durch Klicks zu filtern.
Wie in der Abbildung unten gezeigt, verbinden wir in der Konfiguration der Konferenzraum-Tabelle die beiden anderen Buchungs-Blöcke (Buchungs-Tabellenblock, Buchungs-Kalenderblock).

Nach erfolgreicher Verbindung führt ein Klick auf einen Eintrag in der Konferenzraum-Tabelle dazu, dass die anderen beiden Tabellen entsprechend gefiltert werden! Erneutes Klicken hebt die Auswahl auf.
12.3 Konferenzraumbelegung prüfen
Nach Abschluss der Seitenkonfiguration ergänzen wir eine wichtige Funktion: die Prüfung der Konferenzraumbelegung. Diese Funktion prüft beim Erstellen oder Aktualisieren einer Buchung, ob der Konferenzraum im angegebenen Zeitraum bereits belegt ist, um Buchungskonflikte zu vermeiden.
12.3.1 Workflow mit „Pre-Action Event" konfigurieren
Für die Prüfung beim Buchen verwenden wir einen besonderen Workflow-Typ - das „Pre-Action Event":
- Pre-Action Event (kommerzielles Plugin): Führt vor dem Hinzufügen, Löschen oder Ändern von Daten eine Reihe von Operationen aus, kann jederzeit unterbrechen und vorzeitig abbrechen - eine Vorgehensweise, die unserem täglichen Code-Entwicklungsablauf sehr nahekommt!

12.3.2 Knoten konfigurieren
Im Workflow zur Belegungsprüfung benötigen wir folgende Knotentypen:
- Berechnungsknoten (Datentransformationslogik für Aktualisierungen und Neuanlagen)
- SQL-Operation (führt SQL-Abfragen aus)
- JSON-Parsing (kommerzielles Plugin zum Parsen von JSON-Daten)
- Antwortnachricht (kommerzielles Plugin zur Rückgabe von Hinweismeldungen)
12.3.3 Buchungstabelle binden und Trigger konfigurieren
Wir binden die Buchungstabelle, wählen den Trigger-Modus „Globaler Modus" und als Aktionstypen „Datensatz erstellen" und „Datensatz aktualisieren".

12.4 Berechnungsknoten konfigurieren
12.4.1 Berechnungsknoten „Leere ID in -1 umwandeln" erstellen
Zunächst erstellen wir einen Berechnungsknoten, der leere IDs in -1 umwandelt. Berechnungsknoten transformieren Variablen nach unseren Vorgaben und bieten drei Operationsformen:
- Math.js (siehe Math.js)
- Formula.js (siehe Formula.js)
- String-Vorlage (zum Verketten von Daten)
Hier verwenden wir Formula.js zur numerischen Auswertung:

12.5. SQL-Operationsknoten erstellen
Als Nächstes erstellen wir einen SQL-Operationsknoten zur Abfrage verfügbarer Konferenzräume:
12.5.1 SQL-Anweisung zur Abfrage verfügbarer Konferenzräume
Hinweis zu SQL: Variablen werden direkt in die SQL-Anweisung eingesetzt. Prüfen Sie sie sorgfältig, um SQL-Injection zu vermeiden, und ergänzen Sie an den richtigen Stellen einfache Anführungszeichen.
Die Variablen bedeuten:
{{$jobsMapByNodeKey.3a0lsms6tgg}} steht für das Ergebnis des vorherigen Knotens [Knoten-Daten/Leere ID in -1 umwandeln]
{{$context.params.values.end_time}} steht für [Trigger-Variable/Parameter/Übermittelte Werte/Endzeit]
{{$context.params.values.start_time}} steht für [Trigger-Variable/Parameter/Übermittelte Werte/Startzeit]
12.5.2 SQL testen
Unser Ziel: alle Konferenzräume finden, die mit dem Zielzeitraum nicht kollidieren.
Während des Tests können Sie unten auf „Test run" klicken, Variablenwerte ändern und die SQL-Anweisung debuggen.


12.6 JSON-Parsing
12.6.1 JSON-Parsing-Knoten konfigurieren
Im vorherigen Test haben wir Ergebnisse in folgender Form erhalten. Dafür müssen wir das JSON Query Node-Plugin aktivieren:
Es gibt drei Arten des JSON-Parsings: JMESPath JSON Path Plus JSONata
Wir wählen z. B. das JMESPath-Format. Da wir eine Liste aller verfügbaren Raumnamen filtern möchten, lautet der Ausdruck:
Die Attribute-Mapping-Konfiguration wird auf Objektlisten angewendet und ist hier nicht erforderlich.

12.7 Bedingungsknoten
Konfigurieren Sie einen Bedingungsknoten, um zu prüfen, ob der aktuelle Konferenzraum in der Liste der verfügbaren Räume enthalten ist. Je nach Ergebnis (Ja oder Nein) konfigurieren Sie unterschiedliche Antwortnachrichten:
Als Bedingungstyp wählen Sie „Basis":

12.7.1 Ja: Erfolgsmeldung konfigurieren
Hierfür muss das Workflow: Response Message-Plugin aktiviert werden:

12.7.2 Nein: Fehlermeldung konfigurieren
Hinweis: Bei Fehlschlag muss zwingend ein „Prozess beenden"-Knoten konfiguriert werden, um den Workflow manuell zu stoppen.

12.8 Funktionstest und Debugging im Detail
Wir kommen zur finalen Testphase des Besprechungsverwaltungssystems. Ziel ist, zu bestätigen, dass unser Workflow korrekt erkennt und kollidierende Buchungen verhindert.
12.8.1 Buchung mit Zeitkonflikt hinzufügen
Wir versuchen zunächst, eine Besprechung mit konfligierender Zeit hinzuzufügen, und prüfen, ob das System die Operation blockiert und eine Fehlermeldung anzeigt.
- Konfligierenden Buchungszeitraum festlegen
Wir versuchen, in „Konferenzraum 1" eine neue Buchung für den Zeitraum
2024-11-14 00:00:00 - 2024-11-14 23:00:00
hinzuzufügen. Dieser ganztägige Zeitraum kollidiert absichtlich mit bestehenden Buchungen.
- Bestehende Besprechungen prüfen
In „Konferenzraum 1" existieren bereits zwei Buchungen:
2024-11-14 09:00:00 bis 2024-11-14 12:00:002024-11-14 14:00:00 bis 2024-11-14 16:30:00
Beide Zeiträume überschneiden sich mit dem hinzuzufügenden Zeitraum
(2024-11-14 00:00:00 - 2024-11-14 23:00:00).
Daher sollte das System nach unserer Logik den Zeitkonflikt erkennen und die Buchung blockieren.
- Buchung absenden und Reaktion prüfen
Wir klicken auf Senden, das System führt die Workflow-Prüfung aus:
Erfolgreiches Feedback: Nach dem Absenden zeigt das System einen Konflikthinweis - die Prüflogik funktioniert. Die Seite informiert uns erfolgreich, dass die Buchung nicht abgeschlossen werden kann.

12.8.2 Buchung ohne Konflikt hinzufügen
Als Nächstes testen wir konfliktfreie Buchungen.
Wir stellen sicher, dass bei nicht überlappenden Zeiten der Konferenzraum erfolgreich gebucht werden kann!
- Konfliktfreien Buchungszeitraum festlegen
Wir wählen einen Zeitraum ohne Konflikt, etwa
2024-11-10 16:00:00 - 2024-11-10 17:00:00.
Dieser überlappt nicht mit bestehenden Buchungen und entspricht somit den Buchungsanforderungen.
- Konfliktfreie Buchung absenden
Klicken Sie auf Senden, das System führt erneut die Workflow-Prüfung aus:
Lassen Sie uns prüfen: Erfolgreich abgesendet! Das System zeigt „Buchung erfolgreich" an. Die Buchungsfunktion funktioniert auch bei konfliktfreien Eingaben einwandfrei.

12.8.3 Bestehende Buchung ändern
Neben dem Anlegen neuer Buchungen können Sie auch das Ändern bestehender testen.
Ändern Sie etwa eine bestehende Besprechung auf einen konfliktfreien Zeitraum und klicken Sie erneut auf Senden.
Diesen Schritt überlassen wir Ihnen.
12.9 Dashboard-Optimierung und persönliches Terminpanel
Nachdem alle Tests bestanden sind, können wir das Dashboard verschönern und für eine bessere Benutzererfahrung optimieren.
12.9.1 Dashboard-Layout anpassen
Im Dashboard können Sie die Inhalte nach Benutzergewohnheiten neu anordnen, sodass Anwender Systemdaten leichter überblicken.
Zur weiteren Verbesserung der Benutzererfahrung können Sie für jeden Benutzer ein persönliches Terminpanel erstellen:
- Block „Persönliche Termine" hinzufügen: Fügen Sie im Dashboard einen neuen Kalender- oder Listenblock hinzu, der die persönlichen Termine des Benutzers anzeigt.
- Standardwert für Mitglied festlegen: Setzen Sie den Standardwert auf „aktueller Benutzer", sodass Anwender beim Öffnen des Dashboards standardmäßig ihre eigenen Termine sehen.
Damit verbessern Sie die Benutzererfahrung im Modul zur Besprechungsverwaltung weiter.
Nach dieser Konfiguration sind Funktionen und Layout des Dashboards intuitiver und reichhaltiger!


Mit den obigen Schritten haben wir die Hauptfunktionen des Besprechungsverwaltungsmoduls erfolgreich umgesetzt und optimiert! Wir hoffen, Sie eignen sich beim Arbeiten Schritt für Schritt die Kernfunktionen von NocoBase an und erleben den Spaß am modularen Aufbau eines Systems.
Erkunden Sie weiter und lassen Sie Ihrer Kreativität freien Lauf! Bei Fragen können Sie jederzeit die offizielle NocoBase-Dokumentation zu Rate ziehen oder im NocoBase Community-Forum diskutieren.


