66 lines
1.9 KiB
Python
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)}"} |