Browse Source

修改 主从表导入

集成Redis
郑渤旭[Irelia] 2 years ago
parent
commit
fbca1fc4f8
  1. 16
      be/Modules/Shared/src/Win_in.Sfs.Shared.Application.Contracts/ExportAndImport/ImportDetailAttribute.cs
  2. 4
      be/Modules/Shared/src/Win_in.Sfs.Shared.Application/ExportAndImport/ClosedXmlExportImportService.cs
  3. 29
      be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs
  4. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs
  5. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Plans/SupplierAsns/Inputs/SupplierAsnImportInput.cs
  6. 13
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/Project/FuWeiDongYang/FuWeiDongYang_PurchaseOrderAppService.cs
  7. 19
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs
  8. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAutoMapperProfile.cs
  9. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Project/ProjectStoreConsts.cs
  10. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrder.cs
  11. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrderManager.cs

16
be/Modules/Shared/src/Win_in.Sfs.Shared.Application.Contracts/ExportAndImport/ImportDetailAttribute.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Win_in.Sfs.Shared.Application.Contracts.ExportAndImport;
/// <summary>
/// 导入模板是否是 详情 中的属性
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class ImportDetailAttribute:Attribute
{
public bool IsDetail { get; set; } = true;
}

4
be/Modules/Shared/src/Win_in.Sfs.Shared.Application/ExportAndImport/ClosedXmlExportImportService.cs

