Добавление нового типа события

Расширение настройки позволяет добавить в Конструктор бизнес процессов новые события.

Добавление нового типа события в конструктор бизнес-процессов включает в себя:

  • добавление нового объекта "Событие" в интерфейсе оператора;
  • настроить скриптовые действия по событиям в интерфейсе администратора.

Добавление объекта "Событие"

Место настройки в интерфейсе

Интерфейс оператора. Вкладка "Бизнес процессы" → "Справочники" → "События".

Выполнение настройки

Нажмите кнопку Добавить. Заполните параметры события: название, код и описание и нажмите кнопку Сохранить.

Запомните код созданного события, он будет использоваться при настройке скрипта.

Для каждого события необходимо создать два действия по событию: для синхронного действия и для асинхронного.

Настройка синхронного действия по событиям

Место настройки в интерфейсе

Меню навигации "Настройка системы" → настройка "Действия по событиям".

Выполнение настройки

Нажмите кнопку Добавить действие. На форме добавления заполните поля и нажмите кнопку Сохранить.

Поля на форме добавления:

  • Название — в качестве названия можно использовать шаблон [#AAS], где S в конце обозначает синхронное действие.
  • Объекты: "Заявка".
  • Событие — выберите событие, при котором должно происходить действие.
  • Действие: "Скрипт".
  • Выполнять синхронно: "да".
  • Скрипт для синхронного действия по событию.

    В параметре EVENT_CODE укажите код события.

Copy

def LOGGING_IS_ENABLED = true
def log = { msg ->
    if (LOGGING_IS_ENABLED) {
        logger.info('Запуск действий автоматизации при наступлении события: ' + msg.toString())
    }
}
//Параметры------------------------------------------------------
def BPM = modules.sBPM
def ACTION_STATE = 'syncUsed'
def ROUTE = 'bpmRoute'
def ACTION_FQN = 'action$eventTemplate'
def EVENT_CODE = ''

//Функции--------------------------------------------------------
//Основной блок -------------------------------------------------
//используется для тестирования в консоли
//subject = utils.get('serviceCall$2262801')
//Получение текущего маршрута из объекта
def route = subject[ROUTE]
//Получение текущего действия по коду из функции модуля
def sourceEvent = BPM.getEvent(EVENT_CODE)
//Продолжаем работу только в случае наличия действия и маршрута
if (!route || !sourceEvent) {
    log("не определено -- " + ((route ? [] : ['route']) + (sourceEvent ? [] : ['sourceEvent'])).join(', '))
    return ''
}
//Контейнер параметров для поиска действий
def searchActions = [:]
//Заполняем параметры поиска
searchActions.put('removed', false)
searchActions.put('sourceEvent', sourceEvent)
searchActions.put('state', ACTION_STATE)
searchActions.put('targetTemplate', route.templates)
//Производим поиск действий автоматизации
def bpmActions = utils.find(ACTION_FQN, searchActions)
//Для каждого найденного действия выполняем типовую функцию модуля
bpmActions.each{ bpmAction ->
    //Контейнер с параметрами действия автоматизации
    def actionParams = [:]
    actionParams.put('user', binding.hasVariable('user') ? user : null)
    actionParams.put('source', subject)
    actionParams.put('current', subject)
    actionParams.put('action', bpmAction)
    actionParams.put('sourceEvent', sourceEvent)
    BPM."${bpmAction.action.code}"(actionParams)
}

Настройка асинхронного действия по событиям

Место настройки в интерфейсе

Меню навигации "Настройка системы" → настройка "Действия по событиям".

Выполнение настройки

Нажмите кнопку Добавить действие. На форме добавления заполните параметры действия и нажмите кнопку Сохранить.

Поля на форме добавления:

  • Название — в качестве названия можно использовать шаблон [#AAA], где "A" в конце обозначает асинхронное действие.
  • Объекты: "Заявка".
  • Событие — выберите событие, при котором должно происходить действие.
  • Действие: "Скрипт".
  • Выполнять синхронно: "нет".
  • Скрипт для асинхронного действия по событию.

    В параметре "EVENT_CODE" укажите код события.

Copy
def LOGGING_IS_ENABLED = true
def log = { msg ->
    if (LOGGING_IS_ENABLED) {
        logger.info('Запуск действий автоматизации при наступлении события: ' + msg.toString())
    }
}
//Параметры------------------------------------------------------
def BPM = modules.sBPM
def ACTION_STATE = 'asyncUsed'
def ROUTE = 'bpmRoute'
def ACTION_FQN = 'action$eventTemplate'
def EVENT_CODE = 'stopProcess'

//Функции--------------------------------------------------------
//Основной блок -------------------------------------------------
//используется для тестирования в консоли
//subject = utils.get('serviceCall$2262801')
//Получение текущего маршрута из объекта
def route = subject[ROUTE]
//Получение текущего действия по коду из функции модуля
def sourceEvent = BPM.getEvent(EVENT_CODE)
//Продолжаем работу только в случае наличия действия и маршрута
if (!route || !sourceEvent) {
    log("не определено -- " + ((route ? [] : ['route']) + (sourceEvent ? [] : ['sourceEvent'])).join(', '))
    return ''
}
//Контейнер параметров для поиска действий
def searchActions = [:]
//Заполняем параметры поиска
searchActions.put('removed', false)
searchActions.put('sourceEvent', sourceEvent)
searchActions.put('state', ACTION_STATE)
searchActions.put('targetTemplate', route.templates)
//Производим поиск действий автоматизации
def bpmActions = utils.find(ACTION_FQN, searchActions)
//Для каждого найденного действия выполняем типовую функцию модуля
bpmActions.each{ bpmAction ->
    //Контейнер с параметрами действия автоматизации
    def actionParams = [:]
    actionParams.put('user', binding.hasVariable('user') ? user : null)
    actionParams.put('source', subject)
    actionParams.put('current', subject)
    actionParams.put('action', bpmAction)
    actionParams.put('sourceEvent', sourceEvent)
    BPM."${bpmAction.action.code}"(actionParams)
}

Включите созданные действия по событиям.

Подробное описание настройки действий по событию: