package model import ( "fmt" "github.com/codinl/go-logger" "strings" ) //go:generate goqueryset -in game_card.go // gen:qs type GameCard struct { Model Name string `json:"name" gorm:"index"` // 名称 Price uint32 `json:"price" gorm:"index"` // 价格 CoverImg string `json:"cover_img"` // 封面 OrderCount uint32 `json:"order_count" gorm:"index"` // 订单数 NewProducts uint8 `json:"new_products"` // 新品: 1-新品 2-非新品 Status uint8 `json:"status"` // 状态: 1-上架 2-下架 StockCount uint32 `json:"stock_count"` // 库存 TotalCount uint32 `json:"total_count"` // 总量 GameTypeId uint32 `json:"game_type_id"` // 游戏类型 GoodsGalleryUrl string `json:"goods_gallery_url" gorm:"type:text;comment:'轮播图'"` // 轮播图 ViewCount uint32 `json:"view_count"` // 查看人数 Playability uint32 `json:"playability"` // 耐玩度 Playfulness uint32 `json:"playfulness"` // 好玩度 GameTime uint32 `json:"game_time"` // 游戏时间 Likes uint32 `json:"likes"` // 点赞 DetailInfo string `json:"detail_info" gorm:"type:text;comment:'详情描述'"` // 详情描述 DetailImg string `json:"detail_img"` // 详情图片 } func (*GameCard) TableName() string { return "game_card" } // gen:qs type HomeCarousel struct { Model Name string `json:"name" gorm:"index"` // 名称 Img string `json:"img"` // 图片 Sort uint32 `json:"sort" gorm:"index"` IsShow uint32 `json:"is_show"` // 1-显示 2-隐藏 Detail string `json:"detail" gorm:"type:text;comment:'详情描述'"` Link string `json:"link"` } func (*HomeCarousel) TableName() string { return "home_carousel" } func GetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, storeId uint32) ([]GameCard, uint32, error) { var ( cards []GameCard = make([]GameCard, 0) totalPage uint32 count int err error ) page -= 1 if page < 0 { page = 0 //return cards, 0, errors.New("page is err") } //count, err := NewGameCardQuerySet(DB).Count() //if err != nil { // logger.Error("NewGameCardQuerySet err:", err) // return cards, 0, err //} qs := NewGameCardQuerySet(DB) switch sortType { case 1: // 排序类型 1-默认 //qs = qs.OrderDescByCreatedAt() case 2: // 排序类型 2-新品 qs = qs.NewProductsEq(1) //count, err = NewGameCardQuerySet(DB).NewProductsEq(1).Count() case 3: // 排序类型 3-销量 qs = qs.OrderDescByOrderCount() case 4: // 排序类型 4-价格 大到小 qs = qs.OrderDescByPrice() case 5: // 排序类型 5-价格 小到大 qs = qs.OrderAscByPrice() } qs = qs.StatusEq(1) if len(gameTypeIds) > 0 { gameIdByType, err := GetGameIdByType(gameTypeIds) if err != nil { logger.Error("GetGameIdByType err:", err) return cards, 0, err } if len(gameIdByType) != 0 { //qs = qs.GameTypeIdIn(gameIdByType...) qs = qs.IDIn(gameIdByType...) } else { return cards, 0, err } } if storeId != 0 { var cardStocks []GameCardGoodsStock err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).RentStockGt(0).All(&cardStocks) if err != nil { logger.Error("GetGameIdByType err:", err) return cards, 0, err } if len(cardStocks) <= 0 { return cards, 0, nil } gameIds := make([]uint32, 0) for i, _ := range cardStocks { gameIds = append(gameIds, uint32(cardStocks[i].GameCardId)) } if len(gameIds) <= 0 { return cards, 0, nil } qs = qs.IDIn(gameIds...) } if count == 0 { count, err = qs.Count() } err = qs.OrderDescByCreatedAt().Offset(page * pageSize).Limit(pageSize).All(&cards) if err != nil && err != RecordNotFound { logger.Error("err:", err) return cards, 0, err } totalPage = uint32(count/pageSize + 1) cardIds := make([]uint64, 0) for i, _ := range cards { cardIds = append(cardIds, uint64(cards[i].ID)) } var cardStocks []GameCardGoodsStock err = NewGameCardGoodsStockQuerySet(DB).GameCardIdIn(cardIds...).All(&cardStocks) if err != nil { logger.Error("err:", err) return cards, totalPage, nil } cardStockMap := make(map[uint64]uint32, 0) for i, _ := range cardStocks { cardStockMap[cardStocks[i].GameCardId] += cardStocks[i].RentStock } for i, _ := range cards { stock, ok := cardStockMap[uint64(cards[i].ID)] if ok { cards[i].StockCount = stock } } return cards, totalPage, nil } func IsGameCardOnline(gameCardId uint32) (bool, error) { count, err := NewGameCardQuerySet(DB).IDEq(gameCardId).StatusEq(1).Count() if err != nil { logger.Error("err:", err) return false, err } return count == 1, nil } func IsGameCardHaveStoke(storeId, gameCardId uint32) (bool, error) { var stock GameCardGoodsStock err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).GameCardIdEq(uint64(gameCardId)).One(&stock) //count, err := NewGameCardQuerySet(DB).IDEq(gameCardId).StatusEq(1).Count() if err != nil { logger.Error("err:", err) return false, err } // 发货的时候减库存 return stock.RentStock > 0, nil } const ( GameCardGoodsStatusStock = 1 // 库存中 GameCardGoodsStatusInWay = 2 // 在途 GameCardGoodsStatusCustomerHold = 3 // 客户持有 ) // gen:qs type GameCardGoods struct { Model GameCardId uint64 `json:"game_card_id"` // 游戏卡id SerialNumber string `json:"serial_number" gorm:"index"` // 编号 Status uint8 `json:"status"` // 状态:1-库存中 2-在途 3-客户持有 StoreId uint64 `json:"store_id"` // 门店id Provider string `json:"provider"` // 供应商 } func (*GameCardGoods) TableName() string { return "game_card_goods" } // gen:qs type GameCardGoodsStock struct { Model StoreId uint64 `json:"store_id"` // 门店id GameCardId uint64 `json:"game_card_id"` // 游戏卡id StoreStock uint32 `json:"store_stock"` // 门店库存 RentStock uint32 `json:"rent_stock"` // 租借库存 UserHoldStock uint32 `json:"user_hold_stock"` OrderCount uint32 `json:"order_count"` TotalStock uint32 `json:"total_stock"` Name string `json:"name" gorm:"-"` // 名称 CoverImg string `json:"coverImg" gorm:"-"` // 封面 } func (*GameCardGoodsStock) TableName() string { return "game_card_goods_stock" } func GetGameCardInfo(id uint64) (GameCard, error) { game := GameCard{} err := NewGameCardQuerySet(DB).IDEq(uint32(id)).One(&game) if err != nil && err != RecordNotFound { logger.Error("err:", err) return game, err } var cardStocks []GameCardGoodsStock err = NewGameCardGoodsStockQuerySet(DB).GameCardIdEq(uint64(game.ID)).All(&cardStocks) if err != nil { logger.Error("err:", err) } cardStock := uint32(0) for i, _ := range cardStocks { cardStock += cardStocks[i].RentStock } game.StockCount = cardStock return game, nil } func GetGameCardSearch(name string, page, pageSize int, storeId uint32) ([]GameCard, uint32, error) { var ( cards []GameCard = make([]GameCard, 0) totalPage uint32 cardCount = struct { Count uint32 `json:"count"` }{} ) page -= 1 if page < 0 { page = 0 } sqlStore := "" if storeId != 0 { var gameStocks []GameCardGoodsStock err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).All(&gameStocks) if err != nil { } if len(gameStocks) == 0 { logger.Error("err:", err) return cards, 0, err } gameCardIds := make([]string, 0, len(gameStocks)) for i, _ := range gameStocks { gameCardIds = append(gameCardIds, fmt.Sprintf("%d", gameStocks[i].GameCardId)) } sqlStore = fmt.Sprintf(" AND id IN (%s) ", strings.Join(gameCardIds, ",")) } //countSql := "SELECT game_card.* FROM game_card WHERE game_card.name LIKE '%" + name + "%'" countSql := "SELECT COUNT(id) AS count FROM game_card WHERE status=1 AND game_card.name LIKE '%" + name + "%'" + sqlStore err := DB.Raw(countSql).Scan(&cardCount).Error if err != nil { logger.Error("err:", err) return cards, 0, err } sql := "SELECT game_card.* FROM game_card WHERE status=1 AND game_card.name LIKE '%" + name + "%'" + sqlStore + fmt.Sprintf(" LIMIT %d,%d;", page*pageSize, pageSize) //sql := fmt.Sprintf(`SELECT * FROM game_card WHERE name LIKE '%%s%';`) err = DB.Raw(sql).Scan(&cards).Error if err != nil { logger.Error("err:", err) return cards, 0, err } cardIds := make([]uint64, 0) for i, _ := range cards { cardIds = append(cardIds, uint64(cards[i].ID)) } var cardStocks []GameCardGoodsStock err = NewGameCardGoodsStockQuerySet(DB).GameCardIdIn(cardIds...).All(&cardStocks) if err != nil { logger.Error("err:", err) return cards, totalPage, nil } cardStockMap := make(map[uint64]uint32, 0) for i, _ := range cardStocks { cardStockMap[cardStocks[i].GameCardId] += cardStocks[i].RentStock } for i, _ := range cards { stock, ok := cardStockMap[uint64(cards[i].ID)] if ok { cards[i].StockCount = stock } } totalPage = cardCount.Count/uint32(pageSize) + 1 return cards, totalPage, nil } // TODO 订单 func GetHomeCarouselList() ([]HomeCarousel, error) { carousels := make([]HomeCarousel, 0) err := NewHomeCarouselQuerySet(DB).IsShowEq(1).OrderDescBySort().All(&carousels) if err != nil && err != RecordNotFound { logger.Error("err:", err) return carousels, err } return carousels, nil } // gen:qs type GameCardType struct { Model Name string `json:"name"` // 游戏类型 Sort uint32 `json:"sort" gorm:"index"` // 排序 //GameCount uint32 `json:"game_count"` // 游戏数量 } func (*GameCardType) TableName() string { return "game_card_type" } func GetGameCardTypeList() ([]GameCardType, error) { gameTypes := make([]GameCardType, 0) err := NewGameCardTypeQuerySet(DB).OrderAscBySort().All(&gameTypes) if err != nil { logger.Errorf("err:%+v", err) return gameTypes, err } return gameTypes, nil } // gen:qs type GameType struct { Model GameCardId uint64 `json:"gameCardId" gorm:"column:game_card_id;index"` // 游戏卡id GameCardTypeId uint64 `json:"gameCardTypeId" gorm:"column:game_card_type_id;index"` // 分类id } func (*GameType) TableName() string { return "game_type" } func GetGameIdByType(gameTypeIds []uint64) ([]uint32, error) { gameTypes := make([]GameType, 0) err := NewGameTypeQuerySet(DB).GameCardTypeIdIn(gameTypeIds...).All(&gameTypes) if err != nil && err != RecordNotFound { logger.Error("err:", err) return nil, err } gameIds := make([]uint32, 0) if len(gameTypes) == 0 { return gameIds, nil } for i, _ := range gameTypes { gameIds = append(gameIds, uint32(gameTypes[i].GameCardId)) } return gameIds, nil } //func (m *GameType) GetGameByType(gameIds []int) ([]GameCard, error) { // games := make([]GameCard, 0) // gameTypes := make([]GameType,0) // err := DB.Table(m.TableName()).Where("id in (?)", ids).Find(&gameTypes).Error // if err != nil { // logger.Error("err:", err) // return games, err // } // gameCardId := make([]uint32,0) // for i, _ := range gameTypes { // gameCardId= append(gameCardId, uint32(gameTypes[i].GameCardId)) // } // NewGameCardQuerySet(DB).IDIn(gameCardId...).All() // return games, nil //} func (m *GameCard) GetGameType() ([]GameCardType, error) { gameCardTypes := make([]GameCardType, 0) gameTypes := make([]GameType, 0) err := NewGameTypeQuerySet(DB).GameCardIdEq(uint64(m.ID)).All(&gameTypes) if err != nil { logger.Error("err:", err) return gameCardTypes, err } gameCardTypeId := make([]uint32, 0) for i, _ := range gameTypes { gameCardTypeId = append(gameCardTypeId, uint32(gameTypes[i].GameCardTypeId)) } if len(gameCardTypeId) == 0 { return gameCardTypes, nil } err = NewGameCardTypeQuerySet(DB).IDIn(gameCardTypeId...).All(&gameCardTypes) if err != nil { logger.Error("err:", err) return gameCardTypes, err } return gameCardTypes, nil } type RspAliyunStsToken struct { AccessKeyId string `json:"access_key_id"` AccessKeySecret string `json:"access_key_secret"` SecurityToken string `json:"security_token"` BucketName string `json:"bucket_name"` Expiration uint64 `json:"expiration"` }