package business import ( "context" "kra/internal/biz/business" "kra/internal/service/dto" ) type RankingUsecase interface { List(context.Context, business.RankingKind, business.AnalyticsFilter) (*business.RankingPage, error) } type RankingService struct{ uc RankingUsecase } func NewRankingService(uc *business.RankingUsecase) *RankingService { return &RankingService{uc: uc} } func rankingItems(rows []*business.RankingItem, kind business.RankingKind) []*dto.RankingItem { out := make([]*dto.RankingItem, 0, len(rows)) for _, row := range rows { item := &dto.RankingItem{Rank: row.Rank, ObjectID: row.ObjectID, ObjectName: row.Name, MetricValue: row.Value, MoM: row.MoM, MoMStatus: row.MoMStatus} if kind != business.BusinessRanking { source, label := row.SourceDB, business.PlatformName(row.SourceDB) item.SourceDB, item.SourceDBLabel = &source, &label } out = append(out, item) } return out } func (s *RankingService) List(ctx context.Context, kind business.RankingKind, req *dto.RankingQuery) (*dto.RankingPage, error) { if req == nil { return nil, business.ErrAnalyticsInput } f, err := analyticsRequest(&dto.AnalyticsQuery{Sources: req.Sources, BeginTime: req.BeginTime, EndTime: req.EndTime}) if err != nil { return nil, err } page, err := s.uc.List(ctx, kind, f) if err != nil { return nil, err } return &dto.RankingPage{Register: rankingItems(page.Register, kind), Recharge: rankingItems(page.Recharge, kind), PayRate: rankingItems(page.PayRate, kind), Active: rankingItems(page.Active, kind), Begin: page.Begin, End: page.End, Available: page.Available}, nil }