Skip to main content
Полный перечень полей — в глоссарии.

Что делает синхронизация автомобилей

Чтобы система могла подтягивать штрафы, во внешнем сервисе автоштрафов должен быть заведён список автомобилей, за которыми ведётся наблюдение. Синхронизация автомобилей отвечает за то, чтобы этот внешний список и локальный справочник Автомобилей сервиса автоштрафов совпадали, а также за то, чтобы каждая машина была связана с компанией через Привязку авто компании к сервису автоштрафов. Работа делится на две части:
  • Полная синхронизация каталога — фоновая выгрузка всех авто из сервиса автоштрафов в локальный справочник и наведение порядка (отключение исчезнувших, удаление «ничьих» машин).
  • Точечные операции по одному авто или группе — активация (завести машину в сервисе автоштрафов), деактивация (убрать одну машину) и массовое отключение по фильтру. Эти операции запускаются вручную из админки.
Все обращения к внешнему сервису идут через единый Клиент API сервиса автоштрафов: он сам авторизуется, кэширует токен на 1 час, повторяет запросы при временных сбоях и разбивает большие списки на страницы по 100 записей. Подробности — в конце страницы.

Модель данных

Автомобиль сервиса автоштрафов

Локальная запись об автомобиле, известном сервису автоштрафов. Именно к ней привязываются штрафы.

Привязка авто компании к сервису автоштрафов

Связь между единицей инвентаря конкретной компании и Автомобилем сервиса автоштрафов. Именно наличие или отсутствие такой привязки решает, считается ли машина «ничьей».

Полная синхронизация каталога авто

Это фоновая задача, которая приводит локальный справочник в соответствие с тем, что сейчас заведено в сервисе автоштрафов.

Шаг 1. Постраничная выгрузка

Задача запрашивает первую страницу списка авто (по 100 записей на страницу). Если сервис вернул признак ошибки, задача завершается с исключением и ничего не меняет. Иначе из ответа берётся общее число страниц (если сервис его не сообщил — считается, что страница одна), и система проходит по всем страницам по очереди.

Шаг 2. Создание или обновление записей

Для каждого автомобиля с очередной страницы система ищет локальную запись по Внешнему ID:
  • если такой записи нет — создаётся новая;
  • если запись есть — обновляются Номер автомобиля, Номер техпаспорта и Дата активации.
В обоих случаях флаг Активен выставляется в «да», а сам Внешний ID запоминается в списке «увиденных» на этой выгрузке.

Шаг 3. Отключение исчезнувших авто

После обхода всех страниц система берёт все локальные машины со включённым флагом Активен, которых не оказалось в свежей выгрузке, и снимает у них флаг Активен. Так справочник не хранит «включёнными» машины, которые в сервисе автоштрафов уже удалили.
Отключение исчезнувших авто выполняется только если выгрузка вернула хотя бы одну машину. Если сервис прислал пустой список (например, из-за временного сбоя, который прошёл все повторы), массового отключения не происходит — это защита от случайного обнуления всего справочника при пустом ответе.

Шаг 4. Удаление «ничьих» авто

Дальше система ищет активные машины, у которых нет ни одной Привязки авто компании к сервису автоштрафов, то есть за них не отвечает ни одна компания. Каждую такую машину система пытается удалить во внешнем сервисе. Если внешнее удаление прошло успешно, у локальной записи снимается флаг Активен. Смысл шага: не платить за наблюдение и не тянуть штрафы по автомобилям, которые больше ни к одной компании не относятся.
В отладочном режиме (когда включён флаг разработки) шаг 4 полностью пропускается: задача сразу завершается и сообщает, что «ничьих» машин удалено ноль. Никакие удаления во внешнем сервисе в этом режиме не выполняются.
По завершении задача возвращает число фактически удалённых «ничьих» авто.

Активация автомобиля

Активация заводит конкретную локальную машину во внешнем сервисе и синхронизирует её идентификатор. Запускается вручную (например, из админки) по одной выбранной записи. Порядок действий:
  1. Находится локальный Автомобиль сервиса автоштрафов по внутреннему идентификатору. Если запись не найдена — операция пропускается.
  2. Во внешнем сервисе создаётся авто по Номеру автомобиля и Номеру техпаспорта.
  3. Сразу после этого выполняется повторный поиск того же авто во внешнем сервисе — чтобы узнать, какой Внешний ID сервис ему присвоил.
  4. Если поиск ничего не вернул, операция сообщает, что авто создано, но синхронизировать идентификатор не удалось.
  5. Если авто найдено — локальная запись получает свежий Внешний ID, при наличии обновляются Номер автомобиля, Номер техпаспорта и Дата активации, флаг Активен ставится в «да», и запись сохраняется.
Повторный поиск нужен потому, что при создании авто внешний сервис сам присваивает ему идентификатор. Без синхронизации этого Внешнего ID штрафы по машине потом невозможно будет корректно сопоставить.

