在前面的所有课程之后,您现在应该能够实现大多数组件。但是,我们仍然没有介绍一个工作流元素:处理程序。

处理程序 封装更复杂的逻辑模块(与操作相比)。它们在执行工作流时在后台运行,并侦听某些事件,然后处理这些事件,发出自己的事件。一个步骤中每种类型只能有一个处理程序。处理程序没有 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一下。

  • 使用户能够扫描条形码以做出选择。
  • 为每个选项添加一个新的配置输入字段,以获得预期的条形码值(例如,工作人员可以扫描包含产品代码123456的苹果盒上的条形码)。
  • 执行一些测试扫描。

 下载工作流程(预分配)

溶液

 下载工作流(分配后)