"""Signal feedback endpoints.""" from __future__ import annotations import json from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from ...database import get_db from ...models import Signal, SignalFeedback from ...schemas import SignalFeedbackCreate, SignalFeedbackResponse router = APIRouter() @router.post("/{signal_id}/feedback", response_model=SignalFeedbackResponse) async def submit_signal_feedback( signal_id: int, feedback: SignalFeedbackCreate, db: AsyncSession = Depends(get_db), ): """提交信号反馈""" result = await db.execute(select(Signal).where(Signal.id == signal_id)) signal = result.scalar_one_or_none() if not signal: raise HTTPException(status_code=404, detail="Signal not found") ai_predicted_strategic = False ai_confidence = 0.0 if signal.strategic_analysis: try: analysis = json.loads(signal.strategic_analysis) ai_predicted_strategic = analysis.get("is_strategic", signal.impact_score >= 0.9) ai_confidence = analysis.get("confidence", 0.0) except Exception: ai_predicted_strategic = signal.impact_score >= 0.9 new_feedback = SignalFeedback( signal_id=signal_id, was_strategic=feedback.was_strategic, reason=feedback.reason, user_id=feedback.user_id, ai_predicted_strategic=ai_predicted_strategic, ai_confidence=ai_confidence, ) db.add(new_feedback) await db.commit() await db.refresh(new_feedback) is_correct = ai_predicted_strategic == feedback.was_strategic return SignalFeedbackResponse( id=new_feedback.id, signal_id=new_feedback.signal_id, was_strategic=new_feedback.was_strategic, ai_predicted_strategic=new_feedback.ai_predicted_strategic, ai_confidence=new_feedback.ai_confidence, is_correct=is_correct, ) @router.get("/{signal_id}/feedbacks", response_model=List[SignalFeedbackResponse]) async def get_signal_feedbacks( signal_id: int, db: AsyncSession = Depends(get_db), ): """获取某信号的全部反馈""" result = await db.execute( select(SignalFeedback) .where(SignalFeedback.signal_id == signal_id) .order_by(SignalFeedback.created_at.desc()) ) feedbacks = result.scalars().all() return [ SignalFeedbackResponse( id=feedback.id, signal_id=feedback.signal_id, was_strategic=feedback.was_strategic, ai_predicted_strategic=feedback.ai_predicted_strategic, ai_confidence=feedback.ai_confidence or 0.0, is_correct=feedback.ai_predicted_strategic == feedback.was_strategic, ) for feedback in feedbacks ]