using Azure.Core; using Dapper; using Magicodes.ExporterAndImporter.Core.Extension; using Magicodes.ExporterAndImporter.Excel; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System.Data; using System.Drawing.Printing; using System.Linq.Expressions; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using TaskManager.Contracts.Dtos; using TaskManager.Entity; using TaskManager.EntityFramework; using TaskManager.EntityFramework.Repository; namespace TaskManager.Controllers { public class CheryRecurringJobInputPageController : RecurringJobBaseController where T : BaseEntity ,new() { protected readonly IRepository _repository; public CheryRecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository repository) : base(httpClient, jobDbContext, log) { _repository = repository; } protected override async Task DoExecutingAsync(string url, string path, string takName, string client) { Url = url; Path = path; TaskName = takName; Client = client; await SyncTaskSubTable(TaskName,Client); } private async Task PostPageAsync(PagedRequest t) { try { var inputjson = JsonSerializer.Serialize(t, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true // 可选,用于格式化输出 } ); inputjson = RemoveWhitespace(inputjson); var content = await Post(Url, Path, inputjson); if (!string.IsNullOrEmpty(content)) { var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, Converters = { new JsonStringEnumConverter(), // 枚举转换 new CustomDateTimeConverter("yyyy-MM-dd HH:mm:ss") // 日期转换 } }; return JsonSerializer.Deserialize(content, options); } else { await _logger.AddError($"调用接口无返回值{Url}", TaskName); return null; } } catch (Exception ex) { await _logger.AddError($"调用接口无返回值错误{ex.Message}", TaskName); return null; } } public static string GenerateRandomStringWith8EG() { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var random = new Random(); var sb = new StringBuilder(32); // 随机生成 "8EG" 的插入位置 (0-29) int position = random.Next(0, 30); // 生成前半部分随机字符串 for (int i = 0; i < position; i++) { sb.Append(chars[random.Next(chars.Length)]); } // 插入 "8EG" sb.Append("8EG"); // 生成后半部分随机字符串,补足32位 int remainingLength = 32 - sb.Length; for (int i = 0; i < remainingLength; i++) { sb.Append(chars[random.Next(chars.Length)]); } return sb.ToString(); } private async Task SyncTaskSubTable(string taskName, string client) { if (string.IsNullOrEmpty(taskName) || string.IsNullOrEmpty(client)) { await _logger.AddError("任务名称或客户端不能为空",taskName); return; } var sublist = _jobDbContext.TaskSub.Where(p => p.TaskName == taskName && p.WriteState == false && p.Subscriber == client).ToList(); int pageSize = 1000; if (!sublist.Any()) { foreach (var sub in sublist) { string querystr = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 order by uid";//任务表 var entites = _jobDbContext.Database.GetDbConnection().Query(querystr);//明细表 if (entites.Any()) { var total = entites.Count(); int totalPages = (int)Math.Ceiling((double)total / pageSize); for (int i = 1; i <= totalPages; i++) { var records = entites.Skip((i - 1) * pageSize) .Take(pageSize).ToList(); PagedRequest pagedRequest = new PagedRequest() { batchNo = GenerateRandomStringWith8EG(), total = entites.Count(), pageSize = pageSize, list = records, pageNum = i }; foreach (var itm in records) { itm.WriteState = true; } var result = await PostPageAsync(pagedRequest); if (result.code == "200") { _jobDbContext.BulkUpdate(records); sub.SyncedPageCount = i; if (result.data.totalGet == total) { sub.WriteState = true; _jobDbContext.Set().Update(sub); _jobDbContext.SaveChanges(); } } else { await _logger.AddError($"第 {i} 页数据保存失败,请检查数据。", TaskName); } } } } } } [HttpGet] public async Task>> GetAll() { return await _repository.GetAllAsync() as List; } [HttpGet("{id}")] public async Task> GetById(int id) { var entity = await _repository.GetByIdAsync(id); if (entity == null) return NotFound(); return entity; } [HttpPost] public async Task> Create(T entity) { entity.CreationTime = DateTime.Now; var createdEntity = await _repository.AddAsync(entity); return new JsonResult(new { Code = 200, Message = "创建成功!" }); ; } [HttpPut("{id}")] public async Task Update(T entity) { var _first = await _repository.GetByIdAsync(entity.UId); if (_first == null) { return new JsonResult(new { Code = 400, Message = "修改失败!" }); } await _repository.UpdateAsync(entity); return new JsonResult(new { Code = 200, Message = "修改成功!" }); } [HttpDelete("{id}")] public async Task Delete(int id) { await _repository.DeleteAsync(id); return new JsonResult(new { Code = 200, Message = "删除成功!" }); ; } [HttpGet] public async Task>> GetPaged( [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(filter, pagingParams); return Ok(pagedResult); } [HttpGet] public async Task Export([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) { 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 }; } [HttpGet] public async Task GetImportTemplate() { try { // 创建导入模板生成器 var importer = new ExcelImporter(); // 生成导入模板流(这里假设使用 YourModel 作为导入模型) var bytes = await importer.GenerateTemplateBytes(); //using var stream = new MemoryStream(bytes); //stream.Seek(0, SeekOrigin.Begin); // 设置友好的文件名,例如:"导入模板_20250530.xlsx" var fileName = $"导入模板_{DateTime.Now:yyyyMMdd}.xlsx"; // 返回文件流结果 return new FileStreamResult(new MemoryStream(bytes), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "_" + fileName }; //return File( // fileStream: stream, // contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // fileDownloadName: fileName); } catch (Exception ex) { // 记录异常日志 Console.WriteLine($"生成导入模板时出错: {ex.Message}"); // 返回错误响应 return StatusCode(500, "生成导入模板时发生错误"); } } } }