RewardService.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace App\Module\Activity\Services;
  3. use App\Module\Activity\Dtos\ActivityRewardDto;
  4. use App\Module\Activity\Logics\RewardLogic;
  5. use Exception;
  6. use Illuminate\Support\Facades\Log;
  7. /**
  8. * 奖励服务类
  9. */
  10. class RewardService
  11. {
  12. /**
  13. * 获取活动奖励信息
  14. *
  15. * @param int $activityId 活动ID
  16. * @return ActivityRewardDto|null
  17. */
  18. public static function getActivityReward(int $activityId): ?ActivityRewardDto
  19. {
  20. try {
  21. $rewardLogic = new RewardLogic();
  22. return $rewardLogic->getActivityReward($activityId);
  23. } catch (Exception $e) {
  24. Log::error('获取活动奖励信息失败', [
  25. 'activity_id' => $activityId,
  26. 'error' => $e->getMessage()
  27. ]);
  28. return null;
  29. }
  30. }
  31. /**
  32. * 发放活动奖励
  33. *
  34. * @param int $userId 用户ID
  35. * @param int $activityId 活动ID
  36. * @return array
  37. */
  38. public static function grantActivityReward(int $userId, int $activityId): array
  39. {
  40. try {
  41. $rewardLogic = new RewardLogic();
  42. // 检查是否可以领取奖励
  43. if (!$rewardLogic->canClaimReward($userId, $activityId)) {
  44. return [
  45. 'success' => false,
  46. 'message' => '不满足领取奖励条件',
  47. 'rewards' => []
  48. ];
  49. }
  50. // 发放奖励
  51. $result = $rewardLogic->grantActivityReward($userId, $activityId);
  52. // 如果发放成功,标记奖励为已领取
  53. if ($result['success']) {
  54. $rewardLogic->markRewardAsClaimed($userId, $activityId);
  55. }
  56. return $result;
  57. } catch (Exception $e) {
  58. Log::error('发放活动奖励失败', [
  59. 'user_id' => $userId,
  60. 'activity_id' => $activityId,
  61. 'error' => $e->getMessage()
  62. ]);
  63. return [
  64. 'success' => false,
  65. 'message' => $e->getMessage(),
  66. 'rewards' => []
  67. ];
  68. }
  69. }
  70. /**
  71. * 标记奖励为已过期
  72. *
  73. * @param int $userId 用户ID
  74. * @param int $activityId 活动ID
  75. * @return bool
  76. */
  77. public static function markRewardAsExpired(int $userId, int $activityId): bool
  78. {
  79. try {
  80. $rewardLogic = new RewardLogic();
  81. return $rewardLogic->markRewardAsExpired($userId, $activityId);
  82. } catch (Exception $e) {
  83. Log::error('标记奖励为已过期失败', [
  84. 'user_id' => $userId,
  85. 'activity_id' => $activityId,
  86. 'error' => $e->getMessage()
  87. ]);
  88. return false;
  89. }
  90. }
  91. /**
  92. * 批量发放活动奖励
  93. *
  94. * @param array $userIds 用户ID数组
  95. * @param int $activityId 活动ID
  96. * @return array
  97. */
  98. public static function batchGrantActivityReward(array $userIds, int $activityId): array
  99. {
  100. $results = [
  101. 'success_count' => 0,
  102. 'fail_count' => 0,
  103. 'details' => []
  104. ];
  105. foreach ($userIds as $userId) {
  106. $result = self::grantActivityReward($userId, $activityId);
  107. if ($result['success']) {
  108. $results['success_count']++;
  109. } else {
  110. $results['fail_count']++;
  111. }
  112. $results['details'][$userId] = $result;
  113. }
  114. return $results;
  115. }
  116. }