기능 추가 — 재조치 요청 (조치 기록 유지 재출동)
정비사 조치 완료 후 동일 문제 재발 시 관리자가 기존 기록을 보존한 채
재조치를 요청할 수 있는 기능 추가.
- DB: repairs.re_dispatch_requested/at, reports.re_dispatch_count 컬럼 추가
- 재조치 요청 엔드포인트 (POST /repairs/{id}/re-dispatch): 기존 repair에 플래그,
연결 신고를 pending으로 복원, re_dispatch_count 증가
- pending 상태 신고는 새 조치 생성으로 분기 (in_progress만 기존 수정 모드)
- report-detail: 조치승인·취소 사이에 "🔁 재조치 요청" 버튼, 이전 조치 이력 카드
- 정비사 대시보드: 재조치 건에 🔁 뱃지 및 강조 버튼색 표시
- 엑셀 export: 재조치횟수 컬럼 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -50,6 +50,8 @@ def _fmt_repair(repair: models.Repair) -> dict:
|
||||
"completed_at": repair.completed_at.isoformat() if repair.completed_at else None,
|
||||
"approved_at": repair.approved_at.isoformat() if repair.approved_at else None,
|
||||
"approved_by_name": repair.approver.name if repair.approved_by and repair.approver else None,
|
||||
"re_dispatch_requested": repair.re_dispatch_requested or False,
|
||||
"re_dispatch_requested_at": repair.re_dispatch_requested_at.isoformat() if repair.re_dispatch_requested_at else None,
|
||||
"photos_before": [{"id": p.id, "path": p.file_path} for p in repair.photos if p.photo_type == "before"],
|
||||
"photos_after": [{"id": p.id, "path": p.file_path} for p in repair.photos if p.photo_type == "after"],
|
||||
"reports": reports,
|
||||
@@ -67,9 +69,9 @@ def pending_reports(db: Session = Depends(get_db),
|
||||
result = []
|
||||
for r in q.all():
|
||||
c = r.charger
|
||||
# in_progress 신고는 연결된 repair_id 포함 → 편집 모드로 연결
|
||||
# in_progress 신고만 기존 repair 편집 모드; pending은 재조치 포함 새 조치 생성
|
||||
repair_id = None
|
||||
if r.repair_links:
|
||||
if r.status == "in_progress" and r.repair_links:
|
||||
repair_id = r.repair_links[0].repair_id
|
||||
result.append({
|
||||
"id": r.id, "charger_id": r.charger_id,
|
||||
@@ -80,6 +82,7 @@ def pending_reports(db: Session = Depends(get_db),
|
||||
"reported_at": r.reported_at.isoformat(),
|
||||
"occurred_at": r.occurred_at.isoformat() if r.occurred_at else None,
|
||||
"repair_id": repair_id,
|
||||
"re_dispatch_count": r.re_dispatch_count or 0,
|
||||
"gps_lat": c.gps_lat if c else None,
|
||||
"gps_lng": c.gps_lng if c else None,
|
||||
"location_detail": c.location_detail if c else None,
|
||||
@@ -263,6 +266,27 @@ def approve_repair(
|
||||
return {"ok": True, "improvement_id": target_imp_id}
|
||||
|
||||
|
||||
@router.post("/{repair_id}/re-dispatch")
|
||||
def re_dispatch_repair(
|
||||
repair_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: models.User = Depends(require_admin)
|
||||
):
|
||||
"""기존 조치 기록을 유지하며 재조치 요청 — 신고를 pending으로 되돌림"""
|
||||
repair = db.query(models.Repair).filter_by(id=repair_id).first()
|
||||
if not repair: raise HTTPException(404)
|
||||
if repair.approved_at:
|
||||
raise HTTPException(400, "이미 승인된 조치는 재조치 요청할 수 없습니다.")
|
||||
repair.re_dispatch_requested = True
|
||||
repair.re_dispatch_requested_at = datetime.now()
|
||||
for link in repair.report_links:
|
||||
if link.report:
|
||||
link.report.status = "pending"
|
||||
link.report.re_dispatch_count = (link.report.re_dispatch_count or 0) + 1
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.delete("/{repair_id}")
|
||||
def cancel_repair(
|
||||
repair_id: int,
|
||||
|
||||
Reference in New Issue
Block a user