"""节日/节点事件日历与预热配置。""" from __future__ import annotations from dataclasses import dataclass from typing import Literal FestivalKind = Literal["statutory", "non_statutory"] EventType = Literal["节日/节气", "纪念日", "特定民生热点", "特定天气时段"] @dataclass(frozen=True) class FestivalEvent: """节点事件、类型及预热天数。""" name: str event_type: EventType prewarm_days: int kind: FestivalKind = "non_statutory" # 法定节假日:节日活跃期按国务院当年放假区间计算 _STATUTORY = "statutory" _NON_STATUTORY = "non_statutory" _FESTIVAL_SOLAR = "节日/节气" _MEMORIAL = "纪念日" _LIVELIHOOD = "特定民生热点" _WEATHER = "特定天气时段" DEFAULT_FESTIVAL_EVENTS: tuple[FestivalEvent, ...] = ( FestivalEvent("元旦", _FESTIVAL_SOLAR, 10, _STATUTORY), FestivalEvent("腊八节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("小年", _FESTIVAL_SOLAR, 7, _NON_STATUTORY), FestivalEvent("除夕", _FESTIVAL_SOLAR, 10, _NON_STATUTORY), FestivalEvent("春节", _FESTIVAL_SOLAR, 10, _STATUTORY), FestivalEvent("元宵节", _FESTIVAL_SOLAR, 7, _NON_STATUTORY), FestivalEvent("龙抬头", _FESTIVAL_SOLAR, 7, _NON_STATUTORY), FestivalEvent("妇女节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("上巳节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("劳动节", _FESTIVAL_SOLAR, 7, _STATUTORY), FestivalEvent("母亲节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("端午节", _FESTIVAL_SOLAR, 7, _STATUTORY), FestivalEvent("儿童节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("父亲节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("建党节", _FESTIVAL_SOLAR, 10, _NON_STATUTORY), FestivalEvent("建军节", _FESTIVAL_SOLAR, 10, _NON_STATUTORY), FestivalEvent("七夕节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("中元节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("教师节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("中秋节", _FESTIVAL_SOLAR, 7, _STATUTORY), FestivalEvent("重阳节", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("国庆节", _FESTIVAL_SOLAR, 7, _STATUTORY), FestivalEvent("立春", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("雨水", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("惊蛰", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("春分", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("清明", _FESTIVAL_SOLAR, 15, _STATUTORY), FestivalEvent("谷雨", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("立夏", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("小满", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("芒种", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("夏至", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("小暑", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("大暑", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("立秋", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("处暑", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("白露", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("秋分", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("寒露", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("霜降", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("立冬", _FESTIVAL_SOLAR, 7, _NON_STATUTORY), FestivalEvent("小雪", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("大雪", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("冬至", _FESTIVAL_SOLAR, 7, _NON_STATUTORY), FestivalEvent("小寒", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("大寒", _FESTIVAL_SOLAR, 5, _NON_STATUTORY), FestivalEvent("周总理逝世", _MEMORIAL, 7, _NON_STATUTORY), FestivalEvent("周总理诞辰", _MEMORIAL, 7, _NON_STATUTORY), FestivalEvent("七七事变纪念日", _MEMORIAL, 5, _NON_STATUTORY), FestivalEvent("日本投降", _MEMORIAL, 5, _NON_STATUTORY), FestivalEvent("毛主席逝世", _MEMORIAL, 30, _NON_STATUTORY), FestivalEvent("918纪念日", _MEMORIAL, 5, _NON_STATUTORY), FestivalEvent("毛主席诞辰", _MEMORIAL, 30, _NON_STATUTORY), FestivalEvent("公祭日", _MEMORIAL, 10, _NON_STATUTORY), FestivalEvent("台湾光复纪念日", _MEMORIAL, 5, _NON_STATUTORY), FestivalEvent("全国两会", _LIVELIHOOD, 30, _NON_STATUTORY), FestivalEvent("315", _LIVELIHOOD, 7, _NON_STATUTORY), FestivalEvent("高考", _LIVELIHOOD, 10, _NON_STATUTORY), FestivalEvent("三伏", _WEATHER, 15, _NON_STATUTORY), FestivalEvent("数九", _WEATHER, 5, _NON_STATUTORY), ) def festival_events_payload() -> list[dict[str, int | str]]: return [ { "name": event.name, "event_type": event.event_type, "prewarm_days": event.prewarm_days, "kind": event.kind, } for event in DEFAULT_FESTIVAL_EVENTS ]