CleanupStatsController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. namespace App\Module\Cleanup\AdminControllers;
  3. use App\Module\Cleanup\Models\CleanupConfig;
  4. use App\Module\Cleanup\Models\CleanupPlan;
  5. use App\Module\Cleanup\Models\CleanupTask;
  6. use App\Module\Cleanup\Models\CleanupBackup;
  7. use App\Module\Cleanup\Models\CleanupLog;
  8. use App\Module\Cleanup\Models\CleanupTableStats;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Http\JsonResponse;
  11. /**
  12. * 清理统计控制器
  13. *
  14. * 提供各种统计数据API
  15. */
  16. class CleanupStatsController
  17. {
  18. /**
  19. * 仪表板统计数据
  20. */
  21. public function dashboard(Request $request): JsonResponse
  22. {
  23. try {
  24. $stats = [
  25. // 基础统计
  26. 'configs_count' => CleanupConfig::count(),
  27. 'enabled_configs_count' => CleanupConfig::where('is_enabled', 1)->count(),
  28. 'plans_count' => CleanupPlan::count(),
  29. 'enabled_plans_count' => CleanupPlan::where('is_enabled', 1)->count(),
  30. // 任务统计
  31. 'total_tasks' => CleanupTask::count(),
  32. 'pending_tasks' => CleanupTask::where('status', 1)->count(),
  33. 'running_tasks' => CleanupTask::whereIn('status', [2, 3])->count(),
  34. 'completed_tasks' => CleanupTask::where('status', 4)->count(),
  35. 'failed_tasks' => CleanupTask::where('status', 5)->count(),
  36. // 备份统计
  37. 'total_backups' => CleanupBackup::count(),
  38. 'completed_backups' => CleanupBackup::where('backup_status', 2)->count(),
  39. 'total_backup_size' => CleanupBackup::where('backup_status', 2)->sum('backup_size'),
  40. // 清理统计
  41. 'total_cleaned_records' => CleanupLog::sum('deleted_records'),
  42. 'total_execution_time' => CleanupLog::sum('execution_time'),
  43. // 最近活动
  44. 'recent_tasks' => CleanupTask::with('plan')
  45. ->orderBy('created_at', 'desc')
  46. ->limit(5)
  47. ->get()
  48. ->map(function ($task) {
  49. return [
  50. 'id' => $task->id,
  51. 'name' => $task->task_name,
  52. 'plan_name' => $task->plan->plan_name ?? '',
  53. 'status' => $task->status,
  54. 'progress' => $task->progress,
  55. 'created_at' => $task->created_at->format('Y-m-d H:i:s'),
  56. ];
  57. }),
  58. // 数据分类统计
  59. 'category_stats' => CleanupConfig::selectRaw('data_category, COUNT(*) as count')
  60. ->groupBy('data_category')
  61. ->get()
  62. ->map(function ($item) {
  63. $categories = [
  64. 1 => '用户数据',
  65. 2 => '日志数据',
  66. 3 => '交易数据',
  67. 4 => '缓存数据',
  68. 5 => '配置数据',
  69. ];
  70. return [
  71. 'category' => $categories[$item->data_category] ?? '未知',
  72. 'count' => $item->count,
  73. ];
  74. }),
  75. ];
  76. return response()->json([
  77. 'code' => 0,
  78. 'message' => 'success',
  79. 'data' => $stats,
  80. ]);
  81. } catch (\Exception $e) {
  82. return response()->json([
  83. 'code' => 1,
  84. 'message' => '获取统计数据失败:' . $e->getMessage(),
  85. 'data' => null,
  86. ]);
  87. }
  88. }
  89. /**
  90. * 表格统计数据
  91. */
  92. public function tables(Request $request): JsonResponse
  93. {
  94. try {
  95. $stats = CleanupTableStats::selectRaw('
  96. COUNT(*) as total_tables,
  97. SUM(record_count) as total_records,
  98. SUM(table_size_mb) as total_size_mb,
  99. SUM(index_size_mb) as total_index_mb,
  100. SUM(data_free_mb) as total_free_mb,
  101. AVG(avg_row_length) as avg_row_length
  102. ')
  103. ->first();
  104. // 按大小排序的前10个表
  105. $largest_tables = CleanupTableStats::orderBy('table_size_mb', 'desc')
  106. ->limit(10)
  107. ->get()
  108. ->map(function ($table) {
  109. return [
  110. 'table_name' => $table->table_name,
  111. 'record_count' => $table->record_count,
  112. 'table_size_mb' => round($table->table_size_mb, 2),
  113. 'index_size_mb' => round($table->index_size_mb, 2),
  114. ];
  115. });
  116. return response()->json([
  117. 'code' => 0,
  118. 'message' => 'success',
  119. 'data' => [
  120. 'summary' => $stats,
  121. 'largest_tables' => $largest_tables,
  122. ],
  123. ]);
  124. } catch (\Exception $e) {
  125. return response()->json([
  126. 'code' => 1,
  127. 'message' => '获取表格统计失败:' . $e->getMessage(),
  128. 'data' => null,
  129. ]);
  130. }
  131. }
  132. /**
  133. * 任务统计数据
  134. */
  135. public function tasks(Request $request): JsonResponse
  136. {
  137. try {
  138. // 按状态统计
  139. $status_stats = CleanupTask::selectRaw('status, COUNT(*) as count')
  140. ->groupBy('status')
  141. ->get()
  142. ->map(function ($item) {
  143. $statuses = [
  144. 1 => '待执行',
  145. 2 => '备份中',
  146. 3 => '执行中',
  147. 4 => '已完成',
  148. 5 => '已失败',
  149. 6 => '已取消',
  150. 7 => '已暂停',
  151. ];
  152. return [
  153. 'status' => $statuses[$item->status] ?? '未知',
  154. 'count' => $item->count,
  155. ];
  156. });
  157. // 按日期统计(最近7天)
  158. $daily_stats = CleanupTask::selectRaw('DATE(created_at) as date, COUNT(*) as count')
  159. ->where('created_at', '>=', now()->subDays(7))
  160. ->groupBy('date')
  161. ->orderBy('date')
  162. ->get();
  163. return response()->json([
  164. 'code' => 0,
  165. 'message' => 'success',
  166. 'data' => [
  167. 'status_stats' => $status_stats,
  168. 'daily_stats' => $daily_stats,
  169. ],
  170. ]);
  171. } catch (\Exception $e) {
  172. return response()->json([
  173. 'code' => 1,
  174. 'message' => '获取任务统计失败:' . $e->getMessage(),
  175. 'data' => null,
  176. ]);
  177. }
  178. }
  179. /**
  180. * 备份统计数据
  181. */
  182. public function backups(Request $request): JsonResponse
  183. {
  184. try {
  185. // 按类型统计
  186. $type_stats = CleanupBackup::selectRaw('backup_type, COUNT(*) as count, SUM(backup_size) as total_size')
  187. ->where('backup_status', 2) // 只统计已完成的备份
  188. ->groupBy('backup_type')
  189. ->get()
  190. ->map(function ($item) {
  191. $types = [
  192. 1 => 'SQL',
  193. 2 => 'JSON',
  194. 3 => 'CSV',
  195. ];
  196. return [
  197. 'type' => $types[$item->backup_type] ?? '未知',
  198. 'count' => $item->count,
  199. 'total_size' => $item->total_size,
  200. ];
  201. });
  202. // 按日期统计(最近30天)
  203. $daily_stats = CleanupBackup::selectRaw('DATE(created_at) as date, COUNT(*) as count, SUM(backup_size) as total_size')
  204. ->where('created_at', '>=', now()->subDays(30))
  205. ->where('backup_status', 2)
  206. ->groupBy('date')
  207. ->orderBy('date')
  208. ->get();
  209. return response()->json([
  210. 'code' => 0,
  211. 'message' => 'success',
  212. 'data' => [
  213. 'type_stats' => $type_stats,
  214. 'daily_stats' => $daily_stats,
  215. ],
  216. ]);
  217. } catch (\Exception $e) {
  218. return response()->json([
  219. 'code' => 1,
  220. 'message' => '获取备份统计失败:' . $e->getMessage(),
  221. 'data' => null,
  222. ]);
  223. }
  224. }
  225. }