""" 股票数据API路由 """ from fastapi import APIRouter, HTTPException, Query from typing import Optional from app.services.tushare_service import tushare_service from app.utils.logger import logger router = APIRouter() @router.post("/sector/check") async def trigger_sector_check(): """ 手动触发板块异动检查 Returns: 检查结果 """ try: from app.main import _astock_monitor_instance from app.config import get_settings if not _astock_monitor_instance: # 创建临时监控实例 from app.astock_agent import SectorMonitor settings = get_settings() monitor = SectorMonitor( change_threshold=settings.astock_change_threshold, top_n=settings.astock_top_n, enable_notifier=False # 手动触发不发送通知 ) result = await monitor.check_once() return result else: result = await _astock_monitor_instance.check_once() return result except Exception as e: logger.error(f"手动触发板块检查失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/sector/stats") async def get_sector_stats(): """ 获取板块监控统计信息 Returns: 统计信息 """ try: from app.main import _astock_monitor_instance if not _astock_monitor_instance: return {"error": "板块监控未运行"} stats = _astock_monitor_instance.get_stats() return stats except Exception as e: logger.error(f"获取板块统计失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/quote/{stock_code}") async def get_quote(stock_code: str): """ 获取股票实时行情 Args: stock_code: 股票代码 Returns: 行情数据 """ try: quote = tushare_service.get_realtime_quote(stock_code) if not quote: raise HTTPException(status_code=404, detail="未找到股票数据") return quote except Exception as e: logger.error(f"获取行情失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/kline/{stock_code}") async def get_kline( stock_code: str, start_date: Optional[str] = Query(None, description="开始日期YYYYMMDD"), end_date: Optional[str] = Query(None, description="结束日期YYYYMMDD"), period: str = Query("D", description="周期D/W/M") ): """ 获取K线数据 Args: stock_code: 股票代码 start_date: 开始日期 end_date: 结束日期 period: 周期 Returns: K线数据 """ try: kline = tushare_service.get_kline_data(stock_code, start_date, end_date, period) if not kline: raise HTTPException(status_code=404, detail="未找到K线数据") return {"kline_data": kline} except Exception as e: logger.error(f"获取K线失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/basic/{stock_code}") async def get_basic(stock_code: str): """ 获取股票基本信息 Args: stock_code: 股票代码 Returns: 基本信息 """ try: basic = tushare_service.get_stock_basic(stock_code) if not basic: raise HTTPException(status_code=404, detail="未找到股票信息") return basic except Exception as e: logger.error(f"获取基本信息失败: {e}") raise HTTPException(status_code=500, detail=str(e))