feat: 计划作业执行记录 (#89)

顶部通栏黑夜模式开关
计划作业快捷预览面板
This commit is contained in:
2024-02-18 14:43:22 +08:00
committed by GitHub
parent 6f32acaacf
commit 6f89015198
71 changed files with 844 additions and 229 deletions

View File

@ -1,6 +1,7 @@
using NetAdmin.Application.Modules;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Job;
using NetAdmin.Domain.Dto.Sys.JobRecord;
namespace NetAdmin.SysComponent.Application.Modules.Sys;
@ -13,6 +14,16 @@ public interface IJobModule : ICrudModule<CreateJobReq, QueryJobRsp // 创建类
, DelReq // 删除类型
>
{
/// <summary>
/// 获取单个作业记录
/// </summary>
Task<QueryJobRecordRsp> RecordGetAsync(QueryJobRecordReq req);
/// <summary>
/// 分页查询作业记录
/// </summary>
Task<PagedQueryRsp<QueryJobRecordRsp>> RecordPagedQueryAsync(PagedQueryReq<QueryJobRecordReq> req);
/// <summary>
/// 启用/禁用作业
/// </summary>

View File

@ -18,4 +18,9 @@ public interface IJobService : IService, IJobModule
/// 获取下一个要执行的计划作业
/// </summary>
Task<QueryJobRsp> GetNextJobAsync();
/// <summary>
/// 释放卡死的任务
/// </summary>
Task<int> ReleaseStuckTaskAsync();
}

View File

@ -102,6 +102,9 @@ public sealed class JobRecordService(DefaultRepository<Sys_JobRecord> rpo) //
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
.WhereDynamic(req.Filter)
.WhereIf( //
req.Keywords?.Length > 0
, a => a.JobId == req.Keywords.Int64Try(0) || a.Id == req.Keywords.Int64Try(0))
.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
ret = ret.OrderByDescending(a => a.Id);

View File

@ -4,6 +4,7 @@ using NetAdmin.Application.Services;
using NetAdmin.Domain.DbMaps.Sys;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Job;
using NetAdmin.Domain.Dto.Sys.JobRecord;
using NetAdmin.Domain.Enums.Sys;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
using DataType = FreeSql.DataType;
@ -11,7 +12,7 @@ using DataType = FreeSql.DataType;
namespace NetAdmin.SysComponent.Application.Services.Sys;
/// <inheritdoc cref="IJobService" />
public sealed class JobService(DefaultRepository<Sys_Job> rpo) //
public sealed class JobService(DefaultRepository<Sys_Job> rpo, IJobRecordService jobRecordService) //
: RepositoryService<Sys_Job, IJobService>(rpo), IJobService
{
/// <inheritdoc />
@ -134,6 +135,28 @@ public sealed class JobService(DefaultRepository<Sys_Job> rpo) //
return ret.Adapt<IEnumerable<QueryJobRsp>>();
}
/// <inheritdoc />
public Task<QueryJobRecordRsp> RecordGetAsync(QueryJobRecordReq req)
{
req.ThrowIfInvalid();
return jobRecordService.GetAsync(req);
}
/// <inheritdoc />
public Task<PagedQueryRsp<QueryJobRecordRsp>> RecordPagedQueryAsync(PagedQueryReq<QueryJobRecordReq> req)
{
return jobRecordService.PagedQueryAsync(req);
}
/// <inheritdoc />
public Task<int> ReleaseStuckTaskAsync()
{
return Rpo.UpdateDiy.Set(a => a.Status == JobStatues.Idle)
.Where(a => a.Status == JobStatues.Running &&
a.LastExecTime < DateTime.Now.AddSeconds(-Numbers.JOB_TIMEOUT_SECS))
.ExecuteAffrowsAsync();
}
/// <inheritdoc />
public Task SetEnabledAsync(UpdateJobReq req)
{
@ -162,7 +185,8 @@ public sealed class JobService(DefaultRepository<Sys_Job> rpo) //
private ISelect<Sys_Job> QueryInternal(QueryReq<QueryJobReq> req, bool orderByRandom = false)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
var ret = Rpo.Select.Include(a => a.User)
.WhereDynamicFilter(req.DynamicFilter)
.WhereDynamic(req.Filter)
.WhereIf( //
req.Keywords?.Length > 0