package repository import ( "dianshang/internal/model" "time" "gorm.io/gorm" ) // BannerRepository 轮播图仓储 type BannerRepository struct { db *gorm.DB } // NewBannerRepository 创建轮播图仓储 func NewBannerRepository(db *gorm.DB) *BannerRepository { return &BannerRepository{db: db} } // GetActiveBanners 获取有效的轮播图 func (r *BannerRepository) GetActiveBanners() ([]model.Banner, error) { var banners []model.Banner err := r.db.Where("status = ?", 1).Order("sort ASC").Find(&banners).Error return banners, err } // GetBannerList 获取轮播图列表(分页) func (r *BannerRepository) GetBannerList(page, pageSize int, status *int) ([]model.Banner, int64, error) { var banners []model.Banner var total int64 query := r.db.Model(&model.Banner{}) // 状态筛选 if status != nil { query = query.Where("status = ?", *status) } // 获取总数 if err := query.Count(&total).Error; err != nil { return nil, 0, err } // 分页查询 offset := (page - 1) * pageSize err := query.Order("sort ASC, created_at DESC"). Offset(offset). Limit(pageSize). Find(&banners).Error return banners, total, err } // GetBannerByID 根据ID获取轮播图 func (r *BannerRepository) GetBannerByID(id uint) (*model.Banner, error) { var banner model.Banner err := r.db.First(&banner, id).Error if err != nil { return nil, err } return &banner, nil } // CreateBanner 创建轮播图 func (r *BannerRepository) CreateBanner(banner *model.Banner) error { return r.db.Create(banner).Error } // UpdateBanner 更新轮播图 func (r *BannerRepository) UpdateBanner(banner *model.Banner) error { return r.db.Save(banner).Error } // DeleteBanner 删除轮播图 func (r *BannerRepository) DeleteBanner(id uint) error { return r.db.Delete(&model.Banner{}, id).Error } // BatchDeleteBanners 批量删除轮播图 func (r *BannerRepository) BatchDeleteBanners(ids []uint) error { return r.db.Delete(&model.Banner{}, ids).Error } // UpdateBannerStatus 更新轮播图状态 func (r *BannerRepository) UpdateBannerStatus(id uint, status int) error { return r.db.Model(&model.Banner{}).Where("id = ?", id).Update("status", status).Error } // BatchUpdateBannerStatus 批量更新轮播图状态 func (r *BannerRepository) BatchUpdateBannerStatus(ids []uint, status int) error { return r.db.Model(&model.Banner{}).Where("id IN ?", ids).Update("status", status).Error } // UpdateBannerSort 更新轮播图排序 func (r *BannerRepository) UpdateBannerSort(id uint, sort int) error { return r.db.Model(&model.Banner{}).Where("id = ?", id).Update("sort", sort).Error } // BatchUpdateBannerSort 批量更新轮播图排序 func (r *BannerRepository) BatchUpdateBannerSort(sortData []map[string]interface{}) error { return r.db.Transaction(func(tx *gorm.DB) error { for _, data := range sortData { if err := tx.Model(&model.Banner{}). Where("id = ?", data["id"]). Update("sort", data["sort"]).Error; err != nil { return err } } return nil }) } // GetBannersByDateRange 根据日期范围获取轮播图 func (r *BannerRepository) GetBannersByDateRange(startDate, endDate time.Time) ([]model.Banner, error) { var banners []model.Banner err := r.db.Where("created_at BETWEEN ? AND ?", startDate, endDate). Order("sort ASC, created_at DESC"). Find(&banners).Error return banners, err } // GetBannersByStatus 根据状态获取轮播图 func (r *BannerRepository) GetBannersByStatus(status int) ([]model.Banner, error) { var banners []model.Banner err := r.db.Where("status = ?", status). Order("sort ASC, created_at DESC"). Find(&banners).Error return banners, err } // GetBannerCount 获取轮播图总数 func (r *BannerRepository) GetBannerCount() (int64, error) { var count int64 err := r.db.Model(&model.Banner{}).Count(&count).Error return count, err } // GetBannerCountByStatus 根据状态获取轮播图数量 func (r *BannerRepository) GetBannerCountByStatus(status int) (int64, error) { var count int64 err := r.db.Model(&model.Banner{}).Where("status = ?", status).Count(&count).Error return count, err } // GetMaxSort 获取最大排序值 func (r *BannerRepository) GetMaxSort() (int, error) { var maxSort int err := r.db.Model(&model.Banner{}).Select("COALESCE(MAX(sort), 0)").Scan(&maxSort).Error return maxSort, err } // CheckBannerExists 检查轮播图是否存在 func (r *BannerRepository) CheckBannerExists(id uint) (bool, error) { var count int64 err := r.db.Model(&model.Banner{}).Where("id = ?", id).Count(&count).Error return count > 0, err } // GetExpiredBanners 获取过期的轮播图 func (r *BannerRepository) GetExpiredBanners() ([]model.Banner, error) { var banners []model.Banner now := time.Now() err := r.db.Where("end_time IS NOT NULL AND end_time < ? AND status = 1", now). Find(&banners).Error return banners, err } // GetActiveBannersWithTimeRange 获取在时间范围内有效的轮播图 func (r *BannerRepository) GetActiveBannersWithTimeRange() ([]model.Banner, error) { var banners []model.Banner now := time.Now() err := r.db.Where("status = 1"). Where("(start_time IS NULL OR start_time <= ?)"+ " AND (end_time IS NULL OR end_time >= ?)", now, now). Order("sort ASC"). Find(&banners).Error return banners, err }