Отказы и простои
Все операции. Авторизация. Запросы и повторы.
Все пути в этом файле дополняют /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'