Расчет витков по TLE

This commit is contained in:
emelianov
2026-06-17 15:28:04 +03:00
parent 6938700218
commit d38822db3e
6 changed files with 158 additions and 4 deletions
@@ -13,6 +13,7 @@ import space.nstart.pcp.pcp_types_lib.dto.ballistics.SatelliteICDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.SatelliteOrbitAvailabilityDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.TLEDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.TlePointRequestDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.TleRevolutionsRequestDTO
import space.nstart.pcp.slots_service.dto.tlecomparison.TleParsedDTO
import space.nstart.pcp.slots_service.configuration.CustomErrorException
import java.net.URI
@@ -115,6 +116,17 @@ class BallisticsService (webClientBuilderProvider: ObjectProvider<WebClient.Buil
.block()
?: throw CustomErrorException("Не удалось рассчитать положение по TLE на время $time")
fun tleRevolutions(tle: TLEDTO, days: Double): List<AscNodeDTO> =
webClientBuilder.build()
.post()
.uri("$url/api/tle/revolutions")
.bodyValue(TleRevolutionsRequestDTO(tle = tle, days = days))
.retrieve()
.bodyToFlux(AscNodeDTO::class.java)
.collectList()
.block()
?: emptyList()
private fun withTimeInterval(
path: String,
timeStart: LocalDateTime?,
@@ -11,6 +11,7 @@ import space.nstart.pcp.pcp_types_lib.dto.ballistics.InitialConditionsDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.MovementModel
import space.nstart.pcp.pcp_types_lib.dto.ballistics.OrbPointDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.SatelliteICDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.TLEDTO
import java.net.InetSocketAddress
import java.net.URI
import java.time.LocalDateTime
@@ -60,6 +61,13 @@ class BallisticsServiceTest {
)
)
val currentInitialConditions = service.currentInitialConditions(101L)
val tleRevolutions = service.tleRevolutions(
TLEDTO(
first = "1 25994U 99068A 26167.13049375 .00000315 00000-0 73126-4 0 9997",
second = "2 25994 97.9457 216.7186 0001501 193.3628 244.8059 14.61102329409455"
),
days = 1.5
)
assertEquals(
listOf(
@@ -69,7 +77,8 @@ class BallisticsServiceTest {
"/api/satellites/orbit/availability",
"/api/satellites/101/extract-time",
"/api/satellites/receive-rv",
"/api/satellites/101/initial-conditions/current"
"/api/satellites/101/initial-conditions/current",
"/api/tle/revolutions"
),
requests.map { it.path }
)
@@ -81,6 +90,7 @@ class BallisticsServiceTest {
null,
null,
null,
null,
null
),
requests.map { it.query }
@@ -89,9 +99,12 @@ class BallisticsServiceTest {
assertEquals(101L, availability.single().satelliteId)
assertNotNull(exactPoint)
assertEquals(timeStart, exactPoint.time)
assertEquals(true, requestBodies.single().contains(""""movementModel":"KONDOR""""))
assertNotNull(currentInitialConditions)
assertEquals(101L, currentInitialConditions.satelliteId)
assertEquals(emptyList(), tleRevolutions)
assertEquals(2, requestBodies.size)
assertEquals(true, requestBodies.any { it.contains(""""movementModel":"KONDOR"""") })
assertEquals(true, requestBodies.any { it.contains(""""days":1.5""") })
}
private fun createService(serverUrl: String): BallisticsService {
@@ -164,6 +177,11 @@ class BallisticsServiceTest {
""".trimIndent()
)
}
startedServer.createContext("/api/tle/revolutions") { exchange ->
requests.add(exchange.requestURI)
requestBodies.add(exchange.requestBody.bufferedReader().use { it.readText() })
respond(exchange, "[]")
}
startedServer.start()
server = startedServer
return "http://localhost:${startedServer.address.port}"