wf_uri
se puede utilizar como identificador "wf" en la acción start_workflowNota: 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.
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>
Establece o actualiza los parámetros de un flujo de trabajo o un paso.
Identificador: setvar
{global::my_value}
en referencias directas o appcontext.global.my_value
en Javascript).#{user_session::my_value}
), pero los valores se eliminarán cuando el usuario cierre sesión.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>
Descarga uno o varios recursos especificados.
Identificador: 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>
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
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"/>
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
"https://myfcc.com/sampledata/enginedata"
"OBTENER"
"$.rpm" //check Jayway JsonPath para ver más ejemplos
\<list name="rest_params" listType="NAMED"> \<param name="serial" type="string">1337\</param> \</list>
5000
"sensor_value"
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>
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
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.
Hay tres resultados posibles al enviar un mensaje de confirmación:
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
o RESPONSE_ERROR
.
Los mensajes contienen un payload
objeto que contiene datos adicionales para la respuesta. En el caso de error
y timeout
, 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).
<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>
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>
<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>
<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>
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.
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>
Nota: También puede establecer su propio tipo.
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>
Recupera el último archivo adjunto agregado para un tipo de datos de datos adjunto determinado.
Identificador: get_attachment_content
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.
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>
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
<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"/>
Cierra la sesión del cliente.
Identificador: logoff
<logoff id="myaction"/>