51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
from typing import List, Optional, Dict, Any
|
||
from fastapi import APIRouter, HTTPException, Depends
|
||
from pydantic import BaseModel
|
||
|
||
from app.tool.meetspot_recommender import CafeRecommender
|
||
from app.logger import logger
|
||
|
||
router = APIRouter(prefix="/api/miniprogram", tags=["miniprogram"])
|
||
|
||
class LocationItem(BaseModel):
|
||
lng: float
|
||
lat: float
|
||
address: Optional[str] = ""
|
||
name: Optional[str] = ""
|
||
|
||
class CalculateRequest(BaseModel):
|
||
locations: List[LocationItem]
|
||
keywords: Optional[str] = "咖啡馆"
|
||
requirements: Optional[str] = ""
|
||
min_rating: Optional[float] = 0.0
|
||
max_distance: Optional[int] = 100000
|
||
price_range: Optional[str] = ""
|
||
|
||
@router.post("/calculate")
|
||
async def calculate_meetspot(request: CalculateRequest):
|
||
"""小程序核心计算接口:根据坐标直接计算推荐"""
|
||
try:
|
||
recommender = CafeRecommender()
|
||
|
||
# 转换 locations 为 list of dict
|
||
location_dicts = [loc.model_dump() for loc in request.locations]
|
||
|
||
result = await recommender.execute_for_miniprogram(
|
||
locations=location_dicts,
|
||
keywords=request.keywords,
|
||
user_requirements=request.requirements,
|
||
min_rating=request.min_rating,
|
||
max_distance=request.max_distance,
|
||
price_range=request.price_range
|
||
)
|
||
|
||
if not result.get("success", False):
|
||
# 业务逻辑错误也返回 200,但在 body 中包含 error
|
||
return result
|
||
|
||
return result
|
||
|
||
except Exception as e:
|
||
logger.error(f"Miniprogram calculation failed: {e}")
|
||
raise HTTPException(status_code=500, detail=str(e))
|