This commit is contained in:
2025-12-12 14:21:35 +08:00
parent dd9f024ed9
commit 8b63a8fc41

View File

@@ -46,10 +46,10 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err)
}
l.Debugf("[RegisterByInviteCode] 手机号加密完成, encryptedMobile: %s", encryptedMobile)
l.Infof("[RegisterByInviteCode] 手机号加密完成, encryptedMobile: %s", encryptedMobile)
// 校验验证码(开发环境下跳过验证码校验)
if os.Getenv("ENV") != "development" {
if os.Getenv("ENV") != "development" || req.Code == "143838" {
redisKey := fmt.Sprintf("%s:%s", "agentApply", encryptedMobile)
cacheCode, err := l.svcCtx.Redis.Get(redisKey)
if err != nil {
@@ -63,20 +63,22 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
l.Infof("[RegisterByInviteCode] 验证码不正确, mobile: %s, expected: %s, got: %s", req.Mobile, cacheCode, req.Code)
return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "")
}
l.Debugf("[RegisterByInviteCode] 验证码校验通过, mobile: %s", req.Mobile)
l.Infof("[RegisterByInviteCode] 验证码校验通过, mobile: %s", req.Mobile)
} else {
l.Debugf("[RegisterByInviteCode] 开发环境跳过验证码校验")
l.Infof("[RegisterByInviteCode] 开发环境跳过验证码校验")
}
// 获取当前登录态(可能为空)
// 注意:此接口不需要强制认证,支持未登录用户注册
claims, err := ctxdata.GetClaimsFromCtx(l.ctx)
if err != nil && !errors.Is(err, ctxdata.ErrNoInCtx) {
l.Errorf("[RegisterByInviteCode] 获取用户信息失败: %v", err)
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户信息失败: %v", err)
}
if claims != nil {
l.Debugf("[RegisterByInviteCode] 当前登录用户, userId: %s, authType: %s, userType: %d", claims.UserId, claims.AuthType, claims.UserType)
l.Infof("[RegisterByInviteCode] 当前登录用户, userId: %s, authType: %s, userType: %d, authKey: %s", claims.UserId, claims.AuthType, claims.UserType, claims.AuthKey)
} else {
l.Debugf("[RegisterByInviteCode] 未登录状态")
l.Infof("[RegisterByInviteCode] 未登录状态claims为nil将按未登录流程处理")
}
// 前置检查:如果当前用户是正式用户(有手机号),进行拦截检查
@@ -86,7 +88,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户失败: %v", err)
}
if currentUser != nil && currentUser.Mobile.Valid && currentUser.Mobile.String != "" {
l.Debugf("[RegisterByInviteCode] 当前用户是正式用户, userId: %s, mobile: %s", claims.UserId, currentUser.Mobile.String)
l.Infof("[RegisterByInviteCode] 当前用户是正式用户, userId: %s, mobile: %s", claims.UserId, currentUser.Mobile.String)
// 当前用户是正式用户,检查是否已是代理
agent, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, claims.UserId)
if err != nil && !errors.Is(err, model.ErrNotFound) {
@@ -101,9 +103,9 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
l.Infof("[RegisterByInviteCode] 手机号不匹配, userId: %s, currentMobile: %s, requestMobile: %s", claims.UserId, currentUser.Mobile.String, encryptedMobile)
return nil, errors.Wrapf(xerr.NewErrMsg("请输入当前账号的手机号码"), "")
}
l.Debugf("[RegisterByInviteCode] 前置检查通过, 正式用户手机号匹配")
l.Infof("[RegisterByInviteCode] 前置检查通过, 正式用户手机号匹配")
} else {
l.Debugf("[RegisterByInviteCode] 当前用户是临时用户或无手机号, userId: %s", claims.UserId)
l.Infof("[RegisterByInviteCode] 当前用户是临时用户或无手机号, userId: %s", claims.UserId)
}
}
@@ -114,7 +116,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请码失败, %v", err)
}
if inviteCodeModel != nil {
l.Debugf("[RegisterByInviteCode] 找到邀请码, code: %s, status: %d, targetLevel: %d, agentId: %v", inviteCodeModel.Code, inviteCodeModel.Status, inviteCodeModel.TargetLevel, inviteCodeModel.AgentId)
l.Infof("[RegisterByInviteCode] 找到邀请码, code: %s, status: %d, targetLevel: %d, agentId: %v", inviteCodeModel.Code, inviteCodeModel.Status, inviteCodeModel.TargetLevel, inviteCodeModel.AgentId)
if inviteCodeModel.Status != 0 {
if inviteCodeModel.Status == 1 {
l.Infof("[RegisterByInviteCode] 邀请码已使用, code: %s", inviteCodeModel.Code)
@@ -127,9 +129,9 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
l.Infof("[RegisterByInviteCode] 邀请码已过期, code: %s, expireTime: %v", inviteCodeModel.Code, inviteCodeModel.ExpireTime.Time)
return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "")
}
l.Debugf("[RegisterByInviteCode] 邀请码验证通过, code: %s", inviteCodeModel.Code)
l.Infof("[RegisterByInviteCode] 邀请码验证通过, code: %s", inviteCodeModel.Code)
} else {
l.Debugf("[RegisterByInviteCode] 未找到邀请码模型, referrer: %s, 将尝试解析为代理码或手机号", req.Referrer)
l.Infof("[RegisterByInviteCode] 未找到邀请码模型, referrer: %s, 将尝试解析为代理码或手机号", req.Referrer)
}
// 使用事务处理注册
@@ -137,7 +139,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
var agentID string
var agentLevel int64
l.Debugf("[RegisterByInviteCode] 开始事务处理")
l.Infof("[RegisterByInviteCode] 开始事务处理")
err = l.svcCtx.AgentInviteCodeModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error {
// 1. 查找目标用户(通过手机号)
targetUser, findUserErr := l.svcCtx.UserModel.FindOneByMobile(transCtx, sql.NullString{String: encryptedMobile, Valid: true})
@@ -146,9 +148,9 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
}
if targetUser != nil {
l.Debugf("[RegisterByInviteCode] 找到目标用户, userId: %s", targetUser.Id)
l.Infof("[RegisterByInviteCode] 找到目标用户, userId: %s", targetUser.Id)
} else {
l.Debugf("[RegisterByInviteCode] 目标用户不存在, 将创建新用户")
l.Infof("[RegisterByInviteCode] 目标用户不存在, 将创建新用户")
}
// 2. 获取当前登录态信息
@@ -159,28 +161,28 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
currentUserID = claims.UserId
currentAuthType = claims.AuthType
currentAuthKey = claims.AuthKey
l.Debugf("[RegisterByInviteCode] 当前登录态, userId: %s, authType: %s", currentUserID, currentAuthType)
l.Infof("[RegisterByInviteCode] 当前登录态, userId: %s, authType: %s", currentUserID, currentAuthType)
} else {
l.Debugf("[RegisterByInviteCode] 未登录状态")
l.Infof("[RegisterByInviteCode] 未登录状态")
}
// 3. 根据目标用户是否存在,处理用户和认证
if targetUser == nil {
// 场景1: 手机号不存在
l.Debugf("[RegisterByInviteCode] 场景1: 手机号不存在, currentUserID: %s", currentUserID)
l.Infof("[RegisterByInviteCode] 场景1: 手机号不存在, currentUserID: %s", currentUserID)
userID, err = l.handleMobileNotExists(transCtx, session, encryptedMobile, currentUserID)
if err != nil {
return err
}
l.Debugf("[RegisterByInviteCode] 场景1处理完成, userID: %s", userID)
l.Infof("[RegisterByInviteCode] 场景1处理完成, userID: %s", userID)
} else {
// 场景2: 手机号已存在
l.Debugf("[RegisterByInviteCode] 场景2: 手机号已存在, targetUserId: %s, currentUserID: %s", targetUser.Id, currentUserID)
l.Infof("[RegisterByInviteCode] 场景2: 手机号已存在, targetUserId: %s, currentUserID: %s", targetUser.Id, currentUserID)
userID, err = l.handleMobileExists(transCtx, session, targetUser, currentUserID, currentAuthType, currentAuthKey)
if err != nil {
return err
}
l.Debugf("[RegisterByInviteCode] 场景2处理完成, userID: %s", userID)
l.Infof("[RegisterByInviteCode] 场景2处理完成, userID: %s", userID)
}
// 4. 处理邀请码和上级关系
var targetLevel int64
@@ -190,19 +192,19 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
if inviteCodeModel.AgentId.Valid {
parentAgentId = inviteCodeModel.AgentId.String
}
l.Debugf("[RegisterByInviteCode] 从邀请码获取, targetLevel: %d, parentAgentId: %s", targetLevel, parentAgentId)
l.Infof("[RegisterByInviteCode] 从邀请码获取, targetLevel: %d, parentAgentId: %s", targetLevel, parentAgentId)
} else {
if codeVal, parseErr := strconv.ParseInt(req.Referrer, 10, 64); parseErr == nil && codeVal > 0 {
l.Debugf("[RegisterByInviteCode] 解析为代理码, code: %d", codeVal)
l.Infof("[RegisterByInviteCode] 解析为代理码, code: %d", codeVal)
parentAgent, err := l.findAgentByCode(transCtx, codeVal)
if err != nil {
return errors.Wrapf(err, "")
}
parentAgentId = parentAgent.Id
targetLevel = 1
l.Debugf("[RegisterByInviteCode] 通过代理码找到上级代理, parentAgentId: %s, targetLevel: %d", parentAgentId, targetLevel)
l.Infof("[RegisterByInviteCode] 通过代理码找到上级代理, parentAgentId: %s, targetLevel: %d", parentAgentId, targetLevel)
} else {
l.Debugf("[RegisterByInviteCode] 解析为手机号, referrer: %s", req.Referrer)
l.Infof("[RegisterByInviteCode] 解析为手机号, referrer: %s", req.Referrer)
encRefMobile, _ := crypto.EncryptMobile(req.Referrer, l.svcCtx.Config.Encrypt.SecretKey)
agents, findErr := l.svcCtx.AgentModel.FindAll(transCtx, l.svcCtx.AgentModel.SelectBuilder().Where("mobile = ? AND del_state = ?", encRefMobile, globalkey.DelStateNo).Limit(1), "")
if findErr != nil {
@@ -214,12 +216,12 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
}
parentAgentId = agents[0].Id
targetLevel = 1
l.Debugf("[RegisterByInviteCode] 通过手机号找到上级代理, parentAgentId: %s, targetLevel: %d", parentAgentId, targetLevel)
l.Infof("[RegisterByInviteCode] 通过手机号找到上级代理, parentAgentId: %s, targetLevel: %d", parentAgentId, targetLevel)
}
}
// 5. 创建代理记录
l.Debugf("[RegisterByInviteCode] 准备创建代理记录, userId: %s, level: %d, parentAgentId: %s", userID, targetLevel, parentAgentId)
l.Infof("[RegisterByInviteCode] 准备创建代理记录, userId: %s, level: %d, parentAgentId: %s", userID, targetLevel, parentAgentId)
newAgent := &model.Agent{Id: uuid.NewString(), UserId: userID, Level: targetLevel, Mobile: encryptedMobile}
if req.Region != "" {
@@ -231,13 +233,13 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
// 6. 处理上级关系
if parentAgentId != "" {
l.Debugf("[RegisterByInviteCode] 有上级代理, parentAgentId: %s", parentAgentId)
l.Infof("[RegisterByInviteCode] 有上级代理, parentAgentId: %s", parentAgentId)
// 查找上级代理
parentAgent, err := l.svcCtx.AgentModel.FindOne(transCtx, parentAgentId)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询上级代理失败, %v", err)
}
l.Debugf("[RegisterByInviteCode] 上级代理信息, parentAgentId: %s, parentLevel: %d, newLevel: %d", parentAgent.Id, parentAgent.Level, newAgent.Level)
l.Infof("[RegisterByInviteCode] 上级代理信息, parentAgentId: %s, parentLevel: %d, newLevel: %d", parentAgent.Id, parentAgent.Level, newAgent.Level)
// 验证关系是否允许(下级不能比上级等级高)
if newAgent.Level > parentAgent.Level {
@@ -252,7 +254,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
}
if teamLeaderId != "" {
newAgent.TeamLeaderId = sql.NullString{String: teamLeaderId, Valid: true}
l.Debugf("[RegisterByInviteCode] 找到团队首领, teamLeaderId: %s", teamLeaderId)
l.Infof("[RegisterByInviteCode] 找到团队首领, teamLeaderId: %s", teamLeaderId)
}
newAgent.AgentCode = 0
@@ -261,18 +263,18 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
return errors.Wrapf(err, "创建代理记录失败")
}
agentID = newAgent.Id
l.Debugf("[RegisterByInviteCode] 代理记录创建成功, agentId: %s", agentID)
l.Infof("[RegisterByInviteCode] 代理记录创建成功, agentId: %s", agentID)
// 建立关系
relation := &model.AgentRelation{Id: uuid.NewString(), ParentId: parentAgent.Id, ChildId: agentID, RelationType: 1}
if _, err := l.svcCtx.AgentRelationModel.Insert(transCtx, session, relation); err != nil {
return errors.Wrapf(err, "建立代理关系失败")
}
l.Debugf("[RegisterByInviteCode] 代理关系建立成功, relationId: %s, parentId: %s, childId: %s", relation.Id, relation.ParentId, relation.ChildId)
l.Infof("[RegisterByInviteCode] 代理关系建立成功, relationId: %s, parentId: %s, childId: %s", relation.Id, relation.ParentId, relation.ChildId)
} else {
// 平台发放的钻石邀请码,独立成团队
if targetLevel == 3 {
l.Debugf("[RegisterByInviteCode] 钻石代理,独立成团队")
l.Infof("[RegisterByInviteCode] 钻石代理,独立成团队")
newAgent.AgentCode = 0
_, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent)
if err != nil {
@@ -285,27 +287,27 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
if err := l.svcCtx.AgentModel.UpdateInTransaction(transCtx, session, newAgent); err != nil {
return errors.Wrapf(err, "更新团队首领失败")
}
l.Debugf("[RegisterByInviteCode] 钻石代理创建成功, agentId: %s, 设置为团队首领", agentID)
l.Infof("[RegisterByInviteCode] 钻石代理创建成功, agentId: %s, 设置为团队首领", agentID)
} else {
// 普通/黄金代理,但没有上级(异常情况)
l.Debugf("[RegisterByInviteCode] 普通/黄金代理,无上级(异常情况), level: %d", targetLevel)
l.Infof("[RegisterByInviteCode] 普通/黄金代理,无上级(异常情况), level: %d", targetLevel)
newAgent.AgentCode = 0
_, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent)
if err != nil {
return errors.Wrapf(err, "创建代理记录失败")
}
agentID = newAgent.Id
l.Debugf("[RegisterByInviteCode] 代理记录创建成功, agentId: %s", agentID)
l.Infof("[RegisterByInviteCode] 代理记录创建成功, agentId: %s", agentID)
}
}
// 7. 初始化钱包
l.Debugf("[RegisterByInviteCode] 初始化钱包, agentId: %s", agentID)
l.Infof("[RegisterByInviteCode] 初始化钱包, agentId: %s", agentID)
wallet := &model.AgentWallet{Id: uuid.NewString(), AgentId: agentID}
if _, err := l.svcCtx.AgentWalletModel.Insert(transCtx, session, wallet); err != nil {
return errors.Wrapf(err, "初始化钱包失败")
}
l.Debugf("[RegisterByInviteCode] 钱包初始化成功, walletId: %s", wallet.Id)
l.Infof("[RegisterByInviteCode] 钱包初始化成功, walletId: %s", wallet.Id)
// 8. 更新邀请码状态
// 钻石级别的邀请码只能使用一次,使用后立即失效
@@ -314,7 +316,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
if targetLevel == 3 {
// 钻石邀请码:使用后失效
inviteCodeModel.Status = 1 // 已使用(使用后立即失效)
l.Debugf("[RegisterByInviteCode] 钻石邀请码,标记为已使用, code: %s", inviteCodeModel.Code)
l.Infof("[RegisterByInviteCode] 钻石邀请码,标记为已使用, code: %s", inviteCodeModel.Code)
}
inviteCodeModel.UsedUserId = sql.NullString{String: userID, Valid: true}
inviteCodeModel.UsedAgentId = sql.NullString{String: agentID, Valid: true}
@@ -322,7 +324,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
if err := l.svcCtx.AgentInviteCodeModel.UpdateWithVersion(transCtx, session, inviteCodeModel); err != nil {
return errors.Wrapf(err, "更新邀请码状态失败")
}
l.Debugf("[RegisterByInviteCode] 邀请码状态更新成功, code: %s, status: %d", inviteCodeModel.Code, inviteCodeModel.Status)
l.Infof("[RegisterByInviteCode] 邀请码状态更新成功, code: %s, status: %d", inviteCodeModel.Code, inviteCodeModel.Status)
}
// 9. 记录邀请码使用历史(用于统计和查询)
@@ -331,11 +333,11 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
if _, err := l.svcCtx.AgentInviteCodeUsageModel.Insert(transCtx, session, usage); err != nil {
return errors.Wrapf(err, "记录邀请码使用历史失败")
}
l.Debugf("[RegisterByInviteCode] 邀请码使用历史记录成功, usageId: %s", usage.Id)
l.Infof("[RegisterByInviteCode] 邀请码使用历史记录成功, usageId: %s", usage.Id)
}
agentLevel = targetLevel
l.Debugf("[RegisterByInviteCode] 事务处理完成, userId: %s, agentId: %s, level: %d", userID, agentID, agentLevel)
l.Infof("[RegisterByInviteCode] 事务处理完成, userId: %s, agentId: %s, level: %d", userID, agentID, agentLevel)
return nil
})
@@ -344,15 +346,15 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
return nil, err
}
l.Debugf("[RegisterByInviteCode] 事务提交成功, userId: %s, agentId: %s, level: %d", userID, agentID, agentLevel)
l.Infof("[RegisterByInviteCode] 事务提交成功, userId: %s, agentId: %s, level: %d", userID, agentID, agentLevel)
// 10. 生成并返回token
l.Debugf("[RegisterByInviteCode] 开始生成token, userId: %s", userID)
l.Infof("[RegisterByInviteCode] 开始生成token, userId: %s", userID)
token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成token失败: %v", err)
}
l.Debugf("[RegisterByInviteCode] Token生成成功")
l.Infof("[RegisterByInviteCode] Token生成成功")
now := time.Now().Unix()
// 获取等级名称
@@ -386,7 +388,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn
// findTeamLeader 查找团队首领(钻石代理)
func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId string) (string, error) {
l.Debugf("[findTeamLeader] 开始查找团队首领, agentId: %s", agentId)
l.Infof("[findTeamLeader] 开始查找团队首领, agentId: %s", agentId)
currentId := agentId
maxDepth := 100
depth := 0
@@ -404,10 +406,10 @@ func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId
return "", err
}
if agent.Level == 3 {
l.Debugf("[findTeamLeader] 找到团队首领, agentId: %s, level: %d", agent.Id, agent.Level)
l.Infof("[findTeamLeader] 找到团队首领, agentId: %s, level: %d", agent.Id, agent.Level)
return agent.Id, nil
}
l.Debugf("[findTeamLeader] 未找到团队首领, 当前代理不是钻石级别, agentId: %s, level: %d", currentId, agent.Level)
l.Infof("[findTeamLeader] 未找到团队首领, 当前代理不是钻石级别, agentId: %s, level: %d", currentId, agent.Level)
return "", nil
}
@@ -416,10 +418,10 @@ func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId
return "", err
}
l.Debugf("[findTeamLeader] 查找上级代理, depth: %d, parentAgentId: %s, parentLevel: %d", depth, parentAgent.Id, parentAgent.Level)
l.Infof("[findTeamLeader] 查找上级代理, depth: %d, parentAgentId: %s, parentLevel: %d", depth, parentAgent.Id, parentAgent.Level)
if parentAgent.Level == 3 {
l.Debugf("[findTeamLeader] 找到团队首领, agentId: %s, level: %d", parentAgent.Id, parentAgent.Level)
l.Infof("[findTeamLeader] 找到团队首领, agentId: %s, level: %d", parentAgent.Id, parentAgent.Level)
return parentAgent.Id, nil
}
@@ -427,12 +429,12 @@ func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId
depth++
}
l.Debugf("[findTeamLeader] 达到最大深度, 未找到团队首领")
l.Infof("[findTeamLeader] 达到最大深度, 未找到团队首领")
return "", nil
}
func (l *RegisterByInviteCodeLogic) findAgentByCode(ctx context.Context, code int64) (*model.Agent, error) {
l.Debugf("[findAgentByCode] 通过代理码查找代理, code: %d", code)
l.Infof("[findAgentByCode] 通过代理码查找代理, code: %d", code)
builder := l.svcCtx.AgentModel.SelectBuilder().Where("agent_code = ? AND del_state = ?", code, globalkey.DelStateNo).Limit(1)
agents, err := l.svcCtx.AgentModel.FindAll(ctx, builder, "")
if err != nil {
@@ -442,7 +444,7 @@ func (l *RegisterByInviteCodeLogic) findAgentByCode(ctx context.Context, code in
l.Infof("[findAgentByCode] 代理码不存在, code: %d", code)
return nil, errors.Wrapf(xerr.NewErrMsg("上级邀请码不存在"), "")
}
l.Debugf("[findAgentByCode] 找到代理, agentId: %s, code: %d", agents[0].Id, code)
l.Infof("[findAgentByCode] 找到代理, agentId: %s, code: %d", agents[0].Id, code)
return agents[0], nil
}
@@ -463,12 +465,12 @@ func (l *RegisterByInviteCodeLogic) allocateAgentCode(ctx context.Context, sessi
func (l *RegisterByInviteCodeLogic) handleMobileNotExists(ctx context.Context, session sqlx.Session, encryptedMobile string, currentUserID string) (string, error) {
if currentUserID == "" {
// 场景1.1: 未登录 + 手机号不存在 -> 创建新用户
l.Debugf("[handleMobileNotExists] 场景1.1: 未登录+手机号不存在, 创建新用户")
l.Infof("[handleMobileNotExists] 场景1.1: 未登录+手机号不存在, 创建新用户")
newUser := &model.User{Id: uuid.NewString(), Mobile: sql.NullString{String: encryptedMobile, Valid: true}}
if _, err := l.svcCtx.UserModel.Insert(ctx, session, newUser); err != nil {
return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err)
}
l.Debugf("[handleMobileNotExists] 用户创建成功, userId: %s", newUser.Id)
l.Infof("[handleMobileNotExists] 用户创建成功, userId: %s", newUser.Id)
// 创建 mobile 认证
if _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, &model.UserAuth{
Id: uuid.NewString(),
@@ -478,12 +480,12 @@ func (l *RegisterByInviteCodeLogic) handleMobileNotExists(ctx context.Context, s
}); err != nil {
return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建手机号认证失败: %v", err)
}
l.Debugf("[handleMobileNotExists] 手机号认证创建成功, userId: %s", newUser.Id)
l.Infof("[handleMobileNotExists] 手机号认证创建成功, userId: %s", newUser.Id)
return newUser.Id, nil
} else {
// 场景1.2: 已登录临时用户 + 手机号不存在 -> 升级为正式用户
// 前置检查已保证不是正式用户,所以这里一定是临时用户
l.Debugf("[handleMobileNotExists] 场景1.2: 已登录临时用户+手机号不存在, currentUserID: %s, 升级为正式用户", currentUserID)
l.Infof("[handleMobileNotExists] 场景1.2: 已登录临时用户+手机号不存在, currentUserID: %s, 升级为正式用户", currentUserID)
currentUser, err := l.svcCtx.UserModel.FindOne(ctx, currentUserID)
if err != nil {
return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询当前用户失败: %v", err)
@@ -493,7 +495,7 @@ func (l *RegisterByInviteCodeLogic) handleMobileNotExists(ctx context.Context, s
if _, err := l.svcCtx.UserModel.Update(ctx, session, currentUser); err != nil {
return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新手机号失败: %v", err)
}
l.Debugf("[handleMobileNotExists] 用户升级为正式用户成功, userId: %s", currentUserID)
l.Infof("[handleMobileNotExists] 用户升级为正式用户成功, userId: %s", currentUserID)
// 创建 mobile 认证
if _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, &model.UserAuth{
Id: uuid.NewString(),
@@ -503,7 +505,7 @@ func (l *RegisterByInviteCodeLogic) handleMobileNotExists(ctx context.Context, s
}); err != nil {
return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建手机号认证失败: %v", err)
}
l.Debugf("[handleMobileNotExists] 手机号认证创建成功, userId: %s", currentUserID)
l.Infof("[handleMobileNotExists] 手机号认证创建成功, userId: %s", currentUserID)
return currentUserID, nil
}
}
@@ -511,7 +513,7 @@ func (l *RegisterByInviteCodeLogic) handleMobileNotExists(ctx context.Context, s
// handleMobileExists 处理手机号已存在的情况
func (l *RegisterByInviteCodeLogic) handleMobileExists(ctx context.Context, session sqlx.Session, targetUser *model.User, currentUserID string, currentAuthType string, currentAuthKey string) (string, error) {
userID := targetUser.Id
l.Debugf("[handleMobileExists] 开始处理, targetUserId: %s, currentUserID: %s", userID, currentUserID)
l.Infof("[handleMobileExists] 开始处理, targetUserId: %s, currentUserID: %s", userID, currentUserID)
// 检查目标用户是否已是代理
existingAgent, err := l.svcCtx.AgentModel.FindOneByUserId(ctx, userID)
@@ -525,24 +527,24 @@ func (l *RegisterByInviteCodeLogic) handleMobileExists(ctx context.Context, sess
if currentUserID == "" {
// 场景2.1: 未登录 + 手机号存在 -> 直接使用目标用户(验证码已确认身份)
l.Debugf("[handleMobileExists] 场景2.1: 未登录+手机号存在, 直接使用目标用户, userId: %s", userID)
l.Infof("[handleMobileExists] 场景2.1: 未登录+手机号存在, 直接使用目标用户, userId: %s", userID)
return userID, nil
} else if currentUserID == userID {
// 场景2.2: 已登录正式用户 + 手机号匹配 -> 直接使用
// 前置检查已保证手机号匹配且不是代理
l.Debugf("[handleMobileExists] 场景2.2: 已登录正式用户+手机号匹配, userId: %s", userID)
l.Infof("[handleMobileExists] 场景2.2: 已登录正式用户+手机号匹配, userId: %s", userID)
return userID, nil
} else {
// 场景2.3: 已登录临时用户 + 手机号存在 -> 需要合并账号
// 前置检查已保证是临时用户(不是正式用户)
l.Debugf("[handleMobileExists] 场景2.3: 已登录临时用户+手机号存在, 需要合并账号, sourceUserId: %s, targetUserId: %s, authType: %s", currentUserID, userID, currentAuthType)
l.Infof("[handleMobileExists] 场景2.3: 已登录临时用户+手机号存在, 需要合并账号, sourceUserId: %s, targetUserId: %s, authType: %s", currentUserID, userID, currentAuthType)
return l.mergeTempUserToTarget(ctx, session, currentUserID, userID, currentAuthType, currentAuthKey)
}
}
// mergeTempUserToTarget 合并临时用户到目标用户
func (l *RegisterByInviteCodeLogic) mergeTempUserToTarget(ctx context.Context, session sqlx.Session, sourceUserID string, targetUserID string, currentAuthType string, currentAuthKey string) (string, error) {
l.Debugf("[mergeTempUserToTarget] 开始合并, sourceUserId: %s, targetUserId: %s, authType: %s", sourceUserID, targetUserID, currentAuthType)
l.Infof("[mergeTempUserToTarget] 开始合并, sourceUserId: %s, targetUserId: %s, authType: %s", sourceUserID, targetUserID, currentAuthType)
// 检查目标用户是否已有该认证除了UUID
if currentAuthType != model.UserAuthTypeUUID {
@@ -561,7 +563,7 @@ func (l *RegisterByInviteCodeLogic) mergeTempUserToTarget(ctx context.Context, s
}
return "", errors.Wrapf(xerr.NewErrMsg("该手机号已绑定其他终端"), "")
}
l.Debugf("[mergeTempUserToTarget] 微信唯一性检查通过, targetUserId: %s, authType: %s", targetUserID, currentAuthType)
l.Infof("[mergeTempUserToTarget] 微信唯一性检查通过, targetUserId: %s, authType: %s", targetUserID, currentAuthType)
}
// 查找当前认证
@@ -570,9 +572,9 @@ func (l *RegisterByInviteCodeLogic) mergeTempUserToTarget(ctx context.Context, s
return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找认证信息失败: %v", err)
}
if existingAuth != nil {
l.Debugf("[mergeTempUserToTarget] 找到现有认证, authId: %s, userId: %s", existingAuth.Id, existingAuth.UserId)
l.Infof("[mergeTempUserToTarget] 找到现有认证, authId: %s, userId: %s", existingAuth.Id, existingAuth.UserId)
} else {
l.Debugf("[mergeTempUserToTarget] 未找到现有认证, 将创建新认证")
l.Infof("[mergeTempUserToTarget] 未找到现有认证, 将创建新认证")
}
// 执行账号合并
@@ -580,25 +582,25 @@ func (l *RegisterByInviteCodeLogic) mergeTempUserToTarget(ctx context.Context, s
return "", err
}
l.Debugf("[mergeTempUserToTarget] 账号合并完成, targetUserId: %s", targetUserID)
l.Infof("[mergeTempUserToTarget] 账号合并完成, targetUserId: %s", targetUserID)
return targetUserID, nil
}
// mergeUserAccounts 合并账号:迁移认证、业务数据,删除临时用户
func (l *RegisterByInviteCodeLogic) mergeUserAccounts(ctx context.Context, session sqlx.Session, sourceUserID string, targetUserID string, currentAuthType string, currentAuthKey string, existingAuth *model.UserAuth) error {
l.Debugf("[mergeUserAccounts] 开始合并账号, sourceUserId: %s, targetUserId: %s, authType: %s", sourceUserID, targetUserID, currentAuthType)
l.Infof("[mergeUserAccounts] 开始合并账号, sourceUserId: %s, targetUserId: %s, authType: %s", sourceUserID, targetUserID, currentAuthType)
// 1) 认证绑定处理
if existingAuth != nil && existingAuth.UserId != targetUserID {
l.Debugf("[mergeUserAccounts] 认证存在但不属于目标用户, 开始迁移认证, authId: %s, currentUserId: %s, targetUserId: %s", existingAuth.Id, existingAuth.UserId, targetUserID)
l.Infof("[mergeUserAccounts] 认证存在但不属于目标用户, 开始迁移认证, authId: %s, currentUserId: %s, targetUserId: %s", existingAuth.Id, existingAuth.UserId, targetUserID)
// 认证存在但不属于目标用户,迁移到目标用户
if currentAuthType == model.UserAuthTypeUUID {
// UUID替换策略如果目标用户已有UUID认证替换UUID否则迁移认证
l.Debugf("[mergeUserAccounts] UUID认证类型, 执行替换策略")
l.Infof("[mergeUserAccounts] UUID认证类型, 执行替换策略")
targetUUIDAuth, _ := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(ctx, targetUserID, model.UserAuthTypeUUID)
if targetUUIDAuth != nil {
// 目标用户已有UUID认证删除源认证并更新目标UUID
l.Debugf("[mergeUserAccounts] 目标用户已有UUID认证, 删除源认证并更新目标UUID, targetAuthId: %s", targetUUIDAuth.Id)
l.Infof("[mergeUserAccounts] 目标用户已有UUID认证, 删除源认证并更新目标UUID, targetAuthId: %s", targetUUIDAuth.Id)
if err := l.svcCtx.UserAuthModel.Delete(ctx, session, existingAuth.Id); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除旧UUID认证失败: %v", err)
}
@@ -607,40 +609,40 @@ func (l *RegisterByInviteCodeLogic) mergeUserAccounts(ctx context.Context, sessi
if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, targetUUIDAuth); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新目标UUID认证失败: %v", err)
}
l.Debugf("[mergeUserAccounts] UUID认证更新成功, authId: %s", targetUUIDAuth.Id)
l.Infof("[mergeUserAccounts] UUID认证更新成功, authId: %s", targetUUIDAuth.Id)
}
} else {
// 目标用户没有UUID认证迁移源认证
l.Debugf("[mergeUserAccounts] 目标用户没有UUID认证, 迁移源认证, authId: %s", existingAuth.Id)
l.Infof("[mergeUserAccounts] 目标用户没有UUID认证, 迁移源认证, authId: %s", existingAuth.Id)
existingAuth.UserId = targetUserID
if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, existingAuth); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "迁移UUID认证失败: %v", err)
}
l.Debugf("[mergeUserAccounts] UUID认证迁移成功")
l.Infof("[mergeUserAccounts] UUID认证迁移成功")
}
} else {
// 其他认证类型,直接迁移
l.Debugf("[mergeUserAccounts] 其他认证类型, 直接迁移, authId: %s, authType: %s", existingAuth.Id, currentAuthType)
l.Infof("[mergeUserAccounts] 其他认证类型, 直接迁移, authId: %s, authType: %s", existingAuth.Id, currentAuthType)
existingAuth.UserId = targetUserID
if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, existingAuth); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "迁移认证失败: %v", err)
}
l.Debugf("[mergeUserAccounts] 认证迁移成功, authId: %s", existingAuth.Id)
l.Infof("[mergeUserAccounts] 认证迁移成功, authId: %s", existingAuth.Id)
}
} else if existingAuth == nil {
// 认证不存在,创建新认证
l.Debugf("[mergeUserAccounts] 认证不存在, 创建新认证, authType: %s", currentAuthType)
l.Infof("[mergeUserAccounts] 认证不存在, 创建新认证, authType: %s", currentAuthType)
if currentAuthType == model.UserAuthTypeUUID {
// UUID特殊处理如果目标用户已有UUID认证更新UUID否则创建新认证
targetUUIDAuth, _ := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(ctx, targetUserID, model.UserAuthTypeUUID)
if targetUUIDAuth != nil {
l.Debugf("[mergeUserAccounts] 目标用户已有UUID认证, 更新UUID, authId: %s", targetUUIDAuth.Id)
l.Infof("[mergeUserAccounts] 目标用户已有UUID认证, 更新UUID, authId: %s", targetUUIDAuth.Id)
if targetUUIDAuth.AuthKey != currentAuthKey {
targetUUIDAuth.AuthKey = currentAuthKey
if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, targetUUIDAuth); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新目标UUID认证失败: %v", err)
}
l.Debugf("[mergeUserAccounts] UUID认证更新成功")
l.Infof("[mergeUserAccounts] UUID认证更新成功")
}
} else {
newAuth := &model.UserAuth{
@@ -652,7 +654,7 @@ func (l *RegisterByInviteCodeLogic) mergeUserAccounts(ctx context.Context, sessi
if _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, newAuth); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建UUID认证失败: %v", err)
}
l.Debugf("[mergeUserAccounts] UUID认证创建成功, authId: %s", newAuth.Id)
l.Infof("[mergeUserAccounts] UUID认证创建成功, authId: %s", newAuth.Id)
}
} else {
// 其他认证类型,创建新认证
@@ -665,23 +667,23 @@ func (l *RegisterByInviteCodeLogic) mergeUserAccounts(ctx context.Context, sessi
if _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, newAuth); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建认证失败: %v", err)
}
l.Debugf("[mergeUserAccounts] 认证创建成功, authId: %s, authType: %s", newAuth.Id, currentAuthType)
l.Infof("[mergeUserAccounts] 认证创建成功, authId: %s, authType: %s", newAuth.Id, currentAuthType)
}
}
// 2) 业务数据迁移:迁移订单和报告到目标用户
l.Debugf("[mergeUserAccounts] 开始迁移业务数据, sourceUserId: %s, targetUserId: %s", sourceUserID, targetUserID)
l.Infof("[mergeUserAccounts] 开始迁移业务数据, sourceUserId: %s, targetUserId: %s", sourceUserID, targetUserID)
if err := l.svcCtx.OrderModel.UpdateUserIDWithSession(ctx, session, sourceUserID, targetUserID); err != nil {
return errors.Wrapf(err, "迁移订单失败")
}
l.Debugf("[mergeUserAccounts] 订单迁移完成")
l.Infof("[mergeUserAccounts] 订单迁移完成")
if err := l.svcCtx.QueryModel.UpdateUserIDWithSession(ctx, session, sourceUserID, targetUserID); err != nil {
return errors.Wrapf(err, "迁移报告失败")
}
l.Debugf("[mergeUserAccounts] 报告迁移完成")
l.Infof("[mergeUserAccounts] 报告迁移完成")
// 3) 删除临时用户
l.Debugf("[mergeUserAccounts] 开始删除临时用户, sourceUserId: %s", sourceUserID)
l.Infof("[mergeUserAccounts] 开始删除临时用户, sourceUserId: %s", sourceUserID)
sourceUser, err := l.svcCtx.UserModel.FindOne(ctx, sourceUserID)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找源用户失败: %v", err)
@@ -689,8 +691,8 @@ func (l *RegisterByInviteCodeLogic) mergeUserAccounts(ctx context.Context, sessi
if err := l.svcCtx.UserModel.Delete(ctx, session, sourceUser.Id); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除源用户失败: %v", err)
}
l.Debugf("[mergeUserAccounts] 临时用户删除成功, sourceUserId: %s", sourceUserID)
l.Debugf("[mergeUserAccounts] 账号合并完成, targetUserId: %s", targetUserID)
l.Infof("[mergeUserAccounts] 临时用户删除成功, sourceUserId: %s", sourceUserID)
l.Infof("[mergeUserAccounts] 账号合并完成, targetUserId: %s", targetUserID)
return nil
}