mh_goadmin_server/app/admin/models/game_card.go
2023-10-18 10:17:05 +08:00

3246 lines
95 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"encoding/json"
"errors"
"fmt"
"github.com/xuri/excelize/v2"
orm "go-admin/common/global"
"go-admin/logger"
"gorm.io/gorm"
"strings"
"time"
)
type GameCard struct {
Model
Name string `json:"name" gorm:"column:name;index"` // 名称
Price uint32 `json:"price" gorm:"column:price;index"` // 价格
CoverImg string `json:"coverImg" gorm:"column:cover_img"` // 封面
OrderCount uint32 `json:"orderCount" gorm:"column:order_count;index"` // 订单数
NewProducts uint8 `json:"newProducts"` // 新品: 1-新品 2-非新品
Status uint8 `json:"status"` // 状态: 1-上架 2-下架
GameTypeId uint32 `json:"gameTypeId"` // 游戏类型id
GoodsGalleryUrl string `json:"goodsGalleryUrl" gorm:"type:text;comment:'轮播图'"` // 轮播图
ViewCount uint32 `json:"viewCount"` // 查看人数
Playability uint32 `json:"playability"` // 耐玩度
Playfulness uint32 `json:"playfulness"` // 好玩度
GameTime uint32 `json:"gameTime"` // 游戏时间
Likes uint32 `json:"likes"` // 点赞
DetailInfo string `json:"detailInfo" gorm:"type:text;comment:'详情描述'"` // 详情描述
DetailImg string `json:"detailImg"` // 详情图片
EstimateVm uint32 `json:"estimate_vm" gorm:"-"` // 预计积分
RealPrice uint32 `json:"real_price"` // 真实价格
VideoLink string `json:"video_link"` // 链接
}
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"
}
func GetGameCardList(gameType, status, page, pageSize int, key string) ([]GameCard, uint32, uint32, error) {
var (
cards = make([]GameCard, 0)
totalPage uint32
)
page -= 1
if page < 0 {
page = 0
}
gdb := orm.Eloquent.Table("game_card").Where("id!=?", 914)
if gameType != 0 {
//gdb = gdb.Where("game_type_id", gameType)
// TODO
fmt.Println("gameType", gameType)
gameId, err := GameType{}.GetGameCardByType([]int{gameType})
if err != nil {
logger.Error(err.Error())
}
fmt.Println("gameId", gameId)
if len(gameId) > 0 {
gdb = gdb.Where("id in (?)", gameId)
} else {
}
}
if status != 0 {
gdb = gdb.Where("status", status)
}
if key != "" {
gdb = gdb.Where("name LIKE ?", "%"+key+"%")
}
var count int64
err := gdb.Count(&count).Error
if err != nil {
logger.Errorf(err.Error())
return cards, 0, 0, err
}
err = gdb.Order("created_at DESC").Offset(page * pageSize).Limit(pageSize).Find(&cards).Error
if err != nil && err != RecordNotFound {
logger.Errorf(err.Error())
return cards, 0, 0, err
}
totalPage = uint32(int(count)/pageSize + 1)
return cards, totalPage, uint32(count), nil
}
type GetGameCardGoodsListReq struct {
Page int `json:"pageIndex"`
PageSize int `json:"pageSize"`
StoreId uint32 `json:"store_id"`
Status int `json:"status"`
GameCardId int `json:"game_card_id"`
SerialNumber string `json:"serial_number" ` // 编号
}
type GetGameCardGoodsListResp struct {
List []GameCardGoods `json:"list"`
Count int `json:"count"`
PageIndex int `json:"page_index"`
TotalPage int `json:"total_page"`
}
func (m *GetGameCardGoodsListReq) GetGameCardGoodsList() (*GetGameCardGoodsListResp, error) {
var (
cardGoods = make([]GameCardGoods, 0)
totalPage uint32
)
m.Page -= 1
if m.Page < 0 {
m.Page = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
resp := &GetGameCardGoodsListResp{List: cardGoods, PageIndex: m.Page}
fmt.Println("GetGameCardGoodsListReq:", m)
gdb := orm.Eloquent.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.Errorf(err.Error())
return resp, err
}
resp.Count = int(count)
err = gdb.Order("created_at DESC").Offset(m.Page * m.PageSize).Limit(m.PageSize).Find(&cardGoods).Error
if err != nil && err != RecordNotFound {
logger.Errorf(err.Error())
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 := GetGameCardMapByIds(gameCardIds)
storeMap := GetStoreMapByIds(storeIds)
for i, _ := range cardGoods {
gameCard, ok1 := cardMap[cardGoods[i].GameCardId]
if ok1 {
cardGoods[i].GameCard = gameCard
}
store, ok2 := storeMap[cardGoods[i].StoreId]
if ok2 {
cardGoods[i].Store = store
}
}
}
totalPage = uint32(int(count)/m.PageSize + 1)
resp.TotalPage = int(totalPage)
resp.List = cardGoods
return resp, nil
}
type CooperativeGameCardGoodsReq struct {
StoreId uint32 `json:"store_id"`
CooperativeBusinessId uint32 `json:"cooperative_business_id"`
Status int `json:"status"`
GameCardId int `json:"game_card_id"`
SerialNumber string `json:"serial_number" ` // 编号
Page int `json:"pageIndex"`
PageSize int `json:"pageSize"`
}
type CooperativeGameCardGoodsResp struct {
List []GameCardGoods `json:"list"`
Count int `json:"count"`
PageIndex int `json:"page_index"`
TotalPage int `json:"total_page"`
}
func (m *CooperativeGameCardGoodsReq) List() (*CooperativeGameCardGoodsResp, error) {
var (
cardGoods = make([]GameCardGoods, 0)
totalPage uint32
)
m.Page -= 1
if m.Page < 0 {
m.Page = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
resp := &CooperativeGameCardGoodsResp{List: cardGoods, PageIndex: m.Page}
fmt.Println("GetGameCardGoodsListReq:", m)
gdb := orm.Eloquent.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)
} else {
storeIds, err := GetStoreIdsByCooperativeBusinessId(m.CooperativeBusinessId)
if err != nil {
logger.Error("get store ids err:", logger.Field("err", err))
return resp, err
}
if len(storeIds) > 0 {
gdb = gdb.Where("store_id in (?)", storeIds)
}
}
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.Errorf(err.Error())
return resp, err
}
resp.Count = int(count)
err = gdb.Order("created_at DESC").Offset(m.Page * m.PageSize).Limit(m.PageSize).Find(&cardGoods).Error
if err != nil && err != RecordNotFound {
logger.Errorf(err.Error())
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 := GetGameCardMapByIds(gameCardIds)
storeMap := GetStoreMapByIds(storeIds)
for i, _ := range cardGoods {
gameCard, ok1 := cardMap[cardGoods[i].GameCardId]
if ok1 {
cardGoods[i].GameCard = gameCard
}
store, ok2 := storeMap[cardGoods[i].StoreId]
if ok2 {
cardGoods[i].Store = store
}
}
}
totalPage = uint32(int(count)/m.PageSize + 1)
resp.TotalPage = int(totalPage)
resp.List = cardGoods
return resp, nil
}
func GetGameCardMapByIds(gameCardIds []uint32) map[uint64]*GameCard {
gameCardMap := make(map[uint64]*GameCard, 0)
if len(gameCardIds) == 0 {
return gameCardMap
}
var gameCards []GameCard
err := orm.Eloquent.Table("game_card").Where("id in (?)", gameCardIds).Find(&gameCards).Error
if err != nil {
logger.Error(err.Error())
}
if len(gameCards) == 0 {
return gameCardMap
}
for i, _ := range gameCards {
gameCardMap[uint64(gameCards[i].ID)] = &gameCards[i]
}
return gameCardMap
}
func GetStoreMapByIds(storeIds []uint32) map[uint64]*Store {
storeMap := make(map[uint64]*Store, 0)
if len(storeIds) == 0 {
return storeMap
}
var stores []Store
err := orm.Eloquent.Table("store").Where("id in (?)", storeIds).Find(&stores).Error
if err != nil {
logger.Error(err.Error())
}
if len(stores) == 0 {
return storeMap
}
for i, _ := range stores {
storeMap[uint64(stores[i].ID)] = &stores[i]
}
return storeMap
}
func StoreMapByIds(storeIds []uint32) map[uint64]Store {
storeMap := make(map[uint64]Store, 0)
if len(storeIds) == 0 {
return storeMap
}
var stores []Store
err := orm.Eloquent.Table("store").Where("id in (?)", storeIds).Find(&stores).Error
if err != nil {
logger.Error(err.Error())
}
if len(stores) == 0 {
return storeMap
}
for i, _ := range stores {
storeMap[uint64(stores[i].ID)] = stores[i]
}
return storeMap
}
func (m *GameCard) Add() error {
m.OrderCount = 0
m.ViewCount = 0
m.Likes = 0
if m.NewProducts == 0 {
m.NewProducts = 2
}
err := orm.Eloquent.Create(m).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
return nil
}
func (m *GameCard) Modify() error {
para := m.getModifyPara()
if len(para) > 0 {
err := orm.Eloquent.Table("game_card").Unscoped().Where("id", m.ID).Updates(para).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
}
return nil
}
func (m *GameCard) getModifyPara() map[string]interface{} {
paraMap := make(map[string]interface{}, 0)
if m.Name != "" {
paraMap["name"] = m.Name
}
if m.Price != 0 {
paraMap["price"] = m.Price
}
if m.CoverImg != "" {
paraMap["cover_img"] = m.CoverImg
}
if m.NewProducts != 0 {
paraMap["new_products"] = m.NewProducts
}
if m.Status != 0 {
paraMap["status"] = m.Status
}
if m.GameTypeId != 0 {
paraMap["game_type_id"] = m.GameTypeId
}
if m.GoodsGalleryUrl != "" {
paraMap["goods_gallery_url"] = m.GoodsGalleryUrl
}
if m.Playability != 0 {
paraMap["playability"] = m.Playability
}
if m.Playfulness != 0 {
paraMap["playfulness"] = m.Playfulness
}
if m.GameTime != 0 {
paraMap["game_time"] = m.GameTime
}
if m.DetailInfo != "" {
paraMap["detail_info"] = m.DetailInfo
}
if m.DetailImg != "" {
paraMap["detail_img"] = m.DetailImg
}
if m.RealPrice != 0 {
paraMap["real_price"] = m.RealPrice
}
if m.VideoLink != "" {
paraMap["video_link"] = m.VideoLink
}
return paraMap
}
func (m *GameCard) MDel(ids []uint32) error {
err := orm.Eloquent.Table(m.TableName()).Unscoped().Where("id in (?)", ids).Delete(m).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
return 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) {
var cardTypes []GameCardType
err := orm.Eloquent.Table("game_card_type").Unscoped().Order("sort ASC").Find(&cardTypes).Error
if err != nil {
logger.Errorf(err.Error())
return cardTypes, err
}
return cardTypes, nil
}
func (m *GameCardType) Modify() error {
paraMap := make(map[string]interface{}, 0)
if m.Name != "" {
paraMap["name"] = m.Name
}
if m.Sort > 0 {
paraMap["sort"] = m.Sort
}
err := orm.Eloquent.Table(m.TableName()).Unscoped().Where("id", m.ID).Updates(paraMap).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
return nil
}
func (m *GameCardType) Add() error {
err := orm.Eloquent.Create(m).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
return nil
}
func (m *GameCardType) MDel(ids []uint32) error {
gameCard := &GameCard{}
cardDb := orm.Eloquent.Table(gameCard.TableName()).Unscoped()
cardTypeIds := make([]uint32, 0)
count := int64(0)
for _, id := range ids {
err := cardDb.Where("game_type_id", id).Count(&count).Error
if err != nil {
logger.Errorf(err.Error())
continue
}
if count == 0 {
cardTypeIds = append(cardTypeIds, id)
}
}
err := orm.Eloquent.Table(m.TableName()).Unscoped().Where("id in (?)", cardTypeIds).Delete(m).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
return nil
}
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 GameCardAddType(ids []int, gameId int) error {
if len(ids) == 0 {
return nil
}
for i, _ := range ids {
gameType := &GameType{
GameCardId: uint64(gameId),
GameCardTypeId: uint64(ids[i]),
}
err := orm.Eloquent.Create(gameType).Error
if err != nil {
logger.Error(err.Error())
continue
}
}
return nil
}
func (m GameType) GetGameCardByType(ids []int) ([]int, error) {
var games []GameType
err := orm.Eloquent.Table(m.TableName()).Where("game_card_type_id in (?)", ids).Find(&games).Error
if err != nil {
logger.Error(err.Error())
return nil, err
}
gameId := make([]int, 0, len(games))
for i, _ := range games {
gameId = append(gameId, int(games[i].GameCardId))
}
return gameId, nil
}
func (m GameType) GameCardTypeModify(ids []int) error {
err := orm.Eloquent.Unscoped().Table(m.TableName()).Where("game_card_id", m.GameCardId).Delete(m).Error
if err != nil {
logger.Error(err.Error())
return err
}
err = GameCardAddType(ids, int(m.GameCardId))
if err != nil {
logger.Error(err.Error())
return err
}
return nil
}
func (m GameCard) GetGameType() ([]GameCardType, error) {
gameCardTypes := make([]GameCardType, 0)
gameTypes := make([]GameType, 0)
err := orm.Eloquent.Unscoped().Table("game_type").Where("game_card_id", m.ID).Find(&gameTypes).Error
if err != nil {
logger.Error(err.Error())
return gameCardTypes, err
}
gameCardTypeId := make([]uint32, 0)
for i, _ := range gameTypes {
gameCardTypeId = append(gameCardTypeId, uint32(gameTypes[i].GameCardTypeId))
}
err = orm.Eloquent.Unscoped().Table("game_card_type").Where("id in (?)", gameCardTypeId).Find(&gameCardTypes).Error
if err != nil {
logger.Error(err.Error())
return gameCardTypes, err
}
return gameCardTypes, nil
}
type RspAliyunStsToken struct {
AccessKeyId string `json:"accessKeyId"`
AccessKeySecret string `json:"accessKeySecret"`
SecurityToken string `json:"SecurityToken"`
BucketName string `json:"bucketName"`
Expiration uint64 `json:"expiration"`
}
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"`
Detail string `json:"detail"`
Link string `json:"link"`
}
func (*HomeCarousel) TableName() string {
return "home_carousel"
}
func (*HomeCarousel) List() ([]HomeCarousel, error) {
carousels := make([]HomeCarousel, 0)
err := orm.Eloquent.Table("home_carousel").Order("sort desc").Find(&carousels).Error
if err != nil {
logger.Error(err.Error())
return carousels, err
}
return carousels, nil
}
func (m *HomeCarousel) Add() error {
err := orm.Eloquent.Create(m).Error
if err != nil {
logger.Error(err.Error())
return err
}
return nil
}
func (m *HomeCarousel) Del() error {
err := orm.Eloquent.Table("home_carousel").Where("id", m.ID).Delete(m).Error
if err != nil {
logger.Error(err.Error())
return err
}
return nil
}
type HomeCarouselModifyReq struct {
ID uint32 `json:"id"`
Name string `json:"name" gorm:"index"` // 名称
Img string `json:"img"` // 图片
Sort uint32 `json:"sort" gorm:"index"`
IsShow uint32 `json:"is_show"`
Detail string `json:"detail"`
Link string `json:"link"`
CreateTime time.Time `json:"create_time"`
}
func (m *HomeCarouselModifyReq) Modify() error {
paraMap := make(map[string]interface{})
if m.Name != "" {
paraMap["name"] = m.Name
}
if m.Img != "" {
paraMap["img"] = m.Img
}
if m.Sort != 0 {
paraMap["sort"] = m.Sort
}
if m.IsShow != 0 {
paraMap["is_show"] = m.IsShow == 1
}
if m.Detail != "" {
paraMap["detail"] = m.Detail
}
if m.Link != "" {
paraMap["link"] = m.Link
}
paraMapJson, _ := json.Marshal(&paraMap)
fmt.Println("paraMapJson:", string(paraMapJson))
carousel := &HomeCarousel{}
carousel.ID = m.ID
err := orm.Eloquent.Table("home_carousel").Where("id", m.ID).Updates(&paraMap).Error
if err != nil {
logger.Error(err.Error())
return err
}
return 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 uint8 `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:"-"` // 游戏
//StockRemovalType string `json:"stock_removal_type"` // 出库类型: card_retrieve 收回卡 card_issue_retrieve 收回卡异常
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"`
Name string `json:"name" gorm:"-"` // 名称
CoverImg string `json:"cover_img" gorm:"-"` // 封面
}
func (*GameCardGoodsStock) TableName() string {
return "game_card_goods_stock"
}
func (m *GameCardGoodsStock) ToInfo(card *GameCard) GameCardGoodsStockInfo {
return GameCardGoodsStockInfo{
GameCardGoodsStock: *m,
GameName: card.Name,
GamePrice: card.Price,
GameCoverImg: card.CoverImg,
}
}
type GameCardGoodsStockInfo struct {
GameCardGoodsStock
GameName string `json:"name" gorm:"index"` // 名称
GamePrice uint32 `json:"price" gorm:"index"` // 价格
GameCoverImg string `json:"cover_img"` // 封面
}
type GameCardGoodsStockListReq struct {
Page int `json:"pageIndex"`
PageSize int `json:"pageSize"`
StoreId uint64 `json:"store_id" ` // 门店id
GameCardId uint64 `json:"game_card_id"` // 游戏卡id
GameCardName string `json:"game_card_name"` // 游戏卡
CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id
}
type GameCardGoodsStockListResp struct {
PageSize int `json:"pageSize"`
List []GameCardGoodsStockInfo `json:"list"`
Count int `json:"count"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
CardTotalCount int `json:"card_total_count"`
CardTotalStock int `json:"card_total_stock"`
CardHoldCount int `json:"card_hold_count"`
//"count": count,
//"list": list,
//"pageIndex": req.Page,
//"total_page": req.PageSize,
//StoreId uint64 `json:"store_id" ` // 门店id
//GameCardId uint64 `json:"game_card_id"` // 游戏卡id
//GameCardName string `json:"game_card_name"` // 游戏卡
}
func (m *GameCardGoodsStockListReq) List() (*GameCardGoodsStockListResp, error) {
resp := &GameCardGoodsStockListResp{PageIndex: m.Page, PageSize: m.PageSize}
//resp.List
resp.List = make([]GameCardGoodsStockInfo, 0)
stocks := make([]GameCardGoodsStock, 0)
qs := orm.Eloquent.Table("game_card_goods_stock").Where("store_id=?", m.StoreId)
if m.GameCardId != 0 {
qs = qs.Where("game_card_id", m.GameCardId)
}
if m.GameCardName != "" {
var cards []GameCard
err := orm.Eloquent.Table("game_card").Where("name LIKE ?", "%"+m.GameCardName+"%").Find(&cards).Error
if err != nil {
logger.Error(err.Error())
return resp, err
}
gameCardIds := make([]uint32, 0)
for i, _ := range cards {
gameCardIds = append(gameCardIds, cards[i].ID)
}
if len(gameCardIds) == 0 {
logger.Error(err.Error())
return resp, err
}
qs = qs.Where("game_card_id IN (?)", gameCardIds)
}
if m.CooperativeBusinessId != 0 {
var stores []Store
err := orm.Eloquent.Table("").Where("cooperative_business_id=?", m.CooperativeBusinessId).Find(&stores).Error
if err != nil {
logger.Error("stores err:", logger.Field("err", err))
return resp, err
}
ids := make([]uint32, 0, len(stores))
for i, _ := range stores {
ids = append(ids, stores[i].ID)
}
qs = qs.Where("store_id in (?)", ids)
}
var count int64
err := qs.Count(&count).Error
if err != nil {
logger.Error(err.Error())
return resp, err
}
resp.Count = int(count)
page := m.Page
pageSize := m.PageSize
page -= 1
if page < 0 {
page = 0
}
err = qs.Order("id DESC").Offset(page * pageSize).Limit(pageSize).Find(&stocks).Error
if err != nil {
logger.Error(err.Error())
return resp, err
}
gameIds := make([]uint32, 0, len(stocks))
for i, _ := range stocks {
gameIds = append(gameIds, uint32(stocks[i].GameCardId))
}
if len(gameIds) == 0 {
logger.Error("stockIds is nil")
return resp, nil
}
games := make([]GameCard, 0)
err = orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Find(&games).Error
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
gameMap := make(map[uint32]GameCard, 0)
for i, _ := range games {
gameMap[games[i].ID] = games[i]
}
//type UserHold struct {
// CardCount uint32 `json:"card_count"`
// StoreId uint32 `json:"store_id"`
// GameCardId uint64 `json:"game_card_id"`
//}
//userHold := make([]UserHold, 0)
//sqlHold := fmt.Sprintf("SELECT COUNT(game_card_id) AS card_count,store_id,game_card_id FROM (SELECT store_id,game_card_id FROM game_card_goods WHERE store_id=%d AND status=3 ) store GROUP BY game_card_id;", m.StoreId)
//err = orm.Eloquent.Raw(sqlHold).Scan(&userHold).Error
//if err != nil {
// logger.Errorf(err.Error())
// return resp, err
//}
userHoldMap := make(map[uint64]uint32)
totalCountMap := make(map[uint64]uint32)
//for i, _ := range userHold {
// userHoldMap[userHold[i].GameCardId] = userHold[i].CardCount
// resp.CardHoldCount += int(userHold[i].CardCount)
//}
var gameCardGoods []GameCardGoods
err = orm.Eloquent.Table("game_card_goods").Where("store_id", m.StoreId).Find(&gameCardGoods).Error
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
for i, _ := range gameCardGoods {
if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
userHoldMap[gameCardGoods[i].GameCardId] += 1
resp.CardHoldCount += 1
}
if gameCardGoods[i].Status != GameCardGoodsStatusReceivingCard && gameCardGoods[i].Status != GameCardGoodsStatusReceivedCard {
totalCountMap[gameCardGoods[i].GameCardId] += 1
}
}
for i, _ := range stocks {
game, ok := gameMap[uint32(stocks[i].GameCardId)]
if ok {
if v, ok := userHoldMap[stocks[i].GameCardId]; ok {
stocks[i].UserHoldStock = v
}
if v, ok := totalCountMap[stocks[i].GameCardId]; ok {
stocks[i].TotalStock = v
}
resp.List = append(resp.List, stocks[i].ToInfo(&game))
}
}
var rentStock uint32
var cardStocks []GameCardGoodsStock
err = orm.Eloquent.Table("game_card_goods_stock").Where("store_id", m.StoreId).Find(&cardStocks).Error
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
for i, _ := range cardStocks {
rentStock += cardStocks[i].RentStock
}
//var game GameCardGoods
var totalCount int64
err = orm.Eloquent.Table("game_card_goods").Where("store_id", m.StoreId).
Where("status in (?)", []uint32{1, 2, 3, 4}).Count(&totalCount).Error
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
resp.CardTotalStock = int(rentStock)
resp.CardTotalCount = int(totalCount)
return resp, nil
}
type GameCardGoodsStockCardListReq struct {
Page int `json:"pageIndex"`
PageSize int `json:"pageSize"`
GameCardId uint64 `json:"game_card_id"` // 游戏id
StoreId uint64 `json:"store_id"` // 门店id
Status uint8 `json:"status"` // 状态:1-库存中 2-在途 3-客户持有
}
func (m *GameCardGoodsStockCardListReq) List() ([]GameCardGoods, int64, error) {
goodses := make([]GameCardGoods, 0)
qs := orm.Eloquent.Table("game_card_goods").Where("game_card_id", m.GameCardId).Where("store_id", m.StoreId)
if m.Status != 0 {
qs = qs.Where("status", m.Status)
}
var count int64
err := qs.Count(&count).Error
if err != nil {
logger.Error(err.Error())
return goodses, 0, err
}
page := m.Page
pageSize := m.PageSize
page -= 1
if page < 0 {
page = 0
}
err = qs.Order("created_at DESC").Offset(page * pageSize).Limit(pageSize).Find(&goodses).Error
if err != nil {
logger.Error(err.Error())
return goodses, 0, err
}
return goodses, count, err
}
func (*GameCardGoods) Adds(cards []GameCardGoods) error {
for i, _ := range cards {
//err := orm.Eloquent.FirstOrCreate(&cards[i]).Error
var count int64
err := orm.Eloquent.Table("game_card_goods").Where("serial_number", cards[i].SerialNumber).Count(&count).Error
if err != nil {
logger.Error(err.Error())
continue
}
if count == 0 {
begin := orm.Eloquent.Begin()
// 入库 公共添加数据
cards[i].StockTime = time.Now()
cards[i].FunctionState = 2
//err = orm.Eloquent.Create(&cards[i]).Error
err = begin.Create(&cards[i]).Error
if err != nil {
begin.Rollback()
logger.Error(err.Error())
continue
}
stock := GameCardGoodsStock{StoreId: cards[i].StoreId, GameCardId: cards[i].GameCardId}
err = stock.Add(begin)
if err != nil {
begin.Rollback()
logger.Error(err.Error())
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.Error())
return err
}
}
err := begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error(err.Error())
continue
}
}
}
return nil
}
func (*GameCardGoods) Dels(serials []string) error {
if len(serials) == 0 {
return nil
}
//serials := make([]string, 0)
//for i, _ := range cards {
// serials = append(serials, cards[i].SerialNumber)
//}
list := make([]GameCardGoods, 0)
err := orm.Eloquent.Table("game_card_goods").Where("serial_number in (?)", serials).Find(&list).Error
if err != nil {
logger.Error(err.Error())
return err
}
for i, _ := range list {
if list[i].Status != 1 {
continue
}
if list[i].CardType == GameCardGoodsTypeShare {
continue
}
var cardGoodsStock GameCardGoodsStock
err := orm.Eloquent.Table("game_card_goods_stock").Where("store_id", list[i].StoreId).Where("game_card_id", list[i].GameCardId).Find(&cardGoodsStock).Error
if err != nil {
logger.Error(err.Error())
continue
}
if cardGoodsStock.RentStock < 1 {
continue
}
begin := orm.Eloquent.Begin()
err = orm.Eloquent.Table("game_card_goods").Where("serial_number", list[i].SerialNumber).Delete(&GameCardGoods{}).Error
if err != nil {
begin.Rollback()
logger.Error(err.Error())
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)
fmt.Println("sql:", sql)
err = begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
continue
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("commit err:", logger.Field("err", err))
continue
}
}
return nil
}
func (m *GameCardGoodsStock) Add(begin *gorm.DB) error {
var count int64
err := orm.Eloquent.Table("game_card_goods_stock").Where("store_id", m.StoreId).
Where("game_card_id", m.GameCardId).Count(&count).Error
if err != nil {
logger.Error(err.Error())
return err
}
if count == 0 {
m.StoreStock = 1
m.RentStock = 1
m.TotalStock = 1
//err := orm.Eloquent.Create(m).Error
err := begin.Create(m).Error
if err != nil {
logger.Error(err.Error())
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.Error())
return err
}
return nil
}
func (m *GameCardGoodsStock) Del() error {
sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock-1,store_stock=store_stock-1 WHERE store_id=%d AND game_card_id=%d;", m.StoreId, m.GameCardId)
fmt.Println("sql:", sql)
err := orm.Eloquent.Exec(sql).Error
if err != nil {
logger.Errorf(err.Error())
return err
}
return nil
}
func GameCardBatchStand(standType uint32) error {
var gamees []GameCard
err := orm.Eloquent.Table("game_card").Find(&gamees).Error
if err != nil {
logger.Error(err.Error())
return err
}
//gameIds := make([]uint32,0,len(gamees))
//for i, _ := range gamees {
// gameIds = append(gameIds, gamees[i].ID)
//}
fmt.Println("gamees:", gamees)
var gameStocks []GameCardGoodsStock
err = orm.Eloquent.Table("game_card_goods_stock").Find(&gameStocks).Error
if err != nil {
logger.Error(err.Error())
return err
}
fmt.Println("gameStocks:", gameStocks)
gameStockMap := make(map[uint32]uint32, 0)
for i, _ := range gameStocks {
gameStockMap[uint32(gameStocks[i].GameCardId)] += gameStocks[i].StoreStock
}
gameIds := make([]uint32, 0, len(gameStocks))
gameId := make([]uint32, 0, len(gameStocks))
for i, _ := range gamees {
count, ok := gameStockMap[gamees[i].ID]
if !ok || count == 0 {
gameIds = append(gameIds, gamees[i].ID)
}
if count > 0 {
gameId = append(gameId, gamees[i].ID)
}
}
fmt.Println("gameIds 下架:", gameIds)
fmt.Println("gameId 上架:", gameId)
qs := orm.Eloquent.Table("game_card")
if standType == 1 {
qs = qs.Where("id IN (?)", gameId).Update("status", 1)
} else if standType == 2 {
qs = qs.Where("id IN (?)", gameIds).Update("status", 2)
}
err = qs.Error
if err != nil {
logger.Error(err.Error())
return err
}
return nil
}
func GameCardBatchStandUp(gameIds []uint32) error {
err := orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Update("status", 1).Error
if err != nil {
logger.Error(err.Error())
return err
}
return nil
}
func GoodsPutDownAway() {
var games []GameCard
err := orm.Eloquent.Table("game_card").Order("id DESC").Find(&games).Error
if err != nil {
logger.Error(err.Error())
return
}
// 上下架
for i, _ := range games {
//fmt.Println("游戏:", games[i].ID, games[i].Name)
GameCardStatusUpdate(&games[i])
}
}
func UnPayOrderStatusUpdate() {
// 待支付订单
var orders []Order
orm.Eloquent.Table("order").Where("created_at < ?", time.Now().Add(-30*time.Minute-30*time.Second)).
//orm.Eloquent.Table("order").Where("created_at < ?", time.Now().Add(-3*time.Minute-30*time.Second)).
Where("pay_status=?", PayStatusUnPay).Where("card_status = ?", OrderCardStatusUnPick).Find(&orders)
//ids := make([]string, 0)
if len(orders) == 0 {
return
}
for i, _ := range orders {
var expireOrder Order
err := orm.Eloquent.Table("order").Where("id=?", orders[i].ID).Find(&expireOrder).Error
if err != nil {
logger.Error(err.Error())
continue
}
if expireOrder.PayStatus != PayStatusUnPay || expireOrder.CardStatus != OrderCardStatusUnPick {
continue
}
err = WxPayTransactionOrderClose(orders[i].OrderSn)
if err != nil {
logger.Error(err.Error())
continue
}
begin := orm.Eloquent.Begin()
sqlOrder := fmt.Sprintf("UPDATE `order` SET card_status=5 WHERE id =%d", orders[i].ID)
err = begin.Exec(sqlOrder).Error
if err != nil {
begin.Rollback()
logger.Error(err.Error())
continue
}
sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;", orders[i].StoreId, orders[i].GameCardId)
fmt.Println("sql:", sql)
err = begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
continue
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
continue
}
//ids = append(ids, fmt.Sprintf("%d", orders[i].ID))
}
//if len(ids) > 0 {
// sql := fmt.Sprintf("UPDATE `order` SET card_status=5 WHERE id IN (%s)", strings.Join(ids, ","))
// err := begin.Exec(sql).Error
// if err != nil {
// logger.Error(err.Error())
// }
//}
//err := begin.Commit().Error
//if err != nil {
// logger.Errorf(err.Error())
//}
}
func DeliveryStorePickStatusUpdate() {
// 门店自取订单
var orders []Order
// 待上门店取货
orm.Eloquent.Table("order").Where("created_at < ?", time.Now().Add(-24*time.Hour-1*time.Minute)).
//orm.Eloquent.Table("order").Where("created_at < ?", time.Now().Add(-3*time.Minute)).
Where("pay_status=?", PayStatusPaid).Where("card_status = ?", OrderCardStatusUnPick).
Where("delivery_type", 1).Find(&orders)
//ids := make([]string, 0)
for i, _ := range orders {
var (
expireOrder Order
expireOrderCard []OrderCard
)
err := orm.Eloquent.Table("order").Where("id=?", orders[i].ID).Find(&expireOrder).Error
if err != nil {
logger.Error(err.Error())
continue
}
if expireOrder.PayStatus != PayStatusPaid || expireOrder.CardStatus != OrderCardStatusUnPick {
continue
}
err = orm.Eloquent.Table("order_card").Where("order_id=?", orders[i].ID).Find(&expireOrderCard).Error
if err != nil {
logger.Error(err.Error())
continue
}
begin := orm.Eloquent.Begin()
sqlOrder := fmt.Sprintf("UPDATE `order` SET card_status=5 WHERE id = %d", orders[i].ID)
err = begin.Exec(sqlOrder).Error
if err != nil {
begin.Rollback()
logger.Error(err.Error())
return
}
addCardCount := 0
for _, v := range expireOrderCard {
if v.CardStatus != OrderCardStatusUnPick {
continue
}
sqlOrderCard := fmt.Sprintf("UPDATE `order_card` SET card_status=5 WHERE id = %d", v.ID)
err = begin.Exec(sqlOrderCard).Error
if err != nil {
begin.Rollback()
logger.Error(err.Error())
return
}
sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;", v.StoreId, v.GameCardId)
fmt.Println("sql:", sql)
err = begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
continue
}
addCardCount++
}
if addCardCount > 0 {
sqlRent := fmt.Sprintf("UPDATE user_rent_card SET have_rent_count = have_rent_count-%d,can_rent_count=can_rent_count+%d WHERE uid =%d;", addCardCount, addCardCount, expireOrder.Uid)
fmt.Println("sqlRent:", sqlRent)
err = begin.Exec(sqlRent).Error
if err != nil {
begin.Rollback()
logger.Errorf("err:%#v", err)
continue
}
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
continue
}
//ids = append(ids, fmt.Sprintf("%d", orders[i].ID))
}
//if len(ids) > 0 {
// sql := fmt.Sprintf("UPDATE `order` SET card_status=5 WHERE id IN (%s)", strings.Join(ids, ","))
// err := begin.Exec(sql).Error
// if err != nil {
// begin.Rollback()
// logger.Error(err.Error())
// return
// }
//}
//err := begin.Commit().Error
//if err != nil {
// begin.Rollback()
// logger.Errorf(err.Error())
//}
}
func MemberExpirationReminder() {
//start1 := time.Now().Add(-7 * 24 * time.Hour)
//end1 := start1.AddDate(0, 0, 1)
//
//var users []UserInfo
//err := orm.Eloquent.Table("user").Where("member_expire > ?", start1).Where("member_expire < ?", end1).
// Where("member_level in (?)", []uint32{2, 3, 4, 5}).Find(&users).Error
//if err != nil {
// logger.Error(err.Error().Error()())
// return
//}
//
//if len(users) == 0 {
// logger.Info("users is null")
// return
//}
//
//content := "【go2switch】温馨提示:您的会员即将过期,请在过期之前将卡归还到门店,如有问题联系客服"
//for i, _ := range users {
// if users[i].Tel == "" {
// continue
// }
//
// unreturned := &struct {
// Count int `json:"count"`
// }{}
// sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM `order` WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;", users[i].Uid)
// err := orm.Eloquent.Raw(sql).Scan(unreturned).Error
// if err != nil {
// logger.Error(err.Error().Error()())
// continue
// }
// fmt.Println("订单数量count:", unreturned.Count)
// if unreturned.Count == 0 {
// continue
// }
// err = SmsSend(users[i].Tel, content)
// if err != nil {
// logger.Error(err.Error())
// }
//}
list := []int64{7, 4, 0}
for i, _ := range list {
MemberExpirationReminderDay(list[i])
}
}
func MemberExpirationReminderDay(days int64) {
start := time.Now().Add(time.Duration(days) * 24 * time.Hour)
end := start.AddDate(0, 0, 1)
var users []UserInfo
err := orm.Eloquent.Table("user").Where("member_expire > ?", start).Where("member_expire < ?", end).
Where("member_level in (?)", []uint32{2, 3, 4, 5}).Find(&users).Error
if err != nil {
logger.Error(err.Error())
return
}
if len(users) == 0 {
logger.Info("users is null")
return
}
content := fmt.Sprintf("【go2swtich】温馨提示您的会员还有%d天将到期请及时续费如会员到期后仍有卡带未归还将会收取滞纳金", days)
for i, _ := range users {
if users[i].Tel == "" {
continue
}
unreturned := &struct {
Count int `json:"count"`
}{}
sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM order_card WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;", users[i].Uid)
err := orm.Eloquent.Raw(sql).Scan(unreturned).Error
if err != nil {
logger.Error(err.Error())
continue
}
fmt.Println("订单数量count:", unreturned.Count)
if unreturned.Count == 0 {
continue
}
//fmt.Println("content:", content)
err = GtSendMessage([]string{users[i].Tel}, content)
if err != nil {
logger.Error(err.Error())
}
}
}
func ExpireMemberSMSSend() {
nowTime := time.Now()
days := []uint32{1, 2, 3, 4, 5, 6, 7, 14, 21, 28, 60, 90}
for i, _ := range days {
ExpireMemberSMSSendDay(days[i], nowTime)
}
}
func ExpireMemberSMSSendDay(day uint32, nowTime time.Time) {
smsSend := &ExpireMemberSmsSend{
Message: fmt.Sprintf("【go2switch】您的租卡会员已过期%d天卡带未归还产生滞纳金%d元请及时续费会员或归还卡带以避免对您造成不必要的损失。", day, day*2),
SendTime: nowTime,
Tel: "",
Status: 1,
}
start := nowTime.AddDate(0, 0, int(day)*(-1))
end := start.AddDate(0, 0, 1)
var users []UserInfo
err := orm.Eloquent.Table("user").Where("member_expire > ?", start).Where("member_expire < ?", end).
Where("member_level in (?)", []uint32{2, 3, 4, 5}).Find(&users).Error
if err != nil {
logger.Error(err.Error())
return
}
if len(users) == 0 {
logger.Info("users is null")
return
}
for i, _ := range users {
if users[i].Tel == "" {
continue
}
smsSend.Tel = users[i].Tel
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM order_card WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ", users[i].Uid))
if err != nil || !exist {
logger.Error("QueryRecordExist err", logger.Field("err", err), logger.Field("exists", exist))
continue
}
err = GtSendMessage([]string{users[i].Tel}, smsSend.Message)
if err != nil {
smsSend.Status = 2
logger.Error(err.Error())
}
err = orm.Eloquent.Create(&smsSend).Error
if err != nil {
logger.Error("create expire member sms send err:", logger.Field("err", err))
}
}
}
func GameCardStatusUpdate(card *GameCard) {
var cardStocks []GameCardGoodsStock
err := orm.Eloquent.Table("game_card_goods_stock").Where("game_card_id", card.ID).Find(&cardStocks).Error
if err != nil {
logger.Error(err.Error())
return
}
//sql := "UPDATE game_card SET status = %d WHERE id = %d"
if len(cardStocks) == 0 && card.Status == 1 {
sql := fmt.Sprintf("UPDATE game_card SET status = %d WHERE id = %d", 2, card.ID)
//fmt.Println("sql---1", sql)
err := orm.Eloquent.Exec(sql).Error
if err != nil {
logger.Error(err.Error())
}
return
}
stocks := uint32(0)
for i, _ := range cardStocks {
stocks += cardStocks[i].StoreStock
}
if card.Status == 1 {
if stocks <= 0 {
fmt.Println("下架游戏:", card.ID, card.Name)
sql := fmt.Sprintf("UPDATE game_card SET status = %d WHERE id = %d", 2, card.ID)
fmt.Println("sql----2", sql)
err := orm.Eloquent.Exec(sql).Error
if err != nil {
logger.Error(err.Error())
return
}
}
} else if card.Status == 2 {
if stocks > 0 {
fmt.Println("上架游戏:", card.ID, card.Name)
sql := fmt.Sprintf("UPDATE game_card SET status = %d WHERE id = %d", 1, card.ID)
//fmt.Println("sql----3", sql)
err := orm.Eloquent.Exec(sql).Error
if err != nil {
logger.Error(err.Error())
return
}
}
}
//Where("id IN (?)", gameIds)
}
type ExportGoods struct {
GoodsName string `json:"goods_name"`
CardPool uint32 `json:"card_pool"`
RentStock uint32 `json:"rent_stock"`
PlayerHold uint32 `json:"player_hold"`
OrderCount uint32 `json:"order_count"`
DelayDeliverGameCard uint32 `json:"delay_deliver_game_card"`
Goods []GameCardGoods `json:"goods"`
}
func ExportGoodsStock(storeId uint32) string {
var games []GameCard
err := orm.Eloquent.Table("game_card").Order("id DESC").Find(&games).Error
if err != nil {
logger.Error(err.Error())
return ""
}
if storeId == 0 {
allInfo, err := GoodsStockAllInfo(games)
if err != nil {
logger.Error(err.Error())
return ""
}
return GoodsStockFile(allInfo, "全部门店")
} else {
var store Store
err := orm.Eloquent.Table("store").Where("id", storeId).Order("id DESC").Find(&store).Error
if err != nil {
logger.Error(err.Error())
return ""
}
storeInfo, err := GoodsStockStoreInfo(games, store)
if err != nil {
logger.Error(err.Error())
return ""
}
return GoodsStockFile(storeInfo, store.Name)
}
}
func GoodsStockAllInfo(gameCards []GameCard) ([]ExportGoods, error) {
goodsData := make([]ExportGoods, 0, len(gameCards))
cardStocks := make([]GameCardGoodsStock, 0)
err := orm.Eloquent.Table("game_card_goods_stock").Order("id DESC").Find(&cardStocks).Error
if err != nil {
logger.Error(err.Error())
return goodsData, err
}
cardStockMap := make(map[uint64][]GameCardGoodsStock, 0)
for i, _ := range cardStocks {
cardStockMap[cardStocks[i].GameCardId] = append(cardStockMap[cardStocks[i].GameCardId], cardStocks[i])
}
cardGoods := make([]GameCardGoods, 0)
err = orm.Eloquent.Table("game_card_goods").Order("store_id DESC,id DESC").Find(&cardGoods).Error
if err != nil {
logger.Error(err.Error())
return goodsData, err
}
storeIds := make([]uint32, 0)
for i, _ := range cardGoods {
storeIds = append(storeIds, uint32(cardGoods[i].StoreId))
}
storeMap := GetStoreMapByIds(storeIds)
cardGoodsMap := make(map[uint64][]GameCardGoods, 0)
for i, _ := range cardGoods {
v, ok := storeMap[(cardGoods[i].StoreId)]
if ok {
cardGoods[i].Store = v
}
cardGoodsMap[cardGoods[i].GameCardId] = append(cardGoodsMap[cardGoods[i].GameCardId], cardGoods[i])
storeIds = append(storeIds)
}
for _, game := range gameCards {
cardStock, ok1 := cardStockMap[uint64(game.ID)]
gameCardGoods, ok2 := cardGoodsMap[uint64(game.ID)]
if !ok1 || !ok2 {
continue
}
exportGoods := &ExportGoods{
GoodsName: game.Name,
Goods: gameCardGoods,
}
for i, _ := range cardStock {
exportGoods.RentStock += cardStock[i].RentStock
exportGoods.OrderCount += cardStock[i].OrderCount
}
exportGoods.CardPool = uint32(len(gameCardGoods))
for i, _ := range gameCardGoods {
if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
exportGoods.PlayerHold += 1
}
}
exportGoods.DelayDeliverGameCard = uint32(len(gameCardGoods)) - exportGoods.RentStock - exportGoods.PlayerHold
goodsData = append(goodsData, *exportGoods)
}
return goodsData, err
}
func GoodsStockStoreInfo(gameCards []GameCard, store Store) ([]ExportGoods, error) {
goodsData := make([]ExportGoods, 0, len(gameCards))
cardStocks := make([]GameCardGoodsStock, 0)
err := orm.Eloquent.Table("game_card_goods_stock").Where("store_id", store.ID).Order("id DESC").Find(&cardStocks).Error
if err != nil {
logger.Error(err.Error())
return goodsData, err
}
cardStockMap := make(map[uint64]GameCardGoodsStock, 0)
for i, _ := range cardStocks {
cardStockMap[cardStocks[i].GameCardId] = cardStocks[i]
}
cardGoods := make([]GameCardGoods, 0)
err = orm.Eloquent.Table("game_card_goods").Where("store_id", store.ID).Order("id DESC").Find(&cardGoods).Error
if err != nil {
logger.Error(err.Error())
return goodsData, err
}
cardGoodsMap := make(map[uint64][]GameCardGoods, 0)
for i, _ := range cardGoods {
cardGoods[i].Store = &store
cardGoodsMap[cardGoods[i].GameCardId] = append(cardGoodsMap[cardGoods[i].GameCardId], cardGoods[i])
}
for _, game := range gameCards {
cardStock, ok1 := cardStockMap[uint64(game.ID)]
gameCardGoods, ok2 := cardGoodsMap[uint64(game.ID)]
if !ok1 || !ok2 {
continue
}
exportGoods := &ExportGoods{
GoodsName: game.Name,
//CardPool: cardStock.StoreStock,
RentStock: cardStock.RentStock,
OrderCount: cardStock.OrderCount,
Goods: gameCardGoods,
}
exportGoods.CardPool = uint32(len(gameCardGoods))
for i, _ := range gameCardGoods {
if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
exportGoods.PlayerHold += 1
}
}
if uint32(len(gameCardGoods)) > exportGoods.RentStock+exportGoods.PlayerHold {
exportGoods.DelayDeliverGameCard = uint32(len(gameCardGoods)) - exportGoods.RentStock - exportGoods.PlayerHold
}
goodsData = append(goodsData, *exportGoods)
}
return goodsData, err
}
func GoodsStockFile(goodsData []ExportGoods, fileName string) string {
file := excelize.NewFile()
streamWriter, err := file.NewStreamWriter("Sheet1")
if err != nil {
fmt.Println(err)
}
//url := "http://39.108.188.218:8000/img/export/"
fileName = time.Now().Format(TimeFormat) + fileName + ".xlsx"
title := []interface{}{"商品名称", "卡池总数", "在库数量", "玩家持有数量", "锁定数量", "借出总数", "商品编号", "所在门店", "状态"}
cell, _ := excelize.CoordinatesToCellName(1, 1)
if err = streamWriter.SetRow(cell, title); err != nil {
fmt.Println(err)
}
idx := 2
var row []interface{}
for rowId := 0; rowId < len(goodsData); rowId++ {
row = []interface{}{goodsData[rowId].GoodsName, fmt.Sprintf("%d", goodsData[rowId].CardPool),
fmt.Sprintf("%d", goodsData[rowId].RentStock),
fmt.Sprintf("%d", goodsData[rowId].PlayerHold), fmt.Sprintf("%d", goodsData[rowId].DelayDeliverGameCard), fmt.Sprintf("%d", goodsData[rowId].OrderCount)}
if len(goodsData[rowId].Goods) > 0 {
storeName := ""
if goodsData[rowId].Goods[0].Store != nil {
storeName = goodsData[rowId].Goods[0].Store.Name
}
row = append(row, goodsData[rowId].Goods[0].SerialNumber, storeName, GoodsStatusStringByStatus(goodsData[rowId].Goods[0].Status))
}
cell, _ := excelize.CoordinatesToCellName(1, idx)
if err := streamWriter.SetRow(cell, row); err != nil {
fmt.Println(err)
}
idx++
if len(goodsData[rowId].Goods) <= 1 {
//continue
} else {
for _, cardGoods := range goodsData[rowId].Goods[1:] {
recordGoods := make([]interface{}, 6)
storeName := ""
if cardGoods.Store != nil {
storeName = cardGoods.Store.Name
}
recordGoods = append(recordGoods, cardGoods.SerialNumber, storeName, GoodsStatusStringByStatus(cardGoods.Status))
cell, _ := excelize.CoordinatesToCellName(1, idx)
if err := streamWriter.SetRow(cell, recordGoods); err != nil {
fmt.Println(err)
}
idx++
}
}
}
if err := streamWriter.Flush(); err != nil {
fmt.Println(err)
}
if err := file.SaveAs("/www/server/images/export/" + fileName); err != nil {
//if err := file.SaveAs("./" + fileName); err != nil {
fmt.Println(err)
}
return ExportUrl + fileName
}
func GoodsStatusStringByStatus(status uint8) string {
switch status {
case 1:
return "库存中"
case 2:
return "在途"
case 3:
return "客户持有"
case 4:
return "调拨中"
}
return ""
}
type CardPoolAnalysis struct {
CardPool uint32 `json:"card_pool"`
RentStock uint32 `json:"rent_stock"`
PlayerHold uint32 `json:"player_hold"`
DelayDeliverGameCard uint32 `json:"delay_deliver_game_card"`
}
func CardPoolData(storeId uint32) (*CardPoolAnalysis, error) {
poolAnalysis := new(CardPoolAnalysis)
//var totalRentStock uint32
//err := orm.Eloquent.Table("game_card_goods_stock").Pluck("SUM(rent_stock) AS total_rent_stock ", &totalRentStock).Error
//if err != nil {
// logger.Error(err.Error())
// return poolAnalysis, err
//}
//poolAnalysis.RentStock = totalRentStock
//fmt.Println("storeId:", storeId)
qs := orm.Eloquent.Table("game_card_goods")
if storeId != 0 {
qs = qs.Where("store_id", storeId)
}
var total int64
err := qs.Count(&total).Error
if err != nil {
logger.Error(err.Error())
return poolAnalysis, err
}
var playerHold int64
sqlPlayerHold := orm.Eloquent.Table("game_card_goods").Where("status = ?", GameCardGoodsStatusCustomerHold)
if storeId != 0 {
sqlPlayerHold = sqlPlayerHold.Where("store_id", storeId)
}
err = sqlPlayerHold.Count(&playerHold).Error
if err != nil {
logger.Error(err.Error())
return poolAnalysis, err
}
//GameCardGoodsStock{} .Where("status = ?", GameCardGoodsStatusStock)
var cardStocks []GameCardGoodsStock
var rentStock uint32
sqlRentStock := orm.Eloquent.Table("game_card_goods_stock")
if storeId != 0 {
sqlRentStock = sqlRentStock.Where("store_id", storeId)
}
err = sqlRentStock.Find(&cardStocks).Error
if err != nil {
logger.Error(err.Error())
return poolAnalysis, err
}
for i, _ := range cardStocks {
rentStock += cardStocks[i].RentStock
}
//fmt.Println("rentStock", rentStock)
poolAnalysis.CardPool = uint32(total)
poolAnalysis.PlayerHold = uint32(playerHold)
poolAnalysis.RentStock = uint32(rentStock)
poolAnalysis.DelayDeliverGameCard = uint32(total-playerHold) - rentStock
//fmt.Println("CardPool:", poolAnalysis.CardPool)
//fmt.Println("PlayerHold:", poolAnalysis.PlayerHold)
//fmt.Println("RentStock:", poolAnalysis.RentStock)
//fmt.Println("DelayDeliverGameCard:", poolAnalysis.DelayDeliverGameCard)
return poolAnalysis, nil
}
type GameCardOrder struct {
GameCardId uint32 `json:"game_card_id"`
CountOrder uint32 `json:"count_order"`
}
func GameCardOrderRank(storeId uint32) ([]GameCard, error) {
gameCards := make([]GameCard, 0)
if storeId == 0 {
err := orm.Eloquent.Table("game_card").Order("-order_count").Limit(10).Find(&gameCards).Error
if err != nil {
logger.Error(err.Error())
return gameCards, err
}
return gameCards, nil
}
var gameCardOrders []GameCardOrder
sql := fmt.Sprintf("SELECT * FROM (SELECT game_card_id,COUNT(id) AS count_order FROM `order` WHERE 1 AND card_status=4 AND pay_status=2 AND store_id=%d GROUP BY game_card_id) a ORDER BY count_order DESC;", storeId)
err := orm.Eloquent.Raw(sql).Scan(&gameCardOrders).Error
if err != nil {
logger.Error(err.Error())
return gameCards, err
}
gameIds := make([]uint32, 0)
for i, _ := range gameCardOrders {
gameIds = append(gameIds, gameCardOrders[i].GameCardId)
}
if len(gameIds) == 0 {
return gameCards, nil
}
var list []GameCard
err = orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Find(&list).Error
if err != nil {
logger.Error(err.Error())
return gameCards, err
}
listMap := make(map[uint32]GameCard)
for i, _ := range list {
listMap[list[i].ID] = list[i]
}
for i, _ := range gameCardOrders {
game, ok := listMap[gameCardOrders[i].GameCardId]
if ok {
game.OrderCount = gameCardOrders[i].CountOrder
gameCards = append(gameCards, game)
}
}
if len(gameCards) > 10 {
gameCards = gameCards[:10]
}
return gameCards, nil
}
type GameCardStockListReq struct {
}
type GameCardStockListResp struct {
List []GameCardGoodsStock `json:"list"`
Count uint32 `json:"count"`
PageIndex uint32 `json:"page_index"`
CardTotalCount int `json:"card_total_count"`
CardTotalStock int `json:"card_total_stock"`
CardHoldCount int `json:"card_hold_count"`
}
type CooperativeGameCardStockReq struct {
SortType uint32 `json:"sort_type"` // 1-总库存 2-库存 3-用户持有 4-订单数量
SortDirection uint32 `json:"sort_direction"` // 1-升序 2-降序
StoreId uint32 `json:"store_id"`
CooperativeBusinessId uint32 `json:"cooperative_business_id"`
PageNum uint32 `json:"pageIndex"`
PageSize uint32 `json:"page_size"`
Name string `json:"name"`
}
type CooperativeGameCardStockResp struct {
List []GameCardGoodsStock `json:"list"`
Count uint32 `json:"count"`
PageIndex uint32 `json:"page_index"`
CardTotalCount int `json:"card_total_count"`
CardTotalStock int `json:"card_total_stock"`
CardHoldCount int `json:"card_hold_count"`
}
func (m *CooperativeGameCardStockReq) List() (*CooperativeGameCardStockResp, error) {
resp := &CooperativeGameCardStockResp{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 := ""
if m.StoreId != 0 {
sqlStore = fmt.Sprintf(" AND store_id = %d", m.StoreId)
} else {
storeIds, err := GetStoreIdsByCooperativeBusinessId(m.CooperativeBusinessId)
if err != nil {
logger.Error("get store ids err:", logger.Field("err", err))
return resp, err
}
idString := ""
for i, _ := range storeIds {
idString += fmt.Sprintf("%d,", storeIds[i])
}
sqlStore = fmt.Sprintf(" AND store_id in (%s) ", idString[:len(idString)-1])
}
if m.Name != "" {
var gameCards []GameCard
sqlName := "SELECT * FROM game_card WHERE `name` LIKE '%" + m.Name + "%';"
fmt.Println("sqlName:", sqlName)
err := orm.Eloquent.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)
if len(gameIds) > 0 {
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 := orm.Eloquent.Raw(sqlCount).Scan(&gameCardCount).Error
if err != nil {
logger.Error("sqlCount err:", logger.Field("err", err))
return resp, err
}
fmt.Println("countGame:", gameCardCount.CountGame)
resp.Count = gameCardCount.CountGame
page := 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 = orm.Eloquent.Raw(sql).Scan(&goodsStocks).Error
if err != nil {
logger.Error(err.Error())
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 = orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Find(&games).Error
if err != nil {
logger.Error(err.Error())
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
var cardHoldCount int64
holdQs := orm.Eloquent.Table("game_card_goods").Where("status", GameCardGoodsStatusCustomerHold)
if m.StoreId != 0 {
holdQs = holdQs.Where("store_id", m.StoreId)
}
err = holdQs.Count(&cardHoldCount).Error
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
resp.CardHoldCount = int(cardHoldCount)
var (
rentStock uint32
totalCount int64
cardStocks []GameCardGoodsStock
)
if m.StoreId != 0 {
err = orm.Eloquent.Table("game_card_goods_stock").Where("store_id", m.StoreId).Find(&cardStocks).Error
} else {
err = orm.Eloquent.Table("game_card_goods_stock").Find(&cardStocks).Error
}
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
for i, _ := range cardStocks {
rentStock += cardStocks[i].RentStock
}
//var game GameCardGoods
if m.StoreId != 0 {
err = orm.Eloquent.Table("game_card_goods").Where("store_id", m.StoreId).
Where("status in (?)", []uint32{1, 2, 3, 4}).Count(&totalCount).Error
} else {
err = orm.Eloquent.Table("game_card_goods").
Where("status in (?)", []uint32{1, 2, 3, 4}).Count(&totalCount).Error
}
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
resp.CardTotalStock = int(rentStock)
resp.CardTotalCount = int(totalCount)
return resp, nil
}
func GameCardStockList(name string, sortType, sortDirection, storeId, pageNum, pageSize uint32) (*GameCardStockListResp, error) {
resp := &GameCardStockListResp{PageIndex: pageNum}
type GameCardCount struct {
CountGame uint32 `json:"count_game"`
}
var gameCardCount GameCardCount
var goodsStocks []GameCardGoodsStock
sqlOrder := ""
switch 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 sortDirection == 1 {
sqlOrder += " DESC"
} else if sortDirection == 2 {
sqlOrder += " ASC"
}
sqlStore := ""
if storeId != 0 {
sqlStore = fmt.Sprintf(" AND store_id = %d", storeId)
}
if name != "" {
var gameCards []GameCard
sqlName := "SELECT * FROM game_card WHERE `name` LIKE '%" + name + "%';"
err := orm.Eloquent.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 := orm.Eloquent.Raw(sqlCount).Scan(&gameCardCount).Error
if err != nil {
logger.Error("sqlCount err:", logger.Field("err", err))
return resp, err
}
fmt.Println("countGame:", gameCardCount.CountGame)
resp.Count = gameCardCount.CountGame
page := pageNum - 1
if page < 0 {
page = 0
}
if pageSize == 0 {
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*pageSize, pageSize)
fmt.Println("sql:", sql)
err = orm.Eloquent.Raw(sql).Scan(&goodsStocks).Error
if err != nil {
logger.Error(err.Error())
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 = orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Find(&games).Error
if err != nil {
logger.Error(err.Error())
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
//userHoldMap := make(map[uint64]uint32)
//totalCountMap := make(map[uint64]uint32)
//for i, _ := range userHold {
// userHoldMap[userHold[i].GameCardId] = userHold[i].CardCount
// resp.CardHoldCount += int(userHold[i].CardCount)
//}
//var gameCardGoods []GameCardGoods
var cardHoldCount int64
holdQs := orm.Eloquent.Table("game_card_goods").Where("status", GameCardGoodsStatusCustomerHold)
if storeId != 0 {
holdQs = holdQs.Where("store_id", storeId)
}
err = holdQs.Count(&cardHoldCount).Error
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
resp.CardHoldCount = int(cardHoldCount)
//err = orm.Eloquent.Table("game_card_goods").Where("store_id", m.StoreId).Find(&gameCardGoods).Error
//if err != nil {
// logger.Errorf(err.Error())
// return resp, err
//}
//for i, _ := range gameCardGoods {
// if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
// userHoldMap[gameCardGoods[i].GameCardId] += 1
// resp.CardHoldCount += 1
// }
// //if gameCardGoods[i].Status != GameCardGoodsStatusReceivingCard && gameCardGoods[i].Status != GameCardGoodsStatusReceivedCard {
// // totalCountMap[gameCardGoods[i].GameCardId] += 1
// //}
//}
//for i, _ := range goodsStocks {
// ////game, ok := gameMap[uint32(stocks[i].GameCardId)]
// //if ok {
// // if v, ok := userHoldMap[stocks[i].GameCardId]; ok {
// // stocks[i].UserHoldStock = v
// // }
// // if v, ok := totalCountMap[stocks[i].GameCardId]; ok {
// // stocks[i].TotalStock = v
// // }
// // //resp.List = append(resp.List, stocks[i].ToInfo(&game))
// //}
// if v, ok := userHoldMap[goodsStocks[i].GameCardId]; ok {
// goodsStocks[i].UserHoldStock = v
// }
// if v, ok := totalCountMap[goodsStocks[i].GameCardId]; ok {
// goodsStocks[i].TotalStock = v
// }
//}
var (
rentStock uint32
totalCount int64
cardStocks []GameCardGoodsStock
)
if storeId != 0 {
err = orm.Eloquent.Table("game_card_goods_stock").Where("store_id", storeId).Find(&cardStocks).Error
} else {
err = orm.Eloquent.Table("game_card_goods_stock").Find(&cardStocks).Error
}
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
for i, _ := range cardStocks {
rentStock += cardStocks[i].RentStock
}
//var game GameCardGoods
if storeId != 0 {
err = orm.Eloquent.Table("game_card_goods").Where("store_id", storeId).
Where("status in (?)", []uint32{1, 2, 3, 4}).Count(&totalCount).Error
} else {
err = orm.Eloquent.Table("game_card_goods").
Where("status in (?)", []uint32{1, 2, 3, 4}).Count(&totalCount).Error
}
if err != nil {
logger.Errorf(err.Error())
return resp, err
}
resp.CardTotalStock = int(rentStock)
resp.CardTotalCount = int(totalCount)
return resp, nil
}
const (
CannibalizeTaskStatusNotImportGoods = 1 // 1-待填调拨卡
CannibalizeTaskStatusNotDeliverGoods = 2 // 2-待发货
CannibalizeTaskStatusDeliveredGoods = 3 // 3-已发货
CannibalizeTaskStatusInStorage = 4 // 4-已入库
CannibalizeTaskStatusDel = 5 // 4-已删除
)
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-已入库
DeliveryTime time.Time `json:"delivery_time"`
InStorageTime time.Time `json:"in_storage_time"`
FromStoreName string `json:"from_store_name" gorm:"-"`
ToStoreName string `json:"to_store_name" gorm:"-"`
//CannibalizeStockTask int `json:"cannibalize_stock_task" gorm:"-"`
}
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"` // 编号
GameCardName string `json:"game_card_name" gorm:""`
//CannibalizeGameCardGoods int `json:"cannibalize_game_card_goods" gorm:"-"`
}
type CannibalizeTaskListReq struct {
PageNum int `json:"pageIndex"`
PageSize int `json:"pageSize"`
StoreId uint64 `json:"store_id" ` // 门店id
Status uint8 `json:"status"`
}
type CannibalizeTaskListResp struct {
PageSize int `json:"pageSize"`
List []CannibalizeStockTask `json:"list"`
Count int `json:"count"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
}
func (m *CannibalizeTaskListReq) GetCannibalizeTaskList() (*CannibalizeTaskListResp, error) {
resp := &CannibalizeTaskListResp{
PageIndex: m.PageNum,
PageSize: m.PageSize,
}
qs := orm.Eloquent.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)
}
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.Error())
return resp, err
}
resp.Count = int(count)
resp.List = CannibalizeStockTaskListSetInfo(tasks)
return resp, nil
}
type CooperativeCannibalizeTaskReq struct {
CooperativeBusinessId uint32 `json:"cooperative_business_id"`
StoreId uint64 `json:"store_id" ` // 门店id
Status uint8 `json:"status"`
PageNum int `json:"pageIndex"`
PageSize int `json:"pageSize"`
}
type CooperativeCannibalizeTaskResp struct {
PageSize int `json:"pageSize"`
List []CannibalizeStockTask `json:"list"`
Count int `json:"count"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
}
func (m *CooperativeCannibalizeTaskReq) List() (*CooperativeCannibalizeTaskResp, error) {
resp := &CooperativeCannibalizeTaskResp{
PageIndex: m.PageNum,
PageSize: m.PageSize,
}
qs := orm.Eloquent.Table("cannibalize_stock_task")
if m.StoreId != 0 {
qs = qs.Where("from_store_id = ?", m.StoreId).Or("to_store_id = ?", m.StoreId)
} else {
storeIds, err := GetStoreIdsByCooperativeBusinessId(m.CooperativeBusinessId)
if err != nil {
logger.Error("get store ids err:", logger.Field("err", err))
return resp, err
}
qs = qs.Where("from_store_id in (?)", storeIds).Or("to_store_id in (?)", storeIds)
}
if m.Status != 0 {
qs = qs.Where("status = ?", m.Status)
}
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.Error())
return resp, err
}
resp.Count = int(count)
resp.List = CannibalizeStockTaskListSetInfo(tasks)
return resp, nil
}
func CannibalizeStockTaskListSetInfo(tasks []CannibalizeStockTask) []CannibalizeStockTask {
if len(tasks) == 0 {
return tasks
}
storeMap := GetStoreMap()
for i, _ := range tasks {
toStore, ok1 := storeMap[tasks[i].ToStoreId]
if ok1 {
tasks[i].ToStoreName = toStore.Name
}
fromStore, ok2 := storeMap[tasks[i].FromStoreId]
if ok2 {
tasks[i].FromStoreName = fromStore.Name
}
}
return tasks
}
func GetStoreMap() map[uint32]Store {
storeMap := make(map[uint32]Store, 0)
var stores []Store
err := orm.Eloquent.Table("store").Find(&stores).Error
if err != nil {
logger.Error(err.Error())
return storeMap
}
for i, _ := range stores {
storeMap[stores[i].ID] = stores[i]
}
return storeMap
}
func CannibalizeTaskImportGoods(taskId uint32, serials []string) (uint32, error) {
if taskId == 0 || len(serials) == 0 {
return 0, errors.New("para err")
}
var cannibalizeTask CannibalizeStockTask
err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error
if err != nil {
logger.Error("cannibalize task err:", logger.Field("err", err))
return 0, err
}
if cannibalizeTask.Status != CannibalizeTaskStatusNotImportGoods &&
cannibalizeTask.Status != CannibalizeTaskStatusNotDeliverGoods {
logger.Error("cannibalize status err:", logger.Field("err", err))
return 0, err
}
var cannibalizeGoodses []CannibalizeGameCardGoods
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:", logger.Field("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 = orm.Eloquent.Raw(sql).Scan(&cannibalizeInGoodses).Error
if err != nil {
logger.Error("cannibalize in goods err:", logger.Field("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
}
}
//orm.Eloquent.Table("cannibalize_game_card_goods").Where("serial_number in (?)", serials).Where("")
list := make([]GameCardGoods, 0)
err = orm.Eloquent.Table("game_card_goods").Where("serial_number in (?)", serials).Find(&list).Error
if err != nil {
logger.Error(err.Error())
return 0, err
}
unImpotentCount := 0
impotentCount := 0
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
}
//begin := orm.Eloquent.Begin()
//err := orm.Eloquent.Table("game_card_goods").Where("serial_number", list[i].SerialNumber).Delete(&list[i]).Error
//if err != nil {
// begin.Rollback()
// logger.Error(err.Error())
// 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)
//fmt.Println("sql:", sql)
//err = begin.Exec(sql).Error
//if err != nil {
// begin.Rollback()
// logger.Errorf(err.Error())
// continue
//}
//
//err = begin.Commit().Error
//if err != nil {
// begin.Rollback()
// logger.Error("commit err:", err)
// continue
//}
cardGoods := &CannibalizeGameCardGoods{
CannibalizeStockTaskId: taskId,
GameCardId: uint32(list[i].GameCardId),
SerialNumber: list[i].SerialNumber,
}
err := orm.Eloquent.Create(cardGoods).Error
if err != nil {
logger.Error(err.Error())
unImpotentCount++
continue
}
impotentCount++
}
if cannibalizeTask.Status == CannibalizeTaskStatusNotImportGoods && impotentCount > 0 {
sql := fmt.Sprintf("UPDATE cannibalize_stock_task SET status = 2 WHERE id = %d", taskId)
err = orm.Eloquent.Exec(sql).Error
if err != nil {
logger.Error("update status err", logger.Field("err", err))
}
}
return uint32(unImpotentCount), nil
}
func CannibalizeDeliverGoods(taskId uint32) error {
var cannibalizeTask CannibalizeStockTask
err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error
if err != nil {
logger.Error("cannibalize task err:", logger.Field("err", err))
return err
}
if cannibalizeTask.Status != CannibalizeTaskStatusNotDeliverGoods {
return errors.New("cannibalize task status err")
}
var cannibalizeGoodses []CannibalizeGameCardGoods
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:", logger.Field("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
if err != nil {
logger.Error(err.Error())
return err
}
for i, _ := range list {
if list[i].Status != 1 {
//fmt.Println("--------list[i]", list[i])
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:", logger.Field("err", err))
}
continue
}
begin := orm.Eloquent.Begin()
//err := orm.Eloquent.Table("game_card_goods").Where("serial_number", list[i].SerialNumber).Delete(&list[i]).Error
//if err != nil {
// begin.Rollback()
// logger.Error(err.Error())
// continue
//}
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.Errorf(err.Error())
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.Error())
continue
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("commit err:", logger.Field("err", err))
continue
}
delete(serialMap, list[i].SerialNumber)
}
// 没有更新库存的卡
if len(serialMap) > 0 {
for k, _ := range serialMap {
//fmt.Println("--------k", k)
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:", logger.Field("err", err))
}
}
}
if cannibalizeTask.Status == CannibalizeTaskStatusNotDeliverGoods {
sql := fmt.Sprintf("UPDATE cannibalize_stock_task SET status = 3,delivery_time=? WHERE id = %d", taskId)
err = orm.Eloquent.Exec(sql, time.Now()).Error
if err != nil {
logger.Error("update status err", logger.Field("err", err))
}
}
return nil
}
func CannibalizePutInStorage(taskId uint32) error {
var cannibalizeTask CannibalizeStockTask
err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error
if err != nil {
logger.Error("cannibalize task err:", logger.Field("err", err))
return err
}
if cannibalizeTask.Status != CannibalizeTaskStatusDeliveredGoods {
return errors.New("cannibalize task status err")
}
var cannibalizeGoodses []CannibalizeGameCardGoods
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:", logger.Field("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 = orm.Eloquent.Table("game_card_goods").Where("serial_number in (?)", serials).Find(&list).Error
if err != nil {
logger.Error(err.Error())
return err
}
for i, _ := range list {
if list[i].Status != 4 {
continue
}
//if CannibalizeUserShareCardRetrieve(cannibalizeTask.ToStoreId, list[i]) {
// continue
//}
var count int64
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.Error())
continue
}
begin := orm.Eloquent.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.Errorf(err.Error())
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.Errorf(err.Error())
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.Errorf(err.Error())
continue
}
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("commit err:", logger.Field("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 = orm.Eloquent.Exec(sql, time.Now()).Error
if err != nil {
logger.Error("update status err", logger.Field("err", err))
}
}
return nil
}
//func CannibalizeUserShareCardRetrieve(storeId uint32, cardGoods GameCardGoods) bool {
// var retrieveCard ShareCardRetrieveCard
// err := orm.Eloquent.Table("share_card_retrieve_card").Where("game_card_id=?", cardGoods.GameCardId).
// Where("store_id=?", storeId).Where("state", RetrieveStateOutStock).Order("id DESC").
// Limit(1).Find(&retrieveCard).Error
// if err != nil {
// logger.Error("share card retrieve card err:", err)
// return false
// }
// //var outStockCount int64
// //err = orm.Eloquent.Table("share_card_retrieve_card").Where("share_card_retrieve_id=?", retrieveCard.ShareCardRetrieveId).
// // Where("id!=?", retrieveCard.ID).Where("state", RetrieveStateOutStock).Count(&outStockCount).Error
// //if err != nil {
// // logger.Error("out stock count err:", err)
// // return false
// //}
// var retrieveCardList []ShareCardRetrieveCard
// err = orm.Eloquent.Table("share_card_retrieve_card").
// Where("share_card_retrieve_id=?", retrieveCard.ShareCardRetrieveId).Find(&retrieveCardList).Error
// if err != nil {
// logger.Error("share card retrieve cards err:", err)
// return false
// }
// isHaveOutStock := 1
// for i, _ := range retrieveCardList {
// if retrieveCardList[i].ID != retrieveCard.ID && retrieveCardList[i].State == RetrieveStateOutStock {
// isHaveOutStock = 2
// }
// }
// begin := orm.Eloquent.Begin()
// err = begin.Table("game_card_goods").Where("id=?)", cardGoods.ID).Updates(map[string]interface{}{
// "status": 5,
// }).Error
// if err != nil {
// begin.Rollback()
// logger.Error("update share card retrieve card err:", err)
// return false
// }
// err = begin.Table("share_card_retrieve_card").Where("id=?", retrieveCard.ID).Updates(map[string]interface{}{
// //"state": RetrieveStateInSendCard,
// "state": RetrieveStateInReceiveCard,
// "retrieve_serial_number": cardGoods.SerialNumber,
// "retrieve_game_card_goods_id": cardGoods.ID,
// }).Error
// if err != nil {
// begin.Rollback()
// logger.Error("update share card retrieve err:", err)
// return false
// }
//
// err = begin.Table("user_share_card").Where("id=?", retrieveCard.UserShareCardId).Updates(map[string]interface{}{
// "state": ShareCardBillStateReceivedCard,
// "retrieve_serial_number": cardGoods.SerialNumber,
// "retrieve_game_card_goods_id": cardGoods.ID,
// }).Error
// if err != nil {
// begin.Rollback()
// logger.Error("update share card retrieve err:", err)
// return false
// }
// if isHaveOutStock == 2 {
// err = begin.Table("share_card_retrieve").Where("id=?", retrieveCard.ShareCardRetrieveId).Updates(map[string]interface{}{
// //"state": RetrieveStateInSendCard,
// "state": RetrieveStateInReceiveCard,
// }).Error
// if err != nil {
// begin.Rollback()
// logger.Error("update share card retrieve card err:", err)
// return false
// }
// }
// err = begin.Commit().Error
// if err != nil {
// begin.Rollback()
// logger.Error("commit err:", err)
// return false
// }
// return true
//}
type CannibalizeTaskGameCardGoodsListReq struct {
PageNum int `json:"pageIndex"`
PageSize int `json:"pageSize"`
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
}
type CannibalizeTaskGameCardGoodsListResp struct {
PageSize int `json:"pageSize"`
List []CannibalizeGameCardGoods `json:"list"`
Count int `json:"count"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
}
func (m *CannibalizeTaskGameCardGoodsListReq) GetCannibalizeTaskGameCardGoodsList() (*CannibalizeTaskGameCardGoodsListResp, error) {
resp := &CannibalizeTaskGameCardGoodsListResp{
PageIndex: m.PageNum,
PageSize: m.PageSize,
}
qs := orm.Eloquent.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.Error())
return resp, err
}
resp.Count = int(count)
resp.List = CannibalizeGameCardGoodsSetInfo(cannibalizeGoodses)
return resp, nil
}
func CannibalizeGameCardGoodsSetInfo(goodses []CannibalizeGameCardGoods) []CannibalizeGameCardGoods {
if len(goodses) == 0 {
return goodses
}
ids := make([]uint32, 0)
for i, _ := range goodses {
ids = append(ids, goodses[i].GameCardId)
}
var gameCards []GameCard
err := orm.Eloquent.Table("game_card").Where("id IN (?)", ids).Find(&gameCards).Error
if err != nil {
logger.Error(err.Error())
return goodses
}
gameCardMap := make(map[uint32]GameCard, 0)
for i, _ := range gameCards {
gameCardMap[gameCards[i].ID] = gameCards[i]
}
for i, _ := range goodses {
v, ok := gameCardMap[goodses[i].GameCardId]
if ok {
goodses[i].GameCardName = v.Name
}
}
return goodses
}
func CannibalizeTaskDel(taskId uint32) error {
var cannibalizeTask CannibalizeStockTask
err := orm.Eloquent.Table("cannibalize_stock_task").Where("id = ?", taskId).Find(&cannibalizeTask).Error
if err != nil {
logger.Error("cannibalize task err:", logger.Field("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 = orm.Eloquent.Exec(sql).Error
if err != nil {
logger.Error("update status err:", logger.Field("err", err))
}
return nil
}
func (m *GameCardGoodsStock) AddStock(begin *gorm.DB) error {
if begin == nil {
begin = orm.Eloquent
}
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;", m.StoreId, m.GameCardId)
fmt.Println("sql:", sql)
err := begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
return err
}
return nil
}
func (m *GameCardGoodsStock) SubStock(begin *gorm.DB) error {
if begin == nil {
begin = orm.Eloquent
}
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;", m.StoreId, m.GameCardId)
fmt.Println("sql:", sql)
err := begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Errorf(err.Error())
return err
}
return nil
}
func CooperativeExportGoodsStock(storeIds []uint32, business CooperativeBusiness) string {
var games []GameCard
err := orm.Eloquent.Table("game_card").Order("id DESC").Find(&games).Error
if err != nil {
logger.Error(err.Error())
return ""
}
fileName := business.Name
if len(storeIds) == 1 {
var store Store
err = orm.Eloquent.Table("store").Where("id", storeIds[0]).Order("id DESC").Find(&store).Error
if err != nil {
logger.Error(err.Error())
return ""
}
fileName = store.Name
}
storeInfo, err := CooperativeGoodsStockStoreInfo(games, storeIds)
if err != nil {
logger.Error(err.Error())
return ""
}
return GoodsStockFile(storeInfo, fileName)
}
func CooperativeGoodsStockStoreInfo(gameCards []GameCard, storeIds []uint32) ([]ExportGoods, error) {
goodsData := make([]ExportGoods, 0, len(gameCards))
cardStocks := make([]GameCardGoodsStock, 0)
err := orm.Eloquent.Table("game_card_goods_stock").Where("store_id in (?)", storeIds).Order("id DESC").Find(&cardStocks).Error
if err != nil {
logger.Error(err.Error())
return goodsData, err
}
cardStockMap := make(map[uint64]GameCardGoodsStock, 0)
for i, _ := range cardStocks {
cardStockMap[cardStocks[i].GameCardId] = cardStocks[i]
}
cardGoods := make([]GameCardGoods, 0)
err = orm.Eloquent.Table("game_card_goods").Where("store_id in (?)", storeIds).Order("id DESC").Find(&cardGoods).Error
if err != nil {
logger.Error(err.Error())
return goodsData, err
}
cardGoodsMap := make(map[uint64][]GameCardGoods, 0)
for i, _ := range cardGoods {
cardGoodsMap[cardGoods[i].GameCardId] = append(cardGoodsMap[cardGoods[i].GameCardId], cardGoods[i])
}
for _, game := range gameCards {
cardStock, ok1 := cardStockMap[uint64(game.ID)]
gameCardGoods, ok2 := cardGoodsMap[uint64(game.ID)]
if !ok1 || !ok2 {
continue
}
exportGoods := &ExportGoods{
GoodsName: game.Name,
//CardPool: cardStock.StoreStock,
RentStock: cardStock.RentStock,
OrderCount: cardStock.OrderCount,
Goods: gameCardGoods,
}
exportGoods.CardPool = uint32(len(gameCardGoods))
for i, _ := range gameCardGoods {
if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
exportGoods.PlayerHold += 1
}
}
if uint32(len(gameCardGoods)) > exportGoods.RentStock+exportGoods.PlayerHold {
exportGoods.DelayDeliverGameCard = uint32(len(gameCardGoods)) - exportGoods.RentStock - exportGoods.PlayerHold
}
goodsData = append(goodsData, *exportGoods)
}
return goodsData, err
}
type CooperativeExportMemberPromotionReq struct {
CooperativeBusinessId uint32 `json:"cooperative_business_id"`
StoreId uint32 `json:"store_id"`
Date string `json:"date"`
}
func (r *CooperativeExportMemberPromotionReq) Export() string {
storeIds := []uint32{r.StoreId}
fileName := ""
if r.StoreId == 0 {
ids, err := GetStoreIdsByCooperativeBusinessId(r.CooperativeBusinessId)
if err != nil {
logger.Error("get store ids err:", logger.Field("err", err))
return ""
}
var cooperativeBusiness CooperativeBusiness
err = orm.Eloquent.Table("cooperative_business").Where("id=?", r.CooperativeBusinessId).
Find(&cooperativeBusiness).Error
if err != nil {
logger.Error("cooperative business err:", logger.Field("err", err))
return ""
}
fileName = cooperativeBusiness.Name
storeIds = ids
}
var memberReports []InviteMemberReport
err := orm.Eloquent.Table("invite_member_report").Where("store_id in (?)", storeIds).
Where("date=?", r.Date).Order("store_id DESC").Find(&memberReports).Error
if err != nil && err != RecordNotFound {
logger.Error("invite member report err:", logger.Field("err", err))
return ""
}
var assistants []UserInfo
err = orm.Eloquent.Table("user").Where("store_id in (?)", storeIds).
Order("store_id DESC").Find(&assistants).Error
if err != nil && err != RecordNotFound {
logger.Error("invite member report err:", logger.Field("err", err))
return ""
}
//assistantsMap := make(map[uint32]*UserInfo, 0)
//for i, _ := range assistants {
// assistantsMap[assistants[i].Uid] = &assistants[i]
//}
memberReportMap := make(map[uint32]*InviteMemberReport, 0)
for i, _ := range memberReports {
memberReportMap[memberReports[i].Uid] = &memberReports[i]
}
list := make([]InviteMemberReport, 0, len(assistants))
for i, _ := range assistants {
v, ok := memberReportMap[assistants[i].Uid]
if ok {
list = append(list, *v)
} else {
list = append(list, InviteMemberReport{
Uid: assistants[i].Uid,
StoreId: uint32(assistants[i].StoreId),
})
}
}
list = InviteMemberReportListSetUser(list)
list = InviteMemberReportListSetStore(list)
//if len(storeIds) == 1 {
// var store Store
// err = orm.Eloquent.Table("store").Where("id", storeIds[0]).Order("id DESC").Find(&store).Error
// if err != nil {
// logger.Error(err.Error())
// return ""
// }
// fileName = store.Name
//}
//
//storeInfo, err := CooperativeGoodsStockStoreInfo(games, storeIds)
//if err != nil {
// logger.Error(err.Error())
// return ""
//}
return MemberReportFile(list, fileName)
}
func MemberReportFile(memberReports []InviteMemberReport, fileName string) string {
file := excelize.NewFile()
streamWriter, err := file.NewStreamWriter("Sheet1")
if err != nil {
fmt.Println(err)
}
//url := "http://39.108.188.218:8000/img/export/"
fileName = time.Now().Format(TimeFormat) + fileName + ".xlsx"
title := []interface{}{"门店id", "门店名称", "店员id", "店员名称", "黄金会员数量", "白金会员数量", "黑金会员数量"}
cell, _ := excelize.CoordinatesToCellName(1, 1)
if err = streamWriter.SetRow(cell, title); err != nil {
fmt.Println(err)
}
var row []interface{}
for rowId := 0; rowId < len(memberReports); rowId++ {
row = []interface{}{fmt.Sprintf("%d", memberReports[rowId].Store.ID), memberReports[rowId].Store.Name,
fmt.Sprintf("%d", memberReports[rowId].UserInfo.Uid), memberReports[rowId].UserInfo.ShopAssistantName,
fmt.Sprintf("%d", memberReports[rowId].GoldCount), fmt.Sprintf("%d", memberReports[rowId].PlatinumCount),
fmt.Sprintf("%d", memberReports[rowId].BlackGoldCount)}
cell, _ := excelize.CoordinatesToCellName(1, rowId+2)
if err := streamWriter.SetRow(cell, row); err != nil {
fmt.Println(err)
}
}
if err := streamWriter.Flush(); err != nil {
fmt.Println(err)
}
if err := file.SaveAs("/www/server/images/export/" + fileName); err != nil {
//if err := file.SaveAs("./" + fileName); err != nil {
fmt.Println(err)
}
return ExportUrl + fileName
}