Envia uma mensagem genérica para o conector frontline, com propriedades personalizáveis. Estes são tratados com o atributo "DefaultInspectionRequestHandler.class".
Identificador: send_commit_message
Atributos
tipo: O tipo de evento a ser comutado, no conector Frontline
Possíveis valores: Cordão
- Requerido: verdadeiro
- Valor padrão: -
conexão_timeout: Tempo esgotado em segundos
Valores possíveis: numeric_value
- Requerido: falso
- Valor padrão: 50
save_response: Contexto para salvar a resposta em
Valores possíveis: etapa, fluxo de trabalho
- Obrigatório: falso
- Valor padrão: etapa
Elementos
identificador: A identificação utilizada para os serviços de integração (por exemplo, identificação de tarefa).
- Obrigatório: falso
- Valor padrão: " " (Cadeia vazia)
propriedades: Coleção de parâmetros, que podem ser utilizados pelo serviço de integração.
- Requerido: falso
- Valor padrão: [ ] (coleta vazia)
Os imóveis são convertidos internamente em um mapa e seu valor pode ser um conjunto de conversões recursivas. O mapa final é armazenado como uma cadeia JSON na cadeia de carga útil da mensagem e valores primitivos como cadeia, numérico e booleano são armazenados dentro do campo de propriedades Map-field. Isto torna a mensagem muito flexível ao se comunicar com o serviço de integração.
Manuseio de respostas
Há três resultados possíveis ao enviar uma mensagem de compromisso:
- Sucesso
- Tempo esgotado
- Erro
Um timeout ocorre quando nenhuma resposta é recebida após um tempo especificado. Isto acontece devido à perda da mensagem na rede, ou devido ao servidor exigir muito tempo para processar o resultado.
Neste caso, erro geralmente significa comportamento inesperado, como falha no envio de mensagens devido a erros na rede ou erros no servidor.
O tratamento esperado de erros (por exemplo, manuseio de um estado inválido no processo, etc.) é feito através de uma resposta bem sucedida.
Todas as respostas geram um evento de entrada com a modalidade 'send_commit_message'. O comando é um de RESPONSE_OK, RESPONSE_TIMEOUT, e RESPONSE_ERROR.
As mensagens contêm um objeto de carga útil que contém dados adicionais para a resposta.
Em caso de erro e tempo esgotado, a carga útil contém os campos 'tipo' e 'identificador' definidos para os mesmos valores usados no pedido. Isto pode ser usado para identificar erros para solicitações específicas, se necessário.
No caso de sucesso, estes campos não estão presentes, mas o campo "status" é definido para um valor numérico (definido pelo manipulador no serviço de integração). Este valor pode ser usado para lidar com casos de erro que são esperados no processo.
Em todos os casos, a resposta de campo contém uma seqüência definida pelo serviço de integração que pode ser usada para diferenciar ainda mais a resposta.
Além do status e dos valores de resposta, o serviço de integração pode definir propriedades adicionais a serem enviadas de volta com o evento. Estas propriedades estão disponíveis como variáveis de contexto no momento do tratamento do evento. Um exemplo disto é o envio de uma mensagem de erro do WMS do cliente para tratamento de erros ou informações adicionais para processar o compromisso bem sucedido (veja abaixo os fragmentos disto).
Exemplos
<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 - isto deve ser possível com futuras iterações 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>
Upload do Ativo de Imagem e envio de uma mensagem de compromisso com informações sobre o ativo carregado
Esta etapa de exemplo espera apenas um URI (media_file) de Ativo de Imagem 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']]>
</expression>
<actions>
<action ref="show_upload_error"/>
<action ref="finish"/>
</actions>
</rule>
<rule id="commit_ok_ok">
<expression>
<![CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):payload.response} == 'OK']]>
</expression>
<actions>
<action ref="finish_workflow"/>
</actions>
</rule>
<rule id="commit_ok_nok">
<expression>
<![CDATA[#{event(send_commit_message):command} == 'RESPONSE_OK' && #{event(send_commit_message):payload.response} != 'OK']]>
</expression>
<actions>
<action ref="show_nok"/>
<action ref="goto_take_picture"/>
</actions>
</rule>
<rule id="commit_error_or_timeout">
<expression>
<![CDATA[#{event(send_commit_message):command} == 'RESPONSE_ERROR' || #{event(send_commit_message):command} == 'RESPONSE_TIMEOUT']]>
</expression>
<actions>
<action ref="show_commit_error"/>
<action ref="goto_take_picture"/>
</actions>
</rule>
</onevent>
</states>
</step>
Manuseio com status de erro personalizado
<actions>
<!-- dialog references variables set by the commit message response for error handling -->
<ui_dialog id="sap_error" type="Error" title="Error">
<message><![CDATA[#{sap_message}<br>Continue to '#{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>
<!-- more actions
[...]
-->
</actions>
<!-- more WF code
[...]
-->
<onevent>
<!-- Technical success but check for SAP response -->
<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 are automatically set when the event is handled and can be used in the action -->
<action ref="sap_error"/>
</actions>
</rule>
<rule id="unknown_error_in_success">
<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>
</rule>
</onevent>
Exemplo 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: "MY CONTENT"
};
var stringmqtt = JSON.stringify(mqtt);
stringmqtt;}?]]>
</param>
</properties>
</send_commit_message>
Lado do manipulador
Aqui está um exemplo de código de manuseio no conector, dentro do manipulador de pedidos de "inspeção".
@Override
public CommitMessageResponse handleCommitMessage(CommitMessage aCommit) {
if("COMPLETE_INSPECTION".equals(aCommit.getType())) {
String evaluation = aCommit.getIdentifier();
// HANDLE EVENT
// [CODE]
if(isSuccess) {
log.info("Completion success!");
return new CommitMessageResponse(aCommit, 0, "Success!");
}
// HANDLE ERROR
CommitMessageResponse cmr = new CommitMessageResponse(aCommit, 500, "SAP Error!");
cmr.addProperties("sap_message", cr.getMessage()); // 'cr' is an object specific to the custom code
cmr.addProperties("sap_material", cr.getMaterial());
cmr.addProperties("sap_position", cr.getPosition());
return cmr;
}
// OTHER MESSAGES
As propriedades adicionadas no caso de erro estarão disponíveis para o fluxo de trabalho quando o evento for tratado.