405f02aa86
PcpTimeModule (libs/pcp-types-lib): толерантные Jackson-десериализаторы LocalDateTime/OffsetDateTime/Instant — любой потребитель читает оба формата на проводе и нормализует к UTC. Только чтение, формат записи не меняется. Подключение фронтом по флоту: - Spring Boot auto-configuration + AutoConfiguration.imports — Boot-маппер всех 12 сервисов на pcp-types-lib (без правок в сервисах); - Jackson SPI (META-INF/services) — ручные мапперы с findAndRegisterModules(); - точечно: dynamic-plan/JacksonConfig (ручной ObjectMapper); - tgu (WebFlux, не зависит от либы) — локальное зеркало модуля в CamundaJacksonConfig (Jackson-2 путь). Зачем: микросервисы деплоятся независимо; с толерантностью продюсера можно флипать LocalDateTime -> OffsetDateTime (Z) в любом порядке без синхронного деплоя — потребитель не падает на парсинге офсета. Тесты: PcpTimeModuleTest (оба формата -> один UTC-момент + авто-подхват SPI). Доки: DATETIME_UTC.md (раздел 2bis + найденные баги формата), CHECKLIST.md.
Spacecraft Planning Service
Сервис планирования наблюдений космических аппаратов.
Сервис получает данные о доступных пунктах наблюдения и окнах наблюдения, строит непрерывную цепочку планов для каждого космического аппарата и отправляет уведомления перед началом каждого плана.
Основные возможности
Сервис выполняет следующие функции:
- хранит планы космических аппаратов
- строит непрерывную цепочку планов
- принимает обновления пунктов наблюдения
- пересчитывает планы при обновлении данных
- отправляет Kafka уведомления перед началом плана
- предоставляет REST API для чтения планов
Основные сущности
Plan
План космического аппарата.
Содержит:
- spacecraftId
- startTime
- endTime
- insertionPointId
SpacecraftPoints
Набор входных данных по одному космическому аппарату.
Содержит:
- spacecraftId
- список пунктов наблюдения
InsertionPoint
Пункт закладки.
Содержит:
- pointId
- список окон наблюдения
ObservationWindow
Окно наблюдения космического аппарата.
Содержит:
- startTime
- endTime
- elevationAngle
Алгоритм построения планов
Алгоритм MVP:
- Все
observationWindow.startTimeсчитаются кандидатами на старт плана. - Для текущего старта ищется следующий старт: