wf_uri
peut être utilisé comme identifiant « wf » dans l’action start_workflowNote: Il est similaire au composant Explorateur de tâches , mais récupère uniquement le flux de travail associé au modèle donné, plutôt que de l’exécuter séparément.
L’action peut être utilisée comme suit :
<get_workflow_from_template id="get_workflow_from_template"> <param name="template">NameOfTemplate</param> </get_workflow_from_template>
Gestion des résultats :
<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 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>
Définit ou met à jour les paramètres d’un workflow ou d’une étape.
Identifiant : setvar
{global::my_value}
références directes ou appcontext.global.my_value
en Javascript).#{user_session::my_value}
), mais les valeurs seront supprimées lorsque l’utilisateur se déconnectera.Minimal
<setvar id="increase_step"> <context_update> <param name="current_step">#{current_step}+1</param> </context_update> </setvar>
Toutes les options
<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>
Télécharge une ou plusieurs ressources spécifiées.
Identifiant : download_assets
<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>
Définit une minuterie avec la possibilité de définir des délais et des périodes spécifiques. La période ou le minuteur se termine lorsque l’étape change.
Identifiant : timer
Pour démarrer un minuteur qui déclenche l’événement REFRESH
après 5 secondes (5000 ms) la première fois et ensuite toutes les 2 secondes (2000 ms), vous pouvez utiliser ceci :
<timer id="trigger_refresh » command="REFRESH » delay="5000 » period="2000"/>
Cette action est conçue pour récupérer des données JSON via une API REST. Il prend en charge les types de demande de données POST et GET.
Identifiant : rest_request
« https://myfcc.com/sampledata/enginedata »
« OBTENIR »
« $.rpm » //consultez Jayway JsonPath pour plus d’exemples
\<list name="rest_params" listType="NAMED"> \<param name="serial" type="string">1337\</param> \</list>
5000
« sensor_value »
Considérons un JsonPath étant donné la structure JSON suivante :
[{ "color"="bleu », "id"=87427, "name"="Blueforce87427 », "position"={ "datetime"="2017-07-20T13 : 58 : 47.947513+02 : 00 », "positionX"=2722, "positionY"=2, "positionZ"=3980 } }{ "color"="rouge », "id"=11111, "name"="Opfor11111 », « position"={ "datetime"="2017-07-20T13 : 58 : 47.947513+02 : 00 », "positionX"=3222, "positionY"=232, "positionZ"=4000 } }]
Vous pouvez utiliser les chaînes suivantes JsonPath
pour récupérer des données à partir du point de terminaison :
1. JsonPath :
$[0]['nom']
2. Chaîne retournée :
Par Blueforce87427
3. JsonPath :
$[0]['position']
4. Chaîne retournée :
[{ "datetime"="2022-07-27T13 :58 :47.925260+02 :00, "positionX"=2722, "positionY"= 2, "positionZ"= 3980 }]
5. JsonPath :
$[*]
6. Chaîne renvoyée :
Tableau complet avec les deux objets
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>
Toutes les options
<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>
Envoie un message générique avec des propriétés personnalisables au connecteur Frontline. Ceux-ci sont gérés via l’attribut DefaultInspectionRequestHandler.class
.
Identifiant : send_commit_message
Remarque : Les propriétés sont converties en interne en carte et leurs valeurs peuvent être une collection de conversions récursives. La carte finale est stockée sous la forme d’une chaîne JSON dans la chaîne de charge utile du message et les valeurs primitives telles que la chaîne, la valeur numérique et la valeur booléenne sont stockées dans le champ de la carte des propriétés . Cela rend le message très flexible lors de la communication avec le service d’intégration.
Il existe trois résultats possibles lors de l’envoi d’un message de validation :
Un délai d’attente se produit lorsqu’aucune réponse n’est reçue après le délai spécifié. Cela se produit parce que le message se perd dans le réseau ou que le serveur nécessite trop de temps pour traiter le résultat.
Dans ce cas, une erreur signifie généralement un comportement inattendu tel que l’échec de l’envoi de messages en raison d’erreurs réseau ou d’erreurs de serveur. La gestion des erreurs attendues (par exemple, la gestion d’un état non valide dans le processus) se fait via une réponse réussie.
Toutes les réponses génèrent un événement d’entrée avec la send_commit_message
modalité. La commande est l’une des suivantes RESPONSE_OK, RESPONSE_TIMEOUT
: ou RESPONSE_ERROR
.
Les messages contiennent un objet qui contient des payload
données supplémentaires pour la réponse. Dans le cas de error
et timeout
, la charge utile contient les champs « type » et « identifiant » définis sur les mêmes valeurs que celles utilisées dans la requête. Cela peut être utilisé pour identifier les erreurs pour des demandes spécifiques si nécessaire.
Dans le cas d’un succès, ces champs ne sont pas présents mais le champ « status » est défini sur une valeur numérique (définie par le gestionnaire dans le service d’intégration). Cette valeur peut être utilisée pour gérer les cas d’erreur attendus dans le processus. Dans tous les cas, le champ « réponse » contient une chaîne définie par le service d’intégration qui peut être utilisée pour différencier davantage la réponse.
En plus des valeurs d’état et de réponse, le service d’intégration peut définir des propriétés supplémentaires à renvoyer avec l’événement. Ces propriétés sont disponibles en tant que variables de contexte au moment de la gestion de l’événement. Un exemple de ceci serait le renvoi d’un message d’erreur à partir du WMS client pour la gestion des erreurs ou des informations supplémentaires pour traiter la validation réussie (voir ci-dessous pour des fragments de celui-ci).
<send_commit_message id="pre_task_request » type="PRE_TASK_REQUEST » connection_timeout="600"> <properties> <param name="groupe » type="chaîne">#{groupe}</param> <param name="aisle » type="chaîne">#{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>
La valeur de l’identificateur n’est pas valide pour être définie en tant qu’attribut de balise – cela devrait être possible avec les futures itérations du créateur.
<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>
Cet exemple d’étape attend simplement un URI de ressource d’image (media_file) en entrée :
<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>Image NON 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>Échec de la validation</ 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) :commande} == 'ERREUR' || #{event(trigger_upload_asset) :commande} == 'NETWORK_ERROR' || #{event(trigger_upload_asset) :commande} == 'INTERNAL_ERROR']]> </expression> < actions> <action ref="show_upload_error"/> <action ref="finish"/> </actions> </règle> <rule id="commit_ok_ok"> <expression> <! [CDATA[#{event(send_commit_message) :command} == 'RESPONSE_OK' && #{event(send_commit_message):p ayload.response} == 'OK']]> </expression> < actions> <action ref="finish_workflow"/> </actions> </règle> <id de règle="commit_ok_nok"> <expression> <! [CDATA[#{event(send_commit_message) :command} == 'RESPONSE_OK' &&& #{event(send_commit_message):p ayload.response} != 'OK']]> </expression> < actions> <action ref="show_nok"/> <action ref="goto_take_picture"/> </actions> </règle> <id de règle="commit_error_or_timeout"> <expression> <! [CDATA[#{event(send_commit_message) :commande} == 'RESPONSE_ERROR' || #{event(send_commit_message) :commande} == 'RESPONSE_TIMEOUT']]> </expression> < actions> <action ref="show_commit_error"/> <action ref="goto_take_picture"/> </actions> </règle> </sur l’événement> </états> </étape>
<actions> <!-- boîte de dialogue fait référence aux variables définies par la réponse du message de validation pour la gestion des erreurs --> <ui_dialog id="sap_error » type="Erreur » title="Erreur"> <message>< ![ CDATA[#{sap_message}<br>Continuer vers '#{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> <!-- plus d’actions [...] --> </actions> <!-- plus de code WF[...] --> <onevent> <!-- Succès technique mais vérification de la réponse SAP --> <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} terminé... </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 variables ]]></expression> <actions> <!-- sont automatiquement définies lors de la gestion de l’événement et peuvent être utilisées dans l’action --> <action ref="sap_error"/> </actions> </rule> <rule id="unknown_error_in_success"> < l’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> </règle> </sur l’événement>
<send_commit_message id="send_mqtt » type="FRONTLINE_MQTT » connection_timeout="200"> <properties> <param name="mqtt » type="string">< ![ CDATA[ ?{ var mqtt = { topic : « MON/SUJET », content : « MON CONTENU" } ; var stringmqtt = JSON.stringify(mqtt) ; stringmqtt ;} ?]] > </param> </properties> </send_commit_message>
Voici un exemple de gestion du code dans le connecteur, à l’intérieur du gestionnaire de requêtes « Inspection ».
@Override public CommitMessageResponse handleCommitMessage(CommitMessage aCommit) { if(« COMPLETE_INSPECTION ».equals(aCommit.getType())) { String evaluation = aCommit.getIdentifier() ; HANDLE EVENT // [CODE] if(isSuccess) { log.info(« Achèvement réussi ! ») ; return new CommitMessageResponse(aCommit, 0, « Succès ! ») ; } HANDLE ERROR CommitMessageResponse cmr = new CommitMessageResponse(aCommit, 500, « Erreur SAP ! ») ; cmr.addProperties(« sap_message », cr.getMessage()) ; 'cr' est un objet spécifique au code personnalisé cmr.addProperties(« sap_material », cr.getMaterial()) ; cmr.addProperties(« sap_position », cr.getPosition()) ; return cmr ; } AUTRES MESSAGES
Les propriétés ajoutées dans le cas d’erreur seront disponibles pour le workflow lorsque l’événement sera géré.
Ajoute une pièce jointe aux résultats de la tâche de l’étape en cours.
Identifiant : add_attachment
Remarque : Vous devez activer la création de rapports pour votre composant dans la balise de workflow. Dans le cas contraire, l’action n’aura aucun effet. Voici un exemple de la façon dont vous pouvez le faire : <workflow [...] reporting="true"></workflow>
Note: Vous pouvez également définir votre propre type.
Minimal
<add_attachment id="add_attachment"> <param name="type » type="string">documentation-comment</param> <param name="content » type="string">#{current_comment}</param> </add_attachment>
Toutes les options
<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>
Récupère la dernière pièce jointe ajoutée pour un type de données de pièce jointe particulier.
Identifiant : get_attachment_content
Note: Vous avez également la possibilité d’ajouter votre propre type de pièce jointe s’il ne figure pas déjà dans la liste des types disponibles.
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>
Toutes les options
<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>
Permet de modifier l’état d’un module. Par exemple, vous pouvez l’utiliser pour désactiver la reconnaissance vocale.
Identifiant : module_state
<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"/>
Déconnecte le client.
Identifiant : logoff
<logoff id="myaction"/>