Iniciar un flujo de trabajo

Atributos

  • template: Nombre de la plantilla de la que queremos el flujo de trabajo
    • Obligatorio: Sí
  • include_tasks: Si es cierto, lo que se define como una plantilla también podría ser una tarea
    • Obligatorio: No
    • Valor predeterminado: True

Salida

  • WORKFLOW_EXTRACTED: El flujo de trabajo se extrajo correctamente de la plantilla dada
    • Carga útil: wf_uri se puede utilizar como identificador "wf" en la acción start_workflow
  • WORKFLOW_EXTRACTION_ERROR: No se pudo extraer ningún flujo de trabajo de la plantilla dada

Nota: Esto es similar al componente Explorador de tareas , pero solo recupera el flujo de trabajo asociado con la plantilla dada, en lugar de ejecutarlo por separado. 

Ejemplo

La acción se puede utilizar de la siguiente manera:

<get_workflow_from_template id="get_workflow_from_template">
  <param name="template">NameOfTemplate</param>
</get_workflow_from_template>

Manejo de resultados:

<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

Establece o actualiza los parámetros de un flujo de trabajo o un paso.

Identificador: setvar

Elementos

  • context_update: Una lista de parámetros que deben establecerse o actualizarse.
    • Obligatorio: Sí
    • Valor predeterminado: Lista vacía
  • context_of: Define el ámbito de contexto que se debe actualizar. De forma predeterminada, se actualizará el paso actualmente activo.
    • Obligatorio: No
  • Valor predeterminado: Paso
  • Valores posibles:
    • Flujo de trabajo: Se actualizará el paso activo actual.
    • Raíz: guarda el valor de forma que sea accesible en cualquier flujo de trabajo hasta el flujo de trabajo raíz.
    • Global: crea un valor de contexto global al que se puede acceder desde cualquier lugar de la aplicación ({global::my_value} en referencias directas o appcontext.global.my_value en Javascript).
    • User_session: Funciona de manera similar a "global" (acceso con #{user_session::my_value}), pero los valores se eliminarán cuando el usuario cierre sesión.

Ejemplos

Mínimo

<setvar id="increase_step">
    <context_update>
        <param name="current_step">#{current_step}+1</param>
    </context_update>
</setvar>

Todas las opciones

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

Descargar recursos

Descarga uno o varios recursos especificados.

Identificador: download_assets

Ejemplo

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

Temporizador

Establece un temporizador con la opción de establecer retrasos y períodos específicos. El período o el temporizador finaliza cuando cambia el paso.

Identificador: temporizador

Atributos

  • comando: Se envía después de que finalice el período de tiempo de espera.
    • Obligatorio: Sí
    • Valor predeterminado: Vacío
  • delay: Contiene la hora después de la cual se envía el comando.
    • Obligatorio: Sí
    • Valor predeterminado: Vacío
  • period: Contiene el intervalo de tiempo después del cual el comando debe enviarse de nuevo.
    • Obligatorio: No
    • Valor predeterminado: -1

Ejemplo

Para iniciar un temporizador que active el REFRESH evento después de 5 segundos (5000 ms) la primera vez y después de eso cada 2 segundos (2000 ms), puede usar esto:

<timer id="trigger_refresh" command="REFRESH" delay="5000" period="2000"/>

Solicitud de descanso

Esta acción está diseñada para recuperar datos JSON a través de una API REST. Es compatible con los tipos de solicitud de datos POST y GET.

Identificador: rest_request

Atributos

  • rest_url: Contiene la URL de la API de REST.
    • Valores posibles: URL de REST
    • Obligatorio: Sí
    • Ejemplo:
"https://myfcc.com/sampledata/enginedata"
  • request_type: Contiene el tipo de solicitud REST.
    • Valores posibles: "POST", "GET"
    • Obligatorio: Sí
    • Ejemplo:
"OBTENER"
  • value_path: Contiene la ruta de acceso al valor de datos JSON.
    • Obligatorio: Sí
    • Ejemplo:
"$.rpm" //check Jayway JsonPath para ver más ejemplos
  • rest_params: Contiene los parámetros que se deben pasar al servicio REST.
    • Valores posibles: MAP
    • Obligatorio: No
    • Ejemplo:
\<list name="rest_params"
listType="NAMED">

\<param name="serial"
type="string">1337\</param>
\</list>
  • repeat_every_ms: Contiene el intervalo de tiempo en milisegundos después del cual, la acción solicita nuevos valores.
    • Valores posibles: Integer
    • Obligatorio: Sí
    • Ejemplo (para cada 5 segundos):
5000
  • payload_path: Contiene una ruta opcional donde se puede almacenar el valor recibido. Si no se da ninguna ruta, se usará el "sensor_value".
    • Valores posibles: String
    • Obligatorio: No
    • Ejemplo:
"sensor_value"

Ejemplos

Consideremos un JsonPath dada la siguiente estructura JSON:

[{
    "color"="azul",
    "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
    }
}]

