| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- <?php
- namespace App\Module\Activity\Logics;
- use App\Module\Activity\Dtos\UserActivityDataDto;
- use App\Module\Activity\Models\UserActivityData;
- use Carbon\Carbon;
- use Exception;
- /**
- * 进度逻辑类
- */
- class ProgressLogic
- {
- /**
- * 获取用户活动进度
- *
- * @param int $userId 用户ID
- * @param int $activityId 活动ID
- * @return UserActivityDataDto|null
- */
- public function getUserActivityProgress(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
- * @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,
- ];
- }
- }
|