119 lines
4.6 KiB
Python
119 lines
4.6 KiB
Python
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
|