Cleanup: MB 2.0 Gap Analysis előtti állapot (adatok kizárva)
This commit is contained in:
64
backend/app/workers/vin_auditor.py
Normal file
64
backend/app/workers/vin_auditor.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import asyncio
|
||||
import logging
|
||||
import sys
|
||||
import datetime
|
||||
from sqlalchemy import select, and_, text, update
|
||||
from sqlalchemy.orm import joinedload
|
||||
from app.db.session import SessionLocal
|
||||
from app.models.asset import Asset, AssetCatalog
|
||||
from app.services.ai_service import AIService
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Auditor: %(message)s', stream=sys.stdout)
|
||||
logger = logging.getLogger("VIN-Auditor-v1.3.0")
|
||||
|
||||
class VINAuditor:
|
||||
"""
|
||||
VIN Auditor v1.3.0
|
||||
- Alvázszám alapú hitelesítés és MDM szinkron.
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
async def audit_asset(cls, asset_id: int):
|
||||
# 1. ADATGYŰJTÉS ÉS SESSION ZÁRÁS
|
||||
async with SessionLocal() as db:
|
||||
stmt = select(Asset).options(joinedload(Asset.catalog)).where(Asset.id == asset_id)
|
||||
asset = (await db.execute(stmt)).scalar_one_or_none()
|
||||
if not asset or not asset.vin: return
|
||||
make, vin, current_kw = asset.catalog.make, asset.vin, asset.catalog.power_kw
|
||||
|
||||
# 2. AI FÁZIS (Izolált hívás)
|
||||
try:
|
||||
logger.info(f"🛡️ VIN Audit indul: {vin}")
|
||||
truth = await AIService.get_clean_vehicle_data(make, vin, "vin_audit", {"vin": vin})
|
||||
|
||||
if truth and truth.get("kw"):
|
||||
# 3. MENTÉSI FÁZIS (Új session)
|
||||
async with SessionLocal() as db:
|
||||
real_kw = int(truth["kw"])
|
||||
if abs(real_kw - (current_kw or 0)) >= 5:
|
||||
# Új variáns mentése
|
||||
new_v = AssetCatalog(make=make.upper(), model=truth.get("marketing_name", "Unknown"), power_kw=real_kw)
|
||||
db.add(new_v)
|
||||
await db.flush()
|
||||
await db.execute(update(Asset).where(Asset.id == asset_id).values(catalog_id=new_v.id, is_verified=True))
|
||||
else:
|
||||
await db.execute(update(Asset).where(Asset.id == asset_id).values(is_verified=True))
|
||||
|
||||
await db.commit()
|
||||
logger.info(f"✅ Audit sikeres: {vin}")
|
||||
except Exception as e:
|
||||
logger.error(f"🚨 Auditor hiba: {e}")
|
||||
|
||||
async def run(self):
|
||||
logger.info("🛡️ Auditor v1.3.0 ONLINE")
|
||||
while True:
|
||||
try:
|
||||
async with SessionLocal() as db:
|
||||
stmt = select(Asset.id).where(and_(Asset.is_verified == False, Asset.vin.isnot(None))).limit(1)
|
||||
aid = (await db.execute(stmt)).scalar_one_or_none()
|
||||
if aid: await self.audit_asset(aid)
|
||||
else: await asyncio.sleep(60)
|
||||
except: await asyncio.sleep(30)
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(VINAuditor().run())
|
||||
Reference in New Issue
Block a user