Деактивация автомобиля

Деактивация убирает одну машину из внешнего наблюдения. В отличие от активации, это фоновая задача. Порядок действий:
  1. Находится локальный автомобиль по внутреннему идентификатору. Если его нет — операция пропускается.
  2. Во внешнем сервисе выполняется удаление авто по его Внешнему ID.
  3. Если внешнее удаление не удалось — операция завершается с признаком неудачи, локальная запись не меняется.
  4. Если удаление прошло — у локальной записи снимается флаг Активен.

Массовое отключение по фильтру

Отдельная фоновая задача отключает сразу группу машин, отобранных по произвольному фильтру (например, все активные авто определённой компании). Порядок действий:
  1. Отбираются все активные машины, подходящие под переданный фильтр.
  2. Каждая из них удаляется во внешнем сервисе по её внешнему идентификатору — так же, как при деактивации одной машины и при удалении «ничьих» машин.
  3. У успешно удалённых снимается флаг Активен.
  4. Задача возвращает число отключённых машин.
Машина, которую не удалось удалить во внешнем сервисе, остаётся активной и локально: локальная отметка «неактивна» и снятие с внешнего наблюдения всегда идут парой. Иначе машина продолжала бы числиться на мониторинге и компания продолжала бы получать по ней штрафы.

Защита от параллельных запусков

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

Клиент API сервиса автоштрафов: авторизация, повторы, страницы

Все внешние вызовы (выгрузка, поиск, создание и удаление авто) идут через один клиент. Знать его устройство полезно, чтобы понимать поведение при сбоях.

Авторизация и токен

При первом обращении клиент авторизуется по логину и паролю из настроек и получает токен доступа. Токен кэшируется на 1 час, поэтому повторные операции не требуют новой авторизации. Если внешний сервис отвечает, что токен недействителен, клиент сбрасывает токен, авторизуется заново и один раз повторяет тот же запрос.

Повторы при сбоях

Клиент автоматически повторяет запрос до 3 раз при временных ответах сервера (коды 500, 502, 503, 504) с нарастающей паузой между попытками. Таймаут — 5 секунд на соединение и 30 секунд на ответ. Если после всех повторов ответ остаётся неуспешным, возникает Ошибка API сервиса автоштрафов с HTTP-кодом и телом ответа для диагностики.

Постраничность

Списки (авто и штрафы) всегда запрашиваются страницами по 100 записей с подсчётом общего числа страниц, поэтому большие каталоги выгружаются целиком без риска перегрузить память.

Особенности поведения

  • Отключение исчезнувших авто выполняется только при непустой выгрузке: если внешний сервис вернул хотя бы одну машину, все прочие активные авто помечаются отключёнными; при полностью пустом ответе массового отключения не происходит.
  • В отладочном режиме полная синхронизация каталога пропускает удаление «ничьих» авто целиком и возвращает нулевое число удалений — во внешнем сервисе ничего не удаляется. Отключение исчезнувших авто при этом всё равно отрабатывает, так как выполняется раньше проверки режима.
  • Дата активации при полной выгрузке и при активации берётся из внешнего ответа как есть, без ручного разбора формата даты — в отличие от разбора данных авто внутри штрафов, где дата приводится из отдельного строкового формата.
  • Активация авто, в отличие от деактивации и массового отключения, не является фоновой задачей и выполняется сразу в момент вызова; при неуспешном создании авто во внешнем сервисе ошибка не перехватывается и прерывает операцию.
  • При активации создание авто во внешнем сервисе и повторный поиск идут двумя отдельными запросами; если сразу после создания поиск не находит авто, локальный внешний идентификатор не обновляется и возвращается признак «создано, но не синхронизировано».
  • Защита от параллельных запусков ищет незавершённые задачи только за последнее окно (по умолчанию 1 час) по имени задачи и, при необходимости, по вхождению подстроки в её аргументы; задачи старше часа перестают блокировать новые запуски.
  • При недействительном токене клиент повторяет запрос ровно один раз после повторной авторизации; повторы при временных ошибках сервера (до 3 раз) — отдельный механизм, не связанный с обработкой ответа о недействительном токене.

Связанные страницы

Глоссарий: Синхронизация автомобилей

Полный перечень полей автомобилей сервиса автоштрафов и привязок к компаниям.

Сервис автоштрафов (штрафы и синхронизация авто)

Обзорная страница модуля интеграции с сервисом автоштрафов.

Модель данных

Справочные и транзакционные модели сервиса автоштрафов: авто, водители, компании-нарушители, штрафы и логи синхронизации.

API компании: авто и штрафы

Адреса арендодателя: привязка своих машин к сервису автоштрафов и просмотр штрафов только по ним.

Уведомления о штрафах

Сопоставление штрафа с активной арендой и отправка клиенту двуязычного сообщения в WhatsApp с PDF.