feat: cron表达式选择器 (#92)

This commit is contained in:
2024-02-26 18:17:18 +08:00
committed by GitHub
parent 6c2d1676e4
commit bde9fb1ea2
90 changed files with 394 additions and 22302 deletions

View File

@ -14,6 +14,11 @@ public interface IJobModule : ICrudModule<CreateJobReq, QueryJobRsp // 创建类
, DelReq // 删除类型
>
{
/// <summary>
/// 编辑作业
/// </summary>
Task<QueryJobRsp> EditAsync(UpdateJobReq req);
/// <summary>
/// 获取单个作业记录
/// </summary>

View File

@ -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)