| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <?php
- namespace App\Module\UrsPromotion\Services;
- use App\Module\UrsPromotion\Services\UrsTalentService;
- use Illuminate\Support\Facades\Log;
- /**
- * URS达人等级上级更新服务
- *
- * 专门处理DelayQueue延时队列的回调更新逻辑
- * 当用户达人等级发生变化时,通过DelayQueue异步更新其上级用户的达人等级
- */
- class UrsTalentUpstreamUpdateService
- {
- /**
- * DelayQueue回调方法:更新达人等级
- *
- * 此方法被DelayQueue模块调用,用于延时更新上级用户的达人等级
- * 由于URS达人等级更新操作是幂等的,无需额外的防重复检查
- *
- * @param array $runParam 运行参数
- * @return bool 更新结果
- */
- public static function updateTalentLevel(array $runParam): bool
- {
- try {
- // 提取参数
- $referrerId = $runParam['referrer_id'] ?? null;
- $originalUserId = $runParam['original_user_id'] ?? null;
- $level = $runParam['level'] ?? null;
- // 参数验证
- if (!$referrerId || !$originalUserId || !$level) {
- Log::error('DelayQueue回调参数不完整', [
- 'run_param' => $runParam
- ]);
- return false;
- }
- Log::info('DelayQueue开始更新上级达人等级', [
- 'referrer_id' => $referrerId,
- 'original_user_id' => $originalUserId,
- 'level' => $level
- ]);
- // 执行达人等级更新(无需防重复检查,因为操作是幂等的)
- $startTime = microtime(true);
- $result = UrsTalentService::updateTalentLevel($referrerId);
- $endTime = microtime(true);
- Log::info('DelayQueue更新上级达人等级成功', [
- 'referrer_id' => $referrerId,
- 'original_user_id' => $originalUserId,
- 'level' => $level,
- 'talent_level' => $result->talentLevel,
- 'direct_count' => $result->directCount,
- 'promotion_count' => $result->promotionCount,
- 'execution_time_ms' => round(($endTime - $startTime) * 1000, 2)
- ]);
- return true;
- } catch (\Exception $e) {
- Log::error('DelayQueue更新上级达人等级失败', [
- 'referrer_id' => $referrerId ?? null,
- 'original_user_id' => $originalUserId ?? null,
- 'level' => $level ?? null,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- // 返回false,让DelayQueue知道任务失败
- return false;
- }
- }
- /**
- * 批量更新多个用户的达人等级
- *
- * @param array $userIds 用户ID数组
- * @return array 更新结果
- */
- public static function batchUpdateTalentLevels(array $userIds): array
- {
- $results = [];
- foreach ($userIds as $userId) {
- try {
- $result = UrsTalentService::updateTalentLevel($userId);
- $results[$userId] = [
- 'success' => true,
- 'talent_level' => $result->talentLevel,
- 'direct_count' => $result->directCount,
- 'promotion_count' => $result->promotionCount
- ];
- } catch (\Exception $e) {
- $results[$userId] = [
- 'success' => false,
- 'error' => $e->getMessage()
- ];
- }
- }
- Log::info('批量更新达人等级完成', [
- 'total_users' => count($userIds),
- 'success_count' => count(array_filter($results, fn($r) => $r['success'])),
- 'failed_count' => count(array_filter($results, fn($r) => !$r['success']))
- ]);
- return $results;
- }
- }
|