158 lines
4.9 KiB
Go
158 lines
4.9 KiB
Go
![]() |
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
|
|||
|
|
|||
|
}
|