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/model" "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.StakePointsLogModel.WithSession(session).Insert(ctx, &model.NhStakePointsLog{ Uid: n.Uid, RoleId: n.RoleId, LevelId: n.LevelId, Level: n.Level, Points: -int(n.Points), Action: 4, }) if err != nil { logx.Errorw("stake points log error", logx.Field("err", err), logx.Field("role_id", n.RoleId), logx.Field("uid", n.Uid), logx.Field("level_id", n.LevelId), logx.Field("action", 4)) return errs.New(errs.ErrDatabaseOperate, 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)) } } }