更新日历功能

This commit is contained in:
2026-09-24 15:14:30 +08:00
parent c5ed596008
commit bc9e32d62a
13 changed files with 1446 additions and 6 deletions
+122
View File
@@ -0,0 +1,122 @@
package holiday
// fallbackData 内置的 2024-2026 年中国法定节假日/调休数据,
// 数据严格来自国务院办公厅历年《关于部分节假日安排的通知》原文。
//
// 用途:当外网接口不可达(内网部署、机房无外网出口、接口临时故障)且数据库
// 中也没有对应年份数据时,用本表兜底,保证日历控件always能显示休/班标记。
//
// 维护约定:每年 11 月国务院办公厅发布次年通知后,按下述格式补齐新一年数据
// (只补休假日与调休上班日两类,普通周末由前端按星期判定,不入表):
//
// notices = append(notices, yearNotice{Year: 2027, ...})
//
// 注意:这里只存"放假"与"补班"两类特殊日期;普通周六日不记录。
var fallbackData = buildFallback()
// yearNotice 单一年度的放假安排,按通知原文逐条录入。
type yearNotice struct {
Year int
// Holidays 放假日期区间:[开始日, 结束日],闭区间。
// 结束日与开始日相同表示只放一天;空串表示结束日等于开始日。
Holidays []dayRange
// Workdays 调休上班日(周末补班)。
Workdays []string
}
type dayRange struct {
Start string
End string
Name string
}
// yearNotices 各界各类节日的原始安排。
//
// 数据来源:
// - 2024:国办发明电〔2023〕7号
// - 2025:国办发明电〔2024〕12号
// - 2026:2025年11月4日国办通知
var yearNotices = []yearNotice{
{
Year: 2024,
Holidays: []dayRange{
{Start: "2024-01-01", Name: "元旦"},
{Start: "2024-02-10", End: "2024-02-17", Name: "春节"},
{Start: "2024-04-04", End: "2024-04-06", Name: "清明节"},
{Start: "2024-05-01", End: "2024-05-05", Name: "劳动节"},
{Start: "2024-06-10", Name: "端午节"},
{Start: "2024-09-15", End: "2024-09-17", Name: "中秋节"},
{Start: "2024-10-01", End: "2024-10-07", Name: "国庆节"},
},
Workdays: []string{
"2024-02-04", "2024-02-18",
"2024-04-07",
"2024-04-28", "2024-05-11",
"2024-09-14",
"2024-09-29", "2024-10-12",
},
},
{
Year: 2025,
Holidays: []dayRange{
{Start: "2025-01-01", Name: "元旦"},
{Start: "2025-01-28", End: "2025-02-04", Name: "春节"},
{Start: "2025-04-04", End: "2025-04-06", Name: "清明节"},
{Start: "2025-05-01", End: "2025-05-05", Name: "劳动节"},
{Start: "2025-05-31", End: "2025-06-02", Name: "端午节"},
{Start: "2025-10-01", End: "2025-10-08", Name: "国庆节、中秋节"},
},
Workdays: []string{
"2025-01-26", "2025-02-08",
"2025-04-27",
"2025-09-28", "2025-10-11",
},
},
{
Year: 2026,
Holidays: []dayRange{
{Start: "2026-01-01", End: "2026-01-03", Name: "元旦"},
{Start: "2026-02-15", End: "2026-02-23", Name: "春节"},
{Start: "2026-04-04", End: "2026-04-06", Name: "清明节"},
{Start: "2026-05-01", End: "2026-05-05", Name: "劳动节"},
{Start: "2026-06-19", End: "2026-06-21", Name: "端午节"},
{Start: "2026-09-25", End: "2026-09-27", Name: "中秋节"},
{Start: "2026-10-01", End: "2026-10-07", Name: "国庆节"},
},
Workdays: []string{
"2026-01-04",
"2026-02-14", "2026-02-28",
"2026-05-09",
"2026-09-20", "2026-10-10",
},
},
}
// buildFallback 把 yearNotices 展开成按日期索引的 Day 列表。
func buildFallback() []Day {
out := make([]Day, 0, 256)
for _, n := range yearNotices {
for _, r := range n.Holidays {
for _, d := range expandRange(r.Start, r.End) {
out = append(out, Day{
Date: d,
Name: r.Name,
Type: TypeHoliday,
Year: n.Year,
Source: SourceBuiltin,
})
}
}
for _, d := range n.Workdays {
out = append(out, Day{
Date: d,
Name: "调休上班",
Type: TypeWorkday,
Year: n.Year,
Wage: 1,
Source: SourceBuiltin,
})
}
}
return out
}