diff --git a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt index a32eb7b..b9d224b 100644 --- a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt +++ b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt @@ -18,7 +18,10 @@ import space.nstart.pcp.pcp_request_service.service.SatelliteService import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionCalculationRequestDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionModeDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.ExactTimePositionRequestDTO +import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjDTO +import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjViewRequestDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.OrbPointDTO +import space.nstart.pcp.pcp_types_lib.dto.ballistics.PositionDTO import kotlin.math.PI import kotlin.math.abs import kotlin.math.atan @@ -77,6 +80,7 @@ class AngularMotionService( fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO { validate(request) + validateTargetVisibility(request) val defaultConfig = AngularMotionConfig() val config = AngularMotionConfig( focus = request.focusMm ?: defaultConfig.focus, @@ -146,6 +150,34 @@ class AngularMotionService( } } + private fun validateTargetVisibility(request: AngularMotionCalculationRequestDTO) { + val windowStart = request.approximateTime.minusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES) + val windowStop = request.approximateTime.plusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES) + val visiblePoints = satelliteService.mplPoint( + ObjViewRequestDTO( + satellites = listOf(request.satelliteId), + timeStart = windowStart, + timeStop = windowStop, + obj = ObjDTO( + id = ANGULAR_MOTION_TARGET_ID, + position = PositionDTO( + lat = request.latitudeDeg, + long = request.longitudeDeg, + height = request.heightM, + ), + ), + ), + ).collectList().block().orEmpty() + + if (visiblePoints.isEmpty()) { + throw CustomValidationException( + "Заданная точка не видна КА ${request.satelliteId} в окрестности времени " + + "${request.approximateTime}: ${windowStart} — ${windowStop}. " + + "Выберите другое время, точку или спутник.", + ) + } + } + private fun loadOrbitalPoints( request: AngularMotionCalculationRequestDTO, config: AngularMotionConfig, @@ -198,5 +230,7 @@ class AngularMotionService( private companion object { const val MAP_INTERVAL_MINUTES = 5L + const val TARGET_VISIBILITY_WINDOW_MINUTES = 15L + const val ANGULAR_MOTION_TARGET_ID = "angular-motion-target" } }