backend: правки complex-mission/mission-planing/request + тестовые паспорта

ComplexPlanRunOrchestrationService, MissionController, MissionPlaningService,
KafkaProducerConfig; обновлены тестовые JSON-паспорта route-processing.
This commit is contained in:
Дмитрий Соловьев
2026-06-06 00:04:17 +03:00
parent b454c01c09
commit 1d07588690
6 changed files with 64 additions and 27 deletions
@@ -10,6 +10,7 @@ import space.nstart.pcp.pcp_satellites_service.entity.ComplexPlanRunEntity
import space.nstart.pcp.pcp_types_lib.dto.requests.ComplexPlanProcessRequestDTO
import space.nstart.pcp.pcp_types_lib.dto.requests.CoverageCalculationSource
import tools.jackson.databind.json.JsonMapper
import java.time.Duration
import kotlin.system.measureTimeMillis
@Service
@@ -25,6 +26,8 @@ class ComplexPlanRunOrchestrationService(
private val objectMapper = JsonMapper.builder().findAndAddModules().build()
fun process(request: ComplexPlanProcessRequestDTO, requestedBy: String?): ComplexPlanRunResponseDTO {
validateInterval(request)
lateinit var selectedSatelliteIds: List<Long>
val resolveSatelliteIdsMs = measureTimeMillis {
selectedSatelliteIds = resolveSatelliteIds(request)
@@ -161,6 +164,25 @@ class ComplexPlanRunOrchestrationService(
request.satelliteId?.let { add(it) }
addAll(request.satelliteIds)
}.distinct().ifEmpty { satelliteService.satellites.map { it.satelliteId }.distinct() }
/**
* Интервал расчёта обязан быть корректным и не длиннее [MAX_INTERVAL_DAYS] суток: считать
* комплексный план по всем КА на больший горизонт слишком тяжело и бессмысленно для оперативного
* плана. Проверка до создания run, чтобы не плодить заведомо отклонённые записи.
*/
private fun validateInterval(request: ComplexPlanProcessRequestDTO) {
if (!request.intervalEnd.isAfter(request.intervalStart)) {
throw CustomValidationException("Interval end must be after interval start")
}
if (Duration.between(request.intervalStart, request.intervalEnd) > Duration.ofDays(MAX_INTERVAL_DAYS)) {
throw CustomValidationException("Complex plan interval cannot exceed $MAX_INTERVAL_DAYS days")
}
}
companion object {
/** Максимальная длина интервала расчёта комплексного плана, суток. */
const val MAX_INTERVAL_DAYS = 10L
}
}
data class ComplexPlanCalculationResult(