Zu erweiternde Funktionalität

Die Funktionalität, die ich erweitern musste, bestand darin, Kunden zu ermöglichen, wiederkehrende Termine einzuplanen, um Bestandteile der Fernleitungsinfrastruktur zu kontrollieren/überprüfen.

Die Servicetechniker der Gastdienstleister haben in einem regelmäßigen Zeitintervall all die Bestandteile der Fernleitungsinfrastrukturanlagen besucht und geprüft. Die Überprüfung wird in einem Formular festgehalten. Sie können dann auch Teile der Anlage, die Sie geprüft haben, als mangelhaft markieren und daraus wird automatisch eine Meldung erstellt.

Das ermöglichte dem Gasdienstleister diese Übeprüfungstermine einzuplanen, um sich an die gesetzlichen Regeln zu halten. Und gleichzeitig die Arbeit der Servicetechniker zu übermitteln und einen Prozess anzustoßen für die Beseitigung von Mängel.

Mehr zum Anwendungsfall

Dies ermöglichte es dem Gasdienstleister, Überprüfungstermine einzuplanen, um die gesetzlichen Regeln einzuhalten. Gleichzeitig konnte die Arbeit der Servicetechniker übermittelt und ein Prozess zur Beseitigung von Mängeln angestoßen werden.

Der Anwendungsfall bestand darin, Anlagen regelmäßig zu überprüfen, was gesetzlich geregelt war. In einer Anlage konnten mehrere Bestandteile der Fernleitung gehören, wie Absperrventile, Kugelhähne oder ähnliche Infrastrukturbestandteile. Diese sollten regelmäßig auf ihre Funktionsfähigkeit überprüft werden, um die Sicherheit zu gewährleisten und frühzeitig Beschädigungen oder Abnutzungen zu erkennen, die zu einem Unfall führen konnten.

Die Prüfung erfolgte durch Mitarbeiter, denen ein geografischer Verantwortungsbereich zugewiesen wurde. Sie hatten Zeit, die Aufträge abzuarbeiten, und konnten selbst entscheiden, welche Anlage sie zuerst besuchten. Hauptsächlich mussten sie innerhalb eines bestimmten Zeitraums alle Anlagen besuchen und alle zugewiesenen Aufträge auf der Oberfläche der Applikation mit Kartenansicht abarbeiten. Die Mitarbeiter hatten auch die Möglichkeit, Mängel innerhalb eines Camunda-BPM-Prozesses zu erfassen.

Erstellung von Meldungen: Beim Ausfüllen eines Formulars kann der Zustand auf "Mangelhaft" gesetzt werden, was automatisch eine Meldung/Dispatch generiert, sobald die Auftragsposition(Assignment) und das Formular abgeschlossen sind.

Formulare mit verschachtelten Formularelementen

Die Anwendung des Kunden nutzte die objektrelationalen Mapping-Funktionen von Hibernate, um hierarchische Datenstrukturen darzustellen.Beispiele für hierarchische Datenstrukturen sind Formulare mit verschachtelten Formularelementen.Entitäten wie FormElement und AbstractFormNode wurden entwickelt, um die hierarchischen Beziehungen zu repräsentieren. FormElement hatte eine übergeordnete Referenz und eine Liste von Kindern.

                                    
public abstract class FormElement extends AbstractFormNode<FormElement, FormVisitor> {
    @ManyToOne
    private FormElement parent;
}

public abstract class AbstractFormNode<C extends AbstractFormNode<?, V>, V> {
    @Transient
    private List<C> children;
}
                                    
                                

