wf_uri
pode ser usado como um identificador "wf" na ação start_workflowNota: Isso é semelhante ao componente Navegador de Tarefas , mas busca apenas o fluxo de trabalho associado ao modelo fornecido, em vez de executá-lo separadamente.
A ação pode ser usada da seguinte maneira:
<get_workflow_from_template id="get_workflow_from_template"> <param name="template">NameOfTemplate</param> </get_workflow_from_template>
Tratamento 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>
Define ou atualiza os parâmetros de um fluxo de trabalho ou de uma etapa.
Identificador: setvar
{global::my_value}
em referências diretas ou appcontext.global.my_value
em Javascript).#{user_session::my_value}
), mas os valores serão excluídos quando o usuário sair.Mínimo
<setvar id="increase_step"> <context_update> <param name="current_step">#{current_step}+1</param> </context_update> </setvar>
Todas as opções
<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>
Baixa um ou mais ativos especificados.
Senha: 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>
Define um temporizador com a opção de definir atrasos e períodos específicos. O período ou o temporizador termina quando a etapa é alterada.
Identificador: timer
Para iniciar um temporizador que dispara o REFRESH
evento após 5 segundos (5000 ms) da primeira vez e depois disso a cada 2 segundos (2000 ms), você pode usar o seguinte:
<timer id="trigger_refresh" command="REFRESH" delay="5000" period="2000"/>
Essa ação foi projetada para recuperar dados JSON em uma API REST. Ele suporta os tipos de solicitação de dados POST e GET.
Identificador: rest_request
"https://myfcc.com/sampledata/enginedata"
"OBTER"
"$.rpm" //check Jayway JsonPath para mais exemplos
\<nome da lista="rest_params" listType="NAMED"> \<param name="serial" type="string">1337\</param> \</list>
5000
"sensor_value"
Vamos considerar um JsonPath dada a seguinte estrutura JSON:
[{ "color"="blue", "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 } }]
Você pode usar as seguintes JsonPath
cadeias de caracteres para recuperar dados do ponto de extremidade:
1. JsonPath:
$[0]['nome']
2. String retornada:
Blueforce87427
3. JsonPath:
$[0]['posição']
4. String retornada:
[{ "datetime"="2022-07-27T13:58:47.925260+02:00, "positionX"=2722, "positionY"= 2, "positionZ"= 3980 }]
5. JsonPath:
$[*]
6. Cadeia de caracteres retornada:
Matriz inteira com ambos os 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 as opções
<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>
Envia uma mensagem genérica com propriedades personalizáveis para o conector Frontline. Eles são manipulados por meio do atributo DefaultInspectionRequestHandler.class
.
Senha: send_commit_message
Nota: As propriedades são convertidas internamente em um mapa e seus valores podem ser uma coleção de conversões recursivas. O mapa final é armazenado como uma cadeia de caracteres JSON na cadeia de caracteres de carga útil da mensagem e valores primitivos como string, numérico e booleano são armazenados dentro do campo de mapa de propriedades . Isso torna a mensagem muito flexível ao se comunicar com o serviço de integração.
Há três resultados possíveis ao enviar uma mensagem de confirmação:
Um tempo limite ocorre quando nenhuma resposta é recebida após o tempo especificado. Isso acontece devido à mensagem se perder na rede ou o servidor exigir muito tempo para processar o resultado.
Um erro, neste caso, geralmente significa um comportamento inesperado, como falha no envio de mensagens devido a erros de rede ou erros do servidor. O tratamento de erros esperados (por exemplo, lidar com um estado inválido no processo) é feito por meio de uma resposta bem-sucedida.
Todas as respostas geram um evento de entrada com a send_commit_message
modalidade. O comando é um de RESPONSE_OK, RESPONSE_TIMEOUT
ou RESPONSE_ERROR
.
As mensagens contêm um payload
objeto que contém dados adicionais para a resposta. No caso de error
e timeout
, a carga útil contém os campos "tipo" e "identificador" definidos com os mesmos valores usados na solicitação. Isso pode ser usado para identificar erros para solicitações específicas, se necessário.
No caso de um êxito, esses campos não estão presentes, mas o campo "status" é definido como um valor numérico (definido pelo manipulador no serviço de integração). Esse valor pode ser usado para manipular casos de erro esperados no processo. Em todos os casos, o campo "resposta" contém uma cadeia de caracteres definida pelo serviço de integração que pode ser usada para diferenciar ainda mais a resposta.
Além dos valores de status e resposta, o serviço de integração pode definir propriedades adicionais a serem enviadas de volta com o evento. Essas propriedades estão disponíveis como variáveis de contexto no momento do tratamento do evento. Um exemplo disso seria enviar de volta uma mensagem de erro do WMS do cliente para tratamento de erros ou informações adicionais para processar a confirmação bem-sucedida (consulte abaixo para obter fragmentos disso).
<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>
O valor do identificador não é válido para ser definido como um atributo de tag – isso deve ser possível com iterações futuras do criador.
<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>
Esta etapa de exemplo espera apenas um URI de ativo de imagem (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']]> </expressão> <ações> <ação ref="show_upload_error"/> <ação ref="finish"/> </ações> </regra> <rule id="commit_ok_ok"> <expressão> <! [CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):p ayload.response} == 'OK']]> </expressão> <ações> <ação ref="finish_workflow"/> </ações> </regra> <rule id="commit_ok_nok"> <expressão> <! [CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):p ayload.response} != 'OK']]> </expressão> <ações> <ação ref="show_nok"/> <ação ref="goto_take_picture"/> </ações> </regra> <rule id="commit_error_or_timeout"> <expressão> <! [CDATA[#{event(send_commit_message):command} == 'RESPONSE_ERROR' || #{event(send_commit_message):command} == 'RESPONSE_TIMEOUT']]> </expressão> <ações> <ação ref="show_commit_error"/> <ação ref="goto_take_picture"/> </ações> </regra> </onevent> </estados> </passo>
<actions> <!-- dialog faz referência a variáveis definidas pela resposta da mensagem de confirmação para tratamento de erros --> <ui_dialog id="sap_error" type="Error" title="Error"> <message><![ CDATA[#{sap_message}<br>Continue para '#{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> <!-- mais ações [...] --> </actions> <!-- mais código WF[...] --> <onevent> <!-- Êxito técnico, mas verifique a resposta do 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} concluído... </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> <!-- variáveis são definidas automaticamente quando o evento é manipulado e podem ser usadas na ação --> <action ref="sap_error"/> </actions> </rule> <rule id="unknown_error_in_success"> <expressão><! [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']]></expressão> <ações> <ação ref="completion_error"/> </ações> </regra> </onevent>
<send_commit_message id="send_mqtt" type="FRONTLINE_MQTT" connection_timeout="200"> <properties> <param name="mqtt" type="string"><![ CDATA[?{ var mqtt = { tópico: "MY/TOPIC", content: "MEU CONTEÚDO" }; var stringmqtt = JSON.stringify(mqtt); stringmqtt;}?]] > </param> </properties> </send_commit_message>
Aqui está um exemplo de manipulação de código no conector, dentro do manipulador de solicitação "Inspeção".
@Override public CommitMessageResponse handleCommitMessage(CommitMessage aCommit) { if("COMPLETE_INSPECTION".equals(aCommit.getType())) { String evaluation = aCommit.getIdentifier(); MANIPULAR EVENTO/ / [CODE] if(isSuccess) { log.info("Sucesso de conclusão!"); retornar novo CommitMessageResponse(aCommit, 0, "Sucesso!"); } HANDLE ERROR CommitMessageResponse cmr = new CommitMessageResponse(aCommit, 500, "Erro SAP!"); cmr.addProperties("sap_message", cr.getMessage()); 'cr' é um objeto específico para o código personalizado cmr.addProperties("sap_material", cr.getMaterial()); cmr.addProperties("sap_position", cr.getPosition()); retornar cmr; } OUTRAS MENSAGENS
As propriedades adicionadas no caso de erro estarão disponíveis para o fluxo de trabalho quando o evento for manipulado.
Adiciona um anexo aos resultados da tarefa da etapa atual.
Identificador: add_attachment
Observação: você precisa habilitar a geração de relatórios para seu componente na tag de fluxo de trabalho. Caso contrário, a ação não terá efeito. Aqui está um exemplo de como você pode fazer isso: <workflow [...] reporting="true"></workflow>
Nota: Você também pode definir seu próprio 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 as opções
<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 o último anexo adicionado para um tipo de dados de anexo específico.
Senha: get_attachment_content
Nota: Você também tem a opção de adicionar seu próprio tipo de anexo se ele ainda não estiver na lista de tipos disponíveis.
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 as opções
<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>
Usado para alterar o estado de um módulo. Por exemplo, você pode usá-lo para desativar o reconhecimento de entrada de fala.
Identificador: module_state
<module_state id="resume_speech" module_name="de.ubimax.android.speechrecognition.SpeechRecognitionModule" change_state_to="currículo"/> <module_state id="pause_speech" module_name="de.ubimax.android.speechrecognition.SpeechRecognitionModule" change_state_to="pausa"/>
Efetua logoff do cliente.
Identificador: logoff
<logoff id="myaction"/>