|
|
@@ -0,0 +1,103 @@
|
|
|
+"""节日/节点事件日历与预热配置。"""
|
|
|
+
|
|
|
+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
|
|
|
+ ]
|