CronJobLogEntity.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\System\Entity;
  4. use SixShop\Core\Entity\BaseEntity;
  5. use SixShop\System\Model\CronJobLogModel;
  6. use think\Paginator;
  7. /**
  8. * @mixin CronJobLogModel
  9. */
  10. class CronJobLogEntity extends BaseEntity
  11. {
  12. /**
  13. * 查询统计数据(成功数、失败数),支持筛选条件
  14. */
  15. public function getStats(array $params = []): array
  16. {
  17. $query = CronJobLogModel::field([
  18. 'COUNT(*) as total',
  19. 'SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as success_count',
  20. 'SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as fail_count'
  21. ]);
  22. $this->applyFilters($query, $params);
  23. $result = $query->select()->toArray();
  24. $stats = $result[0] ?? [];
  25. return [
  26. 'total' => (int)($stats['total'] ?? 0),
  27. 'success_count' => (int)($stats['success_count'] ?? 0),
  28. 'fail_count' => (int)($stats['fail_count'] ?? 0),
  29. ];
  30. }
  31. /**
  32. * 分页查询日志列表,支持筛选条件
  33. */
  34. public function getList(array $params, array $pageAndLimit = []): Paginator
  35. {
  36. $query = $this->order('id', 'desc');
  37. $this->applyFilters($query, $params);
  38. return $query->paginate($pageAndLimit);
  39. }
  40. /**
  41. * 应用筛选条件
  42. */
  43. private function applyFilters($query, array $params): void
  44. {
  45. if (!empty($params['name'])) {
  46. $query->whereLike('name', '%' . $params['name'] . '%');
  47. }
  48. if (isset($params['success']) && $params['success'] !== '') {
  49. $query->where('success', intval($params['success']));
  50. }
  51. if (!empty($params['start_time'])) {
  52. $query->where('create_time', '>=', $params['start_time']);
  53. }
  54. if (!empty($params['end_time'])) {
  55. $query->where('create_time', '<=', $params['end_time']);
  56. }
  57. }
  58. /**
  59. * 获取每个任务的最新一次执行记录
  60. */
  61. public function getLatestPerJob(): array
  62. {
  63. $subQuery = $this->field('MAX(id) as max_id')
  64. ->group('name')
  65. ->buildSql();
  66. $records = $this->where('id IN ' . $subQuery)
  67. ->order('id', 'desc')
  68. ->select()
  69. ->toArray();
  70. return array_map(function (array $record): array {
  71. return [
  72. 'name' => $record['name'],
  73. 'rule' => $record['rule'],
  74. 'last_time' => $record['create_time'],
  75. 'duration' => $record['duration'],
  76. 'success' => $record['success'],
  77. ];
  78. }, $records);
  79. }
  80. /**
  81. * 删除单条日志
  82. */
  83. public function deleteById(int $id): void
  84. {
  85. $this->model()->destroy($id);
  86. }
  87. /**
  88. * 批量删除日志
  89. */
  90. public function deleteByIds(array $ids): void
  91. {
  92. $this->model()->destroy($ids);
  93. }
  94. /**
  95. * 清空所有日志
  96. */
  97. public function clearAll(): void
  98. {
  99. $this->model()->where('1=1')->delete();
  100. }
  101. }