Puede usar las siguientes JsonPath cadenas para recuperar datos del punto de conexión:

1. JsonPath:

$[0]['nombre']

2. Cadena devuelta:

Blueforce87427

3. Ruta de Json:

$[0]['posición']

4. Cadena devuelta:

[{
"datetime"="2022-07-27T13:58:47.925260+02:00,
"positionX"=2722,
"positionY"= 2, 
"positionZ"= 3980
}]

5. JsonPath:

$[*] 

6. Cadena devuelta:

Matriz completa con ambos objetos 

Mínimo

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

Todas las opciones

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

Enviar mensaje de confirmación

Envía un mensaje genérico con propiedades personalizables al conector de Frontline. Estos se manejan a través del DefaultInspectionRequestHandler.class atributo.

Identificador: send_commit_message

Atributos

  • type: Contiene el tipo de evento que se va a cambiar en el conector de Frontline.
    • Valores posibles: String
    • Obligatorio: Verdadero
    • Valor predeterminado: Vacío
  • connection_timeout: Contiene el tiempo de espera en segundos.
    • Valores posibles: numeric_value
    • Obligatorio: Falso
    • Valor predeterminado: 50
  • save_response: Contiene el contexto en el que se guardará la respuesta.
    • Valores posibles: Paso, flujo de trabajo
    • Obligatorio: Falso
    • Valor predeterminado: Paso

Elementos

  • identificador: Contiene el ID utilizado para los servicios de integración (por ejemplo, ID de tarea).
    • Obligatorio: Falso
    • Valor predeterminado: "" (cadena vacía)
  • properties: contiene la colección de parámetros que puede utilizar el servicio de integración.
  • Obligatorio: Falso
  • Valor predeterminado: [] (colección vacía)

Nota: Las propiedades se convierten internamente en un mapa y sus valores pueden ser una colección de conversiones recursivas. El mapa final se almacena como una cadena JSON en la cadena de carga útil del mensaje y los valores primitivos, como la cadena, los numéricos y los booleanos, se almacenan dentro del campo de mapa de propiedades . Esto hace que el mensaje sea muy flexible a la hora de comunicarse con el servicio de integración.

Manejo de respuestas

Hay tres resultados posibles al enviar un mensaje de confirmación:

  • Éxito
  • Interrupción 
  • Error

Se agota el tiempo de espera cuando no se recibe ninguna respuesta después del tiempo especificado. Esto sucede debido a que el mensaje se pierde en la red o el servidor requiere demasiado tiempo para procesar el resultado.

Un error en este caso generalmente significa un comportamiento inesperado, como la falla en el envío de mensajes debido a errores de red o errores del servidor. El manejo de errores esperado (por ejemplo, el manejo de un estado no válido en el proceso) se realiza a través de una respuesta correcta.

Todas las respuestas generan un evento de entrada con la send_commit_message modalidad. El comando es uno de RESPONSE_OK, RESPONSE_TIMEOUT RESPONSE_ERROR.

Los mensajes contienen un payload objeto que contiene datos adicionales para la respuesta. En el caso de  errortimeout, la carga útil contiene los campos "tipo" e "identificador" establecidos en los mismos valores que se utilizan en la solicitud. Esto se puede usar para identificar errores para solicitudes específicas si es necesario.

