Nach all den vorangegangenen Lektionen sollten Sie nun in der Lage sein, die meisten Komponenten zu implementieren. Es gibt jedoch noch ein Workflow-Element, das wir nicht behandelt haben: Handler.
Handler kapseln komplexere logische Module (im Vergleich zu Aktionen). Sie laufen im Hintergrund, während der Workflow ausgeführt wird, und warten auf bestimmte Ereignisse, die sie dann verarbeiten und eigene Ereignisse auslösen. Von jedem Typ kann es nur einen Handler in einem Schritt geben. Handler haben keine IDs.
Es gibt nur eine Handvoll von Handlern. In dieser Lektion werden wir einen Handler behandeln, der häufig verwendet wird - den value_extractor_handler
.
Lesen von Barcodes
Der value_extractor_handler
validiert Eingaben und extrahiert relevante Informationen aus den Eingaben. Er wird hauptsächlich für das Scannen von Barcodes und manchmal für Sprachbefehle verwendet. Sie müssen einen regulären Ausdruck (regex) bereitstellen, der regelt, welche Art von Eingabe gültig ist, und auch definiert, welche Teile der Eingabe Sie in Variablen speichern möchten.
Ihre Handler-Definition könnte wie folgt aussehen:
Beispiel:
<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>
Wenn Sie mit regulären Ausdrücken vertraut sind, gibt es hier nicht viel Neues. Jede Gruppe, die Sie mit ()
erstellen, wird in einer Schrittvariablen erfasst. Sie können Gruppen ignorieren, die Sie erstellen müssen, um "oder" auszudrücken, indem Sie ?:
verwenden. Nehmen wir den Regex auseinander:
(?:(?: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"
Sie haben verschiedene Arten von Codes definiert, die im aktuellen Schritt gescannt werden können. Immer wenn ein bestimmter Codetyp gescannt wird, sind die Variablen der anderen Typen undefiniert. Wenn Sie zum Beispiel "PLUS 10 TIMES 5" scannen, haben die Variablen der Gruppen 1-3 einen Inhalt, aber der Rest ist undefiniert. Daher sollten Ihre Regeln prüfen, ob die Variable existiert. Sie können in der Dokumentation der Handler nachsehen, welche Ereignisse ausgelöst werden. Unten sehen Sie einige Beispielregeln für die Verarbeitung:
<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>
Zuweisung
Aufgabe 1:
Wenn Sie einen externen Barcode-Scanner zur Verfügung haben, lohnt es sich, value_extractor_handler
auszuprobieren.
- Ermöglichen Sie es dem Benutzer, Barcodes zu scannen, um seine Wahl zu treffen.
- Fügen Sie zu jeder Option ein neues Konfigurationseingabefeld für den erwarteten Barcodewert hinzu (z. B. könnte der Mitarbeiter einen Barcode auf einer Apfelkiste scannen, der den Produktcode 123456 enthält).
- Führen Sie einige Test-Scans durch.
Download Workflow (Vorabzuweisung)
Lösung
Download Workflow (Post-Assignment)