Sendet eine generische Nachricht an den Frontline Connector, mit anpassbaren Eigenschaften. Diese werden mit dem Attribut "DefaultInspectionRequestHandler.class" behandelt.
Kennung: send_commit_message
Attribute
Typ: Der Ereignistyp, auf den umgeschaltet werden soll, im Anschluss Frontline
Mögliche Werte: String
- Erforderlich: true
- Standardwert: -
Verbindung_timeout: Zeitüberschreitung in Sekunden
Mögliche Werte: numeric_value
- Erforderlich: false
- Standardwert: 50
save_response: Kontext, in dem die Antwort gespeichert wird
Mögliche Werte: Schritt, Workflow
- Erforderlich: false
- Standardwert: Schritt
Elemente
Bezeichner: Die für Integrationsdienste verwendete ID (z. B. Task-ID).
- Erforderlich: false
- Standardwert: " " (Leere Zeichenfolge)
Eigenschaften: Sammlung von Parametern, die vom Integrationsdienst verwendet werden können.
- Erforderlich: false
- Standardwert: [ ] (leere Sammlung)
Eigenschaften werden intern in eine Map umgewandelt und ihr Wert kann eine Sammlung rekursiver Umwandlungen 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 Map-Feld der Eigenschaften gespeichert. Dies macht die Nachricht bei der Kommunikation mit dem Integrationsdienst sehr flexibel.
Antwort Handhabung
Beim Senden einer Commit-Nachricht gibt es drei mögliche Ergebnisse:
- Erfolg
- Zeitüberschreitung
- Fehler
Eine Zeitüberschreitung tritt auf, wenn nach einer bestimmten 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.
Fehler bedeutet in diesem Fall in der Regel ein unerwartetes Verhalten, z. B. dass Nachrichten aufgrund von Netzwerk- oder Serverfehlern nicht gesendet werden können.
Die erwartete Fehlerbehandlung (z. B. die Behandlung eines ungültigen Zustands im Prozess usw.) erfolgt über eine erfolgreiche Antwort.
Alle Antworten erzeugen ein Eingabeereignis mit der Modalität "send_commit_message". Der Befehl ist einer von RESPONSE_OK, RESPONSE_TIMEOUT und 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 gesetzt sind, die in der Anfrage verwendet wurden. 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 Fehlerfälle zu behandeln, die im Prozess erwartet werden.
In allen Fällen enthält das Feld Antwort eine vom Integrationsdienst definierte Zeichenfolge, die zur weiteren Unterscheidung 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 ist 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>
Bild-Asset hochladen und eine Commit Message mit Informationen über das hochgeladene Asset senden
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 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.