配合前端对接题库导入excel接口

master
xiaochanghai 1 year ago
parent b66c91fe4e
commit 459a9f72fa
  1. 13
      Tiobon.Core.Api/Controllers/Base/BaseController.cs
  2. BIN
      Tiobon.Core.Api/wwwroot/files/ExcelTemplate/Ghre_Question.xlsx
  3. 4
      Tiobon.Core.IServices/BASE/IBaseServices.cs
  4. 8
      Tiobon.Core.Model/ViewModels/Extend/ExcelData.cs
  5. 18
      Tiobon.Core.Services/BASE/BaseServices.cs
  6. 6
      Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs
  7. 13
      Tiobon.Core.Services/Ghre/Ghre_QuestionServices.cs

@ -1,4 +1,5 @@
using System.Reflection; using System.Reflection;
using NPOI.HPSF;
namespace Tiobon.Core.Controllers; namespace Tiobon.Core.Controllers;
@ -229,6 +230,18 @@ public class BaseController<IServiceBase, TEntity, TEntityDto, TInsertDto, TEdit
} }
#endregion #endregion
#region Excel下载
[HttpGet("DownloadExcel"), AllowAnonymous]
public async Task<IActionResult> DownloadExcel()
{
var result = (await InvokeServiceAsync("DownloadExcel", [])) as ServiceResult<string>;
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
///// <summary> ///// <summary>
///// 反射调用service方法 ///// 反射调用service方法
///// </summary> ///// </summary>

@ -153,7 +153,9 @@ namespace Tiobon.Core.IServices.BASE
Task<ServicePageResult<TEntityDto>> QueryFilterPage(QueryBody filter, string condition); Task<ServicePageResult<TEntityDto>> QueryFilterPage(QueryBody filter, string condition);
Task<ServiceResult<long>> ExportExcel([FromBody] QueryBody body); Task<ServiceResult<long>> ExportExcel([FromBody] QueryBody body);
Task<ServiceResult<string>> ImportExcel(IFormFile file); Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file);
Task<ServiceResult<string>> DownloadExcel();
Task<List<TResult>> QueryMuch<T, T2, T3, TResult>( Task<List<TResult>> QueryMuch<T, T2, T3, TResult>(
Expression<Func<T, T2, T3, object[]>> joinExpression, Expression<Func<T, T2, T3, object[]>> joinExpression,

@ -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; }
}

