Lancer un workflow

Attributs

  • template : Nom du modèle dont nous voulons le workflow
    • Requis : Oui
  • include_tasks : Si la valeur est true, tout ce qui est défini comme un modèle peut également être une tâche
    • Obligatoire : Non
    • Valeur par défaut : True

Sortie

  • WORKFLOW_EXTRACTED : Le flux de travail a été extrait avec succès du modèle donné
    • Charge utile : wf_uri peut être utilisé comme identifiant « wf » dans l’action start_workflow
  • WORKFLOW_EXTRACTION_ERROR : Aucun workflow n’a pu être extrait du modèle donné

Note: 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. 

Exemple

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>

Setvar

Définit ou met à jour les paramètres d’un workflow ou d’une étape.

Identifiant : setvar

Éléments

  • context_update : Liste des paramètres qui doivent être définis ou mis à jour.
    • Requis : Oui
    • Valeur par défaut : Liste vide
  • context_of : définit la portée du contexte qui doit être mise à jour. Par défaut, l’étape actuellement active est mise à jour.
    • Obligatoire : Non
  • Valeur par défaut : Step
  • Valeurs possibles :
    • Workflow : l’étape active en cours sera mise à jour.
    • Racine : enregistre la valeur d’une manière accessible dans n’importe quel flux de travail vers votre flux de travail racine.
    • Global : Crée une valeur de contexte global accessible depuis n’importe quel endroit de l’application ({global::my_value} références directes ou appcontext.global.my_value en Javascript).
    • User_session : Fonctionne de la même manière que « global » (accès avec #{user_session::my_value}), mais les valeurs seront supprimées lorsque l’utilisateur se déconnectera.

Exemples

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écharger les ressources

Télécharge une ou plusieurs ressources spécifiées.

Identifiant : download_assets

Exemple

<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>

Minuteur

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

Attributs

  • command : Ceci est envoyé après la fin du délai d’expiration.
    • Requis : Oui
    • Valeur par défaut : vide
  • delay : contient le temps après lequel la commande est envoyée.
    • Requis : Oui
    • Valeur par défaut : vide
  • period : contient l’intervalle de temps après lequel la commande doit être envoyée à nouveau.
    • Obligatoire : Non
    • Valeur par défaut : -1

Exemple

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"/>

Demande de repos

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

Attributs

  • rest_url : contient l’URL DE L’API REST.
    • Valeurs possibles : URL REST
    • Requis : Oui
    • Exemple:
« https://myfcc.com/sampledata/enginedata »
  • request_type : contient le type de requête REST.
    • Valeurs possibles : « POST », « GET »
    • Requis : Oui
    • Exemple:
« OBTENIR »
  • value_path : contient le chemin d’accès à la valeur de données JSON.
    • Requis : Oui
    • Exemple:
« $.rpm » //consultez Jayway JsonPath pour plus d’exemples
  • rest_params : contient les paramètres qui doivent être transmis au service REST.
    • Valeurs possibles : MAP
    • Obligatoire : Non
    • Exemple:
\<list name="rest_params"
listType="NAMED">

\<param name="serial"
type="string">1337\</param>
\</list>
  • repeat_every_ms : contient l’intervalle de temps en millisecondes après lequel l’action demande de nouvelles valeurs.
    • Valeurs possibles : Integer
    • Requis : Oui
    • Exemple (toutes les 5 secondes) :
5000
  • payload_path : contient un chemin facultatif dans lequel la valeur reçue peut être stockée. Si aucun chemin n’est donné, le « sensor_value » sera utilisé.
    • Valeurs possibles : String
    • Obligatoire : Non
    • Exemple:
« sensor_value »

Exemples

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>

Envoyer un message de validation

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

Attributs

  • type : contient le type d’événement à basculer dans le connecteur Frontline.
    • Valeurs possibles : String
    • Obligatoire : Vrai
    • Valeur par défaut : Vide
  • connection_timeout : contient le délai d’expiration en secondes.
    • Valeurs possibles : numeric_value
    • Obligatoire : Faux
    • Valeur par défaut : 50
  • save_response : contient le contexte dans lequel enregistrer la réponse.
    • Valeurs possibles : Étape, Workflow
    • Obligatoire : Faux
    • Valeur par défaut : Step

Éléments

  • identificateur : contient l’ID utilisé pour les services d’intégration (par exemple, l’ID de tâche).
    • Obligatoire : Faux
    • Valeur par défaut : «  » (chaîne vide)
  • properties : contient l’ensemble des paramètres qui peuvent être utilisés par le service d’intégration.
  • Obligatoire : Faux
  • Valeur par défaut : [] (collection vide)

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.

Gestion des réponses

Il existe trois résultats possibles lors de l’envoi d’un message de validation :

  • Succès
  • Timeout 
  • Erreur

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).

