032215-修复validateAndCreateReferrals方法逻辑.md 4.3 KB

修复 validateAndCreateReferrals 方法逻辑

任务时间: 2025年07月03日 22:15
任务类型: Bug修复
模块: UrsPromotion

问题描述

用户发现 validateAndCreateReferrals 方法的注释说是补全20代关系,但实际代码只创建了一条直接推荐关系记录,与注释不符。

问题分析

原始问题

  1. 注释误导: 方法注释说"补充缺失的推荐关系记录(20代关系)"
  2. 实现不符: 实际代码只创建了一条直接推荐关系
  3. 理解错误: 我最初误解了20代关系的实现方式

正确理解

经过分析,发现:

  1. URS数据结构: URS返回的team数据格式为 {'1': 直接上级, '2': 二级上级, ...}
  2. 推荐关系表: urs_promotion_user_referrals 只存储直接推荐关系
  3. 20代关系: 通过 urs_promotion_user_relation_cache 表实现
  4. 生成时机: 关系缓存在 generateRelationCache 方法中生成

修复方案

1. 理解数据库设计

经过分析数据库表结构发现:

  • urs_promotion_user_referrals 表有唯一约束 uk_urs_user_id
  • 每个URS用户只能有一条推荐关系记录(直接推荐人)
  • 但需要为整个20代链条中的每个用户补全其推荐关系

2. 正确的20代关系补全逻辑

2.1 创建当前用户的直接推荐关系

// 为当前用户创建推荐关系:用户 -> 直接推荐人
UrsUserReferral::create([
    'urs_user_id' => $ursUserId,
    'urs_referrer_id' => $directReferrerId,
    // ...
]);

2.2 补全20代链条中的推荐关系

// 为链条中的每个推荐人补全其推荐关系
for ($level = 1; $level <= $maxLevel; $level++) {
    $referrerId = $teamRelations[$level];
    $upperReferrerId = $teamRelations[$level + 1] ?? null;

    if ($upperReferrerId && !existsReferral($referrerId)) {
        // 创建:推荐人 -> 上级推荐人
        UrsUserReferral::create([
            'urs_user_id' => $referrerId,
            'urs_referrer_id' => $upperReferrerId,
            // ...
        ]);
    }
}

2.3 实现特点

  • 确保整个20代链条中每个用户都有推荐关系记录
  • 避免重复创建已存在的推荐关系
  • 处理创建失败的异常情况

修复结果

代码变更

  • 文件: app/Module/UrsPromotion/Logics/UrsReferralSyncLogic.php
  • 修改内容:
    • 实现真正的20代推荐关系补全逻辑
    • 为当前用户创建直接推荐关系
    • 为20代链条中的每个用户补全其推荐关系
    • 增加重复检查和异常处理
    • 详细的日志记录

逻辑实现

  1. 当前用户: 创建 用户 -> 直接推荐人 的关系记录
  2. 链条补全: 为链条中每个推荐人创建 推荐人 -> 上级推荐人 的关系记录
  3. 完整覆盖: 确保整个20代链条中每个用户都有推荐关系记录
  4. 数据流程: URS数据 -> 补全20代推荐关系 -> 关系缓存 -> 完整的推荐体系

技术要点

URS数据结构

{
    "team": {
        "1": 10001,  // 直接推荐人
        "2": 10002,  // 二级推荐人
        "3": 10003,  // 三级推荐人
        ...
        "20": 10020  // 20级推荐人
    }
}

关系存储设计

  • 基础关系: urs_promotion_user_referrals 存储直接推荐关系
  • 缓存关系: urs_promotion_user_relation_cache 存储20代关系缓存
  • 查询优化: 通过缓存表实现高效的多级关系查询

验证测试

通过 tinker 测试验证了团队数据解析逻辑:

  • 正确解析 URS 返回的团队数据结构
  • 正确提取直接推荐人ID
  • 正确识别可用层级数量

总结

这次修复实现了真正的20代推荐关系补全功能:

核心改进

  1. 完整实现: 真正补全20代链条中每个用户的推荐关系
  2. 数据完整性: 确保推荐关系表中包含完整的推荐链条
  3. 异常处理: 处理重复创建和创建失败的情况
  4. 性能考虑: 避免重复查询和创建

实现效果

  • 当用户进入农场时,不仅创建自己的推荐关系
  • 同时补全整个20代上级链条中缺失的推荐关系
  • 为后续的关系缓存生成提供完整的基础数据
  • 支持完整的20代推荐体系运作

修复后的方法真正实现了注释中描述的"补充缺失的推荐关系记录(20代关系)"功能。