Формат времени в UTC

This commit is contained in:
emelianov
2026-06-25 16:21:17 +03:00
parent d0ec0ef754
commit fe54c095ab
164 changed files with 1847 additions and 634 deletions
@@ -0,0 +1,51 @@
package space.nstart.pcp.pcp_satellites_service.configuration
import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.convert.converter.Converter
import org.springframework.format.FormatterRegistry
import org.springframework.web.reactive.config.WebFluxConfigurer
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import tools.jackson.core.JsonGenerator
import tools.jackson.core.JsonParser
import tools.jackson.databind.DeserializationContext
import tools.jackson.databind.SerializationContext
import tools.jackson.databind.deser.std.StdDeserializer
import tools.jackson.databind.module.SimpleModule
import tools.jackson.databind.ser.std.StdSerializer
import java.time.LocalDateTime
@Configuration
class UtcTimeJsonConfiguration : WebFluxConfigurer {
@Bean
fun complexMissionUtcLocalDateTimeCustomizer(): JsonMapperBuilderCustomizer = JsonMapperBuilderCustomizer { builder ->
builder.addModule(
SimpleModule("pcp-complex-mission-utc-local-date-time")
.addSerializer(LocalDateTime::class.java, UtcLocalDateTimeSerializer())
.addDeserializer(LocalDateTime::class.java, UtcLocalDateTimeDeserializer())
)
}
override fun addFormatters(registry: FormatterRegistry) {
registry.addConverter(UtcLocalDateTimeQueryParamConverter())
}
}
private class UtcLocalDateTimeQueryParamConverter : Converter<String, LocalDateTime> {
override fun convert(source: String): LocalDateTime = UtcDateTimes.parse(source)
}
private class UtcLocalDateTimeSerializer : StdSerializer<LocalDateTime>(LocalDateTime::class.java) {
override fun serialize(value: LocalDateTime, gen: JsonGenerator, ctxt: SerializationContext) {
gen.writeString(UtcDateTimes.format(value))
}
}
private class UtcLocalDateTimeDeserializer : StdDeserializer<LocalDateTime>(LocalDateTime::class.java) {
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): LocalDateTime {
val value = p.valueAsString ?: throw IllegalArgumentException("Expected ISO-8601 UTC date-time string")
return UtcDateTimes.parse(value)
}
}
@@ -12,6 +12,7 @@ import jakarta.persistence.Id
import jakarta.persistence.Index
import jakarta.persistence.OneToMany
import jakarta.persistence.Table
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import java.time.LocalDateTime
@Entity
@@ -34,7 +35,7 @@ class ComplexPlanRunEntity(
var status: ComplexPlanRunStatus = ComplexPlanRunStatus.CREATED,
@Column(name = "created_at", nullable = false)
var createdAt: LocalDateTime = LocalDateTime.now(),
var createdAt: LocalDateTime = UtcDateTimes.now(),
@Column(name = "started_at")
var startedAt: LocalDateTime? = null,
@@ -46,10 +47,10 @@ class ComplexPlanRunEntity(
var durationMs: Long? = null,
@Column(name = "interval_start", nullable = false)
var intervalStart: LocalDateTime = LocalDateTime.now(),
var intervalStart: LocalDateTime = UtcDateTimes.now(),
@Column(name = "interval_end", nullable = false)
var intervalEnd: LocalDateTime = LocalDateTime.now(),
var intervalEnd: LocalDateTime = UtcDateTimes.now(),
@Column(name = "requested_by")
var requestedBy: String? = null,
@@ -17,6 +17,7 @@ import jakarta.persistence.PreUpdate
import jakarta.persistence.Table
import jakarta.persistence.Index
import space.nstart.pcp.pcp_types_lib.dto.satellite.mission.ModeDataRates
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import java.time.LocalDateTime
@Entity
@@ -46,10 +47,10 @@ class SatelliteModeEntity(
var type: SatelliteModeType = SatelliteModeType.SURVEY,
@Column(name = "start_time", nullable = false)
var startTime: LocalDateTime = LocalDateTime.now(),
var startTime: LocalDateTime = UtcDateTimes.now(),
@Column(name = "end_time", nullable = false)
var endTime: LocalDateTime = LocalDateTime.now(),
var endTime: LocalDateTime = UtcDateTimes.now(),
@Column(name = "revolution", nullable = false)
var revolution: Long = 0,
@@ -12,6 +12,7 @@ import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne
import jakarta.persistence.OneToMany
import jakarta.persistence.Table
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import java.time.LocalDateTime
@Entity
@@ -34,13 +35,13 @@ class SatelliteModeSnapshotEntity(
var satelliteId: Long = 0,
@Column(name = "interval_start", nullable = false)
var intervalStart: LocalDateTime = LocalDateTime.now(),
var intervalStart: LocalDateTime = UtcDateTimes.now(),
@Column(name = "interval_end", nullable = false)
var intervalEnd: LocalDateTime = LocalDateTime.now(),
var intervalEnd: LocalDateTime = UtcDateTimes.now(),
@Column(name = "created_at", nullable = false)
var createdAt: LocalDateTime = LocalDateTime.now(),
var createdAt: LocalDateTime = UtcDateTimes.now(),
@Column(name = "is_active", nullable = false)
var isActive: Boolean = false,
@@ -2,12 +2,13 @@ package space.nstart.pcp.pcp_satellites_service.model.mode
import space.nstart.pcp.pcp_satellites_service.entity.SatelliteModeSource
import space.nstart.pcp.pcp_types_lib.dto.satellite.modes.SurveyModeInfoDTO
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import java.time.LocalDateTime
class SurveyMode(
val revolution : Long = 1,
val time : LocalDateTime = LocalDateTime.now(),
val timeStop : LocalDateTime = LocalDateTime.now(),
val time : LocalDateTime = UtcDateTimes.now(),
val timeStop : LocalDateTime = UtcDateTimes.now(),
val roll : Double = 0.0,
val latitude : Double = 0.0,
val longitude : Double = 0.0,
@@ -14,6 +14,7 @@ import space.nstart.pcp.pcp_types_lib.dto.requests.slots.BookingRequestDTO
import space.nstart.pcp.pcp_types_lib.dto.requests.slots.SlotDTO
import space.nstart.pcp.pcp_types_lib.dto.requests.slots.SurveySlotDTO
import tools.jackson.databind.ObjectMapper
import space.nstart.pcp.pcp_types_lib.utils.UtcDateTimes
import java.time.LocalDateTime
@Service
@@ -34,8 +35,8 @@ class SlotService(webClientBuilderProvider: ObjectProvider<WebClient.Builder>) {
UriComponentsBuilder
.fromUriString("/api/slots/poly-cover")
.queryParam("wkt", wkt)
.queryParam("timeStart", tn)
.queryParam("timeStop", tk)
.queryParam("timeStart", UtcDateTimes.format(tn))
.queryParam("timeStop", UtcDateTimes.format(tk))
.queryParam("cov", cov)
.apply {
sats.forEach { queryParam("satellites", it) }
@@ -49,8 +50,8 @@ class SlotService(webClientBuilderProvider: ObjectProvider<WebClient.Builder>) {
.uri(
"/api/slots/poly-cover?wkt={wkt}&timeStart={timeStart}&timeStop={timeStop}&revSign={revSign}&cov={cov}",
wkt,
tn,
tk,
UtcDateTimes.format(tn),
UtcDateTimes.format(tk),
sign,
cov
)
@@ -71,8 +72,8 @@ class SlotService(webClientBuilderProvider: ObjectProvider<WebClient.Builder>) {
.uri(
"/api/slots/mission/satellite?satellite_id={satelliteId}&timeStart={timeStart}&timeStop={timeStop}",
id,
tn,
tk
UtcDateTimes.format(tn),
UtcDateTimes.format(tk)
)
.retrieve()
.onStatus({ status -> status.isError }) { response ->