feat: 积分质押功能
This commit is contained in:
69
internal/job/check_points_stake/cron.go
Normal file
69
internal/job/check_points_stake/cron.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package check_points_stake
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/shopspring/decimal"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||
"nova_task/internal/consts"
|
||||
"nova_task/internal/pkg/errs"
|
||||
"nova_task/internal/svc"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Cron struct {
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
func NewCron(ctx context.Context, svcCtx *svc.ServiceContext) cron.Job {
|
||||
return &Cron{
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cron) Spec() string {
|
||||
return "@every 30s"
|
||||
}
|
||||
|
||||
func (c *Cron) Run() {
|
||||
ns, err := c.svcCtx.StakePointsModel.FindOverdueList(c.ctx)
|
||||
if err != nil {
|
||||
logx.Errorw("find overdue list failed", logx.Field("err", err))
|
||||
return
|
||||
}
|
||||
if len(ns) == 0 {
|
||||
return
|
||||
}
|
||||
logx.Debugw("find overdue list", logx.Field("count", len(ns)))
|
||||
for _, n := range ns {
|
||||
err = c.svcCtx.DBConn.TransactCtx(c.ctx, func(ctx context.Context, session sqlx.Session) error {
|
||||
err = c.svcCtx.StakePointsModel.WithSession(session).SetOverdue(ctx, n.Id)
|
||||
if err != nil {
|
||||
logx.Errorw("set overdue failed", logx.Field("err", err))
|
||||
return err
|
||||
}
|
||||
err = c.svcCtx.AddUserAssetWithSession(c.ctx, session, n.Uid, int64(n.RoleId), consts.AssetType_Points, "", decimal.NewFromInt(int64(n.Points)), "stake point overdue return", 0, 0, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = c.svcCtx.GameAction(c.ctx, int64(n.RoleId), consts.GameActionStakePoints, map[string]any{
|
||||
"level": n.Level,
|
||||
"operation": 4,
|
||||
"start_time": time.Now().Unix(),
|
||||
"end_time": 0,
|
||||
"renew_times": 0,
|
||||
})
|
||||
if err != nil {
|
||||
logx.Errorw("game action failed", logx.Field("err", err), logx.Field("uid", n.Uid), logx.Field("roleId", n.RoleId))
|
||||
return errs.New(errs.ErrInternalServer, err)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
logx.Errorw("SetOverdue points stake", logx.Field("err", err), logx.Field("uid", n.Uid), logx.Field("roleId", n.RoleId))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"errors"
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"nova_task/internal/job/check_points_stake"
|
||||
"nova_task/internal/job/earn"
|
||||
"nova_task/internal/job/holder"
|
||||
"nova_task/internal/job/stake_settle"
|
||||
@@ -16,6 +17,8 @@ var cronList = []func(context.Context, *svc.ServiceContext) cron.Job{
|
||||
earn.NewCron,
|
||||
holder.NewCron,
|
||||
stake_settle.NewCron,
|
||||
//game_notify.NewCron,
|
||||
check_points_stake.NewCron,
|
||||
}
|
||||
|
||||
type Corns struct {
|
||||
|
||||
81
internal/job/game_notify/cron.go
Normal file
81
internal/job/game_notify/cron.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package game_notify
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"nova_task/internal/model"
|
||||
"nova_task/internal/svc"
|
||||
)
|
||||
|
||||
type Cron struct {
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
func NewCron(ctx context.Context, svcCtx *svc.ServiceContext) cron.Job {
|
||||
return &Cron{
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cron) Spec() string {
|
||||
return "@every 30s"
|
||||
}
|
||||
|
||||
func (c *Cron) Run() {
|
||||
c.Process(model.NTF_STATUS_WAITING_PROCESS)
|
||||
c.Process(model.NTF_STATUS_FAILED)
|
||||
}
|
||||
|
||||
func (c *Cron) Process(status int8) {
|
||||
nfs, err := c.svcCtx.GameServerNotifyModel.FindNotifyList(c.ctx, status)
|
||||
if err != nil {
|
||||
logx.Errorw("find notify list failed", logx.Field("err", err))
|
||||
return
|
||||
}
|
||||
if len(nfs) == 0 {
|
||||
logx.Debug("no notify")
|
||||
return
|
||||
}
|
||||
for _, nf := range nfs {
|
||||
var arg = map[string]any{}
|
||||
if nf.Data.Valid {
|
||||
err = json.Unmarshal([]byte(nf.Data.String), &arg)
|
||||
if err != nil {
|
||||
logx.Errorw("unmarshal notify data failed", logx.Field("err", err), logx.Field("id", nf.Id))
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
err := c.svcCtx.GameServerNotifyModel.UpdateNotifyStatus(c.ctx, nf.Id, model.NTF_STATUS_PROCESSING)
|
||||
if err != nil {
|
||||
logx.Errorw("update notify status failed", logx.Field("err", err), logx.Field("id", nf.Id))
|
||||
continue
|
||||
}
|
||||
_, err = c.svcCtx.GameAction(c.ctx, int64(nf.RoleId), nf.Action, arg)
|
||||
if err != nil {
|
||||
c.svcCtx.GameServerNotifyModel.UpdateNotifyStatus(c.ctx, nf.Id, model.NTF_STATUS_FAILED)
|
||||
} else {
|
||||
c.svcCtx.GameServerNotifyModel.UpdateNotifyStatus(c.ctx, nf.Id, model.NTF_STATUS_SUCCESS)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE TABLE `nh_game_server_notify`
|
||||
(
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`role_id` bigint(20) unsigned NOT NULL COMMENT '角色id',
|
||||
`action` varchar(128) NOT NULL COMMENT '事件类型',
|
||||
`data` text NULL DEFAULT NULL COMMENT '事件数据',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态:1=待处理,2=处理中, 3=处理失败, 4=处理成功',
|
||||
`retry_times` int NOT NULL DEFAULT 0 COMMENT '重试次数',
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX (`status`)
|
||||
) COMMENT ='游戏服通知事件';
|
||||
*/
|
||||
Reference in New Issue
Block a user