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 ®isterUser{} } 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 }