pcp: откат UTC-слоя — сквозной naive LocalDateTime без зоны на проводе
Возврат к модели «настенных часов»: одна ISO-строка без зоны
("2026-05-29T01:00:00") от БД до экрана, никто не привязывает её к
часовому поясу, сдвигаться нечему.
Бэкенд — снять зону с границы API:
- DTO OffsetDateTime/Instant -> LocalDateTime и убрана конвертация
atOffset(ZoneOffset.UTC)/toUtcOffset() в фабриках и мапперах:
tgu PlanResponse/NewChainDTOs/TguPlanningDTO, request RequestApiDtos,
complex ComplexPlanRun*DTO, dynamic ObservationParametersDebugDTO.
- Удалён толерантный Jackson-слой: PcpTimeModule(+autoconfig, ServiceLoader,
imports), PcpTimeModuleV3, LocalDateTimeTimeZoneSerializer; снята их
регистрация в Camunda/Rest/dynamic JacksonConfig. Штатный JSR-310
(JavaTimeModule + WRITE_DATES_AS_TIMESTAMPS=false) оставлен.
- Kafka-конверт KafkaMessage.time сериализуется ISO без офсета.
- mission-planing Mode/SurveyMode/DropMode entity и репозитории/сервис
переведены на LocalDateTime; колонки БД остаются timestamptz (Hibernate
мапит на naive без миграции — прецедент MissionEntity/PlanEntity).
- RequestServiceClient (dynamic) синхронизирован по типу с request-service.
Анти-регрессия: LocalDateTime.now(ZoneOffset.UTC) для серверных штампов
оставлен (выбор настенных часов UTC, не зона на проводе).
Фронт — снять офсет с egress: toUtcIso/фильтры отдают naive без Z
(после удаления толерантного десериализатора штатный парсер падал бы на Z).
Дисплейные хелперы (показ «как пришло», без сдвига) сохранены.
Тесты: контрактные ждут naive ISO; удалены UTC-артефакты (нормализация
офсетов) и тесты прослоек. Удалён docs/standards/DATETIME_UTC.md.
Операционно перед выкатом: сервисы катить согласованно; Kafka-топики с
ранее опубликованным офсетом +00:00 дренировать/проиграть.
This commit is contained in:
+3
-4
@@ -2,7 +2,6 @@ package space.nstart.pcp.pcp_satellites_service.dto
|
||||
|
||||
import space.nstart.pcp.pcp_satellites_service.entity.ComplexPlanRunStatus
|
||||
import java.time.LocalDateTime
|
||||
import java.time.OffsetDateTime
|
||||
|
||||
data class ComplexPlanRunResponseDTO(
|
||||
val runId: Long,
|
||||
@@ -11,9 +10,9 @@ data class ComplexPlanRunResponseDTO(
|
||||
val intervalEnd: LocalDateTime,
|
||||
val satelliteIds: List<Long>,
|
||||
val requestedBy: String?,
|
||||
val createdAt: OffsetDateTime,
|
||||
val startedAt: OffsetDateTime?,
|
||||
val finishedAt: OffsetDateTime?,
|
||||
val createdAt: LocalDateTime,
|
||||
val startedAt: LocalDateTime?,
|
||||
val finishedAt: LocalDateTime?,
|
||||
val durationMs: Long?,
|
||||
val errorMessage: String?,
|
||||
val calculatedModesCount: Int,
|
||||
|
||||
+3
-4
@@ -2,7 +2,6 @@ package space.nstart.pcp.pcp_satellites_service.dto
|
||||
|
||||
import space.nstart.pcp.pcp_satellites_service.entity.ComplexPlanRunStatus
|
||||
import java.time.LocalDateTime
|
||||
import java.time.OffsetDateTime
|
||||
|
||||
data class ComplexPlanRunSummaryDTO(
|
||||
val runId: Long,
|
||||
@@ -11,9 +10,9 @@ data class ComplexPlanRunSummaryDTO(
|
||||
val intervalEnd: LocalDateTime,
|
||||
val satelliteIds: List<Long>,
|
||||
val requestedBy: String?,
|
||||
val createdAt: OffsetDateTime,
|
||||
val startedAt: OffsetDateTime?,
|
||||
val finishedAt: OffsetDateTime?,
|
||||
val createdAt: LocalDateTime,
|
||||
val startedAt: LocalDateTime?,
|
||||
val finishedAt: LocalDateTime?,
|
||||
val durationMs: Long?,
|
||||
val errorMessage: String?,
|
||||
val calculatedModesCount: Int,
|
||||
|
||||
+6
-13
@@ -4,9 +4,6 @@ import org.springframework.stereotype.Component
|
||||
import space.nstart.pcp.pcp_satellites_service.dto.ComplexPlanRunResponseDTO
|
||||
import space.nstart.pcp.pcp_satellites_service.dto.ComplexPlanRunSummaryDTO
|
||||
import space.nstart.pcp.pcp_satellites_service.entity.ComplexPlanRunEntity
|
||||
import java.time.LocalDateTime
|
||||
import java.time.OffsetDateTime
|
||||
import java.time.ZoneOffset
|
||||
|
||||
@Component
|
||||
class ComplexPlanRunMapper {
|
||||
@@ -19,9 +16,9 @@ class ComplexPlanRunMapper {
|
||||
intervalEnd = entity.intervalEnd,
|
||||
satelliteIds = satelliteIds(entity),
|
||||
requestedBy = entity.requestedBy,
|
||||
createdAt = entity.createdAt.toUtcOffset(),
|
||||
startedAt = entity.startedAt?.toUtcOffset(),
|
||||
finishedAt = entity.finishedAt?.toUtcOffset(),
|
||||
createdAt = entity.createdAt,
|
||||
startedAt = entity.startedAt,
|
||||
finishedAt = entity.finishedAt,
|
||||
durationMs = entity.durationMs,
|
||||
errorMessage = entity.errorMessage,
|
||||
calculatedModesCount = entity.calculatedModesCount,
|
||||
@@ -46,9 +43,9 @@ class ComplexPlanRunMapper {
|
||||
intervalEnd = entity.intervalEnd,
|
||||
satelliteIds = satelliteIds(entity),
|
||||
requestedBy = entity.requestedBy,
|
||||
createdAt = entity.createdAt.toUtcOffset(),
|
||||
startedAt = entity.startedAt?.toUtcOffset(),
|
||||
finishedAt = entity.finishedAt?.toUtcOffset(),
|
||||
createdAt = entity.createdAt,
|
||||
startedAt = entity.startedAt,
|
||||
finishedAt = entity.finishedAt,
|
||||
durationMs = entity.durationMs,
|
||||
errorMessage = entity.errorMessage,
|
||||
calculatedModesCount = entity.calculatedModesCount,
|
||||
@@ -75,8 +72,4 @@ class ComplexPlanRunMapper {
|
||||
.mapNotNull { it.id }
|
||||
.distinct()
|
||||
.sorted()
|
||||
|
||||
private fun LocalDateTime.toUtcOffset(): OffsetDateTime =
|
||||
atOffset(ZoneOffset.UTC)
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user