96 lines
3.5 KiB
Go
Executable File
96 lines
3.5 KiB
Go
Executable File
package model
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/shopspring/decimal"
|
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
|
"math/rand"
|
|
)
|
|
|
|
var _ NhTaskNftStakeRewardModel = (*customNhTaskNftStakeRewardModel)(nil)
|
|
|
|
type (
|
|
// NhTaskNftStakeRewardModel is an interface to be customized, add more methods here,
|
|
// and implement the added methods in customNhTaskNftStakeRewardModel.
|
|
NhTaskNftStakeRewardModel interface {
|
|
nhTaskNftStakeRewardModel
|
|
withSession(session sqlx.Session) NhTaskNftStakeRewardModel
|
|
GetRandomCoefficientByUid(ctx context.Context, uid uint, awardSeq int, min, max float64) (float64, error)
|
|
SetReward(ctx context.Context, uid uint, awardSeq, occupyPercent int, pledgeOutput, reward decimal.Decimal) error
|
|
CountReward(ctx context.Context, uid uint) (float64, error)
|
|
FindRewardsByUid(ctx context.Context, uid uint) ([]*NhTaskNftStakeReward, error)
|
|
}
|
|
|
|
customNhTaskNftStakeRewardModel struct {
|
|
*defaultNhTaskNftStakeRewardModel
|
|
}
|
|
)
|
|
|
|
func (m *customNhTaskNftStakeRewardModel) CountReward(ctx context.Context, uid uint) (float64, error) {
|
|
query := fmt.Sprintf("SELECT SUM(`reward`) FROM %s WHERE `uid` = ? AND `sent` = 1", m.table)
|
|
var reward float64
|
|
err := m.conn.QueryRowCtx(ctx, &reward, query, uid)
|
|
return reward, err
|
|
}
|
|
|
|
func (m *customNhTaskNftStakeRewardModel) FindRewardsByUid(ctx context.Context, uid uint) ([]*NhTaskNftStakeReward, error) {
|
|
query := fmt.Sprintf("SELECT * FROM %s WHERE `uid` = ? AND `sent` = 1", m.table)
|
|
var list []*NhTaskNftStakeReward
|
|
err := m.conn.QueryRowsCtx(ctx, &list, query, uid)
|
|
if err != nil && !errors.Is(err, sqlx.ErrNotFound) {
|
|
return nil, err
|
|
}
|
|
return list, nil
|
|
}
|
|
|
|
// SetReward 对未发送奖励的用户发送奖励,支持并发,且不会重发
|
|
func (m *customNhTaskNftStakeRewardModel) SetReward(ctx context.Context, uid uint, awardSeq, occupyPercent int, pledgeOutput, reward decimal.Decimal) error {
|
|
update := fmt.Sprintf("UPDATE %s SET `occupy_percent` = ?, `pledge_output` = ?, `reward` = ?, `sent` = 1 WHERE `uid` = ? AND `award_seq` = ? AND `sent` = 0", m.table)
|
|
result, err := m.conn.ExecCtx(ctx, update, occupyPercent, pledgeOutput, reward, uid, awardSeq)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
rowsAffected, err := result.RowsAffected()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if rowsAffected == 0 {
|
|
return ErrNoRowUpdate
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *customNhTaskNftStakeRewardModel) GetRandomCoefficientByUid(ctx context.Context, uid uint, awardSeq int, min, max float64) (float64, error) {
|
|
query := fmt.Sprintf("SELECT `random_coefficient` FROM %s WHERE `uid` = ? AND `award_seq` = ?", m.table)
|
|
var randomCoefficient float64
|
|
err := m.conn.QueryRowCtx(ctx, &randomCoefficient, query, uid, awardSeq)
|
|
if err == nil {
|
|
return randomCoefficient, nil
|
|
}
|
|
|
|
if !errors.Is(err, sqlx.ErrNotFound) {
|
|
return 0, err
|
|
}
|
|
|
|
randomCoefficient = float64(int(min*100)+rand.Intn(int(max*100-min*100))) / 100
|
|
_, err = m.Insert(ctx, &NhTaskNftStakeReward{
|
|
Uid: uid,
|
|
AwardSeq: awardSeq,
|
|
RandomCoefficient: randomCoefficient,
|
|
})
|
|
return randomCoefficient, err
|
|
}
|
|
|
|
// NewNhTaskNftStakeRewardModel returns a model for the database table.
|
|
func NewNhTaskNftStakeRewardModel(conn sqlx.SqlConn) NhTaskNftStakeRewardModel {
|
|
return &customNhTaskNftStakeRewardModel{
|
|
defaultNhTaskNftStakeRewardModel: newNhTaskNftStakeRewardModel(conn),
|
|
}
|
|
}
|
|
|
|
func (m *customNhTaskNftStakeRewardModel) withSession(session sqlx.Session) NhTaskNftStakeRewardModel {
|
|
return NewNhTaskNftStakeRewardModel(sqlx.NewSqlConnFromSession(session))
|
|
}
|