Après toutes les leçons précédentes, vous devriez maintenant être en mesure de mettre en œuvre la plupart des composants. Cependant, il reste un élément du flux de travail que nous n'avons pas encore abordé : les gestionnaires.
Les gestionnaires encapsulent des modules logiques plus complexes (par rapport aux actions). Ils fonctionnent en arrière-plan pendant l'exécution du flux de travail et écoutent certains événements qu'ils traitent ensuite en émettant leurs propres événements. Il ne peut y avoir qu'un seul gestionnaire de chaque type dans une étape. Les gestionnaires n'ont pas d'identifiant.
Il n'existe qu'un petit nombre de gestionnaires. Dans cette leçon, nous aborderons un gestionnaire très souvent utilisé : le gestionnaire value_extractor
.
Lecture des codes-barres
Le gestionnaire value_extractor_handler
valide les entrées et en extrait les informations pertinentes. Il est principalement utilisé pour la lecture de codes-barres et parfois pour les commandes vocales. Vous devrez fournir une expression régulière (regex) qui détermine quel type d'entrée est valide et qui définit également les parties de l'entrée que vous souhaitez stocker dans des variables.
L'exemple suivant montre à quoi peut ressembler la définition d'un gestionnaire.
Exemple
<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>
Si vous êtes familier avec les expressions régulières, il n'y a pas grand-chose de nouveau ici. Chaque groupe que vous créez à l'aide de ()
sera capturé dans une variable d'étape. Vous pouvez ignorer les groupes que vous devez créer pour exprimer "ou" en utilisant ? :
. Décortiquons la 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"
Vous avez défini différents types de codes qui peuvent être scannés dans l'étape en cours. Chaque fois qu'un type de code particulier est scanné, les variables des autres types sont indéfinies. Par exemple, si vous scannez "PLUS 10 FOIS 5", les variables des groupes 1 à 3 auront un contenu, mais les autres seront indéfinies. Par conséquent, vos règles doivent vérifier si la variable existe. Vous pouvez consulter la documentation du gestionnaire pour savoir quels événements sont émis. Vous trouverez ci-dessous quelques exemples de règles de traitement :
<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>
Affectation
Affectation 1 :
Si vous disposez d'un lecteur de codes-barres externe, cela vaut la peine d'essayer value_extractor_handler
.
- Permettre à l'utilisateur de scanner les codes-barres pour faire son choix.
- Ajoutez un nouveau champ de configuration à chaque option pour la valeur attendue du code-barres (par exemple, le travailleur pourrait scanner un code-barres sur une boîte de pommes contenant le code produit 123456).
- Effectuez quelques analyses de test.
Télécharger le flux de travail (pré-affectation)
Solution
Télécharger le flux de travail (après l'affectation)