ParticipationLogic.php 5.4 KB

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