Настройка события "Классификация"
Описание настройки
Расширение настройки позволяет добавить в Конструктор бизнес процессов новое события "Классификация" и запускать маршрут выполнения бизнес-процесса после классификации заявки, то есть при изменении договора или услуги в уже существующей заявке.
В стандартной логике бизнес-процессы запускаются автоматически только при создании заявки, если указаны верные услуга и тип.
Сценарии работы
Условие: на новую услугу настроен маршрут с событием "Классификация".
Если до переклассификации в заявке уже был подобран маршрут, то:
- Если после переклассификации услуги или типа есть другой подходящий маршрут, то маршрут в заявке изменится. Объекты, созданные по первоначальному маршруту, сохранятся, но новые создаваться не будут.
- Если после переклассификации подходящего маршрута нет, то в заявке появится комментарий от бота о том, что маршрут не найден. Текущий маршрут продолжит выполняться.
Версии
Настройка актуальна для версии модуля 1.0.
В версиях 2.0 и выше данный функционал встроен по умолчанию.
Выполнение настройки
Действия, которые необходимо выполнить для корректной работы маршрутов при изменении услуги или типа в заявке:
- Добавление события "Классификация"
- Изменение скрипта значения по умолчанию для атрибута bpmRoute
- Добавление действий по событию. Диагностические комментарии к объектам включены
- Добавление действий по событию. Диагностические комментарии к объектам отключены
Добавление события "Классификация"
Место настройки в интерфейсе оператора
Карточка Компании → Вкладка "Бизнес-процессы" → "Справочники" → "События".
Выполнение настройки
На вкладке "События" нажмите кнопку "Добавить". На открывшейся форме заполните поля и нажмите кнопку "Сохранить".
Поля на форме добавления:
- "Название": Классификация
- "Код": classificationNew
- "Описание": В заявке изменилась услуга. Новая услуга связана с маршрутом
Изменение скрипта значения по умолчанию для атрибута bpmRoute
Место настройки в интерфейсе администратора
Меню навигации "Классы" → класс "Заявка".
Выполнение настройки
Чтобы изменить скрипт значения по умолчанию:
- На вкладке "Атрибуты" → блок "Атрибуты класса/типа" найдите атрибут "BPM. Маршрут обработки" (bpmRoute).
- Нажмите иконку
в строке с названием атрибута. - На форме редактирования атрибута найдите поле "Скрипт" и нажмите "показать свойства скрипта".
-
В поле "Текст" замените скрипт на следующий.
Copy//Автор: eboronina
//Дата создания: 14.06.17
//Код: SCRIPTSD4001619
//Назначение:
/**
* Определение маршрута по умолчанию в зависимости от услуги
* @param ROUTE_ATTR_CODE - код атрибута ссылки на маршрут в услуге
* @param ROUTE_BASE_METACLASS_ATTR - код атрибута ссылки на базовый метакласс
* Сценарий получает услугу в заявке, если она указана и в ней определён
* маршрут и его базовый тип соответствует типу объекта, то возвращается
* указанный маршрут, иначе null.
*/
//Версия: 4.6.0+
//Категория: Вычисление значения атрибута по умолчанию
//Параметры-----------------------------------------------------
def ROUTE_ATTR_CODE = 'bpmRoute'
def ROUTE_BASE_METACLASS_ATTR = 'baseKase'
//Функции-------------------------------------------------------
//Основной блок ------------------------------------------------
def result = null
// Доп проверки на то, что мы находимся на форме добавления заявки
if(subject[attrCode] == null) {
if(subject?.service) {
def routeFromService = subject.service[ROUTE_ATTR_CODE]
def subjectMC = api.metainfo.getMetaClass(subject).toString()
if(routeFromService && subjectMC == routeFromService[ROUTE_BASE_METACLASS_ATTR]?.metaCode) {
result = routeFromService
}
}
}
return result - Нажмите кнопку "Сохранить".
Добавление действий по событию. Диагностические комментарии к объектам включены
Описание настройки
Для корректной работы необходимо добавить два действия по событию:
- [HCAA] Запуск действий автоматизации после переклассификации — асинхронное выполнение действия.
- [HCAS] Запуск действий автоматизации после переклассификации — синхронное выполнение действия.
При включенной диагностике к головным объектам добавляются приватные комментарии от бота, которые информируют о запуске маршрута и фиксируют все ошибки, возникшие при его прохождении.
Место настройки в интерфейсе администратора
Меню навигации "Настройка системы" → "Действия по событиям".
Выполнение настройки
Чтобы настроить действия по событию:
-
На вкладке "Действия по событиям" добавьте действие по событию с параметрами:
- Название: "[HCAA] Запуск действий автоматизации после переклассификации";
- Код: "HCAA_servicecall";
- Объекты: "Заявка";
- Событие: "Изменение объекта";
- Действие: "Скрипт";
- Выполнять синхронно: "нет";
- Скрипт: "[новый скрипт]";
- Название скрипта: "[HCAA] Запуск действий автоматизации после переклассификации";
- Код: "HCAAservicecall";
- Текст:
Copy/*! UTF8 */
//Автор: eboronina
//Дата создания: 14.06.17
//Код: SCRIPTSD4001620
//Назначение:
/**
* Определение маршрута при изменении услуги + запуск действий автоматизации.
* @param ROUTE_ATTR_CODE_SERVICE - код атрибута ссылки на маршрут в услуге
* @param ACTION_STATE - статус действия автоматизации. Используется для
* деления действий на синхронные и асинхронные.
* @param ROUTE - код атрибута ссылки на маршрут процесса
* @param ACTION_FQN - код метакласса действия автоматизации.
* @param EVENT_CODE - код события инициализации
* @param BPM - сокращение ссылки на модуль для упрощения обращения
* Сценарий определяет новый маршрут для объекта и запускает действия по переклассификации
*/
//Версия: 4.6.0+
//Категория: Действие по событию типа скрипт
//Параметры-----------------------------------------------------
def ROUTE_BASE_METACLASS_ATTR = 'baseKase'
def BPM = modules.sBPM
def ACTION_STATE = 'asyncUsed'
def ROUTE = 'bpmRoute'
def ACTION_FQN = 'action$eventTemplate'
def EVENT_CODE = 'classificationNew'
//Функции-------------------------------------------------------
//Основной блок ------------------------------------------------
def LOGGING_IS_ENABLED = true
def log = { msg ->
if (LOGGING_IS_ENABLED) {
logger.info('Запуск действий автоматизации при наступлении события: ' + msg.toString())
}
}
//Получение текущего маршрута из объекта
def route = currentSubject[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 errors = []
//Производим поиск действий автоматизации
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)
def res = BPM."${bpmAction.action.code}"(actionParams)
// Обработка возникших ошибок
if(!res.errors.isEmpty()) {
def map = [
'errors' : res.errors,
'action' : bpmAction
]
errors.add(map)
}
}
// Если были ошибки, информируем о них
if (!errors.isEmpty()) {
BPM.infoToHead(subject, errors)
} -
В карточке действия по событию добавьте условие выполнения с параметрами:
- Название: "Изменилась услуга или тип";
- Скрипт: "[новый скрипт]";
- Название скрипта: "Изменилась услуга или тип";
- Код: "[заполнится автоматически]";
- Текст:
Copydef ATTR_CODES = ['service', 'metaClass']
return (changedAttributes.intersect(ATTR_CODES)) ? "" : 'Услуга и тип не менялись' -
На вкладке "Действия по событиям" добавьте еще одно действие по событию с параметрами:
- Название: "[HCAS] Запуск действий автоматизации после переклассификации";
- Код: "HCAS_servicecall";
- Объекты: "Заявка";
- Событие: "Изменение объекта";
- Действие: "Скрипт";
- Выполнять синхронно: "да";
- Скрипт: "[новый скрипт]";
- Название скрипта: "[HCAS] Запуск действий автоматизации после переклассификации";
- Код: "HCASservicecall";
- Текст:
-
В карточке действия по событию добавьте условие выполнения с параметрами:
- Название: "Изменилась услуга или тип";
- Скрипт: "Изменилась услуга или тип".
- На вкладке "Действия по событиям" или в карточке действия по событию включите оба действия.
/*! UTF8 */
//Автор: eboronina
//Дата создания: 14.06.17
//Код: SCRIPTSD4001620
//Назначение:
/**
* Определение маршрута при изменении услуги + запуск действий автоматиазации.
* @param ROUTE_ATTR_CODE_SERVICE - код атрибута ссылки на маршрут в услуге
* @param ROUTE_ATTR_CODE_CALL - код атрибута ссылки на маршрут в заявке
* @param ROUTE_BASE_METACLASS_ATTR - код атрибута ссылки на базовый метакласс
* @param ACTION_STATE - статус действия автоматизации. Используется для
* деления действий на синхронные и асинхронные.
* @param ACTION_FQN - код метакласса действия автоматизации.
* @param EVENT_CODE - код события инициализации
* @param BPM - сокращение ссылки на модуль для упрощения обращения
* Сценарий определяет новый маршрут для объекта и запускает действия по переклассификации
*/
//Версия: 4.6.0+
//Категория: Действие по событию типа скрипт
//Параметры-----------------------------------------------------
def ROUTE_ATTR_CODE_SERVICE = 'bpmRoute'
def ROUTE_ATTR_CODE_CALL = 'bpmRoute'
def ROUTE_BASE_METACLASS_ATTR = 'baseKase'
def BPM = modules.sBPM
def ACTION_STATE = 'syncUsed'
def ROUTE = 'bpmRoute'
def ACTION_FQN = 'action$eventTemplate'
def EVENT_CODE = 'classificationNew'
//Функции-------------------------------------------------------
//Основной блок ------------------------------------------------
def result = [:]
def newRoute = null
if (subject.service) {
// Если установлена услуга
def routeFromService = subject.service[ROUTE_ATTR_CODE_SERVICE]
def subjectMC = api.metainfo.getMetaClass(subject).toString()
if(routeFromService && subjectMC == routeFromService[ROUTE_BASE_METACLASS_ATTR]?.metaCode) {
// новый маршрут нашелся по типу и услуге
newRoute = routeFromService
if(subject[ROUTE_ATTR_CODE_CALL] != newRoute) {
BPM.logToHead(subject, "Новый маршрут ${api.web.asLink(api.web.open(newRoute), newRoute.title)}")
}
}
else {
// маршрут не нашелся
if(subject[(ROUTE_ATTR_CODE_CALL)]) {
// Если раньше маршрут был
BPM.logToHead(subject, "Маршрут не определился по услуге и типу заявки.")
}
}
}
else {
if(subject[(ROUTE_ATTR_CODE_CALL)]) {
// Если раньше маршрут был
BPM.logToHead(subject, "Маршрут не определен, так как не указана услуга.")
}
}
result.put(ROUTE_ATTR_CODE_CALL, newRoute)
utils.edit(subject, result)
def LOGGING_IS_ENABLED = true
def log = { msg ->
if (LOGGING_IS_ENABLED) {
logger.info('Запуск действий автоматизации при наступлении события: ' + msg.toString())
}
}
def route = newRoute
//Получение текущего действия по коду из функции модуля
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 errors = []
//Производим поиск действий автоматизации
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)
def res = BPM."${bpmAction.action.code}"(actionParams)
// Обработка возникших ошибок
if(!res.errors.isEmpty()) {
def map = [
'errors' : res.errors,
'action' : bpmAction
]
errors.add(map)
}
}
// Если были ошибки, информируем о них
if (!errors.isEmpty()) {
BPM.infoToHead(subject, errors)
}
Добавление действий по событию. Диагностические комментарии к объектам отключены
Описание настройки
Для корректной работы необходимо добавить два действия по событию:
- [HCAA] Запуск действий автоматизации после переклассификации — асинхронное выполнение действия.
- [HCAS] Запуск действий автоматизации после переклассификации — синхронное выполнение действия.
Место настройки
Интерфейс администратора. Меню навигации "Настройка системы" → "Действия по событиям"
Выполнение настройки
Чтобы настроить действия по событию:
-
На вкладке "Действия по событиям" добавьте действие по событию с параметрами:
- Название: "[HCAA] Запуск действий автоматизации после переклассификации";
- Код: "HCAA_servicecall";
- Объекты: "Заявка";
- Событие: "Изменение объекта";
- Действие: "Скрипт";
- Выполнять синхронно: "нет";
- Скрипт: "[новый скрипт]";
- Название скрипта: "[HCAA] Запуск действий автоматизации после переклассификации";
- Код: "HCAAservicecall";
- Текст:
Copy/*! UTF8 */
//Автор: eboronina
//Дата создания: 14.06.17
//Код: SCRIPTSD4001620
//Назначение:
/**
* Определение маршрута при изменении услуги + запуск действий автоматизации.
* @param ROUTE_ATTR_CODE_SERVICE - код атрибута ссылки на маршрут в услуге
* @param ACTION_STATE - статус действия автоматизации. Используется для
* деления действий на синхронные и асинхронные.
* @param ROUTE - код атрибута ссылки на маршрут процесса
* @param ACTION_FQN - код метакласса действия автоматизации.
* @param EVENT_CODE - код события инициализации
* @param BPM - сокращение ссылки на модуль для упрощения обращения
* Сценарий определяет новый маршрут для объекта и запускает действия по переклассификации
*/
//Версия: 4.6.0+
//Категория: Действие по событию типа скрипт
//Параметры-----------------------------------------------------
def ROUTE_BASE_METACLASS_ATTR = 'baseKase'
def BPM = modules.sBPM
def ACTION_STATE = 'asyncUsed'
def ROUTE = 'bpmRoute'
def ACTION_FQN = 'action$eventTemplate'
def EVENT_CODE = 'classificationNew'
//Функции-------------------------------------------------------
//Основной блок ------------------------------------------------
def LOGGING_IS_ENABLED = true
def log = { msg ->
if (LOGGING_IS_ENABLED) {
logger.info('Запуск действий автоматизации при наступлении события: ' + msg.toString())
}
}
//Получение текущего маршрута из объекта
def route = currentSubject[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)
} -
В карточке действия по событию добавьте условие выполнения с параметрами:
- Название: "Изменилась услуга или тип";
- Скрипт: "[новый скрипт]";
- Название скрипта: "Изменилась услуга или тип";
- Код: "[заполнится автоматически]";
- Текст:
Copydef ATTR_CODES = ['service', 'metaClass']
return (changedAttributes.intersect(ATTR_CODES)) ? "" : 'Услуга и тип не менялись' -
На вкладке "Действия по событиям" добавьте еще одно действие по событию с параметрами:
- Название: "[HCAS] Запуск действий автоматизации после переклассификации";
- Код: "HCAS_servicecall";
- Объекты: "Заявка";
- Событие: "Изменение объекта";
- Действие: "Скрипт";
- Выполнять синхронно: "да";
- Скрипт: "[новый скрипт]";
- Название скрипта: "[HCAS] Запуск действий автоматизации после переклассификации";
- Код: "HCASservicecall";
- Текст:
Copy/*! UTF8 */
//Автор: eboronina
//Дата создания: 14.06.17
//Код: SCRIPTSD4001620
//Назначение:
/**
* Определение маршрута при изменении услуги + запуск действий автоматиазации.
* @param ROUTE_ATTR_CODE_SERVICE - код атрибута ссылки на маршрут в услуге
* @param ROUTE_ATTR_CODE_CALL - код атрибута ссылки на маршрут в заявке
* @param ROUTE_BASE_METACLASS_ATTR - код атрибута ссылки на базовый метакласс
* @param ACTION_STATE - статус действия автоматизации. Используется для
* деления действий на синхронные и асинхронные.
* @param ACTION_FQN - код метакласса действия автоматизации.
* @param EVENT_CODE - код события инициализации
* @param BPM - сокращение ссылки на модуль для упрощения обращения
* Сценарий определяет новый маршрут для объекта и запускает действия по переклассификации
*/
//Версия: 4.6.0+
//Категория: Действие по событию типа скрипт
//Параметры-----------------------------------------------------
def ROUTE_ATTR_CODE_SERVICE = 'bpmRoute'
def ROUTE_ATTR_CODE_CALL = 'bpmRoute'
def ROUTE_BASE_METACLASS_ATTR = 'baseKase'
def BPM = modules.sBPM
def ACTION_STATE = 'syncUsed'
def ROUTE = 'bpmRoute'
def ACTION_FQN = 'action$eventTemplate'
def EVENT_CODE = 'classificationNew'
//Функции-------------------------------------------------------
//Основной блок ------------------------------------------------
def result = [:]
def newRoute = null
if (subject.service) {
// Если установлена услуга
def routeFromService = subject.service[ROUTE_ATTR_CODE_SERVICE]
def subjectMC = api.metainfo.getMetaClass(subject).toString()
if(routeFromService && subjectMC == routeFromService[ROUTE_BASE_METACLASS_ATTR]?.metaCode) {
// новый маршрут нашелся по типу и услуге
newRoute = routeFromService
}
}
result.put(ROUTE_ATTR_CODE_CALL, newRoute)
utils.edit(subject, result)
def LOGGING_IS_ENABLED = true
def log = { msg ->
if (LOGGING_IS_ENABLED) {
logger.info('Запуск действий автоматизации при наступлении события: ' + msg.toString())
}
}
def route = newRoute
//Получение текущего действия по коду из функции модуля
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)
} -
В карточке действия по событию добавьте условие выполнения с параметрами:
- Название: "Изменилась услуга или тип";
- Скрипт: "Изменилась услуга или тип".
- На вкладке "Действия по событиям" или в карточке действия по событию включите оба действия.
Cмотри также: