133 lines
3.6 KiB
Python
133 lines
3.6 KiB
Python
"""
|
|
股票数据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))
|