| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- """中国节假日日历只读服务"""
- 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
|