From fafaeed41889d60aabf66d0f0ec631a3e9fba1f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=A1=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D1=8C=D0=B5=D0=B2?= Date: Mon, 1 Jun 2026 22:17:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=A0=D0=92=20=D0=BF=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=86=D0=B8=D1=8F=D0=BC=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Баллистика теперь сама берёт каталог станций у pcp-stations-service (новый StationCatalogClient, settings.stations-service, GET /api/stations) и строит ЗРВ по каждой реальной станции: PPI с ppiId == station.number, поэтому RadioVisibilityAreaDTO.stationId совпадает с номером станции. Раньше getRVA использовал одну захардкоженную фейковую станцию. Заодно исправляет автоматический расчёт сбросов (calculateDrops), который ходит в getRVA, и заполняет duration зоны. --- config-repo/pcp-ballistics-service.yaml | 2 + .../service/SatelliteService.kt | 33 +++++++++++---- .../service/StationCatalogClient.kt | 40 +++++++++++++++++++ 3 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/StationCatalogClient.kt diff --git a/config-repo/pcp-ballistics-service.yaml b/config-repo/pcp-ballistics-service.yaml index 2078a67..3224306 100644 --- a/config-repo/pcp-ballistics-service.yaml +++ b/config-repo/pcp-ballistics-service.yaml @@ -78,6 +78,7 @@ app: settings: calculation-interval: 7 + stations-service: ${pcp.services.stations} server: port: 8080 @@ -127,6 +128,7 @@ app: settings: calculation-interval: 28 ic-service: http://${pcp.network.host}:9080 + stations-service: ${pcp.services.stations} server: port: 7003 diff --git a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/SatelliteService.kt b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/SatelliteService.kt index 996f783..74d027b 100644 --- a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/SatelliteService.kt +++ b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/SatelliteService.kt @@ -102,6 +102,9 @@ class SatelliteService { @Autowired private lateinit var earthCellViewRepository: EarthCellViewRepository + @Autowired + private lateinit var stationCatalogClient: StationCatalogClient + val astro = AstronomerJ2000(EarthType.PZ90d02) @@ -800,17 +803,32 @@ class SatelliteService { bal.rollMin = 0.0 bal.rollMax = 45.0 / 180 * PI + // ЗРВ считаем по реальным станциям приёма — каталог берём у pcp-stations-service. + // Идентификатор PPI = station.number, поэтому RadioVisibilityAreaDTO.stationId + // совпадает с номером станции (клиент сопоставляет название по своему списку станций). + val stations = stationCatalogClient.allStations() + if (stations.isEmpty()) { + logger.warn("Нет зарегистрированных станций — ЗРВ для КА {} не рассчитываются", id) + return emptyList() + } - val r = bal.calculateZRV( - listOf(PPI(1,1,0.35, 0.45, 100.0, 0.0, PI/2)), - tstart, - tstop - ) + val ppis = stations.map { station -> + PPI( + station.number, 1, + station.position.lat * PI / 180, + station.position.long * PI / 180, + station.position.height, + station.elevationMin * PI / 180, + station.elevationMax * PI / 180 + ) + } + + val r = bal.calculateZRV(ppis, tstart, tstop) if (r != BallisticsError.OK) { logger.error("Ошибка при расчете параметров ЗРВ : $r") return listOf() } else - return bal.zrv.map { mkRVA(it, id)} + return bal.zrv.map { mkRVA(it, id) }.sortedBy { it.onStart.time } } @@ -820,7 +838,8 @@ class SatelliteService { revolution = p.vit.toLong(), onStart = mkTP(p.zoneIn), onMaximum = mkTP(p.zoneMax), - onStop = mkTP(p.zoneOut) + onStop = mkTP(p.zoneOut), + duration = (p.zoneOut.t - p.zoneIn.t) ) fun mkTP(p : VisibilityParametersZRV) = TargetPositionDTO( toDateTime(p.t), diff --git a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/StationCatalogClient.kt b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/StationCatalogClient.kt new file mode 100644 index 0000000..da8964c --- /dev/null +++ b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/service/StationCatalogClient.kt @@ -0,0 +1,40 @@ +package space.nstart.pcp.pcp_request_service.service + +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.ObjectProvider +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Service +import org.springframework.web.reactive.function.client.WebClient +import space.nstart.pcp.pcp_types_lib.dto.ballistics.StationDTO + +/** + * Клиент к pcp-stations-service: получение списка наземных станций приёма. + * + * Расчёт зон радиовидимости (ЗРВ) ведётся по реальным станциям, поэтому баллистика + * сама забирает их каталог у сервиса станций (а не получает с фронта). + */ +@Service +class StationCatalogClient(webClientBuilderProvider: ObjectProvider) { + private val webClientBuilder: WebClient.Builder = webClientBuilderProvider.ifAvailable ?: WebClient.builder() + private val logger: Logger = LoggerFactory.getLogger(this::class.java) + + @Value("\${settings.stations-service:stations-service}") + val url = "" + + /** Возвращает все зарегистрированные станции; при ошибке — пустой список (ЗРВ тогда не строится). */ + fun allStations(): List = + runCatching { + webClientBuilder.build() + .get() + .uri("$url/api/stations") + .retrieve() + .bodyToFlux(StationDTO::class.java) + .collectList() + .block() + ?: emptyList() + }.getOrElse { e -> + logger.error("Не удалось получить список станций из $url/api/stations: ${e.message}") + emptyList() + } +}