wanggang 1 year ago
parent
commit
797a8b021e
  1. 2
      code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/vmi.js
  2. 108
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs
  3. 4
      code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiBalanceBase.cs
  4. 19
      code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiLog.cs

2
code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/vmi.js

@ -7,7 +7,7 @@ function useSchema() {
type: "object", type: "object",
properties: { properties: {
realPartCode: { realPartCode: {
title: "LU零件号", title: "厂内零件号",
type: "string", type: "string",
rules: [ rules: [
{ {

108
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(); using var ms = new MemoryStream();
await files.FirstOrDefault().OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); await files.FirstOrDefault().OpenReadStream().CopyToAsync(ms).ConfigureAwait(false);
return this.ImportInternal<PUB_ADJ_DETAIL_IMP_DTO>(ms.ToArray()); return this.ImportInternal<PUB_ADJ_DETAIL_IMP_DTO>(ms.ToArray(), out var validationResults);
} }
/// <summary> /// <summary>
@ -279,7 +279,7 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran
{ {
query = query.Where(input.Filters.ToLambda<VmiLog>()); query = query.Where(input.Filters.ToLambda<VmiLog>());
} }
if(input.LogTypes.Count > 0) if (input.LogTypes.Count > 0)
{ {
query = query.Where(o => input.LogTypes.Contains(o.LogType)); query = query.Where(o => input.LogTypes.Contains(o.LogType));
} }
@ -367,45 +367,88 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran
/// </summary> /// </summary>
/// <param name="files"></param> /// <param name="files"></param>
[HttpPost] [HttpPost]
public async Task Import(List<IFormFile> files) public async Task<IActionResult> Import(List<IFormFile> files)
{ {
using var ms = new MemoryStream(); try
await files.FirstOrDefault().OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); {
var list = this.ImportInternal<VmiLog>(ms.ToArray()); using var ms = new MemoryStream();
foreach (var file in list) var file = files.FirstOrDefault();
await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false);
var data = ms.ToArray();
var list = this.ImportInternal<VmiLog>(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<T> ImportInternal<T>(byte[] data) private List<T> ImportInternal<T>(byte[] data, out List<List<ValidationResult>> validationResults)
{ {
var list = new List<T>(); var list = new List<T>();
using var workbook = new XLWorkbook(new MemoryStream(data)); validationResults = new List<List<ValidationResult>>();
var properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty) try
.Where(o => o.GetAttributes<ImporterHeaderAttribute>().Any())
.ToDictionary(o => o.GetAttribute<ImporterHeaderAttribute>().Name, o => o);
var ws = workbook.Worksheets.FirstOrDefault();
for (int rowIndex = 2; rowIndex <= ws.RowsUsed().Count(); rowIndex++)
{ {
var row = ws.Row(rowIndex); using var workbook = new XLWorkbook(new MemoryStream(data));
var model = Activator.CreateInstance<T>(); var properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty)
list.Add(model); .Where(o => o.GetAttributes<ImporterHeaderAttribute>().Any())
for (var columnIndex = 1; columnIndex < ws.ColumnsUsed().Count(); columnIndex++) .ToDictionary(o => o.GetAttribute<ImporterHeaderAttribute>().Name, o => o);
var ws = workbook.Worksheets.FirstOrDefault();
for (int rowIndex = 2; rowIndex <= ws.RowsUsed().Count(); rowIndex++)
{ {
var cell = row.Cell(columnIndex); var row = ws.Row(rowIndex);
var headerName = ws.Cell(1, columnIndex).Value.ToString().Trim(); var model = Activator.CreateInstance<T>();
if (properties.TryGetValue(headerName, out var property)) for (var columnIndex = 1; columnIndex < ws.ColumnsUsed().Count(); columnIndex++)
{ {
var value = cell.Value.ToString(); var cell = row.Cell(columnIndex);
if (!string.IsNullOrEmpty(value)) 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<ValidationResult>();
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<TExport>(List<TExport> entities, string name = "sheet1") private byte[] GetContent<TExport>(List<TExport> entities, string name = "sheet1")
@ -435,6 +478,15 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran
SetCell(item, cell, property); 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.TopBorder =
ws.RangeUsed().Style.Border.RightBorder = ws.RangeUsed().Style.Border.RightBorder =
ws.RangeUsed().Style.Border.BottomBorder = ws.RangeUsed().Style.Border.BottomBorder =
@ -446,10 +498,6 @@ public class VmiAppService : Controller, IApplicationService, IJobService, ITran
ws.RangeUsed().SetAutoFilter(); ws.RangeUsed().SetAutoFilter();
ws.ColumnsUsed().AdjustToContents(); ws.ColumnsUsed().AdjustToContents();
ws.RowsUsed().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>(TExportModel? model, IXLCell cell, PropertyInfo property) private static void SetCell<TExportModel>(TExportModel? model, IXLCell cell, PropertyInfo property)

4
code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiBalanceBase.cs

@ -13,7 +13,7 @@ public abstract class VmiBalanceBase : Entity<Guid>
public VmiBalanceBase(Guid id) : base(id) public VmiBalanceBase(Guid id) : base(id)
{ {
} }
[Display(Name = "LU零件号", Order = 6)] [Display(Name = "厂内零件号", Order = 6)]
public string RealPartCode { get; set; }//原始 public string RealPartCode { get; set; }//原始
[Display(Name = "客户零件号", Order = 7)] [Display(Name = "客户零件号", Order = 7)]
@ -70,7 +70,7 @@ public abstract class VmiBalanceBase : Entity<Guid>
[Display(Name = "结算生产码", Order = 24)] [Display(Name = "结算生产码", Order = 24)]
public string SettlementVinCode { get; set; } public string SettlementVinCode { get; set; }
[Display(Name = "结算生产码", Order = 25)] [Display(Name = "结算厂内生产码", Order = 25)]
public string SettlementPartCode { get; set; } public string SettlementPartCode { get; set; }
[Display(Name = "是否补货", Order = 26)] [Display(Name = "是否补货", Order = 26)]

19
code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Vmi/VmiLog.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Win.Sfs.SettleAccount.Entities.BQ.Vmi; namespace Win.Sfs.SettleAccount.Entities.BQ.Vmi;
@ -6,7 +7,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Vmi;
/// <summary> /// <summary>
/// 库存事务 /// 库存事务
/// </summary> /// </summary>
public class VmiLog : VmiBalanceBase public class VmiLog : VmiBalanceBase,IValidatableObject
{ {
public VmiLog() public VmiLog()
{ {
@ -23,6 +24,22 @@ public class VmiLog : VmiBalanceBase
this.Id = id; this.Id = id;
} }
public IEnumerable<ValidationResult> 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)] [Display(Name = "库存事务分类", Order = 0)]
public VmiLogType LogType { get; set; } public VmiLogType LogType { get; set; }

Loading…
Cancel
Save