Skip to content

apps/panel 0.84.0 ​

English · Русский

Дата выпуска: 28 сентября 2026 года. Предыдущая версия: 0.83.0.

Совместимость ​

  • Эта версия работает только с API, в котором есть новое файловое хранилище. Панель «Файлы» запрашивает из него файлы, их карточки и миниатюры, а терминал оператора — параметры и содержимое своих документов; с прежним API они не смогут открыть файлы.
  • Файлы прежнего хранилища панель не переносит. Если владелец API не перенёс их содержимое, карточки таких файлов по-прежнему видны, но содержимое не открывается; на тестовом API такие файлы отвечают 404.

Что изменилось ​

Терминал оператора: рабочие команды ​

Изменения этого и двух следующих разделов касаются терминала оператора, у которого panel.request — стандартный запрос на WorkOrderOperation.

  • Терминал теперь отправляет рабочие команды в API: «Старт» на количество из партии операции или на выбранные серийные изделия, «Пауза», продолжение приостановленной операции кнопкой «Старт», «Годные» и завершение выбранной задачи. Надпись о том, что команды не подключены, для этого источника больше не появляется.
  • Формы «Старта» и «Годных» при открытии читают экземпляры материала операции: у операции с партией видны партия и допустимое количество, у серийной — карточка каждого изделия в очереди или в работе.
  • После каждой успешной команды терминал заново читает операцию и её задачи. Он показывает задачу в работе, а после «Паузы», продолжения и «Годных» оставляет выбранную задачу.
  • Если API отклоняет команду, терминал показывает сообщение API над рабочей областью и ничего не меняет. Например, API отклонил годные, пока задача операции была в работе, и принял их после завершения задач.

Терминал оператора: задачи и изделия ​

  • При открытии операции и после каждой успешной команды терминал читает задачи, их статусы и порядок из operation/init. Задачи начала и конца графа не показываются.
  • Для серийной операции кнопка «Изделие» выбирает одно изделие операции. Если показана рабочая инструкция, терминал читает её заново для этого изделия; после этого строка шапки «Сер. № / № партии» показывает серийный номер изделия.

Терминал оператора: живые обновления ​

  • Если для развёртывания включены живые обновления, терминал напрямую применяет уведомление об открытой операции, которое может применить точно: уведомление таймера со статусом, stateEnteredAt и remainingDuration продолжает отсчёт от них, а уведомление о количествах заменяет только переданные в нём счётчики, даже если количества приходят отдельными уведомлениями. После остальных уведомлений терминал по-прежнему читает операцию заново.
  • Уведомление, пришедшее во время чтения или команды, не применяется: после этой работы терминал снова читает операцию, потому что прочитанные за это время данные могут оказаться новее уведомления.

Терминал оператора: список, шапка и задачи ​

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

  • Карточки операций показывают иконку метатипа операции. Со стандартным запросом терминал читает её из /MetaTypes/{metaTypeName}, а демонстрация возвращает её вместе с каждой операцией.
  • Со стандартным запросом список больше не показывает операции в разработке и в планировании (inDevelopment, inScheduling) — при любом поиске и любых фильтрах.
  • Кнопка поиска примыкает к полю поиска, а в плановом старте на карточке операции между датой и временем больше нет запятой.
  • Задачи операции занимают меньше места: кнопка задачи показывает иконку статуса вместо порядкового номера и название не длиннее двух строк; то, что не поместилось, обрезается многоточием, а более широкая строка под содержимым задачи повторяет название выбранной задачи.
  • Без headerFields шапка показывает заказ, материал (materialDefinition), серийный номер или номер партии и рабочее место; названия операции в ней больше нет.

Со стандартным запросом каждая строка шапки по умолчанию показывает значение, только если request.attributeList называет её атрибут: workOrder, materialDefinition или selectedWorkUnit.name. Без него в строке показывается —; для новой строки материала добавьте materialDefinition. Чтобы в шапке осталось название операции, перечислите строки шапки сами, например:

json
{
  "panel": {
    "type": "operatorTerminal",
    "terminalConfig": {
      "headerFields": [
        { "label": { "ru": "Операция", "en": "Operation" }, "parts": [{ "attribute": "name" }] },
        { "label": { "ru": "Заказ", "en": "Order" }, "parts": [{ "attribute": "workOrder" }] },
        { "label": { "ru": "Материал", "en": "Material" }, "parts": [{ "attribute": "materialDefinition" }] },
        { "label": { "ru": "Сер. № / № партии", "en": "Serial / batch no." }, "parts": [{ "context": "materialInstance" }] },
        { "label": { "ru": "Рабочее место", "en": "Workplace" }, "parts": [{ "attribute": "selectedWorkUnit.name" }] }
      ]
    }
  }
}

Панель «Файлы» и документы ​

  • Панель «Файлы» и терминал оператора работают с новым файловым хранилищем API: загрузка, замена, миниатюры в карточках, галерея и скачивание передают токен пользователя в каждом запросе к файлу.
  • При замене файл остаётся тем же: все наборы данных, которые на него ссылаются, показывают новое содержимое после следующей загрузки списка файлов, а прежнее содержимое из панели не открыть. Окно замены больше не предлагает удалить старый файл.
  • Если API отказал в содержимом файла, галерея и область документов терминала оператора показывают только своё сообщение, без общего уведомления об ошибке запроса. При ошибке чтения параметров файла или сбое сети общее уведомление по-прежнему появляется.
  • Панель «Файлы» теперь показывает файлы объекта, выбранного после того, как панель открылась без выбора. Раньше она оставалась пустой, пока страницу не перезагружали с уже выбранным объектом.

