ParticipationLogic.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace App\Module\Activity\Logics;
  3. use App\Module\Activity\Dtos\ActivityParticipationDto;
  4. use App\Module\Activity\Dtos\UserActivityDataDto;
  5. use App\Module\Activity\Enums\PARTICIPATION_STATUS;
  6. use App\Module\Activity\Enums\REWARD_STATUS;
  7. use App\Module\Activity\Models\ActivityParticipation;
  8. use App\Module\Activity\Models\UserActivityData;
  9. use Carbon\Carbon;
  10. use Exception;
  11. use Illuminate\Support\Facades\DB;
  12. /**
  13. * 参与逻辑类
  14. */
  15. class ParticipationLogic
  16. {
  17. /**
  18. * 获取用户参与记录
  19. *
  20. * @param int $userId 用户ID
  21. * @param int $activityId 活动ID
  22. * @return ActivityParticipationDto|null
  23. */
  24. public function getUserParticipation(int $userId, int $activityId): ?ActivityParticipationDto
  25. {
  26. $participation = ActivityParticipation::where('user_id', $userId)
  27. ->where('activity_id', $activityId)
  28. ->first();
  29. if (!$participation) {
  30. return null;
  31. }
  32. return ActivityParticipationDto::fromModel($participation);
  33. }
  34. /**
  35. * 获取用户活动数据
  36. *
  37. * @param int $userId 用户ID
  38. * @param int $activityId 活动ID
  39. * @return UserActivityDataDto|null
  40. */
  41. public function getUserActivityData(int $userId, int $activityId): ?UserActivityDataDto
  42. {
  43. $userData = UserActivityData::where('user_id', $userId)
  44. ->where('activity_id', $activityId)
  45. ->first();
  46. if (!$userData) {
  47. return null;
  48. }
  49. return UserActivityDataDto::fromModel($userData);
  50. }
  51. /**
  52. * 创建参与记录
  53. *
  54. * @param int $userId 用户ID
  55. * @param int $activityId 活动ID
  56. * @return ActivityParticipationDto
  57. * @throws Exception
  58. */
  59. public function createParticipation(int $userId, int $activityId): ActivityParticipationDto
  60. {
  61. // 检查是否已存在参与记录
  62. $existingParticipation = ActivityParticipation::where('user_id', $userId)
  63. ->where('activity_id', $activityId)
  64. ->first();
  65. if ($existingParticipation) {
  66. throw new Exception('用户已参与此活动');
  67. }
  68. // 开始事务
  69. DB::beginTransaction();
  70. try {
  71. // 创建参与记录
  72. $participation = new ActivityParticipation();
  73. $participation->user_id = $userId;
  74. $participation->activity_id = $activityId;
  75. $participation->participate_time = Carbon::now();
  76. $participation->reward_status = REWARD_STATUS::NOT_CLAIMED;
  77. $participation->completion_status = PARTICIPATION_STATUS::IN_PROGRESS;
  78. $participation->save();
  79. // 创建用户活动数据
  80. $userData = new UserActivityData();
  81. $userData->user_id = $userId;
  82. $userData->activity_id = $activityId;
  83. $userData->progress = 0;
  84. $userData->progress_data = [];
  85. $userData->last_update = Carbon::now();
  86. $userData->save();
  87. // 提交事务
  88. DB::commit();
  89. return ActivityParticipationDto::fromModel($participation);
  90. } catch (Exception $e) {
  91. // 回滚事务
  92. DB::rollBack();
  93. throw $e;
  94. }
  95. }
  96. /**
  97. * 更新参与记录状态
  98. *
  99. * @param int $userId 用户ID
  100. * @param int $activityId 活动ID
  101. * @param int $completionStatus 完成状态
  102. * @param int|null $rewardStatus 奖励状态
  103. * @return bool
  104. * @throws Exception
  105. */
  106. public function updateParticipationStatus(int $userId, int $activityId, int $completionStatus, ?int $rewardStatus = null): bool
  107. {
  108. // 获取参与记录
  109. $participation = ActivityParticipation::where('user_id', $userId)
  110. ->where('activity_id', $activityId)
  111. ->first();
  112. if (!$participation) {
  113. throw new Exception('用户未参与此活动');
  114. }
  115. // 更新完成状态
  116. $participation->completion_status = $completionStatus;
  117. // 如果完成状态为已完成,设置完成时间
  118. if ($completionStatus === PARTICIPATION_STATUS::COMPLETED && !$participation->completion_time) {
  119. $participation->completion_time = Carbon::now();
  120. }
  121. // 更新奖励状态
  122. if ($rewardStatus !== null) {
  123. $participation->reward_status = $rewardStatus;
  124. }
  125. return $participation->save();
  126. }
  127. /**
  128. * 获取用户进行中的活动
  129. *
  130. * @param int $userId 用户ID
  131. * @return array
  132. */
  133. public function getUserInProgressActivities(int $userId): array
  134. {
  135. $participations = ActivityParticipation::where('user_id', $userId)
  136. ->where('completion_status', PARTICIPATION_STATUS::IN_PROGRESS)
  137. ->with('activity')
  138. ->get();
  139. $result = [];
  140. foreach ($participations as $participation) {
  141. $result[] = ActivityParticipationDto::fromModel($participation, true);
  142. }
  143. return $result;
  144. }
  145. /**
  146. * 获取用户已完成但未领取奖励的活动
  147. *
  148. * @param int $userId 用户ID
  149. * @return array
  150. */
  151. public function getUserCompletedUnclaimedActivities(int $userId): array
  152. {
  153. $participations = ActivityParticipation::where('user_id', $userId)
  154. ->where('completion_status', PARTICIPATION_STATUS::COMPLETED)
  155. ->where('reward_status', REWARD_STATUS::NOT_CLAIMED)
  156. ->with('activity')
  157. ->get();
  158. $result = [];
  159. foreach ($participations as $participation) {
  160. $result[] = ActivityParticipationDto::fromModel($participation, true);
  161. }
  162. return $result;
  163. }
  164. }