You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package service
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/golangkit/formatime"
"log"
"recook/internal/back"
"recook/internal/cache"
"recook/internal/dbc"
"recook/internal/define"
"recook/internal/model/user"
"recook/internal/service/baseCode"
"recook/tools"
"time"
)
type registerUser struct {
Audit int8
}
func NewRegisterUser() *registerUser {
return &registerUser{}
}
func (r *registerUser) UserAdd(c *gin.Context, login *user.Login, info *user.Information, mobile, invitationNo string) error {
DB := dbc.DB
tx := DB.Begin()
{
sql := `select max(id)+floor(1+rand()*5) from recook_user_info`
var lastId uint
if err := tx.Raw(sql).Count(&lastId).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return err
}
*info = user.Information{
ID: lastId,
AncestorID: 1,
Nickname: "瑞库客" + mobile[7:],
Mobile: mobile,
Birthday: formatime.NewSecondFrom(define.DefaultBirthday),
HeadImgUrl: define.DefaultHeadImage,
Audit: r.Audit,
Phone: mobile,
AssessBegin: formatime.NewSecondNow(), // 第一次的起始时间是注册时间
//AssessEnd: formatime.NewDateFrom(comFunc.NextAssessTime(time.Now())), // 获取下次考核时间
Identifier: time.Now().Format("060102") + baseCode.GetRandomStringForSix(),
}
if err := tx.Create(&info).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建用户错误101:" + err.Error())
return err
}
// 生成邀请码和推荐码
info.InvitationNo = baseCode.GetRandomString(baseCode.InviteCodeLen)
info.IntroCode = baseCode.GetRandomString(baseCode.IntroCodeLen)
if err := tx.Save(&info).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建用户错误102:" + err.Error())
return err
}
// 建立钱包
wallet := user.Wallet{
UserID: info.ID,
}
if err := tx.Create(&wallet).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建用户错误103:" + err.Error())
return err
}
deviceType := cache.GetDeviceType(c)
*login = user.Login{
LoginTime: formatime.NewSecondNow(),
Token: tools.Token(),
IP: c.ClientIP(),
UserID: info.ID,
DeviceType: deviceType,
}
if err := tx.Create(&login).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建用户错误104:" + err.Error())
return err
}
//插入首次登录的通知
//这里插入通知
var userNotice = &user.Notice{
Type: 3,
UserID: info.ID,
Content: "请跳出对话框要求修改昵称",
CreatTime: formatime.NewSecondNow(),
}
tx.Create(userNotice)
// 新的继续沿用他的这层关系表
// 向层级表插入
//var SuperiorUserInfo user.Information
//if partner != 0 {
// // 如果合伙人有值,那就表示他是推荐升级的用户
// dbc.DB.Find(&SuperiorUserInfo, partner)
//} else {
// SuperiorUserInfo = *inviter
//}
//if err := insertNode(tx, &SuperiorUserInfo, info.ID); err != nil {
// tx.Rollback()
// err = fmt.Errorf("创建用户错误105:" + err.Error())
// return err
//}
//如果code是7位 要去记录码的注册记录
if len(invitationNo) == 7 {
//去插入记录
var topCode user.TopCode
err := dbc.DB.First(&topCode, "code=?", invitationNo).Error
if err == nil && topCode.ID > 0 {
topCodenum := user.TopCodenum{
Code: invitationNo,
CreatedTime: formatime.NewSecondNow(),
UserId: info.ID,
PId: topCode.UserId,
}
if err := tx.Create(&topCodenum).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建平台记录失败:" + err.Error())
return err
}
}
}
}
tx.Commit()
// 放入待统计的队列中
go func(code string, userId uint) {
uc := cache.NewUserCode(code, userId) //返回一个结构体code是上级推荐码userid是下级id
if err := uc.ProducerCode(); err != nil { //带着这个结构体去访问这个结构体的方法
log.Println("Panic 放入队列错误", err.Error())
}
}(invitationNo, info.ID)
return nil
}