package threshold_activity import ( "context" "time" ) func (s *service) ListWinners(ctx context.Context, activityID int64, page int, pageSize int) (*WinnerListResponse, error) { if page <= 0 { page = 1 } if pageSize <= 0 { pageSize = 20 } if pageSize > 100 { pageSize = 100 } b := s.repo.GetDbR().WithContext(ctx).Table("threshold_activity_winners w").Where("w.activity_id = ?", activityID) var total int64 if err := b.Count(&total).Error; err != nil { return nil, err } var list []WinnerItem err := s.repo.GetDbR().WithContext(ctx).Table("threshold_activity_winners w"). Select("w.id, w.user_id, COALESCE(u.nickname, '') AS nickname, COALESCE(u.avatar, '') AS avatar, w.prize_id, w.reward_type, w.reward_ref_id, w.prize_name_snapshot AS prize_name, w.prize_image_snapshot AS prize_image, w.prize_value_snapshot_cents AS price_cents, w.cost_cents, w.grant_record_type, w.grant_record_id, w.created_at"). Joins("LEFT JOIN users u ON u.id = w.user_id"). Where("w.activity_id = ?", activityID). Order("w.id DESC"). Offset((page - 1) * pageSize). Limit(pageSize). Scan(&list).Error return &WinnerListResponse{Page: page, PageSize: pageSize, Total: total, List: list}, err } func (s *service) GetCost(ctx context.Context, activityID int64) (*CostSummary, error) { var out CostSummary err := s.repo.GetDbR().WithContext(ctx).Table("threshold_activity_winners"). Select("COALESCE(SUM(cost_cents), 0) AS cost_cents, COUNT(*) AS count"). Where("activity_id = ?", activityID). Scan(&out).Error return &out, err } func (s *service) GetCostSummary(ctx context.Context, startTime *time.Time, endTime *time.Time) (*CostSummary, error) { q := s.repo.GetDbR().WithContext(ctx).Table("threshold_activity_winners").Select("COALESCE(SUM(cost_cents), 0) AS cost_cents, COUNT(*) AS count") if startTime != nil { q = q.Where("created_at >= ?", *startTime) } if endTime != nil { q = q.Where("created_at < ?", *endTime) } var out CostSummary if err := q.Scan(&out).Error; err != nil { return nil, err } return &out, nil }