在前面的所有课程之后,您现在应该能够实现大多数组件。但是,我们仍然没有介绍一个工作流元素:处理程序。
处理程序 封装更复杂的逻辑模块(与操作相比)。它们在执行工作流时在后台运行,并侦听某些事件,然后处理这些事件,发出自己的事件。一个步骤中每种类型只能有一个处理程序。处理程序没有 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
一下。