diff --git a/code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/vmi.js b/code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/vmi.js index 2904783d..63fb32ec 100644 --- a/code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/vmi.js +++ b/code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/vmi.js @@ -7,7 +7,7 @@ function useSchema() { type: "object", properties: { realPartCode: { - title: "LU零件号", + title: "厂内零件号", type: "string", rules: [ { diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs index ae05f3df..74ff0ede 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs @@ -82,7 +82,7 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran { using var ms = new MemoryStream(); await files.FirstOrDefault().OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); - return this.ImportInternal(ms.ToArray()); + return this.ImportInternal(ms.ToArray(), out var validationResults); } /// @@ -279,7 +279,7 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran { query = query.Where(input.Filters.ToLambda()); } - if(input.LogTypes.Count > 0) + if (input.LogTypes.Count > 0) { query = query.Where(o => input.LogTypes.Contains(o.LogType)); } @@ -367,45 +367,88 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran /// /// [HttpPost] - public async Task Import(List files) + public async Task Import(List files) { - using var ms = new MemoryStream(); - await files.FirstOrDefault().OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); - var list = this.ImportInternal(ms.ToArray()); - foreach (var file in list) + try + { + using var ms = new MemoryStream(); + var file = files.FirstOrDefault(); + await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); + var data = ms.ToArray(); + var list = this.ImportInternal(data, out var validationResults); + if (validationResults.Any(o => o.Count > 0)) + { + using var workbook = new XLWorkbook(new MemoryStream(data)); + var ws = workbook.Worksheets.FirstOrDefault(); + var header = ws.Row(1); + var errorIndex = ws.ColumnsUsed().Count(); + header.Cell(errorIndex).Value = "提示信息"; + for (int i = 2; i < ws.RowsUsed().Count(); i++) + { + ws.Row(2).Cell(errorIndex).Value = string.Join(',', validationResults[i - 2].Select(o => o.ErrorMessage)); + } + SetStyle(ws); + using var stream = new MemoryStream(); + workbook.SaveAs(stream); + stream.Seek(0, SeekOrigin.Begin); + var fileName = $"{file.Name}_错误信息.xlsx"; + await this._fileContainer.SaveAsync(fileName, stream, true).ConfigureAwait(false); + return new JsonResult(new { code = 400, message = "输入异常", fileName }); + } + foreach (var item in list) + { + Adjust(item); + } + return new JsonResult(new { code = 200, message = "ok" }); + } + catch (Exception ex) { - Adjust(file); + Console.WriteLine(ex.ToString()); + throw; } } - private List ImportInternal(byte[] data) + private List ImportInternal(byte[] data, out List> validationResults) { var list = new List(); - using var workbook = new XLWorkbook(new MemoryStream(data)); - var properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty) - .Where(o => o.GetAttributes().Any()) - .ToDictionary(o => o.GetAttribute().Name, o => o); - var ws = workbook.Worksheets.FirstOrDefault(); - for (int rowIndex = 2; rowIndex <= ws.RowsUsed().Count(); rowIndex++) + validationResults = new List>(); + try { - var row = ws.Row(rowIndex); - var model = Activator.CreateInstance(); - list.Add(model); - for (var columnIndex = 1; columnIndex < ws.ColumnsUsed().Count(); columnIndex++) + using var workbook = new XLWorkbook(new MemoryStream(data)); + var properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty) + .Where(o => o.GetAttributes().Any()) + .ToDictionary(o => o.GetAttribute().Name, o => o); + var ws = workbook.Worksheets.FirstOrDefault(); + + for (int rowIndex = 2; rowIndex <= ws.RowsUsed().Count(); rowIndex++) { - var cell = row.Cell(columnIndex); - var headerName = ws.Cell(1, columnIndex).Value.ToString().Trim(); - if (properties.TryGetValue(headerName, out var property)) + var row = ws.Row(rowIndex); + var model = Activator.CreateInstance(); + for (var columnIndex = 1; columnIndex < ws.ColumnsUsed().Count(); columnIndex++) { - var value = cell.Value.ToString(); - if (!string.IsNullOrEmpty(value)) + var cell = row.Cell(columnIndex); + var headerName = ws.Cell(1, columnIndex).Value.ToString().Trim(); + if (properties.TryGetValue(headerName, out var property)) { - property.SetValue(model, Convert.ChangeType(value, property.PropertyType)); + var value = cell.Value.ToString(); + if (!string.IsNullOrEmpty(value)) + { + property.SetValue(model, Convert.ChangeType(value, property.PropertyType)); + } } } + list.Add(model); + var results = new List(); + Validator.TryValidateObject(model, new ValidationContext(model, null, null), results); + validationResults.Add(results); } + return list; + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + throw; } - return list; } private byte[] GetContent(List entities, string name = "sheet1") @@ -435,6 +478,15 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran SetCell(item, cell, property); } } + SetStyle(ws); + using var stream = new MemoryStream(); + workbook.SaveAs(stream); + stream.Seek(0, SeekOrigin.Begin); + return stream.ToArray(); + } + + private static void SetStyle(IXLWorksheet ws) + { ws.RangeUsed().Style.Border.TopBorder = ws.RangeUsed().Style.Border.RightBorder = ws.RangeUsed().Style.Border.BottomBorder = @@ -446,10 +498,6 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran ws.RangeUsed().SetAutoFilter(); ws.ColumnsUsed().AdjustToContents(); ws.RowsUsed().AdjustToContents(); - using var stream = new MemoryStream(); - workbook.SaveAs(stream); - stream.Seek(0, SeekOrigin.Begin); - return stream.ToArray(); } private static void SetCell(TExportModel? model, IXLCell cell, PropertyInfo property) diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiBalanceBase.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiBalanceBase.cs index 13c51972..1697a2e9 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiBalanceBase.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiBalanceBase.cs @@ -13,7 +13,7 @@ public abstract class VmiBalanceBase : Entity public VmiBalanceBase(Guid id) : base(id) { } - [Display(Name = "LU零件号", Order = 6)] + [Display(Name = "厂内零件号", Order = 6)] public string RealPartCode { get; set; }//原始 [Display(Name = "客户零件号", Order = 7)] @@ -70,7 +70,7 @@ public abstract class VmiBalanceBase : Entity [Display(Name = "结算生产码", Order = 24)] public string SettlementVinCode { get; set; } - [Display(Name = "结算生产码", Order = 25)] + [Display(Name = "结算厂内生产码", Order = 25)] public string SettlementPartCode { get; set; } [Display(Name = "是否补货", Order = 26)] diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiLog.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiLog.cs index 87342c7e..ac5c6941 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiLog.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiLog.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace Win.Sfs.SettleAccount.Entities.BQ.Vmi; @@ -6,7 +7,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Vmi; /// /// 库存事务 /// -public class VmiLog : VmiBalanceBase +public class VmiLog : VmiBalanceBase,IValidatableObject { public VmiLog() { @@ -23,6 +24,22 @@ public class VmiLog : VmiBalanceBase this.Id = id; } + public IEnumerable Validate(ValidationContext validationContext) + { + if(string.IsNullOrEmpty(this.RealPartCode)) + { + yield return new ValidationResult("LU零件号不能为空",new string[] { nameof(this.RealPartCode)}); + } + if (string.IsNullOrEmpty(this.ErpToLoc)) + { + yield return new ValidationResult("ERP库位不能为空", new string[] { nameof(this.ErpToLoc) }); + } + if (string.IsNullOrEmpty(this.OrderNum)) + { + yield return new ValidationResult("客户客户订单号不能为空", new string[] { nameof(this.OrderNum) }); + } + } + [Display(Name = "库存事务分类", Order = 0)] public VmiLogType LogType { get; set; }