经过前面所有课程的学习,你现在应该能够实现大部分组件了。不过,还有一个工作流元素我们没有涉及:处理程序。
处理程序封装了更复杂的逻辑模块(与操作相比)。它们在工作流执行时在后台运行,并监听某些事件,然后处理这些事件,并发出自己的事件。每种类型的处理程序在一个步骤中只能有一个。处理程序没有 ID。
处理程序的数量很少。在本课中,我们将介绍一个经常使用的处理程序--value_extractor_handler
。
读取条形码
value_extractor_handler
用于验证输入,并从输入中提取相关信息。它主要用于条形码扫描,有时也用于语音命令。您需要提供一个正则表达式 (regex),用于规范哪种类型的输入是有效的,并定义您希望将输入的哪些部分存储到变量中。
下面的示例展示了处理程序定义的样子。
示例
<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>
如果你熟悉正则表达式,这里就没有什么新东西了。您使用()
创建的每个组都将保存在一个步骤变量中。使用?:
可以忽略为表达 "或 "而创建的组。让我们把 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"
您已定义了可在当前步骤中扫描的不同类型的代码。每当扫描特定类型的代码时,其他类型的变量将未定义。例如,如果扫描 "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}" is not valid!</message>
</ui_notification>
</actions>
</rule>
</onevent>
任务
作业 1:
如果您有外部条形码扫描仪,不妨试试value_extractor_handler
。
- 让用户可以扫描条形码做出选择。
- 为每个选项添加一个新的配置输入字段,用于输入预期的条形码值(例如,工人可以扫描一箱苹果上的条形码,其中包含产品代码 123456)。
- 进行一些测试扫描。
下载工作流程(作业前)
解决方案
下载工作流程(作业后)