ТЗ по созданию партнёрской аналитики в админ-панели для Миши
1. Задача
Добавить в админ-панель раздел «Аналитика», где партнёр видит аналитику только по своим камерам и парковочным зонам.
Раздел должен заменить для партнёров текущий просмотр метрик через Grafana. Grafana остаётся внутренним инструментом команды, партнёрам доступ к ней не даём.
В админ-панели нужно показать:
- текущую занятость парковок;
- историю занятости;
- прогноз занятости;
- частоту обновления данных;
- уверенность модели;
- проблемные зоны и камеры;
- снимки камер;
- снимки последнего распознавания;
- возможность оценить качество распознавания.
Для админов (не для партнеров) дополнительно нужно показать:
- Качество прогнозов (occupancy + forecasts на одном графике с селектором времени создания прогноза) + числовые метрики -> обращаться к Руслану
2. Доступ
В меню админ-панели добавить раздел:
Аналитика
Доступ:
adminвидит аналитику по всем партнёрам или по выбранному партнёру;partnerвидит только свои камеры и парковочные зоны;- пользователь без прав на аналитику раздел не видит.
Выбор партнёра использовать существующий, который уже есть в админ-панели.
3. Страницы
Нужно сделать 4 состояния раздела аналитики:
- Общий дашборд аналитики
- Аналитика парковочной зоны
- Аналитика камеры
- Просмотр конкретного распознавания
Можно реализовать как отдельные страницы или как один раздел с переходами внутри него. Главное — пользователь должен понимать, где он находится, и иметь кнопку возврата назад.
4. Общий дашборд аналитики
4.1. Фильтры
Вверху страницы разместить фильтры:
-
период:
- сегодня;
- вчера;
- 7 дней;
- 30 дней;
- произвольный период;
-
парковочные зоны (должно быть возможно отмечать 1 или несколько и искать зоны по id или названию их камеры);
-
камеры (должно быть возможно отмечать 1 или несколько и искать камеры по id и названию);
-
детализация графиков:
- 5 минут;
- 15 минут;
- 1 час;
- 1 день;
-
кнопка обновления данных;
-
переключатель автообновления.
По умолчанию:
- период — сегодня;
- автообновление включено;
- интервал автообновления — 60 секунд.
API:
- список зон брать из существующего API зон;
- список камер брать из существующего API камер;
- данные графиков брать из новых analytics API.
4.2. KPI-карточки
Под фильтрами показать карточки (все метрики - только по тем сущностям, к которым у пользователя есть доступ):
- активных зон;
- всего парковочных мест;
- занято сейчас;
- свободно сейчас;
- средняя занятость за период;
- самое свежее обновление;
- самое старое обновление;
- средняя частота обновления;
- максимальный интервал между обновлениями;
- средняя уверенность модели.
Если значения нет — показывать —, а не 0.
API:
/admin/analytics/summary;/admin/analytics/update-frequency;/admin/analytics/confidence.
4.3. Карта зон и камер
На отдельной странице дашборда показать карту.
На карте отображать:
- парковочные зоны;
- камеры;
- только объекты выбранного партнёра.
Парковочные зоны раскрашивать по текущей занятости:
- зелёный — занято меньше 60%;
- жёлтый — занято от 60% до 85%;
- красный — занято больше 85%;
- серый — нет данных;
- оранжевый — данные устарели (пороговое время в минутах положить в .env).
При клике на зону показывать:
- id;
- всего мест;
- занято;
- свободно;
- процент занятости;
- последнее обновление;
- кнопку перехода в редактирование камеры с этой зоной;
- кнопку перехода в аналитику зоны.
При клике на камеру показывать:
- id, название камеры;
- статус;
- последнее обновление;
- кнопку перехода в редактирование камеры
- кнопку перехода в аналитику камеры.
API:
- существующий API зон;
- существующий API камер;
/admin/analytics/summary.
4.4. График занятости
График: линейный.
Показывать изменение занятости за выбранный период.
Ось X:
- время.
Ось Y:
- занятость в процентах.
Если выбрана конкретная зона — показывать одну линию.
Если выбрано несколько зон — показывать несколько линий, но не больше 10.
У каждой линии графика должна быть легенда с подписью, при нажатии на подпись линия должна отображаться или скрываться с графика, как в Grafana.
Если зон больше 10 — показывать среднее значение по выбранным зонам.
Tooltip должен показывать:
- время;
- зона;
- занято;
- свободно;
- всего мест;
- занятость в процентах;
- confidence;
- количество наблюдений.
API:
/admin/analytics/occupancy-history.
4.5. График прогноза занятости
График: линейный.
На одном графике показать:
- фактическую занятость;
- прогноз занятости.
Факт рисовать обычной линией.
Прогноз рисовать пунктирной линией.
Период прогноза задается в фильтрах, как и для других графиков.
У каждой линии графика должна быть легенда с подписью, при нажатии на подпись линия должна отображаться или скрываться с графика, как в Grafana.
API:
/admin/analytics/occupancy-history;/admin/analytics/occupancy-forecast.
4.6. График количества наблюдений
График: столбчатый.
Показывать, сколько наблюдений было получено за каждый временной интервал.
Нужен, чтобы видеть, как часто система реально обновляет данные.
Ось X:
- время.
Ось Y:
- количество наблюдений.
API:
/admin/analytics/observations-rate.
4.7. График уверенности модели
График: линейный.
Показывать средний confidence за выбранный период.
Название в интерфейсе:
Уверенность модели
Не использовать слово «точность» для confidence.
Ось X:
- время.
Ось Y:
- confidence в процентах.
API:
/admin/analytics/confidence.
4.8. Таблица проблемных зон
Таблица должна показывать состояние detector-а по зонам.
Колонки:
- зона;
- камера;
- всего мест;
- занято;
- свободно;
- занятость (в процентах);
- уверенность модели;
- последнее обновление;
- сколько времени прошло с последнего обновления;
- средний интервал обновлений;
- максимальный интервал обновлений;
- статус.
Статусы:
online— данные свежие;stale— данные устарели;offline— давно нет данных;no_data— данных ещё не было;low_confidence— низкая уверенность модели.
Клик по строке открывает аналитику выбранной зоны.
API:
/admin/analytics/detector-health.
5. Страница парковочной зоны
На странице зоны показать аналитику только по одной зоне.
5.1. Верхний блок
Показать:
- id зоны;
- связанная камера;
- всего мест;
- занято сейчас;
- свободно сейчас;
- процент занятости;
- уверенность модели;
- последнее обновление;
- статус зоны.
Кнопки:
- назад к аналитике;
- открыть связанную камеру.
API:
- существующий API зоны;
/admin/analytics/summary.
5.2. Карта зоны
Показать зону на карте. Также вывести координаты опорных точек текстом.
Если есть геометрия — показать polygon.
Если геометрии нет — показать сообщение:
У зоны не задана геометрия.
API:
- существующий API зоны.
5.3. Графики зоны
На странице зоны показать:
-
Занято / свободно
- line chart;
- две линии: занято и свободно.
-
Занятость, %
- line chart;
- одна линия: процент занятости.
-
Прогноз занятости
- факт + прогноз на 24 часа.
-
Уверенность модели
- confidence по времени.
-
Интервалы обновления
- средний и максимальный интервал обновления.
API:
/admin/analytics/occupancy-history;/admin/analytics/occupancy-forecast;/admin/analytics/occupancy-heatmap;/admin/analytics/confidence;/admin/analytics/update-frequency.
6. Страница камеры
На странице камеры показать аналитику только по одной камере.
6.1. Верхний блок
Показать:
- id, название камеры;
- источник камеры;
- статус камеры;
- координаты;
- количество связанных зон;
- последнее обновление;
- средний интервал обновлений;
- средняя уверенность модели.
Кнопки:
- назад к аналитике;
- открыть камеру в разделе камер;
- открыть разметку камеры.
API:
- существующий API камеры;
- существующий API зон;
/admin/analytics/detector-health;/admin/analytics/update-frequency;/admin/analytics/confidence.
6.2. Снимки камеры
Сделать блок с тремя вкладками:
-
Последний снимок
- последний кадр, полученный с камеры.
-
Последнее распознавание
- raw-кадр, на котором выполнялась последняя детекция.
-
С разметкой
- кадр последней детекции с bounding boxes, confidence и разметкой зоны.
Для каждого изображения показать:
- timestamp;
- кнопку обновления;
- кнопку fullscreen.
Если снимка нет — показать понятную причину.
API:
/cameras/{cameraId}/snapshot.
6.3. Графики камеры
На странице камеры показать:
-
Количество наблюдений
- bar chart;
- сколько наблюдений пришло по этой камере.
-
Уверенность модели
- line chart;
- средний confidence по времени.
-
Интервалы обновлений
- bar chart;
- средний и максимальный интервал обновления.
-
Здоровье зон камеры
- таблица зон, которые зависят от этой камеры.
API:
/admin/analytics/observations-rate;/admin/analytics/confidence;/admin/analytics/update-frequency;/admin/analytics/detector-health.
6.4. Последние распознавания
Показать таблицу последних 20 распознаваний камеры.
Колонки:
- время;
- статус;
- время обработки;
- количество найденных машин;
- занято;
- свободно;
- уверенность модели;
- есть ли оценка качества;
- кнопка открытия распознавания.
Клик открывает страницу конкретного распознавания.
API:
/admin/analytics/cameras/{cameraId}/detections.
7. Страница распознавания
Страница нужна для просмотра одного конкретного запуска распознавания и оценки его качества.
7.1. Информация о распознавании
Показать:
- id распознавания;
- id камеры;
- id зоны;
- время начала;
- время завершения;
- статус;
- время обработки;
- версия модели;
- количество найденных машин;
- занято;
- свободно;
- всего мест;
- уверенность модели;
- ошибка, если распознавание завершилось неуспешно.
API:
/admin/analytics/detections/{detectionRunId}.
7.2. Сравнение изображений
Показать рядом:
- raw-изображение;
- annotated-изображение.
Если экран узкий — показывать изображения друг под другом.
Для каждого изображения:
- fullscreen;
- открыть в новой вкладке.
7.3. Оценка качества распознавания
Добавить форму оценки.
Поля:
-
оценка:
- корректно;
- частично корректно;
- некорректно;
-
правильное количество занятых мест;
-
правильное количество свободных мест;
-
тип ошибки:
- лишняя машина;
- машина не найдена;
- машина привязана не к той зоне;
- плохое освещение;
- плохой ракурс;
- проблема калибровки;
- другое;
-
комментарий.
После сохранения показать сообщение:
Оценка сохранена.
Если оценка уже есть — показывать её на странице.
API:
GET /admin/analytics/detections/{detectionRunId};POST /admin/analytics/detections/{detectionRunId}/feedback.
7.4. Просмотр фидбеков по распознаванию (только для администраторов)
Раздел доступен только пользователям с ролью admin.
На странице распознавания показать блок с историей всех оставленных оценок качества для данного распознавания.
Показать таблицу:
- дата и время создания оценки;
- пользователь;
- оценка качества;
- правильное количество занятых мест;
- правильное количество свободных мест;
- тип ошибки;
- комментарий.
Если оценок несколько, отображать их в порядке от новых к старым.
При клике на запись открывать подробный просмотр оценки.
В подробном просмотре показать:
- автора оценки;
- дату создания;
- дату последнего изменения;
- все заполненные поля формы;
- историю изменений, если она доступна.
Если фидбеков нет, показать сообщение:
Для данного распознавания ещё нет оценок качества.
API:
GET /admin/analytics/detections/{detectionRunId}/feedback;GET /admin/analytics/detections/{detectionRunId}/feedback/{feedbackId}.
8. Взаимодействие с backend
Frontend не должен сам считать сложные агрегаты.
На frontend можно считать только:
- форматирование дат;
- проценты для отображения, если backend отдал числитель и знаменатель;
- визуальный статус по уже отданным полям;
- подписи и цвета.
Backend должен отдавать уже подготовленные данные для:
- KPI;
- истории занятости;
- прогноза;
- heatmap;
- confidence;
- частоты обновлений;
- detector health;
- snapshots;
- detection runs;
- feedback.
Frontend должен передавать в analytics API:
- выбранного партнёра;
- выбранный период;
- выбранную зону;
- выбранную камеру;
- выбранную детализацию.
9. Состояния интерфейса
Для каждого блока отдельно обработать:
- загрузку;
- ошибку;
- пустые данные.
Если один график не загрузился, вся страница не должна падать.
Примеры сообщений:
Нет данных за выбранный период;Прогноз недоступен;Снимок недоступен;Не удалось загрузить график;У зоны нет свежих наблюдений.
10. Критерии готовности
Задача готова, если:
- в админ-панели появился раздел
Аналитика; - партнёр видит только свои данные;
- admin может смотреть данные всех партнёров или выбранного партнёра;
- на общем дашборде есть фильтры, KPI, карта, графики и таблица проблемных зон;
- можно открыть аналитику конкретной зоны;
- можно открыть аналитику конкретной камеры;
- на странице камеры есть 3 типа снимков;
- можно открыть конкретное распознавание;
- можно сравнить raw и annotated изображение;
- можно отправить оценку качества распознавания;
- confidence в интерфейсе называется
Уверенность модели; - при ошибке одного блока остальные блоки продолжают работать;
- при пустых данных показываются понятные сообщения.