using Magicodes.ExporterAndImporter.Core; using Magicodes.ExporterAndImporter.Core.Extension; using Magicodes.ExporterAndImporter.Excel; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; using System.Threading.Tasks; using TaskManager.Entity; using TaskManager.EntityFramework; using TaskManager.EntityFramework.Repository; using Wood.Entity; using Wood.Util; using Wood.Util.Filters; namespace Wood.Service.Controllers { [AllowAnonymous] public class NormalBaseController:ControllerBase,IScoped where T:BaseEntity ,new() { protected readonly JobDbContext _context; protected readonly IServiceProvider _builder; protected readonly IConfiguration _configuration; protected readonly IRepository _repository; public NormalBaseController(JobDbContext context, IServiceProvider builder, IConfiguration configuration, IRepository repository) { _builder = builder; _context = context; _configuration = configuration; _repository = repository; } /// /// 通过UID获得实体 /// /// /// [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 = "创建成功!" }); } /// /// 更新实体UID /// /// /// [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 = "修改成功!" }); } /// /// 删除实体通过UID /// /// /// [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); //} /// /// 分页New /// /// /// [HttpPost] public async Task>> GetDataPaged(RequestInputBase input) { var pagingParams = new PagingParams { PageNumber = input.pageNumber, PageSize = input.pageSize, SortBy = input.sortBy, IsAscending = input.isAscending, }; // 可以在这里构建表达式树过滤条件 Expression> filter = null; var pagedResult = await _repository.GetDataPagedAsync(filter, pagingParams, input.Condition); return Ok(pagedResult); } /// /// 导出New /// /// /// [HttpPost] public async Task ExportData(RequestInputBase input) { var pagingParams = new PagingParams { PageNumber = input.pageNumber, PageSize = input.pageSize, SortBy = input.sortBy, IsAscending = input.isAscending, }; // 可以在这里构建表达式树过滤条件 //Expression> filter = null; var pagedResult = await _repository.GetDataPagedAsync(null, pagingParams, input.Condition); return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx"); } // /// // /// 导出 // /// // /// // /// // /// // /// // /// // /// // [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, "生成导入模板时发生错误"); } } /// /// 导入 /// /// /// [HttpPost("Import")] public async virtual Task Import(IFormFile file) { if (file == null || file.Length <= 0) { return BadRequest("No file uploaded."); } try { var excelImporter = HttpContext.RequestServices.GetRequiredService(); var importResult = await excelImporter.Import(file.OpenReadStream()); //if (importResult.HasError) //{ // return BadRequest(importResult.ErrorMessage); //} // 处理导入的数据 List list = new List(); foreach (var item in importResult.Data) { list.Add(item); } await ImportBefore(list); await _context.BulkInsertAsync(list); await ImportAfter(list); return new JsonResult(new { Code = 200, Message = "修改成功!" }); } catch (Exception ex) { // await _logger.AddError(ex.Message, TaskName); return new JsonResult(new { Code = 400, Message = "导入失败!" }); } } protected virtual async Task ImportBefore(List p_list) { } protected virtual async Task ImportAfter(List p_list) { } } }