4.8 KiB
dev-2026-04-21-schedule-ui.md
Дата: 2026-04-21
Статус: DONE
ТЗ: TZ-schedule-ui-enrichment.md
Задача
Обогащение UI расписания данными из flight_actual и mart.flights:
- Новые колонки: ВПП, тип ВС, регистрация, длительность, взлёт/посадка факт
- Source badge для FR24-источников
- Track badge для RTL-SDR/FA треков
- Убрать дублирующийся столбец Трек и столбец Статус
Выполненные изменения
main.py — функция schedule_data()
-
SQL переписан с bare
FROM fr24_ext.scheduleнаFROM fr24_ext.schedule sс двумя LEFT JOIN:LEFT JOIN fr24_ext.flight_actual fa ON fa.fr24_id = s.fr24_id AND s.fr24_id IS NOT NULLLEFT JOIN fr24_mart.flights mf ON mf.flight_number = s.flight_number AND mf.flight_date = s.flight_date
-
Добавлены новые SELECT поля:
fa.runway_takeoff,fa.runway_landedfa.actual_distancefa.flight_time AS fa_flight_timefa.reg AS registrationfa.operated_asfa.category AS fa_categorymf.aircraft_typemf.track_source,mf.track_pointss.source AS sched_source
-
Фикс ambiguity:
_schedule_where()генерирует WHERE без table-alias. После JOIN столбцыflight_dateиflight_numberстановятся неоднозначными (есть вflight_actualиmart.flights). Решение: вschedule_data()применяетсяre.sub()для подстановкиs.prefix перед этими колонками в safe_where строке. -
Новые поля в JSON-ответе:
runway_takeoff,runway_landedactual_distanceflight_time_min(из fa_flight_time)registrationaircraft_typetrack_source,track_pointssched_sourceduration_eff=fa_flight_time or duration_min
schedule.html — полная перепись
Было: 12 колонок, Трек дублировался в col 2 и col 12, был столбец Статус
Стало: 13 колонок согласно ТЗ:
| # | Колонка | Данные |
|---|---|---|
| 1 | Дата | flight_date |
| 2 | Рейс | flight_number + cat badge + source badge |
| 3 | Авиакомпания | airline + registration (мелко) |
| 4 | ↑↓ | direction icon |
| 5 | Маршрут | thread_title или origin → destination |
| 6 | Аэропорт | airport_iata |
| 7 | По расп. | scheduled_at (MSK) |
| 8 | Взлёт факт | actual_takeoff (MSK) + delay badge |
| 9 | Посадка факт | actual_landed (MSK) + delay badge |
| 10 | Длит. | duration_eff в формате "2ч 35м" |
| 11 | ВПП | runway_takeoff → runway_landed |
| 12 | ВС | aircraft_type |
| 13 | Трек | ✈ FR24 + 🛰 RTL-SDR + FA badge |
Добавлен CSS:
.src-badge+.src-fr24для badge источника данных
schedule.js — полная перепись
Новые функции:
fmtDuration(min)— форматирует минуты как "2ч 35м" или "45м"
renderTable() переписана:
- 13 колонок вместо 12
actTakeoffCell: actual_takeoff + delayCell(delay_takeoff_min)actLandedCell: actual_landed + delayCell(delay_landed_min)airlineCell: airline +<small>registration</small>под нейsrcBadge: показывается еслиsched_source === 'fr24'trackCol: ✈ (если fr24_id) + 🛰 (если track_source=rtlsdr) + FA (если track_source=fa)runway:runway_takeoff → runway_landedили "—"acType: aircraft_typedurationCell: fmtDuration(duration_eff)
renderCards() обновлена — добавлены строки:
- Взлёт факт + задержка
- Посадка факт + задержка
- Длительность
- ВПП
- ВС / Борт (aircraft_type / registration)
- Трек (✈ FR24, 🛰 RTL-SDR, FA)
delayCell() — убран возврат "—" для null (теперь возвращает пустую строку,
чтобы не засорять ячейки когда задержки нет)
colspan везде обновлён с 12 на 13 (setLoading, showError, empty state)
Деплой
Файлы нужно скопировать на VM в контейнер fr24-api:
/home/fr24/projects/fr24/frontend/main.py
/home/fr24/projects/fr24/frontend/static/schedule.html
/home/fr24/projects/fr24/frontend/static/schedule.js
После: docker restart fr24-api