package business import ( "context" "strings" "kra/internal/biz/business" "kra/internal/service/dto" ) type ActivationUsecase interface { List(context.Context, business.ActivationFilter, ...business.ListOption) (*business.ActivationPage, error) SpendDetail(context.Context, uint64) (*business.ActivationSpendDetail, error) } type ActivationService struct{ uc ActivationUsecase } func NewActivationService(uc *business.ActivationUsecase) *ActivationService { return &ActivationService{uc: uc} } func splitQueryValues(values []string) []string { result := []string{} seen := map[string]bool{} for _, value := range values { for _, part := range strings.Split(value, ",") { part = strings.TrimSpace(part) if part != "" && !seen[part] { result = append(result, part) seen[part] = true } } } return result } func (s *ActivationService) List(ctx context.Context, req *dto.ActivationQuery) (*dto.ActivationPage, error) { if req == nil { return nil, business.ErrActivationInput } page, size := req.Page, req.PageSize if page < 1 { page = 1 } if size < 1 { size = 10 } if size > 500 { size = 500 } if page > int(^uint(0)>>1)/size { return nil, business.ErrActivationInput } filter := business.ActivationFilter{PlatformNames: splitQueryValues(req.PlatformNames), Statuses: splitQueryValues(req.Statuses), PromoteAccount: strings.TrimSpace(req.PromoteAccount), BusierAccount: strings.TrimSpace(req.BusierAccount)} result, err := s.uc.List(ctx, filter, business.ListOffset((page-1)*size), business.ListLimit(size)) if err != nil { return nil, err } out := &dto.ActivationPage{Rows: []*dto.ActivationResponse{}, Total: result.Total, Available: result.Available} for _, r := range result.Rows { out.Rows = append(out.Rows, &dto.ActivationResponse{ID: r.ID, PromoteAccount: r.PromoteAccount, PlatformName: r.PlatformName, PlatformTitle: business.PlatformName(r.PlatformName), BusierAccount: r.BusierAccount, ApplicantOA: r.ApplicantOA, BindAt: localTime(r.BindAt), UnbindAt: localTime(r.UnbindAt), ReachAt: localTime(r.ReachAt), EndAt: localTime(r.EndAt()), AccumAmount: r.AccumAmount, Status: r.Status, StatusText: business.ActivationStatusLabel(r.Status)}) } return out, nil } func (s *ActivationService) SpendDetail(ctx context.Context, id uint64) (*dto.ActivationSpendDetail, error) { if id == 0 { return nil, business.ErrActivationNotFound } result, err := s.uc.SpendDetail(ctx, id) if err != nil { return nil, err } a := result.Activation out := &dto.ActivationSpendDetail{PromoteAccount: a.PromoteAccount, BindAt: localTime(a.BindAt), EndAt: localTime(a.EndAt()), List: []*dto.ActivationSpendItem{}, TotalAmount: result.TotalAmount} for _, item := range result.Items { out.List = append(out.List, &dto.ActivationSpendItem{PlatformTitle: business.PlatformName(a.PlatformName), GameName: item.GameName, TotalAmount: item.Amount}) } return out, nil }