@ -2,12 +2,14 @@
using System.Data; using System.Data;
using System.Dynamic; using System.Dynamic;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Net.Mail;
using AgileObjects.AgileMapper; using AgileObjects.AgileMapper;
using MathNet.Numerics.Distributions; using MathNet.Numerics.Distributions;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using MySqlX.XDevAPI.Common; using MySqlX.XDevAPI.Common;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NPOI.HPSF;
using NPOI.Util; using NPOI.Util;
using SqlSugar; using SqlSugar;
using Tiobon.Core.Common; using Tiobon.Core.Common;
@ -817,7 +819,7 @@ public class BaseServices<TEntity, TEntityDto, TInsertDto, TEditDto> : IBaseServ
} }
public async virtual Task<ServiceResult<string>> ImportExcel(IFormFile file) public async virtual Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file)
{ {
//long id = SnowFlakeSingle.instance.getID(); //long id = SnowFlakeSingle.instance.getID();
//var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; //var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
@ -826,7 +828,19 @@ public class BaseServices<TEntity, TEntityDto, TInsertDto, TEditDto> : IBaseServ
// Directory.CreateDirectory(physicsPath + path); // Directory.CreateDirectory(physicsPath + path);
return ServiceResult<string>.OprateSuccess("导入成功!"); return ServiceResult<ExcelData>.OprateSuccess("导入成功!");
}
public async virtual Task<ServiceResult<string>> 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<string>.OprateSuccess(fileName, physicsPath + path + fileName);
return result;
} }
public async Task<List<TResult>> QueryMuch<T, T2, T3, TResult>(Expression<Func<T, T2, T3, object[]>> joinExpression, Expression<Func<T, T2, T3, TResult>> selectExpression, Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new() public async Task<List<TResult>> QueryMuch<T, T2, T3, TResult>(Expression<Func<T, T2, T3, object[]>> joinExpression, Expression<Func<T, T2, T3, TResult>> selectExpression, Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new()

@ -424,10 +424,13 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
CardConfig.cardImage = "CoverUrl"; CardConfig.cardImage = "CoverUrl";
CardConfig.column1 = "AfterHowLongLabel"; CardConfig.column1 = "AfterHowLongLabel";
CardConfig.column1Icon = "ghr-form-designer-deteSelect"; CardConfig.column1Icon = "ghr-form-designer-deteSelect";
CardConfig.column1Label = "考试时间";
CardConfig.column2 = "ExamPaperName"; CardConfig.column2 = "ExamPaperName";
CardConfig.column2Icon = "ghr-exam-paper"; CardConfig.column2Icon = "ghr-exam-paper";
CardConfig.column2Label = "试卷";
CardConfig.column3 = "ExamModeLabel"; CardConfig.column3 = "ExamModeLabel";
CardConfig.column3Icon = "ghr-online-exam"; CardConfig.column3Icon = "ghr-online-exam";
CardConfig.column3Label = "考试形式";
//CardConfig.column4 = "OpenClassName"; //CardConfig.column4 = "OpenClassName";
//CardConfig.column4Icon = "ghr-link-openClass"; //CardConfig.column4Icon = "ghr-link-openClass";
CardConfig.column4 = ""; CardConfig.column4 = "";
@ -994,7 +997,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
if (pageData.AfterHowLong == 0) if (pageData.AfterHowLong == 0)
pageData.AfterHowLong = pageData.AfterHowLong1; pageData.AfterHowLong = pageData.AfterHowLong1;
var course = await Db.Queryable<Ghre_ExamPaper>().Where(it => it.Id == pageData.ExamPaperId).FirstAsync(); var course = await Db.Queryable<Ghre_Course>().Where(it => it.Id == pageData.CourseId).FirstAsync();
pageData.CoverUrl = course?.CoverUrl; pageData.CoverUrl = course?.CoverUrl;
if (string.IsNullOrWhiteSpace(pageData.ExamNo)) if (string.IsNullOrWhiteSpace(pageData.ExamNo))
@ -1007,7 +1010,6 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
var insert = Mapper.Map(pageData).ToANew<InsertGhre_ExamInput>(); var insert = Mapper.Map(pageData).ToANew<InsertGhre_ExamInput>();
id = await base.Add(insert); id = await base.Add(insert);
var insertStaffs = pageData.staffTableData.Select(x => new InsertGhre_ExamStaffInput() var insertStaffs = pageData.staffTableData.Select(x => new InsertGhre_ExamStaffInput()
{ {
ExamId = id, ExamId = id,

@ -784,8 +784,9 @@ public class Ghre_QuestionServices : BaseServices<Ghre_Question, Ghre_QuestionDt
} }
#region Excel导入 #region Excel导入
public override async Task<ServiceResult<string>> ImportExcel(IFormFile file) public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file)
{ {
var data = new ExcelData();
long id = SnowFlakeSingle.instance.getID(); long id = SnowFlakeSingle.instance.getID();
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}import{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}"; var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}import{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}";
@ -941,13 +942,14 @@ public class Ghre_QuestionServices : BaseServices<Ghre_Question, Ghre_QuestionDt
} }
if (comments.Any()) if (comments.Any())
{ {
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a)); dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true; isExistError = true;
continue; continue;
} }
else else
{ {
data.SuccessCount++;
var id = await base.Add(insert); var id = await base.Add(insert);
insertAnswers.ForEach(x => x.QuestionId = id); insertAnswers.ForEach(x => x.QuestionId = id);
await _ghre_QuestionAnswerServices.Add(insertAnswers); await _ghre_QuestionAnswerServices.Add(insertAnswers);
@ -964,13 +966,16 @@ public class Ghre_QuestionServices : BaseServices<Ghre_Question, Ghre_QuestionDt
if (isExistError) if (isExistError)
{
NPOIHelper.ExportExcel(dt, null, x, physicsPath + errorFileName); NPOIHelper.ExportExcel(dt, null, x, physicsPath + errorFileName);
data.filePath = errorFileName;
}
}); });
if (isExistError) if (isExistError)
return ServiceResult<string>.OprateFailed("导入文件存在错误,请下载后查看!", errorFileName); return ServiceResult<ExcelData>.OprateFailed("导入文件存在错误,请下载后查看!", data);
else else
return ServiceResult<string>.OprateSuccess("导入成功!"); return ServiceResult<ExcelData>.OprateSuccess("导入成功!");
} }
#endregion #endregion
} }
Loading…
Cancel
Save