using System; using System.Data; using System.IO; using System.Linq.Expressions; using System.Security.Policy; using System.Threading.Tasks; using Hangfire; using Magicodes.ExporterAndImporter.Excel; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; //using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualBasic; using TaskManager.Controllers; using TaskManager.Entity; using TaskManager.EntityFramework; using TaskManager.EntityFramework.Repository; using Wood.Service.Controllers; namespace TaskManager.Controllers { //[ApiController] //[Route("[controller]")] /// /// 定时任务设置服务 /// [AllowAnonymous] public class TaskConifgureController :NormalBaseController { public TaskConifgureController(JobDbContext context, IServiceProvider builder, IConfiguration configuration, IRepository repository) : base(context, builder, configuration, repository) { } /// /// 请除所有任务 /// /// [HttpPost(Name = "ClearAllTask")] public async Task ClearAllTask() { var tasks = await _context.TaskConifgure.ToListAsync(); foreach (var item in tasks) { RecurringJob.RemoveIfExists(item.TaskName); } } /// /// 执行铁定任务 /// /// /// [NonAction] public async Task ExecuteTask(string taskName) { var first = await _context.TaskConifgure.FirstOrDefaultAsync(p => p.TaskName == taskName); var url = first.Url; var path = first.Api; var client = first.Client; var pagesize = first.PageSize; var controller = _builder.GetRequiredService(); await controller.ExecuteAsync(url, path, taskName,client,pagesize); } /// /// 设置任务是否自动执行 /// [HttpGet] public async Task SetIsAuto(long uid, bool isauto) { try { var task = _context.TaskConifgure.FirstOrDefault(p => p.UId == uid); if (isauto == true) { task.IsAuto = true; var url = task.Url; var path = task.Api; var client = task.Client; await AddOrUpdateTask(task); int result=_context.SaveChanges(); return new JsonResult(new { Code = 200, Message = $"{task.TaskName}设置为自动执行!" }); ; //return new JsonResult("200", $"{task.TaskName}设置为自动执行!"); } else { task.IsAuto = false; var url = task.Url; var path = task.Api; var client = task.Client; await RemoveTask(task); int result = _context.SaveChanges(); return new JsonResult(new { Code = 200, Message = $"{task.TaskName}设置为手动执行!" }); ; //return new JsonResult("200", $"{task.TaskName}设置为手动执行!"); } } catch (Exception ex) { return new JsonResult(new { Code = 400, Message = $"执行报错!" }); ; // return new JsonResult("200", $"执行报错!"); } } /// /// 刷新任务 /// /// public async Task RefreshTaskConfig() { //RecurringJob.AddOrUpdate( // "日志定时任务", // x => x.ExecuteAsync(), // "*/10 * * * * *", // TimeZoneInfo.Local // ); // 从数据库加载所有任务配置 var tasks = _context.TaskConifgure.Where(p => p.IsAuto == true && !string.IsNullOrEmpty(p.Corn) && !string.IsNullOrEmpty(p.Api) && !string.IsNullOrEmpty(p.Url)).ToList(); var delTasks = _context.TaskConifgure.Where(p => p.IsAuto == false || string.IsNullOrEmpty(p.Corn) || string.IsNullOrEmpty(p.Api) || string.IsNullOrEmpty(p.Url) ).ToList(); foreach (var task in tasks) { await AddOrUpdateTask(task); } foreach (var task in delTasks) { await RemoveTask(task); } } private async Task AddOrUpdateTask(TaskConifgure task) { var url = task.Url; var path = task.Api; var client = task.Client; var pagesize = task.PageSize; switch (task.TaskName) { case "来料检验数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "排产数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "供应商基础信息": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "人员资质信息": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "BOM主数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "过程控制项质量数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "生产过程数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "产品一次合格率": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "工位一次合格率": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "缺陷业务数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "环境业务数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "设备OEE达成率": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "OEE时间明细": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "物料主数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "附件类数据": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "工艺装备": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "工艺": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "整车月度生产计划1": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "M+6月物料需求计划1": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "整车月度生产计划2": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "M+6月物料需求计划2": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "日物料需求计划": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "计划协议": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "采购订单": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "过焊装未过总装": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "过涂装未过总装": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "排序供货": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "看板配送单": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "退货单": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "奇瑞RDC共享库存": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "日MRP状态监控": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "日MRP预警推移": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "M+6月物料需求计划风险确认": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "日物料需求计划风险确认": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "采购订单风险确认": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "供应商共享库存-上午": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; case "供应商共享库存-晚上": RecurringJob.AddOrUpdate( task.TaskName, x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize), task.Corn, TimeZoneInfo.Local ); break; } } private async Task RemoveTask(TaskConifgure task) { switch (task.TaskName) { case "来料检验数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "排产数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "供应商基础信息": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "人员资质信息": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "BOM主数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "过程控制项质量数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "生产过程数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "产品一次合格率": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "工位一次合格率": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "缺陷业务数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "环境业务数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "设备OEE达成率": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "OEE时间明细": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "物料主数据": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "工艺装备": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "工艺": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "整车月度生产计划1": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "M+6月物料需求计划1": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "整车月度生产计划2": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "M+6月物料需求计划2": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "日物料需求计划": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "计划协议": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "采购订单": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "过焊装未过总装": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "过涂装未过总装": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "排序供货": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "看板配送单": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "退货单": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "奇瑞RDC共享库存": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "日MRP状态监控": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "日MRP预警推移": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "M+6月物料需求计划风险确认": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "日物料需求计划风险确认": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "采购订单风险确认": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "供应商共享库存-上午": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; case "供应商共享库存-晚上": // 移除指定的定时任务 RecurringJob.RemoveIfExists(task.TaskName); break; } } [HttpGet] public async Task Exportextend([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10, [FromQuery] string sortBy = "", [FromQuery] bool isAscending = true, [FromQuery] Dictionary filters = null) { var pagingParams = new PagingParams { PageNumber = pageNumber, PageSize = pageSize, SortBy = sortBy, IsAscending = isAscending, Filters = filters }; // 可以在这里构建表达式树过滤条件 //Expression> filter = null; var pagedResult = await _repository.GetPagedAsync(null, pagingParams); return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx"); } protected async Task ExportFile(ICollection dtos, string fileName) where T : class, new() { var excelExporter = HttpContext.RequestServices.GetRequiredService(); var res = await excelExporter.ExportAsByteArray(dtos); return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "_" + fileName }; } // 使用 Hangfire 注册定时任务 // Console.WriteLine($"已注册定时任务: {task.TaskName}, Cron: {task.Corn}"); } }