기능 추가 및 버그 수정 — 처리시간 지표, 대시보드 차트, 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>
This commit is contained in:
68
backend/routers/holidays.py
Normal file
68
backend/routers/holidays.py
Normal file
@@ -0,0 +1,68 @@
|
||||
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}
|
||||
Reference in New Issue
Block a user