SysJobService.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 系统作业任务服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 188)]
  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. [HttpGet("/sysJob/page")]
  26. public async Task<SqlSugarPagedList<JobOutput>> GetJobPage([FromQuery] PageJobInput input)
  27. {
  28. var jobDetails = await _sysJobDetailRep.AsQueryable()
  29. .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
  30. .WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description))
  31. .Select(d => new JobOutput
  32. {
  33. JobDetail = d,
  34. }).ToPagedListAsync(input.Page, input.PageSize);
  35. await _sysJobDetailRep.AsSugarClient().ThenMapperAsync(jobDetails.Items, async u =>
  36. {
  37. u.JobTriggers = await _sysJobTriggerRep.GetListAsync(t => t.JobId == u.JobDetail.JobId);
  38. });
  39. return jobDetails;
  40. }
  41. /// <summary>
  42. /// 添加作业
  43. /// </summary>
  44. /// <returns></returns>
  45. [HttpPost("/sysJob/detailAdd")]
  46. public async Task AddJobDetail(AddJobDetailInput input)
  47. {
  48. var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
  49. if (isExist)
  50. throw Oops.Oh(ErrorCodeEnum.D1006);
  51. // 动态创建作业
  52. NatashaInitializer.Preheating();
  53. var oop = new AssemblyCSharpBuilder("Admin.NET.Core");
  54. oop.Domain = DomainManagement.Random();
  55. oop.Add(input.ScriptCode);
  56. var jobType = oop.GetTypeFromShortName(input.JobId);
  57. _schedulerFactory.AddJob(JobBuilder.Create(jobType).SetIncludeAnnotations(input.IncludeAnnotations));
  58. await _sysJobDetailRep.InsertAsync(input.Adapt<SysJobDetail>());
  59. }
  60. /// <summary>
  61. /// 更新作业
  62. /// </summary>
  63. /// <returns></returns>
  64. [HttpPost("/sysJob/detailUpdate")]
  65. public async Task UpdateJobDetail(UpdateJobDetailInput input)
  66. {
  67. var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
  68. if (isExist)
  69. throw Oops.Oh(ErrorCodeEnum.D1006);
  70. await _sysJobDetailRep.UpdateAsync(input.Adapt<SysJobDetail>());
  71. }
  72. /// <summary>
  73. /// 删除作业
  74. /// </summary>
  75. /// <returns></returns>
  76. [HttpPost("/sysJob/detailDelete")]
  77. public async Task DeleteJobDetail(DeleteJobDetailInput input)
  78. {
  79. _schedulerFactory.RemoveJob(input.JobId);
  80. await _sysJobDetailRep.DeleteAsync(u => u.JobId == input.JobId);
  81. await _sysJobTriggerRep.DeleteAsync(u => u.JobId == input.JobId);
  82. }
  83. /// <summary>
  84. /// 获取触发器列表
  85. /// </summary>
  86. [HttpGet("/sysJob/triggerList")]
  87. public async Task<List<SysJobTrigger>> GetJobTriggerList([FromQuery] JobDetailInput input)
  88. {
  89. return await _sysJobTriggerRep.AsQueryable()
  90. .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
  91. .ToListAsync();
  92. }
  93. /// <summary>
  94. /// 添加触发器
  95. /// </summary>
  96. /// <returns></returns>
  97. [HttpPost("/sysJob/triggerAdd")]
  98. public async Task AddJobTrigger(AddJobTriggerInput input)
  99. {
  100. var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
  101. if (isExist)
  102. throw Oops.Oh(ErrorCodeEnum.D1006);
  103. await _sysJobTriggerRep.UpdateAsync(input.Adapt<SysJobTrigger>());
  104. }
  105. /// <summary>
  106. /// 更新触发器
  107. /// </summary>
  108. /// <returns></returns>
  109. [HttpPost("/sysJob/triggerUpdate")]
  110. public async Task UpdateJobTrigger(UpdateJobTriggerInput input)
  111. {
  112. var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
  113. if (isExist)
  114. throw Oops.Oh(ErrorCodeEnum.D1006);
  115. await _sysJobTriggerRep.UpdateAsync(input.Adapt<SysJobTrigger>());
  116. }
  117. /// <summary>
  118. /// 删除触发器
  119. /// </summary>
  120. /// <returns></returns>
  121. [HttpPost("/sysJob/triggerDelete")]
  122. public async Task DeleteJobTrigger(DeleteJobTriggerInput input)
  123. {
  124. await _sysJobTriggerRep.DeleteAsync(u => u.TriggerId == input.TriggerId);
  125. }
  126. /// <summary>
  127. /// 暂停所有作业
  128. /// </summary>
  129. /// <returns></returns>
  130. [HttpPost("/sysJob/pauseAll")]
  131. public void PauseAllJob()
  132. {
  133. _schedulerFactory.PauseAll();
  134. }
  135. /// <summary>
  136. /// 启动所有作业
  137. /// </summary>
  138. /// <returns></returns>
  139. [HttpPost("/sysJob/startAll")]
  140. public void StartAllJob()
  141. {
  142. _schedulerFactory.StartAll();
  143. }
  144. /// <summary>
  145. /// 暂停作业
  146. /// </summary>
  147. [HttpPost("/sysJob/pauseJob")]
  148. public void PauseJob(JobDetailInput input)
  149. {
  150. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  151. _scheduler?.Pause();
  152. }
  153. /// <summary>
  154. /// 启动作业
  155. /// </summary>
  156. [HttpPost("/sysJob/startJob")]
  157. public void StartJob(JobDetailInput input)
  158. {
  159. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  160. _scheduler?.Start();
  161. }
  162. /// <summary>
  163. /// 暂停触发器
  164. /// </summary>
  165. [HttpPost("/sysJob/pauseTrigger")]
  166. public void PauseTrigger(JobTriggerInput input)
  167. {
  168. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  169. _scheduler?.PauseTrigger(input.TriggerId);
  170. }
  171. /// <summary>
  172. /// 启动触发器
  173. /// </summary>
  174. [HttpPost("/sysJob/startTrigger")]
  175. public void StartTrigger(JobTriggerInput input)
  176. {
  177. _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
  178. _scheduler?.StartTrigger(input.TriggerId);
  179. }
  180. /// <summary>
  181. /// 强制唤醒作业调度器
  182. /// </summary>
  183. [HttpPost("/sysJob/cancelSleep")]
  184. public void CancelSleep()
  185. {
  186. _schedulerFactory.CancelSleep();
  187. }
  188. /// <summary>
  189. /// 强制触发所有作业持久化
  190. /// </summary>
  191. [HttpPost("/sysJob/persistAll")]
  192. public void PersistAll()
  193. {
  194. _schedulerFactory.PersistAll();
  195. }
  196. /// <summary>
  197. /// 获取集群列表
  198. /// </summary>
  199. [HttpGet("/sysJob/clusterList")]
  200. public async Task<List<SysJobCluster>> GetJobClusterList()
  201. {
  202. return await _sysJobClusterRep.GetListAsync();
  203. }
  204. }