ProgressLogic.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Module\Activity\Logics;
  3. use App\Module\Activity\Dtos\UserActivityDataDto;
  4. use App\Module\Activity\Models\UserActivityData;
  5. use Carbon\Carbon;
  6. use Exception;
  7. /**
  8. * 进度逻辑类
  9. */
  10. class ProgressLogic
  11. {
  12. /**
  13. * 获取用户活动进度
  14. *
  15. * @param int $userId 用户ID
  16. * @param int $activityId 活动ID
  17. * @return UserActivityDataDto|null
  18. */
  19. public function getUserActivityProgress(int $userId, int $activityId): ?UserActivityDataDto
  20. {
  21. $userData = UserActivityData::where('user_id', $userId)
  22. ->where('activity_id', $activityId)
  23. ->first();
  24. if (!$userData) {
  25. return null;
  26. }
  27. return UserActivityDataDto::fromModel($userData);
  28. }
  29. /**
  30. * 更新用户活动进度
  31. *
  32. * @param int $userId 用户ID
  33. * @param int $activityId 活动ID
  34. * @param int $progress 进度值
  35. * @param array|null $progressData 进度数据
  36. * @return UserActivityDataDto
  37. * @throws Exception
  38. */
  39. public function updateUserActivityProgress(int $userId, int $activityId, int $progress, ?array $progressData = null): UserActivityDataDto
  40. {
  41. // 获取或创建用户活动数据
  42. $userData = UserActivityData::firstOrNew([
  43. 'user_id' => $userId,
  44. 'activity_id' => $activityId,
  45. ]);
  46. // 设置进度值
  47. $userData->progress = $progress;
  48. // 设置进度数据
  49. if ($progressData !== null) {
  50. $userData->progress_data = $progressData;
  51. }
  52. // 更新最后更新时间
  53. $userData->last_update = Carbon::now();
  54. // 保存数据
  55. $userData->save();
  56. return UserActivityDataDto::fromModel($userData);
  57. }
  58. /**
  59. * 增加用户活动进度
  60. *
  61. * @param int $userId 用户ID
  62. * @param int $activityId 活动ID
  63. * @param int $increment 增量值
  64. * @param array|null $progressData 进度数据
  65. * @return UserActivityDataDto
  66. * @throws Exception
  67. */
  68. public function incrementUserActivityProgress(int $userId, int $activityId, int $increment, ?array $progressData = null): UserActivityDataDto
  69. {
  70. // 获取或创建用户活动数据
  71. $userData = UserActivityData::firstOrNew([
  72. 'user_id' => $userId,
  73. 'activity_id' => $activityId,
  74. ]);
  75. // 如果是新创建的记录,设置初始值
  76. if (!$userData->exists) {
  77. $userData->progress = 0;
  78. $userData->progress_data = [];
  79. }
  80. // 增加进度值
  81. $userData->progress += $increment;
  82. // 设置进度数据
  83. if ($progressData !== null) {
  84. $userData->progress_data = $progressData;
  85. }
  86. // 更新最后更新时间
  87. $userData->last_update = Carbon::now();
  88. // 保存数据
  89. $userData->save();
  90. return UserActivityDataDto::fromModel($userData);
  91. }
  92. /**
  93. * 重置用户活动进度
  94. *
  95. * @param int $userId 用户ID
  96. * @param int $activityId 活动ID
  97. * @return bool
  98. */
  99. public function resetUserActivityProgress(int $userId, int $activityId): bool
  100. {
  101. // 获取用户活动数据
  102. $userData = UserActivityData::where('user_id', $userId)
  103. ->where('activity_id', $activityId)
  104. ->first();
  105. if (!$userData) {
  106. return false;
  107. }
  108. // 重置进度值和进度数据
  109. $userData->progress = 0;
  110. $userData->progress_data = [];
  111. $userData->last_update = Carbon::now();
  112. return $userData->save();
  113. }
  114. /**
  115. * 获取活动的总体进度统计
  116. *
  117. * @param int $activityId 活动ID
  118. * @return array
  119. */
  120. public function getActivityProgressStats(int $activityId): array
  121. {
  122. // 获取所有用户的活动数据
  123. $userDataList = UserActivityData::where('activity_id', $activityId)->get();
  124. // 计算统计数据
  125. $totalUsers = $userDataList->count();
  126. $totalProgress = $userDataList->sum('progress');
  127. $averageProgress = $totalUsers > 0 ? $totalProgress / $totalUsers : 0;
  128. $maxProgress = $userDataList->max('progress');
  129. $minProgress = $userDataList->min('progress');
  130. return [
  131. 'total_users' => $totalUsers,
  132. 'total_progress' => $totalProgress,
  133. 'average_progress' => $averageProgress,
  134. 'max_progress' => $maxProgress,
  135. 'min_progress' => $minProgress,
  136. ];
  137. }
  138. }