//namespace Admin.NET.Core.Service; ///// ///// 系统定时任务服务 ///// //[ApiDescriptionSettings(Order = 188)] //public class SysTimerService : IDynamicApiController, ITransient //{ // private readonly SqlSugarRepository _sysTimerRep; // private readonly SysCacheService _sysCacheService; // public SysTimerService(SqlSugarRepository sysTimerRep, // SysCacheService sysCacheService) // { // _sysTimerRep = sysTimerRep; // _sysCacheService = sysCacheService; // } // /// // /// 获取任务分页列表 // /// // /// // /// // [HttpGet("/sysTimer/page")] // public async Task> GetTimerPage([FromQuery] PageTimerInput input) // { // var workers = SpareTime.GetWorkers().ToList(); // var timers = await _sysTimerRep.AsQueryable() // .WhereIF(!string.IsNullOrWhiteSpace(input.TimerName), u => u.TimerName.Contains(input.TimerName)) // .Select() // .ToPagedListAsync(input.Page, input.PageSize); // timers.Items.ToList().ForEach(u => // { // var timer = workers.FirstOrDefault(m => m.WorkerName == u.TimerName); // if (timer != null) // { // u.Status = timer.Status; // u.Tally = timer.Tally; // u.Exception = JSON.Serialize(timer.Exception); // } // }); // return timers; // } // /// // /// 增加任务 // /// // /// // /// // [HttpPost("/sysTimer/add")] // public async Task AddTimer(AddTimerInput input) // { // var isExist = await _sysTimerRep.IsAnyAsync(u => u.TimerName == input.TimerName); // if (isExist) throw Oops.Oh(ErrorCodeEnum.D1100); // var timer = input.Adapt(); // await _sysTimerRep.InsertAsync(timer); // CreateTimer(timer); // 添加到任务调度里 // } // /// // /// 删除任务 // /// // /// // /// // [HttpPost("/sysTimer/delete")] // public async Task DeleteTimer(DeleteTimerInput input) // { // var timer = await _sysTimerRep.GetFirstAsync(u => u.Id == input.Id); // if (timer == null) throw Oops.Oh(ErrorCodeEnum.D1101); // await _sysTimerRep.DeleteAsync(timer); // SpareTime.Cancel(timer.TimerName); // 从调度器里取消 // } // /// // /// 更新任务 // /// // /// // /// // [HttpPost("/sysTimer/update")] // public async Task UpdateTimber(UpdateTimerInput input) // { // var isExist = await _sysTimerRep.IsAnyAsync(u => u.TimerName == input.TimerName && u.Id != input.Id); // if (isExist) throw Oops.Oh(ErrorCodeEnum.D1100); // // 先从调度器里取消 // var oldTimer = await _sysTimerRep.GetFirstAsync(u => u.Id == input.Id); // SpareTime.Cancel(oldTimer.TimerName); // var timer = input.Adapt(); // await _sysTimerRep.AsUpdateable(timer).IgnoreColumns(true).ExecuteCommandAsync(); // CreateTimer(timer); // 再添加到任务调度里 // } // /// // /// 设置任务状态 // /// // /// // /// // [HttpPost("/sysTimer/setStatus")] // public async void SetStatusTimer(SetTimerStatusInput input) // { // if (input.Status == SpareTimeStatus.Stopped) // SpareTime.Stop(input.TimerName); // else if (input.Status == SpareTimeStatus.Running) // { // var spareTime = SpareTime.GetWorkers().ToList().Find(u => u.WorkerName == input.TimerName); // if (spareTime == null) // { // var timer = await _sysTimerRep.GetFirstAsync(u => u.TimerName == input.TimerName); // CreateTimer(timer); // } // SpareTime.Start(input.TimerName); // 若StartNow=flase则不会启动任务 // } // } // /// // /// 创建定时任务 // /// // /// // private void CreateTimer(SysTimer input) // { // Action action = null; // switch (input.RequestType) // { // case RequestTypeEnum.Run: // 创建本地方法委托 // { // var taskMethod = GetTimerMethodList()?.FirstOrDefault(m => m.RequestUrl == input.RequestUrl); // if (taskMethod == null) break; // var typeInstance = Activator.CreateInstance(taskMethod.DeclaringType); // action = (Action)Delegate.CreateDelegate(typeof(Action), typeInstance, taskMethod.MethodName); // break; // } // default: // 创建网络任务委托 // { // action = async (_, _) => // { // var requestUrl = input.RequestUrl.Trim(); // requestUrl = requestUrl?.IndexOf("http") == 0 ? requestUrl : "http://" + requestUrl; // 默认http协议 // var requestParametersString = input.RequestPara; // var requestParameters = string.IsNullOrEmpty(requestParametersString) // ? null : JSON.Deserialize>(requestParametersString); // var headersString = input.Headers; // var headers = string.IsNullOrEmpty(headersString) // ? null : JSON.Deserialize>(headersString); // switch (input.RequestType) // { // case RequestTypeEnum.Get: // await requestUrl.SetHeaders(headers).GetAsync(); // break; // case RequestTypeEnum.Post: // await requestUrl.SetHeaders(headers).SetQueries(requestParameters).PostAsync(); // break; // case RequestTypeEnum.Put: // await requestUrl.SetHeaders(headers).SetQueries(requestParameters).PutAsync(); // break; // case RequestTypeEnum.Delete: // await requestUrl.SetHeaders(headers).DeleteAsync(); // break; // } // }; // break; // } // } // if (action == null) return; // // 缓存任务配置参数供任务运行时读取 // if (input.RequestType == RequestTypeEnum.Run) // { // var timerParaName = $"{input.TimerName}_para"; // var timerPara = _sysCacheService.ExistKey(timerParaName); // var requestPara = string.IsNullOrEmpty(input.RequestPara); // // 若没有任务配置但存在缓存则删除 // if (requestPara && timerPara) // _sysCacheService.Remove(timerParaName); // else if (!requestPara) // _sysCacheService.Set(timerParaName, JSON.Deserialize>(input.RequestPara)); // } // // 创建定时任务 // switch (input.TimerType) // { // case SpareTimeTypes.Interval: // if (input.DoOnce) // SpareTime.DoOnce((int)input.Interval * 1000, action, input.TimerName, input.Remark, input.StartNow, executeType: input.ExecuteType); // else // SpareTime.Do((int)input.Interval * 1000, action, input.TimerName, input.Remark, input.StartNow, executeType: input.ExecuteType); // break; // case SpareTimeTypes.Cron: // SpareTime.Do(input.Cron, action, input.TimerName, input.Remark, input.StartNow, executeType: input.ExecuteType); // break; // } // } // /// // /// 获取所有定时任务方法列表(贴spareTime特性) // /// // /// // private IEnumerable GetTimerMethodList() // { // // 有缓存就返回缓存 // var timerMethodList = _sysCacheService.Get>(CacheConst.KeyTimer); // if (timerMethodList != null) return timerMethodList; // timerMethodList = App.EffectiveTypes // .Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(ISpareTimeWorker).IsAssignableFrom(u)) // .SelectMany(u => u.GetMethods(BindingFlags.Public | BindingFlags.Instance) // .Where(m => m.IsDefined(typeof(SpareTimeAttribute), false) && // m.GetParameters().Length == 2 && // m.GetParameters()[0].ParameterType == typeof(SpareTimer) && // m.GetParameters()[1].ParameterType == typeof(long) && m.ReturnType == typeof(void)) // .Select(m => // { // // 默认获取第一条任务特性 // var spareTimeAttribute = m.GetCustomAttribute(); // return new TimerMethod // { // TimerName = spareTimeAttribute.WorkerName, // RequestUrl = $"{m.DeclaringType.Name}/{m.Name}", // Cron = spareTimeAttribute.CronExpression, // DoOnce = spareTimeAttribute.DoOnce, // ExecuteType = spareTimeAttribute.ExecuteType, // Interval = (int)spareTimeAttribute.Interval / 1000, // StartNow = spareTimeAttribute.StartNow, // RequestType = RequestTypeEnum.Run, // Remark = spareTimeAttribute.Description, // TimerType = string.IsNullOrEmpty(spareTimeAttribute.CronExpression) ? SpareTimeTypes.Interval : SpareTimeTypes.Cron, // MethodName = m.Name, // DeclaringType = m.DeclaringType // }; // })); // _sysCacheService.Set(CacheConst.KeyTimer, timerMethodList); // return timerMethodList; // } //}