TaskLogic.php 4.3 KB

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