Что такое каналы?

Домой

Введение

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

Отправка записей в канал

Записи в канал можно отправлять по одной или несколько сразу из табличного вида, который доступен для записей с вложенными записями или со страницы результатов поиска. Для оправки одной записи в канал выберите пункт Отправить в Канал в меню Отправить:

В новом окне выберите канал из списка доступных каналов и нажмите кнопку Выбрать:

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

Для отправки большого количества записей в канал используйте табличную форму отображения записей, например в режиме поиска записей. Выполните поиск записей в системе OpenPIM по интересующим вас критериям. В заголовке таблицы с результатами поиска выберите значок Отправить и пункт Отправить в Канал

В новом окне выберите канал из списка доступных каналов и нажмите кнопку Выбрать:

После отправки записей в канал у них появляется атрибут с названием канала и статусом обработки. Существуют следующие статусы обработки записей в канале:

  1. Статус В очереди: Запись отправлена в обработку
  2. Статус ОК: Запись успешно обработана
  3. Статус Ошибка: Произошла ошибка при обработке записи

Пользовательский Интерфейс Канала

Вы можете просматривать информацию о канале в разделе Каналы, который доступен в основном меню системы OpenPIM:

В разделе Каналы доступна следующая информация:

  • Дашборд: Отображает состояние записей оправленных в канал

  • Запуски: Содержит список запусков канала с временем начала и окончания запуска, статусом для каждого запуска, ссылкой на файл с результатами работы канала и информацией о ходе выполнения запуска. В данном разделе доступны действия с каналом:

  • Обновить: Позволяет обновить данные о состоянии канала

  • Запустить: Выполняет запуск канала вручную

  • Очистить очередь: Сбрасывает атрибут отправки в канал для всех записей в очереди данного канала.

Настройки канала

Создание и настройка канала осуществляется в разделе Настройки, который доступен в основном меню системы OpenPIM:

После перехода в раздел Настройки необходимо выбрать пункт Каналы из меню расположенного в левой части экрана:

При выборе пункта Каналы в правой части экрана доступен список существующих каналов для редактирования и возможность создать новый канал. Для создания нового канала выберите + символ напротив названия Каналы:

При создании нового канала необходимо указать следующие значения:

  1. Идентификатор - уникальной идентификатор канала.
  2. Наименование - произвольное наименование канала
  3. Закладка Свойства
    1. Выбрать Активный для нового канала
    2. Выбрать тип канала из списка. Для базовой версии системы доступен тип канала Внешний
    3. Выбрать режим запуска канала из 4 возможных вариантов
    4. Указать для каких типов объектов системы данный канал будет доступен
    5. Указать для какого уровня объектов системы данный канал будет виден
    6. Выбрать Показывать статус канала у объекта для отображения статуса канала в карточке товара
  4. Закладка Конфигурация
    1. Указать полный путь к запускаемой программе в поле Запускаемая программа
    2. Указать имя файла в поле Генерируемое имя файла, которое будет сгенерировано по результату успешного запуска канала
    3. Указать mime тип для файла в поле Mime тип генерированного файла, который будет сгенерирован по результату успешного запуска канала

Пример канала

Рассмотрим в качестве примера написание нового выполняемого модуля для канала на Node JS. Для начала работы канала необходимо выбрать все записи в БД, которые были отправлены в канал. Для этого необходимо выполнить следующие действия:

  • Создать соединение с БД. В примере ниже создается соединение с БД "openpim" для процесса, запущенного в Docker контейнере к серверу БД запущенному на том же хосте, что и Docker контейнер. Для соединения используется пользователь "postgres" с паролем "sa".
import * as pg from 'pg'
const { Pool } = pg.default	   
const pool = new Pool({
  host: '172.17.0.1',
  database: 'openpim',
  password: 'sa',
  user: 'postgres',
  port: '5432'
})
1
2
3
4
5
6
7
8
9
  • Выбрать все записи из таблицы items у которых есть признак отправлено в канал. Поиск записей осуществляется по идентификатору канала ('channel_identifier') и статусу равному 1, что значит запись была отправлена в канал. Идентификатор канала находится в настройках канала. Результат запроса возвращается в формате JSON, в котором найденные записи доступны в поле "rows".
