BatchDeleteBackupAction.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Module\Cleanup\AdminControllers\Actions;
  3. use App\Module\Cleanup\Services\CleanupService;
  4. use Dcat\Admin\Grid\BatchAction;
  5. use Dcat\Admin\Actions\Response;
  6. use Illuminate\Http\Request;
  7. /**
  8. * 批量删除备份Action
  9. *
  10. * 用于批量删除备份记录和文件
  11. */
  12. class BatchDeleteBackupAction extends BatchAction
  13. {
  14. /**
  15. * 按钮标题
  16. */
  17. protected $title = '批量删除';
  18. /**
  19. * 处理请求
  20. */
  21. public function handle(Request $request)
  22. {
  23. try {
  24. // 获取选中的ID
  25. $ids = $this->getKey();
  26. if (empty($ids)) {
  27. return $this->response()->error('请选择要删除的备份');
  28. }
  29. $deleteFiles = $request->input('delete_files', true);
  30. $successCount = 0;
  31. $failCount = 0;
  32. $totalFreedSpace = 0;
  33. $errors = [];
  34. foreach ($ids as $backupId) {
  35. try {
  36. $result = CleanupService::deleteBackup($backupId, $deleteFiles);
  37. if ($result['success']) {
  38. $successCount++;
  39. $totalFreedSpace += $result['data']['freed_space_bytes'] ?? 0;
  40. } else {
  41. $failCount++;
  42. $errors[] = "备份 {$backupId}: " . $result['message'];
  43. }
  44. } catch (\Exception $e) {
  45. $failCount++;
  46. $errors[] = "备份 {$backupId}: " . $e->getMessage();
  47. }
  48. }
  49. $message = "成功删除 {$successCount} 个备份";
  50. if ($failCount > 0) {
  51. $message .= ",失败 {$failCount} 个";
  52. }
  53. if ($totalFreedSpace > 0) {
  54. $freedSpace = $this->formatBytes($totalFreedSpace);
  55. $message .= ",释放空间 {$freedSpace}";
  56. }
  57. $response = $this->response()->success($message)->refresh();
  58. if (!empty($errors)) {
  59. $errorDetail = implode('<br>', array_slice($errors, 0, 5));
  60. if (count($errors) > 5) {
  61. $errorDetail .= '<br>...还有 ' . (count($errors) - 5) . ' 个错误';
  62. }
  63. $response->detail($errorDetail);
  64. }
  65. return $response;
  66. } catch (\Exception $e) {
  67. return $this->response()
  68. ->error('批量删除失败:' . $e->getMessage());
  69. }
  70. }
  71. /**
  72. * 确认对话框
  73. */
  74. public function confirm()
  75. {
  76. return [
  77. '确认批量删除备份?',
  78. '⚠️ 删除后无法恢复,请谨慎操作!',
  79. [
  80. 'delete_files' => [
  81. 'type' => 'checkbox',
  82. 'label' => '同时删除备份文件',
  83. 'checked' => true,
  84. 'help' => '取消勾选则只删除记录,保留文件',
  85. ]
  86. ]
  87. ];
  88. }
  89. /**
  90. * 格式化字节大小
  91. */
  92. private function formatBytes($bytes)
  93. {
  94. if ($bytes == 0) return '0 B';
  95. $units = ['B', 'KB', 'MB', 'GB', 'TB'];
  96. $base = log($bytes, 1024);
  97. $index = floor($base);
  98. if ($index >= count($units)) {
  99. $index = count($units) - 1;
  100. }
  101. $size = round(pow(1024, $base - $index), 2);
  102. return $size . ' ' . $units[$index];
  103. }
  104. }