在前面的所有课程之后,您现在应该能够实现大多数组件。但是,我们仍然没有介绍一个工作流元素:处理程序。
处理程序 封装更复杂的逻辑模块(与操作相比)。它们在执行工作流时在后台运行,并侦听某些事件,然后处理这些事件,发出自己的事件。一个步骤中每种类型只能有一个处理程序。处理程序没有 ID。
只有少量的处理程序。在本课中,我们将介绍一个经常使用的处理程序 - value_extractor_handler.
value_extractor_handler 验证输入并从输入中提取相关信息。它主要用于条形码扫描,有时用于语音命令。您需要提供一个正则表达式 (regex),用于调节哪种类型的输入是有效的,并定义要存储在变量中的输入的哪些部分。
下面的示例演示处理程序定义的外观。
<步......>
<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})|(退出))“>
<grp>
<参数名称=”grp_1“ type=”字符串“>add_mutiplication</参数>
<参数名称=”grp_2“ type=”字符串“>add_factor_1</参数>
<参数名称=”grp_3“ 类型=”字符串“>add_factor_2</参数名称=”>
<参数名称=“grp_4” 类型=“字符串”>添加</参数>
<参数名称=“grp_5” 类型=“字符串”>SerialNo</参数名称>
<参数名称=“grp_6” 类型=“字符串”>位置</参数名称<=“>
参数名称=”grp_7“ type=”字符串“>shelve</param>
<参数名称=”grp_8“ type=”字符串“>rack</param>
<参数名称=”grp_9“ type=”字符串“>code</param>
<参数名称=“grp_10” type=“string”>exit</param>
</grp>
</value_extractor_handler>
</handlers>
</step>
如果您熟悉正则表达式,那么这里没有什么新鲜事。您创建的每个 () 组都将被捕获在步骤变量中。您可以使用 忽略需要创建以表示“或”的 ?:组。让我们拆开正则表达式:
(?:(?:添加|PLUS\s)(?:( grp_1: 例如 #{add_multiplication} == “10 乘以 5”
(\d{1,2})\sTIMES\s grp_2: 例如 #{add_factor_1} == “10”
(\d{1,2}))| grp_3:例如 #{add_factor_2} == “5”
(\d{1,3})))| grp_4:例如 #{add} == “255”
(\d{8,12})| grp_5:例如 #{serialno} == “123456789”
(S grp_6:例如 #{location} == “S5R2”
([1-7])R grp_7:例如 #{shelve} == “5”
([1-4]))| grp_8:例如 #{rack} == “2”
(B#[A-F0-9]{12})| grp_9:例如 #{code} == “B#ABCDEF123456
(EXIT)) grp10: #{exit} == ”EXIT”
您已经定义了可以在当前步骤中扫描的不同代码类型。每当扫描特定类型的代码时,其他类型的变量都将是未定义的。例如,如果扫描“PLUS 10 TIMES 5”,则组 1-3 的变量将包含内容,但其余变量将未定义。因此,您的规则应检查变量是否存在。您可以查看 处理程序文档 以查看发出了哪些事件。您可以在下面看到一些处理示例规则:
<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}” 无效!</message>
</ui_notification>
</actions>
</rule>
</onevent>
如果您有可用的外部条码扫描器,那么值得您花时间尝试value_extractor_handler一下。