| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
- declare(strict_types=1);
- namespace SixShop\System\Entity;
- use SixShop\Core\Entity\BaseEntity;
- use SixShop\System\Model\CronJobLogModel;
- use think\Paginator;
- /**
- * @mixin CronJobLogModel
- */
- class CronJobLogEntity extends BaseEntity
- {
- /**
- * 查询统计数据(成功数、失败数),支持筛选条件
- */
- public function getStats(array $params = []): array
- {
- $query = CronJobLogModel::field([
- 'COUNT(*) as total',
- 'SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as success_count',
- 'SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as fail_count'
- ]);
- $this->applyFilters($query, $params);
- $result = $query->select()->toArray();
- $stats = $result[0] ?? [];
- return [
- 'total' => (int)($stats['total'] ?? 0),
- 'success_count' => (int)($stats['success_count'] ?? 0),
- 'fail_count' => (int)($stats['fail_count'] ?? 0),
- ];
- }
- /**
- * 分页查询日志列表,支持筛选条件
- */
- public function getList(array $params, array $pageAndLimit = []): Paginator
- {
- $query = $this->order('id', 'desc');
- $this->applyFilters($query, $params);
- return $query->paginate($pageAndLimit);
- }
- /**
- * 应用筛选条件
- */
- private function applyFilters($query, array $params): void
- {
- if (!empty($params['name'])) {
- $query->whereLike('name', '%' . $params['name'] . '%');
- }
- if (isset($params['success']) && $params['success'] !== '') {
- $query->where('success', intval($params['success']));
- }
- if (!empty($params['start_time'])) {
- $query->where('create_time', '>=', $params['start_time']);
- }
- if (!empty($params['end_time'])) {
- $query->where('create_time', '<=', $params['end_time']);
- }
- }
- /**
- * 获取每个任务的最新一次执行记录
- */
- public function getLatestPerJob(): array
- {
- $subQuery = $this->field('MAX(id) as max_id')
- ->group('name')
- ->buildSql();
- $records = $this->where('id IN ' . $subQuery)
- ->order('id', 'desc')
- ->select()
- ->toArray();
- return array_map(function (array $record): array {
- return [
- 'name' => $record['name'],
- 'rule' => $record['rule'],
- 'last_time' => $record['create_time'],
- 'duration' => $record['duration'],
- 'success' => $record['success'],
- ];
- }, $records);
- }
- /**
- * 删除单条日志
- */
- public function deleteById(int $id): void
- {
- $this->model()->destroy($id);
- }
- /**
- * 批量删除日志
- */
- public function deleteByIds(array $ids): void
- {
- $this->model()->destroy($ids);
- }
- /**
- * 清空所有日志
- */
- public function clearAll(): void
- {
- $this->model()->where('1=1')->delete();
- }
- }
|