Einen Arbeitsablauf einleiten
Attribute
- Vorlage: Name der Vorlage, für die der Workflow gelten soll
- Aufgaben einschließen: Wenn wahr, kann alles, was als Vorlage definiert ist, auch eine Aufgabe sein.
- Erforderlich: Nein
- Standardwert: True
Ausgabe
- WORKFLOW_EXTRAHIERT: Der Workflow wurde erfolgreich aus der angegebenen Vorlage extrahiert
- Payload:
wf_uri
kann als "wf" Bezeichner in der start_workflow Aktion verwendet werden
- WORKFLOW_EXTRACTION_ERROR: Es konnte kein Workflow aus der angegebenen Vorlage extrahiert werden
Hinweis: Diese Komponente ähnelt der Komponente Aufgabenbrowser, holt aber nur den mit der gegebenen Vorlage verbundenen Arbeitsablauf ab, anstatt ihn separat auszuführen.
Beispiel
Die Aktion kann wie folgt verwendet werden:
<get_workflow_from_template id="get_workflow_from_template">
<param name="template">NameOfTemplate</param>
</get_workflow_from_template>
Ergebnis Handhabung:
<rule id="extracted">
<expression><![CDATA[ #{event:command} == 'WORKFLOW_EXTRACTED']]></expression>
<actions>
<action id="start_workflow" type="start_workflow">
<param name="wf">#{event:payload.wf_uri}</param>
</action>
</actions>
</rule>
<rule id="extraction_error">
<expression><![CDATA[ #{event:command} == 'WORKFLOW_EXTRACTION_ERROR']]></expression>
<actions>
<finish_workflow id="finish_workflow">
<output>
<param name="wf_error" type="bool">true</param>
</output>
</finish_workflow>
</actions>
</rule>
Setvar
Setzt oder aktualisiert die Parameter eines Arbeitsablaufs oder eines Schritts.
Kennung: setvar
Elemente
- context_update: Eine Liste von Parametern, die gesetzt oder aktualisiert werden sollen.
- Erforderlich: Ja
- Standardwert: Leere Liste
- context_of: Legt den Kontextbereich fest, der aktualisiert werden soll. Standardmäßig wird der derzeit aktive Schritt aktualisiert.
- Standardwert: Schritt
- Mögliche Werte:
- Arbeitsablauf: Der aktuell aktive Schritt wird aktualisiert.
- Wurzel: Speichert den Wert so, dass er in jedem Arbeitsablauf bis zu Ihrem Stammarbeitsablauf zugänglich ist.
- Global: Erzeugt einen globalen Kontextwert, auf den von überall in der Anwendung zugegriffen werden kann
({global::my_value}
in direkten Referenzen oder appcontext.global.my_value
in Javascript). - Benutzer_Sitzung: Funktioniert ähnlich wie "global" (Zugriff mit
#{user_session::my_value}
), aber die Werte werden gelöscht, wenn sich der Benutzer abmeldet.
Beispiele
Minimal
<setvar id="increase_step">
<context_update>
<param name="current_step">#{current_step}+1</param>
</context_update>
</setvar>
Alle Optionen
<setvar id="next_step">
<context_of>root</context_of>
<context_update>
<param name="current_step_index" type="long">#{current_step}+1</param>
<param name="step" type="object">?{context.steps[context.current_step_index]}?</param>
</context_update>
</setvar>
Vermögenswerte herunterladen
Lädt ein oder mehrere angegebene Assets herunter.
Kennung: download_assets
Beispiel
<download_assets id="test">
<asset_uris>xai:/assets/hops_02?version=1</asset_uris>
</download_assets>
<download_assets id="test">
<list name="asset_uris" listType="UNNAMED">
<elem>xai:/assets/hops_02?version=1</elem>
<elem>xai:/assets/hops_01?version=1</elem>
<elem>xai:/assets/hops_03?version=1</elem>
</list>
</download_assets>
Zeitschaltuhr
Setzt einen Timer mit der Möglichkeit, bestimmte Verzögerungen und Zeiträume einzustellen. Die Periode oder der Timer endet, wenn sich der Schritt ändert.
Kennung: Timer
Attribute
- Befehl: Wird nach Ablauf der Timeout-Periode gesendet.
- Erforderlich: Ja
- Standardwert: Leer
- Verzögerung: Enthält die Zeit, nach der der Befehl gesendet wird.
- Erforderlich: Ja
- Standardwert: Leer
- Zeitraum: Enthält das Zeitintervall, nach dem der Befehl erneut gesendet werden soll.
- Erforderlich: Nein
- Standardwert: -1
Beispiel
Um einen Timer zu starten, der das REFRESH-Ereignis
beim ersten Mal nach 5 Sekunden (5000 ms) und danach alle 2 Sekunden (2000 ms) auslöst, könnten Sie dies verwenden:
<timer id="trigger_refresh" command="REFRESH" delay="5000" period="2000"/>
Rest Anfrage
Diese Aktion dient dazu, JSON-Daten über eine REST-API abzurufen. Sie unterstützt die Datenanforderungstypen POST und GET.
Kennung: rest_request
Attribute
- rest_url: Enthält die REST-API-URL.
- Mögliche Werte: REST-URL
- Erforderlich: Ja
- Beispiel:
"https://myfcc.com/sampledata/enginedata"
- request_type: Enthält den REST-Anfragetyp.
- Mögliche Werte: "POST", "GET"
- Erforderlich: Ja
- Beispiel:
"GET"
- wert_pfad: Enthält den Pfad zu dem JSON-Datenwert.
- Erforderlich: Ja
- Beispiel:
"$.rpm" //check Jayway JsonPath for more examples
- rest_params: Enthält die Parameter, die an den REST-Dienst übergeben werden sollen.
- Mögliche Werte: MAP
- Erforderlich: Nein
- Beispiel:
\<list name="rest_params"
listType="NAMED">
\<param name="serial"
type="string">1337\</param>
\</list>
- wiederholen_alle_ms: Enthält das Zeitintervall in Millisekunden, nach dem die Aktion neue Werte anfordert.
- Mögliche Werte: Integer
- Erforderlich: Ja
- Beispiel (für alle 5 Sekunden):
5000
- Nutzlast_pfad: Enthält einen optionalen Pfad, unter dem der empfangene Wert gespeichert werden kann. Wenn kein Pfad angegeben wird, wird der "sensor_value" verwendet.
- Mögliche Werte: String
- Erforderlich: Nein
- Beispiel:
"sensor_value"
Beispiele
Betrachten wir einen JsonPath mit der folgenden JSON-Struktur:
[{
"color"="blue",
"id"=87427,
"name"="Blueforce87427",
"position"={
"datetime"="2017-07-20T13: 58: 47.947513+02: 00",
"positionX"=2722,
"positionY"=2,
"positionZ"=3980
}
}{
"color"="red",
"id"=11111,
"name"="Opfor11111",
"position"={
"datetime"="2017-07-20T13: 58: 47.947513+02: 00",
"positionX"=3222,
"positionY"=232,
"positionZ"=4000
}
}]
Sie können die folgenden JsonPath-Zeichenfolgen
verwenden, um Daten vom Endpunkt abzurufen:
1. JsonPath:
$[0]['name']
1. Zurückgegebene Zeichenfolge:
Blueforce87427
2. JsonPath:
$[0]['position']
2. Zurückgegebene Zeichenfolge:
[{
"datetime"="2022-07-27T13:58:47.925260+02:00,
"positionX"=2722,
"positionY"= 2,
"positionZ"= 3980
}]
3. JsonPath:
$[*]
3. Zurückgegebene Zeichenfolge:
Whole array with both objects
Minimal
<rest_request id="my_rest_test0">
<param name="rest_url" type="string">https://alex.dev.ubimax.com/sampledata/enginedata</param>
<param name="request_type" type="string">POST</param>
<param name="value_path" type="string">$.rpm</param>
<list name="rest_params" listType="NAMED">
<param name="serial" type="string">1337</param>
</list>
</rest_request>
Alle Optionen
<rest_request id="my_rest_test0">
<param name="rest_url" type="string">https://alex.dev.ubimax.com/sampledata/enginedata</param>
<param name="request_type" type="string">POST</param>
<param name="value_path" type="string">$.rpm</param>
<param name="repeat_every_ms" type="string">5000</param>
<param name="payload_path" type="string">myPayload</param>
<list name="rest_params" listType="NAMED">
<param name="serial" type="string">1337</param>
</list>
</rest_request>
Commit-Nachricht senden
Sendet eine generische Nachricht mit anpassbaren Eigenschaften an den Frontline Connector. Diese werden über das Attribut DefaultInspectionRequestHandler.class
behandelt.
Kennung: send_commit_message
Attribute
- Typ: Enthält den Ereignistyp, auf den im Anschluss Frontline umgeschaltet werden soll.
- Mögliche Werte: String
- Erforderlich: Wahr
- Standardwert: Leer
- verbindungs_timeout: Enthält die Zeitüberschreitung in Sekunden.
- Mögliche Werte: numeric_value
- Erforderlich: False
- Standardwert: 50
- save_response: Enthält den Kontext, in dem die Antwort gespeichert werden soll.
- Mögliche Werte: Schritt, Arbeitsablauf
- Erforderlich: False
- Standardwert: Schritt
Elemente
- Bezeichner: Enthält die für Integrationsdienste verwendete ID (z. B. Task-ID).
- Erforderlich: False
- Standardwert: "" (leere Zeichenkette)
- Eigenschaften: Enthält die Sammlung der Parameter, die vom Integrationsdienst verwendet werden können.
- Erforderlich: False
- Standardwert: [] (leere Sammlung)
Hinweis: Eigenschaften werden intern in eine Map konvertiert und ihre Werte können eine Sammlung rekursiver Konvertierungen sein. Die endgültige Map wird als JSON-String im Payload-String der Nachricht gespeichert, und primitive Werte wie String, Numeric und Boolean werden im Feld für die Property-Map gespeichert. Dies macht die Nachricht bei der Kommunikation mit dem Integrationsdienst sehr flexibel.
Handhabung der Antwort
Beim Senden einer Commit-Nachricht gibt es drei mögliche Ergebnisse:
- Erfolg
- Zeitüberschreitung
- Fehler
Eine Zeitüberschreitung tritt auf, wenn nach der angegebenen Zeit keine Antwort eingegangen ist. Dies geschieht, weil die Nachricht im Netz verloren geht oder der Server zu viel Zeit für die Verarbeitung des Ergebnisses benötigt.
Ein Fehler bedeutet in diesem Fall in der Regel ein unerwartetes Verhalten, z. B. das Scheitern des Versands von Nachrichten aufgrund von Netzwerk- oder Serverfehlern. Die erwartete Fehlerbehandlung (z. B. die Behandlung eines ungültigen Zustands im Prozess) erfolgt durch eine erfolgreiche Antwort.
Alle Antworten erzeugen ein Eingabeereignis mit der Modalität send_commit_message
. Der Befehl ist einer von RESPONSE_OK, RESPONSE_TIMEOUT
oder RESPONSE_ERROR
.
Nachrichten enthalten ein Payload-Objekt
, das zusätzliche Daten für die Antwort enthält. Im Falle eines Fehlers
und einer Zeitüberschreitung
enthält die Nutzlast die Felder "type" und "identifier", die auf dieselben Werte wie in der Anfrage gesetzt sind. Dies kann verwendet werden, um bei Bedarf Fehler für bestimmte Anfragen zu identifizieren.
Im Erfolgsfall sind diese Felder nicht vorhanden, aber das Feld "Status" wird auf einen numerischen Wert gesetzt (definiert durch den Handler im Integrationsdienst). Dieser Wert kann verwendet werden, um Fehler zu behandeln, die im Prozess erwartet werden. In allen Fällen enthält das Feld "response" eine vom Integrationsdienst definierte Zeichenfolge, die zur weiteren Differenzierung der Antwort verwendet werden kann.
Zusätzlich zu den Status- und Antwortwerten kann der Integrationsdienst weitere Eigenschaften definieren, die mit dem Ereignis zurückgesendet werden. Diese Eigenschaften sind zum Zeitpunkt der Ereignisbehandlung als Kontextvariablen verfügbar. Ein Beispiel hierfür wäre das Zurücksenden einer Fehlermeldung vom Kunden-WMS zur Fehlerbehandlung oder zusätzlicher Informationen zur Verarbeitung der erfolgreichen Übergabe (siehe unten für Fragmente davon).
Beispiele
<send_commit_message id="pre_task_request" type="PRE_TASK_REQUEST" connection_timeout="600">
<properties>
<param name="group" type="string">#{group}</param>
<param name="aisle" type="string">#{aisle}</param>
</properties>
</send_commit_message>
<send_commit_message id="complete_inspection" type="COMPLETE_INSPECTION" connection_timeout="1500">
<param name="identifier">#{cockpit_id}</param>
</send_commit_message>
Der Wert für den Bezeichner kann nicht als Tag-Attribut festgelegt werden - dies sollte bei künftigen Iterationen des Erstellers möglich sein.
<send_commit_message id="send_asset_info" type="PHOTO" connection_timeout="60">
<properties>
<param name="asset_uri" type="string">#{event:payload.media_file}</param>
<param name="order_id" type="string">?{pickOrder.name}?</param>
<param name="group_id" type="string">?{pickOrder.groups[activeGroup].label}?</param>
<param name="customer_reference">?{pickOrder.groups[activeGroup].picks[0].article.customerReference}?</param>
<param name="amount" type="string">?{pickOrder.groups[activeGroup].picks[0].amountOpen}?</param>
</properties>
</send_commit_message>
Hochladen eines Bild-Assets und Senden einer Commit-Nachricht mit Informationen über das hochgeladene Asset
Dieser Beispielschritt erwartet lediglich einen Bild-Asset-URI (media_file) als Eingabe:
<step id="send_asset" uitemplate="WAIT" persist="false" screen_lock_enabled="false" debug_mode="false">
<actions>
<action id="upload_media" type="trigger_upload_asset">
<param name="asset_uri">#{media_file}</param>
<param name="delete_after_upload" type="bool">true</param>
<param name="upload_immediately" type="bool">true</param>
<param name="upload_immediately_delete_on_failure" type="bool">true</param>
</action>
<send_commit_message id="send_asset_info" type="PHOTO" connection_timeout="200">
<properties>
<param name="asset_uri" type="string">#{event:payload.asset_uri}</param>
<param name="asset_name" type="string">#{event:payload.asset_name}</param>
<param name="asset_version" type="string">#{event:payload.asset_version}</param>
</properties>
</send_commit_message>
<ui_notification id="show_nok" type="WARN">
<duration>SHORT</duration>
<message>Picture NOT OK</message>
</ui_notification>
<ui_notification id="show_upload_error" type="ERROR">
<duration>SHORT</duration>
<message>Media upload failed</message>
</ui_notification>
<ui_notification id="show_commit_error" type="ERROR">
<duration>SHORT</duration>
<message>Commit failed</message>
</ui_notification>
</actions>
<states>
<onresume>
<rule id="auto_exec">
<expression>1</expression>
<actions>
<action ref="upload_media"/>
</actions>
</rule>
</onresume>
<onevent>
<rule id="upload_ok">
<expression>
<![CDATA[#{event(trigger_upload_asset):command} == 'OK']]>
</expression>
<actions>
<action ref="send_asset_info"/>
</actions>
</rule>
<rule id="upload_error">
<expression>
<![CDATA[#{event(trigger_upload_asset):command} == 'ERROR' || #{event(trigger_upload_asset):command} == 'NETWORK_ERROR' || #{event(trigger_upload_asset):command} == 'INTERNAL_ERROR']]>
</expression>
<actions>
<action ref="show_upload_error"/>
<action ref="finish"/>
</actions>
</rule>
<rule id="commit_ok_ok">
<expression>
<![CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):payload.response} == 'OK']]>
</expression>
<actions>
<action ref="finish_workflow"/>
</actions>
</rule>
<rule id="commit_ok_nok">
<expression>
<![CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):payload.response} != 'OK']]>
</expression>
<actions>
<action ref="show_nok"/>
<action ref="goto_take_picture"/>
</actions>
</rule>
<rule id="commit_error_or_timeout">
<expression>
<![CDATA[#{event(send_commit_message):command} == 'RESPONSE_ERROR' || #{event(send_commit_message):command} == 'RESPONSE_TIMEOUT']]>
</expression>
<actions>
<action ref="show_commit_error"/>
<action ref="goto_take_picture"/>
</actions>
</rule>
</onevent>
</states>
</step>
Handhabung mit benutzerdefiniertem Fehlerstatus
<actions>
<!-- dialog references variables set by the commit message response for error handling -->
<ui_dialog id="sap_error" type="Error" title="Error">
<message><![CDATA[#{sap_message}<br>Continue to '#{sap_material}/#{sap_position}'?]]></message>
<buttons>
<button>
<text>ANDRRES_fw</text>
<command>SAP_FIX</command>
<focused>true</focused>
</button>
<button>
<text>ANDRRES_bw</text>
<command>DO_NOT_TRY_AGAIN</command>
</button>
</buttons>
</ui_dialog>
<!-- more actions
[...]
-->
</actions>
<!-- more WF code
[...]
-->
<onevent>
<!-- Technical success but check for SAP response -->
<rule id="success">
<expression><![CDATA[#{event:command} == 'RESPONSE_OK' && #{event:payload.status} == 0 ]]></expression>
<actions>
<ui_notification id="show_done" type="INFO">
<duration>SHORT</duration>
<message>#{cockpit_id} completed...</message>
</ui_notification>
<action ref="close_ds_task"/>
<action ref="finish_workflow"/>
</actions>
</rule>
<rule id="sap_error_in_success">
<expression><![CDATA[#{event:command} == 'RESPONSE_OK' && #{event:payload.status} == 500 ]]></expression>
<actions>
<!-- variables are automatically set when the event is handled and can be used in the action -->
<action ref="sap_error"/>
</actions>
</rule>
<rule id="unknown_error_in_success">
<expression><![CDATA[#{event:command} == 'RESPONSE_OK' && #{event:payload.status} != 0 && #{event:payload.status} != 500 ]]></expression>
<actions>
<action ref="completion_error"/>
</actions>
</rule>
<rule id="request_error">
<expression><![CDATA[#{event:command} == 'RESPONSE_ERROR']]></expression>
<actions>
<action ref="completion_error"/>
</actions>
</rule>
<rule id="request_timeout">
<expression><![CDATA[#{event:command} == 'RESPONSE_TIMEOUT']]></expression>
<actions>
<action ref="completion_error"/>
</actions>
</rule>
</onevent>
MQTT-Beispiel
<send_commit_message id="send_mqtt" type="FRONTLINE_MQTT" connection_timeout="200">
<properties>
<param name="mqtt" type="string"><![CDATA[?{
var mqtt = {
topic: "MY/TOPIC",
content: "MY CONTENT"
};
var stringmqtt = JSON.stringify(mqtt);
stringmqtt;}?]]>
</param>
</properties>
</send_commit_message>
Seite des Abfertigers
Hier ist ein Beispiel für die Handhabung des Codes im Konnektor innerhalb des Request-Handlers "Inspection".
@Override
public CommitMessageResponse handleCommitMessage(CommitMessage aCommit) {
if("COMPLETE_INSPECTION".equals(aCommit.getType())) {
String evaluation = aCommit.getIdentifier();
// HANDLE EVENT
// [CODE]
if(isSuccess) {
log.info("Completion success!");
return new CommitMessageResponse(aCommit, 0, "Success!");
}
// HANDLE ERROR
CommitMessageResponse cmr = new CommitMessageResponse(aCommit, 500, "SAP Error!");
cmr.addProperties("sap_message", cr.getMessage()); // 'cr' is an object specific to the custom code
cmr.addProperties("sap_material", cr.getMaterial());
cmr.addProperties("sap_position", cr.getPosition());
return cmr;
}
// OTHER MESSAGES
Die im Fehlerfall hinzugefügten Eigenschaften stehen dem Workflow zur Verfügung, wenn das Ereignis behandelt wird.
Anhang hinzufügen
Fügt eine Anlage zu den Aufgabenergebnissen des aktuellen Schritts hinzu.
Kennung: add_attachment
Hinweis: Sie müssen die Berichterstattung für Ihre Komponente im Workflow-Tag aktivieren. Andernfalls wird die Aktion keine Wirkung haben. Hier ist ein Beispiel, wie Sie dies tun können: <workflow [...] reporting="true"></workflow>
Elemente
- Typ: Enthält die Art der Anlage, die Sie dem Aufgabenergebnis hinzufügen möchten.
- Erforderlich: Ja
- Standardwert: Leer
- Inhalt: Enthält den Inhalt, den Sie dem Aufgabenergebnis hinzufügen möchten.
- Erforderlich: False
- Standardwert: Leer
- überschreiben: Enthält den Wert, der bereits mit dem angegebenen Typ gespeichert ist, wird ersetzt.
- Erforderlich: Nein
- Standardwert: True
Standardtypen
- Vermögen
- Barcode-Inhalt
- dokumentation-kommentar
- Kommentar
- Frage (wird von der Komponente "Fragebogen" zum Speichern der vollständigen Frage verwendet)
- selected-answers (wird von der Komponente "Fragebogen" zum Speichern ausgewählter Antworten verwendet)
Hinweis: Sie können auch Ihren eigenen Typ festlegen.
Beispiel
Minimal
<add_attachment id="add_attachment">
<param name="type" type="string">documentation-comment</param>
<param name="content" type="string">#{current_comment}</param>
</add_attachment>
Alle Optionen
<add_attachment id="document_barcode">
<param name="type" type="string">barcode-content</param>
<param name="content" type="string">#{code}</param>
<param name="override" type="bool">false</param>
</add_attachment>
Inhalt des Anhangs abrufen
Ruft den zuletzt hinzugefügten Anhang für einen bestimmten Anhangsdatentyp ab.
Kennung: get_attachment_content
Elemente
- Typ: Enthält die Art des Anhangs, den Sie aus den Anhängen abrufen möchten.
- Erforderlich: Ja
- Standardwert: Leer
- schreiben_an: Enthält den Namen der Variablen, in der Sie den abgerufenen Anhangsinhalt speichern möchten.
- Erforderlich: Ja
- Standardwert: Leer
- write_if_empty: Speichert den empfangenen Wert. Wenn in der angegebenen Variablen bereits ein Wert vorhanden ist, werden die Daten überschrieben.
- Erforderlich: Nein
- Standardwert: True
Standardtypen
- Vermögen
- Barcode-Inhalt
- dokumentation-kommentar
- Kommentar
- Frage (wird von der Komponente "Fragebogen" zum Speichern der vollständigen Frage verwendet)
- selected-answers (wird von der Komponente "Fragebogen" zum Speichern ausgewählter Antworten verwendet)
Hinweis: Sie haben auch die Möglichkeit, einen eigenen Anlagentyp hinzuzufügen, wenn er nicht bereits in der Liste der verfügbaren Typen enthalten ist.
Beispiele
Minimal
<get_attachment_content id="get_attachment_content">
<param name="type" type="string">documentation-comment</param>
<param name="write_to" type="string">current_comment</param>
</get_attachment_content>
Alle Optionen
<get_attachment_content id="get_attachment_content">
<param name="type" type="string">documentation-comment</param>
<param name="write_to" type="string">current_comment</param>
<param name="write_if_empty" type="bool">true</param>
</get_attachment_content>
Modul Zustand
Wird verwendet, um den Status eines Moduls zu ändern. Zum Beispiel können Sie damit die Spracheingabeerkennung deaktivieren.
Kennung: module_state
Attribute
- module_name: Der Name des Moduls
- Mögliche Werte:
- de.ubimax.andriod.speechrecognition.SpeechRecognitionModule
- de.ubimax.andriod.client.output.SoundManager
- de.ubimax.andriod.core.gps.GeoModule
- de.ubimax.andriod.core.output.sound.TextToSpeechManager
- Erforderlich: False
- module_state: Der Zustand, den das Modul einnehmen soll
- Mögliche Werte:
- init
- zerstören
- stoppen
- Pause
- Lebenslauf
- Start
- Erforderlich: Wahr
Beispiel
<module_state id="resume_speech" module_name="de.ubimax.android.speechrecognition.SpeechRecognitionModule" change_state_to="resume"/>
<module_state id="pause_speech" module_name="de.ubimax.android.speechrecognition.SpeechRecognitionModule" change_state_to="pause"/>
Abmelden
Meldet den Client ab.
Kennung: logoff
Beispiel
<logoff id="myaction"/>