package model import ( "context" "fmt" "github.com/go-redis/redis/v8" "gorm.io/gorm" "samba/pkg/log" "samba/util/rdbkey" "samba/util/util" ) type UserClubInfo struct { UID int64 `gorm:"column:uid" json:"uid"` ClubId int `gorm:"column:club_id" json:"club_id"` // 俱乐部id Admin int `gorm:"column:admin" json:"admin"` // 俱乐部职务 0-普通成员,1-创建者,2-管理员 Score int64 `gorm:"column:score" json:"score"` // 俱乐部积分 FreeScore int64 `gorm:"column:free_score" json:"free_score"` // 官方赠送免费积分 InOutFreeScore int64 `gorm:"column:inout_free_score" json:"inout_free_score"` // 可提现的免费积分 Nick string `gorm:"column:mnick" json:"mnick"` // 昵称 Top int `gorm:"column:top" json:"top"` // 置顶 Times int `gorm:"column:times" json:"times"` // 使用次数 JoinTime int `gorm:"column:join_time" json:"join_time"` // 加入时间 Status int `gorm:"column:status" json:"status"` } func (t *UserClubInfo) TableName() string { return "t_club_member_info" } type UserClubInfoOp struct { db *gorm.DB rdb *redis.Client } func NewUserClubInfoOp() *UserClubInfoOp { return &UserClubInfoOp{rdb: rdbMoney, db: userDB} } func (op *UserClubInfoOp) loadDb(uid int64, clubId int) (*UserClubInfo, error) { var user UserClubInfo result := op.db.Where("uid = ? And club_id = ? And status = 1", uid, clubId).First(&user) if result.Error != nil { return nil, result.Error } return &user, result.Error } func (op *UserClubInfoOp) Load(uid int64, clubId int) (*UserClubInfo, error) { info, err := util.Redis2Struct[UserClubInfo](op.rdb, rdbkey.UserClubKey(uid, clubId)) if err == nil { return info, err } log.Warn(fmt.Sprintf("err:%v, redis key:%v", err, rdbkey.UserClubKey(uid, clubId))) info, err = op.loadDb(uid, clubId) if err != nil { log.Error(fmt.Sprintf("Load t_club_member_info db err:%v, uid:%v club id:%v", err, uid, clubId)) return nil, err } // 回写redis err = util.Struct2Redis(op.rdb, rdbkey.UserClubKey(uid, clubId), info) if err != nil { log.Error(fmt.Sprintf("write t_club_member_info to redis err:%v, uid:%v club id:%v", err, uid, clubId)) return nil, err } _ = op.rdb.Expire(context.Background(), rdbkey.UserClubKey(uid, clubId), redis30day).Err() return info, err } // 添加用户俱乐部积分 func (op *UserClubInfoOp) addScore(uid int64, clubId int, add int64) (*UserClubInfo, int64, error) { userClubInfo, err := op.Load(uid, clubId) if err != nil { return nil, 0, err } if userClubInfo.Score+add < 0 { log.Warn(fmt.Sprintf("uid:%v club:%v score:%v+add:%v < 0", uid, clubId, userClubInfo.Score, add)) } userClubInfo.Score, err = op.rdb.HIncrBy(context.Background(), rdbkey.UserClubKey(uid, clubId), ResClubUserScore, add).Result() if err != nil { err = fmt.Errorf("key:%v add res:%v value:%v fail.err:%v", rdbkey.ClubKey(clubId), ResClubUserScore, add, err.Error()) log.Error(err.Error()) return nil, 0, err } return userClubInfo, userClubInfo.Score, nil } // 添加用户俱乐部免费积分 func (op *UserClubInfoOp) addFreeScore(uid int64, clubId int, add int64) (*UserClubInfo, int64, error) { userClubInfo, err := op.Load(uid, clubId) if err != nil { return nil, 0, err } if userClubInfo.FreeScore+add < 0 { log.Warn(fmt.Sprintf("uid:%v club:%v free_score:%v+add:%v < 0", uid, clubId, userClubInfo.Score, add)) } userClubInfo.FreeScore, err = op.rdb.HIncrBy(context.Background(), rdbkey.UserClubKey(uid, clubId), ResClubUserFreeScore, add).Result() if err != nil { err = fmt.Errorf("key:%v add res:%v value:%v fail.err:%v", rdbkey.ClubKey(clubId), ResClubUserFreeScore, add, err.Error()) log.Error(err.Error()) return nil, 0, err } return userClubInfo, userClubInfo.FreeScore, nil } // 添加用户俱乐部可提现的免费积分 func (op *UserClubInfoOp) addInOutFreeScore(uid int64, clubId int, add int64) (*UserClubInfo, int64, error) { userClubInfo, err := op.Load(uid, clubId) if err != nil { return nil, 0, err } if userClubInfo.InOutFreeScore+add < 0 { log.Warn(fmt.Sprintf("uid:%v club:%v inout_free_score:%v+add:%v < 0", uid, clubId, userClubInfo.Score, add)) } userClubInfo.InOutFreeScore, err = op.rdb.HIncrBy(context.Background(), rdbkey.UserClubKey(uid, clubId), ResClubUserInOutFreeScore, add).Result() if err != nil { err = fmt.Errorf("key:%v add res:%v value:%v fail.err:%v", rdbkey.ClubKey(clubId), ResClubUserInOutFreeScore, add, err.Error()) log.Error(err.Error()) return nil, 0, err } return userClubInfo, userClubInfo.InOutFreeScore, nil } // 添加俱乐部玩家的积分,免费积分,可提现免费积分 func (op *UserClubInfoOp) Add(uid int64, clubId int, add int64, resType string) (userClubInfo *UserClubInfo, val int64, err error) { switch resType { case ResClubScore: userClubInfo, val, err = op.addScore(uid, clubId, add) case ResClubUserFreeScore: userClubInfo, val, err = op.addFreeScore(uid, clubId, add) case ResClubUserInOutFreeScore: userClubInfo, val, err = op.addInOutFreeScore(uid, clubId, add) default: return nil, 0, fmt.Errorf("func:UserClubInfoOp.Add, uid:%v club:%v resType:%s not support", uid, clubId, resType) } if err == nil { _ = rdbBaseInfo.Expire(context.Background(), rdbkey.UserClubKey(uid, clubId), redis30day).Err() expr := fmt.Sprintf("%v + ?", resType) err = op.db.Model(&UserClubInfo{}).Where("uid = ? AND club_id = ?", uid, clubId).Update(resType, gorm.Expr(expr, add)).Error if err != nil { err = fmt.Errorf("user:%v club:%v add res:%v value:%v fail.err:%v", uid, clubId, resType, add, err.Error()) log.Error(err.Error()) } } return } // 添加俱乐部玩家的积分,免费积分,可提现免费积分 func (op *UserClubInfoOp) Get(uid int64, clubId int, resType string) (int64, error) { userClubInfo, err := op.Load(uid, clubId) if err != nil { return 0, err } switch resType { case ResClubScore: return userClubInfo.Score, nil case ResClubUserFreeScore: return userClubInfo.FreeScore, nil case ResClubUserInOutFreeScore: return userClubInfo.InOutFreeScore, nil default: return 0, fmt.Errorf("func:UserClubInfoOp.Add, uid:%v club:%v resType:%s not support", uid, clubId, resType) } }