RewardLogic.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. namespace App\Module\Activity\Logics;
  3. use App\Module\Activity\Dtos\ActivityRewardDto;
  4. use App\Module\Activity\Enums\REWARD_STATUS;
  5. use App\Module\Activity\Models\ActivityConfig;
  6. use App\Module\Activity\Models\ActivityParticipation;
  7. use Exception;
  8. use Illuminate\Support\Facades\Log;
  9. /**
  10. * 奖励逻辑类
  11. */
  12. class RewardLogic
  13. {
  14. /**
  15. * 检查用户是否可以领取活动奖励
  16. *
  17. * @param int $userId 用户ID
  18. * @param int $activityId 活动ID
  19. * @return bool
  20. */
  21. public function canClaimReward(int $userId, int $activityId): bool
  22. {
  23. // 获取用户参与记录
  24. $participation = ActivityParticipation::where('user_id', $userId)
  25. ->where('activity_id', $activityId)
  26. ->first();
  27. if (!$participation) {
  28. return false;
  29. }
  30. // 检查是否已完成且未领取奖励
  31. return $participation->completion_status === 1 && $participation->reward_status === REWARD_STATUS::NOT_CLAIMED;
  32. }
  33. /**
  34. * 标记奖励为已领取
  35. *
  36. * @param int $userId 用户ID
  37. * @param int $activityId 活动ID
  38. * @return bool
  39. * @throws Exception
  40. */
  41. public function markRewardAsClaimed(int $userId, int $activityId): bool
  42. {
  43. // 获取用户参与记录
  44. $participation = ActivityParticipation::where('user_id', $userId)
  45. ->where('activity_id', $activityId)
  46. ->first();
  47. if (!$participation) {
  48. throw new Exception('用户未参与此活动');
  49. }
  50. if ($participation->completion_status !== 1) {
  51. throw new Exception('活动未完成,无法领取奖励');
  52. }
  53. if ($participation->reward_status === REWARD_STATUS::CLAIMED) {
  54. throw new Exception('奖励已领取');
  55. }
  56. // 更新奖励状态为已领取
  57. $participation->reward_status = REWARD_STATUS::CLAIMED;
  58. return $participation->save();
  59. }
  60. /**
  61. * 标记奖励为已过期
  62. *
  63. * @param int $userId 用户ID
  64. * @param int $activityId 活动ID
  65. * @return bool
  66. * @throws Exception
  67. */
  68. public function markRewardAsExpired(int $userId, int $activityId): bool
  69. {
  70. // 获取用户参与记录
  71. $participation = ActivityParticipation::where('user_id', $userId)
  72. ->where('activity_id', $activityId)
  73. ->first();
  74. if (!$participation) {
  75. throw new Exception('用户未参与此活动');
  76. }
  77. if ($participation->reward_status !== REWARD_STATUS::NOT_CLAIMED) {
  78. throw new Exception('奖励状态不是未领取,无法标记为已过期');
  79. }
  80. // 更新奖励状态为已过期
  81. $participation->reward_status = REWARD_STATUS::EXPIRED;
  82. return $participation->save();
  83. }
  84. /**
  85. * 获取活动奖励信息
  86. *
  87. * @param int $activityId 活动ID
  88. * @return ActivityRewardDto|null
  89. */
  90. public function getActivityReward(int $activityId): ?ActivityRewardDto
  91. {
  92. // 获取活动信息
  93. $activity = ActivityConfig::find($activityId);
  94. if (!$activity) {
  95. return null;
  96. }
  97. // 如果活动没有配置奖励组,返回空
  98. if (!$activity->reward_group_id && !$activity->reward_group_code) {
  99. return null;
  100. }
  101. // 创建奖励DTO
  102. $rewardDto = ActivityRewardDto::create(
  103. $activity->reward_group_id,
  104. $activity->reward_group_code
  105. );
  106. // 尝试获取奖励组信息
  107. try {
  108. // 这里应该调用奖励组服务获取奖励组信息
  109. // 由于没有实际的奖励组服务,这里只返回基本信息
  110. $rewardDto->rewardGroupName = '活动奖励';
  111. $rewardDto->rewardGroupDescription = '完成活动获得的奖励';
  112. // 模拟奖励项
  113. $rewardDto->rewardItems = [
  114. [
  115. 'type' => 'item',
  116. 'id' => 1001,
  117. 'name' => '金币',
  118. 'quantity' => 100
  119. ]
  120. ];
  121. } catch (Exception $e) {
  122. Log::error('获取奖励组信息失败', [
  123. 'activity_id' => $activityId,
  124. 'reward_group_id' => $activity->reward_group_id,
  125. 'reward_group_code' => $activity->reward_group_code,
  126. 'error' => $e->getMessage()
  127. ]);
  128. }
  129. return $rewardDto;
  130. }
  131. /**
  132. * 发放活动奖励
  133. *
  134. * @param int $userId 用户ID
  135. * @param int $activityId 活动ID
  136. * @return array 奖励结果
  137. * @throws Exception
  138. */
  139. public function grantActivityReward(int $userId, int $activityId): array
  140. {
  141. // 获取活动信息
  142. $activity = ActivityConfig::find($activityId);
  143. if (!$activity) {
  144. throw new Exception('活动不存在');
  145. }
  146. // 如果活动没有配置奖励组,返回空结果
  147. if (!$activity->reward_group_id && !$activity->reward_group_code) {
  148. return [
  149. 'success' => true,
  150. 'message' => '活动未配置奖励',
  151. 'rewards' => []
  152. ];
  153. }
  154. // 尝试发放奖励
  155. try {
  156. // 使用奖励组服务发放奖励
  157. $rewardGroupId = $activity->reward_group_id;
  158. $rewardGroupCode = $activity->reward_group_code;
  159. // 调用奖励组服务
  160. $rewardService = new \App\Module\Game\Services\RewardService();
  161. $rewardResult = $rewardService::grantReward(
  162. $userId,
  163. $rewardGroupId ?: $rewardGroupCode,
  164. 'activity',
  165. $activity->id
  166. );
  167. if ($rewardResult->success) {
  168. return [
  169. 'success' => true,
  170. 'message' => '奖励发放成功',
  171. 'rewards' => $rewardResult->items
  172. ];
  173. } else {
  174. return [
  175. 'success' => false,
  176. 'message' => $rewardResult->errorMessage,
  177. 'rewards' => []
  178. ];
  179. }
  180. } catch (Exception $e) {
  181. Log::error('发放活动奖励失败', [
  182. 'user_id' => $userId,
  183. 'activity_id' => $activityId,
  184. 'error' => $e->getMessage()
  185. ]);
  186. throw new Exception('发放奖励失败: ' . $e->getMessage());
  187. }
  188. }
  189. }