teljes backend_mentés

This commit is contained in:
Roo
2026-03-22 18:59:27 +00:00
parent 5d44339f21
commit 5d96b00f81
34 changed files with 2575 additions and 977 deletions

View File

@@ -0,0 +1,113 @@
import asyncio
import json
import re
import requests
from sqlalchemy import text
from app.database import AsyncSessionLocal
# --- TECHNIKAI SZÓTÁR ÉS MAPPING ---
# Ez a szótár fordítja le az UltimateSpecs kulcsokat az adatbázis oszlopneveire
MAPPING = {
"Maximum power": "power_kw",
"Engine capacity": "engine_capacity",
"Maximum torque": "torque_nm",
"Top Speed": "max_speed",
"Acceleration 0 to 100 km/h": "acceleration_0_100",
"Curb Weight": "curb_weight",
"Wheelbase": "wheelbase",
"Num. of Seats": "seats",
"Drive wheels - Traction - Layout": "drive_type",
"Body": "body_type"
}
async def r5_test_run():
print("🚀 R5 Hibrid Robot indítása (Teszt üzemmód)...")
async with AsyncSessionLocal() as db:
# 1. KIVÁLASZTÁS: Kiveszünk egy olyan autót, ami még nincs dúsítva (R1 bázisból)
query = text("""
SELECT id, make, marketing_name, year_from, technical_code, fuel_type
FROM vehicle.vehicle_model_definitions
WHERE (power_kw IS NULL OR power_kw = 0 OR engine_capacity IS NULL OR engine_capacity = 0)
AND status IN ('manual_review_needed', 'research_failed_empty', 'pending', 'enrich_ready')
ORDER BY priority_score DESC
LIMIT 1
""")
target = (await db.execute(query)).fetchone()
if not target:
print("✨ Nincs feldolgozatlan autó az adatbázisban.")
return
t_id, make, model, year, tech_code, fuel = target
print(f"🎯 Célpont: {make} {model} ({year})")
print(f"📌 Technical Code: {tech_code or 'Nincs megadva'}")
# 2. RDW ADATOK (Holland hatósági bázis)
# Ha van technical_code (pl. Fiatnál a típusazonosító), az RDW-ből pontos adatot kapunk
rdw_data = {}
if tech_code:
print("🇳🇱 RDW adatok lekérése...")
# Az RDW API m9d7-ebf2 táblája tartalmazza a típus specifikációkat
rdw_url = f"https://opendata.rdw.nl/resource/m9d7-ebf2.json?handelsbenaming={tech_code.upper()}"
try:
res = requests.get(rdw_url, timeout=5).json()
if res:
rdw_data = {
"power_kw": int(float(res[0].get('nettomaximumvermogen', 0))),
"engine_capacity": int(res[0].get('cilinderinhoud', 0)),
"curb_weight": int(res[0].get('massa_ledig_voertuig', 0))
}
print("✅ RDW adatok sikeresen betöltve.")
except:
print("⚠️ RDW nem elérhető vagy nincs találat.")
# 3. ULTIMATESPECS ADATOK (Szimulált kaparás a kért logika alapján)
print("🏁 UltimateSpecs adatok gyűjtése...")
# Itt futna a Playwright scraper, ami kinyeri a táblázatot
# Példa nyers adatokra, amit az oldalról szedünk le:
raw_web_data = {
"Maximum power": "103 PS / 76 kW @ 5750 rpm",
"Engine capacity": "1581 cm3",
"Maximum torque": "144 Nm @ 4000 rpm",
"Top Speed": "180 km/h",
"Acceleration 0 to 100 km/h": "11.5 s",
"Curb Weight": "1090 kg",
"Wheelbase": "254 cm",
"Body": "Hatchback"
}
# 4. ÖSSZEFŰZÉS ÉS FORDÍTÁS
final_mdm_record = {
"id": t_id,
"make": make,
"marketing_name": model,
"year_from": year,
"fuel_type": fuel
}
# Alkalmazzuk a mappinget és a regex tisztítást
for web_key, db_key in MAPPING.items():
val = raw_web_data.get(web_key)
if val:
# Számértékek kinyerése (pl. "76 kW" -> 76, "1581 cm3" -> 1581)
numbers = re.findall(r'\d+', str(val))
if numbers:
# Ha több szám van (pl. kW és LE), a relevánsat választjuk
final_mdm_record[db_key] = numbers[1] if "kW" in str(val) and len(numbers)>1 else numbers[0]
else:
final_mdm_record[db_key] = val
# RDW adatok prioritása (ezek a legpontosabbak, felülírják a webet)
final_mdm_record.update({k: v for k, v in rdw_data.items() if v})
# --- TERMINÁL KIMENET ---
print("\n" + "="*50)
print("📊 VÉGLEGES MDM REKORD (ELŐNÉZET)")
print("="*50)
print(json.dumps(final_mdm_record, indent=2, ensure_ascii=False))
print("="*50)
print("\n[R5] Ha az adatok rendben vannak, mehet az élesítés?")
if __name__ == "__main__":
asyncio.run(r5_test_run())