Files
novatask/internal/model/nh_task_nft_stake_reward_model.go
2025-01-08 16:25:48 +08:00

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