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 } ) // 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` = ?, `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)) }