Browse Source

导入方法基类,修改3个

master
me 3 days ago
parent
commit
90f0f3a5ee
  1. 1
      API/Wood.Service/Commons/CommonService.cs
  2. 49
      API/Wood.Service/Commons/ValidationHelper.cs
  3. 67
      API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs
  4. 45
      API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs
  5. 46
      API/Wood.Service/Controllers/NormalBaseController.cs

1
API/Wood.Service/Commons/CommonService.cs

@ -62,4 +62,5 @@ namespace Wood.Service
}
}
}

49
API/Wood.Service/Commons/ValidationHelper.cs

@ -0,0 +1,49 @@
using Magicodes.ExporterAndImporter.Core;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.IdentityModel.Tokens;
using System.Reflection;
namespace Wood.Service
{
public static class ValidationHelper
{
public static List<string> ValidateDataLength<T>(IList<T> dataList, DbContext dbContext) where T : class
{
var errors = new List<string>();
var entityType = dbContext.Model.FindEntityType(typeof(T));
int rowNum = 1;
foreach (var data in dataList)
{
foreach (var property in entityType.GetProperties())
{
var maxLength = property.GetMaxLength();
if (maxLength > 0 && property.ClrType == typeof(string))
{
var value = property.PropertyInfo.GetValue(data) as string;
if (!string.IsNullOrEmpty(value) && value.Length > maxLength)
{
string title = property.GetImporterHeader();
errors.Add($"第{rowNum}行数据错误:字段 {(title.IsNullOrEmpty() ? property.Name : title)} 的长度超过限制 ({value.Length} > {maxLength})");
}
}
}
rowNum++;
}
return errors;
}
}
public static class PropertyExtension
{
public static string GetImporterHeader(this IProperty value)
{
string ret = value?.PropertyInfo?.GetCustomAttribute<ImporterHeaderAttribute>()?.Name;
return ret;
}
}
}

67
API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs

@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Omu.ValueInjecter;
using SkiaSharp;
using System.Data;
using System.Drawing.Printing;
using System.Linq.Expressions;
@ -19,6 +20,7 @@ using TaskManager.Contracts.Dtos;
using TaskManager.Entity;
using TaskManager.EntityFramework;
using TaskManager.EntityFramework.Repository;
using Wood.Service;
using Wood.Util;
using Wood.Util.Filters;
using static Dapper.SqlMapper;
@ -216,7 +218,6 @@ namespace TaskManager.Controllers
}
}
[HttpGet]
public async Task<ActionResult<IEnumerable<T>>> GetAll()
@ -363,11 +364,6 @@ namespace TaskManager.Controllers
return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
}
// [HttpGet]
// public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
//[FromQuery] int pageSize = 10,
@ -399,11 +395,7 @@ namespace TaskManager.Controllers
return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "_" + fileName };
}
[HttpGet]
public async Task<IActionResult> GetImportTemplate()
{
try
@ -441,43 +433,60 @@ namespace TaskManager.Controllers
return StatusCode(500, "生成导入模板时发生错误");
}
}
[HttpPost("Import")]
public async virtual Task<IActionResult> Import(IFormFile file)
{
if (file == null || file.Length <= 0)
{
return BadRequest("No file uploaded.");
return NotFound("No file uploaded.");
}
try
{
var excelImporter = HttpContext.RequestServices.GetRequiredService<IExcelImporter>();
var importResult = await excelImporter.Import<T>(file.OpenReadStream());
//if (importResult.HasError)
//{
// return BadRequest(importResult.ErrorMessage);
//}
if (importResult.HasError)
{
StringBuilder sb = new StringBuilder();
foreach (var rowErr in importResult.RowErrors)
{
string temp = string.Join(";", rowErr.FieldErrors.Select(itm => $"第{rowErr.RowIndex}行:{itm.Key}-{itm.Value}"));
sb.AppendLine(temp);
}
foreach (var templateErr in importResult.TemplateErrors)
{
string temp = $"列名:{templateErr.RequireColumnName},错误信息:{templateErr.Message}";
sb.AppendLine(temp);
}
throw new Exception(sb.ToString());
}
// 处理导入的数据
List<T> list = new List<T>();
foreach (var item in importResult.Data)
{
list.Add(item);
List<T> list = importResult.Data.ToList();
}
await ImportBefore(list);
// 校验数据长度
var validationErrors = ValidationHelper.ValidateDataLength(list, _jobDbContext);
if (validationErrors.Any())
{
throw new Exception("数据校验失败:" + string.Join(", ", validationErrors));
}
foreach (var item in list)
{
item.ReadState = true;
item.CreationTime = CommonHelper.CurrentTime;
}
await _jobDbContext.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 = "导入失败!" });
return new JsonResult(new { Code = 400, Message = "导入失败:" + ex.Message });
}
}
@ -500,17 +509,5 @@ namespace TaskManager.Controllers
{
}
}
}

