Files
zkxw/backend/app/services/cn_holiday.py
T
2026-08-11 11:13:01 +08:00

66 lines
2.0 KiB
Python

"""中国节假日日历只读服务"""
from __future__ import annotations
from datetime import date, timedelta
from typing import Any, Dict, List, Optional
from sqlalchemy.orm import Session
from app.models.cn_holiday import SysCnHolidayDay
def is_rest_day(db: Session, d: date) -> bool:
"""查表判定是否休息日;无行则按周六日回退。"""
row: Optional[SysCnHolidayDay] = (
db.query(SysCnHolidayDay).filter(SysCnHolidayDay.day_date == d).first()
)
if row is None:
return d.weekday() >= 5
if row.is_rest_day is not None:
return int(row.is_rest_day) == 1
return int(row.day_type or 0) in (1, 2, 3)
def list_day_flags(db: Session, start: date, end: date) -> List[Dict[str, Any]]:
"""返回 [start, end] 闭区间每日标志;缺行用周末回退补齐。"""
if end < start:
return []
rows = (
db.query(SysCnHolidayDay)
.filter(SysCnHolidayDay.day_date >= start, SysCnHolidayDay.day_date <= end)
.all()
)
by_date = {r.day_date: r for r in rows}
out: List[Dict[str, Any]] = []
cur = start
while cur <= end:
row = by_date.get(cur)
if row is not None:
rest = (
int(row.is_rest_day) == 1
if row.is_rest_day is not None
else int(row.day_type or 0) in (1, 2, 3)
)
out.append(
{
"dayDate": cur.isoformat(),
"dayType": int(row.day_type),
"isRestDay": rest,
"dayName": row.day_name,
}
)
else:
is_weekend = cur.weekday() >= 5
out.append(
{
"dayDate": cur.isoformat(),
"dayType": 1 if is_weekend else 0,
"isRestDay": is_weekend,
"dayName": None,
}
)
cur += timedelta(days=1)
return out