From 9c742c50c3b021f3ebb917e713705654388a15c0 Mon Sep 17 00:00:00 2001 From: lianghuanjie Date: Mon, 20 Jan 2025 21:55:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=B9=E6=9C=97=E6=99=AE=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/api/task.api | 7 +- doc/swagger/nova.json | 42 ++++++-- internal/consts/consts.go | 20 ++++ internal/handler/routes.go | 2 +- .../handler/task/get_task_reward_handler.go | 2 +- .../logic/admin/send_email_reward_logic.go | 2 +- internal/logic/nft/stake_settle_logic.go | 2 +- internal/logic/task/get_task_list_logic.go | 16 +++- internal/logic/task/get_task_reward_logic.go | 22 ++++- .../logic/task/verify_task_result_logic.go | 2 +- .../model/nh_games_property_logs_model.go | 29 ++++++ .../model/nh_games_property_logs_model_gen.go | 96 +++++++++++++++++++ internal/model/nh_role_model.go | 15 +++ internal/model/nh_task_model.go | 1 + internal/model/nh_task_model_gen.go | 8 +- internal/pkg/errs/reason.go | 2 + internal/svc/service_context.go | 21 +++- internal/types/types.go | 9 +- 18 files changed, 266 insertions(+), 32 deletions(-) create mode 100755 internal/model/nh_games_property_logs_model.go create mode 100755 internal/model/nh_games_property_logs_model_gen.go diff --git a/doc/api/task.api b/doc/api/task.api index df37b68..5957e86 100644 --- a/doc/api/task.api +++ b/doc/api/task.api @@ -26,7 +26,7 @@ service novatask { @doc "领取任务奖励" @handler GetTaskReward - get /reward/:id (TaskIdPath) returns (GetTaskRewardResp) + get /reward (GetTaskRewardReq) returns (GetTaskRewardResp) @doc "拉取玩家持有的nft列表" @handler GetNftList @@ -81,8 +81,9 @@ type VerifyTaskResultReq { Params string `form:"params,optional"` // 额外的参数 } -type TaskIdPath { - ID uint `path:"id"` // 任务ID +type GetTaskRewardReq { + ID uint `form:"id"` // 任务ID + RoleId int64 `form:"role_id,optional"` // 游戏角色ID } type VerifyTaskResultResp { diff --git a/doc/swagger/nova.json b/doc/swagger/nova.json index 0df1c1b..fe2ee10 100644 --- a/doc/swagger/nova.json +++ b/doc/swagger/nova.json @@ -571,7 +571,7 @@ ] } }, - "/gapi/task/v1/reward/{id}": { + "/gapi/task/v1/reward": { "get": { "summary": "领取任务奖励", "operationId": "GetTaskReward", @@ -586,14 +586,27 @@ "parameters": [ { "name": "id", - "in": "path", + "description": " 任务ID", + "in": "query", "required": true, - "type": "string" + "type": "integer", + "format": "uint32" + }, + { + "name": "role_id", + "description": " 游戏角色ID", + "in": "query", + "required": false, + "type": "integer", + "format": "int64" } ], "tags": [ "task" ], + "consumes": [ + "multipart/form-data" + ], "security": [ { "apiKey": [] @@ -930,6 +943,25 @@ "tasks" ] }, + "GetTaskRewardReq": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint32", + "description": " 任务ID" + }, + "role_id": { + "type": "integer", + "format": "int64", + "description": " 游戏角色ID" + } + }, + "title": "GetTaskRewardReq", + "required": [ + "id" + ] + }, "GetTaskRewardResp": { "type": "object", "properties": { @@ -1272,10 +1304,6 @@ "finish_state" ] }, - "TaskIdPath": { - "type": "object", - "title": "TaskIdPath" - }, "UnStakeNftReq": { "type": "object", "properties": { diff --git a/internal/consts/consts.go b/internal/consts/consts.go index ac7db69..ed7acd1 100644 --- a/internal/consts/consts.go +++ b/internal/consts/consts.go @@ -22,4 +22,24 @@ const ( AssetType_Keys AssetType = "keys" AssetType_Castile AssetType = "castile" AssetType_Elite_Points AssetType = "elite_points" + AssetType_Property AssetType = "property" ) + +const ( + RewardTypePoints = 0 // 积分 + RewardTypeProperty = 1 // 道具 + RewardCastile = 2 // 代币 +) + +func GetAssetType(rewardType int8) AssetType { + switch rewardType { + case RewardTypePoints: + return AssetType_Points + case RewardTypeProperty: + return AssetType_Property + case RewardCastile: + return AssetType_Castile + default: + return "" + } +} diff --git a/internal/handler/routes.go b/internal/handler/routes.go index e24e226..4f6b06a 100644 --- a/internal/handler/routes.go +++ b/internal/handler/routes.go @@ -172,7 +172,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { { // 领取任务奖励 Method: http.MethodGet, - Path: "/reward/:id", + Path: "/reward", Handler: task.GetTaskRewardHandler(serverCtx), }, { diff --git a/internal/handler/task/get_task_reward_handler.go b/internal/handler/task/get_task_reward_handler.go index ee0bfc0..8f16190 100644 --- a/internal/handler/task/get_task_reward_handler.go +++ b/internal/handler/task/get_task_reward_handler.go @@ -12,7 +12,7 @@ import ( // 领取任务奖励 func GetTaskRewardHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.TaskIdPath + var req types.GetTaskRewardReq if err := httpx.Parse(r, &req); err != nil { httpx.ErrorCtx(r.Context(), w, err) return diff --git a/internal/logic/admin/send_email_reward_logic.go b/internal/logic/admin/send_email_reward_logic.go index a1bad4e..febd939 100644 --- a/internal/logic/admin/send_email_reward_logic.go +++ b/internal/logic/admin/send_email_reward_logic.go @@ -51,7 +51,7 @@ func (l *SendEmailRewardLogic) SendEmailReward() error { continue } - err = l.svcCtx.AddUserAsset(ctx, u.Id, consts.AssetType(rw.RewardType), rw.Value, rw.Remark, 0, 0, false) + err = l.svcCtx.AddUserAsset(ctx, u.Id, 0, consts.AssetType(rw.RewardType), "", rw.Value, rw.Remark, 0, 0, false) if err != nil { l.Errorw("insert task asset record failed", logx.Field("err", err), logx.Field("uid", u.Id), logx.Field("rewardType", rw.RewardType), logx.Field("value", rw.Value)) } diff --git a/internal/logic/nft/stake_settle_logic.go b/internal/logic/nft/stake_settle_logic.go index b4b8a8e..639a5a2 100644 --- a/internal/logic/nft/stake_settle_logic.go +++ b/internal/logic/nft/stake_settle_logic.go @@ -124,7 +124,7 @@ func (l *StakeSettleLogic) StakeSettle(date string) { } // 加资产 - err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uid, consts.AssetType_Castile, reward, "nft软质押奖励", 0, 0, false) + err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uid, 0, consts.AssetType_Castile, "", reward, "nft软质押奖励", 0, 0, false) return err }) diff --git a/internal/logic/task/get_task_list_logic.go b/internal/logic/task/get_task_list_logic.go index c611de0..695c371 100644 --- a/internal/logic/task/get_task_list_logic.go +++ b/internal/logic/task/get_task_list_logic.go @@ -44,7 +44,7 @@ func (l *GetTaskListLogic) GetTaskList(uid int, req *types.GetTaskListReq) (*typ totalCount = cast.ToInt(t.Param) } - resp.Tasks = append(resp.Tasks, types.Task{ + tks := types.Task{ Id: t.Id, Title: t.Title, SubTitle: t.SubTitle, @@ -60,7 +60,12 @@ func (l *GetTaskListLogic) GetTaskList(uid int, req *types.GetTaskListReq) (*typ HasFinishCount: 0, TotalCount: totalCount, FinishState: model.TASK_PROGRESS_NOT_FINISHED, - }) + } + if tks.Type == model.TASKTYPE_TRUMP_HEAD { + tks.Params = t.PropertyId + } + + resp.Tasks = append(resp.Tasks, tks) } return resp, nil } @@ -91,7 +96,7 @@ func (l *GetTaskListLogic) GetTaskList(uid int, req *types.GetTaskListReq) (*typ // 计算任务完成数量以及总数 hasFinishCount := 0 totalCount := 1 - + param := t.Param if finishState >= model.TASK_PROGRESS_WAIT_REWARD { // 如果任务状态为待领取奖励, 完成数量等于总数量 hasFinishCount = totalCount @@ -126,6 +131,9 @@ func (l *GetTaskListLogic) GetTaskList(uid int, req *types.GetTaskListReq) (*typ if hasBindTwitter == 1 { hasFinishCount = 1 } + + case model.TASKTYPE_TRUMP_HEAD: + param = t.PropertyId } } @@ -146,7 +154,7 @@ func (l *GetTaskListLogic) GetTaskList(uid int, req *types.GetTaskListReq) (*typ Description: t.Description, Points: t.Points, ButtonText: t.ButtonText, - Params: t.Param, + Params: param, Type: t.Type, Url: t.Url, StartAt: t.StartAt.Time.Format(time.DateTime), diff --git a/internal/logic/task/get_task_reward_logic.go b/internal/logic/task/get_task_reward_logic.go index 976511f..811ed45 100644 --- a/internal/logic/task/get_task_reward_logic.go +++ b/internal/logic/task/get_task_reward_logic.go @@ -33,7 +33,7 @@ func NewGetTaskRewardLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Get } } -func (l *GetTaskRewardLogic) GetTaskReward(req *types.TaskIdPath) (*types.GetTaskRewardResp, error) { +func (l *GetTaskRewardLogic) GetTaskReward(req *types.GetTaskRewardReq) (*types.GetTaskRewardResp, error) { //uid := cast.ToStringMapInt(l.ctx.Value("data"))["id"] uid := utils.GetUid(l.ctx) task, err := l.svcCtx.TaskModel.FindOne(l.ctx, req.ID) @@ -43,6 +43,22 @@ func (l *GetTaskRewardLogic) GetTaskReward(req *types.TaskIdPath) (*types.GetTas } return nil, errs.New(errs.ErrDatabaseOperate, err) } + if task.Type == model.TASKTYPE_TRUMP_HEAD { + if req.RoleId == 0 { + return nil, errs.New(errs.ErrInvalidParam, "Must select role") + } + roleUid, err := l.svcCtx.RoleModel.FindRoleUserId(l.ctx, req.RoleId) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return nil, errs.New(errs.ErrRoleNotFound, "role not found") + } + return nil, errs.New(errs.ErrDatabaseOperate, err) + } + if roleUid != uint(uid) { + return nil, errs.New(errs.ErrRoleNotFound, "role not found") + } + } + var taskSeq int if task.Type == model.TASKTYPE_DAILY_PAY || task.Type == model.TASKTYPE_AMBASSADOR_TASK { taskSeq = cast.ToInt(time.Now().Format("20060102")) @@ -62,6 +78,7 @@ func (l *GetTaskRewardLogic) GetTaskReward(req *types.TaskIdPath) (*types.GetTas return nil, errs.New(errs.ErrTaskAlreadyReward, "task already reward") } + assetType := consts.GetAssetType(task.RewardType) // 修改状态,增加积分和记录都在事物中执行 err = l.svcCtx.DBConn.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 修改状态 @@ -70,8 +87,9 @@ func (l *GetTaskRewardLogic) GetTaskReward(req *types.TaskIdPath) (*types.GetTas if err != nil { return err } + // 给予用户奖励 - err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uint(uid), consts.AssetType_Points, decimal.NewFromInt(int64(task.Points)), "完成任务:"+task.Title, uint64(task.Id), 0, true) + err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uint(uid), req.RoleId, assetType, task.PropertyId, decimal.NewFromInt(int64(task.Points)), "完成任务:"+task.Title, uint64(task.Id), 0, assetType == consts.AssetType_Points) //err = l.svcCtx.TaskAssetModel.WithSession(session).AddPoint(l.ctx, uint(uid), decimal.NewFromInt(int64(task.Points))) //if err != nil { // return err diff --git a/internal/logic/task/verify_task_result_logic.go b/internal/logic/task/verify_task_result_logic.go index 41e8cf6..6941c0b 100644 --- a/internal/logic/task/verify_task_result_logic.go +++ b/internal/logic/task/verify_task_result_logic.go @@ -76,7 +76,7 @@ func (l *VerifyTaskResultLogic) VerifyTaskResult(req *types.VerifyTaskResultReq) } case model.TASKTYPE_BIND_DISCORD: - case model.TASKTYPE_DAILY_PAY: + case model.TASKTYPE_DAILY_PAY, model.TASKTYPE_TRUMP_HEAD: if req.Params == "" { return &types.VerifyTaskResultResp{Finish: false}, nil } else { diff --git a/internal/model/nh_games_property_logs_model.go b/internal/model/nh_games_property_logs_model.go new file mode 100755 index 0000000..2869a22 --- /dev/null +++ b/internal/model/nh_games_property_logs_model.go @@ -0,0 +1,29 @@ +package model + +import "github.com/zeromicro/go-zero/core/stores/sqlx" + +var _ NhGamesPropertyLogsModel = (*customNhGamesPropertyLogsModel)(nil) + +type ( + // NhGamesPropertyLogsModel is an interface to be customized, add more methods here, + // and implement the added methods in customNhGamesPropertyLogsModel. + NhGamesPropertyLogsModel interface { + nhGamesPropertyLogsModel + WithSession(session sqlx.Session) NhGamesPropertyLogsModel + } + + customNhGamesPropertyLogsModel struct { + *defaultNhGamesPropertyLogsModel + } +) + +// NewNhGamesPropertyLogsModel returns a model for the database table. +func NewNhGamesPropertyLogsModel(conn sqlx.SqlConn) NhGamesPropertyLogsModel { + return &customNhGamesPropertyLogsModel{ + defaultNhGamesPropertyLogsModel: newNhGamesPropertyLogsModel(conn), + } +} + +func (m *customNhGamesPropertyLogsModel) WithSession(session sqlx.Session) NhGamesPropertyLogsModel { + return NewNhGamesPropertyLogsModel(sqlx.NewSqlConnFromSession(session)) +} diff --git a/internal/model/nh_games_property_logs_model_gen.go b/internal/model/nh_games_property_logs_model_gen.go new file mode 100755 index 0000000..af4edc9 --- /dev/null +++ b/internal/model/nh_games_property_logs_model_gen.go @@ -0,0 +1,96 @@ +// Code generated by goctl. DO NOT EDIT. +// versions: +// goctl version: 1.7.3 + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + "time" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + nhGamesPropertyLogsFieldNames = builder.RawFieldNames(&NhGamesPropertyLogs{}) + nhGamesPropertyLogsRows = strings.Join(nhGamesPropertyLogsFieldNames, ",") + nhGamesPropertyLogsRowsExpectAutoSet = strings.Join(stringx.Remove(nhGamesPropertyLogsFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",") + nhGamesPropertyLogsRowsWithPlaceHolder = strings.Join(stringx.Remove(nhGamesPropertyLogsFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?" +) + +type ( + nhGamesPropertyLogsModel interface { + Insert(ctx context.Context, data *NhGamesPropertyLogs) (sql.Result, error) + FindOne(ctx context.Context, id uint) (*NhGamesPropertyLogs, error) + Update(ctx context.Context, data *NhGamesPropertyLogs) error + Delete(ctx context.Context, id uint) error + } + + defaultNhGamesPropertyLogsModel struct { + conn sqlx.SqlConn + table string + } + + NhGamesPropertyLogs struct { + Id uint `db:"id"` + Uid uint `db:"uid"` // 用户ID + RoleId int64 `db:"role_id"` // 角色id + PropertyId string `db:"property_id"` // 道具ID + PropertyNum uint `db:"property_num"` // 道具数量 + Scene uint `db:"scene"` // 场景:1=积分活动 + CallbackStatus int8 `db:"callback_status"` // 下发通知状态:0未通知,1已通知,2通知异常 + CallbackNum int `db:"callback_num"` // 交易成功发送通知次数 + CallbackAt sql.NullTime `db:"callback_at"` // 发送通知最新时间 + CallbackRemark string `db:"callback_remark"` // 通知回调备注 + CreatedAt time.Time `db:"created_at"` // 创建时间 + UpdatedAt time.Time `db:"updated_at"` // 修改时间 + } +) + +func newNhGamesPropertyLogsModel(conn sqlx.SqlConn) *defaultNhGamesPropertyLogsModel { + return &defaultNhGamesPropertyLogsModel{ + conn: conn, + table: "`nh_games_property_logs`", + } +} + +func (m *defaultNhGamesPropertyLogsModel) Delete(ctx context.Context, id uint) error { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + _, err := m.conn.ExecCtx(ctx, query, id) + return err +} + +func (m *defaultNhGamesPropertyLogsModel) FindOne(ctx context.Context, id uint) (*NhGamesPropertyLogs, error) { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", nhGamesPropertyLogsRows, m.table) + var resp NhGamesPropertyLogs + err := m.conn.QueryRowCtx(ctx, &resp, query, id) + switch err { + case nil: + return &resp, nil + case sqlx.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultNhGamesPropertyLogsModel) Insert(ctx context.Context, data *NhGamesPropertyLogs) (sql.Result, error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, nhGamesPropertyLogsRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.Uid, data.RoleId, data.PropertyId, data.PropertyNum, data.Scene, data.CallbackStatus, data.CallbackNum, data.CallbackAt, data.CallbackRemark) + return ret, err +} + +func (m *defaultNhGamesPropertyLogsModel) Update(ctx context.Context, data *NhGamesPropertyLogs) error { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, nhGamesPropertyLogsRowsWithPlaceHolder) + _, err := m.conn.ExecCtx(ctx, query, data.Uid, data.RoleId, data.PropertyId, data.PropertyNum, data.Scene, data.CallbackStatus, data.CallbackNum, data.CallbackAt, data.CallbackRemark, data.Id) + return err +} + +func (m *defaultNhGamesPropertyLogsModel) tableName() string { + return m.table +} diff --git a/internal/model/nh_role_model.go b/internal/model/nh_role_model.go index 3f2d382..a958bf3 100755 --- a/internal/model/nh_role_model.go +++ b/internal/model/nh_role_model.go @@ -16,6 +16,7 @@ type ( nhRoleModel withSession(session sqlx.Session) NhRoleModel AccountExist(ctx context.Context, account string) (bool, error) + FindRoleUserId(ctx context.Context, roleId int64) (uint, error) } customNhRoleModel struct { @@ -23,6 +24,20 @@ type ( } ) +func (m *customNhRoleModel) FindRoleUserId(ctx context.Context, roleId int64) (uint, error) { + query := fmt.Sprintf("SELECT u.id FROM `nh_user` u JOIN %s r ON u.email = r.account WHERE r.role_id = ?", m.table) + var resp uint + err := m.conn.QueryRowPartialCtx(ctx, &resp, query, roleId) + switch { + case err == nil: + return resp, nil + case errors.Is(err, sqlx.ErrNotFound): + return 0, nil + default: + return 0, err + } +} + func (m *customNhRoleModel) AccountExist(ctx context.Context, account string) (bool, error) { query := fmt.Sprintf("select count(*) as `count` from %s where `account` = ?", m.table) var count int64 diff --git a/internal/model/nh_task_model.go b/internal/model/nh_task_model.go index 6cb4873..e3573d2 100755 --- a/internal/model/nh_task_model.go +++ b/internal/model/nh_task_model.go @@ -22,6 +22,7 @@ const ( TASKTYPE_DAILY_PAY = 9 // 每日支出任务 TASKTYPE_INVITE_USER = 10 // 邀请任务 TASKTYPE_AMBASSADOR_TASK = 11 // 大使任务 + TASKTYPE_TRUMP_HEAD = 12 // trump_head ) type ( diff --git a/internal/model/nh_task_model_gen.go b/internal/model/nh_task_model_gen.go index 8c16d08..161d11f 100755 --- a/internal/model/nh_task_model_gen.go +++ b/internal/model/nh_task_model_gen.go @@ -53,6 +53,8 @@ type ( UpdatedAt time.Time `db:"updated_at"` // 修改时间 Param string `db:"param"` // 备用参数,如果是邀请任务,可以填邀请的人数 Sort int `db:"sort"` // 数字越小越靠前 + PropertyId string `db:"property_id"` // 道具ID + RewardType int8 `db:"reward_type"` // 奖励类型:0=积分,1=道具,2=castile } ) @@ -84,14 +86,14 @@ func (m *defaultNhTaskModel) FindOne(ctx context.Context, id uint) (*NhTask, err } func (m *defaultNhTaskModel) Insert(ctx context.Context, data *NhTask) (sql.Result, error) { - query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, nhTaskRowsExpectAutoSet) - ret, err := m.conn.ExecCtx(ctx, query, data.CommunityId, data.Title, data.SubTitle, data.Description, data.Points, data.ButtonText, data.Type, data.Url, data.Status, data.StartAt, data.EndAt, data.Param, data.Sort) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, nhTaskRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.CommunityId, data.Title, data.SubTitle, data.Description, data.Points, data.ButtonText, data.Type, data.Url, data.Status, data.StartAt, data.EndAt, data.Param, data.Sort, data.PropertyId, data.RewardType) return ret, err } func (m *defaultNhTaskModel) Update(ctx context.Context, data *NhTask) error { query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, nhTaskRowsWithPlaceHolder) - _, err := m.conn.ExecCtx(ctx, query, data.CommunityId, data.Title, data.SubTitle, data.Description, data.Points, data.ButtonText, data.Type, data.Url, data.Status, data.StartAt, data.EndAt, data.Param, data.Sort, data.Id) + _, err := m.conn.ExecCtx(ctx, query, data.CommunityId, data.Title, data.SubTitle, data.Description, data.Points, data.ButtonText, data.Type, data.Url, data.Status, data.StartAt, data.EndAt, data.Param, data.Sort, data.PropertyId, data.RewardType, data.Id) return err } diff --git a/internal/pkg/errs/reason.go b/internal/pkg/errs/reason.go index 350ae90..ee2c7ab 100644 --- a/internal/pkg/errs/reason.go +++ b/internal/pkg/errs/reason.go @@ -28,4 +28,6 @@ const ( ErrUserNotFound Reason = 20007 // 用户不存在 ErrNftNotBelongToUser Reason = 20008 // NFT不属于用户 ErrInvalidApiKey Reason = 20009 // 无效的api key + ErrRoleNotFound Reason = 20010 // 角色不存在 + ErrInvalidParam Reason = 20011 // 无效的参数 ) diff --git a/internal/svc/service_context.go b/internal/svc/service_context.go index 15e2d96..a56472b 100644 --- a/internal/svc/service_context.go +++ b/internal/svc/service_context.go @@ -45,6 +45,7 @@ type ServiceContext struct { AmbassadorModel model.NhTaskAmbassadorModel GameReportModel model.NhGameReportModel RoleModel model.NhRoleModel + GamesPropertyModel model.NhGamesPropertyLogsModel ApiKeyCheck rest.Middleware AdminSecretCheck rest.Middleware @@ -84,6 +85,7 @@ func NewServiceContext(c config.Config) *ServiceContext { AmbassadorModel: model.NewNhTaskAmbassadorModel(dbConn), GameReportModel: model.NewNhGameReportModel(dbConn), RoleModel: model.NewNhRoleModel(dbConn), + GamesPropertyModel: model.NewNhGamesPropertyLogsModel(dbConn), ApiKeyCheck: middleware.NewApiKeyCheckMiddleware(configModel).Handle, AdminSecretCheck: middleware.NewAdminSecretCheckMiddleware(configModel).Handle, @@ -154,15 +156,18 @@ func (s *ServiceContext) GetUidByEmail(ctx context.Context, email string) (uint, return u.Id, nil } -func (s *ServiceContext) AddUserAssetWithSession(ctx context.Context, session sqlx.Session, uid uint, asset consts.AssetType, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { +func (s *ServiceContext) AddUserAssetWithSession(ctx context.Context, session sqlx.Session, uid uint, role int64, asset consts.AssetType, assetId string, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { var assetModel model.NhTaskAssetModel var recordModel model.NhTaskAssetRecordModel + var gamesPropertyModel model.NhGamesPropertyLogsModel if session != nil { assetModel = s.taskAssetModel.WithSession(session) recordModel = s.taskAssetRecordModel.WithSession(session) + gamesPropertyModel = s.GamesPropertyModel.WithSession(session) } else { assetModel = s.taskAssetModel recordModel = s.taskAssetRecordModel + gamesPropertyModel = s.GamesPropertyModel } var err error switch asset { @@ -174,6 +179,14 @@ func (s *ServiceContext) AddUserAssetWithSession(ctx context.Context, session sq err = assetModel.AddElitePoints(ctx, uid, amount) case consts.AssetType_Keys: err = assetModel.AddKeys(ctx, uid, int(amount.IntPart())) + case consts.AssetType_Property: + _, err = gamesPropertyModel.Insert(ctx, &model.NhGamesPropertyLogs{ + Uid: uid, + RoleId: int64(role), + PropertyId: assetId, + PropertyNum: uint(amount.IntPart()), + }) + return err default: return errors.New("unknown asset type") } @@ -214,9 +227,9 @@ func (s *ServiceContext) AddUserAssetWithSession(ctx context.Context, session sq } rated := decimal.NewFromFloat(float64(rate) / 100) rewardAmount := amount.Mul(rated) - return s.AddUserAssetWithSession(ctx, session, pb.ShareUid, asset, rewardAmount, fmt.Sprintf("分享返利,比例%s", rated.String()), 7, uid, false) + return s.AddUserAssetWithSession(ctx, session, pb.ShareUid, 0, asset, assetId, rewardAmount, fmt.Sprintf("分享返利,比例%s", rated.String()), 7, uid, false) } -func (s *ServiceContext) AddUserAsset(ctx context.Context, uid uint, asset consts.AssetType, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { - return s.AddUserAssetWithSession(ctx, nil, uid, asset, amount, remark, eventId, provideUid, referralReward) +func (s *ServiceContext) AddUserAsset(ctx context.Context, uid uint, role int64, asset consts.AssetType, assetId string, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { + return s.AddUserAssetWithSession(ctx, nil, uid, role, asset, assetId, amount, remark, eventId, provideUid, referralReward) } diff --git a/internal/types/types.go b/internal/types/types.go index de31238..fb31e5b 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -67,6 +67,11 @@ type GetTaskListResp struct { Tasks []Task `json:"tasks"` } +type GetTaskRewardReq struct { + ID uint `form:"id"` // 任务ID + RoleId int64 `form:"role_id,optional"` // 游戏角色ID +} + type GetTaskRewardResp struct { Points int `json:"points"` // 积分 } @@ -151,10 +156,6 @@ type Task struct { FinishState int8 `json:"finish_state"` // 0:未完成 1:待校验 2:已完成未领取 3:已领取 4:不可参与 } -type TaskIdPath struct { - ID uint `path:"id"` // 任务ID -} - type UnStakeNftReq struct { TokenId string `json:"token_id"` // nftID }