En el caso de un éxito, estos campos no están presentes, pero el campo "status" se establece en un valor numérico (definido por el controlador en el servicio de integración). Este valor se puede utilizar para controlar los casos de error que se esperan en el proceso. En todos los casos, el campo "respuesta" contiene una cadena definida por el servicio de integración que se puede utilizar para diferenciar aún más la respuesta.

Además de los valores de estado y respuesta, el servicio de integración puede definir propiedades adicionales que se devolverán con el evento. Estas propiedades están disponibles como variables de contexto en el momento del control de eventos. Un ejemplo de esto sería devolver un mensaje de error desde el WMS del cliente para el manejo de errores o información adicional para procesar la confirmación exitosa (consulte a continuación fragmentos de esto).

Ejemplos

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

El valor del identificador no es válido para establecerlo como un atributo de etiqueta, esto debería ser posible con futuras iteraciones del creador.

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

Carga de un recurso de imagen y envío de un mensaje de confirmación con información sobre el recurso cargado

Este paso de ejemplo solo espera un URI de recurso de imagen (media_file) como entrada:

<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']]> </expresión> <acciones> <action ref="show_upload_error"/> <action ref="finish"/> </acciones> </regla> <rule id="commit_ok_ok"> <expresión> <! [CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):p ayload.response} == 'OK']]> </expresión> <acciones> <action ref="finish_workflow"/> </acciones> </regla> <rule id="commit_ok_nok"> <expresión> <! [CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):p ayload.response} != 'OK']]> </expresión> <acciones> <action ref="show_nok"/> <action ref="goto_take_picture"/> </acciones> </regla> <rule id="commit_error_or_timeout"> <expresión> <! [CDATA[#{event(send_commit_message):command} == 'RESPONSE_ERROR' || #{event(send_commit_message):command} == 'RESPONSE_TIMEOUT']]]]> </expresión> <acciones> <action ref="show_commit_error"/> <action ref="goto_take_picture"/> </acciones> </regla> </onevent> </estados> </paso>

Manejo con estado de error personalizado

<actions>
  <!-- dialoga hace referencia a las variables establecidas por la respuesta del mensaje de confirmación para el manejo de errores -->
  <ui_dialog id="sap_error" type="Error" title="Error">
    <message><![ CDATA[#{sap_message}<br>Continuar a '#{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>

<!-- más acciones
  [...]
-->
</actions>

<!-- más código
 WF[...]
-->

<onevent><!--
  Éxito técnico, pero compruebe la respuesta de 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} 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 se establecen automáticamente cuando se maneja el evento y se pueden usar en la acción -->
      <action ref="sap_error"/>
    </actions>
  </rule>

  <rule id="unknown_error_in_success">
    <expresión><! [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> <acciones> <action ref="completion_error"/> </acciones> </regla> </onevent>

Ejemplo de MQTT

<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: "MI CONTENIDO"
            };
            var stringmqtt = JSON.stringify(mqtt);
            stringmqtt;}?]] >
        </param>
    </properties>
</send_commit_message>

Lado del manipulador

A continuación, se muestra un ejemplo de control de código en el conector, dentro del controlador de solicitudes "Inspección".

