import json from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form from sqlalchemy.orm import Session from sqlalchemy import desc from typing import List, Optional from datetime import datetime from database import get_db import models from auth import require_mechanic, get_current_user from utils import save_upload router = APIRouter(prefix="/api/repairs", tags=["repairs"]) @router.get("/pending") def pending_reports(db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user)): """정비사용: 처리 가능한 신고 목록 (pending / in_progress)""" q = db.query(models.Report).filter( models.Report.status.in_(["pending", "in_progress"]) ).order_by(desc(models.Report.reported_at)) result = [] for r in q.all(): c = r.charger result.append({ "id": r.id, "charger_id": r.charger_id, "charger_name": c.name if c else None, "station_name": c.station_name if c else None, "charger_type": c.charger_type.name if c and c.charger_type else None, "issue_types": r.issue_types, "status": r.status, "reported_at": r.reported_at.isoformat(), "occurred_at": r.occurred_at.isoformat() if r.occurred_at else None, }) return result @router.get("/charger/{charger_id}/open") def open_reports_for_charger(charger_id: str, db: Session = Depends(get_db), _=Depends(require_mechanic)): """특정 충전기의 미처리 신고 목록 (중복처리용)""" reports = db.query(models.Report).filter( models.Report.charger_id == charger_id, models.Report.status.in_(["pending", "in_progress"]) ).order_by(models.Report.reported_at).all() return [{ "id": r.id, "issue_types": r.issue_types, "issue_detail": r.issue_detail, "status": r.status, "reported_at": r.reported_at.isoformat(), "photos": [p.file_path for p in r.photos], } for r in reports] @router.post("") async def create_repair( report_ids: str = Form(...), # JSON 배열 repair_types: str = Form(...), # JSON 배열 description: str = Form(...), result_status: str = Form("done"), photos_before: List[UploadFile] = File(default=[]), photos_after: List[UploadFile] = File(default=[]), db: Session = Depends(get_db), current_user: models.User = Depends(require_mechanic) ): rids = json.loads(report_ids) rtypes = json.loads(repair_types) repair = models.Repair( mechanic_id=current_user.id, repair_types=rtypes, description=description, started_at=datetime.now(), completed_at=datetime.now(), result_status=result_status, ) db.add(repair); db.commit(); db.refresh(repair) # 신고 연결 및 상태 업데이트 for rid in rids: r = db.query(models.Report).filter_by(id=rid).first() if r: new_status = "done" if result_status == "done" else ( "waiting" if result_status == "waiting" else "revisit" ) r.status = new_status db.add(models.RepairReport(repair_id=repair.id, report_id=rid)) # 사진 저장 for photo in photos_before: if photo.filename: path = save_upload(photo, f"repairs/{repair.id}") db.add(models.RepairPhoto(repair_id=repair.id, photo_type="before", file_path=path)) for photo in photos_after: if photo.filename: path = save_upload(photo, f"repairs/{repair.id}") db.add(models.RepairPhoto(repair_id=repair.id, photo_type="after", file_path=path)) db.commit() return {"id": repair.id} @router.get("/my") def my_repairs(db: Session = Depends(get_db), current_user: models.User = Depends(require_mechanic)): repairs = db.query(models.Repair).filter_by( mechanic_id=current_user.id ).order_by(desc(models.Repair.completed_at)).limit(50).all() result = [] for repair in repairs: rids = [rr.report_id for rr in repair.report_links] charger_id = None if rids: r = db.query(models.Report).filter_by(id=rids[0]).first() if r: charger_id = r.charger_id result.append({ "id": repair.id, "charger_id": charger_id, "repair_types": repair.repair_types, "result_status": repair.result_status, "started_at": repair.started_at.isoformat(), "completed_at": repair.completed_at.isoformat() if repair.completed_at else None, "report_count": len(rids), }) return result