## 처리시간 지표 - 업무시간 기준(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>
69 lines
2.4 KiB
Python
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}
|