routes: объём маршрута (volumeMb) — расчёт, хранение в БД и отображение

Объём режима = скорость × длительность, Мбайт: съёмка 120 Мбайт/с (12 ГБ / 100 с), сброс — канал 1200 Мбит/с ÷ 8. Единый источник — ModeDataRates в pcp-types-lib. Хранится колонкой volume_mb (Flyway V10 mission-planing, V9 complex-mission, бэкфилл из duration), заполняется на всех путях построения через @PrePersist/@PreUpdate. DTO отдают вычисляемое read-only поле (та же формула). Фронт pcp-tgu-ops-ui показывает объём в редакторе (инспектор, построенный маршрут) и в сводке комплексного плана.
This commit is contained in:
Дмитрий Соловьев
2026-06-06 18:34:29 +03:00
parent 316e0ee552
commit 2499aebf2d
20 changed files with 190 additions and 13 deletions
@@ -3,7 +3,10 @@ package space.nstart.pcp.pcp_mission_planing_service.entity
import jakarta.persistence.Column
import jakarta.persistence.DiscriminatorValue
import jakarta.persistence.Entity
import jakarta.persistence.PrePersist
import jakarta.persistence.PreUpdate
import jakarta.persistence.Table
import space.nstart.pcp.pcp_types_lib.dto.satellite.mission.ModeDataRates
import java.time.LocalDateTime
@Entity
@@ -20,4 +23,14 @@ class DropModeEntity(
@Column(name = "duration", nullable = false)
var duration: Double = 0.0
) : ModeEntity(id, plan, timeStart, revolution)
) : ModeEntity(id, plan, timeStart, revolution) {
/** Объём сброса, Мбайт. Денормализация: считается из duration (канал 1200 Мбит/с ÷ 8) при сохранении. */
@Column(name = "volume_mb", nullable = false)
var volumeMb: Double = ModeDataRates.dropVolumeMb(duration)
@PrePersist
@PreUpdate
fun computeVolumeMb() {
volumeMb = ModeDataRates.dropVolumeMb(duration)
}
}
@@ -5,8 +5,11 @@ import jakarta.persistence.DiscriminatorValue
import jakarta.persistence.Entity
import jakarta.persistence.EnumType
import jakarta.persistence.Enumerated
import jakarta.persistence.PrePersist
import jakarta.persistence.PreUpdate
import jakarta.persistence.Table
import space.nstart.pcp.pcp_types_lib.dto.routes.SurveyModeStatus
import space.nstart.pcp.pcp_types_lib.dto.satellite.mission.ModeDataRates
import java.time.LocalDateTime
@Entity
@@ -46,4 +49,14 @@ class SurveyModeEntity(
@Enumerated(EnumType.STRING)
@Column(name = "source", nullable = false, length = 20)
var source: SurveyModeSource = SurveyModeSource.SLOT
) : ModeEntity(id, plan, timeStart, revolution)
) : ModeEntity(id, plan, timeStart, revolution) {
/** Объём маршрута съёмки, Мбайт. Денормализация: считается из duration при построении/сохранении. */
@Column(name = "volume_mb", nullable = false)
var volumeMb: Double = ModeDataRates.surveyVolumeMb(duration)
@PrePersist
@PreUpdate
fun computeVolumeMb() {
volumeMb = ModeDataRates.surveyVolumeMb(duration)
}
}
@@ -0,0 +1,8 @@
-- Объём данных как атрибут маршрута, Мбайт. Считается при построении из длительности
-- (см. ModeDataRates в pcp-types-lib): съёмка 120 Мбайт/с; сброс — канал 1200 Мбит/с ÷ 8 = 150 Мбайт/с.
ALTER TABLE survey_modes ADD COLUMN volume_mb DOUBLE PRECISION NOT NULL DEFAULT 0;
ALTER TABLE drop_modes ADD COLUMN volume_mb DOUBLE PRECISION NOT NULL DEFAULT 0;
-- Бэкфилл существующих маршрутов из длительности.
UPDATE survey_modes SET volume_mb = duration * 120;
UPDATE drop_modes SET volume_mb = duration * 1200.0 / 8;