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); }); // 提取中括号里面的参数值 var rgx = new Regex(@"(?i)(?<=\[)(.*)(?=\])"); foreach (var job in jobDetails.Items) { foreach (var jobTrigger in job.JobTriggers) { jobTrigger.Args = rgx.Match(jobTrigger.Args).Value; } } 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); var jobTrigger = input.Adapt(); jobTrigger.Args = "[" + jobTrigger.Args + "]"; await _sysJobTriggerRep.InsertAsync(jobTrigger); } /// /// 更新触发器 /// /// [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); var jobTrigger = input.Adapt(); jobTrigger.Args = "[" + jobTrigger.Args + "]"; await _sysJobTriggerRep.UpdateAsync(jobTrigger); } /// /// 删除触发器 /// /// [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(); } }