diff --git a/Tiobon.Core.Api/Controllers/Base/BaseController.cs b/Tiobon.Core.Api/Controllers/Base/BaseController.cs index 58b3dba4..68e37b81 100644 --- a/Tiobon.Core.Api/Controllers/Base/BaseController.cs +++ b/Tiobon.Core.Api/Controllers/Base/BaseController.cs @@ -1,4 +1,5 @@ using System.Reflection; +using NPOI.HPSF; namespace Tiobon.Core.Controllers; @@ -229,6 +230,18 @@ public class BaseController DownloadExcel() + { + var result = (await InvokeServiceAsync("DownloadExcel", [])) as ServiceResult; + string path = result.Data; + FileStream fs = new FileStream(path, FileMode.OpenOrCreate); + fs.Close(); + return File(new FileStream(path, FileMode.Open), "application/octet-stream", result.Message); + } + #endregion + ///// ///// 反射调用service方法 ///// diff --git a/Tiobon.Core.Api/wwwroot/files/ExcelTemplate/Ghre_Question.xlsx b/Tiobon.Core.Api/wwwroot/files/ExcelTemplate/Ghre_Question.xlsx new file mode 100644 index 00000000..b13f1d76 Binary files /dev/null and b/Tiobon.Core.Api/wwwroot/files/ExcelTemplate/Ghre_Question.xlsx differ diff --git a/Tiobon.Core.IServices/BASE/IBaseServices.cs b/Tiobon.Core.IServices/BASE/IBaseServices.cs index fcc4b6f1..b5b1a74a 100644 --- a/Tiobon.Core.IServices/BASE/IBaseServices.cs +++ b/Tiobon.Core.IServices/BASE/IBaseServices.cs @@ -153,7 +153,9 @@ namespace Tiobon.Core.IServices.BASE Task> QueryFilterPage(QueryBody filter, string condition); Task> ExportExcel([FromBody] QueryBody body); - Task> ImportExcel(IFormFile file); + Task> ImportExcel(IFormFile file); + + Task> DownloadExcel(); Task> QueryMuch( Expression> joinExpression, diff --git a/Tiobon.Core.Model/ViewModels/Extend/ExcelData.cs b/Tiobon.Core.Model/ViewModels/Extend/ExcelData.cs new file mode 100644 index 00000000..d2fceb35 --- /dev/null +++ b/Tiobon.Core.Model/ViewModels/Extend/ExcelData.cs @@ -0,0 +1,8 @@ +namespace Tiobon.Core.Model; + +public class ExcelData +{ + public int SuccessCount { get; set; } = 0; + public int ErrorCount { get; set; } = 0; + public string filePath { get; set; } +} \ No newline at end of file diff --git a/Tiobon.Core.Services/BASE/BaseServices.cs b/Tiobon.Core.Services/BASE/BaseServices.cs index 8242db45..84d3550c 100644 --- a/Tiobon.Core.Services/BASE/BaseServices.cs +++ b/Tiobon.Core.Services/BASE/BaseServices.cs @@ -2,12 +2,14 @@ using System.Data; using System.Dynamic; using System.Linq.Expressions; +using System.Net.Mail; using AgileObjects.AgileMapper; using MathNet.Numerics.Distributions; using Microsoft.AspNetCore.Http; using MySqlX.XDevAPI.Common; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NPOI.HPSF; using NPOI.Util; using SqlSugar; using Tiobon.Core.Common; @@ -817,7 +819,7 @@ public class BaseServices : IBaseServ } - public async virtual Task> ImportExcel(IFormFile file) + public async virtual Task> ImportExcel(IFormFile file) { //long id = SnowFlakeSingle.instance.getID(); //var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; @@ -826,7 +828,19 @@ public class BaseServices : IBaseServ // Directory.CreateDirectory(physicsPath + path); - return ServiceResult.OprateSuccess("导入成功!"); + return ServiceResult.OprateSuccess("导入成功!"); + } + public async virtual Task> DownloadExcel() + { + var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; + var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}"; + if (!Directory.Exists(physicsPath + path)) + Directory.CreateDirectory(physicsPath + path); + + Type entityType = typeof(TEntity); + var fileName = entityType.GetEntityTableName() + ".xlsx"; + var result = ServiceResult.OprateSuccess(fileName, physicsPath + path + fileName); + return result; } public async Task> QueryMuch(Expression> joinExpression, Expression> selectExpression, Expression> whereLambda = null) where T : class, new() diff --git a/Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs b/Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs index efba4a03..04d9e185 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs @@ -424,10 +424,13 @@ public class Ghre_ExamServices : BaseServices().Where(it => it.Id == pageData.ExamPaperId).FirstAsync(); + var course = await Db.Queryable().Where(it => it.Id == pageData.CourseId).FirstAsync(); pageData.CoverUrl = course?.CoverUrl; if (string.IsNullOrWhiteSpace(pageData.ExamNo)) @@ -1007,7 +1010,6 @@ public class Ghre_ExamServices : BaseServices(); id = await base.Add(insert); - var insertStaffs = pageData.staffTableData.Select(x => new InsertGhre_ExamStaffInput() { ExamId = id, diff --git a/Tiobon.Core.Services/Ghre/Ghre_QuestionServices.cs b/Tiobon.Core.Services/Ghre/Ghre_QuestionServices.cs index c52937b2..89babff2 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_QuestionServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_QuestionServices.cs @@ -784,8 +784,9 @@ public class Ghre_QuestionServices : BaseServices> ImportExcel(IFormFile file) + public override async Task> ImportExcel(IFormFile file) { + var data = new ExcelData(); long id = SnowFlakeSingle.instance.getID(); var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}import{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}"; @@ -941,13 +942,14 @@ public class Ghre_QuestionServices : BaseServices a)); isExistError = true; continue; } else { - + data.SuccessCount++; var id = await base.Add(insert); insertAnswers.ForEach(x => x.QuestionId = id); await _ghre_QuestionAnswerServices.Add(insertAnswers); @@ -964,13 +966,16 @@ public class Ghre_QuestionServices : BaseServices.OprateFailed("导入文件存在错误,请下载后查看!", errorFileName); + return ServiceResult.OprateFailed("导入文件存在错误,请下载后查看!", data); else - return ServiceResult.OprateSuccess("导入成功!"); + return ServiceResult.OprateSuccess("导入成功!"); } #endregion } \ No newline at end of file