package paymentconfig import ( "context" "errors" "hfb_sys/backend/internal/model" "gorm.io/gorm" ) // List 获取配置列表 func (r *Repository) List(ctx context.Context, query ListQuery) ([]ConfigDTO, int64, error) { var items []model.PaymentMerchantConfig var total int64 db := r.db.WithContext(ctx).Model(&model.PaymentMerchantConfig{}) // 过滤条件 if query.Provider != "" { db = db.Where("provider = ?", query.Provider) } if query.Status != "" { db = db.Where("status = ?", query.Status) } if query.Environment != "" { db = db.Where("environment = ?", query.Environment) } // 获取总数 if err := db.Count(&total).Error; err != nil { return nil, 0, err } // 分页 page := query.Page if page < 1 { page = 1 } pageSize := query.PageSize if pageSize < 1 { pageSize = 20 } if pageSize > 100 { pageSize = 100 } offset := (page - 1) * pageSize if err := db.Order("is_default DESC, id DESC").Offset(offset).Limit(pageSize).Find(&items).Error; err != nil { return nil, 0, err } dtos := make([]ConfigDTO, 0, len(items)) for _, item := range items { dto, err := r.toDTO(item, false) if err != nil { return nil, 0, err } dtos = append(dtos, dto) } return dtos, total, nil } // FindByID 根据 ID 查询配置 // FindByID 根据 ID 查询配置 func (r *Repository) FindByID(ctx context.Context, id uint64, includeSecret bool) (*ConfigDTO, error) { var item model.PaymentMerchantConfig if err := r.db.WithContext(ctx).Where("id = ?", id).First(&item).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrConfigNotFound } return nil, err } dto, err := r.toDTO(item, includeSecret) if err != nil { return nil, err } return &dto, nil } // FindDefault 查询默认配置 // FindDefault 查询默认配置 func (r *Repository) FindDefault(ctx context.Context, provider string) (*model.PaymentMerchantConfig, error) { var item model.PaymentMerchantConfig if err := r.db.WithContext(ctx).Where("provider = ? AND is_default = ? AND status = ?", provider, true, "active").First(&item).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrNoActiveConfigFound } return nil, err } return &item, nil } // FindDefaultAny 查询任意服务商的默认启用配置。 // FindDefaultAny 查询任意服务商的默认启用配置。 func (r *Repository) FindDefaultAny(ctx context.Context, includeSecret bool) (*ConfigDTO, error) { var item model.PaymentMerchantConfig if err := r.db.WithContext(ctx).Where("status = ?", "active").Order("is_default DESC, id DESC").First(&item).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrNoActiveConfigFound } return nil, err } dto, err := r.toDTO(item, includeSecret) if err != nil { return nil, err } return &dto, nil } // FindDefaultByProvider 查询指定服务商的默认启用配置。 // FindDefaultByProvider 查询指定服务商的默认启用配置。 func (r *Repository) FindDefaultByProvider(ctx context.Context, provider string, includeSecret bool) (*ConfigDTO, error) { item, err := r.FindDefault(ctx, provider) if err != nil { return nil, err } dto, err := r.toDTO(*item, includeSecret) if err != nil { return nil, err } return &dto, nil } // FindByProviderMerchant 根据服务商和商户号查配置,用于历史支付单继续使用原商户密钥。 // FindByProviderMerchant 根据服务商和商户号查配置,用于历史支付单继续使用原商户密钥。 func (r *Repository) FindByProviderMerchant(ctx context.Context, provider string, merchantID string, includeSecret bool) (*ConfigDTO, error) { var item model.PaymentMerchantConfig if err := r.db.WithContext(ctx).Where("provider = ? AND merchant_id = ?", provider, merchantID). Order("status = 'active' DESC, is_default DESC, id DESC"). First(&item).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrConfigNotFound } return nil, err } dto, err := r.toDTO(item, includeSecret) if err != nil { return nil, err } return &dto, nil } // ExportBackup 导出所有支付配置备份,包含解密后的密钥。 // FindActiveByProvider 查询提供商的所有激活配置 func (r *Repository) FindActiveByProvider(ctx context.Context, provider string) ([]model.PaymentMerchantConfig, error) { var items []model.PaymentMerchantConfig if err := r.db.WithContext(ctx).Where("provider = ? AND status = ?", provider, "active").Order("is_default DESC, id DESC").Find(&items).Error; err != nil { return nil, err } return items, nil } // Create 创建配置