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