Файлы для методов ​

  • Форма runMethod может запросить у пользователя файл: поле с "control": "scratchFile" загружает выбранный файл, когда пользователь отправляет форму, и передаёт методу его токен в атрибуте поля.
  • Если пользователь запускает действие runMethod и метод возвращает файл токеном download, панель скачивает файл в папку загрузок браузера. Для возвращаемых файлов настройка не нужна. Методы, которые панель вызывает для чтения данных — через request.methodName или редактор runMethod действия create, — возвращённые файлы не скачивают.

Минимальное действие с полем выбора файла:

json
{
  "id": "import-materials",
  "method": "runMethod",
  "label": { "ru": "Импорт материалов", "en": "Import materials" },
  "editor": {
    "mode": "modal",
    "fields": [
      {
        "attribute": "scratchToken",
        "type": "String",
        "control": "scratchFile",
        "label": { "ru": "Файл импорта", "en": "Import file" }
      }
    ]
  },
  "request": {
    "parent": "MaterialDefinition",
    "methodName": "materialImport",
    "objects": [{ "getFromItem": true }]
  }
}

Метод получает токен в params.scratchToken. MaterialDefinition и materialImport — названия для примера: укажите вместо них метатип и метод своего API.

Известные ограничения ​

Терминал оператора ​

  • Вместе с сообщением терминала об отклонённой команде приложение показывает своё общее уведомление об ошибке запроса.
  • Форма «Старта» или «Годных» показывает экземпляры материала, прочитанные при её открытии. Если операция изменилась в другом месте, пока форма открыта, нажмите «Отмена» и откройте форму снова.
  • «Обновить состояние» сбрасывает выбранное серийное изделие; при необходимости выберите его снова.
  • «Старт» и «Годные» недоступны для операции, у которой traceabilityType не равен 0, 1 или 2.
  • Содержимое есть только у задачи рабочей инструкции; остальные задачи можно выбрать и завершить.
  • Для операции из API таймер не становится жёлтым: API не даёт плановой длительности для порога 90%.
  • Таймер показывает stateEnteredAt и remainingDuration из API как есть. Тестовый API сейчас записывает stateEnteredAt примерно на три часа позже и прибавляет к остатку около трёх часов после паузы и «Годных», поэтому таймер может показывать больше времени, чем осталось у операции.
  • Если в уведомлении таймера нет stateEnteredAt или remainingDuration, если значение нельзя применить точно или уведомления могли потеряться, терминал снова читает операцию. Статусы задач и карточки списка по-прежнему меняются после «Обновить состояние» или повторного открытия.
  • «Мои операции» по-прежнему недоступны.

Файлы ​

  • Миниатюра, которую сервер ещё готовит, появляется, когда панель в следующий раз загружает список файлов: при выборе объекта, а также после загрузки, замены, удаления или отвязки файла или правки его метаданных.
  • Чтобы показать файл, галерея скачивает его целиком — до 1 ГиБ; стрелки над просмотрщиком открывают предыдущий или следующий файл. Ленты миниатюр и переключения клавишами-стрелками в просмотрщике больше нет.
  • Файлы Word, Excel и PowerPoint в просмотрщике не отображаются.
  • Поле выбора файла работает только в редакторе действия runMethod, и ему нужен явный "type": "String" без defaultValue. Иначе поле показывает ошибку настройки и действие не выполняется; исправьте JSON приложения — повторный запуск без изменений не поможет.
  • Размер выбранного файла — до 256 МиБ. Имя скачанного файла сервер передаёт в Content-Disposition. Файл сохраняется как download, если сервер не передал имя или если apiPrefix указывает на другой домен, а API не открывает этот заголовок через Access-Control-Expose-Headers; развёртываний за прокси /backend того же домена это не касается.
  • Если запуск возвращает несколько файлов, браузер может попросить разрешить несколько загрузок со страницы.
  • Метод, который по-прежнему возвращает в download старую ссылку files/download-tmp/…, теперь приводит к сообщению, что файл не скачан; владельцу метода нужно возвращать файл нового хранилища.

Обновлённая документация ​

  • Раздел «Команды операции WorkOrderOperation» перечисляет кнопки, условия их доступности, отправляемые запросы и то, что терминал читает после команды.
  • Раздел «Выбор изделия» описывает, как оператор выбирает изделие серийной операции и когда меняется шапка.
  • Руководство по терминалу оператора описывает, когда живое обновление применяется из уведомления, а когда терминал снова читает операцию, условия списка, кнопки задач и строки шапки по умолчанию.
  • Файлы — миниатюры, галерея, скачивание и замена с новым хранилищем.
  • Запуск метаметода — поле выбора файла и файлы, которые возвращает метод.
  • Редакторы — параметр поля control и где он допустим.