Files
service-finder/backend/app/workers/robot0_priority_setter.py

83 lines
3.8 KiB
Python

import asyncio
import httpx
import logging
import os
from sqlalchemy import text
from app.db.session import SessionLocal
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s')
logger = logging.getLogger("Robot-0-Strategist")
class Robot0Strategist:
RDW_API = "https://opendata.rdw.nl/resource/m9d7-ebf2.json"
RDW_TOKEN = os.getenv("RDW_APP_TOKEN")
HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {}
# Holland típusok leképezése a mi kategóriáinkra a kért sorrendben
CATEGORIES = [
{"name": "car", "rdw_types": ["'Personenauto'"]},
{"name": "motorcycle", "rdw_types": ["'Motorfiets'"]},
{"name": "truck", "rdw_types": ["'Bedrijfswagen'", "'Vrachtwagen'", "'Opleggertrekker'"]},
{"name": "other", "rdw_types": ["NOT IN ('Personenauto', 'Motorfiets', 'Bedrijfswagen', 'Vrachtwagen', 'Opleggertrekker')"]}
]
async def get_popular_makes(self, vehicle_class, rdw_types):
"""Lekéri az adott kategória legnépszerűbb márkáit az RDW-től."""
# SQL-szerű szűrés az API-n keresztül
type_filter = " OR ".join([f"voertuigsoort = {t}" for t in rdw_types])
if "NOT IN" in rdw_types[0]: # Speciális kezelés az 'egyéb' kategóriához
type_filter = f"voertuigsoort {rdw_types[0]}"
params = {
"$select": "merk, count(*)",
"$where": type_filter,
"$group": "merk",
"$order": "count DESC",
"$limit": 500 # Kategóriánként az 500 legfontosabb márka bőven elég
}
async with httpx.AsyncClient(timeout=30) as client:
try:
resp = await client.get(self.RDW_API, params=params, headers=self.HEADERS)
if resp.status_code == 200:
return resp.json()
return []
except Exception as e:
logger.error(f"❌ Hiba a {vehicle_class} lekérdezésekor: {e}")
return []
async def run(self):
logger.info("🚀 Robot 0 (Strategist) INDUL - Piaci alapú sorrend felállítása...")
async with SessionLocal() as db:
# 1. Töröljük a jelenlegi várólistát, hogy tiszta lappal induljunk (opcionális)
# await db.execute(text("DELETE FROM data.catalog_discovery WHERE status = 'pending'"))
for category in self.CATEGORIES:
v_class = category["name"]
logger.info(f"📊 {v_class.upper()} kategória elemzése...")
makes = await self.get_popular_makes(v_class, category["rdw_types"])
added_count = 0
for item in makes:
make_name = item.get("merk")
if not make_name: continue
# Beillesztés a Discovery táblába
# A prioritást az ID-k sorrendje fogja adni, amit Robot 1 követ
await db.execute(text("""
INSERT INTO data.catalog_discovery (make, model, vehicle_class, status, source)
VALUES (:make, 'ALL_MODELS', :class, 'pending', 'ROBOT-0-POPULARITY')
ON CONFLICT (make, model, vehicle_class) DO UPDATE
SET status = 'pending' WHERE catalog_discovery.status != 'processed'
"""), {"make": make_name.upper(), "class": v_class})
added_count += 1
await db.commit()
logger.info(f"{v_class.upper()}: {added_count} márka sorba állítva a népszerűség alapján.")
logger.info("🏁 Robot 0 végzett. A Discovery tábla készen áll a Robot 1 (Hunter) számára!")
if __name__ == "__main__":
asyncio.run(Robot0Strategist().run())