Files
2026-06-15 14:50:15 +08:00

66 lines
1.9 KiB
Python

from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel
from app.database import get_db
from app.core.deps import get_current_user
from app.models.user import User
from app.services.medicine import MedicineService
router = APIRouter()
class NaturalSearchRequest(BaseModel):
query: str
@router.get("/")
async def search_medicines(
q: str = Query(...),
type: str = Query("name"),
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user)
):
service = MedicineService(db)
medicines = await service.search_medicines(q)
return [
{
"id": m.id,
"name": m.name,
"generic_name": m.generic_name,
"indications": m.indications,
"total_quantity": sum(b.quantity for b in m.batches if not b.is_expired)
}
for m in medicines
]
@router.post("/natural")
async def natural_language_search(
data: NaturalSearchRequest,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user)
):
from app.ai.manager import ai_manager
from app.config import settings
service = MedicineService(db)
medicines = await service.search_medicines(data.query)
if not medicines:
return {"results": [], "ai_response": "未找到相关药品"}
text_provider = ai_manager.get_text_provider(settings.AI_PROVIDER)
if not text_provider:
return {"results": [], "ai_response": "AI 服务未配置"}
medicines_data = [
{"name": m.name, "indications": m.indications or ""}
for m in medicines
]
try:
results = await text_provider.natural_language_search(data.query, medicines_data)
return {"results": results, "ai_response": "搜索完成"}
except Exception as e:
return {"results": [], "ai_response": f"搜索失败: {str(e)}"}