2026-09-09 17:53:08 +08:00
|
|
|
|
package com.gzzn.omms.msgexchange.config
|
|
|
|
|
|
|
|
|
|
|
|
import io.micronaut.context.annotation.ConfigurationProperties
|
2026-09-12 20:34:56 +08:00
|
|
|
|
import io.micronaut.context.annotation.Context
|
|
|
|
|
|
import jakarta.inject.Singleton
|
|
|
|
|
|
import java.time.ZoneId
|
2026-09-09 17:53:08 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
2026-09-10 11:14:11 +08:00
|
|
|
|
* 算航班运营保障日(OPERATION_DAY)要用的两个参数,对应配置里的 `msgx.operation-day.*`:
|
|
|
|
|
|
* 机场时区和切日边界。运营日由计划运行时间 SODT 加时区推出来,不是接收日也不是落库日,
|
|
|
|
|
|
* 算出来就固定不变。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 不能假设运营日等于自然日,民航的一天从几点开始由业务定。默认 0 点只是占位,待确认。
|
2026-09-09 17:53:08 +08:00
|
|
|
|
*/
|
|
|
|
|
|
@ConfigurationProperties("msgx.operation-day")
|
|
|
|
|
|
class OperationDayProps {
|
2026-09-10 11:14:11 +08:00
|
|
|
|
/** 机场所在时区,用 IANA 名称,比如 Asia/Shanghai。 */
|
2026-09-09 17:53:08 +08:00
|
|
|
|
var zone: String = "Asia/Shanghai"
|
|
|
|
|
|
|
2026-09-10 11:14:11 +08:00
|
|
|
|
/** 切日边界小时:SODT 的本地时刻早于这个点就归属前一个运营日。取值 0–23。 */
|
2026-09-09 17:53:08 +08:00
|
|
|
|
var cutoffHour: Int = 0
|
2026-09-12 20:34:56 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 解析机场时区。非法值直接失败,**不回退到代码字面量**:
|
|
|
|
|
|
* `PARAM:msgx.operation-day.zone` 是运营日时区的唯一出处,回退会把配置错位藏起来。
|
|
|
|
|
|
*/
|
|
|
|
|
|
fun zoneId(): ZoneId =
|
|
|
|
|
|
try {
|
|
|
|
|
|
ZoneId.of(zone)
|
|
|
|
|
|
} catch (e: Exception) {
|
|
|
|
|
|
throw IllegalStateException("msgx.operation-day.zone is not a valid IANA zone: '$zone'", e)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** 启动自检:时区非法必须在启动时失败,而不是等第一条报文进来才炸;`@Context` 使其急切创建。 */
|
|
|
|
|
|
@Singleton
|
|
|
|
|
|
@Context
|
|
|
|
|
|
class OperationDayZoneCheck(props: OperationDayProps) {
|
|
|
|
|
|
private val zone: ZoneId = props.zoneId()
|
2026-09-09 17:53:08 +08:00
|
|
|
|
}
|