diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Application.Contracts/ExportAndImport/ImportDetailAttribute.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Application.Contracts/ExportAndImport/ImportDetailAttribute.cs new file mode 100644 index 000000000..9d862ca2e --- /dev/null +++ b/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; + +/// +/// 导入模板是否是 详情 中的属性 +/// +[AttributeUsage(AttributeTargets.Property)] +public class ImportDetailAttribute:Attribute +{ + public bool IsDetail { get; set; } = true; +} diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/ExportAndImport/ClosedXmlExportImportService.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/ExportAndImport/ClosedXmlExportImportService.cs index 0b3a14df9..c5e494509 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/ExportAndImport/ClosedXmlExportImportService.cs +++ b/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().Any()); } - // + var stream = new MemoryStream(); workbook.SaveAs(stream); stream.Seek(0, SeekOrigin.Begin); @@ -161,7 +161,7 @@ public class ClosedXmlExportImportService : IExportImportService .FirstOrDefault(); property.SetValue(model, enumValue); } - else if(propertyType.Name== typeof(bool).Name) + else if(propertyType.Name== nameof(Boolean)) { if (value.GetText() == "是") { diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs index b58cd415a..b3a1cac93 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs @@ -5,9 +5,11 @@ using System.IO; using System.Linq; using System.Linq.Dynamic.Core; using System.Linq.Expressions; +using System.Reflection; using System.Text.Json; using System.Threading; using System.Threading.Tasks; +using AutoMapper.Internal; using DocumentFormat.OpenXml.Math; using DocumentFormat.OpenXml.Spreadsheet; using EFCore.BulkExtensions; @@ -332,7 +334,9 @@ public abstract class SfsCrudWithDetailsAppServiceBase(); 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)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(model); + var detail = ObjectMapper.Map(item); masterEntity.Details.Add(detail); if (detail is ISetId entityWithId) { diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs index 52b95495b..d259aa32a 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; 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.Shared; @@ -18,6 +19,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase /// 采购订单号 /// [Display(Name = "采购订单号")] + [Key] public string Number { get; set; } /// /// 供应商代码 @@ -84,12 +86,14 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase /// 明细-订单行 /// [Display(Name = "明细-订单行")] + [ImportDetail(IsDetail = true)] public string PoLine { get; set; } /// /// 明细-物品代码 /// [Display(Name = "明细-物品代码")] + [ImportDetail(IsDetail = true)] public string ItemCode { get; set; } /// @@ -97,18 +101,21 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase /// [Display(Name = "明细-数量")] [Required(ErrorMessage = "{0}是必填项")] + [ImportDetail(IsDetail = true)] public decimal Qty { get; set; } /// /// 数量计量单位 /// [Display(Name = "明细-数量计量单位")] + [ImportDetail(IsDetail = true)] public string Uom { get; set; } /// /// 明细-标准包装数量 /// [Display(Name = "明细-标准包装数量")] [Required(ErrorMessage = "{0}是必填项")] + [ImportDetail(IsDetail = true)] public decimal StdPackQty { get; set; } /// @@ -116,12 +123,14 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase /// [Display(Name = "明细-供应商包装数量")] [Required(ErrorMessage = "{0}是必填项")] + [ImportDetail(IsDetail = true)] public decimal SupplierPackQty { get; set; } /// /// 明细-供应商包装单位 /// [Display(Name = "明细-供应商包装单位")] + [ImportDetail(IsDetail = true)] public string SupplierPackUom { get; set; } /// @@ -129,6 +138,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase /// [Display(Name = "明细-转换率")] [Required(ErrorMessage = "{0}是必填项")] + [ImportDetail(IsDetail = true)] public decimal ConvertRate { get; set; } /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Plans/SupplierAsns/Inputs/SupplierAsnImportInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Plans/SupplierAsns/Inputs/SupplierAsnImportInput.cs index 9fbbace00..825d588c7 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Plans/SupplierAsns/Inputs/SupplierAsnImportInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Plans/SupplierAsns/Inputs/SupplierAsnImportInput.cs @@ -97,5 +97,5 @@ public class SupplierAsnImportInput : SfsStoreImportInputBase /// 订单备注 /// [Display(Name = "订单备注")] - public DateTime Remark { get; set; } + public string Remark { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/Project/FuWeiDongYang/FuWeiDongYang_PurchaseOrderAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/Project/FuWeiDongYang/FuWeiDongYang_PurchaseOrderAppService.cs index 0956485ba..e77181e18 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/Project/FuWeiDongYang/FuWeiDongYang_PurchaseOrderAppService.cs +++ b/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 Win_in.Sfs.Basedata.Application.Contracts; 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.Shared; +using Win_in.Sfs.Wms.Store.Project; 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) + { + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs index d55802158..e1adb4284 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs +++ b/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.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Volo.Abp; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts; @@ -21,7 +22,7 @@ namespace Win_in.Sfs.Wms.Store.Application; [Authorize] [Route($"{StoreConsts.RootPath}purchase-order")] -public abstract class PurchaseOrderAppService : +public class PurchaseOrderAppService : SfsStoreWithDetailsAppServiceBase, IPurchaseOrderAppService { @@ -115,6 +116,17 @@ public abstract class PurchaseOrderAppService : return ObjectMapper.Map, List>(entityList); } + /// + /// 用来重写 导入数据时可以加工数据 + /// + /// + /// + protected override Task> ImportProcessingEntityAsync(Dictionary dictionary) + { + return base.ImportProcessingEntityAsync(dictionary); + } + + #region Function [HttpPost("complete/{number}")] @@ -204,9 +216,4 @@ public abstract class PurchaseOrderAppService : return dtos; } - - protected override Task ImportInternalAsync(SfsImportRequestInput requestInput, byte[] inputFileBytes) - { - return base.ImportInternalAsync(requestInput, inputFileBytes); - } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAutoMapperProfile.cs index 3b137c8f6..33303b1c1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAutoMapperProfile.cs @@ -16,6 +16,10 @@ public partial class StoreApplicationAutoMapperProfile : Profile .IgnoreAuditedObjectProperties() .ReverseMap(); + CreateMap() + .IgnoreAuditedObjectProperties() + .ReverseMap(); + CreateMap() .IgnoreAuditedObjectProperties() .Ignore(x => x.ReceivedQty) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Project/ProjectStoreConsts.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Project/ProjectStoreConsts.cs new file mode 100644 index 000000000..754402918 --- /dev/null +++ b/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"; +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrder.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrder.cs index b696c92cf..4296d25cc 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrder.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrder.cs @@ -70,7 +70,7 @@ public class PurchaseOrder : SfsStoreAggregateRootBase /// /// 明细列表 /// - [IgnoreUpdate] + //[IgnoreUpdate] public override List Details { get; set; } = new List(); /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrderManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrderManager.cs index 5c8480da8..c87e0fc62 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrderManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Orders/PurchaseOrders/PurchaseOrderManager.cs @@ -50,9 +50,9 @@ public class PurchaseOrderManager : SfsStoreManagerBase CreateAsync(PurchaseOrder purchaseOrder) { //接收到新的采购订单时,更新无PO收货单的PoNumber - await _purchaseReceiptNoteManager.AppendPoNumberAsync(purchaseOrder).ConfigureAwait(false); + //await _purchaseReceiptNoteManager.AppendPoNumberAsync(purchaseOrder).ConfigureAwait(false); purchaseOrder.SetIdAndNumberWithDetails(GuidGenerator, purchaseOrder.Number); - await PublishCreatedAsync(purchaseOrder).ConfigureAwait(false); + //await PublishCreatedAsync(purchaseOrder).ConfigureAwait(false); //不要用base.create 要不会把number覆盖 return await Repository.InsertAsync(purchaseOrder).ConfigureAwait(false);