namespace Admin.NET.Core.Service;
///
/// 系统作业任务服务
///
[ApiDescriptionSettings(Order = 188)]
public class SysJobService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _sysJobDetailRep;
private readonly SqlSugarRepository _sysJobTriggerRep;
private readonly SqlSugarRepository _sysJobClusterRep;
private readonly ISchedulerFactory _schedulerFactory;
public SysJobService(SqlSugarRepository sysJobDetailRep,
SqlSugarRepository sysJobTriggerRep,
SqlSugarRepository sysJobClusterRep,
ISchedulerFactory schedulerFactory)
{
_sysJobDetailRep = sysJobDetailRep;
_sysJobTriggerRep = sysJobTriggerRep;
_sysJobClusterRep = sysJobClusterRep;
_schedulerFactory = schedulerFactory;
}
///
/// 获取作业分页列表
///
[HttpGet("/sysJob/page")]
public async Task> GetJobPage([FromQuery] PageJobInput input)
{
var jobDetails = await _sysJobDetailRep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
.WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description))
.Select(d => new JobOutput
{
JobDetail = d,
}).ToPagedListAsync(input.Page, input.PageSize);
await _sysJobDetailRep.AsSugarClient().ThenMapperAsync(jobDetails.Items, async u =>
{
u.JobTriggers = await _sysJobTriggerRep.GetListAsync(t => t.JobId == u.JobDetail.JobId);
});
return jobDetails;
}
///
/// 添加作业
///
///
[HttpPost("/sysJob/detailAdd")]
public async Task AddJobDetail(AddJobDetailInput input)
{
var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
if (isExist)
throw Oops.Oh(ErrorCodeEnum.D1006);
// 动态创建作业
NatashaInitializer.Preheating();
var oop = new AssemblyCSharpBuilder("Admin.NET.Core");
oop.Domain = DomainManagement.Random();
oop.Add(input.ScriptCode);
var jobType = oop.GetTypeFromShortName(input.JobId);
_schedulerFactory.AddJob(JobBuilder.Create(jobType).SetIncludeAnnotations(input.IncludeAnnotations));
await _sysJobDetailRep.InsertAsync(input.Adapt());
}
///
/// 更新作业
///
///
[HttpPost("/sysJob/detailUpdate")]
public async Task UpdateJobDetail(UpdateJobDetailInput input)
{
var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
if (isExist)
throw Oops.Oh(ErrorCodeEnum.D1006);
await _sysJobDetailRep.UpdateAsync(input.Adapt());
}
///
/// 删除作业
///
///
[HttpPost("/sysJob/detailDelete")]
public async Task DeleteJobDetail(DeleteJobDetailInput input)
{
_schedulerFactory.RemoveJob(input.JobId);
await _sysJobDetailRep.DeleteAsync(u => u.JobId == input.JobId);
await _sysJobTriggerRep.DeleteAsync(u => u.JobId == input.JobId);
}
///
/// 获取触发器列表
///
[HttpGet("/sysJob/triggerList")]
public async Task> GetJobTriggerList([FromQuery] JobDetailInput input)
{
return await _sysJobTriggerRep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
.ToListAsync();
}
///
/// 添加触发器
///
///
[HttpPost("/sysJob/triggerAdd")]
public async Task AddJobTrigger(AddJobTriggerInput input)
{
var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
if (isExist)
throw Oops.Oh(ErrorCodeEnum.D1006);
await _sysJobTriggerRep.UpdateAsync(input.Adapt());
}
///
/// 更新触发器
///
///
[HttpPost("/sysJob/triggerUpdate")]
public async Task UpdateJobTrigger(UpdateJobTriggerInput input)
{
var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
if (isExist)
throw Oops.Oh(ErrorCodeEnum.D1006);
await _sysJobTriggerRep.UpdateAsync(input.Adapt());
}
///
/// 删除触发器
///
///
[HttpPost("/sysJob/triggerDelete")]
public async Task DeleteJobTrigger(DeleteJobTriggerInput input)
{
await _sysJobTriggerRep.DeleteAsync(u => u.TriggerId == input.TriggerId);
}
///
/// 暂停所有作业
///
///
[HttpPost("/sysJob/pauseAll")]
public void PauseAllJob()
{
_schedulerFactory.PauseAll();
}
///
/// 启动所有作业
///
///
[HttpPost("/sysJob/startAll")]
public void StartAllJob()
{
_schedulerFactory.StartAll();
}
///
/// 暂停作业
///
[HttpPost("/sysJob/pauseJob")]
public void PauseJob(JobDetailInput input)
{
_ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
_scheduler?.Pause();
}
///
/// 启动作业
///
[HttpPost("/sysJob/startJob")]
public void StartJob(JobDetailInput input)
{
_ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
_scheduler?.Start();
}
///
/// 暂停触发器
///
[HttpPost("/sysJob/pauseTrigger")]
public void PauseTrigger(JobTriggerInput input)
{
_ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
_scheduler?.PauseTrigger(input.TriggerId);
}
///
/// 启动触发器
///
[HttpPost("/sysJob/startTrigger")]
public void StartTrigger(JobTriggerInput input)
{
_ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
_scheduler?.StartTrigger(input.TriggerId);
}
///
/// 强制唤醒作业调度器
///
[HttpPost("/sysJob/cancelSleep")]
public void CancelSleep()
{
_schedulerFactory.CancelSleep();
}
///
/// 强制触发所有作业持久化
///
[HttpPost("/sysJob/persistAll")]
public void PersistAll()
{
_schedulerFactory.PersistAll();
}
///
/// 获取集群列表
///
[HttpGet("/sysJob/clusterList")]
public async Task> GetJobClusterList()
{
return await _sysJobClusterRep.GetListAsync();
}
}