@ -110,7 +110,7 @@ public class ClosedXmlExportImportService : IExportImportService
SetCellStyle(cell, 1, i + 1, true, property.GetCustomAttributes<RequiredAttribute>().Any()); SetCellStyle(cell, 1, i + 1, true, property.GetCustomAttributes<RequiredAttribute>().Any());
} }
//
var stream = new MemoryStream(); var stream = new MemoryStream();
workbook.SaveAs(stream); workbook.SaveAs(stream);
stream.Seek(0, SeekOrigin.Begin); stream.Seek(0, SeekOrigin.Begin);
@ -161,7 +161,7 @@ public class ClosedXmlExportImportService : IExportImportService
.FirstOrDefault(); .FirstOrDefault();
property.SetValue(model, enumValue); property.SetValue(model, enumValue);
} }
else if(propertyType.Name== typeof(bool).Name) else if(propertyType.Name== nameof(Boolean))
{ {
if (value.GetText() == "是") if (value.GetText() == "是")
{ {

29
be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs

@ -5,9 +5,11 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AutoMapper.Internal;
using DocumentFormat.OpenXml.Math; using DocumentFormat.OpenXml.Math;
using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml.Spreadsheet;
using EFCore.BulkExtensions; using EFCore.BulkExtensions;
@ -332,7 +334,9 @@ public abstract class SfsCrudWithDetailsAppServiceBase<TEntity, TEntityDto, TReq
HttpContextAccessor.HttpContext.Response.Headers.AccessControlExposeHeaders="X-Response"; HttpContextAccessor.HttpContext.Response.Headers.AccessControlExposeHeaders="X-Response";
HttpContextAccessor.HttpContext.Response.Headers.Add("X-Response", HttpContextAccessor.HttpContext.Response.Headers.Add("X-Response",
JsonSerializer.Serialize(new { result.ExceptionMessage, result.FileName, result.FileCode, result })); JsonSerializer.Serialize(new { result.ExceptionMessage, result.FileName, result.FileCode, result }));
Console.WriteLine(@"导入错误信息:"+result.ExceptionMessage);
var resultAction = new TestResult(bytes, ExportImportService.ContentType) { FileDownloadName = result.FileName }; var resultAction = new TestResult(bytes, ExportImportService.ContentType) { FileDownloadName = result.FileName };
resultAction.errorNum = result.ErrorNum; resultAction.errorNum = result.ErrorNum;
resultAction.successNum = resultAction.successNum; resultAction.successNum = resultAction.successNum;
@ -584,9 +588,28 @@ public abstract class SfsCrudWithDetailsAppServiceBase<TEntity, TEntityDto, TReq
{ {
var entityList = dict.Keys.ToList(); var entityList = dict.Keys.ToList();
var context = await _repository.GetDbContextAsync().ConfigureAwait(false); var context = await _repository.GetDbContextAsync().ConfigureAwait(false);
var list = new List<TDetail>();
if (entityList.Count > 0) if (entityList.Count > 0)
{ {
await context.BulkInsertOrUpdateAsync(entityList).ConfigureAwait(false); foreach (var entity in entityList)
{
foreach (var propertyInfo in entity.GetType().GetProperties())
{
if (propertyInfo.PropertyType.IsListType() && propertyInfo.Name == "Details")
{
var entityDetails= propertyInfo.GetValue(entity, null);
list.AddRange(((List<TDetail>)entityDetails)!);
}
}
}
var bulkConfig = new BulkConfig()
{
SetOutputIdentity = true,
PreserveInsertOrder = true
};
await context.BulkInsertOrUpdateAsync(entityList, bulkConfig).ConfigureAwait(false);
await context.BulkInsertAsync(list).ConfigureAwait(false);
} }
} }
@ -686,7 +709,7 @@ public abstract class SfsCrudWithDetailsAppServiceBase<TEntity, TEntityDto, TReq
{ {
foreach (var item in detailModels) foreach (var item in detailModels)
{ {
var detail = ObjectMapper.Map<TImportInput, TDetail>(model); var detail = ObjectMapper.Map<TImportInput, TDetail>(item);
masterEntity.Details.Add(detail); masterEntity.Details.Add(detail);
if (detail is ISetId entityWithId) if (detail is ISetId entityWithId)
{ {

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs

@ -1,6 +1,7 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts.ExportAndImport;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
@ -18,6 +19,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 采购订单号 /// 采购订单号
/// </summary> /// </summary>
[Display(Name = "采购订单号")] [Display(Name = "采购订单号")]
[Key]
public string Number { get; set; } public string Number { get; set; }
/// <summary> /// <summary>
/// 供应商代码 /// 供应商代码
@ -84,12 +86,14 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 明细-订单行 /// 明细-订单行
/// </summary> /// </summary>
[Display(Name = "明细-订单行")] [Display(Name = "明细-订单行")]
[ImportDetail(IsDetail = true)]
public string PoLine { get; set; } public string PoLine { get; set; }
/// <summary> /// <summary>
/// 明细-物品代码 /// 明细-物品代码
/// </summary> /// </summary>
[Display(Name = "明细-物品代码")] [Display(Name = "明细-物品代码")]
[ImportDetail(IsDetail = true)]
public string ItemCode { get; set; } public string ItemCode { get; set; }
/// <summary> /// <summary>
@ -97,18 +101,21 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// </summary> /// </summary>
[Display(Name = "明细-数量")] [Display(Name = "明细-数量")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
[ImportDetail(IsDetail = true)]
public decimal Qty { get; set; } public decimal Qty { get; set; }
/// <summary> /// <summary>
/// 数量计量单位 /// 数量计量单位
/// </summary> /// </summary>
[Display(Name = "明细-数量计量单位")] [Display(Name = "明细-数量计量单位")]
[ImportDetail(IsDetail = true)]
public string Uom { get; set; } public string Uom { get; set; }
/// <summary> /// <summary>
/// 明细-标准包装数量 /// 明细-标准包装数量
/// </summary> /// </summary>
[Display(Name = "明细-标准包装数量")] [Display(Name = "明细-标准包装数量")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
[ImportDetail(IsDetail = true)]
public decimal StdPackQty { get; set; } public decimal StdPackQty { get; set; }
/// <summary> /// <summary>
@ -116,12 +123,14 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// </summary> /// </summary>
[Display(Name = "明细-供应商包装数量")] [Display(Name = "明细-供应商包装数量")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
[ImportDetail(IsDetail = true)]
public decimal SupplierPackQty { get; set; } public decimal SupplierPackQty { get; set; }
/// <summary> /// <summary>
/// 明细-供应商包装单位 /// 明细-供应商包装单位
/// </summary> /// </summary>
[Display(Name = "明细-供应商包装单位")] [Display(Name = "明细-供应商包装单位")]
[ImportDetail(IsDetail = true)]
public string SupplierPackUom { get; set; } public string SupplierPackUom { get; set; }
/// <summary> /// <summary>
@ -129,6 +138,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// </summary> /// </summary>
[Display(Name = "明细-转换率")] [Display(Name = "明细-转换率")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
[ImportDetail(IsDetail = true)]
public decimal ConvertRate { get; set; } public decimal ConvertRate { get; set; }
/// <summary> /// <summary>

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Plans/SupplierAsns/Inputs/SupplierAsnImportInput.cs

@ -97,5 +97,5 @@ public class SupplierAsnImportInput : SfsStoreImportInputBase
/// 订单备注 /// 订单备注
/// </summary> /// </summary>
[Display(Name = "订单备注")] [Display(Name = "订单备注")]
public DateTime Remark { get; set; } public string Remark { get; set; }
} }

13
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/Project/FuWeiDongYang/FuWeiDongYang_PurchaseOrderAppService.cs

@ -7,14 +7,17 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application; using Win_in.Sfs.Wms.Store.Application;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Project;
namespace Win_in.Sfs.Wms.Store.Orders.PurchaseOrders.Project.FuWeiDongYang; namespace Win_in.Sfs.Wms.Store.Orders.PurchaseOrders.Project.FuWeiDongYang;
public class FuWeiDongYang_PurchaseOrderAppService [Route($"{ProjectStoreConsts.RootPath}purchase-order-fuweidongyang")]
public class FuWeiDongYang_PurchaseOrderAppService:PurchaseOrderAppService
{ {
//public FuWeiDongYang_PurchaseOrderAppService(IPurchaseOrderRepository repository, IPurchaseOrderManager purchaseOrderManager, ISupplierAppService supplierAppService) : base(repository, purchaseOrderManager, supplierAppService) public FuWeiDongYang_PurchaseOrderAppService(IPurchaseOrderRepository repository, IPurchaseOrderManager purchaseOrderManager, ISupplierAppService supplierAppService) : base(repository, purchaseOrderManager, supplierAppService)
//{ {
//}
}
} }

19
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp; using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
@ -21,7 +22,7 @@ namespace Win_in.Sfs.Wms.Store.Application;
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}purchase-order")] [Route($"{StoreConsts.RootPath}purchase-order")]
public abstract class PurchaseOrderAppService : public class PurchaseOrderAppService :
SfsStoreWithDetailsAppServiceBase<PurchaseOrder, PurchaseOrderDTO, SfsStoreRequestInputBase, PurchaseOrderEditInput, PurchaseOrderDetail, PurchaseOrderDetailDTO, SfsStoreRequestInputBase, PurchaseOrderImportInput>, SfsStoreWithDetailsAppServiceBase<PurchaseOrder, PurchaseOrderDTO, SfsStoreRequestInputBase, PurchaseOrderEditInput, PurchaseOrderDetail, PurchaseOrderDetailDTO, SfsStoreRequestInputBase, PurchaseOrderImportInput>,
IPurchaseOrderAppService IPurchaseOrderAppService
{ {
@ -115,6 +116,17 @@ public abstract class PurchaseOrderAppService :
return ObjectMapper.Map<List<PurchaseOrder>, List<PurchaseOrderDTO>>(entityList); return ObjectMapper.Map<List<PurchaseOrder>, List<PurchaseOrderDTO>>(entityList);
} }
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override Task<Dictionary<PurchaseOrder, EntityState>> ImportProcessingEntityAsync(Dictionary<PurchaseOrder, EntityState> dictionary)
{
return base.ImportProcessingEntityAsync(dictionary);
}
#region Function #region Function
[HttpPost("complete/{number}")] [HttpPost("complete/{number}")]
@ -204,9 +216,4 @@ public abstract class PurchaseOrderAppService :
return dtos; return dtos;
} }
protected override Task<SfsImportResult> ImportInternalAsync(SfsImportRequestInput requestInput, byte[] inputFileBytes)
{
return base.ImportInternalAsync(requestInput, inputFileBytes);
}
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAutoMapperProfile.cs

@ -16,6 +16,10 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.IgnoreAuditedObjectProperties() .IgnoreAuditedObjectProperties()
.ReverseMap(); .ReverseMap();
CreateMap<PurchaseOrderEditInput, PurchaseOrder>()
.IgnoreAuditedObjectProperties()
.ReverseMap();
CreateMap<PurchaseOrderDetailInput, PurchaseOrderDetail>() CreateMap<PurchaseOrderDetailInput, PurchaseOrderDetail>()
.IgnoreAuditedObjectProperties() .IgnoreAuditedObjectProperties()
.Ignore(x => x.ReceivedQty) .Ignore(x => x.ReceivedQty)

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Project/ProjectStoreConsts.cs

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Project;
public class ProjectStoreConsts
{
public const string RootPath = "api/wms/store/fuweidongyang/";
public const string CachePrefix = "Store";
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrder.cs

@ -70,7 +70,7 @@ public class PurchaseOrder : SfsStoreAggregateRootBase<PurchaseOrderDetail>
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
/// </summary> /// </summary>
[IgnoreUpdate] //[IgnoreUpdate]
public override List<PurchaseOrderDetail> Details { get; set; } = new List<PurchaseOrderDetail>(); public override List<PurchaseOrderDetail> Details { get; set; } = new List<PurchaseOrderDetail>();
/// <summary> /// <summary>

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrderManager.cs

@ -50,9 +50,9 @@ public class PurchaseOrderManager : SfsStoreManagerBase<PurchaseOrder, PurchaseO
public override async Task<PurchaseOrder> CreateAsync(PurchaseOrder purchaseOrder) public override async Task<PurchaseOrder> CreateAsync(PurchaseOrder purchaseOrder)
{ {
//接收到新的采购订单时,更新无PO收货单的PoNumber //接收到新的采购订单时,更新无PO收货单的PoNumber
await _purchaseReceiptNoteManager.AppendPoNumberAsync(purchaseOrder).ConfigureAwait(false); //await _purchaseReceiptNoteManager.AppendPoNumberAsync(purchaseOrder).ConfigureAwait(false);
purchaseOrder.SetIdAndNumberWithDetails(GuidGenerator, purchaseOrder.Number); purchaseOrder.SetIdAndNumberWithDetails(GuidGenerator, purchaseOrder.Number);
await PublishCreatedAsync(purchaseOrder).ConfigureAwait(false); //await PublishCreatedAsync(purchaseOrder).ConfigureAwait(false);
//不要用base.create 要不会把number覆盖 //不要用base.create 要不会把number覆盖
return await Repository.InsertAsync(purchaseOrder).ConfigureAwait(false); return await Repository.InsertAsync(purchaseOrder).ConfigureAwait(false);

Loading…
Cancel
Save