Files
2026-08-31 11:33:59 +08:00

167 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
* Official Website: http://www.madong.cn
*/
namespace app\model\crontab;
use app\enum\system\TaskScheduleCycle;
use core\base\BaseModel;
use InvalidArgumentException;
/**
* 定时任务
*
* @author Mr.April
* @since 1.0
*/
class Crontab extends BaseModel
{
protected $table = 'sys_crontab';
protected $primaryKey = 'id';
protected $appends = ['created_date', 'updated_date'];
protected $casts = [
'cycle_rule' => 'array',
];
protected $fillable = [
'id',
'biz_id',
'title',
'type',
'task_cycle',
'cycle_rule',
'rule',
'target',
'running_times',
'last_running_time',
'enabled',
'first_start',
'created_at',
'updated_at',
'deleted_at',
'singleton',
'remark',
];
/**
* 通过ID获取最后执行记录
*
* @return mixed
*/
public function getLogAttribute(): mixed
{
return CrontabLog::getModel()->where(['crontab_id' => $this->id])
->orderBy('created_at', 'desc')
->first();
}
/**
* 获取器-创建时间
*
* @param $value
*
* @return string
*/
public function getCreateTimeAttribute($value): string
{
return getDateText($value);
return date('Y-m-d H:i:s', $value); // 将时间戳格式化为日期时间字符串
}
/**
* 获取器-last_running_time
*
* @param $value
*
* @return bool|string
*/
public function getLastRunningTimeAttribute($value): bool|string
{
if (!$value) return '--';
return getDateText($value);
}
/**
* 获取器-rule_name
*
* @param $value
*
* @return string|null
*/
public function getRuleNameAttribute($value): ?string
{
// 提前返回空规则
if (empty($this->cycle_rule)) {
return null;
}
$ruleArr = $this->cycle_rule;
$weekMap = [0 => '周日', 1 => '周一', 2 => '周二', 3 => '周三', 4 => '周四', 5 => '周五', 6 => '周六'];
try {
$taskCycle = TaskScheduleCycle::from($this->task_cycle ?? 1);
} catch (InvalidArgumentException) {
return '任务周期配置错误';
}
// 公共时间组件生成器(带安全访问)
$timeComponent = fn($key, $default = 0) => $ruleArr[$key] ?? $default;
// 基础时间格式
$baseTimeFormat = function () use ($ruleArr, $timeComponent) {
$hour = $timeComponent('hour');
$minute = $timeComponent('minute');
return $hour > 0 ? "{$hour}点{$minute}分" : "{$minute}分";
};
return match ($taskCycle) {
TaskScheduleCycle::DAILY => "每天{$baseTimeFormat()}",
TaskScheduleCycle::HOURLY => "每小时第{$timeComponent('minute')}分",
TaskScheduleCycle::N_HOURS => "{$timeComponent('hour')}小时第{$timeComponent('minute')}分",
TaskScheduleCycle::N_MINUTES => "{$timeComponent('minute')}分",
TaskScheduleCycle::N_SECONDS => "{$timeComponent('second')}秒",
TaskScheduleCycle::WEEKLY => sprintf(
"每%s%s",
$weekMap[$timeComponent('week', 0)] ?? '未知星期',
$baseTimeFormat()
),
TaskScheduleCycle::MONTHLY => sprintf(
"每月%d号%s",
$timeComponent('day', 1),
$baseTimeFormat()
),
TaskScheduleCycle::YEARLY => sprintf(
"每年%d月%d号%s",
$timeComponent('month', 1),
$timeComponent('day', 1),
$baseTimeFormat()
),
default => '未知任务规则'
};
}
/**
* 关联执行志记录表
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function logs(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(CrontabLog::class, 'crontab_id', 'id');
}
}