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 { // 检查事务是否已开启 \UCore\Db\Helper::check_tr(); // 检查是否已存在参与记录 $existingParticipation = ActivityParticipation::where('user_id', $userId) ->where('activity_id', $activityId) ->first(); if ($existingParticipation) { throw new Exception('用户已参与此活动'); } // 创建参与记录 $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(); return ActivityParticipationDto::fromModel($participation); } /** * 更新参与记录状态 * * @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; } }