050354-优化URS达人等级更新命令输出.md 6.8 KB

URS达人等级更新命令输出优化

任务概述

时间: 2025年07月05日 03:54
任务: 优化URS达人等级更新命令的输出,增加活跃直推数据显示
问题: 用户39296没有升级,需要查看详细的升级条件和活跃用户数据

问题分析

1. 初始问题

  • 用户39296有521个直推,691个团队总人数,但达人等级仍为0(青铜)
  • 命令输出信息不够详细,无法看到活跃用户数据和升级条件

2. 根本原因

  • 活跃用户数据缺失: UrsActiveUserService中checkUserActivity方法使用了不存在的last_activity_time字段
  • 活动时间字段位置错误: 活动时间在UserInfo表中,不在User表中
  • 命令注册缺失: UrsUpdateActiveStatusCommand没有在ServiceProvider中注册
  • 输出信息不完整: 缺少活跃用户数据和升级条件详情

解决方案

1. 修复活跃用户检查逻辑

1.1 修正活动时间字段访问

文件: app/Module/UrsPromotion/Services/UrsActiveUserService.php

// 修改前:直接访问User模型的last_activity_time(不存在)
if (!$user->last_activity_time) {
    return false;
}

// 修改后:通过UserInfo关联访问
$userInfo = $user->info;
if (!$userInfo || !$userInfo->last_activity_time) {
    return false;
}

1.2 优化数据预加载

文件: app/Module/UrsPromotion/Models/UrsUserMapping.php

// 在getUsersNeedActivityCheck方法中预加载用户信息关联
->with(['user', 'user.info']) // 预加载用户和用户信息关联

2. 添加活跃直推专用方法

2.1 新增getActiveDirectMembers方法

文件: app/Module/UrsPromotion/Services/UrsActiveUserService.php

/**
 * 获取指定URS用户的活跃直推成员(仅直推层级)
 * 
 * 针对达人等级升级条件优化,只统计直推活跃用户
 * 相比getActiveTeamMembers方法,此方法只关注直推层级,性能更优
 */
public static function getActiveDirectMembers(int $ursUserId): array
{
    // 只获取直推成员(第1层级)
    $directMembers = UrsReferralService::getDirectReferrals($ursUserId);
    
    if (empty($directMembers)) {
        return [
            'active_direct_count' => 0,
            'active_direct_members' => []
        ];
    }
    
    // 获取活跃的直推成员
    $activeDirectIds = UrsUserMapping::getActiveUrsUserIds($directMembers);
    
    return [
        'active_direct_count' => count($activeDirectIds),
        'active_direct_members' => $activeDirectMembers
    ];
}

3. 注册活跃状态更新命令

3.1 添加命令注册

文件: app/Module/UrsPromotion/Providers/UrsPromotionServiceProvider.php

$this->commands([
    // ... 其他命令
    \App\Module\UrsPromotion\Commands\UrsUpdateActiveStatusCommand::class,
]);

4. 扩展DTO支持活跃数据

4.1 扩展UrsUserTalentDto

文件: app/Module/UrsPromotion/Dtos/UrsUserTalentDto.php

/**
 * @var int 活跃直推人数
 */
public int $activeDirectCount = 0;

/**
 * @var int 活跃团队总人数
 */
public int $activeTotalCount = 0;

// 修改fromModel方法签名,支持活跃数据参数
public static function fromModel(
    UrsUserTalent $model, 
    ?array $currentConfig = null, 
    ?array $nextConfig = null, 
    int $activeDirectCount = 0, 
    int $activeTotalCount = 0
): self

4.2 修改服务层传递活跃数据

文件: app/Module/UrsPromotion/Services/UrsTalentService.php

// 获取活跃直推成员统计(优化性能,只获取直推活跃数据)
$activeDirectStats = UrsActiveUserService::getActiveDirectMembers($ursUserId);

// 为了显示完整信息,也获取活跃团队总数
$activeTeamStats = UrsActiveUserService::getActiveTeamMembers($ursUserId);

// 在创建DTO时传递活跃数据
return UrsUserTalentDto::fromModel(
    $talent, 
    $currentConfig, 
    $nextConfigArray,
    $activeDirectStats['active_direct_count'],
    $activeTeamStats['active_total_count']
);

5. 优化命令输出显示

5.1 重新设计输出格式

文件: app/Module/UrsPromotion/Commands/UrsUpdateTalentLevelCommand.php

新的输出包含:

  1. 基础信息表格: URS用户ID、达人等级、等级名称、最后更新时间
  2. 团队统计表格: 显示总数、活跃数、活跃率
  3. 升级条件检查: 显示下一等级的要求和当前状态

    // 团队统计表格
    $this->table(['统计项', '总数', '活跃数', '活跃率'], [
    [
        '直推人数', 
        $talentDto->directCount, 
        $talentDto->activeDirectCount,
        $talentDto->directCount > 0 ? round($talentDto->activeDirectCount * 100 / $talentDto->directCount, 1) . '%' : '0%'
    ],
    // ... 其他统计项
    ]);
    
    // 升级条件检查
    $this->table(['条件', '要求', '当前', '状态'], [
    [
        '直推人数',
        $nextLevel['direct_count_required'],
        $talentDto->directCount,
        $directMet ? '✅ 已满足' : '❌ 未满足'
    ],
    [
        '活跃直推',
        $nextLevel['active_direct_required'] ?? 0,
        $talentDto->activeDirectCount,
        $activeDirectMet ? '✅ 已满足' : '❌ 未满足'
    ]
    ]);
    

执行结果

1. 活跃状态更新成功

php artisan urs:update-active-status --limit=50
# 成功更新50个用户,其中50个被标记为活跃

2. 用户39296成功升级

php artisan urs:update-talent-level 39296

结果:

  • 等级: 从0(青铜)升级到1(白银)
  • 直推: 521人(112人活跃,21.5%活跃率)
  • 团队: 691人(235人活跃,34%活跃率)
  • 下一等级条件:
    • 直推人数: 521/500 ✅ 已满足
    • 团队总人数: 691/3000 ❌ 未满足
    • 活跃直推: 112/500 ❌ 未满足

技术改进

1. 性能优化

  • 新增getActiveDirectMembers方法,只查询直推活跃用户,避免查询整个团队
  • 预加载用户信息关联,减少N+1查询问题

2. 代码质量

  • 修复了活动时间字段访问错误
  • 扩展DTO支持活跃数据传递
  • 优化命令输出,信息更加详细和直观

3. 用户体验

  • 清晰显示活跃率统计
  • 详细的升级条件检查
  • 直观的状态标识(✅❌)

后续建议

  1. 定时任务: 建议每日运行urs:update-active-status更新用户活跃状态
  2. 监控: 关注活跃用户比例,如果过低需要检查活动时间更新机制
  3. 优化: 可以考虑增加缓存机制,提高大批量用户等级更新的性能

相关文件

  • app/Module/UrsPromotion/Services/UrsActiveUserService.php
  • app/Module/UrsPromotion/Services/UrsTalentService.php
  • app/Module/UrsPromotion/Dtos/UrsUserTalentDto.php
  • app/Module/UrsPromotion/Commands/UrsUpdateTalentLevelCommand.php
  • app/Module/UrsPromotion/Models/UrsUserMapping.php
  • app/Module/UrsPromotion/Providers/UrsPromotionServiceProvider.php