CleanupLogController.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <?php
  2. namespace App\Module\Cleanup\AdminControllers;
  3. use App\Module\Cleanup\Models\CleanupLog;
  4. use App\Module\Cleanup\Repositories\CleanupLogRepository;
  5. use App\Module\Cleanup\Enums\CLEANUP_TYPE;
  6. use UCore\DcatAdmin\AdminController;
  7. use Dcat\Admin\Form;
  8. use Dcat\Admin\Grid;
  9. use Dcat\Admin\Show;
  10. use Dcat\Admin\Layout\Content;
  11. use Spatie\RouteAttributes\Attributes\Resource;
  12. /**
  13. * 清理日志管理控制器
  14. *
  15. * 路由:/admin/cleanup/logs
  16. */
  17. #[Resource('cleanup/logs', names: 'dcat.admin.cleanup.logs')]
  18. class CleanupLogController extends AdminController
  19. {
  20. /**
  21. * 页面标题
  22. */
  23. protected $title = '清理日志';
  24. /**
  25. * 数据仓库
  26. */
  27. protected function repository()
  28. {
  29. return CleanupLogRepository::class;
  30. }
  31. /**
  32. * 列表页面
  33. */
  34. protected function grid(): Grid
  35. {
  36. return Grid::make(new CleanupLogRepository(), function (Grid $grid) {
  37. // 基础设置
  38. $grid->column('id', 'ID')->sortable();
  39. // 关联信息
  40. $grid->column('task.task_name', '关联任务')->sortable();
  41. $grid->column('table_name', '表名')->sortable();
  42. // 清理类型
  43. $grid->column('cleanup_type', '清理类型')->using([
  44. 1 => '清空表',
  45. 2 => '删除所有',
  46. 3 => '按时间删除',
  47. 4 => '按用户删除',
  48. 5 => '按条件删除',
  49. ])->label([
  50. 1 => 'danger',
  51. 2 => 'warning',
  52. 3 => 'info',
  53. 4 => 'primary',
  54. 5 => 'secondary',
  55. ])->sortable();
  56. // 记录统计
  57. $grid->column('before_count', '清理前记录数')->display(function ($value) {
  58. return number_format($value);
  59. })->sortable();
  60. $grid->column('after_count', '清理后记录数')->display(function ($value) {
  61. return number_format($value);
  62. })->sortable();
  63. $grid->column('deleted_records', '删除记录数')->display(function ($value) {
  64. return number_format($value);
  65. })->sortable();
  66. // 删除率
  67. $grid->column('delete_rate', '删除率')->display(function () {
  68. if ($this->before_count == 0) return '0%';
  69. $rate = ($this->deleted_records / $this->before_count) * 100;
  70. $color = 'secondary';
  71. if ($rate >= 90) $color = 'danger';
  72. elseif ($rate >= 50) $color = 'warning';
  73. elseif ($rate > 0) $color = 'info';
  74. return "<span class='badge badge-{$color}'>" . number_format($rate, 2) . '%</span>';
  75. });
  76. // 执行时间
  77. $grid->column('execution_time', '执行时间(秒)')->display(function ($value) {
  78. $color = 'secondary';
  79. if ($value >= 60) $color = 'danger';
  80. elseif ($value >= 10) $color = 'warning';
  81. elseif ($value >= 1) $color = 'info';
  82. return "<span class='badge badge-{$color}'>" . number_format($value, 3) . '</span>';
  83. })->sortable();
  84. // 执行时间
  85. $grid->column('created_at', '执行时间')->sortable();
  86. // 错误信息
  87. $grid->column('error_message', '错误信息')->display(function ($value) {
  88. if (empty($value)) {
  89. return '<span class="badge badge-success">成功</span>';
  90. }
  91. return '<span class="badge badge-danger">失败</span>';
  92. });
  93. // 筛选器
  94. $grid->filter(function (Grid\Filter $filter) {
  95. $filter->equal('task_id', '关联任务')->select(
  96. \App\Module\Cleanup\Models\CleanupTask::pluck('task_name', 'id')->toArray()
  97. );
  98. $filter->equal('cleanup_type', '清理类型')->select([
  99. 1 => '清空表',
  100. 2 => '删除所有',
  101. 3 => '按时间删除',
  102. 4 => '按用户删除',
  103. 5 => '按条件删除',
  104. ]);
  105. $filter->like('table_name', '表名');
  106. $filter->between('deleted_records', '删除记录数');
  107. $filter->between('execution_time', '执行时间(秒)');
  108. $filter->between('created_at', '执行时间')->datetime();
  109. $filter->scope('has_error', '仅显示错误')->where(function ($query) {
  110. $query->whereNotNull('error_message')->where('error_message', '!=', '');
  111. });
  112. });
  113. // 禁用操作
  114. $grid->disableActions();
  115. $grid->disableCreateButton();
  116. $grid->disableBatchActions();
  117. // 工具栏
  118. $grid->tools([
  119. new \App\Module\Cleanup\AdminControllers\Actions\ExportLogsAction(),
  120. new \App\Module\Cleanup\AdminControllers\Actions\CleanOldLogsAction(),
  121. ]);
  122. // 设置每页显示数量
  123. $grid->paginate(50);
  124. // 默认排序
  125. $grid->model()->orderBy('created_at', 'desc');
  126. });
  127. }
  128. /**
  129. * 详情页面
  130. */
  131. protected function detail($id): Show
  132. {
  133. return Show::make($id, new CleanupLogRepository(), function (Show $show) {
  134. $show->field('id', 'ID');
  135. $show->field('task.task_name', '关联任务');
  136. $show->field('table_name', '表名');
  137. $show->field('cleanup_type', '清理类型')->using([
  138. 1 => '清空表',
  139. 2 => '删除所有',
  140. 3 => '按时间删除',
  141. 4 => '按用户删除',
  142. 5 => '按条件删除',
  143. ]);
  144. // 记录统计
  145. $show->field('before_count', '清理前记录数')->display(function ($value) {
  146. return number_format($value);
  147. });
  148. $show->field('after_count', '清理后记录数')->display(function ($value) {
  149. return number_format($value);
  150. });
  151. $show->field('deleted_records', '删除记录数')->display(function ($value) {
  152. return number_format($value);
  153. });
  154. // 删除率
  155. $show->field('delete_rate', '删除率')->display(function () {
  156. if ($this->before_count == 0) return '0%';
  157. $rate = ($this->deleted_records / $this->before_count) * 100;
  158. return number_format($rate, 2) . '%';
  159. });
  160. $show->field('execution_time', '执行时间')->display(function ($value) {
  161. return number_format($value, 3) . ' 秒';
  162. });
  163. $show->field('conditions', '使用的清理条件')->json();
  164. $show->field('error_message', '错误信息');
  165. $show->field('created_at', '执行时间');
  166. });
  167. }
  168. /**
  169. * 表单(只读,日志不允许创建/编辑)
  170. */
  171. protected function form(): Form
  172. {
  173. return Form::make(new CleanupLogRepository(), function (Form $form) {
  174. $form->display('id', 'ID');
  175. $form->display('task.task_name', '关联任务');
  176. $form->display('table_name', '表名');
  177. $form->display('cleanup_type', '清理类型')->using([
  178. 1 => '清空表',
  179. 2 => '删除所有',
  180. 3 => '按时间删除',
  181. 4 => '按用户删除',
  182. 5 => '按条件删除',
  183. ]);
  184. $form->display('before_count', '清理前记录数');
  185. $form->display('after_count', '清理后记录数');
  186. $form->display('deleted_records', '删除记录数');
  187. $form->display('execution_time', '执行时间(秒)');
  188. $form->display('conditions', '使用的清理条件');
  189. $form->display('error_message', '错误信息');
  190. $form->display('created_at', '执行时间');
  191. // 禁用所有操作
  192. $form->disableCreatingCheck();
  193. $form->disableEditingCheck();
  194. $form->disableViewCheck();
  195. });
  196. }
  197. }