diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/TransferNotes/TransferNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/TransferNotes/TransferNoteAppService.cs index d1d5c3dd4..5bf6599ae 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/TransferNotes/TransferNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/TransferNotes/TransferNoteAppService.cs @@ -15,6 +15,7 @@ using Win_in.Sfs.Wms.Inventory.Application.Contracts; 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.SplitPackings; namespace Win_in.Sfs.Wms.Store.Application; @@ -31,16 +32,19 @@ public class TransferNoteAppService : SfsStoreWithDetailsAppServiceBase private readonly ITransferNoteManager _transferNoteManager; private readonly IBalanceAppService _balanceAppService; private readonly ILocationAppService _locationAppService; + private readonly ISplitPackingRecManager _splitPackingRecManager; public TransferNoteAppService( ITransferNoteRepository repository, ITransferNoteManager transferNoteManager, IBalanceAppService balanceAppService, - ILocationAppService locationAppService) : base(repository) + ILocationAppService locationAppService, + ISplitPackingRecManager splitPackingRecManager) : base(repository) { _transferNoteManager = transferNoteManager; _balanceAppService = balanceAppService; _locationAppService = locationAppService; + _splitPackingRecManager = splitPackingRecManager; } #region 东阳使用 @@ -121,6 +125,48 @@ public class TransferNoteAppService : SfsStoreWithDetailsAppServiceBase [HttpPost("split-packing")] public async Task SplitPackingAsync(TransferNoteEditInput transferNoteEditInput) { + foreach (var inputDetail in transferNoteEditInput.Details) + { + //插入拆箱记录表 + List recLst = new List(); + SplitPackingRec fromRec = new SplitPackingRec(); + fromRec.OprType = Domain.Shared.SplitPackings.OprTypeEnum.SplitBox; + //fromRec.GroupCode = ; + //fromRec.OprLevel = ; + fromRec.NodeType = Domain.Shared.SplitPackings.NodeTypeEnum.FromBox; + //fromRec.ParentId = ; + fromRec.PackingCode = inputDetail.FromPackingCode; + //fromRec.RootPackingCode = ; + fromRec.ItemCode = inputDetail.ItemCode; + fromRec.ItemName = inputDetail.ItemName; + fromRec.ItemDesc1 = inputDetail.ItemDesc1; + fromRec.ItemDesc2 = inputDetail.ItemDesc2; + fromRec.Lot = inputDetail.FromLot; + fromRec.StdPackQty = inputDetail.StdPackQty; + fromRec.Uom = inputDetail.Uom; + fromRec.Qty = inputDetail.Qty; + recLst.Add(fromRec); + + SplitPackingRec toRec = new SplitPackingRec(); + toRec.OprType = Domain.Shared.SplitPackings.OprTypeEnum.SplitBox; + //toRec.GroupCode = ; + //toRec.OprLevel = ; + toRec.NodeType = Domain.Shared.SplitPackings.NodeTypeEnum.ToBox; + //toRec.ParentId = ; + toRec.PackingCode = inputDetail.ToPackingCode; + //toRec.RootPackingCode = ; + toRec.ItemCode = inputDetail.ItemCode; + toRec.ItemName = inputDetail.ItemName; + toRec.ItemDesc1 = inputDetail.ItemDesc1; + toRec.ItemDesc2 = inputDetail.ItemDesc2; + toRec.Lot = inputDetail.ToLot; + toRec.StdPackQty = inputDetail.StdPackQty; + toRec.Uom = inputDetail.Uom; + toRec.Qty = inputDetail.Qty; + recLst.Add(toRec); + await _splitPackingRecManager.DoSplitPacking(recLst).ConfigureAwait(false); + } + transferNoteEditInput.Type = EnumTransSubType.Transfer_SplitPacking.ToString(); return await CreateAsync(transferNoteEditInput).ConfigureAwait(false); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/SplitPackings/NodeTypeEnum.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/SplitPackings/NodeTypeEnum.cs new file mode 100644 index 000000000..487dccc08 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/SplitPackings/NodeTypeEnum.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Win_in.Sfs.Wms.Store.Domain.Shared.SplitPackings; +public enum NodeTypeEnum +{ + ToBox = 1, + + FromBox = 2 +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/SplitPackings/OprTypeEnum.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/SplitPackings/OprTypeEnum.cs new file mode 100644 index 000000000..39871764d --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/SplitPackings/OprTypeEnum.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Win_in.Sfs.Wms.Store.Domain.Shared.SplitPackings; +public enum OprTypeEnum +{ + /// + /// 拆箱 + /// + SplitBox = 1, + + /// + /// 合箱 + /// + MergeBox = 2 +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Win_in.Sfs.Wms.Store.Domain.Shared.csproj b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Win_in.Sfs.Wms.Store.Domain.Shared.csproj index 27404e1b6..2e780ff7b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Win_in.Sfs.Wms.Store.Domain.Shared.csproj +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain.Shared/Win_in.Sfs.Wms.Store.Domain.Shared.csproj @@ -1,4 +1,4 @@ - + diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/ISplitPackingRecManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/ISplitPackingRecManager.cs new file mode 100644 index 000000000..0e2b1db47 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/ISplitPackingRecManager.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; +using Win_in.Sfs.Wms.Store.Domain; + +namespace Win_in.Sfs.Wms.Store.SplitPackings; +public interface ISplitPackingRecManager : IDomainService +{ + Task DoSplitPacking(List input); +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/ISplitPackingRecRepository.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/ISplitPackingRecRepository.cs new file mode 100644 index 000000000..692edb977 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/ISplitPackingRecRepository.cs @@ -0,0 +1,9 @@ +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Wms.Store.Domain; + +public interface ISplitPackingRecRepository : ISfsStoreRepositoryBase +{ +} + + diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/SplitPackingRec.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/SplitPackingRec.cs new file mode 100644 index 000000000..1faed30aa --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/SplitPackingRec.cs @@ -0,0 +1,76 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Wms.Store.Domain.Shared.SplitPackings; + +namespace Win_in.Sfs.Wms.Store.Domain; + +/// +/// 采购标签 +/// +public class SplitPackingRec : SfsAggregateRootBase + , IHasItem + , IHasQty + , IHasStdPack +{ + /// + /// 操作类型 + /// + public OprTypeEnum OprType { get; set; } + + /// + /// + /// + public string GroupCode { get; set; } + + /// + /// + /// + public long OprLevel { get; set; } + + /// + /// + /// + public NodeTypeEnum NodeType { get; set; } + + public Guid? ParentId { get; set; } + + public string PackingCode { get; set; } + + public string RootPackingCode { get; set; } + + //public string FullBarcodeString { get; set; } + + public string ItemCode { get; set; } + + public string ItemName { get; set; } + + public string ItemDesc1 { get; set; } + + public string ItemDesc2 { get; set; } + + public string Lot { get; set; } + + /// + /// 标包数量 + /// + [Display(Name = "标包数量")] + [Column(TypeName = "decimal(18,6)")] + public decimal StdPackQty { get; set; } + + /// + /// 计量单位 + /// + [Display(Name = "计量单位")] + [MaxLength(SfsPropertyConst.CodeLength)] + public string Uom { get; set; } + + /// + /// 数量 + /// + [Display(Name = "数量")] + [Column(TypeName = "decimal(18,6)")] + public decimal Qty { get; set; } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/SplitPackingRecManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/SplitPackingRecManager.cs new file mode 100644 index 000000000..f2589e7a9 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/SplitPackings/SplitPackingRecManager.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Services; +using Win_in.Sfs.Wms.Store.Domain; + +namespace Win_in.Sfs.Wms.Store.SplitPackings; +public class SplitPackingRecManager : DomainService, ISplitPackingRecManager +{ + private readonly ISplitPackingRecRepository _repository; + + public SplitPackingRecManager(ISplitPackingRecRepository repository) + { + _repository = repository; + } + + public async Task DoSplitPacking(List input) + { + string groupCode = Guid.NewGuid().ToString(); + long maxOprLevel; + Guid? parentId; + string rootPackingCode; + SplitPackingRec fromRec = input.First(itm => itm.NodeType == Domain.Shared.SplitPackings.NodeTypeEnum.FromBox); + var query = await _repository.GetQueryableAsync().ConfigureAwait(false); + var hasData = await query.AnyAsync(itm => itm.PackingCode == fromRec.PackingCode).ConfigureAwait(false); + if (hasData) + { + maxOprLevel = await query.Where(itm => itm.PackingCode == fromRec.PackingCode).MaxAsync(itm => itm.OprLevel).ConfigureAwait(false); + SplitPackingRec lastRec = await query.FirstAsync(itm => itm.PackingCode == fromRec.PackingCode && itm.OprLevel == maxOprLevel).ConfigureAwait(false); + parentId = lastRec.Id; + rootPackingCode = lastRec.RootPackingCode; + } + else + { + maxOprLevel = 1; + parentId = null; + rootPackingCode = fromRec.PackingCode; + } + + foreach (SplitPackingRec item in input) + { + item.GroupCode = groupCode; + item.OprLevel = maxOprLevel + 1; + item.ParentId = parentId; + item.RootPackingCode = rootPackingCode; + } + await _repository.InsertManyAsync(input).ConfigureAwait(false); + return true; + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Win_in.Sfs.Wms.Store.Domain.csproj b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Win_in.Sfs.Wms.Store.Domain.csproj index 90a600d5c..e2ffaaf0a 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Win_in.Sfs.Wms.Store.Domain.csproj +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Win_in.Sfs.Wms.Store.Domain.csproj @@ -1,4 +1,4 @@ - + diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs index c99a156c0..f959ddec9 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs @@ -106,4 +106,6 @@ public interface IStoreDbContext : IEfCoreDbContext public DbSet ExchangeDatas { get; } + public DbSet SplitPackingRecs { get; } + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/SplitPackings/SplitPackingRecDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/SplitPackings/SplitPackingRecDbContextModelCreatingExtensions.cs new file mode 100644 index 000000000..a76333703 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/SplitPackings/SplitPackingRecDbContextModelCreatingExtensions.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Modeling; +using Win_in.Sfs.Label.Domain; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.EntityFrameworkCore; +using Win_in.Sfs.Wms.Store.Domain; + +namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; + +public static class SplitPackingRecDbContextModelCreatingExtensions +{ + public static void ConfigureSplitPackingRec(this ModelBuilder builder, StoreModelBuilderConfigurationOptions options) + { + builder.Entity(b => + { + //Configure table & schema name + b.ToTable(options.TablePrefix + nameof(SplitPackingRec), options.Schema); + //Configure ABP properties + b.ConfigureByConvention(); + //Configure Sfs base properties + b.ConfigureSfsBase(); + + //Properties + b.Property(q => q.OprType).IsRequired(); + b.Property(q => q.GroupCode).IsRequired().HasMaxLength(36); + b.Property(q => q.OprLevel).IsRequired(); + b.Property(q => q.NodeType).IsRequired(); + //b.Property(q => q.ParentId) + b.Property(q => q.PackingCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.RootPackingCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.ItemCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.ItemName).IsRequired().HasMaxLength(SfsPropertyConst.NameLength); + b.Property(q => q.ItemDesc1).IsRequired().HasMaxLength(SfsPropertyConst.DescLength); + b.Property(q => q.ItemDesc2).IsRequired().HasMaxLength(SfsPropertyConst.DescLength); + b.Property(q => q.Lot).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.StdPackQty).HasPrecision(18, 4); + b.Property(q => q.Uom).HasMaxLength(50); + b.Property(q => q.Qty).IsRequired().HasPrecision(18,4); + //Indexes + b.HasIndex(q => new { PackingCode = q.PackingCode }); + b.HasIndex(q => new { PackingCode = q.PackingCode, OprLevel = q.OprLevel }); + + }); + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/SplitPackings/SplitPackingRecEfCoreRepository.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/SplitPackings/SplitPackingRecEfCoreRepository.cs new file mode 100644 index 000000000..672a8bdc2 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/SplitPackings/SplitPackingRecEfCoreRepository.cs @@ -0,0 +1,12 @@ +using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Label.Domain; +using Win_in.Sfs.Wms.Store.Domain; + +namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; + +public class SplitPackingRecEfCoreRepository : SfsStoreEfCoreRepositoryBase, ISplitPackingRecRepository +{ + public SplitPackingRecEfCoreRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContext.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContext.cs index 9a5dbfa35..b4973c9d4 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContext.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContext.cs @@ -105,6 +105,8 @@ public class StoreDbContext : AbpDbContext, IStoreDbContext public DbSet ExchangeDatas { get; set; } + public DbSet SplitPackingRecs { get; set; } + public StoreDbContext(DbContextOptions options) : base(options) { diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContextModelCreatingExtensions.cs index 38813f279..06cd36742 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContextModelCreatingExtensions.cs @@ -123,6 +123,9 @@ public static class StoreDbContextModelCreatingExtensions //设置decimal的默认小数位数 builder.ConfigurePrecisionOfDecimal(); + builder.ConfigureSplitPackingRec(options); + + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreEntityFrameworkCoreModule.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreEntityFrameworkCoreModule.cs index d51a8a347..707970ed4 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreEntityFrameworkCoreModule.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreEntityFrameworkCoreModule.cs @@ -124,6 +124,8 @@ public class StoreEntityFrameworkCoreModule : AbpModule #endregion context.Services.AddTransient(); + context.Services.AddTransient(); + } private void ConfigureEntity() diff --git a/be/Modules/Store/src/src.rar b/be/Modules/Store/src/src.rar new file mode 100644 index 000000000..b17461426 Binary files /dev/null and b/be/Modules/Store/src/src.rar differ