|
|
@@ -0,0 +1,231 @@
|
|
|
+# 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`
|
|
|
+
|
|
|
+```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`
|
|
|
+
|
|
|
+```php
|
|
|
+// 在getUsersNeedActivityCheck方法中预加载用户信息关联
|
|
|
+->with(['user', 'user.info']) // 预加载用户和用户信息关联
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 添加活跃直推专用方法
|
|
|
+
|
|
|
+#### 2.1 新增getActiveDirectMembers方法
|
|
|
+**文件**: `app/Module/UrsPromotion/Services/UrsActiveUserService.php`
|
|
|
+
|
|
|
+```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`
|
|
|
+
|
|
|
+```php
|
|
|
+$this->commands([
|
|
|
+ // ... 其他命令
|
|
|
+ \App\Module\UrsPromotion\Commands\UrsUpdateActiveStatusCommand::class,
|
|
|
+]);
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 扩展DTO支持活跃数据
|
|
|
+
|
|
|
+#### 4.1 扩展UrsUserTalentDto
|
|
|
+**文件**: `app/Module/UrsPromotion/Dtos/UrsUserTalentDto.php`
|
|
|
+
|
|
|
+```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`
|
|
|
+
|
|
|
+```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. **升级条件检查**: 显示下一等级的要求和当前状态
|
|
|
+
|
|
|
+```php
|
|
|
+// 团队统计表格
|
|
|
+$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. 活跃状态更新成功
|
|
|
+```bash
|
|
|
+php artisan urs:update-active-status --limit=50
|
|
|
+# 成功更新50个用户,其中50个被标记为活跃
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 用户39296成功升级
|
|
|
+```bash
|
|
|
+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`
|