Depois de todas as lições anteriores, você já deve ser capaz de implementar a maioria dos componentes. No entanto, ainda há um elemento do fluxo de trabalho que não abordamos: Os manipuladores.
Os manipuladores encapsulam módulos lógicos mais complexos (em comparação com as ações). Eles são executados em segundo plano enquanto o fluxo de trabalho é executado e ouvem determinados eventos que, em seguida, processam, emitindo seus próprios eventos. Só pode haver um manipulador de cada tipo em uma etapa. Os manipuladores não têm IDs.
Há apenas um pequeno número de manipuladores. Nesta lição, abordaremos um manipulador que é usado com bastante frequência: o value_extractor_handler
.
Leitura de códigos de barras
O value_extractor_handler
valida a entrada e extrai informações relevantes da entrada. Ele é usado principalmente para leitura de código de barras e, às vezes, para comandos de voz. Você precisará fornecer uma expressão regular (regex) que regule qual tipo de entrada é válido e também defina quais partes da entrada você deseja armazenar em variáveis.
O exemplo a seguir mostra como sua definição de manipulador poderia ser.
Exemplo
<step ...>
<handlers>
<value_extractor_handler pattern="(?:(?:ADD|PLUS\s)(?:((\d{1,2})\sTIMES\s(\d{1,2}))|(\d{1,3})))|(\d{8,12})|(S([1-7])R([1-4]))|(B#[A-F0-9]{12})|(EXIT))">
<grp>
<param name="grp_1" type="string">add_mutiplication</param>
<param name="grp_2" type="string">add_factor_1</param>
<param name="grp_3" type="string">add_factor_2</param>
<param name="grp_4" type="string">add</param>
<param name="grp_5" type="string">serialno</param>
<param name="grp_6" type="string">location</param>
<param name="grp_7" type="string">shelve</param>
<param name="grp_8" type="string">rack</param>
<param name="grp_9" type="string">code</param>
<param name="grp_10" type="string">exit</param>
</grp>
</value_extractor_handler>
</handlers>
</step>
Se você estiver familiarizado com expressões regulares, não há muita novidade aqui. Cada grupo que você criar usando ()
será capturado em uma variável de etapa. Você pode ignorar os grupos que precisa criar para expressar "or" usando ?:
. Vamos desmontar a regex:
(?:(?:ADD|PLUS\s)(?:( grp_1: e.g #{add_multiplication} == "10 Times 5"
(\d{1,2})\sTIMES\s grp_2: e.g. #{add_factor_1} == "10"
(\d{1,2}))| grp_3: e.g. #{add_factor_2} == "5"
(\d{1,3})))| grp_4: e.g. #{add} == "255"
(\d{8,12})| grp_5: e.g. #{serialno} == "123456789"
(S grp_6: e.g. #{location} == "S5R2"
([1-7])R grp_7: e.g. #{shelve} == "5"
([1-4]))| grp_8: e.g. #{rack} == "2"
(B#[A-F0-9]{12})| grp_9: e.g. #{code} == "B#ABCDEF123456
(EXIT)) grp10: #{exit} == "EXIT"
Você definiu diferentes tipos de códigos que podem ser escaneados na etapa atual. Sempre que um tipo específico de código for escaneado, as variáveis dos outros tipos ficarão indefinidas. Por exemplo, se você digitalizar "MAIS 10 VEZES 5", as variáveis dos grupos 1-3 terão conteúdo, mas o restante estará indefinido. Portanto, suas regras devem verificar se a variável existe. Você pode consultar a documentação do manipulador para ver quais eventos são emitidos. Você pode ver alguns exemplos de regras para o processamento abaixo:
<onevent>
<rule id="location_scanned">
<expression><![CDATA[ #{event(value_extractor):command} == 'VALID_EXTRACTION' && exists(#{shelve}) && exists(#{rack}) ]]></expression>
<actions>
<setvar id="set_loction">
<context_of>workflow</context_of>
<context_update>
<param name="shelve" type="long">#{shelve}</param>
<param name="rack" type="long">#{rack}</param>
</context_update>
</setvar>
</actions>
</rule>
<rule id="invalid_input">
<expression><![CDATA[ #{event(value_extractor):command} == 'INVALID_EXTRACTION' ]]></expression>
<actions>
<ui_notification id="invalid_codeer" type="ERROR" duration="SHORT" show_immediately="true">
<message>"#{event:payload.code}" is not valid!</message>
</ui_notification>
</actions>
</rule>
</onevent>
Atribuição
Atribuição 1:
Se você tiver um leitor de código de barras externo disponível, vale a pena experimentar o value_extractor_handler
.
- Permita que o usuário leia códigos de barras para fazer sua escolha.
- Adicione um novo campo de entrada de configuração a cada opção para o valor esperado do código de barras (por exemplo, o funcionário poderia ler um código de barras em uma caixa de maçãs contendo o código de produto 123456).
- Execute algumas varreduras de teste.
Faça o download do fluxo de trabalho (pré-atribuição)
Solução
Faça o download do fluxo de trabalho (pós-atribuição)