info('=== URS关系缓存断代修复测试 ==='); if ($this->option('check')) { $this->checkBreakageIssues(); } elseif ($this->option('fix')) { $this->fixBreakageIssues(); } elseif ($this->option('stats')) { $this->showStatistics(); } elseif ($this->option('user-id')) { $this->testSpecificUser((int)$this->option('user-id')); } else { $this->showUsage(); } } /** * 检查断代问题 */ private function checkBreakageIssues() { $this->info('检查关系缓存断代问题...'); // 1. 查找有推荐关系但没有缓存的用户 $usersWithReferralButNoCache = DB::select(" SELECT r.urs_user_id, r.urs_referrer_id, m.user_id as farm_user_id FROM kku_urs_promotion_user_referrals r LEFT JOIN kku_urs_promotion_user_relation_cache c ON r.urs_user_id = c.urs_user_id LEFT JOIN kku_urs_promotion_user_mappings m ON r.urs_user_id = m.urs_user_id AND m.status = 1 WHERE r.status = 1 AND c.urs_user_id IS NULL AND m.user_id > 0 LIMIT 10 "); $this->table( ['URS用户ID', '推荐人ID', '农场用户ID', '问题'], array_map(function ($user) { return [ $user->urs_user_id, $user->urs_referrer_id, $user->farm_user_id, '有推荐关系但无缓存' ]; }, $usersWithReferralButNoCache) ); // 2. 查找占位缓存记录 $placeholderCaches = UrsUserRelationCache::where('related_user_id', 0)->limit(10)->get(); if ($placeholderCaches->count() > 0) { $this->info("\n占位缓存记录:"); $this->table( ['用户ID', 'URS用户ID', 'URS推荐人ID', '深度'], $placeholderCaches->map(function ($cache) { return [ $cache->user_id, $cache->urs_user_id, $cache->urs_related_user_id, $cache->depth ]; })->toArray() ); } $this->info("\n断代问题检查完成"); } /** * 修复断代问题 */ private function fixBreakageIssues() { $this->info('开始修复关系缓存断代问题...'); $logic = new UrsRelationCacheLogic(); // 获取所有有推荐关系但没有缓存的已进入农场用户 $problematicUsers = DB::select(" SELECT r.urs_user_id, m.user_id as farm_user_id FROM kku_urs_promotion_user_referrals r LEFT JOIN kku_urs_promotion_user_relation_cache c ON r.urs_user_id = c.urs_user_id INNER JOIN kku_urs_promotion_user_mappings m ON r.urs_user_id = m.urs_user_id AND m.status = 1 WHERE r.status = 1 AND c.urs_user_id IS NULL AND m.user_id > 0 "); $successCount = 0; $failCount = 0; $progressBar = $this->output->createProgressBar(count($problematicUsers)); $progressBar->start(); foreach ($problematicUsers as $user) { if ($logic->generateUserRelationCache($user->urs_user_id)) { $successCount++; } else { $failCount++; } $progressBar->advance(); } $progressBar->finish(); $this->info("\n修复完成:"); $this->info("成功: {$successCount}"); $this->info("失败: {$failCount}"); $this->info("总计: " . count($problematicUsers)); } /** * 显示统计信息 */ private function showStatistics() { $this->info('=== 关系缓存统计信息 ==='); // 基础统计 $totalReferrals = UrsUserReferral::where('status', UrsUserReferral::STATUS_VALID)->count(); $totalMappings = UrsUserMapping::where('status', UrsUserMapping::STATUS_VALID)->count(); $totalCaches = UrsUserRelationCache::count(); $placeholderCaches = UrsUserRelationCache::where('related_user_id', 0)->count(); $this->table( ['指标', '数量'], [ ['有效推荐关系', $totalReferrals], ['用户映射关系', $totalMappings], ['关系缓存记录', $totalCaches], ['占位缓存记录', $placeholderCaches], ] ); // 断代问题统计 $usersWithReferralButNoCache = DB::selectOne(" SELECT COUNT(*) as count FROM kku_urs_promotion_user_referrals r LEFT JOIN kku_urs_promotion_user_relation_cache c ON r.urs_user_id = c.urs_user_id INNER JOIN kku_urs_promotion_user_mappings m ON r.urs_user_id = m.urs_user_id AND m.status = 1 WHERE r.status = 1 AND c.urs_user_id IS NULL AND m.user_id > 0 "); $this->info("\n断代问题统计:"); $this->info("有推荐关系但无缓存的已进入农场用户: " . $usersWithReferralButNoCache->count); if ($placeholderCaches > 0) { $this->warn("发现 {$placeholderCaches} 条占位缓存记录,表示存在推荐人未进入农场的情况"); } } /** * 测试特定用户 */ private function testSpecificUser(int $ursUserId) { $this->info("测试URS用户 {$ursUserId} 的关系缓存..."); // 显示用户基本信息 $referral = UrsUserReferral::where('urs_user_id', $ursUserId)->first(); $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)->first(); $this->table( ['属性', '值'], [ ['URS用户ID', $ursUserId], ['推荐人ID', $referral ? $referral->urs_referrer_id : '无'], ['农场用户ID', $mapping ? $mapping->user_id : '未进入农场'], ['映射状态', $mapping ? ($mapping->status == 1 ? '有效' : '无效') : '不存在'], ] ); // 显示现有缓存 $caches = UrsUserRelationCache::where('urs_user_id', $ursUserId)->get(); if ($caches->count() > 0) { $this->info("\n现有关系缓存:"); $this->table( ['深度', 'URS推荐人ID', '农场推荐人ID', 'URS路径'], $caches->map(function ($cache) { return [ $cache->depth, $cache->urs_related_user_id, $cache->related_user_id ?: '占位', $cache->urs_path ]; })->toArray() ); } else { $this->warn("该用户没有关系缓存记录"); } // 重新生成缓存 if ($this->confirm('是否重新生成该用户的关系缓存?')) { $logic = new UrsRelationCacheLogic(); if ($logic->generateUserRelationCache($ursUserId)) { $this->info("关系缓存重新生成成功"); // 显示新的缓存 $newCaches = UrsUserRelationCache::where('urs_user_id', $ursUserId)->get(); $this->info("\n新的关系缓存:"); $this->table( ['深度', 'URS推荐人ID', '农场推荐人ID', 'URS路径'], $newCaches->map(function ($cache) { return [ $cache->depth, $cache->urs_related_user_id, $cache->related_user_id ?: '占位', $cache->urs_path ]; })->toArray() ); } else { $this->error("关系缓存重新生成失败"); } } } /** * 显示使用说明 */ private function showUsage() { $this->info('使用说明:'); $this->info(' --check 检查断代问题'); $this->info(' --fix 修复断代问题'); $this->info(' --stats 显示统计信息'); $this->info(' --user-id=ID 测试特定用户'); $this->info(''); $this->info('示例:'); $this->info(' php artisan urs:test-relation-cache-fix --check'); $this->info(' php artisan urs:test-relation-cache-fix --fix'); $this->info(' php artisan urs:test-relation-cache-fix --user-id=24127'); } }