TaskLogic.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Module\Task\Logics;
  3. use App\Module\Task\Enums\TASK_STATUS;
  4. use App\Module\Task\Events\TaskRewardClaimedEvent;
  5. use App\Module\Task\Models\Task;
  6. use App\Module\Task\Models\TaskRewardLog;
  7. use App\Module\Task\Models\TaskUserTask;
  8. use App\Module\Task\Services\TaskRewardGroupService;
  9. use Illuminate\Support\Carbon;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Log;
  12. /**
  13. * 任务逻辑类
  14. *
  15. * 处理任务相关的业务逻辑,包括任务奖励的发放等
  16. */
  17. class TaskLogic
  18. {
  19. /**
  20. * 领取任务奖励
  21. *
  22. * @param int $userId 用户ID
  23. * @param int $taskId 任务ID
  24. * @return array 领取结果
  25. */
  26. public function claimTaskReward(int $userId, int $taskId): array
  27. {
  28. try {
  29. // 开始事务
  30. DB::beginTransaction();
  31. // 获取用户任务
  32. $userTask = TaskUserTask::where('user_id', $userId)
  33. ->where('task_id', $taskId)
  34. ->first();
  35. if (!$userTask) {
  36. throw new \Exception('未接取该任务');
  37. }
  38. // 检查任务状态
  39. if ($userTask->status !== TASK_STATUS::COMPLETED->value) {
  40. throw new \Exception('任务未完成,不能领取奖励');
  41. }
  42. if ($userTask->status === TASK_STATUS::REWARDED->value) {
  43. throw new \Exception('已领取过奖励');
  44. }
  45. // 获取任务信息
  46. $task = Task::find($taskId);
  47. if (!$task) {
  48. throw new \Exception('任务不存在');
  49. }
  50. // 使用奖励组服务发放奖励
  51. $result = TaskRewardGroupService::distributeRewards(
  52. $userId,
  53. $taskId,
  54. $userTask->id
  55. );
  56. if (!$result['success']) {
  57. throw new \Exception($result['message'] ?? '奖励发放失败');
  58. }
  59. // 更新任务状态
  60. $userTask->status = TASK_STATUS::REWARDED->value;
  61. $userTask->rewarded_at = Carbon::now();
  62. $userTask->save();
  63. // 触发奖励领取事件
  64. event(new TaskRewardClaimedEvent(
  65. $userId,
  66. $taskId,
  67. $task->name,
  68. $result['rewards'] ?? [],
  69. $userTask->rewarded_at,
  70. true
  71. ));
  72. // 提交事务
  73. DB::commit();
  74. return [
  75. 'success' => true,
  76. 'message' => '奖励领取成功',
  77. 'rewards' => $result['rewards'] ?? [],
  78. ];
  79. } catch (\Exception $e) {
  80. // 回滚事务
  81. DB::rollBack();
  82. Log::error('任务奖励领取失败', [
  83. 'user_id' => $userId,
  84. 'task_id' => $taskId,
  85. 'error' => $e->getMessage(),
  86. 'trace' => $e->getTraceAsString()
  87. ]);
  88. return [
  89. 'success' => false,
  90. 'message' => $e->getMessage(),
  91. ];
  92. }
  93. }
  94. /**
  95. * 获取任务奖励信息
  96. *
  97. * @param int $taskId 任务ID
  98. * @return array 奖励信息
  99. */
  100. public function getTaskRewardInfo(int $taskId): array
  101. {
  102. try {
  103. // 获取任务信息
  104. $task = Task::find($taskId);
  105. if (!$task) {
  106. return [
  107. 'success' => false,
  108. 'message' => '任务不存在',
  109. 'rewards' => []
  110. ];
  111. }
  112. // 使用奖励组服务获取奖励信息
  113. $rewards = TaskRewardGroupService::getTaskRewards($taskId);
  114. return [
  115. 'success' => true,
  116. 'message' => '获取奖励信息成功',
  117. 'rewards' => $rewards
  118. ];
  119. } catch (\Exception $e) {
  120. Log::error('获取任务奖励信息失败', [
  121. 'task_id' => $taskId,
  122. 'error' => $e->getMessage(),
  123. 'trace' => $e->getTraceAsString()
  124. ]);
  125. return [
  126. 'success' => false,
  127. 'message' => $e->getMessage(),
  128. 'rewards' => []
  129. ];
  130. }
  131. }
  132. /**
  133. * 迁移任务奖励到奖励组
  134. *
  135. * @param int $taskId 任务ID
  136. * @return array 迁移结果
  137. */
  138. public function migrateTaskReward(int $taskId): array
  139. {
  140. return TaskRewardGroupService::migrateTaskRewardsToRewardGroup($taskId);
  141. }
  142. }