Appearance
Use Case #UC-027.3: Обслуживание, Аварийные оповещения и Корректировка пробега 🛠️
1. Жизненная ситуация (Боль пользователя)
Представь: Велосипедист использует дорогую амортизационную вилку Fox 36. Производитель требует проводить базовое обслуживание (замену масла в штанах) каждые 50 часов налета, а полное обслуживание с заменой сальников — каждые 125 часов. При этом общий срок службы вилки до списания составляет десятки тысяч километров. Также бывает ситуация, когда пользователь забыл включить запись поездки на телефоне, или наоборот, прокатился на другом байке с этим же измерителем мощности. Ему нужно вручную скорректировать пробег детали, добавив или отняв "лишние" километры.
Как он мучается сейчас: Обычные трекеры позволяют только "сбросить" пробег детали до нуля. Пользователь не может сделать регулярное ТО (которое сбрасывает сервисный интервал), сохранив общий пробег детали за все годы службы. А ручная корректировка пробега отдельных деталей вообще невозможна: приходится вручную пересчитывать пробеги в уме.
Мечта юзера: Видеть два независимых трекера на карточке детали: "Срок службы" (Lifespan) и "Межсервисный интервал" (Service). Обслужил вилку? Нажал одну кнопку — сервисный интервал обнулился, а общий пробег остался нетронутым. Проехал тренировку без записи? Открыл модальное окно и ввел: +120 км. Все счетчики обновились автоматически.
2. Как это ДОЛЖНО работать у тебя (UX-Магия)
Интуитивно понятные шкалы износа и мгновенные действия.
Сценарий (Что видит юзер):
- На карточке каждого компонента в гараже отображаются две красивые полосы прогресса:
- Lifespan (Толстая шкала): Общий ресурс детали (например,
4500 / 5000 км). - Service (Тонкая шкала): Ресурс до следующего ТО (например,
80 / 100 часов).
- Lifespan (Толстая шкала): Общий ресурс детали (например,
- Умный выбор приоритета шкал: Если деталь отслеживает и километры, и часы (например, вилка), шкала автоматически рассчитывает износ по обоим параметрам и показывает тот, который ближе к критическому порогу 100% (по принципу "где тоньше, там и рвется").
- Цветовая палитра износа (HSL-логика):
- Зеленый (Безопасно): От
0%до74.9%— деталь свежая. - Желтый (Внимание): От
75%до89.9%— скоро потребуется обслуживание. - Красный (Критично):
>= 90%— износ превышен, требуется срочное вмешательство.
- Зеленый (Безопасно): От
- В контекстном меню детали (три точки
⋮) доступны два быстрых действия:- 💧 [ Провести обслуживание ]: Обнуляет текущий сервисный пробег/часы с красивой анимацией успеха.
- ⚖️ [ Скорректировать пробег ]: Открывает модальное окно для ввода положительной или отрицательной корректировки пробега (
deltaKm,deltaHours).
3. СЕКРЕТ ДЛЯ ПРОГРАММИСТА (Интервалы, шкала и математическое ограничение)
Обработка ручных действий и расчеты производятся с помощью специализированных Hono API эндпоинтов:
💧 Сброс сервисного интервала (
POST /api/components/:id/service):- Устанавливает поля
currentServiceKmиcurrentServiceHoursв0. - Обновляет дату последнего обслуживания
lastServiceDateна текущее время. - Важно: Поля
currentLifespanKmиcurrentLifespanHoursостаются абсолютно нетронутыми!
- Устанавливает поля
⚖️ Корректировка пробега (
POST /api/components/:id/adjust):- Принимает тело запроса
{ deltaKm?: number, deltaHours?: number }. - Значения дельт могут быть как положительными, так и отрицательными (для скручивания ошибочно начисленного износа).
- Прибавляет
deltaKmодновременно к двум счетчикам километров (currentLifespanKmиcurrentServiceKm). - Прибавляет
deltaHoursодновременно к двум счетчикам часов (currentLifespanHoursandcurrentServiceHours).
- Принимает тело запроса
4. Защита от "дурака" (Математическое ограничение пробега не ниже 0)
Ловушка: "Отрицательный пробег"
Проблема: Если пользователь скорректирует пробег на -500 км при текущем пробеге цепи 300 км, математическое сложение выдаст -200 км. Отрицательный износ сломает логику шкал прогресса и может вызвать падение рендеринга на клиенте. Решение:
- Защитный зажим (Clamping): На бэкенде в эндпоинте
/adjustпосле прибавления дельты результат математически зажимается встроенной функциейMath.max(0, newValue). Износ детали физически никогда не может опуститься ниже ровно0.0.
Эпики и Задачи (Epics & Tasks)
Epic 1: Действия над компонентами на Бэкенде (apps/api)
- Task 1.1: Реализовать эндпоинт
/serviceдля сброса сервисных счетчиков. - Task 1.2: Реализовать эндпоинт
/adjustс поддержкой отрицательных дельт и жестким ограничениемMath.max(0, value).
Epic 2: Визуальный движок износа и Шкалы (apps/web)
- Task 2.1: Разработать универсальный математический модуль расчета наихудшего износа (Tie-Breaker Km/Hours).
- Task 2.2: Создать динамический генератор цветов шкал прогресса на основе процентных порогов (Зеленый 75% -> Желтый 90% -> Красный).
- Task 2.3: Сверстать двойные шкалы износа (Lifespan + Service) на карточке детали.
Epic 3: Модальные окна действий
- Task 3.1: Интегрировать действие "Провести обслуживание" с оптимистичным обновлением состояния во фронтенд-хранилище.
- Task 3.2: Разработать модальное окно корректировки пробега с удобными полями ввода дельт.
Epic 4: Тестирование и надежность
- Task 4.1: Написать юнит-тесты на модуль расчета цвета и приоритета шкал (Tie-Breaker).
- Task 4.2: Покрыть тестами бэкенд-математику корректировок износа (особенно зажим на нулевом пробеге).