package service import ( "context" "fmt" "time" "market-data-service/api" "market-data-service/internal/repository" ) // FuturesServiceImpl 期货服务实现 type FuturesServiceImpl struct { repo *repository.FuturesRepository } // NewFuturesService 创建期货服务 func NewFuturesService(repo *repository.FuturesRepository) FuturesService { return &FuturesServiceImpl{ repo: repo, } } // QueryKLines 查询K线数据 func (s *FuturesServiceImpl) QueryKLines(ctx context.Context, req *api.KLineQueryRequest) (*api.KLineData, error) { // 解析日期 start, err := time.Parse("20060102", req.Start) if err != nil { return nil, fmt.Errorf("invalid start date: %w", err) } end, err := time.Parse("20060102", req.End) if err != nil { return nil, fmt.Errorf("invalid end date: %w", err) } end = end.Add(24 * time.Hour).Add(-time.Second) // 获取K线数据 items, err := s.repo.GetKLines(ctx, req.Symbol, req.Freq, start, end) if err != nil { return nil, err } return &api.KLineData{ Symbol: req.Symbol, Freq: req.Freq, Count: len(items), Items: items, }, nil } // ListSymbols 查询标的列表 func (s *FuturesServiceImpl) ListSymbols(ctx context.Context, req *api.SymbolListRequest) (*api.SymbolListData, error) { symbols, total, err := s.repo.ListSymbols(ctx, req) if err != nil { return nil, err } return &api.SymbolListData{ Total: total, Page: req.Page, Size: req.Size, Items: symbols, }, nil } // BatchQueryKLines 批量查询K线 func (s *FuturesServiceImpl) BatchQueryKLines(ctx context.Context, req *api.BatchKLineRequest) (*api.BatchKLineData, error) { results := make([]api.BatchKLineResult, len(req.Symbols)) for i, symbol := range req.Symbols { singleReq := &api.KLineQueryRequest{ Symbol: symbol, Start: req.Start, End: req.End, Freq: req.Freq, } data, err := s.QueryKLines(ctx, singleReq) results[i] = api.BatchKLineResult{ Symbol: symbol, Success: err == nil, } if err != nil { results[i].Error = err.Error() } else { results[i].Data = &api.KLineSubData{ Count: data.Count, Items: data.Items, } } } return &api.BatchKLineData{Results: results}, nil } // GetTradingDates 获取交易日历 func (s *FuturesServiceImpl) GetTradingDates(ctx context.Context, req *api.TradingDatesRequest) (*api.TradingDatesData, error) { return s.repo.GetTradingDates(ctx, req.Start, req.End) } // GetContractsByUnderlying 根据品种获取合约 func (s *FuturesServiceImpl) GetContractsByUnderlying(ctx context.Context, req *api.FuturesContractsRequest) (*api.FuturesContractsData, error) { return s.repo.GetContractsByUnderlying(ctx, req.Underlying, req.Exchange) }