От бизнеса пришла задача по разработке "агента" для обработки файлов к печати. Агент будет разрабатываться отдельно, но будет внедряться в ХП. Схема работы агента следующая:

  1. пользователь (менеджер или клиент) загружает файл
  2. агент запрашивает параметры необходимой продукции (продукт, цветность, размер и тп)
  3. агент генерирует запрос для обработки файла и направляет его в сервис https://www.callassoftware.com/en/products/pdftoolbox 
  4. сервис обрабатывает файл и возвращает агенту файл уже готовый к печати
  5. при необходимости пользователь уточняет/меняет параметры (тогда возврат к п.3)

От нас в этой схеме потребуется только интерфейс работы с агентом (делаться он будет на базе сервиса https://n8n.io/ ) и умение работать с объектными (S3) хранилищами. Вместе с основной задачей мы сможем решить проблему хранения файлов в ХП как для МДМ, так и для других клиентов.

Предварительно было решено интегрироваться с сервисом Селектел https://selectel.ru/services/cloud/storage . Документация https://docs.selectel.ru/api/object-storage-s3/ . При обсуждении с Александром была предложена следующая схема:

  1. загружаем файл на наш сервер
  2. ставим задачу крону на перенос в хранилище
  3. переносим файл в хранилище
  4. прописываем в заказе путь к файлу
  5. удаляем файл с сервера

В документации рекомендовано использовать сегментированную загрузку ( https://docs.selectel.ru/cloud/object-storage/objects/upload-object/#segmented-upload ) для файлов 100МБ+. Это наш вариант, так как в полиграфии такие объемы - не редкость.

На стоимости хранения не отражается количество контейнеров (bucket`ов), поэтому для нашего удобства будем хранить в формате один заказ = один контейнер. Это позволит нам выдавать список файлов к заказу по содержимому контейнера и избежать проблем с перезаписью файлов (если в хранилище закинуть файл с именем, которое в нем уже существует, исходный файл перезаписывается). Этого можно было бы избежать путем ренейма файлов на на нашей стороне, но это будет неудобно для бизнеса. Файлы, готовые к печати, в большинстве случаев переименовываются на их стороне. В этом наименовании хранятся основные данные для работников производства. 

Что делаем:

  1. На странице "интеграции" (https://dev.helloprint.ru/integration) добавляем вкладку "Облачное хранилище". В "источник" пока добавляем только селектел . На этой странице размещаем поля для ввода данных, необходимых для аутентификации запросов (https://docs.selectel.ru/api/object-storage-s3/#authentication )
  2. Добавляем в заказе вкладку "Облако"
  3. Размещаем на этой вкладке поле "загрузить". Примерный образец:

    При "перетаскивании" файлов на это поле запускаем алгоритм загрузки файлов (об этом далее), при нажатии - открываем проводник для выбора файлов и после подтверждения юзером также запускаем алгоритм загрузки. Должна поддерживаться возможность загрузки нескольких файлов за одну операцию
  4. Алгоритм загрузки файлов:
    а) перед началом загрузки выдаем поп-ап для переименования файлов. Заголовок: Список файлов. Тело: список файлов в формате <поле для ввода наименования>.<расширение файла (не редактируемое)>. По умолчанию в поле для ввода наименования подставляем исходное наименование файла. Кнопки: Подтвердить и Отмена. Подтвердить - загружаем файлы с указанными наименованиями и закрываем поп-ап. Отмена - закрываем поп-ап без загрузки файлов.
    б) создаем контейнер с наименованием, совпадающим с номером заказа. Прописываем этот контейнер в БД для этого заказа.
    в) Загружаем эти файлы на сервер и закидываем в крон задачи на загрузку в облако. На вкладке под полем для загрузки выводим список файлов со статусом загрузки (для загрузки на наш сервер можно сделать заполняющуюся шкалу. Рядом со шкалой красный текст "Не закрывайте вкладку". Для файлов, ожидающих загрузки в облако, статус "Ожидает загрузки в облако", для загруженных статус не нужен). 
  5. При открытии вкладки загружаем список файлов в контейнере (если он есть) и ожидающих загрузки в облако (с соответствующим статусом). Если контейнера нет - отображаем только поле для загрузки файлов
  6. Добавляем раздел прав 14.4.13. Доступ к вкладке "Облако" (последующие видимо нужно сместить). В раздел добавляем 2 права - 14.4.13.1 Доступ к загрузке файлов в облако и 14.4.13.2 Доступ к скачиванию файлов из облака
  7. Для входящих API запросов /store-from-calculator, /request-orders, /one-click-orders и /cart-orders при получении файлов также запускаем алгоритм загрузки (п.4), но пропускаем этап с поп-апом (4а). Файлы загружаем с наименованием в формате <номер заказа>_<исходное наименование>. Cейчас файлы из этих запросов грузятся на сервер и работа проводится через вкладку "файлы". На данном этапе дублируем эту систему, позднее от нее откажемся скорее всего.
  • Нет меток