TaskService.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. using AutoMapper;
  2. using IMCS.CCS.Common;
  3. using IMCS.CCS.Entitys;
  4. using IMCS.CCS.Service;
  5. using Microsoft.Extensions.Configuration;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. namespace IMCS.CCS.Service.Impl
  11. {
  12. /// <summary>
  13. /// 任务服务
  14. /// </summary>
  15. public class TaskService : ITaskService
  16. {
  17. private readonly IDataService _fileDataService;
  18. private readonly IProjectService _projectService;
  19. private readonly IMapper _mapper;
  20. private readonly IQuartzJobService _quartzJobService;
  21. public TaskService(IDataService fileDataService,
  22. IProjectService projectService,
  23. IMapper mapper,
  24. IQuartzJobService quartzJobService,
  25. IDataStorageConfigurationService dataStorageConfigurationService)
  26. {
  27. _fileDataService = fileDataService;
  28. //初始化 FileData服务
  29. _fileDataService.Init(dataStorageConfigurationService.GetTasksPathOrKey());
  30. _projectService = projectService;
  31. _mapper = mapper;
  32. _quartzJobService = quartzJobService;
  33. }
  34. public async Task<IEnumerable<Tasks>> FindListAsync(Guid? projectId)
  35. {
  36. var data = await _fileDataService.ReadDataAsync<Tasks>();
  37. data ??= new List<Tasks>();
  38. if (projectId != null && projectId != Guid.Empty && data != null)
  39. {
  40. data = data.Where(w => w.ProjectId == projectId);
  41. }
  42. return data?.OrderBy(w => w.ProjectId)
  43. .ThenBy(w => w.GroupName)
  44. .ThenBy(w => w.Name)
  45. .ThenBy(w => w.CreateTime)
  46. .ToList()
  47. ?? new List<Tasks>()
  48. ;
  49. }
  50. public async Task<Tasks> SaveAsync(Tasks form)
  51. {
  52. if (!form.Cron.IsValidExpression())
  53. {
  54. throw new MessageBox("任务 Cron 时间规则不正确!");
  55. }
  56. var data = (await this.FindListAsync(Guid.Empty))?.ToList() ?? new List<Tasks>();
  57. var projects = await _projectService.FindListAsync();
  58. var project = projects.FirstOrDefault(w => w.Id == form.ProjectId);
  59. var tasksByProjectId = await this.FindListAsync(form.ProjectId);
  60. var tasks = data.Find(w => w.Id == form.Id);
  61. var isRun = false;
  62. if (tasks == null)
  63. {
  64. if (tasksByProjectId.Any(w => w.Name == form.Name))
  65. {
  66. throw new MessageBox($"任务名称{form.Name} , 已存在!");
  67. }
  68. form.Id = Guid.NewGuid();
  69. tasks = _mapper.Map<Tasks, Tasks>(form);
  70. tasks.CreateTime = DateTime.Now;
  71. tasks.ProjectName = project?.Name;
  72. data.Add(tasks);
  73. }
  74. else
  75. {
  76. isRun = tasks.State == StateEnum.运行中 && form.State == StateEnum.运行中;
  77. //验证是否在运行状态
  78. //if (tasks.State == StateEnum.运行中 && form.State == StateEnum.运行中)
  79. //{
  80. // throw new MessageBox("任务运行中,请先关闭在修改!");
  81. //}
  82. if (tasksByProjectId.Any(w => w.Name == form.Name && w.Id != tasks.Id))
  83. {
  84. throw new MessageBox($"任务名称{form.Name} , 已存在!");
  85. }
  86. tasks = _mapper.Map(form, tasks);
  87. if (isRun)
  88. {
  89. await this.CloseByIdAsync(tasks.Id ?? Guid.Empty);
  90. tasks.State = StateEnum.未运行;
  91. }
  92. }
  93. await _fileDataService.WriteDataAsync(data);
  94. if (isRun)
  95. {
  96. await RunByIdAsync(tasks.Id ?? Guid.Empty);
  97. }
  98. return tasks;
  99. }
  100. public async Task<bool> DeleteAsync(Guid id)
  101. {
  102. var data = (await this.FindListAsync(Guid.Empty))?.ToList() ?? new List<Tasks>();
  103. var tasks = data.Find(w => w.Id == id);
  104. if (tasks == null) return true;
  105. //验证是否在运行状态
  106. if (tasks.State == StateEnum.运行中)
  107. {
  108. await this.CloseByIdAsync(id);
  109. }
  110. data.RemoveAt(data.IndexOf(tasks));
  111. await _fileDataService.WriteDataAsync(data);
  112. return true;
  113. }
  114. /// <summary>
  115. /// 根据Id 查询 任务
  116. /// </summary>
  117. /// <param name="id"></param>
  118. /// <returns></returns>
  119. public async Task<Tasks> FindByIdAsync(Guid id)
  120. {
  121. var data = (await this.FindListAsync(Guid.Empty))?.ToList() ?? new List<Tasks>();
  122. return data.Find(w => w.Id == id) ?? new Tasks();
  123. }
  124. /// <summary>
  125. /// 根据任务id 运行任务调度
  126. /// </summary>
  127. /// <param name="id"></param>
  128. /// <returns></returns>
  129. public async Task<bool> RunByIdAsync(Guid id)
  130. {
  131. if (id == Guid.Empty) return true;
  132. var data = await this.FindByIdAsync(id);
  133. if (data.State == StateEnum.运行中)
  134. {
  135. return true;
  136. }
  137. var result = await _quartzJobService.RunAsync(data);
  138. if (result)
  139. {
  140. data.State = StateEnum.运行中;
  141. }
  142. await this.SaveAsync(data);
  143. return result;
  144. }
  145. /// <summary>
  146. /// 根据任务id 关闭任务调度
  147. /// </summary>
  148. /// <param name="id"></param>
  149. /// <returns></returns>
  150. public async Task<bool> CloseByIdAsync(Guid id)
  151. {
  152. var data = await this.FindByIdAsync(id);
  153. if (data.State == StateEnum.未运行)
  154. {
  155. return true;
  156. }
  157. bool result = false;
  158. try
  159. {
  160. result = await _quartzJobService.CloseAsync(data);
  161. }
  162. catch (Exception ex)
  163. {
  164. //tasks.State = StateEnum.未运行;
  165. //await _taskService.SaveAsync(tasks);
  166. throw new MessageBox(ex.Message);
  167. }
  168. finally
  169. {
  170. //if (result)
  171. //{
  172. // data.State = StateEnum.未运行;
  173. //}
  174. data.State = StateEnum.未运行;
  175. await this.SaveAsync(data);
  176. }
  177. return result;
  178. }
  179. /// <summary>
  180. /// 更新执行时间
  181. /// </summary>
  182. /// <param name="tasksId"></param>
  183. /// <param name="dateTime"></param>
  184. /// <returns></returns>
  185. public async Task<bool> UpdateExecuteTime(Guid tasksId, DateTime dateTime)
  186. {
  187. var data = (await this.FindListAsync(Guid.Empty))?.ToList() ?? new List<Tasks>();
  188. if (data == null || data.Count == 0) return false;
  189. var tasks = data.Find(w => w.Id == tasksId);
  190. if (tasks == null) return false;
  191. tasks.ExecuteTime = dateTime;
  192. return await _fileDataService.WriteDataAsync(data);
  193. }
  194. }
  195. }