package service import ( "errors" "affiliate_dash/internal/model" "gorm.io/gorm" ) type SkinService struct { db *gorm.DB } func NewSkinService(db *gorm.DB) *SkinService { return &SkinService{db: db} } type SkinListQuery struct { Page int Size int Keyword string Game string Category string Status *int } func (s *SkinService) List(q SkinListQuery) ([]model.Skin, int64, error) { if q.Page < 1 { q.Page = 1 } if q.Size < 1 || q.Size > 100 { q.Size = 20 } tx := s.db.Model(&model.Skin{}) if q.Keyword != "" { like := "%" + q.Keyword + "%" tx = tx.Where("name LIKE ? OR sku LIKE ?", like, like) } if q.Game != "" { tx = tx.Where("game = ?", q.Game) } if q.Category != "" { tx = tx.Where("category = ?", q.Category) } if q.Status != nil { tx = tx.Where("status = ?", *q.Status) } var total int64 if err := tx.Count(&total).Error; err != nil { return nil, 0, err } var list []model.Skin err := tx.Order("id DESC").Offset((q.Page - 1) * q.Size).Limit(q.Size).Find(&list).Error return list, total, err } func (s *SkinService) Get(id uint) (*model.Skin, error) { var skin model.Skin if err := s.db.First(&skin, id).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("皮肤不存在") } return nil, err } return &skin, nil } func (s *SkinService) Create(skin *model.Skin) error { return s.db.Create(skin).Error } func (s *SkinService) Update(id uint, updates map[string]interface{}) error { res := s.db.Model(&model.Skin{}).Where("id = ?", id).Updates(updates) if res.Error != nil { return res.Error } if res.RowsAffected == 0 { return errors.New("皮肤不存在") } return nil } func (s *SkinService) Delete(id uint) error { res := s.db.Delete(&model.Skin{}, id) if res.Error != nil { return res.Error } if res.RowsAffected == 0 { return errors.New("皮肤不存在") } return nil } // SeedCatalog 按 sku 幂等导入商品目录(已存在则跳过) func (s *SkinService) SeedCatalog() error { // 清理早期无 sku 的演示数据,避免唯一索引冲突 _ = s.db.Where("sku = ? OR sku IS NULL", "").Delete(&model.Skin{}).Error for _, item := range peaceEliteCatalog { var existing model.Skin err := s.db.Where("sku = ?", item.SKU).First(&existing).Error if err == nil { // 已存在:仅同步默认佣金为 0(不改价格等业务字段) if existing.Commission != 0 { _ = s.db.Model(&existing).Update("commission", 0).Error } continue } if !errors.Is(err, gorm.ErrRecordNotFound) { return err } skin := model.Skin{ Name: item.Name, SKU: item.SKU, Game: "和平精英", Category: item.Category, Price: 0, CostPrice: 0, Commission: 0, Stock: -1, Status: 1, } if err := s.db.Create(&skin).Error; err != nil { return err } } return nil } type catalogItem struct { Name string SKU string Category string } // 和平精英商品目录(中文名保持原样,英文名为固定 sku) var peaceEliteCatalog = []catalogItem{ {Name: "套装-Alan Walker", SKU: "suit_alan_walker", Category: "套装"}, {Name: "套装-暗影哥特", SKU: "suit_shadow_gothic", Category: "套装"}, {Name: "黑色高级特训官上衣", SKU: "top_black_elite_trainer", Category: "上衣"}, {Name: "M416-仓鼠灰灰", SKU: "m416_hamster_gray", Category: "枪械"}, {Name: "萌熊伴侣背包", SKU: "bag_cute_bear", Category: "背包"}, {Name: "套装-双彩绵绵", SKU: "suit_dual_fluffy", Category: "套装"}, {Name: "套装-糯粉咩咩", SKU: "suit_pink_sheep", Category: "套装"}, {Name: "套装-恋恋初桃", SKU: "suit_first_peach", Category: "套装"}, {Name: "套装-浪漫天命", SKU: "suit_romantic_destiny", Category: "套装"}, {Name: "西部牛仔大礼包", SKU: "pack_western_cowboy", Category: "礼包"}, {Name: "烟雾弹-糯粉咩咩", SKU: "smoke_pink_sheep", Category: "投掷物"}, {Name: "破片手榴弹-糯粉咩咩", SKU: "frag_pink_sheep", Category: "投掷物"}, {Name: "套装-仓鼠灰灰", SKU: "suit_hamster_gray", Category: "套装"}, {Name: "套装-萌熊伴侣", SKU: "suit_cute_bear", Category: "套装"}, {Name: "糯粉咩咩背包", SKU: "bag_pink_sheep", Category: "背包"}, {Name: "糯粉咩咩头盔", SKU: "helmet_pink_sheep", Category: "头盔"}, {Name: "仓鼠灰灰背包", SKU: "bag_hamster_gray", Category: "背包"}, {Name: "仓鼠灰灰头盔", SKU: "helmet_hamster_gray", Category: "头盔"}, {Name: "套装-西部谜踪", SKU: "suit_western_mystery", Category: "套装"}, {Name: "国宝胖达头盔", SKU: "helmet_panda_treasure", Category: "头盔"}, {Name: "套装-胖达圆圆", SKU: "suit_panda_round", Category: "套装"}, {Name: "套装-胖达团团", SKU: "suit_panda_tuan", Category: "套装"}, {Name: "熔岩游骑兵礼包", SKU: "pack_lava_ranger", Category: "礼包"}, {Name: "套装-狂沙舞者", SKU: "suit_sand_dancer", Category: "套装"}, {Name: "星际漫游服装礼包", SKU: "pack_star_roam_outfit", Category: "礼包"}, {Name: "星际漫游枪械礼包", SKU: "pack_star_roam_weapon", Category: "礼包"}, {Name: "套装-绵云熊熊", SKU: "suit_cloud_bear", Category: "套装"}, }