294b17757d
Отказ от остаточной UTC-семантики: naive LocalDateTime трактуется как локальное время единой зоны всех сервисов. Backend (границы внешних систем): - VisibilityPayloadParser, SyncSpacecraftFromNsiUseCase: ZoneOffset.UTC → ZoneId.systemDefault() для проекции внешних Instant/ISO-с-Z в naive. - тесты границ перевёрнуты на systemDefault (под Europe/Moscow ждут +3). - чистка UTC-формулировок в DTO-комментариях, мёртвых ссылок на docs/standards/DATETIME_UTC.md. Frontend (pcp-tgu-ops-ui): - utils/utcTime.ts → utils/localTime.ts: parseLocal/formatLocal*/toLocalIso/ toLocalInputValue с локальной семантикой (без дописывания Z и timeZone:UTC). - замена getUTC*/Date.UTC/toISOString-сериализации на локальные аналоги. - убраны пользовательские подписи «UTC» в редакторе/таймлайне. - удалён utcTime.guard.test.ts (форсил обратный UTC-инвариант); тест-фикстуры сделаны зоно-независимыми. tsc + vitest зелёные под TZ=UTC и TZ=Europe/Moscow. Включает также прочие незакоммиченные правки рабочего дерева.
Spacecraft Planning Service
Сервис планирования наблюдений космических аппаратов.
Сервис получает данные о доступных пунктах наблюдения и окнах наблюдения, строит непрерывную цепочку планов для каждого космического аппарата и отправляет уведомления перед началом каждого плана.
Основные возможности
Сервис выполняет следующие функции:
- хранит планы космических аппаратов
- строит непрерывную цепочку планов
- принимает обновления пунктов наблюдения
- пересчитывает планы при обновлении данных
- отправляет Kafka уведомления перед началом плана
- предоставляет REST API для чтения планов
Основные сущности
Plan
План космического аппарата.
Содержит:
- spacecraftId
- startTime
- endTime
- insertionPointId
SpacecraftPoints
Набор входных данных по одному космическому аппарату.
Содержит:
- spacecraftId
- список пунктов наблюдения
InsertionPoint
Пункт закладки.
Содержит:
- pointId
- список окон наблюдения
ObservationWindow
Окно наблюдения космического аппарата.
Содержит:
- startTime
- endTime
- elevationAngle
Алгоритм построения планов
Алгоритм MVP:
- Все
observationWindow.startTimeсчитаются кандидатами на старт плана. - Для текущего старта ищется следующий старт: