| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?php
- namespace App\Module\Activity\Logics;
- use App\Module\Activity\Dtos\ActivityParticipationDto;
- use App\Module\Activity\Dtos\UserActivityDataDto;
- use App\Module\Activity\Enums\PARTICIPATION_STATUS;
- use App\Module\Activity\Enums\REWARD_STATUS;
- use App\Module\Activity\Models\ActivityParticipation;
- use App\Module\Activity\Models\UserActivityData;
- use Carbon\Carbon;
- use Exception;
- use Illuminate\Support\Facades\DB;
- /**
- * 参与逻辑类
- */
- class ParticipationLogic
- {
- /**
- * 获取用户参与记录
- *
- * @param int $userId 用户ID
- * @param int $activityId 活动ID
- * @return ActivityParticipationDto|null
- */
- public function getUserParticipation(int $userId, int $activityId): ?ActivityParticipationDto
- {
- $participation = ActivityParticipation::where('user_id', $userId)
- ->where('activity_id', $activityId)
- ->first();
-
- if (!$participation) {
- return null;
- }
-
- return ActivityParticipationDto::fromModel($participation);
- }
- /**
- * 获取用户活动数据
- *
- * @param int $userId 用户ID
- * @param int $activityId 活动ID
- * @return UserActivityDataDto|null
- */
- public function getUserActivityData(int $userId, int $activityId): ?UserActivityDataDto
- {
- $userData = UserActivityData::where('user_id', $userId)
- ->where('activity_id', $activityId)
- ->first();
-
- if (!$userData) {
- return null;
- }
-
- return UserActivityDataDto::fromModel($userData);
- }
- /**
- * 创建参与记录
- *
- * @param int $userId 用户ID
- * @param int $activityId 活动ID
- * @return ActivityParticipationDto
- * @throws Exception
- */
- public function createParticipation(int $userId, int $activityId): ActivityParticipationDto
- {
- // 检查是否已存在参与记录
- $existingParticipation = ActivityParticipation::where('user_id', $userId)
- ->where('activity_id', $activityId)
- ->first();
-
- if ($existingParticipation) {
- throw new Exception('用户已参与此活动');
- }
-
- // 开始事务
- DB::beginTransaction();
-
- try {
- // 创建参与记录
- $participation = new ActivityParticipation();
- $participation->user_id = $userId;
- $participation->activity_id = $activityId;
- $participation->participate_time = Carbon::now();
- $participation->reward_status = REWARD_STATUS::NOT_CLAIMED;
- $participation->completion_status = PARTICIPATION_STATUS::IN_PROGRESS;
- $participation->save();
-
- // 创建用户活动数据
- $userData = new UserActivityData();
- $userData->user_id = $userId;
- $userData->activity_id = $activityId;
- $userData->progress = 0;
- $userData->progress_data = [];
- $userData->last_update = Carbon::now();
- $userData->save();
-
- // 提交事务
- DB::commit();
-
- return ActivityParticipationDto::fromModel($participation);
- } catch (Exception $e) {
- // 回滚事务
- DB::rollBack();
- throw $e;
- }
- }
- /**
- * 更新参与记录状态
- *
- * @param int $userId 用户ID
- * @param int $activityId 活动ID
- * @param int $completionStatus 完成状态
- * @param int|null $rewardStatus 奖励状态
- * @return bool
- * @throws Exception
- */
- public function updateParticipationStatus(int $userId, int $activityId, int $completionStatus, ?int $rewardStatus = null): bool
- {
- // 获取参与记录
- $participation = ActivityParticipation::where('user_id', $userId)
- ->where('activity_id', $activityId)
- ->first();
-
- if (!$participation) {
- throw new Exception('用户未参与此活动');
- }
-
- // 更新完成状态
- $participation->completion_status = $completionStatus;
-
- // 如果完成状态为已完成,设置完成时间
- if ($completionStatus === PARTICIPATION_STATUS::COMPLETED && !$participation->completion_time) {
- $participation->completion_time = Carbon::now();
- }
-
- // 更新奖励状态
- if ($rewardStatus !== null) {
- $participation->reward_status = $rewardStatus;
- }
-
- return $participation->save();
- }
- /**
- * 获取用户进行中的活动
- *
- * @param int $userId 用户ID
- * @return array
- */
- public function getUserInProgressActivities(int $userId): array
- {
- $participations = ActivityParticipation::where('user_id', $userId)
- ->where('completion_status', PARTICIPATION_STATUS::IN_PROGRESS)
- ->with('activity')
- ->get();
-
- $result = [];
-
- foreach ($participations as $participation) {
- $result[] = ActivityParticipationDto::fromModel($participation, true);
- }
-
- return $result;
- }
- /**
- * 获取用户已完成但未领取奖励的活动
- *
- * @param int $userId 用户ID
- * @return array
- */
- public function getUserCompletedUnclaimedActivities(int $userId): array
- {
- $participations = ActivityParticipation::where('user_id', $userId)
- ->where('completion_status', PARTICIPATION_STATUS::COMPLETED)
- ->where('reward_status', REWARD_STATUS::NOT_CLAIMED)
- ->with('activity')
- ->get();
-
- $result = [];
-
- foreach ($participations as $participation) {
- $result[] = ActivityParticipationDto::fromModel($participation, true);
- }
-
- return $result;
- }
- }
|