fix: 三个核心需要的接口完成

master
Lxy 3 months ago
parent 13481c00f1
commit 54438611df

@ -212,15 +212,22 @@ class StockService:
loop.close() loop.close()
# 转换为Symbol模型 # 转换为Symbol模型
from app.models import Symbol, SymbolType from app.models import Symbol, SymbolType, Exchange
symbols = [] symbols = []
for s in symbols_info: for s in symbols_info:
# 将字符串 exchange 转换为 Exchange 枚举
try:
exchange_enum = Exchange(s.exchange)
except ValueError:
exchange_enum = Exchange.SH # 默认上海
symbols.append(Symbol( symbols.append(Symbol(
symbol_id=s.symbol_id, symbol_id=s.symbol_id,
symbol_type=SymbolType.STOCK, symbol_type=SymbolType.STOCK,
exchange=s.exchange, exchange=exchange_enum,
name=s.name, name=s.name,
underlying=s.underlying underlying=s.underlying,
status="active" # 添加必需的 status 字段
)) ))
info(f"Fetched {len(symbols)} symbols from adapter") info(f"Fetched {len(symbols)} symbols from adapter")
@ -271,4 +278,85 @@ class StockService:
def get_trading_dates(self, req: TradingDatesRequest) -> TradingDatesData: def get_trading_dates(self, req: TradingDatesRequest) -> TradingDatesData:
"""获取交易日历""" """获取交易日历"""
return self.repository.get_trading_dates(req.start, req.end) # 从数据库获取
data = self.repository.get_trading_dates(req.start, req.end)
# 如果数据库没有数据,从适配器获取
if not data.trading_dates:
info(f"No trading dates in DB for {req.start}~{req.end}, fetching from adapter...")
adapter_dates = self._fetch_trading_dates_from_adapter(req.start, req.end)
if adapter_dates:
# 保存到数据库
self._save_trading_dates_to_db(adapter_dates)
# 重新查询
data = self.repository.get_trading_dates(req.start, req.end)
return data
def _fetch_trading_dates_from_adapter(self, start: str, end: str) -> List[str]:
"""从适配器获取交易日历"""
try:
adapter_service = AdapterService()
# 确保适配器已连接
adapter = adapter_service.get_active_adapter("stock")
if not adapter:
asyncio.run(adapter_service._connect_adapter("amazingdata"))
adapter = adapter_service.get_active_adapter("stock")
if not adapter:
error("No active adapter available")
return []
# 异步获取数据
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
calendar_data = loop.run_until_complete(
adapter.fetch_trading_calendar("SH", start, end)
)
loop.close()
# 提取交易日日期
dates = []
for cal in calendar_data:
if cal.is_trading_day:
# 转换为 YYYYMMDD 格式
date_str = cal.date.strftime("%Y%m%d")
dates.append(date_str)
info(f"Fetched {len(dates)} trading dates from adapter")
return dates
except Exception as e:
error(f"Failed to fetch trading dates from adapter: {e}")
return []
def _save_trading_dates_to_db(self, dates: List[str]) -> None:
"""保存交易日历到数据库"""
try:
from app.repositories.models import StockTradingCalendar
from datetime import datetime as dt
for date_str in dates:
# 检查是否已存在
existing = self.db.query(StockTradingCalendar).filter(
StockTradingCalendar.trade_date == date_str
).first()
if not existing:
# 解析日期获取星期几
date_obj = dt.strptime(date_str, "%Y%m%d")
week_day = date_obj.weekday() + 1 # 1=周一, 7=周日
new_record = StockTradingCalendar(
trade_date=date_str,
is_trading_day=True,
week_day=week_day
)
self.db.add(new_record)
self.db.commit()
info(f"Saved {len(dates)} trading dates to DB")
except Exception as e:
error(f"Failed to save trading dates to DB: {e}")
self.db.rollback()

@ -0,0 +1,10 @@
# 待完成TODO
1. 总股本、机构持股未能获取
# 已完成DONE
1. 获取股票列表接口 stock/symbols -- 第一次请求慢,会超时
2. 获取k线 stock/klines/{symbol} -- 缺少股本等信息
3. 获取交易日历 stock/trading-dates
Loading…
Cancel
Save