samba/util/model/userInfo.go

158 lines
4.9 KiB
Go
Raw Normal View History

2025-06-04 09:51:39 +08:00
package model
import (
"context"
"encoding/json"
"fmt"
"github.com/go-redis/redis/v8"
"gorm.io/gorm"
"samba/pkg/log"
"samba/pkg/xtime"
"samba/proto"
"samba/stub"
"samba/util/rdbkey"
)
type UserInfo struct {
UID int64 `gorm:"column:uid" json:"uid"`
UType int `gorm:"column:utype" json:"utype"` // 用户类型1-游客2-FB
API int `gorm:"column:api" json:"api"`
SItemID string `gorm:"column:sitemid" json:"sitemid"`
Device string `gorm:"column:device" json:"device"`
MNick string `gorm:"column:mnick" json:"mnick"` // 昵称
Sex int `gorm:"column:sex" json:"sex"` // 性别
HeadURL string `gorm:"column:head_url" json:"head_url"` // 头像
IconId int `gorm:"column:iconid" json:"iconid"` // 系统头像
MTime int64 `gorm:"column:mtime" json:"mtime"`
Phone string `gorm:"column:phone" json:"phone"`
Address string `gorm:"column:address" json:"address"`
MStatus int `gorm:"column:mstatus" json:"mstatus"` // 状态1-封号0-正常
UTMSource int `gorm:"column:utm_source" json:"utm_source"`
AvatarFrame int `gorm:"column:avatar_frame" json:"avatar_frame"` // 头像框
TakeCoin int64 `gorm:"-" json:"-"` // 携带金币
TakeClubCoin int64 `gorm:"-" json:"-"` // 携带俱乐部币
Region string `gorm:"column:region" json:"region"` // 手机地区码
Location string `gorm:"column:location" json:"location"` // 定位信息
Bandesc string `gorm:"column:bandesc" json:"bandesc"` // 封禁备注
Bankrupt int `gorm:"column:bankrupt" json:"bankrupt"` // 破产补贴已领取次数
BankruptTime int `gorm:"column:bankrupt_time" json:"bankrupt_time"` // 最后一次破产领取时间
}
func (t *UserInfo) TableName() string {
return "t_user_info"
}
type UserInfoOp struct {
rdb *redis.Client
db *gorm.DB
}
func NewUserInfoOp() *UserInfoOp {
return &UserInfoOp{rdb: rdbBaseInfo, db: userDB}
}
func (op *UserInfoOp) Count() (count int64, err error) {
err = op.db.Model(&UserInfo{}).Count(&count).Error
return count, err
}
func (op *UserInfoOp) Load(uid int64) (*UserInfo, error) {
var user UserInfo
val, err := op.rdb.Get(context.Background(), rdbkey.BaseUserKey(uid)).Result()
if err == nil {
err = json.Unmarshal([]byte(val), &user)
user.TakeCoin = 0
if err == nil {
return &user, nil
}
}
log.Error(fmt.Sprintf("Load user info err:%v. key:%v", err.Error(), rdbkey.BaseUserKey(uid)))
result := op.db.Where("uid = ?", uid).First(&user)
if result.Error != nil {
return nil, result.Error
}
// 回写redis
var bytesUser []byte
bytesUser, err = json.Marshal(&user)
if err != nil {
return nil, err
}
//log.Debug(string(bytesUser))
err = op.rdb.Set(context.Background(), rdbkey.BaseUserKey(uid), bytesUser, redis30day).Err()
if err != nil {
log.Error(fmt.Sprintf("set user info err:%v. key:%v", err.Error(), rdbkey.BaseUserKey(uid)))
}
return &user, result.Error
}
func (op *UserInfoOp) LoadFromRedis(uid int64) (*UserInfo, error) {
var user UserInfo
val, err := op.rdb.Get(context.Background(), rdbkey.BaseUserKey(uid)).Result()
if err == nil {
err = json.Unmarshal([]byte(val), &user)
if err == nil {
user.TakeCoin = 0
return &user, nil
}
}
return nil, err
}
// UpdateBankruptCount 更新破产补贴领取次数
func (op *UserInfoOp) UpdateBankruptCount(uid int64, count int) error {
err := op.db.Model(&UserInfo{}).Where("uid = ?", uid).
Updates(map[string]any{
"bankrupt": count,
"bankrupt_time": xtime.Now().Timestamp(),
}).
Error
if err != nil {
return err
}
// 回写redis
var user UserInfo
// 若数据库支持RETURNING操作可以避免再次查询
err = op.db.Where("uid = ?", uid).First(&user).Error
if err != nil {
return err
}
b, err := json.Marshal(&user)
if err != nil {
return err
}
err = op.rdb.Set(context.Background(), rdbkey.BaseUserKey(uid), b, redis30day).Err()
if err != nil {
log.Error(fmt.Sprintf("set user info err:%v. key:%v", err.Error(), rdbkey.BaseUserKey(uid)))
}
return nil
}
// GetVipLevelByUserId uid对应的VIP等级
func GetVipLevelByUserId(uid int64) int {
// TODO 根据userId获取对应的vip等级
return 0
}
// NewBankruptNtfMsg 生成破产通知
func NewBankruptNtfMsg(uid int64) (*proto.NtfBankrupt, error) {
uInfo, err := NewUserInfoOp().Load(uid)
if err != nil {
return nil, err
}
if !xtime.IsTodayTimestamp(uInfo.BankruptTime) {
// 时间戳非今天重置为0
uInfo.Bankrupt = 0
}
brConf := stub.GetBankruptConf(GetVipLevelByUserId(uid))
log.Debug(fmt.Sprintf("破产通知 uid:%d, 当日已领:%d, 免费补贴次数:%d, 补贴金额:%d", uInfo.UID, uInfo.Bankrupt, brConf.FreeCount, brConf.Quota))
return &proto.NtfBankrupt{
UsedSubsidyCount: uInfo.Bankrupt,
SubsidyCount: brConf.FreeCount,
SubsidyAmount: int64(brConf.Quota),
}, nil
}