diff --git a/modellierung/holzhandel_sequenz.puml b/modellierung/holzhandel_sequenz.puml index 420299ac2d9311b51f02882f3f2eb5679b4def13..17e37925c5e47bdee419943b0548e1b3245b22ec 100644 --- a/modellierung/holzhandel_sequenz.puml +++ b/modellierung/holzhandel_sequenz.puml @@ -33,114 +33,146 @@ end box == Aufnahme von Notizen (hier: Beobachtung) == -Waldbesitzer -> WaldmanagerApp: Beobachtung eintragen +Waldbesitzer -> WaldmanagerApp: UI-Aktion S3I-Login activate WaldmanagerApp - WaldmanagerApp -> DZ_Wald: Speichern der Beobachtung - note over DZ_Wald #00FF00 - -> FM: Umring sollte optional sein, Beispiel in demos/demo_example_finale + note over WaldmanagerApp #FF0000 + TODO: Christian H. S3I-Login mit individueller ThingId pro Benutzer + Benutzer-Login end note +deactivate WaldmanagerApp + +Waldbesitzer -> WaldmanagerApp: UI-Aktion: Beobachtung eintragen + activate WaldmanagerApp + Waldbesitzer -> WaldmanagerApp: UI-Aktion: In DZ Wald speichern + WaldmanagerApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id}/submodel) mit neuem Submodel Beobachtung; submodel_id selber generieren und BASE64 kodieren activate DZ_Wald - DZ_Wald --> WaldmanagerApp: gespeichert + DZ_Wald --> WaldmanagerApp: S3I-SetValueReply "ok" deactivate DZ_Wald deactivate WaldmanagerApp +note over WaldmanagerApp #FF0000 + TODO: Klärung submodel_id Format (Igor/Ahmed) +end note +note over DZ_Wald #FF0000 + TODO: Log-Ausgaben in DZ-Wald (Ahmed) +end note == Aufnahme eines Waldweges == + Waldbesitzer -> WaldmanagerApp: Waldweg abgehen +note over WaldmanagerApp #FF0000 + TODO: Klärung wie könnte man das in einer Online-Demo präsentieren ("abgehen"?) (Christian H.) +end note activate WaldmanagerApp -Waldbesitzer -> WaldmanagerApp: Wendepunkt anlegen - WaldmanagerApp -> DZ_Wald: Speichern des Waldweges - note over DZ_Wald #00FF00 - -> FM: wie in Modellierung, Beispiel in demos/demo_example_finale - end note +Waldbesitzer -> WaldmanagerApp: UI-Aktion: Wendepunkt anlegen +Waldbesitzer -> WaldmanagerApp: UI-Aktion: In DZ Wald speichern + WaldmanagerApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id}/submodel) mit neuem Submodel Waldweg; submodel_id selber generieren und BASE64 kodieren activate DZ_Wald - DZ_Wald --> WaldmanagerApp: gespeichert + DZ_Wald --> WaldmanagerApp: S3I-SetValueReply "ok" deactivate DZ_Wald deactivate WaldmanagerApp == Holzeinschlag und Holzaufnahme == -Waldbesitzer -> WaldmanagerApp: Arbeitsauftrag für Maßnahme erstellen -activate WaldmanagerApp -Waldbesitzer -> WaldmanagerApp: zu fällende Bäume zu Arbeitsauftrag hinzufügen - WaldmanagerApp -> DZ_Wald: speichern des Arbeitsauftrags - note over DZ_Wald #00FF00 - -> FM: Umring sollte optional sein, +Waldbesitzer -> WaldmanagerApp: UI-Aktion Arbeitsauftrag für Maßnahme erstellen +note over WaldmanagerApp + Umfang Arbeitsauftrag + * alle Pflichtfelder + * Sortimente + * ZuFaellendeBäume +end note +note over WaldmanagerApp #00FF00 +-> FM: Umring sollte optional sein, - Sortimente werden vom FM nicht unterstützt +Sortimente werden vom FM nicht unterstützt - nur Eingabe von zu fällenden Bäumen und empfangen/updaten des Auftragsstatus - oder "Abspecken" des Sortiments und/oder direkte Verlinkung mit Liste von Holzlisten? +nur Eingabe von zu fällenden Bäumen und empfangen/updaten des Auftragsstatus +oder "Abspecken" des Sortiments und/oder direkte Verlinkung mit Liste von Holzlisten? - Beispiel für Erstellung eines Arbeitsauftrags in demos/demo_example_finale +Beispiel für Erstellung eines Arbeitsauftrags in demos/demo_example_finale +end note +note over WaldmanagerApp #FF0000 +TODO: Klären mit Christian H. (Martin) +Unklar: Inwiefern hilft "Abgespeckte Variante des Sortiments"? +Vorschlag: +* In Waldmanager-UI nur Hinweis auf "Standard-Sortimente" anzeigen +* Im Hintergrund in die Nachricht an den DZ Wald ein vorbereiteten JSON-Ausschnitt reinkopieren +TODO: Klären mit Markus (Martin) +* Sinnhaftigkeit des Demo-Ablaufs überprüfen +* insb. "zu fällende Bäume zu Arbeitsauftrag hinzufügen" +end note +activate WaldmanagerApp +Waldbesitzer -> WaldmanagerApp: UI-Aktion zu fällende Bäume zu Arbeitsauftrag hinzufügen +Waldbesitzer -> WaldmanagerApp: UI-Aktion Arbeitsauftrag in DZ Wald speichern + WaldmanagerApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id}/submodel) mit neuem Submodel Arbeitsauftrag; submodel_id "s3i:{DZ Wald thingID}/Arbeitsauftrag" und BASE64 kodieren; inkl. Referenzierung von u.g. Holzliste-Submodel + activate DZ_Wald + DZ_Wald --> WaldmanagerApp: S3I-SetValueReply "ok" + deactivate DZ_Wald + note over WaldmanagerApp #FF0000 + eine leere Holzliste für Sortiment ??? im Arbeitsauftrag anlegen + TODO Markus welches Sortiment befüllen wir exemplarisch? end note + WaldmanagerApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id}/submodel) mit neuem Submodel Holzliste; submodel_id "s3i:{DZ Wald thingID}/Holzliste" und BASE64 kodieren activate DZ_Wald - DZ_Wald --> WaldmanagerApp: Fertig + DZ_Wald --> WaldmanagerApp: S3I-SetValueReply "ok" deactivate DZ_Wald deactivate WaldmanagerApp -Waldbesitzer -> WaldmanagerApp: Den Dienstleister die Maßnahme durchführen lassen +Waldbesitzer -> WaldmanagerApp: UI-Aktion "Dienstleister die Maßnahme durchführen lassen" +note over WaldmanagerApp #FF0000 + TODO (Christian H.) + * vorgefertigte Nachricht für Freigabe des Arbeitsauftrags und der leeren Holzliste - ok? + * (ggf. mit Auswahl eines Dienstleisters, sonst default) + TODO (Ahmed) + * Beispiel-Nachricht für Freigabe vorbereiten +end note activate WaldmanagerApp - WaldmanagerApp -> DZ_Wald: Zugriff auf Arbeitsauftrag und Holzliste für Dienstleister freigeben - activate DZ_Wald - DZ_Wald -> DienstleisterApp: Dienstleister benachrichtigen - note top - Autragsdaten übergeben - end note - activate DienstleisterApp - DZ_Wald --> WaldmanagerApp: Ok - deactivate DZ_Wald +WaldmanagerApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id für Autorisierung}/submodel/submodelElements/???) mit value o.g. vorbereitete Nachricht +note right #FF0000: TODO konkreten path nennen (Ahmed) +activate DZ_Wald +DZ_Wald -> DienstleisterApp: S3I-UserMessage "Sie haben eine neue Freigabe" +activate DienstleisterApp +DZ_Wald --> WaldmanagerApp: S3I-SetValueReply "ok" deactivate WaldmanagerApp +deactivate DZ_Wald -DienstleisterApp -> DZ_Wald: Abruf Arbeitsauftrag, Holzliste +Dienstleister -> DienstleisterApp: UI-Aktion "Arbeitsaufträge und Holzlisten abrufen" +DienstleisterApp -> DZ_Wald: S3I-GetValueRequest (path=GetAllSubmodelsBySemanticId als Path ?! + semantic id von Arbeitsauftrag) activate DZ_Wald -DZ_Wald --> DienstleisterApp: Arbeitsauftrag, Holzliste +note right #FF0000: TODO GetAllSubmodelsBySemanticId als path klären und umsetzen (Ahmed) +DZ_Wald --> DienstleisterApp: S3I-GetValueReply mit Liste von Arbeitsaufträgen mit einem Eintrag +DienstleisterApp -> DZ_Wald: S3I-GetValueRequest (path=GetAllSubmodelsBySemanticId als Path ?! + semantic id von Holzliste) +DZ_Wald --> DienstleisterApp: S3I-GetValueReply mit Liste von Holzlisten mit einem Eintrag (= leere Holzliste) deactivate DZ_Wald -DienstleisterApp -> Dienstleister: Dienstleister benachrichtigen +DienstleisterApp -> Dienstleister: UI-Info: "fertig" deactivate DienstleisterApp activate Dienstleister - loop n times - note over Dienstleister: z.B. Bäume fällen etc. - Dienstleister -> Dienstleister: Maßnahme durchführen (lassen) - end + Dienstleister -> Dienstleister: Maßnahme durchführen (lassen) note right: Erntemaßnahme außerhalb Projekt-Scope. + Dienstleister -> DienstleisterApp: UI-Aktion Holzliste ausfüllen + activate DienstleisterApp + Dienstleister -> DienstleisterApp: UI-Aktion Holzliste in DZ Wald speichern + DienstleisterApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id der einen Holzliste}/submodel) value= neuer Inhalt der Holzliste + activate DZ_Wald + DZ_Wald --> DienstleisterApp: S3I-SetValueReply "ok" + deactivate DZ_Wald + DienstleisterApp --> Dienstleister: UI-Info "Fertig" + deactivate DienstleisterApp - loop Holzaufnahme n times - Dienstleister -> DienstleisterApp: Maßnahme digital erfassen - note right:Auch von Waldbesitzer durchführbar - activate DienstleisterApp - DienstleisterApp -> DZ_Wald: Erstelle Holzliste - activate DZ_Wald - DZ_Wald --> DienstleisterApp: Fertig - deactivate DZ_Wald - DienstleisterApp --> Dienstleister: Fertig - deactivate DienstleisterApp - - note over Dienstleister - Auch innerhalb der - oberen Loop möglich - end note - end - -Dienstleister -> DienstleisterApp: Arbeitsauftrag abgeschlossen -deactivate Dienstleister +Dienstleister -> DienstleisterApp: UI-Aktion Arbeitsauftrag abgeschlossen +deactivate Dienstleister activate DienstleisterApp - DienstleisterApp -> DZ_Wald: Update Arbeitsauftrag (Status) -deactivate DienstleisterApp - +DienstleisterApp -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id des Arbeitsauftrags}/submodel/submodelElements/Auftragsstatus, value 150 ("Auftragsende") activate DZ_Wald - DZ_Wald -> DZ_Wald: Soll-Ist Vergleich gefälltes Holz - DZ_Wald -> WaldmanagerApp: Arbeitsauftrag abgeschlossen +DZ_Wald --> DienstleisterApp: S3I-SetValueReply "ok" +deactivate DienstleisterApp +DZ_Wald -> DZ_Wald: Soll-Ist Vergleich gefälltes Holz +DZ_Wald -> WaldmanagerApp: S3I-Event-Nachricht (path=/aas/submodels/{submodel_id des Submodells für Arbeitsauftrag}/submodel/submodelElements/Auftragsstatus, timestamp, neuer Wert 150 ("Auftragsende")) deactivate DZ_Wald activate WaldmanagerApp - WaldmanagerApp -> DZ_Wald: Zugriff für Dienstleister beenden - activate DZ_Wald - WaldmanagerApp <-- DZ_Wald: Ok - deactivate DZ_Wald - WaldmanagerApp -> Waldbesitzer: Arbeitsauftrag abgeschlossen +WaldmanagerApp -> Waldbesitzer: UI-Info Arbeitsauftrag abgeschlossen deactivate WaldmanagerApp == OPTIONAL: Preisangebote einholen (vor oder nach Einschlag) == @@ -149,7 +181,7 @@ Waldbesitzer -> WaldmanagerApp: Benutzer wählt in UI Holzliste und fordert Prei activate WaldmanagerApp WaldmanagerApp -> DZ_Wald: S3I-ServiceRequest an DZ Wald auf AAS Operation getHolzpreisbereich(Submodel-Id der Holzliste) activate DZ_Wald -DZ_Wald -> Holzhandelsplattform: REST Call GET: /api/v2/external/priceestimate +DZ_Wald -> Holzhandelsplattform: REST Call GET: /api/v2/external/priceestimate mit Body Holzliste JSON-serialisiert activate Holzhandelsplattform Holzhandelsplattform --> DZ_Wald: Forstify-proprietäres JSON mit allen Parametern für Holzpreisbereich deactivate Holzhandelsplattform @@ -165,14 +197,8 @@ note over DZ_Wald "Quelle": "Forstify Marktplatz Angebote" } end note -DZ_Wald -> DZ_Wald: Einlesen des prop. Forstify-JSON; Anlegen einer SMEC Holzpreisbereich in Submodel Holzpreisbereiche (ggf. Erzeugen); Verknüpfung mit zugehöriger Holzliste -DZ_Wald --> WaldmanagerApp: S3I-ServiceReply "ok" -note over DZ_Wald #FF0000 -TODO: Welches Rückgabeformat bevorzugt ForestManager? -end note -note over DZ_Wald #00FF00 --> FM: JSON wie oben OK -end note +DZ_Wald -> DZ_Wald: Einlesen des prop. Forstify-JSON; Anlegen einer SMEC Holzpreisbereich in Submodel Holzpreisbereiche (ggf. dieses Erzeugen); Verknüpfung mit zugehöriger Holzliste; Nutzung +DZ_Wald --> WaldmanagerApp: S3I-ServiceReply mit prop. Forstify-JSON deactivate DZ_Wald WaldmanagerApp --> Waldbesitzer: UI-Anzeige des Holzpreisbereichs in ForestManager deactivate WaldmanagerApp @@ -184,47 +210,43 @@ Dienstleister -> Holzhandelsplattform: S3I-Login 'Holzliste zum Verkauf veröffentlichen! activate Holzhandelsplattform activate Dienstleister - note over Dienstleister #FF0000 - TODO Autorisierung auf Basis der HMI der Person (=ThingID) oder der Person selbst (=PersonID)? - end note Dienstleister -> Holzhandelsplattform: Dienstleister wählt in UI von Forstify im Profil die Funktion "Alle Holzlisten von Wald des Waldbesitzers abrufen" note over Dienstleister Vollständig sauber müsste der Dienstleister an dieser Stelle über das S3I-Dir nach dem entsprechenden Waldbesitzer und dessen DZ Wald suchen und dann den richtigen auswählen. Aktuell hart verdrahtet. end note - note over Dienstleister #FF0000 - TODO attributePath für Abruf *aller* Holzlisten? Evtl. Suche nach allen SM mit bestimmter SemanticId möglich? - end note - Holzhandelsplattform -> DZ_Wald: S3I-GetValueRequest an DZ Wald mit + Holzhandelsplattform -> DZ_Wald: S3I-GetValueRequest (path=/aas/submodels/{submodel_id der einen Holzliste}/submodel) activate DZ_Wald - DZ_Wald --> Holzhandelsplattform: Holzlisten-Daten + DZ_Wald --> Holzhandelsplattform: S3I-GetValueReply mit Holzliste deactivate DZ_Wald - Holzhandelsplattform --> Dienstleister: Ok! - Dienstleister -> Holzhandelsplattform: Verkaufslose bilden, Preise etc. eingeben - Holzhandelsplattform -> Holzhandelsplattform: Verkauflose bilden - Holzhandelsplattform -> DZ_Wald: Put Verkaufslose, verknüpfe Holzlisten + Holzhandelsplattform --> Dienstleister: UI-Info: Ok! + Dienstleister -> Holzhandelsplattform: UI-Aktion: Verkaufslose bilden, Preise etc. eingeben + Holzhandelsplattform -> Holzhandelsplattform: Forstify-intern: Verkauflose bilden... + note over Holzhandelsplattform #FF0000 + TODO erstmal Button bauen der vorgefertigtes Verkauflos in DZ Wald schreibt (Forstify) + end note + Dienstleister -> Holzhandelsplattform: UI-Aktion: Speichern der Verkaufslose in DZ Wald + Holzhandelsplattform -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id}/submodel) mit neuem Submodel Verkauflos; submodel_id "s3i:{DZ Wald thingID}/Verkaufslos" und BASE64 kodieren; im Submodel Verkaufslos das Submodel Holzernte referenzieren activate DZ_Wald - DZ_Wald --> Holzhandelsplattform: Fertig + DZ_Wald --> Holzhandelsplattform: "ok" deactivate DZ_Wald - Holzhandelsplattform --> Dienstleister: Fertig + + Holzhandelsplattform --> Dienstleister: UI-Info: "gespeichert!" deactivate Dienstleister - Käufer <-> Holzhandelsplattform: Interaktion... + Käufer <-> Holzhandelsplattform: Verkaufslos wird verkauft... note right: Eigentlicher Abschluss außerhalb des Projekt-Scope. activate Käufer - Holzhandelsplattform -> DZ_Wald: Get Holzlistenstatus in Holzlisten + Holzhandelsplattform -> Holzhandelsplattform: Kontakt zwischen Käufer und Verkäufer hergestellt. Für Demo als "verkauft" einstufen und entsprechend an DZ Wald vermitteln + Holzhandelsplattform -> DZ_Wald: S3I-SetValueRequest (path=/aas/submodels/{submodel_id des Verkaufslos}/submodel/submodelElements/Verkaufsstatus) mit Wert 30 ("Verkauft") activate DZ_Wald - Holzhandelsplattform <-- DZ_Wald: Holzlistenstatus - deactivate DZ_Wald - note over WaldmanagerApp #00FF00 - -> FM: Möglichst einfach, keine Zeit mehr für Implementierung Verkaufslos - -> simple Benachrichtigung über Verkauf anzeigen + DZ_Wald --> Holzhandelsplattform: S3I-SetValueReply "ok" + DZ_Wald -> WaldmanagerApp: S3I-Event-Nachricht (path=/aas/submodels/{submodel_id des Submodells für Verkauflos}/submodel/submodelElements/Verkaufsstatus, timestamp, neuer Wert 30 ("Verkauft")) + note over DZ_Wald #FF0000 + TODO Event-Nachrichten-Format klären (Ahmed/Martin) end note - Holzhandelsplattform -> DZ_Wald: Update Verkaufsstatus in Verkaufslos - activate DZ_Wald - DZ_Wald -> WaldmanagerApp: Update Verkaufsstatus in Verkaufslos (Benachrichtigung / Event?) deactivate DZ_Wald activate WaldmanagerApp - WaldmanagerApp -> Dienstleister: Verkaufsstatus + WaldmanagerApp -> Waldbesitzer: UI-Info über Event-Nachricht "verkauft" deactivate WaldmanagerApp deactivate Käufer diff --git a/modellierung/holzliste.puml b/modellierung/holzliste.puml index 9fe5bec55ead535fef23963bed6d17f0d30a7cf0..a549c84c5240fda6a24cbb6b07e2ce6cd3fcc6f4 100644 --- a/modellierung/holzliste.puml +++ b/modellierung/holzliste.puml @@ -53,7 +53,7 @@ class Umring <<SubmodelElementCollection>>{ class Beobachtung <<Submodel>>{ Name: String [1] Beschreibung: String [1] - Umring: SEC.Umring [1] + Umring: SEC.Umring [0..1] Position: SEC.Standort [0..1] } @@ -146,7 +146,7 @@ Sortiment o--> "0..*" Holzliste ' Holzliste ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class Holzliste <<Submodel>>{ Kopfdaten: SEC.Kopfdaten [1] - PolterListe: SEList.SEC.Polter [1..*] + PolterListe: SEList.SEC.Polter [0..*] Sortimentstyp: ENUM.Sortimentstyp [1] 'z.B. Stammholz, Energieholz, Industrieholz, Sondersortimente Sorte: ENUM.Sorte [1]