Настройка события "Классификация"

Описание настройки

Расширение настройки позволяет добавить в Конструктор бизнес процессов новое события "Классификация" и запускать маршрут выполнения бизнес-процесса после классификации заявки, то есть при изменении договора или услуги в уже существующей заявке.

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

Сценарии работы

Условие: на новую услугу настроен маршрут с событием "Классификация".

Если до переклассификации в заявке уже был подобран маршрут, то:

  • Если после переклассификации услуги или типа есть другой подходящий маршрут, то маршрут в заявке изменится. Объекты, созданные по первоначальному маршруту, сохранятся, но новые создаваться не будут.
  • Если после переклассификации подходящего маршрута нет, то в заявке появится комментарий от бота о том, что маршрут не найден. Текущий маршрут продолжит выполняться.

Версии

Настройка актуальна для версии модуля 1.0.

В версиях 2.0 и выше данный функционал встроен по умолчанию.

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

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

Добавление события "Классификация"

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

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

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

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

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

  • "Название": Классификация
  • "Код": classificationNew
  • "Описание": В заявке изменилась услуга. Новая услуга связана с маршрутом

Изменение скрипта значения по умолчанию для атрибута bpmRoute

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

Меню навигации "Классы" → класс "Заявка".

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

Чтобы изменить скрипт значения по умолчанию:

  1. На вкладке "Атрибуты" → блок "Атрибуты класса/типа" найдите атрибут "BPM. Маршрут обработки" (bpmRoute).
  2. Нажмите иконку в строке с названием атрибута.
  3. На форме редактирования атрибута найдите поле "Скрипт" и нажмите "показать свойства скрипта".
  4. В поле "Текст" замените скрипт на следующий.

    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
  5. Нажмите кнопку "Сохранить".

Добавление действий по событию. Диагностические комментарии к объектам включены

Описание настройки

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

  • [HCAA] Запуск действий автоматизации после переклассификации — асинхронное выполнение действия.
  • [HCAS] Запуск действий автоматизации после переклассификации — синхронное выполнение действия.

При включенной диагностике к головным объектам добавляются приватные комментарии от бота, которые информируют о запуске маршрута и фиксируют все ошибки, возникшие при его прохождении.

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

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

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

Чтобы настроить действия по событию:

  1. На вкладке "Действия по событиям" добавьте действие по событию с параметрами:

    • Название: "[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)
    }
  2. В карточке действия по событию добавьте условие выполнения с параметрами:

    • Название: "Изменилась услуга или тип";
    • Скрипт: "[новый скрипт]";
    • Название скрипта: "Изменилась услуга или тип";
    • Код: "[заполнится автоматически]";
    • Текст:
    Copy
    def ATTR_CODES = ['service', 'metaClass']
    return (changedAttributes.intersect(ATTR_CODES)) ? "" : 'Услуга и тип не менялись'
  3. На вкладке "Действия по событиям" добавьте еще одно действие по событию с параметрами:

    • Название: "[HCAS] Запуск действий автоматизации после переклассификации";
    • Код: "HCAS_servicecall";
    • Объекты: "Заявка";
    • Событие: "Изменение объекта";
    • Действие: "Скрипт";
    • Выполнять синхронно: "да";
    • Скрипт: "[новый скрипт]";
    • Название скрипта: "[HCAS] Запуск действий автоматизации после переклассификации";
    • Код: "HCASservicecall";
    • Текст:
  4. 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
        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)
    }
  5. В карточке действия по событию добавьте условие выполнения с параметрами:

    • Название: "Изменилась услуга или тип";
    • Скрипт: "Изменилась услуга или тип".
  6. На вкладке "Действия по событиям" или в карточке действия по событию включите оба действия.

Добавление действий по событию. Диагностические комментарии к объектам отключены

Описание настройки

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

  • [HCAA] Запуск действий автоматизации после переклассификации — асинхронное выполнение действия.
  • [HCAS] Запуск действий автоматизации после переклассификации — синхронное выполнение действия.

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

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

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

Чтобы настроить действия по событию:

  1. На вкладке "Действия по событиям" добавьте действие по событию с параметрами:

    • Название: "[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)
    }
  2. В карточке действия по событию добавьте условие выполнения с параметрами:

    • Название: "Изменилась услуга или тип";
    • Скрипт: "[новый скрипт]";
    • Название скрипта: "Изменилась услуга или тип";
    • Код: "[заполнится автоматически]";
    • Текст:
    Copy
    def ATTR_CODES = ['service', 'metaClass']
    return (changedAttributes.intersect(ATTR_CODES)) ? "" : 'Услуга и тип не менялись'
  3. На вкладке "Действия по событиям" добавьте еще одно действие по событию с параметрами:

    • Название: "[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)
    }
  4. В карточке действия по событию добавьте условие выполнения с параметрами:

    • Название: "Изменилась услуга или тип";
    • Скрипт: "Изменилась услуга или тип".
  5. На вкладке "Действия по событиям" или в карточке действия по событию включите оба действия.

 

Cмотри также: