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)) }