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

4 years ago
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 {
4 years ago
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(),
4 years ago
}
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
}