GameStatsHandler.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace App\Module\OpenAPI\Handlers\Game;
  3. use App\Module\OpenAPI\Handlers\BaseHandler;
  4. use App\Module\OpenAPI\Services\ScopeService;
  5. use App\Module\OpenAPI\Enums\SCOPE_TYPE;
  6. use Illuminate\Http\JsonResponse;
  7. /**
  8. * 游戏统计Handler
  9. *
  10. * 处理获取游戏统计数据的业务逻辑
  11. */
  12. class GameStatsHandler extends BaseHandler
  13. {
  14. public function __construct(ScopeService $scopeService)
  15. {
  16. parent::__construct($scopeService);
  17. }
  18. /**
  19. * 获取所需的权限范围
  20. *
  21. * @return SCOPE_TYPE[]
  22. */
  23. public function getRequiredScopes(): array
  24. {
  25. return [SCOPE_TYPE::GAME_READ];
  26. }
  27. /**
  28. * 处理获取游戏统计请求
  29. *
  30. * @param array $data 请求数据
  31. * @param array $context 上下文信息
  32. * @return JsonResponse
  33. */
  34. protected function process(array $data, array $context = []): JsonResponse
  35. {
  36. // 验证请求参数
  37. $validationErrors = $this->validateData($data, [
  38. 'date_from' => 'date',
  39. 'date_to' => 'date|after_or_equal:date_from',
  40. 'user_id' => 'integer|min:1',
  41. 'game_type' => 'string|max:50',
  42. ]);
  43. if ($validationErrors) {
  44. return $this->errorResponse('参数验证失败', $validationErrors, 422);
  45. }
  46. // 获取统计参数
  47. $dateFrom = $data['date_from'] ?? now()->subDays(7)->toDateString();
  48. $dateTo = $data['date_to'] ?? now()->toDateString();
  49. $userId = $data['user_id'] ?? null;
  50. $gameType = $data['game_type'] ?? '';
  51. // 调用Game模块服务获取统计数据
  52. $stats = $this->getGameStats($dateFrom, $dateTo, $userId, $gameType);
  53. // 记录操作日志
  54. $this->logAction('game.stats.get', [
  55. 'date_from' => $dateFrom,
  56. 'date_to' => $dateTo,
  57. 'user_id' => $userId,
  58. 'game_type' => $gameType,
  59. ], $context);
  60. return $this->successResponse('获取游戏统计成功', $stats);
  61. }
  62. /**
  63. * 获取游戏统计数据
  64. *
  65. * 这里应该调用Game模块的实际服务
  66. *
  67. * @param string $dateFrom
  68. * @param string $dateTo
  69. * @param int|null $userId
  70. * @param string $gameType
  71. * @return array
  72. */
  73. protected function getGameStats(string $dateFrom, string $dateTo, ?int $userId, string $gameType): array
  74. {
  75. // TODO: 这里应该调用Game模块的服务
  76. // 例如: return app(GameService::class)->getStats($dateFrom, $dateTo, $userId, $gameType);
  77. // 暂时返回示例数据,等待与Game模块集成
  78. return [
  79. 'overview' => [
  80. 'total_players' => rand(5000, 10000),
  81. 'online_players' => rand(500, 1500),
  82. 'total_games' => rand(50000, 100000),
  83. 'active_games' => rand(100, 500),
  84. 'daily_active_users' => rand(2000, 5000),
  85. 'new_players_today' => rand(50, 200),
  86. ],
  87. 'game_types' => [
  88. [
  89. 'type' => 'farm',
  90. 'name' => '农场游戏',
  91. 'players' => rand(1000, 3000),
  92. 'games_played' => rand(10000, 30000),
  93. 'avg_session_time' => rand(300, 1800), // 秒
  94. ],
  95. [
  96. 'type' => 'pet',
  97. 'name' => '宠物游戏',
  98. 'players' => rand(800, 2500),
  99. 'games_played' => rand(8000, 25000),
  100. 'avg_session_time' => rand(600, 2400),
  101. ],
  102. [
  103. 'type' => 'shop',
  104. 'name' => '商店系统',
  105. 'players' => rand(1500, 4000),
  106. 'games_played' => rand(15000, 40000),
  107. 'avg_session_time' => rand(180, 900),
  108. ],
  109. ],
  110. 'daily_stats' => $this->generateDailyStats($dateFrom, $dateTo),
  111. 'user_stats' => $userId ? $this->getUserGameStats($userId) : null,
  112. 'period' => [
  113. 'from' => $dateFrom,
  114. 'to' => $dateTo,
  115. ],
  116. ];
  117. }
  118. /**
  119. * 生成每日统计数据
  120. *
  121. * @param string $dateFrom
  122. * @param string $dateTo
  123. * @return array
  124. */
  125. protected function generateDailyStats(string $dateFrom, string $dateTo): array
  126. {
  127. $stats = [];
  128. $start = \Carbon\Carbon::parse($dateFrom);
  129. $end = \Carbon\Carbon::parse($dateTo);
  130. while ($start <= $end) {
  131. $stats[] = [
  132. 'date' => $start->toDateString(),
  133. 'active_users' => rand(1000, 3000),
  134. 'new_users' => rand(20, 100),
  135. 'games_played' => rand(5000, 15000),
  136. 'total_playtime' => rand(50000, 150000), // 秒
  137. ];
  138. $start->addDay();
  139. }
  140. return $stats;
  141. }
  142. /**
  143. * 获取用户游戏统计
  144. *
  145. * @param int $userId
  146. * @return array
  147. */
  148. protected function getUserGameStats(int $userId): array
  149. {
  150. return [
  151. 'user_id' => $userId,
  152. 'total_games' => rand(100, 1000),
  153. 'total_playtime' => rand(10000, 100000), // 秒
  154. 'favorite_game_type' => ['farm', 'pet', 'shop'][rand(0, 2)],
  155. 'level' => rand(1, 100),
  156. 'achievements' => rand(5, 50),
  157. 'last_played' => now()->subHours(rand(1, 48))->toISOString(),
  158. ];
  159. }
  160. }