Перейти к содержимому
СервисАпп API
На этой странице

Отказы и простои

Все операции. Авторизация. Запросы и повторы.

Все пути в этом файле дополняют /api/v1 на домене организации.

Описание и ограничения

Назначение

Учёт остановок, ремонта, ожидания запчастей и восстановления с историей этапов и затратами.

Поля и назначение

Публичное поле Формат и смысл Доступ
id, equipment_id id и обязательная единица только чтение / чтение и запись
kind, title, cause, remedy вид, название, причина и результат чтение и запись
started_at, restored_at дата и время; восстановление через transition чтение и запись / отдельная команда
state stopped / repair / waiting_parts / restored только чтение
restoration_cost денежное значение/null; отдельный доступ чтение и запись
equipment_defect_id, act_id, previous_downtime_id согласованные связи чтение и запись
waiting_parts_seconds учтённое время ожидания только чтение

Обязательность и null указаны в схемах каждой операции ниже.

Доступ и выборка

equipment_downtimes:read/write и права оборудования; стоимость и связанный акт требуют отдельных прав.

Фильтры: equipment_id, kind, state, started_from/to; незавершённые и восстановленные записи.

Чтение требует «ТОиР — Оборудование → Просмотр», запись — «ТОиР — Оборудование → Изменение»; действует проверка тарифа и модуля ТОИР. Текущие оборудование, клиент и объект проверяются заново. act_id возвращается как null без доступа к документу и его мастерской; запись требует «Акты приёма оборудования → Просмотр» и совпадения оборудования/клиента.

Стоимость — денежный объект amount/currency либо null. Чтение требует «Деньги → Просмотр», запись, включая очистку, — также «Деньги → Изменение». У связанного акта учитываются мастерские подключения и финансового права. Без акта стоимость доступна только при финансовом праве на всю организацию; иначе поле отсутствует. Сумма использует точность валюты организации и должна точно сохраняться в десятичном значении с двумя знаками после точки, без округления. Для JPY допустимо amount="100", для KWD — "100.000", но "100.001" отклоняется.

Список поддерживает sort=id/-id и пагинацию по курсору с размером страницы от 1 до 100 записей; started_from/to — включительные YYYY-MM-DD. История принимает только sort и page; её поля: id, equipment_downtime_id, state, occurred_at. Карточка не принимает параметров запроса, поддерживает ETag/304 после авторизации. GET не изменяет бизнес-данные.

Запросы и версии

Создание требует equipment_id, kind=unplanned/planned, непустой title и started_at. Допустимы cause, remedy, restoration_cost и три связи из таблицы. started_at и occurred_at — ISO 8601 с обязательным смещением либо Z, с точностью до секунды; сервер сохраняет тот же момент. Поля состояния, restored_at, reported_by и счётчики не принимаются из JSON.

Update — частичное изменение. Оборудование, вид, начало, исходный дефект и предыдущий отказ можно исправить только до первого перехода, пока существует единственное начальное событие stopped. Исправление начала обновляет это событие атомарно. После появления истории эти поля защищены ошибкой 409/DOWNTIME_HISTORY_PROTECTED. Название, причина, результат, стоимость и согласованная связь с актом остаются редактируемыми; отсутствие поля сохраняет значение.

Transition принимает state и необязательный occurred_at, по умолчанию текущий момент. Update и transition требуют If-Resource-Version из карточки: отсутствие — 428, несовпадение — 412. Версия — обычный секундный updated_at с ограничением совпавшей секунды из concurrency.md.

Создание возвращает 201, update/transition — 200 с карточкой, operation_id, affected_resources и warnings. Одинаковые значения не меняют версию и не создают событие. Повтор ключа возвращает исходный ответ, но перепроверяет исходные и текущие оборудование/клиента/объект, финансовые права и мастерские. Перенос владельца закрывает старую запись об операции ошибкой 404.

Правила и связи

  • Сервер проверяет пересечение периодов одной единицы под блокировкой.
  • Текущее состояние, ожидание и событие этапа изменяются атомарно.
  • Восстановление имеет время позже остановки; события не идут в будущее и не задним числом до текущего этапа.
  • Закрытый простой не открывается произвольным update; новый отказ связывается через previous_downtime_id.

