game_sync/statistics/syn/log_itemgain.go

62 lines
1.7 KiB
Go

package syn
import (
"errors"
"time"
"gorm.io/gorm"
"mongo.games.com/goserver/core/mongox"
mongomodel "mongo.games.com/game/statistics/modelmongo"
mysqlmodel "mongo.games.com/game/statistics/modelmysql"
)
func ItemGainDone(data *Data[mongomodel.ItemLog]) error {
data.MidType = mysqlmodel.MidTypeItem
data.Database = string(mongox.DatabaseLog)
data.CollectionName = mongomodel.LogItem
data.F = func(data *mongomodel.ItemLog, db *gorm.DB) (string, error) {
if data == nil || data.LogId.Hex() == "" {
return "", errors.New("null")
}
if data.LogType != 0 || data.Id != "" {
return data.LogId.Hex(), nil
}
hourTime := time.Unix(data.CreateTs, 0).Local()
hourTs := time.Date(hourTime.Year(), hourTime.Month(), hourTime.Day(), hourTime.Hour(), 0, 0, 0, time.Local).Unix()
item := &mysqlmodel.ItemGain{}
err := db.Model(item).Where("hour = ? and item_id = ?", hourTs, data.ItemId).First(item).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return "", err
}
item.Hour = hourTs
item.ItemId = data.ItemId
item.ItemNum += data.Count
if item.ID == 0 {
err = db.Create(item).Error
} else {
err = db.Model(item).Updates(item).Error
}
if err != nil {
return "", err
}
itemTotal := &mysqlmodel.ItemTotalGain{}
err = db.Model(itemTotal).Where("item_id = ?", data.ItemId).First(itemTotal).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return "", err
}
itemTotal.ItemId = data.ItemId
itemTotal.ItemNum += data.Count
if itemTotal.ID == 0 {
err = db.Create(itemTotal).Error
} else {
err = db.Model(itemTotal).Updates(itemTotal).Error
}
return data.LogId.Hex(), err
}
return data.CommonDone()
}