Iniciar um fluxo de trabalho

Atributos

  • template: Nome do modelo do qual queremos o fluxo de trabalho
    • Obrigatório: Sim
  • include_tasks: Se for verdade, o que for definido como um modelo também pode ser uma tarefa
    • Obrigatório: Não
    • Valor padrão: True

Saída

  • WORKFLOW_EXTRACTED: O fluxo de trabalho foi extraído com êxito do modelo fornecido
    • Carga útil: wf_uri pode ser usado como um identificador "wf" na ação start_workflow
  • WORKFLOW_EXTRACTION_ERROR: Nenhum fluxo de trabalho pôde ser extraído do modelo fornecido

Nota: Isso é semelhante ao componente Navegador de Tarefas , mas busca apenas o fluxo de trabalho associado ao modelo fornecido, em vez de executá-lo separadamente. 

Exemplo

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>

Setvar

Define ou atualiza os parâmetros de um fluxo de trabalho ou de uma etapa.

Identificador: setvar

Elementos

  • context_update: Uma lista de parâmetros que devem ser definidos ou atualizados.
    • Obrigatório: Sim
    • Valor padrão: Lista vazia
  • context_of: Define o escopo de contexto que deve ser atualizado. Por padrão, a etapa atualmente ativa será atualizada.
    • Obrigatório: Não
  • Valor padrão: etapa
  • Valores possíveis:
    • Fluxo de trabalho: a etapa ativa atual será atualizada.
    • Raiz: salva o valor de uma maneira que é acessível em qualquer fluxo de trabalho de volta ao seu fluxo de trabalho raiz.
    • Global: Cria um valor de contexto global que pode ser acessado de qualquer lugar no aplicativo ({global::my_value} em referências diretas ou appcontext.global.my_value em Javascript).
    • User_session: Funciona de forma semelhante a "global" (acesso com #{user_session::my_value}), mas os valores serão excluídos quando o usuário sair.

Exemplos

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>

Baixar Ativos

Baixa um ou mais ativos especificados.

Senha: download_assets

Exemplo

<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

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

Atributos

  • comando: Isso é enviado após o término do período de tempo limite.
    • Obrigatório: Sim
    • Valor padrão: Vazio
  • delay: Contém o tempo após o qual o comando é enviado.
    • Obrigatório: Sim
    • Valor padrão: Vazio
  • period: Contém o intervalo de tempo após o qual o comando deve ser enviado novamente.
    • Obrigatório: Não
    • Valor padrão: -1

Exemplo

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

Solicitação de descanso

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

Atributos

  • rest_url: Contém a URL da API REST.
    • Valores possíveis: URL REST
    • Obrigatório: Sim
    • Exemplo:
"https://myfcc.com/sampledata/enginedata"
  • request_type: Contém o tipo de solicitação REST.
    • Valores possíveis: "POST", "GET"
    • Obrigatório: Sim
    • Exemplo:
"OBTER"
  • value_path: Contém o caminho para o valor de dados JSON.
    • Obrigatório: Sim
    • Exemplo:
"$.rpm" //check Jayway JsonPath para mais exemplos
  • rest_params: Contém os parâmetros que devem ser passados para o serviço REST.
    • Valores possíveis: MAP
    • Obrigatório: Não
    • Exemplo:
\<nome da lista="rest_params"
listType="NAMED">

\<param name="serial"
type="string">1337\</param>
\</list>
  • repeat_every_ms: Contém o intervalo de tempo em milissegundos após o qual, a ação solicita novos valores.
    • Valores possíveis: Inteiro
    • Obrigatório: Sim
    • Exemplo (a cada 5 segundos):
5000
  • payload_path: Contém um caminho opcional onde o valor recebido pode ser armazenado. Se nenhum caminho for dado, o "sensor_value" será usado.
    • Valores possíveis: String
    • Obrigatório: Não
    • Exemplo:
"sensor_value"

Exemplos

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>

Enviar mensagem de confirmação

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

Atributos

  • type: Contém o tipo de evento a ser alternado no conector Frontline.
    • Valores possíveis: String
    • Obrigatório: True
    • Valor padrão: Vazio
  • connection_timeout: Contém o tempo limite em segundos.
    • Valores possíveis: numeric_value
    • Obrigatório: Falso
    • Valor padrão: 50
  • save_response: Contém o contexto no qual salvar a resposta.
    • Valores possíveis: Etapa, fluxo de trabalho
    • Obrigatório: Falso
    • Valor padrão: Etapa

Elementos

  • identificador: contém a ID usada para serviços de integração (por exemplo, ID da tarefa).
    • Obrigatório: Falso
    • Valor padrão: "" (cadeia de caracteres vazia)
  • properties: Contém a coleção de parâmetros que podem ser usados pelo serviço de integração.
  • Obrigatório: Falso
  • Valor padrão: [] (coleção vazia)

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.

Tratamento de respostas

Há três resultados possíveis ao enviar uma mensagem de confirmação:

  • Êxito
  • Timeout 
  • Erro

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

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

Carregando um ativo de imagem e enviando uma mensagem de confirmação com informações sobre o ativo carregado

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>

Manipulando com status de erro personalizado

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

Exemplo de MQTT

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

Lado do manipulador

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.

Adicionar anexo

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>

Elementos

  • type: contém o tipo de anexo que você deseja adicionar ao resultado da tarefa.
    • Obrigatório: Sim
    • Valor padrão: Vazio
  • content: contém o conteúdo que você deseja adicionar ao resultado da tarefa.
    • Obrigatório: Falso
    • Valor padrão: Vazio
  • substituição: contém o valor que já está salvo com o tipo fornecido é substituído.
    • Obrigatório: Não
    • Valor padrão: True

Tipos padrão

  • ativo
  • conteúdo de código de barras
  • documentação-comentário
  • comentário
  • pergunta (usada pelo componente "Questionário" para salvar a pergunta completa)
  • respostas selecionadas (usado pelo componente "Questionário" para salvar as respostas selecionadas)

Nota: Você também pode definir seu próprio tipo.

Exemplo

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>

Obter conteúdo de anexo

Recupera o último anexo adicionado para um tipo de dados de anexo específico.

Senha: get_attachment_content

Elementos

  • type: Contém o tipo de anexo que você deseja recuperar dos anexos.
    • Obrigatório: Sim
    • Valor padrão: Vazio
  • write_to: Contém o nome da variável onde você deseja armazenar o conteúdo do anexo recuperado.
    • Obrigatório: Sim
    • Valor padrão: Vazio
  • write_if_empty: Salva o valor recebido. Se existir um valor existente na variável fornecida, os dados serão substituídos.
    • Obrigatório: Não
    • Valor padrão: True

Tipos padrão

  • ativo
  • conteúdo de código de barras
  • documentação-comentário
  • comentário
  • pergunta (usada pelo componente "Questionário" para salvar a pergunta completa)
  • selected-answers (usado pelo componente "Questionário" para salvar as respostas selecionadas

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.

Exemplos

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>

Estado do módulo

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

Atributos

  • module_name: O nome do módulo
  • Valores possíveis:
    • de.ubimax.andriod.speechrecognition.SpeechRecognitionModule
    • de.ubimax.andriod.client.output.SoundManager
    • de.ubimax.andriod.core.gps.GeoModule
    • de.ubimax.andriod.core.output.sound.TextToSpeechManager
    • Obrigatório: Falso
  • change_state_to: O estado em que o módulo deve entrar
    • Valores possíveis:
      • Init
      • destruir
      • parar
      • pausa
      • retomar
      • começar
    • Obrigatório: True

Exemplo

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

Fazer logoff

Efetua logoff do cliente.

Identificador: logoff

Exemplo

<logoff id="myaction"/>