Depois de todas as lições anteriores, agora você deve ser capaz de implementar a maioria dos componentes. No entanto, ainda há um elemento de fluxo de trabalho que não abordamos: Manipuladores.
Os manipuladores encapsulam módulos lógicos mais complexos (em comparação com ações). Eles são executados em segundo plano enquanto o fluxo de trabalho é executado e escutam certos eventos que eles então processam, emitindo eventos próprios. 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
.
O value_extractor_handler
valida a entrada e extrai informações relevantes da entrada. É usado principalmente para leitura de código de barras e, às vezes, para comandos de fala. 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 pode parecer.
<passo... > <manipuladores> <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})|(SAÍDA)) "> <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ê está familiarizado com expressões regulares, não há nada de novo 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 "ou" usando ?:
o . Vamos desmontar o regex:
(?:(?:ADD|PLUS\s)(?:( grp_1: e.g #{add_multiplication} == "10 Times 5" (\d{1,2})\sTIMES\s grp_2: por exemplo, #{add_factor_1} == "10" (\d{1,2}))| grp_3: por exemplo, #{add_factor_2} == "5" (\d{1,3})))| grp_4: por exemplo, #{add} == "255" (\d{8,12})| grp_5: por exemplo, #{serialno} == "123456789" (S grp_6: e.g. #{location} == "S5R2" ([1-7])R grp_7: e.g. #{shelve} == "5" ([1-4]))| grp_8: por exemplo, #{rack} == "2" (B#[A-F0-9]{12})| grp_9: por exemplo, #{code} == "B#ABCDEF123456 (EXIT)) grp10: #{exit} == "EXIT"
Você definiu diferentes tipos de código que podem ser verificados na etapa atual. Sempre que um determinado tipo de código é verificado, as variáveis dos outros tipos serão indefinidas. Por exemplo, se você digitalizar "MAIS 10 VEZES 5", as variáveis para os grupos 1-3 terão conteúdo, mas o restante será indefinido. Portanto, suas regras devem verificar se a variável existe. Você pode verificar 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">< expressão><![ 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}" não é válido!</message> </ui_notification> </actions> </rule> </onevent>
Se você tem um scanner de código de barras externo disponível, vale a pena experimentarvalue_extractor_handler
.
Baixar fluxo de trabalho (pré-atribuição)