mirror of
https://github.com/nsnail/NetAdmin.git
synced 2025-06-20 18:58:16 +08:00
feat: ✨ cron表达式选择器 (#92)
This commit is contained in:
@ -14,6 +14,11 @@ public interface IJobModule : ICrudModule<CreateJobReq, QueryJobRsp // 创建类
|
||||
, DelReq // 删除类型
|
||||
>
|
||||
{
|
||||
/// <summary>
|
||||
/// 编辑作业
|
||||
/// </summary>
|
||||
Task<QueryJobRsp> EditAsync(UpdateJobReq req);
|
||||
|
||||
/// <summary>
|
||||
/// 获取单个作业记录
|
||||
/// </summary>
|
||||
|
@ -31,7 +31,7 @@ public sealed class JobService(DefaultRepository<Sys_Job> rpo, IJobRecordService
|
||||
public async Task<QueryJobRsp> CreateAsync(CreateJobReq req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
var nextExecTime = CronExpression.Parse(req.ExecutionCron).GetNextOccurrence(DateTime.UtcNow, TimeZoneInfo.Utc);
|
||||
var nextExecTime = GetNextExecTime(req.ExecutionCron);
|
||||
var ret = await Rpo.InsertAsync(req with {
|
||||
NextExecTime = nextExecTime
|
||||
, NextTimeId = nextExecTime?.TimeUnixUtc()
|
||||
@ -49,6 +49,23 @@ public sealed class JobService(DefaultRepository<Sys_Job> rpo, IJobRecordService
|
||||
return ret.Count;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<QueryJobRsp> EditAsync(UpdateJobReq req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
var ret = await Rpo.UpdateDiy.Set(a => a.ExecutionCron == req.ExecutionCron)
|
||||
.Set(a => a.HttpMethod == req.HttpMethod)
|
||||
.Set(a => a.JobName == req.JobName)
|
||||
.Set(a => a.RequestHeader == req.RequestHeader)
|
||||
.Set(a => a.RequestBody == req.RequestBody)
|
||||
.Set(a => a.RequestUrl == req.RequestUrl)
|
||||
.Set(a => a.UserId == req.UserId)
|
||||
.Where(a => a.Id == req.Id)
|
||||
.ExecuteUpdatedAsync()
|
||||
.ConfigureAwait(false);
|
||||
return ret[0].Adapt<QueryJobRsp>();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<bool> ExistAsync(QueryReq<QueryJobReq> req)
|
||||
{
|
||||
@ -59,7 +76,7 @@ public sealed class JobService(DefaultRepository<Sys_Job> rpo, IJobRecordService
|
||||
/// <inheritdoc />
|
||||
public async Task FinishJobAsync(UpdateJobReq req)
|
||||
{
|
||||
var nextExecTime = CronExpression.Parse(req.ExecutionCron).GetNextOccurrence(DateTime.UtcNow, TimeZoneInfo.Utc);
|
||||
var nextExecTime = GetNextExecTime(req.ExecutionCron);
|
||||
_ = await UpdateAsync(req with {
|
||||
Status = JobStatues.Idle
|
||||
, NextExecTime = nextExecTime
|
||||
@ -183,6 +200,12 @@ public sealed class JobService(DefaultRepository<Sys_Job> rpo, IJobRecordService
|
||||
return req;
|
||||
}
|
||||
|
||||
private static DateTime? GetNextExecTime(string cron)
|
||||
{
|
||||
return CronExpression.Parse(cron, CronFormat.IncludeSeconds)
|
||||
.GetNextOccurrence(DateTime.UtcNow, TimeZoneInfo.Utc);
|
||||
}
|
||||
|
||||
private ISelect<Sys_Job> QueryInternal(QueryReq<QueryJobReq> req, bool orderByRandom = false)
|
||||
{
|
||||
var ret = Rpo.Select.Include(a => a.User)
|
||||
|
Reference in New Issue
Block a user