package model import ( "errors" "fmt" "github.com/codinl/go-logger" "github.com/jinzhu/gorm" "strings" "time" ) //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"` // 详情图片 EstimateVm uint32 `json:"estimate_vm" gorm:"-"` // 预计积分 RealPrice uint32 `json:"real_price"` // 真实价格 CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id CooperativeName string `json:"cooperative_name"` // 合作商名称 } func (*GameCard) TableName() string { return "game_card" } // gen:qs type GameCardLabel struct { Model GameCardId uint32 `json:"game_card_id" gorm:"index"` GameLabel string `json:"game_label" gorm:"index"` } func (*GameCardLabel) TableName() string { return "game_card_label" } // 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" } type CardInfo struct { GameCardId uint32 `json:"game_card_id"` Count uint32 `json:"count"` } func GetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, storeId, uid 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).IDNe(914) 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 uid != 0 { user := GetUserByUid(uid) if user.MemberExpire.After(time.Now()) && user.MemberExpire.AddDate(0, 0, -14).Before(time.Now()) { qs = qs.RealPriceLte(30000) } } 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 IsGameCardListOnline(gameCards []CardInfo) (bool, error) { for _, v := range gameCards { count, err := NewGameCardQuerySet(DB).IDEq(v.GameCardId).StatusEq(1).Count() if err != nil { logger.Error("err:", err) return false, err } if count < 1 { return false, nil } } return true, 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 // 客户持有 GameCardGoodsStatusCannibalize = 4 // 调拨 GameCardGoodsStatusReceivingCard = 5 // GameCardGoodsStatusReceivedCard = 6 // 调拨 GameCardGoodsStatusUnusual = 7 // 异常锁定 ) const ( GameCardGoodsTypeShare = "user_share" // 用户共享 GameCardGoodsTypeCommon = "common" // 公共 ) // gen:qs type GameCardGoods struct { Model GameCardId uint64 `json:"game_card_id"` // 游戏卡id SerialNumber string `json:"serial_number" gorm:"index"` // 编号 Status uint32 `json:"status"` // 状态:1-库存中 2-在途 3-客户持有 4-调拨 5-待收回 6-已收回 7-锁定 StoreId uint64 `json:"store_id"` // 门店id Provider string `json:"provider"` // 供应商 StockTime time.Time `json:"stock_time"` // 入库时间 CardType string `json:"card_type" gorm:"index"` // -用户共享 -公共 FunctionState uint32 `json:"function_state"` // 1-异常 2-正常 ShareProfitType uint32 `json:"share_profit_type"` // 1-非共享收益卡 2-共享收益卡 CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id CooperativeName string `json:"cooperative_name"` // 合作商名称 Store *Store `json:"store" gorm:"-"` // 门店 GameCard *GameCard `json:"game_card" gorm:"-"` // 游戏 UserShareCardBill *UserShareCardBill `json:"user_share_card_bill" gorm:"-"` } 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"` CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id CooperativeName string `json:"cooperative_name"` // 合作商名称 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"` } func GetOrderCardMapSerialNumberUnset(list map[uint32]OrderCard, gameCardId uint32) *OrderCard { for _, v := range list { if v.GameCardId == gameCardId && v.SerialNumber == "" { return &v } } return nil } func (m *GameCardGoodsStock) AddUserHoldStock(gdb *gorm.DB) error { if m.StoreId == 0 || m.GameCardId == 0 { return errors.New("store id or game card id is null") } if gdb == nil { gdb = DB } sql := fmt.Sprintf("UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock+1 WHERE store_id=%d AND game_card_id=%d;", m.StoreId, m.GameCardId) fmt.Println("sql:", sql) err := gdb.Exec(sql).Error if err != nil { logger.Error("err:", err) return err } return nil } func GetGameCardGoodsBySerialNumber(serialNumber string) (GameCardGoods, error) { var gameGoods GameCardGoods err := NewGameCardGoodsQuerySet(DB).SerialNumberEq(serialNumber).One(&gameGoods) if err != nil { logger.Error("gameGoods err:", err) return gameGoods, err } return gameGoods, nil } func (m *GameCardGoodsStock) Add(begin *gorm.DB) error { if begin == nil { begin = DB } //err := orm.Eloquent.Table("game_card_goods_stock").Where("store_id", m.StoreId). // Where("game_card_id", m.GameCardId).Count(&count).Error recordExist, err := QueryRecordExist(fmt.Sprintf( "SELECT * FROM game_card_goods_stock WHERE store_id=%d AND game_card_id=%d", m.StoreId, m.GameCardId)) if err != nil { logger.Error("game card goods stock record exist err:", err) return err } if !recordExist { m.StoreStock = 1 m.RentStock = 1 m.TotalStock = 1 err := begin.Create(m).Error if err != nil { logger.Error("create ame card goods stock record err:", err) return err } return nil } sql := fmt.Sprintf( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1,store_stock=store_stock+1,total_stock=total_stock+1 WHERE store_id=%d AND game_card_id=%d;", m.StoreId, m.GameCardId) fmt.Println("sql:", sql) err = begin.Exec(sql).Error if err != nil { logger.Errorf("err:%#v", err) return err } return nil } func (*GameCardGoods) Adds(cards []GameCardGoods) error { serialNumbers := make([]string, 0, len(cards)) for i, _ := range cards { serialNumbers = append(serialNumbers, cards[i].SerialNumber) } var goodsList []GameCardGoods err := NewGameCardGoodsQuerySet(DB).SerialNumberIn(serialNumbers...).All(&goodsList) if err != nil && err != RecordNotFound { logger.Error("err:", err) return err } goodsMap := make(map[string]int, 0) for i, _ := range goodsList { goodsMap[goodsList[i].SerialNumber] = i } for i, _ := range cards { _, ok := goodsMap[cards[i].SerialNumber] if !ok { begin := DB.Begin() // 入库 公共添加数据 cards[i].StockTime = time.Now() cards[i].FunctionState = 2 err = begin.Create(&cards[i]).Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } stock := GameCardGoodsStock{StoreId: cards[i].StoreId, GameCardId: cards[i].GameCardId} err = stock.Add(begin) if err != nil { begin.Rollback() logger.Error("err:", err) continue } if cards[i].CardType == GameCardGoodsTypeShare { userShareCard := &UserShareCard{ Uid: cards[i].UserShareCardBill.Uid, SerialNumber: cards[i].SerialNumber, BillSn: cards[i].UserShareCardBill.BillSn, GameCardId: uint32(cards[i].GameCardId), State: ShareCardStateSharing, GameCardGoodsId: cards[i].ID, UserShareCardBillId: cards[i].UserShareCardBill.ID, ShareCardBillGameId: 0, StoreId: uint32(cards[i].StoreId), ProfitState: 1, } if cards[i].CardType == GameCardGoodsTypeShare { userShareCard.AllotSerialNumber = userShareCard.SerialNumber userShareCard.AllotCardGoodsId = userShareCard.GameCardGoodsId } err = begin.Create(userShareCard).Error if err != nil { begin.Rollback() logger.Error("err:", err) return err } } err := begin.Commit().Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } } } return nil } type CooperativeRentCardOrderListReq struct { AssistantUid uint32 `json:"assistant_uid"` Uid uint64 `json:"uid" ` OrderId uint64 `json:"order_id"` GameCardId uint64 `json:"game_card_id"` StoreId uint64 `json:"store_id" ` // 门店id 游戏id CardStatus uint8 `json:"card_status"` // 1-待取货中 2-游玩中 3-归还中 4-已完成 PayStatus uint8 `json:"pay_status"` // DeliveryType uint8 `json:"delivery_type"` // SerialNumber string `json:"serial_number" ` // 编号 PickupCode string `json:"pickup_code"` // 取货码 StartTime time.Time `json:"start_time"` // 开始时间 EndTime time.Time `json:"end_time"` // 结束时间 PageNum int `json:"page_num"` PageSize int `json:"page_size"` } func (m *CooperativeRentCardOrderListReq) List() ([]Order, int, error) { var orderCards []OrderCard orders := make([]Order, 0) if m.PageSize == 0 { m.PageSize = 10 } assistant := GetUserByUid(m.AssistantUid) if m.SerialNumber == "" { m.StoreId = assistant.StoreId } if assistant.UserType != 2 { return orders, 0, errors.New("not assistant") } qs := NewOrderQuerySet(DB).PayStatusEq(2) isDeliver := true if m.SerialNumber != "" { isDeliver = false err := NewOrderCardQuerySet(DB).SerialNumberEq(m.SerialNumber).OrderDescByID().OrderAscByCardStatus().All(&orderCards) if err != nil { logger.Error("err:", err) return orders, 0, err } orderIds := make([]uint32, 0) for i, _ := range orderCards { orderIds = append(orderIds, orderCards[i].OrderId) } qs = qs.IDIn(orderIds...) //qs = qs.Where("id in (?)", orderIds) } if m.PickupCode != "" { isDeliver = false //qs = qs.Where("pickup_code", m.PickupCode) qs = qs.PickupCodeEq(m.PickupCode) } if m.PayStatus != 0 { //qs = qs.Where("pay_status", m.PayStatus) qs = qs.PayStatusEq(m.PayStatus) } if m.DeliveryType != 0 { //qs = qs.Where("delivery_type", m.DeliveryType) qs = qs.DeliveryTypeEq(m.DeliveryType) } if m.OrderId != 0 { isDeliver = false //qs = qs.Where("id", m.OrderId) qs = qs.IDEq(uint32(m.OrderId)) } if isDeliver { } if m.Uid != 0 { qs = qs.UidEq(m.Uid) } if m.GameCardId != 0 { qs = qs.GameCardIdEq(m.GameCardId) } if m.CardStatus != 0 { qs = qs.CardStatusEq(m.CardStatus) } if !m.StartTime.IsZero() { qs = qs.CreatedAtGte(m.StartTime) } if !m.EndTime.IsZero() { qs = qs.CreatedAtLte(m.EndTime) } if m.StoreId != 0 { qs = qs.StoreIdEq(m.StoreId) } count, err := qs.Count() if err != nil { logger.Errorf("err:%#v", err) return orders, 0, err } pageSize := m.PageSize page := m.PageNum - 1 if page < 0 { page = 0 } if m.PageSize == 0 { m.PageSize = 10 } err = qs.OrderDescByID().Offset(page * pageSize).Limit(m.PageSize).All(&orders) if err != nil { logger.Errorf("err:%#v", err) return orders, 0, err } ids := make([]uint32, 0, len(orders)) for i, _ := range orders { ids = append(ids, uint32(orders[i].ID)) } if len(ids) == 0 { logger.Error("gameIds is nil") return orders, 0, err } err = NewOrderCardQuerySet(DB).OrderIdIn(ids...).All(&orderCards) if err != nil { logger.Error("err:", err) return orders, 0, err } orderCards = OrderCardListSetGameInfo(orderCards) orderCardsMap := make(map[uint32][]OrderCard, 0) for i, _ := range orderCards { orderCardsMap[orderCards[i].OrderId] = append(orderCardsMap[orderCards[i].OrderId], orderCards[i]) } for i, _ := range orders { if orders[i].CardStatus == 2 || orders[i].CardStatus == 3 { orders[i].CardStatus = 4 } v, ok := orderCardsMap[orders[i].ID] if ok { orders[i].OrderCards = v } } return orders, count, nil } type GameCardGoodsStockAnalysisReq struct { Name string `json:"name"` SortType uint32 `json:"sort_type"` // 1-总库存 2-库存 3-用户持有 4-订单数量 SortDirection uint32 `json:"sort_direction"` // 1-升序 2-降序 CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id StoreId uint32 `json:"store_id"` PageNum int `json:"page_num"` PageSize int `json:"page_size"` } type GameCardGoodsStockAnalysisResp struct { List []GameCardGoodsStock `json:"list"` Count uint32 `json:"count"` PageIndex int `json:"page_index"` CardTotalCount int `json:"card_total_count"` CardTotalStock int `json:"card_total_stock"` CardHoldCount int `json:"card_hold_count"` } func (m *GameCardGoodsStockAnalysisReq) GameCardStockListAnalysis() (*GameCardGoodsStockAnalysisResp, error) { resp := &GameCardGoodsStockAnalysisResp{PageIndex: m.PageNum} type GameCardCount struct { CountGame uint32 `json:"count_game"` } var gameCardCount GameCardCount var goodsStocks []GameCardGoodsStock sqlOrder := "" switch m.SortType { case 1: sqlOrder = fmt.Sprintf(" ORDER BY total_stock ") case 2: sqlOrder = fmt.Sprintf(" ORDER BY rent_stock ") case 3: sqlOrder = fmt.Sprintf(" ORDER BY user_hold_stock ") case 4: sqlOrder = fmt.Sprintf(" ORDER BY order_count ") } if m.SortDirection == 1 { sqlOrder += " DESC" } else if m.SortDirection == 2 { sqlOrder += " ASC" } sqlStore := fmt.Sprintf(" AND cooperative_business_id = %d", m.CooperativeBusinessId) if m.StoreId != 0 { sqlStore = fmt.Sprintf(" AND store_id = %d", m.StoreId) } if m.Name != "" { var gameCards []GameCard sqlName := "SELECT * FROM game_card WHERE `name` LIKE '%" + m.Name + "%';" err := DB.Raw(sqlName).Scan(&gameCards).Error //err := orm.Eloquent.Exec(sqlName).Find(&gameCards).Error if err != nil { return resp, err } //fmt.Println("--sqlName:", sqlName) gameIds := make([]string, 0) for i, _ := range gameCards { gameIds = append(gameIds, fmt.Sprintf("%d", gameCards[i].ID)) } //fmt.Println("--gameIds:", gameIds) sqlStore += fmt.Sprintf(" AND game_card_id IN (%s)", strings.Join(gameIds, ",")) } //var countGame int64 sqlCount := fmt.Sprintf("SELECT COUNT(*) AS count_game FROM (SELECT SUM(total_stock) AS total_stock,SUM(order_count) AS order_count,SUM(user_hold_stock) AS user_hold_stock,SUM(rent_stock) AS rent_stock FROM game_card_goods_stock WHERE 1 %s GROUP BY game_card_id) a ;", sqlStore) fmt.Println("sqlCount:", sqlCount) err := DB.Raw(sqlCount).Scan(&gameCardCount).Error if err != nil { logger.Error("sqlCount err:", err) return resp, err } fmt.Println("countGame:", gameCardCount.CountGame) resp.Count = gameCardCount.CountGame page := int(m.PageNum) - 1 if page < 0 { page = 0 } if m.PageSize == 0 { m.PageSize = 10 } sql := fmt.Sprintf( "SELECT * FROM (SELECT SUM(total_stock) AS total_stock,SUM(order_count) AS order_count,SUM(user_hold_stock) AS user_hold_stock,SUM(rent_stock) AS rent_stock,game_card_id FROM game_card_goods_stock WHERE 1 %s GROUP BY game_card_id) a %s LIMIT %d,%d;", sqlStore, sqlOrder, page*m.PageSize, m.PageSize) fmt.Println("sql:", sql) err = DB.Raw(sql).Scan(&goodsStocks).Error if err != nil { logger.Error("err:", err) return resp, err } if len(goodsStocks) == 0 { return resp, nil } gameIds := make([]uint32, 0, len(goodsStocks)) for i, _ := range goodsStocks { gameIds = append(gameIds, uint32(goodsStocks[i].GameCardId)) } fmt.Println("gameIds:", gameIds) var games []GameCard err = NewGameCardQuerySet(DB).IDIn(gameIds...).All(&games) //err = orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Find(&games).Error if err != nil { logger.Error("err:", err) return resp, err } gameMap := make(map[uint32]GameCard, 0) for i, _ := range games { gameMap[games[i].ID] = games[i] } fmt.Println("games:", games) for i, _ := range goodsStocks { game, ok := gameMap[uint32(goodsStocks[i].GameCardId)] if ok { goodsStocks[i].Name = game.Name goodsStocks[i].CoverImg = game.CoverImg } } resp.List = goodsStocks holdQs := NewGameCardGoodsQuerySet(DB).StatusEq(GameCardGoodsStatusCustomerHold) //holdQs := orm.Eloquent.Table("game_card_goods").Where("status", GameCardGoodsStatusCustomerHold) if m.StoreId != 0 { holdQs = holdQs.StoreIdEq(uint64(m.StoreId)) } cardHoldCount, err := holdQs.Count() if err != nil { logger.Error("hold count err:", err) return resp, err } resp.CardHoldCount = int(cardHoldCount) var ( rentStock uint32 totalCount int cardStocks []GameCardGoodsStock ) if m.StoreId != 0 { err = NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(m.StoreId)).All(&cardStocks) } else { err = NewGameCardGoodsStockQuerySet(DB).All(&cardStocks) } if err != nil { logger.Error("err:", err) return resp, err } for i, _ := range cardStocks { rentStock += cardStocks[i].RentStock } //var game GameCardGoods if m.StoreId != 0 { totalCount, err = NewGameCardGoodsQuerySet(DB).StoreIdEq(uint64(m.StoreId)).StatusIn([]uint32{1, 2, 3, 4}...).Count() } else { totalCount, err = NewGameCardGoodsQuerySet(DB).StatusIn([]uint32{1, 2, 3, 4}...).Count() } if err != nil { logger.Error("total count err:", err) return resp, err } resp.CardTotalStock = int(rentStock) resp.CardTotalCount = int(totalCount) return resp, nil } func CannibalizeTaskImportGoods(taskId uint32, serials []string) (uint32, error) { if taskId == 0 || len(serials) == 0 { return 0, errors.New("para err") } var cannibalizeTask CannibalizeStockTask err := NewCannibalizeStockTaskQuerySet(DB).IDEq(taskId).One(&cannibalizeTask) //err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error if err != nil { logger.Error("cannibalize task err:", err) return 0, err } if cannibalizeTask.Status != CannibalizeTaskStatusNotImportGoods && cannibalizeTask.Status != CannibalizeTaskStatusNotDeliverGoods { logger.Error("cannibalize status err:", err) return 0, err } var cannibalizeGoodses []CannibalizeGameCardGoods err = NewCannibalizeGameCardGoodsQuerySet(DB).CannibalizeStockTaskIdEq(taskId).All(&cannibalizeGoodses) if err != nil && err != RecordNotFound { logger.Error("cannibalize goods err:", err) return 0, err } impotentSerialMap := make(map[string]uint32, 0) if len(cannibalizeGoodses) > 0 { for i, _ := range cannibalizeGoodses { impotentSerialMap[cannibalizeGoodses[i].SerialNumber] = cannibalizeGoodses[i].GameCardId } } serialNumberSql := "" for i, _ := range serials { serialNumberSql += "'" + serials[i] + "'," } serialNumberSql = serialNumberSql[:len(serialNumberSql)-1] // 这些卡已在调拨任务中 var cannibalizeInGoodses []CannibalizeGameCardGoods sql := fmt.Sprintf( "SELECT cannibalize_game_card_goods.* FROM cannibalize_game_card_goods LEFT JOIN cannibalize_stock_task ON cannibalize_stock_task.id = cannibalize_game_card_goods.cannibalize_stock_task_id WHERE serial_number IN (%s) AND cannibalize_stock_task.status IN (1,2,3) ;", serialNumberSql) err = DB.Raw(sql).Scan(&cannibalizeInGoodses).Error if err != nil { logger.Error("cannibalize in goods err:", err) return 0, err } cannibalizeInGoodsMap := make(map[string]uint32, 0) if len(cannibalizeInGoodses) > 0 { for i, _ := range cannibalizeInGoodses { cannibalizeInGoodsMap[cannibalizeInGoodses[i].SerialNumber] = cannibalizeInGoodses[i].GameCardId } } list := make([]GameCardGoods, 0) err = DB.Table("game_card_goods").Where("serial_number in (?)", serials).Find(&list).Error if err != nil { logger.Error("err:", err) return 0, err } unImpotentCount := 0 impotentCount := 0 begin := DB.Begin() for i, _ := range list { if list[i].Status != 1 { unImpotentCount++ //fmt.Println("1", list[i].Status) continue } _, ok := impotentSerialMap[list[i].SerialNumber] if ok { unImpotentCount++ //fmt.Println("2", list[i].SerialNumber) continue } if uint32(list[i].StoreId) != cannibalizeTask.FromStoreId { //fmt.Println("3", list[i].StoreId) continue } _, ok2 := cannibalizeInGoodsMap[list[i].SerialNumber] if ok2 { unImpotentCount++ //fmt.Println("4", list[i].SerialNumber) continue } cardGoods := &CannibalizeGameCardGoods{ CannibalizeStockTaskId: taskId, GameCardId: uint32(list[i].GameCardId), SerialNumber: list[i].SerialNumber, } err := begin.Create(cardGoods).Error if err != nil { begin.Rollback() logger.Error("err:", err) unImpotentCount++ continue } impotentCount++ } if cannibalizeTask.Status == CannibalizeTaskStatusNotImportGoods && impotentCount > 0 { sql := fmt.Sprintf("UPDATE cannibalize_stock_task SET status = 2 WHERE id = %d", taskId) err = begin.Exec(sql).Error if err != nil { begin.Rollback() logger.Errorf("update status err:%s", err.Error()) } } err = begin.Commit().Error if err != nil { begin.Rollback() logger.Error("commit err:", err) } return uint32(unImpotentCount), nil } func CannibalizeDeliverGoods(taskId uint32) error { var cannibalizeTask CannibalizeStockTask err := NewCannibalizeStockTaskQuerySet(DB).IDEq(taskId).One(&cannibalizeTask) //err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error if err != nil { logger.Error("cannibalize task err:", err) return err } if cannibalizeTask.Status != CannibalizeTaskStatusNotDeliverGoods { return errors.New("cannibalize task status err") } var cannibalizeGoodses []CannibalizeGameCardGoods err = NewCannibalizeGameCardGoodsQuerySet(DB).CannibalizeStockTaskIdEq(taskId).All(&cannibalizeGoodses) //err = orm.Eloquent.Table("cannibalize_game_card_goods").Where("cannibalize_stock_task_id = ?", taskId).Find(&cannibalizeGoodses).Error if err != nil && err != RecordNotFound { logger.Error("cannibalize goods err:", err) return err } serials := make([]string, 0, len(cannibalizeGoodses)) serialMap := make(map[string]int, 0) for i, _ := range cannibalizeGoodses { serials = append(serials, cannibalizeGoodses[i].SerialNumber) serialMap[cannibalizeGoodses[i].SerialNumber] = i } list := make([]GameCardGoods, 0) //err = orm.Eloquent.Table("game_card_goods").Where("serial_number in (?)", serials).Find(&list).Error err = NewGameCardGoodsQuerySet(DB).SerialNumberIn(serials...).All(&list) if err != nil { logger.Error("err:", err) return err } for i, _ := range list { if list[i].Status != 1 { err = NewCannibalizeGameCardGoodsQuerySet(DB).SerialNumberEq(list[i].SerialNumber).Delete() //err = orm.Eloquent.Unscoped().Table("cannibalize_game_card_goods").Where("serial_number", list[i].SerialNumber).Delete(&CannibalizeGameCardGoods{}).Error if err != nil { logger.Error("delete card goods err:", err) } continue } begin := DB.Begin() sqlStatus := fmt.Sprintf("UPDATE game_card_goods SET status = 4 WHERE id = %d;", list[i].ID) err = begin.Exec(sqlStatus).Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } //sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock-1,store_stock=store_stock-1,total_stock=total_stock-1 WHERE store_id=%d AND game_card_id=%d;", list[i].StoreId, list[i].GameCardId) sql := fmt.Sprintf( "UPDATE game_card_goods_stock SET rent_stock= rent_stock-1,total_stock=total_stock-1 WHERE store_id=%d AND game_card_id=%d;", list[i].StoreId, list[i].GameCardId) fmt.Println("sql:", sql) err = begin.Exec(sql).Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } err = begin.Commit().Error if err != nil { begin.Rollback() logger.Error("commit err:", err) continue } delete(serialMap, list[i].SerialNumber) } // 没有更新库存的卡 if len(serialMap) > 0 { for k, _ := range serialMap { //fmt.Println("--------k", k) err = NewCannibalizeGameCardGoodsQuerySet(DB).SerialNumberEq(k).Delete() //err = orm.Eloquent.Unscoped().Table("cannibalize_game_card_goods").Where("serial_number=?", k).Delete(&CannibalizeGameCardGoods{}).Error if err != nil { logger.Error("delete card goods err:", err) } } } if cannibalizeTask.Status == CannibalizeTaskStatusNotDeliverGoods { sql := fmt.Sprintf("UPDATE cannibalize_stock_task SET status = 3,delivery_time=? WHERE id = %d", taskId) err = DB.Exec(sql, time.Now()).Error if err != nil { logger.Errorf("update status err:%s", err.Error()) } } return nil } func CannibalizePutInStorage(taskId uint32) error { var cannibalizeTask CannibalizeStockTask err := NewCannibalizeStockTaskQuerySet(DB).IDEq(taskId).One(&cannibalizeTask) //err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error if err != nil { logger.Error("cannibalize task err:", err) return err } if cannibalizeTask.Status != CannibalizeTaskStatusDeliveredGoods { return errors.New("cannibalize task status err") } var cannibalizeGoodses []CannibalizeGameCardGoods err = NewCannibalizeGameCardGoodsQuerySet(DB).CannibalizeStockTaskIdEq(taskId).All(&cannibalizeGoodses) //err = orm.Eloquent.Table("cannibalize_game_card_goods").Where("cannibalize_stock_task_id = ?", taskId). // Find(&cannibalizeGoodses).Error if err != nil && err != RecordNotFound { logger.Error("cannibalize goods err:", err) return err } serials := make([]string, 0, len(cannibalizeGoodses)) for i, _ := range cannibalizeGoodses { serials = append(serials, cannibalizeGoodses[i].SerialNumber) } list := make([]GameCardGoods, 0) err = NewGameCardGoodsQuerySet(DB).SerialNumberIn(serials...).All(&list) //err = orm.Eloquent.Table("game_card_goods").Where("serial_number in (?)", serials).Find(&list).Error if err != nil { logger.Error("err:", err) return err } for i, _ := range list { if list[i].Status != 4 { continue } //if CannibalizeUserShareCardRetrieve(cannibalizeTask.ToStoreId, list[i]) { // continue //} //var count int64 count, err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(cannibalizeTask.ToStoreId)). GameCardIdEq(list[i].GameCardId).Count() //err = orm.Eloquent.Table("game_card_goods_stock").Where("store_id = ?", cannibalizeTask.ToStoreId). // Where("game_card_id = ?", list[i].GameCardId).Count(&count).Error if err != nil { logger.Error("err:", err) continue } begin := DB.Begin() sqlStatus := fmt.Sprintf("UPDATE game_card_goods SET status = 1,store_id=%d,stock_time='%s' WHERE id = %d;", cannibalizeTask.ToStoreId, time.Now().Format(TimeFormat), list[i].ID) err = begin.Exec(sqlStatus).Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } if count > 0 { sql := fmt.Sprintf( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1,store_stock=store_stock+1,total_stock=total_stock+1 WHERE store_id=%d AND game_card_id=%d;", cannibalizeTask.ToStoreId, list[i].GameCardId) fmt.Println("sql:", sql) err = begin.Exec(sql).Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } } else { cardGoodsStock := &GameCardGoodsStock{ StoreId: uint64(cannibalizeTask.ToStoreId), GameCardId: list[i].GameCardId, StoreStock: 1, RentStock: 1, UserHoldStock: 0, OrderCount: 0, TotalStock: 1, } err := begin.Create(cardGoodsStock).Error if err != nil { begin.Rollback() logger.Error("err:", err) continue } } err = begin.Commit().Error if err != nil { begin.Rollback() logger.Error("commit err:", err) continue } } if cannibalizeTask.Status == CannibalizeTaskStatusDeliveredGoods { sql := fmt.Sprintf("UPDATE cannibalize_stock_task SET status = 4,in_storage_time=? WHERE id = %d", taskId) err = DB.Exec(sql, time.Now()).Error if err != nil { logger.Errorf("update status err:%s", err.Error()) } } return nil } type CannibalizeTaskListReq struct { PageNum int `json:"page_num"` PageSize int `json:"page_size"` CannibalizeDirection uint32 `json:"cannibalize_direction"` // 1-调入 2-调出 StoreId uint32 `json:"store_id" ` // 门店id Status uint8 `json:"status"` } type CannibalizeTaskListResp struct { PageSize int `json:"page_size"` List []CannibalizeStockTask `json:"list"` Count int `json:"count"` PageNum int `json:"page_num"` TotalPage int `json:"total_page"` } func (m *CannibalizeTaskListReq) GetCannibalizeTaskList() (*CannibalizeTaskListResp, error) { resp := &CannibalizeTaskListResp{ PageNum: m.PageNum, PageSize: m.PageSize, } qs := DB.Table("cannibalize_stock_task") //if m.StoreId != 0 { // qs = qs.Where("from_store_id = ?", m.StoreId).Or("to_store_id = ?", m.StoreId) //} if m.Status != 0 { qs = qs.Where("status = ?", m.Status) } if m.CannibalizeDirection != 0 { if m.CannibalizeDirection == 1 { qs = qs.Where("to_store_id=?", m.StoreId) } else if m.CannibalizeDirection == 2 { qs = qs.Where("from_store_id=?", m.StoreId) } } page := m.PageNum - 1 if page < 0 { page = 0 } if m.PageSize == 0 { m.PageSize = 10 } var ( count int64 tasks []CannibalizeStockTask ) err := qs.Count(&count).Offset(page * m.PageSize).Limit(m.PageSize).Order("id DESC").Find(&tasks).Error if err != nil && err != RecordNotFound { logger.Error("err:", err) return resp, err } resp.Count = int(count) resp.List = CannibalizeStockTaskListSetInfo(tasks) return resp, nil } type CannibalizeTaskGameCardGoodsListReq struct { PageNum int `json:"page_num"` PageSize int `json:"page_size"` CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"` } type CannibalizeTaskGameCardGoodsListResp struct { PageSize int `json:"pageSize"` List []CannibalizeGameCardGoods `json:"list"` Count int `json:"count"` PageNum int `json:"page_num"` TotalPage int `json:"total_page"` } func (m *CannibalizeTaskGameCardGoodsListReq) GetCannibalizeTaskGameCardGoodsList() (*CannibalizeTaskGameCardGoodsListResp, error) { resp := &CannibalizeTaskGameCardGoodsListResp{ PageNum: m.PageNum, PageSize: m.PageSize, } qs := DB.Table("cannibalize_game_card_goods").Where("cannibalize_stock_task_id = ?", m.CannibalizeStockTaskId) page := m.PageNum - 1 if page < 0 { page = 0 } if m.PageSize == 0 { m.PageSize = 10 } var ( count int64 cannibalizeGoodses []CannibalizeGameCardGoods ) //CannibalizeGameCardGoods int `json:"cannibalize_game_card_goods" gorm:"-"` err := qs.Count(&count).Offset(page * m.PageSize).Limit(m.PageSize).Order("id DESC").Find(&cannibalizeGoodses).Error if err != nil && err != RecordNotFound { logger.Error("err:", err) return resp, err } resp.Count = int(count) resp.List = CannibalizeGameCardGoodsSetInfo(cannibalizeGoodses) return resp, nil } func CannibalizeTaskDel(taskId uint32) error { var cannibalizeTask CannibalizeStockTask err := DB.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error if err != nil { logger.Error("cannibalize task err:", err) return err } if cannibalizeTask.Status != CannibalizeTaskStatusNotImportGoods && cannibalizeTask.Status != CannibalizeTaskStatusNotDeliverGoods { return errors.New("status err") } sql := fmt.Sprintf("UPDATE cannibalize_stock_task SET status = 5 WHERE id = %d", taskId) err = DB.Exec(sql).Error if err != nil { logger.Error("update status err:", err) } return nil } type CooperativeGameCardGoodsListReq struct { PageNum int `json:"page_num"` PageSize int `json:"page_size"` StoreId uint32 `json:"store_id"` Status int `json:"status"` GameCardId int `json:"game_card_id"` SerialNumber string `json:"serial_number" ` // 编号 AssistantUid uint32 `json:"assistant_uid"` } type CooperativeGameCardGoodsListResp struct { List []GameCardGoods `json:"list"` Count int `json:"count"` PageNum int `json:"page_num"` TotalPage int `json:"total_page"` } func (m *CooperativeGameCardGoodsListReq) List() (*CooperativeGameCardGoodsListResp, error) { var ( cardGoods = make([]GameCardGoods, 0) totalPage uint32 ) resp := &CooperativeGameCardGoodsListResp{List: cardGoods, PageNum: m.PageNum} m.PageNum -= 1 if m.PageNum < 0 { m.PageNum = 0 } if m.PageSize == 0 { m.PageSize = 10 } assistant := GetUserByUid(m.AssistantUid) m.StoreId = uint32(assistant.StoreId) fmt.Println("GetGameCardGoodsListReq:", m) gdb := DB.Table("game_card_goods") if m.Status != 0 { gdb = gdb.Where("status=?", m.Status) } if m.StoreId != 0 { gdb = gdb.Where("store_id=?", m.StoreId) } if m.GameCardId != 0 { gdb = gdb.Where("game_card_id=?", m.GameCardId) } if m.SerialNumber != "" { gdb = gdb.Where("serial_number=?", m.SerialNumber) } var count int64 err := gdb.Count(&count).Error if err != nil { logger.Error("err:", err) return resp, err } resp.Count = int(count) err = gdb.Order("created_at DESC").Offset(m.PageNum * m.PageSize).Limit(m.PageSize).Find(&cardGoods).Error if err != nil && err != RecordNotFound { logger.Error("err:", err) return resp, err } if len(cardGoods) > 0 { //storeIds := make([]uint32, 0) gameCardIds := make([]uint32, 0) for i, _ := range cardGoods { //storeIds = append(storeIds, uint32(cardGoods[i].StoreId)) gameCardIds = append(gameCardIds, uint32(cardGoods[i].GameCardId)) } cardMap, err := GameCardMap(gameCardIds) if err != nil { logger.Error("game card map err:", err) return resp, err } //storeMap := GetStoreMapByIds(storeIds) for i, _ := range cardGoods { gameCard, ok1 := cardMap[uint32(cardGoods[i].GameCardId)] if ok1 { cardGoods[i].GameCard = &gameCard } } } totalPage = uint32(int(count)/m.PageSize + 1) resp.TotalPage = int(totalPage) resp.List = cardGoods return resp, nil } type AssistantMemberPromotionReq struct { PageNum int `json:"page_num"` PageSize int `json:"page_size"` Date string `json:"date"` StoreId uint32 `json:"store_id"` AssistantUid uint32 `json:"assistant_uid"` Assistant *User `json:"assistant"` } func (m *AssistantMemberPromotionReq) List() ([]InviteMemberReport, int, error) { var reports []InviteMemberReport m.PageNum -= 1 if m.PageNum < 0 { m.PageNum = 0 } if m.PageSize == 0 { m.PageSize = 10 } m.StoreId = uint32(m.Assistant.StoreId) qs := NewInviteMemberReportQuerySet(DB).CooperativeBusinessIdEq(m.Assistant.CooperativeBusinessId). StoreIdEq(m.StoreId) if m.Date != "" { qs = qs.DateEq(m.Date) } count, err := qs.Count() if err != nil { logger.Error("err:", err) return reports, 0, err } totalPage := int(count)/m.PageSize + 1 err = qs.OrderDescByID().Offset(m.PageNum * m.PageSize).Limit(m.PageSize).All(&reports) if err != nil && err != RecordNotFound { logger.Error("err:", err) return reports, totalPage, err } reports = InviteMemberReportListSetUser(reports) return reports, totalPage, nil } func InviteMemberReportListSetUser(list []InviteMemberReport) []InviteMemberReport { uids := make([]uint32, 0, len(list)) for i, _ := range list { uids = append(uids, list[i].Uid) } userMap, err := GetUserMap(uids) if err != nil { logger.Error("user map err:", err) return list } for i, _ := range list { v, ok := userMap[list[i].Uid] if ok { list[i].User = v } } return list }