45
API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs

@ -13,6 +13,7 @@ using Omu.ValueInjecter;
using System.Data;
using System.Data.Common;
using System.Linq.Expressions;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
@ -21,6 +22,7 @@ using TaskManager.Controllers;
using TaskManager.Entity;
using TaskManager.EntityFramework;
using TaskManager.EntityFramework.Repository;
using Wood.Service;
using Wood.Util;
using Wood.Util.Filters;
@ -610,42 +612,57 @@ namespace TaskManager.Controllers
{
if (file == null || file.Length <= 0)
{
return BadRequest("No file uploaded.");
return NotFound("No file uploaded.");
}
try
{
var excelImporter = HttpContext.RequestServices.GetRequiredService<IExcelImporter>();
var importResult = await excelImporter.Import<T>(file.OpenReadStream());
//if (importResult.HasError)
//{
// return BadRequest(importResult.ErrorMessage);
//}
if (importResult.HasError)
{
StringBuilder sb = new StringBuilder();
foreach (var rowErr in importResult.RowErrors)
{
string temp = string.Join(";", rowErr.FieldErrors.Select(itm => $"第{rowErr.RowIndex}行:{itm.Key}-{itm.Value}"));
sb.AppendLine(temp);
}
foreach (var templateErr in importResult.TemplateErrors)
{
string temp = $"列名:{templateErr.RequireColumnName},错误信息:{templateErr.Message}";
sb.AppendLine(temp);
}
throw new Exception(sb.ToString());
}
// 处理导入的数据
List<T> list = new List<T>();
foreach (var item in importResult.Data)
{
list.Add(item);
List<T> list = importResult.Data.ToList();
}
await ImportBefore(list);
// 校验数据长度
var validationErrors = ValidationHelper.ValidateDataLength(list, _jobDbContext);
if (validationErrors.Any())
{
throw new Exception("数据校验失败:" + string.Join(", ", validationErrors));
}
foreach (var item in list)
{
item.ReadState = true;
item.CreationTime = CommonHelper.CurrentTime;
}
await _jobDbContext.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 = "导入失败!" });
return new JsonResult(new { Code = 400, Message = "导入失败:" + ex.Message });
}
}
protected virtual async Task ImportBefore(List<T> p_list)
{

46
API/Wood.Service/Controllers/NormalBaseController.cs

@ -289,43 +289,57 @@ namespace Wood.Service.Controllers
{
if (file == null || file.Length <= 0)
{
return BadRequest("No file uploaded.");
return NotFound("No file uploaded.");
}
try
{
var excelImporter = HttpContext.RequestServices.GetRequiredService<IExcelImporter>();
var importResult = await excelImporter.Import<T>(file.OpenReadStream());
//if (importResult.HasError)
//{
// return BadRequest(importResult.ErrorMessage);
//}
if (importResult.HasError)
{
StringBuilder sb = new StringBuilder();
foreach (var rowErr in importResult.RowErrors)
{
string temp = string.Join(";", rowErr.FieldErrors.Select(itm => $"第{rowErr.RowIndex}行:{itm.Key}-{itm.Value}"));
sb.AppendLine(temp);
}
foreach (var templateErr in importResult.TemplateErrors)
{
string temp = $"列名:{templateErr.RequireColumnName},错误信息:{templateErr.Message}";
sb.AppendLine(temp);
}
throw new Exception(sb.ToString());
}
// 处理导入的数据
List<T> list = new List<T>();
foreach (var item in importResult.Data)
{
list.Add(item);
List<T> list = importResult.Data.ToList();
}
await ImportBefore(list);
// 校验数据长度
var validationErrors = ValidationHelper.ValidateDataLength(list, _context);
if (validationErrors.Any())
{
throw new Exception("数据校验失败:" + string.Join(", ", validationErrors));
}
foreach (var item in list)
{
item.ReadState = true;
item.CreationTime = CommonHelper.CurrentTime;
}
await _context.BulkInsertAsync(list);
await ImportAfter(list);
return new JsonResult(new { Code = 200, Message = "修改成功!" });
}
catch (Exception ex)
{
throw new Exception("NormalBaseController.Import报错:" + ex.Message);
// await _logger.AddError(ex.Message, TaskName);
return new JsonResult(new { Code = 400, Message = "导入失败!" });
//await _logger.AddError(ex.Message, TaskName);
return new JsonResult(new { Code = 400, Message = "导入失败:" + ex.Message });
}
}
protected virtual async Task ImportBefore(List<T> p_list)
{

Loading…
Cancel
Save