| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- <?php
- namespace App\Module\UrsPromotion\Commands;
- use App\Module\UrsPromotion\Logics\UrsRelationCacheLogic;
- use App\Module\UrsPromotion\Models\UrsUserMapping;
- use App\Module\UrsPromotion\Models\UrsUserReferral;
- use App\Module\UrsPromotion\Models\UrsUserRelationCache;
- use App\Module\UrsPromotion\Services\UrsUserMappingService;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\DB;
- /**
- * 测试关系缓存断代修复命令
- *
- * 用于测试和验证关系缓存断代问题的修复效果
- * php artisan urs:test-relation-cache-fix --check
- */
- class TestRelationCacheFixCommand extends Command
- {
- /**
- * 命令签名
- */
- protected $signature = 'urs:test-relation-cache-fix
- {--user-id= : 指定测试的URS用户ID}
- {--check : 检查断代问题}
- {--fix : 修复断代问题}
- {--stats : 显示统计信息}';
- /**
- * 命令描述
- */
- protected $description = '测试URS关系缓存断代修复功能';
- /**
- * 执行命令
- */
- public function handle()
- {
- $this->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');
- }
- }
|