UrsTalentUpstreamUpdateService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. namespace App\Module\UrsPromotion\Services;
  3. use App\Module\UrsPromotion\Services\UrsTalentService;
  4. use Illuminate\Support\Facades\Log;
  5. /**
  6. * URS达人等级上级更新服务
  7. *
  8. * 专门处理DelayQueue延时队列的回调更新逻辑
  9. * 当用户达人等级发生变化时,通过DelayQueue异步更新其上级用户的达人等级
  10. */
  11. class UrsTalentUpstreamUpdateService
  12. {
  13. /**
  14. * DelayQueue回调方法:更新达人等级
  15. *
  16. * 此方法被DelayQueue模块调用,用于延时更新上级用户的达人等级
  17. * 由于URS达人等级更新操作是幂等的,无需额外的防重复检查
  18. *
  19. * @param array $runParam 运行参数
  20. * @return bool 更新结果
  21. */
  22. public static function updateTalentLevel(array $runParam): bool
  23. {
  24. try {
  25. // 提取参数
  26. $referrerId = $runParam['referrer_id'] ?? null;
  27. $originalUserId = $runParam['original_user_id'] ?? null;
  28. $level = $runParam['level'] ?? null;
  29. // 参数验证
  30. if (!$referrerId || !$originalUserId || !$level) {
  31. Log::error('DelayQueue回调参数不完整', [
  32. 'run_param' => $runParam
  33. ]);
  34. return false;
  35. }
  36. Log::info('DelayQueue开始更新上级达人等级', [
  37. 'referrer_id' => $referrerId,
  38. 'original_user_id' => $originalUserId,
  39. 'level' => $level
  40. ]);
  41. // 执行达人等级更新(无需防重复检查,因为操作是幂等的)
  42. $startTime = microtime(true);
  43. $result = UrsTalentService::updateTalentLevel($referrerId);
  44. $endTime = microtime(true);
  45. Log::info('DelayQueue更新上级达人等级成功', [
  46. 'referrer_id' => $referrerId,
  47. 'original_user_id' => $originalUserId,
  48. 'level' => $level,
  49. 'talent_level' => $result->talentLevel,
  50. 'direct_count' => $result->directCount,
  51. 'promotion_count' => $result->promotionCount,
  52. 'execution_time_ms' => round(($endTime - $startTime) * 1000, 2)
  53. ]);
  54. return true;
  55. } catch (\Exception $e) {
  56. Log::error('DelayQueue更新上级达人等级失败', [
  57. 'referrer_id' => $referrerId ?? null,
  58. 'original_user_id' => $originalUserId ?? null,
  59. 'level' => $level ?? null,
  60. 'error' => $e->getMessage(),
  61. 'trace' => $e->getTraceAsString()
  62. ]);
  63. // 返回false,让DelayQueue知道任务失败
  64. return false;
  65. }
  66. }
  67. /**
  68. * 批量更新多个用户的达人等级
  69. *
  70. * @param array $userIds 用户ID数组
  71. * @return array 更新结果
  72. */
  73. public static function batchUpdateTalentLevels(array $userIds): array
  74. {
  75. $results = [];
  76. foreach ($userIds as $userId) {
  77. try {
  78. $result = UrsTalentService::updateTalentLevel($userId);
  79. $results[$userId] = [
  80. 'success' => true,
  81. 'talent_level' => $result->talentLevel,
  82. 'direct_count' => $result->directCount,
  83. 'promotion_count' => $result->promotionCount
  84. ];
  85. } catch (\Exception $e) {
  86. $results[$userId] = [
  87. 'success' => false,
  88. 'error' => $e->getMessage()
  89. ];
  90. }
  91. }
  92. Log::info('批量更新达人等级完成', [
  93. 'total_users' => count($userIds),
  94. 'success_count' => count(array_filter($results, fn($r) => $r['success'])),
  95. 'failed_count' => count(array_filter($results, fn($r) => !$r['success']))
  96. ]);
  97. return $results;
  98. }
  99. }