Операции

Метод Путь Назначение
GET /equipment-downtimes Список с фильтрами и пагинацией
POST /equipment-downtimes Создание
GET /equipment-downtimes/{id} Карточка
GET /equipment-downtimes/{id}/events История этапов простоя
POST /equipment-downtimes/{id}/update Изменение разрешённых полей
POST /equipment-downtimes/{id}/transition Переход stopped / repair / waiting_parts / restored

GET /equipment-downtimes

Список с фильтрами и пагинацией.

Доступ. Разрешения подключения: equipment_downtimes:read. Права сотрудника: «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
sort параметр запроса строка нет нет Допустимо: "id", "-id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов
filter[equipment_id] параметр запроса целое число нет нет ≥ 1
filter[kind] параметр запроса строка нет нет Допустимо: "unplanned", "planned"
filter[state] параметр запроса строка нет нет Допустимо: "stopped", "repair", "waiting_parts", "restored"
filter[started_from] параметр запроса строка (дата) нет нет —
filter[started_to] параметр запроса строка (дата) нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment-downtimes" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /equipment-downtimes

Создание.

Доступ. Разрешения подключения: equipment_downtimes:write. Права сотрудника: «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
equipment_id целое число да нет ≥ 1
kind строка да нет Допустимо: "unplanned", "planned"
title строка да нет не более 255 символов
started_at строка (дата и время) да нет не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})$
cause строка / null нет да не более 5000 символов
remedy строка / null нет да не более 5000 символов
equipment_defect_id целое число / null нет да ≥ 1
previous_downtime_id целое число / null нет да ≥ 1
act_id целое число / null нет да ≥ 1
restoration_cost объект / null нет да Только перечисленные ключи
restoration_cost.amount строка да нет Шаблон: ^(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,6})?$; Условие: required_with:restoration_cost
restoration_cost.currency строка да нет не менее 3 символов; не более 3 символов; Условие: required_with:restoration_cost; Валюта context.currency; конвертация не выполняется.

Ответы

HTTP Назначение и схема
201 Создано. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
201 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-downtimes" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-downtimes-create:001" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-downtimes.create.json'

GET /equipment-downtimes/{id}

Карточка.

Доступ. Разрешения подключения: equipment_downtimes:read. Права сотрудника: «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
If-None-Match заголовок строка нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
304 Представление не изменилось, без тела. Условный GET
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 ETag строка
304 ETag строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment-downtimes/101" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

GET /equipment-downtimes/{id}/events

История этапов простоя.

Доступ. Разрешения подключения: equipment_downtimes:read. Права сотрудника: «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
filter[q] параметр запроса строка нет нет не более 200 символов
sort параметр запроса строка нет нет Допустимо: "id", "-id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment-downtimes/101/events" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /equipment-downtimes/{id}/update

Изменение разрешённых полей.

Доступ. Разрешения подключения: equipment_downtimes:write. Права сотрудника: «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
equipment_id целое число нет нет ≥ 1
kind строка нет нет Допустимо: "unplanned", "planned"
title строка нет нет не более 255 символов
started_at строка (дата и время) нет нет не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})$
cause строка / null нет да не более 5000 символов
remedy строка / null нет да не более 5000 символов
equipment_defect_id целое число / null нет да ≥ 1
previous_downtime_id целое число / null нет да ≥ 1
act_id целое число / null нет да ≥ 1
restoration_cost объект / null нет да Только перечисленные ключи
restoration_cost.amount строка да нет Шаблон: ^(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,6})?$; Условие: required_with:restoration_cost
restoration_cost.currency строка да нет не менее 3 символов; не более 3 символов; Условие: required_with:restoration_cost; Валюта context.currency; конвертация не выполняется.

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-downtimes/101/update" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-downtimes-update:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-downtimes.update.json'

POST /equipment-downtimes/{id}/transition

Переход stopped / repair / waiting_parts / restored.

Доступ. Разрешения подключения: equipment_downtimes:write. Права сотрудника: «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
state строка да нет Допустимо: "stopped", "repair", "waiting_parts", "restored"
occurred_at строка (дата и время) нет нет не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})$

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment-downtimes/101/transition" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-downtimes-transition:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment-downtimes.transition.json'