Después de todas las lecciones anteriores, ahora debería ser capaz de implementar la mayoría de los componentes. Sin embargo, todavía hay un elemento de flujo de trabajo que no hemos cubierto: los controladores.

Los controladores encapsulan módulos lógicos más complejos (en comparación con las acciones). Se ejecutan en segundo plano mientras se ejecuta el flujo de trabajo y escuchan ciertos eventos que luego procesan, emitiendo eventos propios. Solo puede haber un controlador de cada tipo en un paso. Los controladores no tienen identificadores.

Solo hay un pequeño número de controladores. En esta lección, cubriremos un controlador que se usa con bastante frecuencia: el value_extractor_handler.

Lectura de códigos de barras

Valida value_extractor_handler la entrada y extrae la información relevante de la entrada. Se utiliza principalmente para escanear códigos de barras y, a veces, para comandos de voz. Deberá proporcionar una expresión regular (regex) que regule qué tipo de entrada es válida y también defina qué partes de la entrada desea almacenar en variables.

En el ejemplo siguiente se muestra el aspecto que podría tener la definición del controlador.

Ejemplo

<paso ... >
    <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})|(SALIDA)) ">
            <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>

Si estás familiarizado con las expresiones regulares, no hay nada nuevo aquí. Cada grupo que cree con () él se capturará en una variable de paso. Puede omitir los grupos que necesita crear para expresar "o" mediante ?:. Desmontemos la expresión regular:

(?:(?:ADD|PLUS\s)(?:(           grp_1: por ejemplo, #{add_multiplication} == "10 por 5"
        (\d{1,2})\sTIMES\s      grp_2: por ejemplo, #{add_factor_1} == "10"
        (\d{1,2}))|             grp_3: por ejemplo, #{add_factor_2} == "5"
    (\d{1,3})))|                grp_4: por ejemplo, #{add} == "255"
(\d{8,12})|                     grp_5: p. ej. #{serialno} == "123456789"
(S                              grp_6: p. ej. #{location} == "S5R2"
    ([1-7])R                    grp_7: p. ej. #{shelve} == "5"
    ([1-4]))|                   grp_8: por ejemplo, #{rack} == "2"
(B#[A-F0-9]{12})|               grp_9: por ejemplo, #{código} == "B#ABCDEF123456
(EXIT))                         grp10: #{exit} == "EXIT"

Ha definido diferentes tipos de código que se pueden analizar en el paso actual. Cada vez que se escanea un tipo particular de código, las variables de los otros tipos no estarán definidas. Por ejemplo, si escanea "MÁS 10 POR 5", las variables de los grupos 1-3 tendrán contenido, pero el resto no estará definido. Por lo tanto, las reglas deben comprobar si la variable existe. Puede consultar la documentación del controlador para ver qué eventos se emiten. A continuación, puede ver algunos ejemplos de reglas para el procesamiento:

<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}" no es válido!</message>
            </ui_notification>
        </actions>
    </rule><
/onevent>

📌Asignación

Si tiene un escáner de código de barras externo disponible, vale la pena probarlovalue_extractor_handler.

  • Permita que el usuario escanee códigos de barras para hacer su elección.
  • Agregue un nuevo campo de entrada de configuración a cada opción para el valor esperado del código de barras (por ejemplo, el trabajador podría escanear un código de barras en una caja de manzanas que contiene el código de producto 123456).
  • Realice algunos escaneos de prueba.

 Descargar flujo de trabajo (pre-asignación)

Solución

 Descargar flujo de trabajo (posterior a la asignación)