const channel = 'demoChannel'
let sql = `
  SELECT i.*
  FROM items i
  WHERE i.channels##>>'{${channel}, status}' = '1'
  `
const itemsForProcessing = await pool.query(sql)
console.log(`Найдено ${itemsForProcessing.rows.length} для обработки в канале.`)
1
2
3
4
5
6
7
8
  • Обработка списка полученных записей. Для примера обработки полученных записей используется функция (writeItemsToCSV) для создания CSV файла. В данную функцию передается массив записей, найденных на предыдущем шаге (itemsForProcessing.rows). В качестве выходного файла используется имя файла, передаваемое из настроек канала (поле "Генерируемое имя файла")
const fs = require('fs')
const path = require('path')
const { parse } = require('json2csv')

// Функция для записи массива itemsForProcessing в CSV файл
function writeItemsToCSV(items, outputFilePath) { 
	// Определение заголовка CSV 
	const fields = ['identifier', 'name']
	opts = { fields }
	try { 
		// Конвертация массива в CSV формат
		const csv = parse(items, opts)
		// Запись данных в файл
		fs.writeFileSync(outputFilePath, csv)
		console.log('CSV файл создан успешно:', outputFilePath); 
		return true
	} catch (err) { 
		console.error('Ошибка при создании CSV файла:', err); 
		return false
	} 
} 

// Вызов функции для обработки записей 
const processingResult = writeItemsToCSV(itemsForProcessing.rows, outputFilePath);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • По окончании обработки записей необходимо выполнить изменение статуса записей на следующие значения:
    • status = 2: значит запись была успешно обработана выполняемым модулем канала.
    • status = 3: значит, что произошла ошибка при обработке записи.
  • Для примера можно использовать значение, возвращаемое функцией writeItemsToCSV и для всех записей массива выставить соответствующее значение статуса.
if (processingResult) {
    itemsForProcessing.rows.forEach(item => {
    const sql1 = `update items set channels = jsonb_set(channels, '{${channel}}', channels->'${channel}' || '{"status" : 2, "syncedAt" : ${Date.now()} }') where identifier = '${item.identifier}'`
    pool.query(sql1)
    })
}else {
    itemsForProcessing.rows.forEach(item => {
    const sql1 = `update items set channels = jsonb_set(channels, '{${channel}}', channels->'${channel}' || '{"status" : 3, "syncedAt" : ${Date.now()} }') where identifier = '${item.identifier}'`
     console.log(`DEBUG: sql = ${sql1}`)
     pool.query(sql1)
    })
}
1
2
3
4
5
6
7
8
9
10
11
12

Результат работы канала доступен в разделе Каналы -> <Имя Канала> -> Запуски:

Выполняемый код демо канала вы можете найти по ссылке. Для запуска демо канала выполните следующие действия:

  1. В настройках системы OpemPIM создайте новый канал со следующими характеристиками:
    1. Закладка Свойства
      1. Идентификатор: demoChannel
      2. Наименование: Demo канал
      3. Активный: Выбрано
      4. Тип: Внешний
      5. Запуск канала вручную
      6. Укажите типы и видимо от в зависимости от модели данных
      7. Показывать статус канала у объекта: выбрано
    2. Закладка Конфигурация
      1. Запускаемая программа: node /filestorage/jobs/demoChannel/demoChannel.js {outputFile}.
      2. Генерируемое имя файла: demoProducts.csv
      3. Mime тип генерированного файла: text/csv
  2. Сохраните изменения для нового канала.
  3. Скопируйте содержимое архива в директорию на сервере. В параметрах запуска Docker контейнера с системой OpenPIM используется маппинг локальной директории на сервере с /filestorage в Docker контейнере. В этой локальной директории создайте новую директорию "jobs" и в ней директорию для канала: "demoChannel" куда и скопируйте содержимое архива.
  4. В пользовательском интерфейсе системы OpemPIM перейдите в раздел Каналы, выберите Demo канал и нажмите Запустить