You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
3.1 KiB

"""Pydantic 数据校验模型"""
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, Field
# ===== 采集请求 =====
class BatchFetchRequest(BaseModel):
"""批量获取数据请求"""
symbols: List[str] = Field(..., description="品种合约列表,如 ['SN2504', 'AG2506']")
data_type: str = Field(default="futures", description="数据类型: futures / stock")
periods: List[str] = Field(
default=["5min", "15min", "30min", "60min", "daily"],
description="周期列表: 5min / 15min / 30min / 60min / daily"
)
# ===== 数据响应 =====
class CandleItem(BaseModel):
"""单根K线"""
datetime: str
open: float
high: float
low: float
close: float
volume: float
class TimeframeData(BaseModel):
"""一个周期的数据"""
period: str
candles: List[CandleItem]
candle_count: int
fetched_at: str
class SymbolDataResponse(BaseModel):
"""单个品种的数据响应"""
symbol: str
data_type: str
current_price: Optional[float] = None
timeframes: List[TimeframeData]
source: str = "cache|live"
class BatchFetchResponse(BaseModel):
"""批量获取响应"""
success: List[str] = Field(default_factory=list, description="成功的品种")
failed: List[str] = Field(default_factory=list, description="失败的品种")
details: dict = Field(default_factory=dict, description="每个品种的详细数据")
class LatestDataResponse(BaseModel):
"""获取最新数据响应"""
symbol: str
data_type: str
period: str
candles: List[CandleItem]
candle_count: int
current_price: Optional[float] = None
fetched_at: str
is_fresh: bool = Field(description="数据是否在缓存有效期内")
# ===== 定时任务 =====
class CreateTaskRequest(BaseModel):
"""创建定时任务请求"""
symbol: str = Field(..., description="品种合约代码")
data_type: str = Field(default="futures", description="数据类型")
periods: str = Field(
default="5min,15min,30min,60min,daily",
description="需要定时获取的周期,逗号分隔"
)
interval_seconds: int = Field(
default=300,
ge=30,
le=86400,
description="轮询间隔(秒),范围 30~86400"
)
task_type: str = Field(default="interval", description="任务类型: interval, daily, once")
run_time: Optional[str] = Field(default=None, description="执行时间,格式 HH:MM")
class TaskInfo(BaseModel):
"""任务信息"""
id: int
symbol: str
data_type: str
periods: List[str]
interval_seconds: int
task_type: str = Field(default="interval", description="任务类型: interval, daily, once")
enabled: bool
running: bool = Field(description="当前是否正在运行")
last_run: Optional[str] = None
last_status: Optional[str] = None
next_run: Optional[str] = Field(default=None, description="下次执行时间")
created_at: str
updated_at: str
class TaskListResponse(BaseModel):
tasks: List[TaskInfo]
total: int