where('activity_id', $activityId) ->first(); if (!$userData) { return null; } return UserActivityDataDto::fromModel($userData); } /** * 更新用户活动进度 * * @param int $userId 用户ID * @param int $activityId 活动ID * @param int $progress 进度值 * @param array|null $progressData 进度数据 * @return UserActivityDataDto * @throws Exception */ public function updateUserActivityProgress(int $userId, int $activityId, int $progress, ?array $progressData = null): UserActivityDataDto { // 获取或创建用户活动数据 $userData = UserActivityData::firstOrNew([ 'user_id' => $userId, 'activity_id' => $activityId, ]); // 设置进度值 $userData->progress = $progress; // 设置进度数据 if ($progressData !== null) { $userData->progress_data = $progressData; } // 更新最后更新时间 $userData->last_update = Carbon::now(); // 保存数据 $userData->save(); return UserActivityDataDto::fromModel($userData); } /** * 增加用户活动进度 * * @param int $userId 用户ID * @param int $activityId 活动ID * @param int $increment 增量值 * @param array|null $progressData 进度数据 * @return UserActivityDataDto * @throws Exception */ public function incrementUserActivityProgress(int $userId, int $activityId, int $increment, ?array $progressData = null): UserActivityDataDto { // 获取或创建用户活动数据 $userData = UserActivityData::firstOrNew([ 'user_id' => $userId, 'activity_id' => $activityId, ]); // 如果是新创建的记录,设置初始值 if (!$userData->exists) { $userData->progress = 0; $userData->progress_data = []; } // 增加进度值 $userData->progress += $increment; // 设置进度数据 if ($progressData !== null) { $userData->progress_data = $progressData; } // 更新最后更新时间 $userData->last_update = Carbon::now(); // 保存数据 $userData->save(); return UserActivityDataDto::fromModel($userData); } /** * 重置用户活动进度 * * @param int $userId 用户ID * @param int $activityId 活动ID * @return bool */ public function resetUserActivityProgress(int $userId, int $activityId): bool { // 获取用户活动数据 $userData = UserActivityData::where('user_id', $userId) ->where('activity_id', $activityId) ->first(); if (!$userData) { return false; } // 重置进度值和进度数据 $userData->progress = 0; $userData->progress_data = []; $userData->last_update = Carbon::now(); return $userData->save(); } /** * 获取活动的总体进度统计 * * @param int $activityId 活动ID * @return array */ public function getActivityProgressStats(int $activityId): array { // 获取所有用户的活动数据 $userDataList = UserActivityData::where('activity_id', $activityId)->get(); // 计算统计数据 $totalUsers = $userDataList->count(); $totalProgress = $userDataList->sum('progress'); $averageProgress = $totalUsers > 0 ? $totalProgress / $totalUsers : 0; $maxProgress = $userDataList->max('progress'); $minProgress = $userDataList->min('progress'); return [ 'total_users' => $totalUsers, 'total_progress' => $totalProgress, 'average_progress' => $averageProgress, 'max_progress' => $maxProgress, 'min_progress' => $minProgress, ]; } }