- 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>
108 lines
3.8 KiB
Python
108 lines
3.8 KiB
Python
"""
|
|
기존 차량의 성능점검표를 가져오는 스크립트
|
|
"""
|
|
import asyncio
|
|
import sys
|
|
sys.path.insert(0, '.')
|
|
|
|
from sqlalchemy.orm import Session
|
|
from app.database import SessionLocal, engine
|
|
from app.models import Car, CarPerformanceCheck
|
|
from app.api.carmodoo import carmodoo_client
|
|
|
|
|
|
async def fetch_and_save_performance_check(car_id: int, car_no: str):
|
|
"""특정 차량의 성능점검표를 가져와서 저장"""
|
|
db = SessionLocal()
|
|
|
|
try:
|
|
# 이미 있는지 확인
|
|
existing = db.query(CarPerformanceCheck).filter(
|
|
CarPerformanceCheck.car_id == car_id
|
|
).first()
|
|
|
|
if existing:
|
|
print(f"Car {car_id} already has performance check")
|
|
return False
|
|
|
|
# 카모두에서 성능점검표 가져오기
|
|
print(f"Fetching performance check for car_no: {car_no}")
|
|
result = await carmodoo_client.get_performance_check(car_no)
|
|
|
|
# raw_html 저장 (디버깅용)
|
|
if result.get("raw_html"):
|
|
with open(f"./debug_perf_check_{car_no}.html", "w", encoding="utf-8") as f:
|
|
f.write(result["raw_html"])
|
|
print(f" Raw HTML saved to debug_perf_check_{car_no}.html (length: {len(result['raw_html'])})")
|
|
|
|
if not result.get("found"):
|
|
print(f"Performance check not found for car_no: {car_no}")
|
|
return False
|
|
|
|
perf_data = result["data"]
|
|
print(f"Performance check found: {perf_data.get('check_number', 'N/A')}")
|
|
|
|
# CarPerformanceCheck 생성
|
|
performance_check = CarPerformanceCheck(
|
|
car_id=car_id,
|
|
check_number=perf_data.get("check_number"),
|
|
check_date=perf_data.get("check_date"),
|
|
valid_until=perf_data.get("valid_until"),
|
|
car_number=perf_data.get("car_number"),
|
|
first_registration=perf_data.get("first_registration"),
|
|
mileage=perf_data.get("mileage"),
|
|
mileage_status=perf_data.get("mileage_status"),
|
|
seize_count=perf_data.get("seize_count", 0),
|
|
collateral_count=perf_data.get("collateral_count", 0),
|
|
is_flood_damaged=perf_data.get("is_flood_damaged", False),
|
|
is_fire_damaged=perf_data.get("is_fire_damaged", False),
|
|
is_total_loss=perf_data.get("is_total_loss", False),
|
|
usage_history=perf_data.get("usage_history"),
|
|
is_rental_used=perf_data.get("is_rental_used", False),
|
|
engine_status=perf_data.get("engine_status"),
|
|
transmission_status=perf_data.get("transmission_status"),
|
|
power_delivery_status=perf_data.get("power_delivery_status"),
|
|
steering_status=perf_data.get("steering_status"),
|
|
brake_status=perf_data.get("brake_status"),
|
|
electrical_status=perf_data.get("electrical_status"),
|
|
fuel_system_status=perf_data.get("fuel_system_status"),
|
|
raw_data=perf_data,
|
|
raw_html=result.get("raw_html", "")[:50000],
|
|
report_image_url=perf_data.get("report_image_url"),
|
|
)
|
|
db.add(performance_check)
|
|
db.commit()
|
|
|
|
print(f"Performance check saved for car {car_id}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Error: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
db.rollback()
|
|
return False
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
async def main():
|
|
# 모든 차량 조회
|
|
db = SessionLocal()
|
|
cars = db.query(Car).filter(
|
|
Car.source == "carmodoo",
|
|
Car.source_id.isnot(None)
|
|
).all()
|
|
db.close()
|
|
|
|
print(f"Found {len(cars)} cars from carmodoo")
|
|
|
|
for car in cars:
|
|
print(f"\n--- Processing Car ID: {car.id}, Source ID: {car.source_id} ---")
|
|
await fetch_and_save_performance_check(car.id, car.source_id)
|
|
await asyncio.sleep(1) # 서버 부하 방지
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|