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.
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.
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 {
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.
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.
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.
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)
}
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.
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
Siehe: Groovy Script,Aktuellhalten per Trigger/Auslöser
Wie werden die Attribute einer Entität gespeichert?
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.