增加提取castile到游戏的逻辑。
This commit is contained in:
@@ -17,26 +17,22 @@ service novatask {
|
|||||||
|
|
||||||
type TransferCastileToGameReq {
|
type TransferCastileToGameReq {
|
||||||
RoleID int64 `json:"role_id"` // 角色id
|
RoleID int64 `json:"role_id"` // 角色id
|
||||||
Amount int64 `json:"amount"` // 数量
|
Amount int64 `json:"amount,range=[1:]"` // 数量
|
||||||
}
|
|
||||||
|
|
||||||
type TransferCastileToGameResp {
|
|
||||||
TransferToGameLog
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferCastileToGameListReq {
|
type TransferCastileToGameListReq {
|
||||||
RoleID int64 `json:"role_id,optional"` // 角色id
|
RoleID int64 `json:"role_id,optional"` // 角色id
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferToGameLog {
|
type TransferCastileToGameResp {
|
||||||
Id int `json:"id"` // id
|
Id int `json:"id"` // id
|
||||||
RoleID int64 `json:"role_id"` // 角色id
|
RoleID int64 `json:"role_id"` // 角色id
|
||||||
Amount int64 `json:"amount"` // 数量
|
Amount int64 `json:"amount"` // 数量
|
||||||
Status string `json:"elf_name"` // 状态
|
Status int64 `json:"status"` // 状态
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferCastileToGameListResp {
|
type TransferCastileToGameListResp {
|
||||||
Total int `json:"total"` // 总数
|
Total int `json:"total"` // 总数
|
||||||
List []TransferToGameLog `json:"list"` // 列表
|
List []TransferCastileToGameResp `json:"list"` // 列表
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1945,7 +1945,7 @@
|
|||||||
"list": {
|
"list": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/TransferToGameLog"
|
"$ref": "#/definitions/TransferCastileToGameResp"
|
||||||
},
|
},
|
||||||
"description": " 列表"
|
"description": " 列表"
|
||||||
}
|
}
|
||||||
@@ -1994,42 +1994,18 @@
|
|||||||
"format": "int64",
|
"format": "int64",
|
||||||
"description": " 数量"
|
"description": " 数量"
|
||||||
},
|
},
|
||||||
"elf_name": {
|
"status": {
|
||||||
"type": "string",
|
"type": "integer",
|
||||||
|
"format": "int64",
|
||||||
"description": " 状态"
|
"description": " 状态"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"title": "TransferCastileToGameResp"
|
"title": "TransferCastileToGameResp",
|
||||||
},
|
|
||||||
"TransferToGameLog": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"id": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int32",
|
|
||||||
"description": " id"
|
|
||||||
},
|
|
||||||
"role_id": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int64",
|
|
||||||
"description": " 角色id"
|
|
||||||
},
|
|
||||||
"amount": {
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int64",
|
|
||||||
"description": " 数量"
|
|
||||||
},
|
|
||||||
"elf_name": {
|
|
||||||
"type": "string",
|
|
||||||
"description": " 状态"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title": "TransferToGameLog",
|
|
||||||
"required": [
|
"required": [
|
||||||
"id",
|
"id",
|
||||||
"role_id",
|
"role_id",
|
||||||
"amount",
|
"amount",
|
||||||
"elf_name"
|
"status"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"UnStakeNftReq": {
|
"UnStakeNftReq": {
|
||||||
|
|||||||
@@ -3,4 +3,5 @@ package consts
|
|||||||
const (
|
const (
|
||||||
GameActionGetHomePointsState = "getStakeHomePointsState"
|
GameActionGetHomePointsState = "getStakeHomePointsState"
|
||||||
GameActionStakePoints = "stakeHomePoints"
|
GameActionStakePoints = "stakeHomePoints"
|
||||||
|
GameActionSendNoticeAward = "SendNoticeAward" //给多角色发邮件
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
package transfercastile
|
package transfercastile
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"nova_task/internal/pkg/utils"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/rest/httpx"
|
"github.com/zeromicro/go-zero/rest/httpx"
|
||||||
"nova_task/internal/logic/transfercastile"
|
"nova_task/internal/logic/transfercastile"
|
||||||
@@ -18,8 +22,22 @@ func TransferCastileToGameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uid := utils.GetUidUint(r.Context())
|
||||||
|
redisKey := fmt.Sprintf("transferCastile:uid:%d", uid)
|
||||||
|
//加锁
|
||||||
|
lock, err := svcCtx.Redis.SetnxEx(redisKey, time.Now().String(), 120)
|
||||||
|
if !lock || err != nil {
|
||||||
|
httpx.ErrorCtx(r.Context(), w, errors.New("operation frequently"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
l := transfercastile.NewTransferCastileToGameLogic(r.Context(), svcCtx)
|
l := transfercastile.NewTransferCastileToGameLogic(r.Context(), svcCtx)
|
||||||
|
|
||||||
resp, err := l.TransferCastileToGame(&req)
|
resp, err := l.TransferCastileToGame(&req)
|
||||||
|
|
||||||
|
//删除redis KEY
|
||||||
|
_, _ = svcCtx.Redis.Del(redisKey)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
httpx.ErrorCtx(r.Context(), w, err)
|
httpx.ErrorCtx(r.Context(), w, err)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -2,11 +2,16 @@ package transfercastile
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
|
"github.com/zeromicro/go-zero/core/jsonx"
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||||
|
"nova_task/internal/consts"
|
||||||
|
"nova_task/internal/model"
|
||||||
|
"nova_task/internal/pkg/errs"
|
||||||
|
"nova_task/internal/pkg/utils"
|
||||||
"nova_task/internal/svc"
|
"nova_task/internal/svc"
|
||||||
"nova_task/internal/types"
|
"nova_task/internal/types"
|
||||||
|
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TransferCastileToGameLogic struct {
|
type TransferCastileToGameLogic struct {
|
||||||
@@ -25,7 +30,117 @@ func NewTransferCastileToGameLogic(ctx context.Context, svcCtx *svc.ServiceConte
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *TransferCastileToGameLogic) TransferCastileToGame(req *types.TransferCastileToGameReq) (resp *types.TransferCastileToGameResp, err error) {
|
func (l *TransferCastileToGameLogic) TransferCastileToGame(req *types.TransferCastileToGameReq) (resp *types.TransferCastileToGameResp, err error) {
|
||||||
// todo: add your logic here and delete this line
|
|
||||||
|
|
||||||
return
|
//获取JWT中的UID
|
||||||
|
uid := utils.GetUidUint(l.ctx)
|
||||||
|
|
||||||
|
//验证是否当前用户的角色
|
||||||
|
r, err := l.svcCtx.RoleModel.FindOneByRoleId(l.ctx, req.RoleID)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, model.ErrNotFound) {
|
||||||
|
return nil, errs.New(errs.ErrRoleNotFound, "role not exist")
|
||||||
|
}
|
||||||
|
l.Errorw("find role error", logx.Field("err", err), logx.Field("role_id", req.RoleID), logx.Field("uid", uid))
|
||||||
|
return nil, errs.New(errs.ErrDatabaseOperate, err)
|
||||||
|
}
|
||||||
|
u, err := l.svcCtx.UserModel.FindOneByEmail(l.ctx, r.Account)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, model.ErrNotFound) {
|
||||||
|
return nil, errs.New(errs.ErrUserNotFound, "user not found")
|
||||||
|
}
|
||||||
|
l.Errorw("find user error", logx.Field("err", err), logx.Field("role_id", req.RoleID), logx.Field("uid", uid))
|
||||||
|
return nil, errs.New(errs.ErrDatabaseOperate, err)
|
||||||
|
}
|
||||||
|
if u.Id != uid {
|
||||||
|
return nil, errs.New(errs.ErrRoleNotFound, "role not exist.")
|
||||||
|
}
|
||||||
|
|
||||||
|
cToken, err := l.svcCtx.CastileTokenModel.FindOneByEmail(l.ctx, r.Account)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, model.ErrNotFound) {
|
||||||
|
return nil, errs.New(errs.ErrPointLevelConfigNotFound, "castile record is not exists")
|
||||||
|
}
|
||||||
|
return nil, errs.New(errs.ErrDatabaseOperate, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
//判断余额
|
||||||
|
remain := int(cToken.Total) - int(cToken.Transfer) - int(req.Amount)
|
||||||
|
if remain < 0 {
|
||||||
|
return nil, errs.New(errs.ErrInsufficientCastile, "castile insufficient")
|
||||||
|
}
|
||||||
|
|
||||||
|
lastId := int64(0)
|
||||||
|
|
||||||
|
err = l.svcCtx.DBConn.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error {
|
||||||
|
|
||||||
|
err := l.svcCtx.CastileTokenModel.WithSession(session).UpdateTransferIncrease(ctx, uint(req.Amount), cToken.Id)
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorw("castile 余额更新失败", logx.Field("err", err), logx.Field("id", cToken.Id), logx.Field("roleId", req.RoleID))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := l.svcCtx.CastileTokenLogModel.WithSession(session).Insert(ctx, &model.NhCastileTokenLog{
|
||||||
|
Uid: u.Id,
|
||||||
|
RoleId: uint64(req.RoleID),
|
||||||
|
Amount: uint(req.Amount),
|
||||||
|
Action: 1,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorw("castile 日志插入失败", logx.Field("err", err), logx.Field("id", cToken.Id), logx.Field("roleId", req.RoleID))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
lastId, err = res.LastInsertId()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorw("castile 更新的事务报错", logx.Field("err", err), logx.Field("id", cToken.Id), logx.Field("roleId", req.RoleID))
|
||||||
|
return nil, errs.New(errs.ErrDatabaseOperate, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
itemList := []map[string]any{
|
||||||
|
{
|
||||||
|
"itemId": 32110,
|
||||||
|
"itemCount": 20,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
data, _ := jsonx.MarshalToString(itemList)
|
||||||
|
|
||||||
|
//给多角色发邮件
|
||||||
|
_, err = l.svcCtx.GameAction(l.ctx, int64(req.RoleID), consts.GameActionSendNoticeAward, map[string]any{
|
||||||
|
"role_ids": req.RoleID,
|
||||||
|
"item_list": data,
|
||||||
|
"template_id": 120338,
|
||||||
|
"mail_ttl": 24 * 90,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorw("game 发送邮件失败", logx.Field("err", err), logx.Field("roleId", req.RoleID))
|
||||||
|
return nil, errs.New(errs.ErrInternalServer, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := l.svcCtx.CastileTokenLogModel.FindOne(l.ctx, uint(lastId))
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorw("查询 castile 日志表出错", logx.Field("err", err), logx.Field("Id", lastId))
|
||||||
|
return nil, errs.New(errs.ErrInternalServer, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
//更新状态
|
||||||
|
res.CallbackStatus = 1
|
||||||
|
err = l.svcCtx.CastileTokenLogModel.Update(l.ctx, res)
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorw("更新 castile 日志表状态出错", logx.Field("err", err), logx.Field("Id", lastId))
|
||||||
|
return nil, errs.New(errs.ErrInternalServer, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.TransferCastileToGameResp{
|
||||||
|
Id: int(res.Id),
|
||||||
|
RoleID: int64(res.RoleId),
|
||||||
|
Amount: int64(res.Amount),
|
||||||
|
Status: int64(res.CallbackStatus),
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "github.com/zeromicro/go-zero/core/stores/sqlx"
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||||
|
)
|
||||||
|
|
||||||
var _ NhCastileTokenLogModel = (*customNhCastileTokenLogModel)(nil)
|
var _ NhCastileTokenLogModel = (*customNhCastileTokenLogModel)(nil)
|
||||||
|
|
||||||
@@ -9,7 +13,8 @@ type (
|
|||||||
// and implement the added methods in customNhCastileTokenLogModel.
|
// and implement the added methods in customNhCastileTokenLogModel.
|
||||||
NhCastileTokenLogModel interface {
|
NhCastileTokenLogModel interface {
|
||||||
nhCastileTokenLogModel
|
nhCastileTokenLogModel
|
||||||
withSession(session sqlx.Session) NhCastileTokenLogModel
|
WithSession(session sqlx.Session) NhCastileTokenLogModel
|
||||||
|
UpdateStatus(ctx context.Context, status uint, id uint) error
|
||||||
}
|
}
|
||||||
|
|
||||||
customNhCastileTokenLogModel struct {
|
customNhCastileTokenLogModel struct {
|
||||||
@@ -24,6 +29,12 @@ func NewNhCastileTokenLogModel(conn sqlx.SqlConn) NhCastileTokenLogModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *customNhCastileTokenLogModel) withSession(session sqlx.Session) NhCastileTokenLogModel {
|
func (m *customNhCastileTokenLogModel) WithSession(session sqlx.Session) NhCastileTokenLogModel {
|
||||||
return NewNhCastileTokenLogModel(sqlx.NewSqlConnFromSession(session))
|
return NewNhCastileTokenLogModel(sqlx.NewSqlConnFromSession(session))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *customNhCastileTokenLogModel) UpdateStatus(ctx context.Context, status uint, id uint) error {
|
||||||
|
query := fmt.Sprintf("update %s set `callback_status` = ? where `id` = ?", m.table)
|
||||||
|
_, err := m.conn.ExecCtx(ctx, query, status, id)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "github.com/zeromicro/go-zero/core/stores/sqlx"
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||||
|
)
|
||||||
|
|
||||||
var _ NhCastileTokenModel = (*customNhCastileTokenModel)(nil)
|
var _ NhCastileTokenModel = (*customNhCastileTokenModel)(nil)
|
||||||
|
|
||||||
@@ -9,7 +13,8 @@ type (
|
|||||||
// and implement the added methods in customNhCastileTokenModel.
|
// and implement the added methods in customNhCastileTokenModel.
|
||||||
NhCastileTokenModel interface {
|
NhCastileTokenModel interface {
|
||||||
nhCastileTokenModel
|
nhCastileTokenModel
|
||||||
withSession(session sqlx.Session) NhCastileTokenModel
|
WithSession(session sqlx.Session) NhCastileTokenModel
|
||||||
|
UpdateTransferIncrease(ctx context.Context, reduce uint, id uint) error
|
||||||
}
|
}
|
||||||
|
|
||||||
customNhCastileTokenModel struct {
|
customNhCastileTokenModel struct {
|
||||||
@@ -24,6 +29,12 @@ func NewNhCastileTokenModel(conn sqlx.SqlConn) NhCastileTokenModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *customNhCastileTokenModel) withSession(session sqlx.Session) NhCastileTokenModel {
|
func (m *customNhCastileTokenModel) WithSession(session sqlx.Session) NhCastileTokenModel {
|
||||||
return NewNhCastileTokenModel(sqlx.NewSqlConnFromSession(session))
|
return NewNhCastileTokenModel(sqlx.NewSqlConnFromSession(session))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *customNhCastileTokenModel) UpdateTransferIncrease(ctx context.Context, num uint, id uint) error {
|
||||||
|
query := fmt.Sprintf("update %s set `transfer` = `transfer` + ? where `id` = ?", m.table)
|
||||||
|
_, err := m.conn.ExecCtx(ctx, query, num, id)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,14 +10,15 @@ const (
|
|||||||
ErrOverload Reason = 10403 // 请求超载
|
ErrOverload Reason = 10403 // 请求超载
|
||||||
|
|
||||||
// ======= 服务器内部错误:1000~9999 =======
|
// ======= 服务器内部错误:1000~9999 =======
|
||||||
ErrInternalServer Reason = 1000 // 未知的服务器内部错误
|
ErrInternalServer Reason = 1000 // 未知的服务器内部错误
|
||||||
ErrDatabaseOperate Reason = 1001 // 数据库错误
|
ErrDatabaseOperate Reason = 1001 // 数据库错误
|
||||||
ErrRedisOperate Reason = 1002 // redis错误
|
ErrRedisOperate Reason = 1002 // redis错误
|
||||||
ErrEncodePassword Reason = 1003 // 密码加密错误
|
ErrEncodePassword Reason = 1003 // 密码加密错误
|
||||||
ErrGenerateUUid Reason = 1004 // 生成uuid错误
|
ErrGenerateUUid Reason = 1004 // 生成uuid错误
|
||||||
ErrGenerateToken Reason = 1005 // 生成token错误
|
ErrGenerateToken Reason = 1005 // 生成token错误
|
||||||
ErrSystemConfig Reason = 1006 // 系统配置错误
|
ErrSystemConfig Reason = 1006 // 系统配置错误
|
||||||
GameServerError Reason = 1007 // 游戏服务器错误
|
GameServerError Reason = 1007 // 游戏服务器错误
|
||||||
|
ErrOperationFrequently Reason = 1008 // 游戏服务器错误
|
||||||
|
|
||||||
// ======= 业务层错误:20000~29999 =======
|
// ======= 业务层错误:20000~29999 =======
|
||||||
ErrUnknownLogicError Reason = 20000 // 未知的业务错误
|
ErrUnknownLogicError Reason = 20000 // 未知的业务错误
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ func (s *ServiceContext) GameAction(ctx context.Context, roleId int64, action st
|
|||||||
s.ErrLog(ctx, action, addr, serverInfo, request, resp)
|
s.ErrLog(ctx, action, addr, serverInfo, request, resp)
|
||||||
return resp, fmt.Errorf("game action msg= %s, data=%v", cast.ToString(resp["msg"]), cast.ToString(resp["data"]))
|
return resp, fmt.Errorf("game action msg= %s, data=%v", cast.ToString(resp["msg"]), cast.ToString(resp["data"]))
|
||||||
}
|
}
|
||||||
|
s.ErrLog(ctx, action, addr, serverInfo, request, resp)
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ type dbModel struct {
|
|||||||
StakePointConfigModel model.NhStakeHomePointConfigModel
|
StakePointConfigModel model.NhStakeHomePointConfigModel
|
||||||
StakePointsModel model.NhStakePointsModel
|
StakePointsModel model.NhStakePointsModel
|
||||||
StakePointsLogModel model.NhStakePointsLogModel
|
StakePointsLogModel model.NhStakePointsLogModel
|
||||||
|
|
||||||
|
CastileTokenModel model.NhCastileTokenModel
|
||||||
|
CastileTokenLogModel model.NhCastileTokenLogModel
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDBModel(dbConn, gameConn sqlx.SqlConn, configModel model.NhSystemConfigModel) *dbModel {
|
func newDBModel(dbConn, gameConn sqlx.SqlConn, configModel model.NhSystemConfigModel) *dbModel {
|
||||||
@@ -82,5 +85,8 @@ func newDBModel(dbConn, gameConn sqlx.SqlConn, configModel model.NhSystemConfigM
|
|||||||
MergeServerModel: model.NewMsMergeServersModel(gameConn),
|
MergeServerModel: model.NewMsMergeServersModel(gameConn),
|
||||||
GameServerModel: model.NewMsGameServerModel(gameConn),
|
GameServerModel: model.NewMsGameServerModel(gameConn),
|
||||||
ServersModel: model.NewMgServersModel(gameConn),
|
ServersModel: model.NewMgServersModel(gameConn),
|
||||||
|
|
||||||
|
CastileTokenModel: model.NewNhCastileTokenModel(dbConn),
|
||||||
|
CastileTokenLogModel: model.NewNhCastileTokenLogModel(dbConn),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,24 +245,20 @@ type TransferCastileToGameListReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type TransferCastileToGameListResp struct {
|
type TransferCastileToGameListResp struct {
|
||||||
Total int `json:"total"` // 总数
|
Total int `json:"total"` // 总数
|
||||||
List []TransferToGameLog `json:"list"` // 列表
|
List []TransferCastileToGameResp `json:"list"` // 列表
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferCastileToGameReq struct {
|
type TransferCastileToGameReq struct {
|
||||||
RoleID int64 `json:"role_id"` // 角色id
|
RoleID int64 `json:"role_id"` // 角色id
|
||||||
Amount int64 `json:"amount"` // 数量
|
Amount int64 `json:"amount,range=[1:]"` // 数量
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferCastileToGameResp struct {
|
type TransferCastileToGameResp struct {
|
||||||
TransferToGameLog
|
Id int `json:"id"` // id
|
||||||
}
|
RoleID int64 `json:"role_id"` // 角色id
|
||||||
|
Amount int64 `json:"amount"` // 数量
|
||||||
type TransferToGameLog struct {
|
Status int64 `json:"status"` // 状态
|
||||||
Id int `json:"id"` // id
|
|
||||||
RoleID int64 `json:"role_id"` // 角色id
|
|
||||||
Amount int64 `json:"amount"` // 数量
|
|
||||||
Status string `json:"elf_name"` // 状态
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type UnStakeNftReq struct {
|
type UnStakeNftReq struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user