You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

857 lines
36 KiB

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]")]
/// <summary>
/// 定时任务设置服务
/// </summary>
[AllowAnonymous]
public class TaskConifgureController :NormalBaseController<TaskConifgure>
{
public TaskConifgureController(JobDbContext context, IServiceProvider builder, IConfiguration configuration, IRepository<TaskConifgure> repository) : base(context, builder, configuration, repository)
{
}
/// <summary>
/// 请除所有任务
/// </summary>
/// <returns></returns>
[HttpPost(Name = "ClearAllTask")]
public async Task ClearAllTask()
{
var tasks = await _context.TaskConifgure.ToListAsync();
foreach (var item in tasks)
{
RecurringJob.RemoveIfExists(item.TaskName);
}
}
/// <summary>
/// 执行铁定任务
/// </summary>
/// <param name="taskName"></param>
/// <returns></returns>
[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<SupplierProPlaningService>();
await controller.ExecuteAsync(url, path, taskName,client,pagesize);
}
/// <summary>
///// <summary>
///// 执行铁定任务
///// </summary>
///// <param name="taskName"></param>
///// <returns></returns>
//[NonAction]
//public async Task testTask(string taskName)
//{
// var first = await _context.TaskConifgure.FirstOrDefaultAsync(p => p.TaskName == taskName);
// var url = first.Url;
// var path = first.Api;
// var controller = _builder.GetRequiredService<SupplierProPlaningService>();
// await controller.TestAsync(url, path, taskName, "2025-04-21");
//}
//[NonAction]
//public async Task TaskAllAsync(string date)
//{
// var tasks = _context.TaskConifgure.Where(p => p.IsAuto == true && !string.IsNullOrEmpty(p.Corn)
// && !string.IsNullOrEmpty(p.Api) && !string.IsNullOrEmpty(p.Url)).ToList();
// foreach (var task in tasks)
// {
// try
// {
// var url = task.Url;
// var path = task.Api;
// var taskname = task.TaskName;
// switch (task.TaskName)
// {
// //case "整车月度生产计划1":
// // // 添加的代码块
// // var controller1 = _builder.GetRequiredService<SupplierProPlaningService>();
// // await controller1.TestAsync(url, path, taskname, "2025-05-29");
// // break;
// case "M+6月物料需求计划1":
// // 添加的代码块
// var controller2 = _builder.GetRequiredService<CherySupplierMrpMonthService>();
// await controller2.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "整车月度生产计划2":
// // 添加的代码块
// var controller3 = _builder.GetRequiredService<SupplierProPlaningService>();
// await controller3.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "M+6月物料需求计划2":
// // 添加的代码块
// var controller4 = _builder.GetRequiredService<CherySupplierMrpMonthService>();
// await controller4.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "日物料需求计划":
// // 添加的代码块
// var controller5 = _builder.GetRequiredService<CherySupplierMrpDataService>();
// await controller5.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "计划协议":
// // 添加的代码块
// var controller6 = _builder.GetRequiredService<CherySupplierSaWeekService>();
// await controller6.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "采购订单":
// // 添加的代码块
// var controller7 = _builder.GetRequiredService<CherySupplierPoService>();
// await controller7.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "过焊装未过总装":
// // 添加的代码块
// var controller8 = _builder.GetRequiredService<CherySupplierPorHSCHEDULService>();
// await controller8.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "过涂装未过总装":
// // 添加的代码块
// var controller9 = _builder.GetRequiredService<CherySupplierProTSCHEDULService>();
// await controller9.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "排序供货":
// // 添加的代码块
// var controller10 = _builder.GetRequiredService<CherySupplierProCSCHEDULService>();
// await controller10.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "看板配送单":
// // 添加的代码块
// var controller11 = _builder.GetRequiredService<CherySupplierDelStateService>();
// await controller11.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "退货单":
// // 添加的代码块
// var controller12 = _builder.GetRequiredService<CherySupplierReturnService>();
// await controller12.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "奇瑞RDC共享库存":
// // 添加的代码块
// var controller13 = _builder.GetRequiredService<SupplierInvDataService>();
// await controller13.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "日MRP状态监控":
// // 添加的代码块
// var controller14 = _builder.GetRequiredService<CherySupplierMrpDataService>();
// await controller14.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "日MRP预警推移":
// // 添加的代码块
// var controller15 = _builder.GetRequiredService<CherySupplierMrpWarningService>();
// await controller15.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "供应商共享库存-上午":
// // 添加的代码块
// var controller19 = _builder.GetRequiredService<CherySupplierSinvDataService>();
// await controller19.TestAsync(url, path, taskname, "2025-05-29");
// break;
// case "供应商共享库存-晚上":
// // 添加的代码块
// var controller20 = _builder.GetRequiredService<CherySupplierSinvDataService>();
// await controller20.TestAsync(url, path, taskname, "2025-05-29");
// break;
// }
// }
// catch
// {
// }
// }
//}
/// <summary>
/// 设置任务是否自动执行
/// </summary>
[HttpGet]
public async Task<ActionResult> 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("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("200", $"{task.TaskName}设置为手动执行!");
}
}
catch (Exception ex) {
return new JsonResult("200", $"执行报错!");
}
}
/// <summary>
/// 刷新任务
/// </summary>
/// <returns></returns>
public async Task RefreshTaskConfig()
{
// 从数据库加载所有任务配置
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<SupplierProMaterialStockService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "排产数据":
RecurringJob.AddOrUpdate<CherySupplierProSchedulingService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "供应商基础信息":
RecurringJob.AddOrUpdate<CherySupplierInfoService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "人员资质信息":
RecurringJob.AddOrUpdate<CherySupplierEmployeeService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "BOM主数据":
RecurringJob.AddOrUpdate<CherySupplierBomService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "过程控制项质量数据":
RecurringJob.AddOrUpdate<CherySupplierProCpsService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "生产过程数据":
RecurringJob.AddOrUpdate<CherySupplierProDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "产品一次合格率":
RecurringJob.AddOrUpdate<CherySupplierProFirstPassyieldService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "工位一次合格率":
RecurringJob.AddOrUpdate<CherySupplierProStationFirstPassyieldService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "缺陷业务数据":
RecurringJob.AddOrUpdate<CherySupplierProFlawService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "环境业务数据":
RecurringJob.AddOrUpdate<CherySupplierProEnvironmentService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "设备OEE达成率":
RecurringJob.AddOrUpdate<CherySupplierProOeeAchievementRateService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "OEE时间明细":
RecurringJob.AddOrUpdate<CherySupplierProOeeTimeDetailsService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "物料主数据":
RecurringJob.AddOrUpdate<CherySupplierProMaterialDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "附件类数据":
RecurringJob.AddOrUpdate<CherySupplierProAttachmentDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "工艺装备":
RecurringJob.AddOrUpdate<CherySupplierProProcessEquipmentService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "工艺":
RecurringJob.AddOrUpdate<CherySupplierProProcessService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "整车月度生产计划1":
RecurringJob.AddOrUpdate<SupplierProPlaningService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "M+6月物料需求计划1":
RecurringJob.AddOrUpdate<CherySupplierMrpMonthService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "整车月度生产计划2":
RecurringJob.AddOrUpdate<SupplierProPlaningService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "M+6月物料需求计划2":
RecurringJob.AddOrUpdate<CherySupplierMrpMonthService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "日物料需求计划":
RecurringJob.AddOrUpdate<CherySupplierMrpDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "计划协议":
RecurringJob.AddOrUpdate<CherySupplierSaWeekService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "采购订单":
RecurringJob.AddOrUpdate<CherySupplierPoService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "过焊装未过总装":
RecurringJob.AddOrUpdate<CherySupplierPorHSCHEDULService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "过涂装未过总装":
RecurringJob.AddOrUpdate<CherySupplierProTSCHEDULService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "排序供货":
RecurringJob.AddOrUpdate<CherySupplierProCSCHEDULService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "看板配送单":
RecurringJob.AddOrUpdate<CherySupplierDelStateService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "退货单":
RecurringJob.AddOrUpdate<CherySupplierReturnService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "奇瑞RDC共享库存":
RecurringJob.AddOrUpdate<SupplierInvDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "日MRP状态监控":
RecurringJob.AddOrUpdate<CherySupplierMrpDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "日MRP预警推移":
RecurringJob.AddOrUpdate<CherySupplierMrpWarningService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "M+6月物料需求计划风险确认":
RecurringJob.AddOrUpdate<CherySupplierConMmrpService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "日物料需求计划风险确认":
RecurringJob.AddOrUpdate<CherySupplierConDateService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "采购订单风险确认":
RecurringJob.AddOrUpdate<CherySupplierConPoService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "供应商共享库存-上午":
RecurringJob.AddOrUpdate<CherySupplierSinvDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client,pagesize),
task.Corn,
TimeZoneInfo.Local
);
break;
case "供应商共享库存-晚上":
RecurringJob.AddOrUpdate<CherySupplierSinvDataService>(
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<FileStreamResult> Exportextend([FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string sortBy = "",
[FromQuery] bool isAscending = true,
[FromQuery] Dictionary<string, string> filters = null)
{
var pagingParams = new PagingParams
{
PageNumber = pageNumber,
PageSize = pageSize,
SortBy = sortBy,
IsAscending = isAscending,
Filters = filters
};
// 可以在这里构建表达式树过滤条件
//Expression<Func<T, bool>> filter = null;
var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
}
protected async Task<FileStreamResult> ExportFile<T>(ICollection<T> dtos, string fileName) where T : class, new()
{
var excelExporter = HttpContext.RequestServices.GetRequiredService<IExcelExporter>();
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}");
}
}