feat: 积分质押功能
This commit is contained in:
103
internal/model/nh_stake_points_model.go
Executable file
103
internal/model/nh_stake_points_model.go
Executable file
@@ -0,0 +1,103 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||
"time"
|
||||
)
|
||||
|
||||
var _ NhStakePointsModel = (*customNhStakePointsModel)(nil)
|
||||
|
||||
type (
|
||||
// NhStakePointsModel is an interface to be customized, add more methods here,
|
||||
// and implement the added methods in customNhStakePointsModel.
|
||||
NhStakePointsModel interface {
|
||||
nhStakePointsModel
|
||||
WithSession(session sqlx.Session) NhStakePointsModel
|
||||
FindCurrentLevel(ctx context.Context, roleId int64) (*NhStakePoints, error)
|
||||
FindRenewLevel(ctx context.Context, roleId int64) (*NhStakePoints, error)
|
||||
FindOverdueList(ctx context.Context) ([]*NhStakePoints, error)
|
||||
SetOverdue(ctx context.Context, id uint) error
|
||||
}
|
||||
|
||||
customNhStakePointsModel struct {
|
||||
*defaultNhStakePointsModel
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
PointsStakeStatusUnknown = 0 // 未知状态
|
||||
PointsStakeStatusStaking = 1 // 质押中
|
||||
PointsStakeStatusUpgraded = 2 // 已升级
|
||||
PointsStakeStatusRenew = 3 // 已续约
|
||||
PointsStakeStatusOverdue = 4 // 已过期
|
||||
)
|
||||
|
||||
func (m *customNhStakePointsModel) SetOverdue(ctx context.Context, id uint) error {
|
||||
update := fmt.Sprintf("update %s set `status` = %d where `id` = ? and `status` = %d", m.table, PointsStakeStatusOverdue, PointsStakeStatusStaking)
|
||||
result, err := m.conn.ExecCtx(ctx, update, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rows, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if rows == 0 {
|
||||
return ErrNoRowUpdate
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *customNhStakePointsModel) FindOverdueList(ctx context.Context) ([]*NhStakePoints, error) {
|
||||
query := fmt.Sprintf("select %s from %s where end_time <= ? and `status` = %d limit 100", nhStakePointsRows, m.table, PointsStakeStatusStaking)
|
||||
var resp []*NhStakePoints
|
||||
err := m.conn.QueryRowsCtx(ctx, &resp, query, time.Now())
|
||||
if err != nil && !errors.Is(err, sqlx.ErrNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (m *customNhStakePointsModel) FindRenewLevel(ctx context.Context, roleId int64) (*NhStakePoints, error) {
|
||||
query := fmt.Sprintf("select %s from %s where `role_id` = ? and start_time > ? and `status` = %d limit 1", nhStakePointsRows, m.table, PointsStakeStatusStaking)
|
||||
var resp NhStakePoints
|
||||
now := time.Now()
|
||||
err := m.conn.QueryRowCtx(ctx, &resp, query, roleId, now)
|
||||
switch {
|
||||
case err == nil:
|
||||
return &resp, nil
|
||||
case errors.Is(err, sqlx.ErrNotFound):
|
||||
return nil, ErrNotFound
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
func (m *customNhStakePointsModel) FindCurrentLevel(ctx context.Context, roleId int64) (*NhStakePoints, error) {
|
||||
query := fmt.Sprintf("select %s from %s where `role_id` = ? and start_time <= ? and end_time >= ? and (`status` = %d or `status` = %d) limit 1", nhStakePointsRows, m.table, PointsStakeStatusStaking, PointsStakeStatusRenew)
|
||||
var resp NhStakePoints
|
||||
now := time.Now()
|
||||
err := m.conn.QueryRowCtx(ctx, &resp, query, roleId, now, now)
|
||||
switch {
|
||||
case err == nil:
|
||||
return &resp, nil
|
||||
case errors.Is(err, sqlx.ErrNotFound):
|
||||
return nil, ErrNotFound
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// NewNhStakePointsModel returns a model for the database table.
|
||||
func NewNhStakePointsModel(conn sqlx.SqlConn) NhStakePointsModel {
|
||||
return &customNhStakePointsModel{
|
||||
defaultNhStakePointsModel: newNhStakePointsModel(conn),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *customNhStakePointsModel) WithSession(session sqlx.Session) NhStakePointsModel {
|
||||
return NewNhStakePointsModel(sqlx.NewSqlConnFromSession(session))
|
||||
}
|
||||
Reference in New Issue
Block a user