@startuml dfd-telemetry title Диаграмма потоков данных (DFD) подсистемы слежения (телеметрия) skinparam shadowing false skinparam defaultFontName Helvetica skinparam rectangle { BorderColor black BackgroundColor #F5F5F5 } skinparam usecase { BorderColor #2C5AA0 BackgroundColor #E8F0FE } skinparam database { BorderColor #6B6B6B BackgroundColor #FFFFFF } ' ── Внешние сущности ─────────────────────────────────────────────── rectangle "Стратосферный зонд\n(тестовый клиент)" as sat rectangle "Оператор\n(браузер)" as op ' ── Процессы ────────────────────────────────────────────────────── usecase "1.0\nПриём телеметрии\n(WebSocket onmessage)" as p1 usecase "2.0\nЗагрузка истории\n(REST fetchHistory)" as p2 usecase "3.0\nНормализация\nparseTelemetry" as p3 usecase "4.0\nОтрисовка на карте\n(MapLibre $effect)" as p4 usecase "5.0\nАнализ отклонений\ncomputeDeviations" as p5 ' ── Хранилища данных ────────────────────────────────────────────── database "D1 | БД телеметрии\n(Backend)" as d1 database "D2 | points[]\n(TelemetryStore, in-memory)" as d2 database "D3 | result\n(прогноз рабочей области)" as d3 ' ── Потоки данных ───────────────────────────────────────────────── sat --> p1 : пакет телеметрии\n(JSON: lat, lon, alt, ts) p1 --> d1 : сохранение пакета p1 --> d2 : TelemetryPoint\n(unix-сек → ISO 8601) op --> p2 : UUID спутника d1 --> p2 : RawTelemetryPacket[]\n(новые первыми) p2 --> d2 : история (reverse → хронология) d2 --> p3 : points[] p3 --> p4 : Telemetry\n{flight_path[lat,lng,alt], launch} p4 --> op : трек + маркеры + анимированный\nмаркер текущего положения d2 --> p5 : фактические точки d3 --> p5 : прогнозная траектория p5 --> op : профиль высоты,\nгоризонтальное отклонение (Хаверсин),\nΔh, макс./текущее отклонение ' ── Текущие показатели (геттер latest) ──────────────────────────── d2 --> op : широта, долгота, высота,\nсчётчик пакетов legend left Нотация DFD (Йордан/ДеМарко): ▢ прямоугольник — внешняя сущность ◯ овал — процесс ▭ database — хранилище данных → — поток данных endlegend @enduml