mh_server/model/store.go
2022-04-02 16:40:19 +08:00

167 lines
4.5 KiB
Go

package model
import (
"fmt"
"github.com/codinl/go-logger"
"golang.org/x/sync/errgroup"
)
//go:generate goqueryset -in store.go
// gen:qs
type Store struct {
Model
Name string `json:"name"` // 门店名称
Img string `json:"img"` // 门面图
Tel string `json:"tel" gorm:"type:varchar(20)"` // 电话
Province string `json:"province" gorm:"type:varchar(100)"` // 省
City string `json:"city" gorm:"type:varchar(100)"` // 市
District string `json:"district" gorm:"type:varchar(100)"` // 区
Address string `json:"address" gorm:"type:varchar(100)"` // 详细地址
Longitude float64 `json:"longitude" gorm:"column:longitude"` // 经度
Latitude float64 `json:"latitude" gorm:"column:latitude"` // 纬度
IsOnline uint32 `json:"is_online"`
}
func (*Store) TableName() string {
return "store"
}
type GameCardStock struct {
Store
Stock uint32 `json:"stock"`
}
func GetStoreList(cardInfos []CardInfo) ([]GameCardStock, error) {
var eg errgroup.Group
stores := make([]Store, 0)
stocks := make([]GameCardGoodsStock, 0)
list := make([]GameCardStock, 0)
storesCh := make(chan *[]Store, 0)
eg.Go(func() error {
gameStore := make([]Store, 0)
err := NewStoreQuerySet(DB).IsOnlineEq(1).OrderDescByCreatedAt().All(&gameStore)
if err != nil && err != RecordNotFound {
logger.Errorf("err:%+v", err)
return err
}
storesCh <- &gameStore
return nil
})
if len(cardInfos) == 0 {
stores = *<-storesCh
fmt.Println("stores:", stores)
for i, _ := range stores {
cardStock := GameCardStock{
Store: stores[i],
Stock: 0,
}
list = append(list, cardStock)
}
return list, nil
}
gameIds := make([]uint64, 0)
cardInfoMap := make(map[uint64]uint32, 0)
for i, _ := range cardInfos {
gameIds = append(gameIds, uint64(cardInfos[i].GameCardId))
cardInfoMap[uint64(cardInfos[i].GameCardId)] = cardInfos[i].Count
}
eg.Go(func() error {
//err := NewGameCardGoodsStockQuerySet(DB).GameCardIdEq(gameId).RentStockGt(0).All(&stocks)
err := NewGameCardGoodsStockQuerySet(DB).GameCardIdIn(gameIds...).RentStockGt(0).All(&stocks)
if err != nil {
logger.Errorf("err:%+v", err)
return err
}
return nil
})
stores = *<-storesCh
err := eg.Wait()
if err != nil {
logger.Errorf("err:%+v", err)
return list, err
}
//stockMap := make(map[uint64]uint32)
//for i, _ := range stocks {
// count, ok := cardInfoMap[uint64(stocks[i].GameCardId)]
// if ok && count <= stocks[i].RentStock {
// stockMap[stocks[i].StoreId] = stocks[i].RentStock
// }
//}
storeStockMap := make(map[uint64]map[uint64]uint32, 0)
for i, _ := range stocks {
//count, ok := cardInfoMap[uint64(stocks[i].GameCardId)]
//if ok && count <= stocks[i].RentStock {
// stockMap[stocks[i].StoreId] = stocks[i].RentStock
//}
stockMap, ok := storeStockMap[stocks[i].StoreId]
if !ok {
stockMap = make(map[uint64]uint32, 0)
}
stockMap[stocks[i].GameCardId] = stocks[i].RentStock
storeStockMap[stocks[i].StoreId] = stockMap
}
for i, _ := range stores {
stockMap, ok := storeStockMap[uint64(stores[i].ID)]
if ok && IsStoreStockEnough(cardInfos, stockMap) {
cardStock := GameCardStock{
Store: stores[i],
Stock: 0,
}
list = append(list, cardStock)
}
//if ok {
// cardStock := GameCardStock{
// Store: stores[i],
// Stock: rentStock,
// }
// list = append(list, cardStock)
//}
}
fmt.Println("list:", list)
return list, nil
}
func (m *Store) Info() error {
err := NewStoreQuerySet(DB).IDEq(m.ID).One(m)
if err != nil {
logger.Error("err:", err)
return err
}
return nil
}
type CannibalizeStockTask struct {
Model
FromStoreId uint32 `json:"from_store_id"`
ToStoreId uint32 `json:"to_store_id"`
TaskId uint32 `json:"task_id"`
GameCardId uint32 `json:"game_card_id"` // 游戏卡id
Count uint32 `json:"count"`
Status uint8 `json:"status"` // 1-待填调拨卡 2-待发货 3-已发货 4-已入库
}
type CannibalizeGameCardGoods struct {
Model
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
GameCardId uint32 `json:"game_card_id"` // 游戏卡id
SerialNumber string `json:"serial_number" gorm:"index"` // 编号
}
func IsStoreStockEnough(cardInfos []CardInfo, gameStockMap map[uint64]uint32) bool {
//haveStock =
for i, _ := range cardInfos {
stock, ok := gameStockMap[uint64(cardInfos[i].GameCardId)]
if !ok || stock < cardInfos[i].Count {
return false
}
}
return true
}