Документация Accelera

Создание действия для Flow

При необходимости интеграций со сторонними системами методами, которые отсутствуют в стандартном наборе Accelera, у вас есть возможность создать собственное действие.

Его задача - принять данные от Accelera и выполнить алгоритм для вашей задачи (например, запрос в одну из систем вашей компании или отправка PUSH-уведомления).

Любое действие является stateless, то есть выполняется асинхронно, без сохранения состояния клиента.

Вы можете создать собственное действие на любом подходящем для вас языке программирования. Главное требование - возможность подключения к RabbitMQ версии > 3.5.0, RabbitMQ имеет множество клиентских библиотек.

Определение действия

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

Регистрация действия

При запуске процесса с вашим действием его необходимо зарегистрировать в системе Accelera. Для этого определите метаданные вашего действия в JSON-формате:

let meta = {
  title: "My action",
  name: "mybestaction",
  class: "stateless-action",
  icon: "<svg width=\"18\" height=\"18\" class=\"fe\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n" +
        "<path d=\"M14 20C14 21.1046 13.1046 22 12 22C10.8954 22 10 21.1046 10 20M14 20C14 18.8954 13.1046 18 12 18M14 20H21M10 20C10 18.8954 10.8954 18 12 18M10 20H3M12 18V14M21 5C21 6.65685 16.9706 8 12 8C7.02944 8 3 6.65685 3 5M21 5C21 3.34315 16.9706 2 12 2C7.02944 2 3 3.34315 3 5M21 5V11C21 12.66 17 14 12 14M3 5V11C3 12.66 7 14 12 14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n" +
        "</svg>",     
  inputs: 1,
  outputs: 0,
  data: {
	svgIcon: true,
    isCustom: true,
    isCustomJS: false,
    isCustomHTML: false,
    param1: "",
    param2: "",
    param3: "",
		param4: [],
		paramEditor: ""
  },
  paramsDescription: [
    {
      name: "param1",
      value: "Первый параметр",
    },
    {
      name: "param2",
      value: "Второй параметр",
			type: "dropdown",
			options: ["1", "2"]
    },
    {
      name: "param3",
      value: "Третий параметр",
			type: "constant",
			constant: "3"
    },
		{
			name: "paramEditor",
			value: "Поле для верстки текста",
      type: "textEditor"
		},
		{
      name: "param4",
      value: "Четвертый параметр",
			type: "dynamicList",
			fields: [
								{
									name: "dynamic_number", 
									type: "number"
								}, 
								{
									name: "dynamic_multidropdown", 
									type: "multiDropdown", 
									options: [
															{name: "Параметр 5", value: "item5"}, 
															{name: "Параметр 6", value: "item6"}
														]
								}
							]
		}
  ]
};
  • **title** - Короткое описание действия для отображения в GUI.
  • **name** - Название действия, используйте только латиницу, без цифр, вместо пробелов укажите дефис. Данное имя должно быть уникальным для каждого действия.
  • **class** - Должен быть всегда stateless-action.
  • **inputs** - Всегда значение 1.
  • **outputs** - Всегда значение 0.
  • html - html для отображения ноды действия в GUI. (если **isCustomHTML**- true).
  • svgIcon - html иконки ноды действия для отображения в GUI. (если **svgIcon**- true).
  • **data** - набор параметров действия. Перечислите названия параметров как в примере. Значения будут заполнены в GUI при настройке действия в сценарии.
    • **svgIcon** - true, если используется иконка из поля icon для отображения в GUI.
    • **isCustomJS**
      • если значение true, то экшен имеет JS скрипт, который позволяет кастомизировать состав полей для параметров действия. С помощью скрипта также возможно реализовывать различные алгоритмы работы с данными в рамках действия.
      • если значение false, то поля отображаются согласно описанию параметров в **paramsDescription**.
    • **isCustomHTML** - данный параметр позволяет кастомизировать отображение экшена в сценарии. Если значение параметра true, то используется верстка из поля html , если false, то действие отображается в GUI по умолчанию.

💡

Обязательно укажите параметр isCustom: true, иначе ваши действия будут проигнорированы.

**paramsDescription** - Описания параметров для правильного отображения в GUI.

  • name - название параметра, можно использовать только латиницу, цифры, дефис - и нижнее подчеркивание _. Данное имя должно быть уникальным для каждого параметра.
  • value - описание параметра, которое отобразится в GUI.
  • type - тип поля. Если параметр type отсутствует, то отобразится поле типа text.

