Files
ev-charger-as/backend/routers/holidays.py
byun 2e8751ea6c 기능 추가 및 버그 수정 — 처리시간 지표, 대시보드 차트, UI 개선
## 처리시간 지표
- 업무시간 기준(09-18 평일) / 공휴일 제외 24h / 달력 기준 3가지 모드 선택
- 공휴일 DB 관리 (holidays 테이블, 수동 등록·삭제·일괄 추가)
- 2026년 공휴일 등록 지원
- 설정 페이지에서 라디오 버튼으로 모드 선택

## 대시보드 차트
- 월별 평균 처리시간 막대 차트 추가
- 월별 신고 접수 건수 누적 막대 차트 추가
- 월별 → 일별 드릴다운 (막대 클릭 시 해당 월의 일별 차트로 전환)
- 일별 막대 클릭 시 처리 완료/신고 접수 상세 내역 모달
- 충전기별 누적 고장 건수 Top 10 수평 막대 차트 추가

## 신고 목록
- # 컬럼을 DB PK 대신 현재 목록 순서(1, 2, 3…)로 표시
- 엑셀 export 접수번호도 순차번호로 변경

## 모바일 네비게이션 버그 수정
- 모바일에서 가로 오버플로우 시 nav가 body 넓이로 늘어나
  햄버거 버튼이 화면 밖으로 밀리는 문제 수정
- nav를 position:fixed + body padding-top:54px 로 변경 (전체 페이지 적용)
- 충전기 관리·신고 목록 페이지 지도 컨테이너에 isolation:isolate 적용

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 06:52:56 +09:00

69 lines
2.4 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Form, Request
from sqlalchemy.orm import Session
from sqlalchemy import extract
from database import get_db
from auth import require_admin
import models
from datetime import date as date_type
router = APIRouter(prefix="/api/holidays", tags=["holidays"])
@router.get("")
def list_holidays(year: int = None, db: Session = Depends(get_db), _=Depends(require_admin)):
q = db.query(models.Holiday)
if year:
q = q.filter(extract('year', models.Holiday.holiday_date) == year)
rows = q.order_by(models.Holiday.holiday_date).all()
return [{"date": str(r.holiday_date), "name": r.name} for r in rows]
@router.post("")
def add_holiday(
holiday_date: str = Form(...),
name: str = Form(...),
db: Session = Depends(get_db),
_=Depends(require_admin),
):
try:
d = date_type.fromisoformat(holiday_date)
except ValueError:
raise HTTPException(400, "날짜 형식이 올바르지 않습니다 (YYYY-MM-DD).")
if db.query(models.Holiday).filter_by(holiday_date=d).first():
raise HTTPException(400, "이미 등록된 날짜입니다.")
db.add(models.Holiday(holiday_date=d, name=name))
db.commit()
return {"ok": True}
@router.post("/bulk")
async def bulk_add_holidays(request: Request, db: Session = Depends(get_db), _=Depends(require_admin)):
"""JSON body: [{"date": "YYYY-MM-DD", "name": "공휴일명"}, ...]"""
items = await request.json()
if not isinstance(items, list):
raise HTTPException(400, "배열 형식이어야 합니다.")
added = 0
for item in items:
try:
d = date_type.fromisoformat(item["date"])
except (KeyError, ValueError):
continue
if not db.query(models.Holiday).filter_by(holiday_date=d).first():
db.add(models.Holiday(holiday_date=d, name=item.get("name", "공휴일")))
added += 1
db.commit()
return {"ok": True, "added": added}
@router.delete("/{holiday_date}")
def delete_holiday(
holiday_date: str,
db: Session = Depends(get_db),
_=Depends(require_admin),
):
try:
d = date_type.fromisoformat(holiday_date)
except ValueError:
raise HTTPException(400, "날짜 형식이 올바르지 않습니다.")
h = db.query(models.Holiday).filter_by(holiday_date=d).first()
if not h:
raise HTTPException(404, "등록된 공휴일이 아닙니다.")
db.delete(h); db.commit()
return {"ok": True}