from typing import List, Dict, Any from sqlalchemy import text from app.db.session import SessionLocal from app.services.config_service import config class MatchingService: @staticmethod async def rank_services(services: List[Dict[str, Any]], org_id: int = None) -> List[Dict[str, Any]]: # 1. Dinamikus paraméterek lekérése az Admin beállításokból w_dist = await config.get_setting('weight_distance', org_id=org_id, default=0.5) w_rate = await config.get_setting('weight_rating', org_id=org_id, default=0.5) b_gold = await config.get_setting('bonus_gold_service', org_id=org_id, default=500) ranked_list = [] for s in services: # Normalizált pontszámok (példa logika) # Távolság pont (P_dist): 100 / (távolság + 1) -> közelebb = több pont p_dist = 100 / (s.get('distance', 1) + 1) # Értékelés pont (P_rate): csillagok * 20 -> 5 csillag = 100 pont p_rate = s.get('rating', 0) * 20 # Bónusz (B_tier): ha Gold, megkapja a bónuszt tier_bonus = b_gold if s.get('tier') == 'gold' else 0 # A Mester Képlet: total_score = (p_dist * float(w_dist)) + (p_rate * float(w_rate)) + tier_bonus s['total_score'] = round(total_score, 2) ranked_list.append(s) # Sorbarendezés pontszám szerint csökkenőben return sorted(ranked_list, key=lambda x: x['total_score'], reverse=True) matching_service = MatchingService()