mirror of
https://github.com/genxium/DelayNoMore
synced 2024-12-26 19:58:56 +00:00
131 lines
3.5 KiB
Go
131 lines
3.5 KiB
Go
package models
|
|
|
|
import (
|
|
. "battle_srv/common"
|
|
"battle_srv/common/utils"
|
|
"database/sql"
|
|
. "dnmshared"
|
|
"errors"
|
|
|
|
sq "github.com/Masterminds/squirrel"
|
|
"github.com/jmoiron/sqlx"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type PlayerWallet struct {
|
|
CreatedAt int64 `json:"-" db:"created_at"`
|
|
DeletedAt NullInt64 `json:"-" db:"deleted_at"`
|
|
Gem int `json:"gem" db:"gem"`
|
|
ID int `json:"-" db:"id"`
|
|
UpdatedAt int64 `json:"-" db:"updated_at"`
|
|
}
|
|
|
|
func (p *PlayerWallet) Insert(tx *sqlx.Tx) error {
|
|
_, err := txInsert(tx, "player_wallet", []string{"id", "created_at", "updated_at"},
|
|
[]interface{}{p.ID, p.CreatedAt, p.UpdatedAt})
|
|
return err
|
|
}
|
|
|
|
func GetPlayerWalletById(id int) (*PlayerWallet, error) {
|
|
var p PlayerWallet
|
|
err := getObj("player_wallet", sq.Eq{"id": id, "deleted_at": nil}, &p)
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return &p, nil
|
|
}
|
|
|
|
func CostPlayerWallet(tx *sqlx.Tx, id int, currency int, val int) (int, error) {
|
|
var column string
|
|
switch currency {
|
|
case Constants.Player.Diamond:
|
|
column = "diamond"
|
|
case Constants.Player.Energy:
|
|
column = "energy"
|
|
case Constants.Player.Gold:
|
|
column = "gold"
|
|
}
|
|
if column == "" {
|
|
Logger.Debug("CostPlayerWallet Error Currency",
|
|
zap.Int("currency", currency), zap.Int("val", val))
|
|
return Constants.RetCode.MysqlError, errors.New("error currency")
|
|
}
|
|
|
|
now := utils.UnixtimeMilli()
|
|
query, args, err := sq.Update("player_wallet").
|
|
Set(column, sq.Expr(column+"-?", val)).Set("updated_at", now).
|
|
Where(sq.Eq{"id": id, "deleted_at": nil}).
|
|
Where(sq.GtOrEq{column: val}).ToSql()
|
|
|
|
Logger.Debug("CostPlayerWallet", zap.String("sql", query), zap.Any("args", args))
|
|
if err != nil {
|
|
return Constants.RetCode.MysqlError, err
|
|
}
|
|
result, err := tx.Exec(query, args...)
|
|
if err != nil {
|
|
return Constants.RetCode.MysqlError, err
|
|
}
|
|
rowsAffected, err := result.RowsAffected()
|
|
if err != nil {
|
|
return Constants.RetCode.MysqlError, err
|
|
}
|
|
ok := rowsAffected >= 1
|
|
Logger.Debug("CostPlayerWallet", zap.Int64("rowsAffected", rowsAffected),
|
|
zap.Bool("cost", ok))
|
|
if !ok {
|
|
var ret int
|
|
switch currency {
|
|
case Constants.Player.Diamond:
|
|
ret = Constants.RetCode.LackOfDiamond
|
|
case Constants.Player.Energy:
|
|
ret = Constants.RetCode.LackOfEnergy
|
|
case Constants.Player.Gold:
|
|
ret = Constants.RetCode.LackOfGold
|
|
}
|
|
return ret, nil
|
|
}
|
|
return 0, nil
|
|
}
|
|
|
|
func AddPlayerWallet(tx *sqlx.Tx, id int, currency int, val int) (int, error) {
|
|
var column string
|
|
switch currency {
|
|
case Constants.Player.Diamond:
|
|
column = "diamond"
|
|
case Constants.Player.Energy:
|
|
column = "energy"
|
|
case Constants.Player.Gold:
|
|
column = "gold"
|
|
}
|
|
if column == "" {
|
|
Logger.Debug("CostPlayerWallet Error Currency",
|
|
zap.Int("currency", currency), zap.Int("val", val))
|
|
return Constants.RetCode.MysqlError, errors.New("error currency")
|
|
}
|
|
|
|
now := utils.UnixtimeMilli()
|
|
query, args, err := sq.Update("player_wallet").
|
|
Set(column, sq.Expr(column+"+?", val)).Set("updated_at", now).
|
|
Where(sq.Eq{"id": id, "deleted_at": nil}).ToSql()
|
|
|
|
Logger.Debug("AddPlayerWallet", zap.String("sql", query), zap.Any("args", args))
|
|
if err != nil {
|
|
return Constants.RetCode.MysqlError, err
|
|
}
|
|
result, err := tx.Exec(query, args...)
|
|
if err != nil {
|
|
return Constants.RetCode.MysqlError, err
|
|
}
|
|
rowsAffected, err := result.RowsAffected()
|
|
if err != nil {
|
|
return Constants.RetCode.MysqlError, err
|
|
}
|
|
ok := rowsAffected >= 1
|
|
Logger.Debug("AddPlayerWallet", zap.Int64("rowsAffected", rowsAffected),
|
|
zap.Bool("add", ok))
|
|
if !ok {
|
|
return Constants.RetCode.UnknownError, nil
|
|
}
|
|
return 0, nil
|
|
}
|