Files
novatask/internal/model/nh_task_nft_stake_reward_model.go
2024-12-31 20:39:02 +08:00

76 lines
2.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
}
customNhTaskNftStakeRewardModel struct {
*defaultNhTaskNftStakeRewardModel
}
)
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` = ? WHERE `uid` = ? AND `award_seq` = ?", 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))
}