|
|
|
@ -1,178 +0,0 @@
|
|
|
|
|
package cache
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/go-redis/redis"
|
|
|
|
|
"github.com/golangkit/formatime"
|
|
|
|
|
"log"
|
|
|
|
|
"recook/internal/dbc"
|
|
|
|
|
"recook/internal/model/user"
|
|
|
|
|
"recook/internal/service/comFunc"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
用于用户code的缓存处理
|
|
|
|
|
使用set做统计
|
|
|
|
|
*/
|
|
|
|
|
type UserCode struct {
|
|
|
|
|
Code string
|
|
|
|
|
ID uint
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
UserCodeListName = "UserCode"
|
|
|
|
|
InviteCodeSetPrefix = "InvCode" // 邀请的集合名称前缀
|
|
|
|
|
IntroCodeSetPrefix = "IntroCode" // 推荐的集合名称前缀
|
|
|
|
|
UpgradeCodeUnuse = 1
|
|
|
|
|
UpgradeCodeUsed = 2
|
|
|
|
|
SystemerIntroUserId = 0 // 系统分发的升级券用此表示user id
|
|
|
|
|
AllInviteCodeSetForCal = "AllInviteCodeSet"
|
|
|
|
|
AllIntroCodeSetForCal = "AllIntroCodeSet"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func NewUserCode(code string, id uint) UserCode {
|
|
|
|
|
return UserCode{
|
|
|
|
|
ID: id,
|
|
|
|
|
Code: code,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProducerCode 生产者, 将带消费的数据放入到队列中
|
|
|
|
|
func (uc *UserCode) ProducerCode() (err error) {
|
|
|
|
|
//str := strings.Join([]string{strconv.Itoa(int(uc.ID)), uc.Code}, ",") //将下级id16进制,上级的code,放到redis里面
|
|
|
|
|
//_, err = dbc.Rds.RPush(UserCodeListName, str).Result()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConsumerCode 消费者
|
|
|
|
|
func (uc *UserCode) ConsumerCode() (err error) {
|
|
|
|
|
//log.Println("开始消费")
|
|
|
|
|
// 返回一个slice 【0】 -》 key 【1】 -》 取出来的值
|
|
|
|
|
for {
|
|
|
|
|
if strSlice, err := dbc.Rds.BLPop(30*time.Second, UserCodeListName).Result(); err != nil {
|
|
|
|
|
if err != redis.Nil {
|
|
|
|
|
err = nil
|
|
|
|
|
}
|
|
|
|
|
//log.Println("结束消费")
|
|
|
|
|
return err
|
|
|
|
|
} else {
|
|
|
|
|
// 消费数据
|
|
|
|
|
idCode := strings.Split(strSlice[1], ",")
|
|
|
|
|
codeType := comFunc.JudgeInvitOrIntro(idCode[1]) // 判断上级的推荐码的长度
|
|
|
|
|
tmpId, _ := strconv.Atoi(idCode[0]) //转10进制,下级的id
|
|
|
|
|
uc.Code = idCode[1] //上级推荐码
|
|
|
|
|
uc.ID = uint(tmpId) //下级的id
|
|
|
|
|
if codeType == "Invit" { //6位
|
|
|
|
|
if err := uc.InviteNumCache(); err != nil {
|
|
|
|
|
log.Println(err)
|
|
|
|
|
}
|
|
|
|
|
} else if codeType == "Intro" { //8位
|
|
|
|
|
if err := uc.IntroNumCache(); err != nil {
|
|
|
|
|
log.Println(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//log.Println("结束消费")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// InviteNumCache 缓存 邀请人数
|
|
|
|
|
func (uc *UserCode) InviteNumCache() error {
|
|
|
|
|
// 1、落盘
|
|
|
|
|
//InviterUser, err := baseCode.ToInt(uc.Code) //这个是上级id,
|
|
|
|
|
//if err != nil {
|
|
|
|
|
// log.Println("[panic]反推userid错误", err)
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//这边要根据数据库来获取
|
|
|
|
|
var userInfo user.Information
|
|
|
|
|
err := dbc.DB.First(&userInfo, "invitation_no=?", uc.Code).Error
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("[panic]反推userid错误", err)
|
|
|
|
|
}
|
|
|
|
|
InviterUser := userInfo.ID
|
|
|
|
|
|
|
|
|
|
err = dbc.DB.Create(&user.InviteHistory{
|
|
|
|
|
InviterUserID: uint(InviterUser),
|
|
|
|
|
InviterCode: uc.Code,
|
|
|
|
|
UserId: uc.ID,
|
|
|
|
|
}).Error
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2、进缓存的set, 为之后计算绩效作准备
|
|
|
|
|
_, err = dbc.Rds.SAdd(InviteCodeSetPrefix+uc.Code, uc.ID).Result()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("introCode set错误:", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, err = dbc.Rds.SAdd(AllInviteCodeSetForCal, uc.Code).Result()
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetInviteNumFromCache(code string) (num int64) {
|
|
|
|
|
num, _ = dbc.Rds.SCard(InviteCodeSetPrefix + code).Result()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 缓存 推荐人数
|
|
|
|
|
func (uc *UserCode) IntroNumCache() error {
|
|
|
|
|
// 推荐之后有 升级码 和 保级码
|
|
|
|
|
// 1、落盘
|
|
|
|
|
tx := dbc.DB.Begin()
|
|
|
|
|
genCode := comFunc.SerializeMd5(strconv.Itoa(int(uc.ID)), 16)
|
|
|
|
|
upCode := comFunc.SerializeMd5(strconv.Itoa(int(uc.ID)+'a'), 16)
|
|
|
|
|
//保级码
|
|
|
|
|
err := tx.Create(&user.IntroHistory{
|
|
|
|
|
IntroCode: uc.Code,
|
|
|
|
|
UserId: uc.ID,
|
|
|
|
|
KeepCode: genCode[0:6],
|
|
|
|
|
UpCodeUsed: UpgradeCodeUnuse,
|
|
|
|
|
}).Error
|
|
|
|
|
if err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// 升级码
|
|
|
|
|
err = tx.Create(&user.IntroHistory{
|
|
|
|
|
IntroCode: uc.Code,
|
|
|
|
|
UserId: uc.ID,
|
|
|
|
|
UpgradeCode: upCode[0:6],
|
|
|
|
|
UpCodeUsed: UpgradeCodeUnuse,
|
|
|
|
|
}).Error
|
|
|
|
|
if err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取下级的昵称
|
|
|
|
|
var userInfo user.Information
|
|
|
|
|
tx.First(&userInfo, "id=?", uc.ID)
|
|
|
|
|
|
|
|
|
|
//获取上级id
|
|
|
|
|
var userTree user.Tree
|
|
|
|
|
tx.First(&userTree, "depth=1 and user_id=?", uc.ID)
|
|
|
|
|
|
|
|
|
|
//为该用户插入通知
|
|
|
|
|
var userNotice = &user.Notice{
|
|
|
|
|
Type: 1,
|
|
|
|
|
UserID: userTree.RootID,
|
|
|
|
|
Content: "您成功推荐了" + userInfo.Nickname + ",恭喜获得一张升级卡和保级卡",
|
|
|
|
|
CreatTime: formatime.NewSecondNow(),
|
|
|
|
|
}
|
|
|
|
|
tx.Create(userNotice)
|
|
|
|
|
|
|
|
|
|
tx.Commit()
|
|
|
|
|
|
|
|
|
|
// 2、进缓存的set, 为之后计算绩效作准备
|
|
|
|
|
_, err = dbc.Rds.SAdd(IntroCodeSetPrefix+uc.Code, uc.ID).Result()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("introCode set错误:", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, err = dbc.Rds.SAdd(AllIntroCodeSetForCal, uc.Code).Result()
|
|
|
|
|
return err
|
|
|
|
|
}
|