samba/util/model/userClubInfo.go
2025-06-04 09:51:39 +08:00

166 lines
6.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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