SysJobService.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 系统作业任务服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 320)]
  6. public class SysJobService : IDynamicApiController, ITransient
  7. {
  8. private readonly SqlSugarRepository<SysJobDetail> _sysJobDetailRep;
  9. private readonly SqlSugarRepository<SysJobTrigger> _sysJobTriggerRep;
  10. private readonly SqlSugarRepository<SysJobCluster> _sysJobClusterRep;
  11. private readonly ISchedulerFactory _schedulerFactory;
  12. public SysJobService(SqlSugarRepository<SysJobDetail> sysJobDetailRep,
  13. SqlSugarRepository<SysJobTrigger> sysJobTriggerRep,
  14. SqlSugarRepository<SysJobCluster> sysJobClusterRep,
  15. ISchedulerFactory schedulerFactory)
  16. {
  17. _sysJobDetailRep = sysJobDetailRep;
  18. _sysJobTriggerRep = sysJobTriggerRep;
  19. _sysJobClusterRep = sysJobClusterRep;
  20. _schedulerFactory = schedulerFactory;
  21. }
  22. /// <summary>
  23. /// 获取作业分页列表
  24. /// </summary>
  25. public async Task<SqlSugarPagedList<JobOutput>> GetPageJobDetail([FromQuery] PageJobInput input)
  26. {
  27. var jobDetails = await _sysJobDetailRep.AsQueryable()
  28. .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
  29. .WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description))
  30. .Select(d => new JobOutput
  31. {
  32. JobDetail = d,
  33. }).ToPagedListAsync(input.Page, input.PageSize);
  34. await _sysJobDetailRep.AsSugarClient().ThenMapperAsync(jobDetails.Items, async u =>
  35. {
  36. u.JobTriggers = await _sysJobTriggerRep.GetListAsync(t => t.JobId == u.JobDetail.JobId);
  37. });
  38. // 提取中括号里面的参数值
  39. var rgx = new Regex(@"(?i)(?<=\[)(.*)(?=\])");
  40. foreach (var job in jobDetails.Items)
  41. {
  42. foreach (var jobTrigger in job.JobTriggers)
  43. {
  44. jobTrigger.Args = rgx.Match(jobTrigger.Args).Value;
  45. }
  46. }
  47. return jobDetails;
  48. }
  49. /// <summary>
  50. /// 添加作业
  51. /// </summary>
  52. /// <returns></returns>
  53. [ApiDescriptionSettings(Name = "AddJobDetail")]
  54. public async Task AddJobDetail(AddJobDetailInput input)
  55. {
  56. var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
  57. if (isExist)
  58. throw Oops.Oh(ErrorCodeEnum.D1006);
  59. // 动态创建作业
  60. NatashaInitializer.Preheating();
  61. var oop = new AssemblyCSharpBuilder("Admin.NET.Core");
  62. oop.Domain = DomainManagement.Random();
  63. oop.Add(input.ScriptCode);
  64. var jobType = oop.GetTypeFromShortName(input.JobId);
  65. _schedulerFactory.AddJob(JobBuilder.Create(jobType).SetIncludeAnnotations(input.IncludeAnnotations));
  66. await _sysJobDetailRep.InsertAsync(input.Adapt<SysJobDetail>());
  67. }
  68. /// <summary>
  69. /// 更新作业
  70. /// </summary>
  71. /// <returns></returns>
  72. [ApiDescriptionSettings(Name = "UpdateJobDetail")]
  73. public async Task UpdateJobDetail(UpdateJobDetailInput input)
  74. {
  75. var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
  76. if (isExist)
  77. throw Oops.Oh(ErrorCodeEnum.D1006);
  78. await _sysJobDetailRep.UpdateAsync(input.Adapt<SysJobDetail>());
  79. }
  80. /// <summary>
  81. /// 删除作业
  82. /// </summary>
  83. /// <returns></returns>
  84. [ApiDescriptionSettings(Name = "DeleteJobDetail")]
  85. public async Task DeleteJobDetail(DeleteJobDetailInput input)
  86. {
  87. _schedulerFactory.RemoveJob(input.JobId);
  88. await _sysJobDetailRep.DeleteAsync(u => u.JobId == input.JobId);
  89. await _sysJobTriggerRep.DeleteAsync(u => u.JobId == input.JobId);
  90. }
  91. /// <summary>
  92. /// 获取触发器列表
  93. /// </summary>
  94. public async Task<List<SysJobTrigger>> GetJobTriggerList([FromQuery] JobDetailInput input)
  95. {
  96. return await _sysJobTriggerRep.AsQueryable()
  97. .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
  98. .ToListAsync();
  99. }
  100. /// <summary>
  101. /// 添加触发器
  102. /// </summary>
  103. /// <returns></returns>
  104. [ApiDescriptionSettings(Name = "AddJobTrigger")]
  105. public async Task AddJobTrigger(AddJobTriggerInput input)
  106. {
  107. var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
  108. if (isExist)
  109. throw Oops.Oh(ErrorCodeEnum.D1006);
  110. var jobTrigger = input.Adapt<SysJobTrigger>();
  111. jobTrigger.Args = "[" + jobTrigger.Args + "]";
  112. await _sysJobTriggerRep.InsertAsync(jobTrigger);
  113. }
  114. /// <summary>
  115. /// 更新触发器
  116. /// </summary>
  117. /// <returns></returns>
  118. [ApiDescriptionSettings(Name = "UpdateJobTrigger")]
  119. public async Task UpdateJobTrigger(UpdateJobTriggerInput input)
  120. {
  121. var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
  122. if (isExist)
  123. throw Oops.Oh(ErrorCodeEnum.D1006);
  124. var jobTrigger = input.Adapt<SysJobTrigger>();
  125. jobTrigger.Args = "[" + jobTrigger.Args + "]";
  126. await _sysJobTriggerRep.UpdateAsync(jobTrigger);
  127. }
  128. /// <summary>
  129. /// 删除触发器
  130. /// </summary>
  131. /// <returns></returns>
  132. [ApiDescriptionSettings(Name = "DeleteJobTrigger")]
  133. public async Task DeleteJobTrigger(DeleteJobTriggerInput input)
  134. {
  135. await _sysJobTriggerRep.DeleteAsync(u => u.TriggerId == input.TriggerId);
  136. }
  137. /// <summary>
  138. /// 暂停所有作业
  139. /// </summary>
  140. /// <returns></returns>
  141. public void PauseAllJob()
  142. {
  143. _schedulerFactory.PauseAll();
  144. }
  145. /// <summary>
  146. /// 启动所有作业
  147. /// </summary>
  148. /// <returns></returns>
  149. public void StartAllJob()
  150. {
  151. _schedulerFactory.StartAll();
  152. }
  153. /// <summary>
  154. /// 暂停作业
  155. /// </summary>
  156. public void PauseJob(JobDetailInput input)
  157. {
  158. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  159. _scheduler?.Pause();
  160. }
  161. /// <summary>
  162. /// 启动作业
  163. /// </summary>
  164. public void StartJob(JobDetailInput input)
  165. {
  166. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  167. _scheduler?.Start();
  168. }
  169. /// <summary>
  170. /// 暂停触发器
  171. /// </summary>
  172. public void PauseTrigger(JobTriggerInput input)
  173. {
  174. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  175. _scheduler?.PauseTrigger(input.TriggerId);
  176. }
  177. /// <summary>
  178. /// 启动触发器
  179. /// </summary>
  180. public void StartTrigger(JobTriggerInput input)
  181. {
  182. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  183. _scheduler?.StartTrigger(input.TriggerId);
  184. }
  185. /// <summary>
  186. /// 强制唤醒作业调度器
  187. /// </summary>
  188. public void CancelSleep()
  189. {
  190. _schedulerFactory.CancelSleep();
  191. }
  192. /// <summary>
  193. /// 强制触发所有作业持久化
  194. /// </summary>
  195. public void PersistAll()
  196. {
  197. _schedulerFactory.PersistAll();
  198. }
  199. /// <summary>
  200. /// 获取集群列表
  201. /// </summary>
  202. public async Task<List<SysJobCluster>> GetJobClusterList()
  203. {
  204. return await _sysJobClusterRep.GetListAsync();
  205. }
  206. }