166 lines
6.3 KiB
Go
166 lines
6.3 KiB
Go
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)
|
||
}
|
||
}
|