@Override public CommitMessageResponse handleCommitMessage(CommitMessage aCommit) {
    if("COMPLETE_INSPECTION".equals(aCommit.getType())) {
        String evaluation = aCommit.getIdentifier();
        HANDLE EVENT/
        / [CODE]
        if(isSuccess) {
            log.info("¡Finalización correcta!");
            return new CommitMessageResponse(aCommit, 0, "¡Correcto!");
        }
        HANDLE ERROR
        CommitMessageResponse cmr = new CommitMessageResponse(aCommit, 500, "SAP Error!");
        cmr.addProperties("sap_message", cr.getMessage()); 'cr' es un objeto específico del código
        personalizado cmr.addProperties("sap_material", cr.getMaterial());
        cmr.addProperties("sap_position", cr.getPosition());
        return cmr;
    }
    OTROS MENSAJES

Las propiedades agregadas en el caso de error estarán disponibles para el flujo de trabajo cuando se controle el evento.

Agregar archivo adjunto

Agrega un archivo adjunto a los resultados de la tarea del paso actual.

Identificador: add_attachment

Nota: Debe habilitar los informes para el componente en la etiqueta de flujo de trabajo. De lo contrario, la acción no tendrá ningún efecto. A continuación, se muestra un ejemplo de cómo puede hacerlo: <workflow [...] reporting="true"></workflow>

Elementos

  • type: Contiene el tipo de archivo adjunto que desea agregar al resultado de la tarea.
    • Obligatorio: Sí
    • Valor predeterminado: Vacío
  • content: Contiene el contenido que desea agregar al resultado de la tarea.
    • Obligatorio: Falso
    • Valor predeterminado: Vacío
  • override: Contiene el valor que ya está guardado con el tipo dado que se reemplaza.
    • Obligatorio: No
    • Valor predeterminado: True

Tipos predeterminados

  • activo
  • contenido del código de barras
  • documentation-comment
  • comentario
  • pregunta (utilizada por el componente "Cuestionario" para guardar la pregunta completa)
  • selected-answers (utilizado por el componente "Cuestionario" para guardar las respuestas seleccionadas)

Nota: También puede establecer su propio tipo.

Ejemplo

Mínimo

<add_attachment id="add_attachment">
    <param name="type" type="string">documentation-comment</param>
    <param name="content" type="string">#{current_comment}</param>
</add_attachment>

Todas las opciones

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

Obtener contenido adjunto

Recupera el último archivo adjunto agregado para un tipo de datos de datos adjunto determinado.

Identificador: get_attachment_content

Elementos

  • type: Contiene el tipo de archivo adjunto que desea recuperar de los archivos adjuntos.
    • Obligatorio: Sí
    • Valor predeterminado: Vacío
  • write_to: Contiene el nombre de la variable en la que desea almacenar el contenido de los datos adjuntos recuperados.
    • Obligatorio: Sí
    • Valor predeterminado: Vacío
  • write_if_empty: Guarda el valor recibido. Si existe un valor existente en la variable dada, los datos se sobrescribirán.
    • Obligatorio: No
    • Valor predeterminado: True

Tipos predeterminados

  • activo
  • contenido del código de barras
  • documentation-comment
  • comentario
  • pregunta (utilizada por el componente "Cuestionario" para guardar la pregunta completa)
  • selected-answers (utilizado por el componente "Cuestionario" para guardar las respuestas seleccionadas

Nota: También tiene la opción de agregar su propio tipo de archivo adjunto si aún no está en la lista de tipos disponibles.

Ejemplos

Mínimo

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

Todas las opciones

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

Estado del módulo

Se utiliza para cambiar el estado de un módulo. Por ejemplo, puede usarlo para desactivar el reconocimiento de entrada de voz.

Identificador: module_state

Atributos

  • module_name: El nombre del módulo
  • Valores posibles:
    • de.ubimax.andriod.speechrecognition.SpeechRecognitionModule
    • de.ubimax.andriod.client.output.SoundManager
    • de.ubimax.andriod.core.gps.GeoModule
    • de.ubimax.andriod.core.output.sound.TextToSpeechManager
    • Obligatorio: Falso
  • change_state_to: El estado en el que se supone que debe entrar el módulo
    • Valores posibles:
      • Init
      • destruir
      • parar
      • pausa
      • reanudar
      • empezar
    • Obligatorio: Verdadero

Ejemplo

<module_state id="resume_speech" module_name="de.ubimax.android.speechrecognition.SpeechRecognitionModule" change_state_to="reanudar"/>
<module_state id="pause_speech" module_name="de.ubimax.android.speechrecognition.SpeechRecognitionModule" change_state_to="pausa"/>

Cerrar sesión

Cierra la sesión del cliente.

Identificador: logoff

Ejemplo

<logoff id="myaction"/>