from fastapi import APIRouter, HTTPException, Query, Request from schemas import ConnectRequest, ConnectResponse, ContractResponse, TickResponse, KlineResponse, DisconnectResponse from tqapi_service import TqApiService router = APIRouter() # 存储当前连接的用户凭证 current_credentials = {} # 获取当前TqApiService实例 async def get_current_service(): if not current_credentials: raise HTTPException(status_code=401, detail="未连接到天勤服务器") # 使用当前凭证获取或创建实例 return await TqApiService.get_instance( current_credentials['username'], current_credentials['password'] ) @router.post("/connect", response_model=ConnectResponse) async def connect(request: ConnectRequest): """连接到天勤服务器""" try: # 存储凭证 current_credentials['username'] = request.username current_credentials['password'] = request.password # 获取或创建TqApiService实例 service = await TqApiService.get_instance(request.username, request.password) return ConnectResponse(success=True, message="连接成功") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/contracts", response_model=ContractResponse) async def get_contracts(): """获取合约列表""" try: service = await get_current_service() contracts = await service.get_contracts() return ContractResponse(success=True, data=contracts) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/contract/{symbol}", response_model=ContractResponse) async def get_contract(symbol: str): """获取合约详情""" try: service = await get_current_service() contract = await service.get_contract(symbol) return ContractResponse(success=True, data=contract) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/klines/{symbol}", response_model=KlineResponse) async def get_klines( symbol: str, period: str = Query(..., description="周期,如 1M, 5M, 1H, 1D"), count: int = Query(30, description="数据数量") ): """获取 K 线数据""" try: service = await get_current_service() klines = await service.get_klines(symbol, period, count) return KlineResponse(success=True, data=klines) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/tick/{symbol}", response_model=TickResponse) async def get_tick(symbol: str): """获取 tick 数据""" try: print(f"[Router] 接收到获取 tick 数据请求,symbol: {symbol}") print(f"[Router] 正在获取当前服务实例...") service = await get_current_service() print(f"[Router] 获取服务实例成功") print(f"[Router] 正在调用 service.get_tick({symbol})...") tick = await service.get_tick(symbol) print(f"[Router] 获取 tick 数据成功: {tick}") return TickResponse(success=True, data=tick) except Exception as e: print(f"[Router] 获取 tick 数据失败: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.post("/disconnect", response_model=DisconnectResponse) async def disconnect(): """断开连接""" try: service = await get_current_service() success = await service.disconnect() if success: # 清除凭证 current_credentials.clear() return DisconnectResponse(success=True, message="断开成功") else: raise HTTPException(status_code=400, detail="断开失败") except Exception as e: raise HTTPException(status_code=500, detail=str(e))