- Frontend: Next.js 14 with TypeScript - Backend: FastAPI with SQLAlchemy - Agent: Carmodoo sync agent - Deployment: Docker Compose based staging/production setup - Scripts: Automated deployment with rollback support 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
120 lines
5.4 KiB
Python
120 lines
5.4 KiB
Python
"""
|
|
성능점검표 (Performance Check Report) 모델
|
|
카모두에서 가져온 차량 성능점검 정보를 저장
|
|
"""
|
|
|
|
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, DateTime, Text, JSON
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
from ..database import Base
|
|
|
|
|
|
class CarPerformanceCheck(Base):
|
|
"""차량 성능점검표"""
|
|
__tablename__ = "car_performance_checks"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
car_id = Column(Integer, ForeignKey("cars.id", ondelete="CASCADE"), nullable=False, unique=True)
|
|
|
|
# 성능점검 기본정보
|
|
check_number = Column(String(50)) # 성능점검번호
|
|
check_date = Column(String(20)) # 점검일자
|
|
valid_until = Column(String(20)) # 유효기간
|
|
inspector_name = Column(String(50)) # 점검자명
|
|
inspector_license = Column(String(50)) # 점검자 자격번호
|
|
|
|
# 차량 기본정보 (car_number는 cars 테이블에서 관리 - 원자성)
|
|
first_registration = Column(String(20)) # 최초등록일
|
|
model_year = Column(String(20)) # 연식
|
|
|
|
# 주행거리
|
|
mileage = Column(Integer) # 주행거리
|
|
mileage_status = Column(String(20)) # 주행거리 상태 (정상/조작의심/교환됨)
|
|
|
|
# 압류/저당 정보
|
|
seize_count = Column(Integer, default=0) # 압류 건수
|
|
collateral_count = Column(Integer, default=0) # 저당 건수
|
|
|
|
# 특별 이력 (침수/화재/전손)
|
|
is_flood_damaged = Column(Boolean, default=False) # 침수
|
|
is_fire_damaged = Column(Boolean, default=False) # 화재
|
|
is_total_loss = Column(Boolean, default=False) # 전손
|
|
|
|
# 용도이력
|
|
usage_history = Column(String(100)) # 자가용/영업용/관용 등
|
|
is_rental_used = Column(Boolean, default=False) # 렌트 이력
|
|
|
|
# 주요장치 상태 (JSON으로 상세정보 저장)
|
|
# 각 항목: 양호/주의/불량
|
|
engine_status = Column(String(20)) # 원동기
|
|
transmission_status = Column(String(20)) # 변속기
|
|
power_delivery_status = Column(String(20)) # 동력전달
|
|
steering_status = Column(String(20)) # 조향장치
|
|
brake_status = Column(String(20)) # 제동장치
|
|
electrical_status = Column(String(20)) # 전기장치
|
|
fuel_system_status = Column(String(20)) # 연료장치
|
|
|
|
# 타이어 상태
|
|
tire_front_left = Column(String(20)) # 전좌
|
|
tire_front_right = Column(String(20)) # 전우
|
|
tire_rear_left = Column(String(20)) # 후좌
|
|
tire_rear_right = Column(String(20)) # 후우
|
|
|
|
# 사고 이력 (외판/주요골격) - JSON으로 상세 저장
|
|
# 부위별: 없음/교환/판금용접/부식/손상
|
|
accident_history = Column(JSON) # {"hood": "교환", "front_fender_left": "판금", ...}
|
|
|
|
# 외판 부위
|
|
hood = Column(String(20)) # 후드
|
|
front_fender_left = Column(String(20)) # 프론트휀더(좌)
|
|
front_fender_right = Column(String(20)) # 프론트휀더(우)
|
|
front_door_left = Column(String(20)) # 프론트도어(좌)
|
|
front_door_right = Column(String(20)) # 프론트도어(우)
|
|
rear_door_left = Column(String(20)) # 리어도어(좌)
|
|
rear_door_right = Column(String(20)) # 리어도어(우)
|
|
trunk_lid = Column(String(20)) # 트렁크리드
|
|
radiator_support = Column(String(20)) # 라디에이터서포트
|
|
roof_panel = Column(String(20)) # 루프패널
|
|
quarter_panel_left = Column(String(20)) # 쿼터패널(좌)
|
|
quarter_panel_right = Column(String(20)) # 쿼터패널(우)
|
|
side_sill_left = Column(String(20)) # 사이드실패널(좌)
|
|
side_sill_right = Column(String(20)) # 사이드실패널(우)
|
|
|
|
# 주요골격 부위
|
|
front_panel = Column(String(20)) # 프론트패널
|
|
cross_member = Column(String(20)) # 크로스멤버
|
|
inside_panel_left = Column(String(20)) # 인사이드패널(좌)
|
|
inside_panel_right = Column(String(20)) # 인사이드패널(우)
|
|
side_member_left = Column(String(20)) # 사이드멤버(좌)
|
|
side_member_right = Column(String(20)) # 사이드멤버(우)
|
|
wheel_house_left = Column(String(20)) # 휠하우스(좌)
|
|
wheel_house_right = Column(String(20)) # 휠하우스(우)
|
|
dash_panel = Column(String(20)) # 대쉬패널
|
|
floor_panel = Column(String(20)) # 플로어패널
|
|
trunk_floor = Column(String(20)) # 트렁크플로어
|
|
rear_panel = Column(String(20)) # 리어패널
|
|
pillar_a_left = Column(String(20)) # 필러A(좌)
|
|
pillar_a_right = Column(String(20)) # 필러A(우)
|
|
pillar_b_left = Column(String(20)) # 필러B(좌)
|
|
pillar_b_right = Column(String(20)) # 필러B(우)
|
|
pillar_c_left = Column(String(20)) # 필러C(좌)
|
|
pillar_c_right = Column(String(20)) # 필러C(우)
|
|
package_tray = Column(String(20)) # 패키지트레이
|
|
|
|
# 원본 데이터 (파싱하지 못한 추가 정보)
|
|
raw_data = Column(JSON) # 전체 원본 데이터
|
|
raw_html = Column(Text) # 원본 HTML (디버깅용)
|
|
|
|
# 점검표 이미지 URL
|
|
report_image_url = Column(String(500)) # 성능점검표 이미지
|
|
report_image_local = Column(String(500)) # 로컬 저장 경로
|
|
|
|
# PDF 파일 경로 (Playwright로 캡처한 성능점검표)
|
|
pdf_path = Column(String(500)) # PDF 파일 상대경로 (/uploads/performance_checks/xxx.pdf)
|
|
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
|
|
|
# Relationship
|
|
car = relationship("Car", back_populates="performance_check")
|