Die Anwendung enthielt auch spezialisierte Unterklassen wie FormElementBlock und FormElementPage, um bestimmte Formularabschnitte oder -seiten darzustellen.

                                    
public class FormElementBlock extends FormElement {
public class FormElementPage extends FormElement {
public class FormElementEnum extends FormElement {
                                    
                                

Kundenwunsch/Aufgabenstellung

Der Benutzer kann nach der Erstellung einer Dispatchanfrage/Mangelerfassung diese und einige ihrer Eigenschaften anzeigen lassen.

Der Kunde wünschte sich jedoch zusätzliche Funktionen: Fünf spezifische Attribute, die Einblicke in die Quelle einer Dispatchanfrage geben, sollten bei der Anzeige einer Dispatchanfrage sichtbar sein.

Front-End schon vorbereitet für die 5 zusätzliche dynamische Attribute

Dynamische/Berechnete Attribute

Diese berechneten Attribute sollten aktiv gepflegt und bei Änderungen in den Quelldaten neu berechnet werden. Änderungen in Quellattributen sollten in Echtzeit oder Quasi-Echtzeit an alle abhängigen Attribute propagiert werden, um die Datenkonsistenz in der Anwendung zu gewährleisten.

Um diese Anforderungen zu erfüllen, musste die Anwendung ein reaktives Modell einführen, bei dem Änderungen der Entitätszustände Aktualisierungen in verwandten Entitäten auslösen.

Aktualisieren der von einer anderen Entität abhängigen Eigenschaften um stets den Überblick zu behalten

Die Herausforderung bestand darin, mit Szenarien umzugehen, in denen Attributänderungen in einer Entität Aktualisierungen in verwandten Entitäten anstoßen und gleichzeitig die korrekte Dateianzeige während der gesamten Anwendungsdauer gewährleisten.

Wenn der Status eines Formelements auf "Mangel" gesetzt wurde, generierte dies automatisch eine Versandbenachrichtigung, sobald die zugehörige Assignment/Termin (siehe Termin-Kalendar Funktionalität Terminplan mit Kalenderansicht) und das Formular abgeschlossen waren.

Diese Funktionalität wurde durch Klassen wie CloseFormVisitor implementiert, die eine neue Dispatch-Entität erstellten und Beziehungen zu den relevanten FormElement- und anderen Entitäten herstellten.

Beachte wie die Beziehung zwischen FormElement und Dispatch in einer Join-Tabelle festgehalten wird
                    
public void onExitBlock(FormElementBlock block, FormTraversalStatus status) {
    if (blockDefect) {
        rememberFuncloc(block);
        createDispatchDefect(block);
    }
}

private void createDispatchDefect(FormElementBlock block) {
    Dispatch dispatch = new Dispatch();
    dispatch.setTypeCat(DispatchTypeSD.DEFECT_NOTIFICATION);
    // ... (omitted for brevity)
    standingDataDao.persist(dispatch, attribMap);
    // ... (omitted for brevity)
    new PostCreateEntityEvent(dispatch).broadcast();
    EntityManager em = Lookup.entityManager();
    em.persist(new DispatchAssignmentJoin(dispatch, assignment, DispatchAssignmentJoinType.SOURCE));
    em.persist(new FormElementDispatchJoin(block, dispatch));
    // ... (omitted for brevity)
}

Technische Lösung

  1. GraphQL Anpassung, Datenmodell Erweiterung
  2. Hibernate SPI Event Listener
  3. Groovy Script-e als Trigger/Auslöser
  4. Groovy Script-e als Berechnungsvorschrift
GraphQL Anpassung, Datenmodell Erweiterung

Entitäten wie FormElementDispatchJoin wurden eingeführt, um Beziehungen zwischen Formularelementen und Dispatchanfragen herzustellen und es der Anwendung zu ermöglichen, von einer Dispatchanfrage zu den zugehörigen Formular-, Auftrags- und Planungsinformationen zu navigieren.

  • Verknüpfung durch Klassen: Durch die class FormElementDispatchJoin werden Formulareinträge/FormElement-e und Meldungen/Dispatch-es miteinander verknüpft. Eine spezielle Klasse FormElementBlock erweitert FormElement für spezifische Formularseiten oder -blöcke.

  • Datenfluss: Von einer Meldung/Dispatch über FormElementDispatchJoin gelangt man zum FormElement und von dort aus zum Formular/Form, das auch den Namen des Auftrags/Orders und die dazugehörige Planung/Planning umfasst.

  • FormElementDispatchJoin ist quasi eine Entität für eine Join-Tabelle, sodass es Foreign Keys beinhaltet für den Dispatch und den dazu gehörigen FormElement. Und FormElement ist auch eine Entität, das ein Feld hat in seiner Klasse, die sich auf diesen Form bezieht. Das sind alle Hibernate-Entitäten.
                        
class FormElementDispatchJoin{
    @EmbeddedId
    @AttributeOverride(name = "left", column = @Column(name = "FORM_ELEMENT_ID"))
    @AttributeOverride(name = "right", column = @Column(name = "DIS_ID"))
    private SimpleCompositeKey id;

    @ManyToOne
    @JoinColumn(name = "FORM_ELEMENT_ID", nullable = false, updatable = false, insertable = false)
    private FormElement formElement;

    @ManyToOne
    @JoinColumn(name = "DIS_ID", nullable = false, updatable = false, insertable = false)
    private Dispatch dispatch;


class FormElement{
    private Form form
                            


Wie wird auf die Änderungen der Datenbankänderungen reagiert?

Siehe: Hibernate SPI Event Listener


Wird es den Administratoren ermöglicht per UI die Berechnung der dynamischen Attribute zu definieren?

Ja, mithilfe einer UI für das Definieren von dynamische Attribute und das Aktuellhalten

Berechnetes Attribut erstellen


Trigger/Auslöser und Berechnungsvorschrift



Siehe: Groovy Script,Aktuellhalten per Trigger/Auslöser


Wie werden die Attribute einer Entität gespeichert?

Siehe: Basistypen und das flexible EAV-Datenmodell und zugehörige Benutzeroberfläche, damit Administratoren weitere Attribute zur Datenbank hinzufügen können

Wer bin ich?

Ábel Kecse

ein leidenschaftlicher IT Expert

Hinweis für das Lesen von Artikeln:

Aufgabenstellung und Anwendungsfall:

Die oberste Ebene des Artikels ist dafür gedacht, die Aufgabenstellung und den Anwendungsfall zu vermitteln. Hier findest du eine kurze Beschreibung dessen, worum es im Artikel geht.

Technische Details und UI:

Wenn du mehr ins Detail gehen möchtest, klicke auf die blauen Knöpfe.

Hier findest du Informationen zu den technischen Aspekten, der Benutzeroberfläche und anderen relevanten Details.