Exemples

<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>

Chargement d’une ressource d’image et envoi d’un message de validation contenant des informations sur la ressource téléchargée

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>

Gestion avec statut d’erreur personnalisé

<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>

Exemple MQTT

<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>

Côté manutentionnaire

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é.

Ajouter une pièce jointe

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>

Éléments

  • type : contient le type de pièce jointe que vous souhaitez ajouter au résultat de la tâche.
    • Requis : Oui
    • Valeur par défaut : Vide
  • content : contient le contenu que vous souhaitez ajouter au résultat de la tâche.
    • Obligatoire : Faux
    • Valeur par défaut : Vide
  • override : Contient la valeur qui est déjà enregistrée avec le type donné est remplacé.
    • Obligatoire : Non
    • Valeur par défaut : True

Types par défaut

  • atout
  • contenu du code-barres
  • documentation-commentaire
  • commentaire
  • question (utilisée par le composant « Questionnaire » pour enregistrer la question complète)
  • selected-answers (utilisé par le composant « Questionnaire » pour enregistrer les réponses sélectionnées)

Note: Vous pouvez également définir votre propre type.

Exemple

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>

Obtenir le contenu des pièces jointes

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

Éléments

  • type : contient le type de pièce jointe que vous souhaitez récupérer à partir des pièces jointes.
    • Requis : Oui
    • Valeur par défaut : Vide
  • write_to : contient le nom de la variable dans laquelle vous souhaitez stocker le contenu de la pièce jointe récupérée.
    • Requis : Oui
    • Valeur par défaut : Vide
  • write_if_empty : Enregistre la valeur reçue. Si une valeur existante existe dans la variable donnée, les données seront écrasées.
    • Obligatoire : Non
    • Valeur par défaut : True

Types par défaut

  • atout
  • contenu du code-barres
  • documentation-commentaire
  • commentaire
  • question (utilisée par le composant « Questionnaire » pour enregistrer la question complète)
  • selected-answers (utilisé par le composant « Questionnaire » pour enregistrer les réponses sélectionnées

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.

Exemples

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>

État du module

Permet de modifier l’état d’un module. Par exemple, vous pouvez l’utiliser pour désactiver la reconnaissance vocale.

Identifiant : module_state

Attributs

  • module_name : Le nom du module
  • Valeurs possibles :
    • de.ubimax.andriod.speechrecognition.SpeechRecognitionModule
    • de.ubimax.andriod.client.output.SoundManager
    • de.ubimax.andriod.core.gps.GeoModule
    • de.ubimax.andriod.core.output.sound.TextToSpeechManager
    • Obligatoire : Faux
  • change_state_to : l’état dans lequel le module est censé entrer
    • Valeurs possibles :
      • Init
      • détruire
      • arrêter
      • pause
      • reprendre
      • commencer
    • Obligatoire : Vrai

Exemple

<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"/>

Se déconnecter

Déconnecte le client.

Identifiant : logoff

Exemple

<logoff id="myaction"/>