Для некоторых полей необходимы дополнительные настройки (см. таблицу Типы полей).

Типы полей.

ТипОписаниеДополнительные параметры
inputОбычное текстовое поле-
inputTableПоле для названия таблицы. Нельзя начинать с цифры, запрещены пробелы и символы кроме _-
multiDropdownПринимает массив параметров, выбирается несколько опций.options - содержит массив с вариантами значений.
Можно задать с помощью строковых значений или в форме объекта, где
name - описание опции (отображается в GUI), а value - значение (должно быть уникально для каждой опции).
Пример:
["1", "2"] или

[{name: "Параметр 1", value: "1"}, {name: "Параметр 2", value: "2"}]
constantНеизменяемое полеconstant- значение неизменяемого поле в формате строки.
Пример:
"строка"
dropdownПринимает массив параметров, выбирается одна опция.options - содержит массив с вариантами значений.
Можно задать с помощью строковых значений или в форме объекта, где
name - описание опции (отображается в GUI), а value - значение (должно быть уникально для каждой опции).
Пример:
["1", "2"] или

[{name: "Параметр 1", value: "1"}, {name: "Параметр 2", value: "2"}]
numberПоле для ввода чисел-
textТекстовое поле, которое можно расширять-
textEditorТекстовый редактор (based on Article)-
dynamicListДинамический список атрибутfields- содержит массив с описаниями параметров, которые будут отображаться в рамках динамического списка.
Для динамического списка атрибут доступны все типы параметров из данной таблицы, кроме самого
dynamicList
Пример:
[{name: "dynamic_number", type: "number"},\n{name: "dynamic_multidropdown",\ntype: "multiDropdown",\noptions: [{name: "Параметр 5", value: "5"},\n{name: "Параметр 6", value: "6"}]}]\n
calendarПоле календаря-

Далее зарегистрируйте экшн, отправив этот JSON в очередь FLOWS.flows-custom-actions-register.

Система Accelera Flows получит данные о новом действии и отобразит его в GUI при настройке сценария.

Получение данных от Accelera

После регистрации вашего действия пока ваш процесс запущен он должен получать данные от системы Accelera и выполнять запрограммированные действия. Система передает данные о действиях через RabbitMQ. Для получения данных процессу требуется совершить ряд действий:

channel.assertExchange('ex-custom-actions', 'fanout', { durable: true }),
channel.assertQueue('my-custom-actions', { durable: true }),
channel.bindQueue('my-custom-actions', 'ex-custom-actions'),
channel.prefetch(1),
channel.consume('my-custom-actions', (message) => {
	// Do something with message
	channel.ack(message);
});

1. Определить обмен с названием 'ex-custom-actions' типа fanout.
2. Создать очередь с именем, которое вам подходит. Например 'my-custom-actions'.
3. Связать очередь с обменом командой bindQueue.
4. Установить параметр
prefetch = 1.
5. Запустить потребление очереди.

В объекте message вы получите новое сообщение, которое содержит:
1. Id клиента.
2. Название события.
3. Строковое представление JSON-объекта метаданных с заполненными параметрами блока data.
4. Контекст события.
5. Название сценария.
6. Идентификатор сценария.

Пример сообщения от Accelera:

{
  id: '123',  // id клиента
  event: 'event2', // событие, на которое был вызван экшн
  action: {
  id: 5, // номер блока в сценарии
  name: 'sendsay', // имя экшна
  data: {  // массив параметров, заполненных в настройке
      svgIcon: true,
      isCustom: true,
      isCustomJS: false,
      isCustomHTML: false,
      param1: "",
      param2: "",
      param3: "",
	  param4: []
    },
    class: 'stateless-action', // далее технические поля экшна
    html: '<div>...</div>',
    typenode: false,
    inputs: { input_1: [Object] },
    outputs: {},
    pos_x: 544.6666463216145,
    pos_y: -124.58333333333337
  },
  context: { username: 'test' }, // параметры клиента в сценарии на момент вызова экшна
  flow_name: 'test', // имя сценария, откуда был вызван экшн
  flow_id: 'toyzb69857' // ID сценерия
}

После считывания необходимо отправить подтверждение командой ack:

	channel.ack(message);

Выполнив вышеперечисленные действия, ваш процесс получит все необходимые данные из сценария.

Если не отправить ack сообщение, то через некоторое время брокер посчитает потребителя нерабочим и передаст это сообщение на повторное выполнение в другой исполнитель (если такой существует).

На этой странице