diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/Frozen.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/Frozen.cs new file mode 100644 index 000000000..9ae130400 --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/Frozen.cs @@ -0,0 +1,49 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Domain.Entities; + +namespace Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; +public class Frozen : Entity +{ + /// + /// 序号 + /// + [Key] + public string mesout_frozen_id { get; set; } + /// + /// 类型 + /// + public string mesout_frozen_type { get; set; } + /// + /// 物料 + /// + public string mesout_frozen_part { get; set; } + /// + /// 日期 + /// + public string mesout_frozen_date { get; set; } + /// + /// 来源库位 + /// + public string mesout_frozen_loc { get; set; } + /// + /// 冻结原因 + /// + public string mesout_frozen_reason { get; set; } + /// + /// 数量 + /// + public decimal mesout_frozen_num { get; set; } + /// + /// 冻结用户 + /// + public string mesout_frozen_user { get; set; } + /// + /// 是否读取(0,1) + /// + public long Yl1 { get; set; } + + public override object[] GetKeys() + { + return new object[] { mesout_frozen_id }; + } +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/FrozenManager.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/FrozenManager.cs new file mode 100644 index 000000000..e0f15b29c --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/FrozenManager.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; +public class FrozenManager : DomainService, IFrozenManager +{ + private readonly IFrozenRepository _repository; + + public FrozenManager(IFrozenRepository repository) + { + _repository = repository; + } + public virtual async Task> GetToBeProcessedListAsync() + { + var plans = await _repository.GetListAsync(p => p.Yl1 == 0).ConfigureAwait(false); + return plans; + + } + public virtual async Task UpdateProcesseErrordListAsync(List entities) + { + var ids = entities.Select(p => p.mesout_frozen_id); + var plans = await _repository.GetListAsync(p => ids.Contains(p.mesout_frozen_id)).ConfigureAwait(false); + plans.ForEach(p => + { + p.Yl1 = 2; + // p.WmsDate = Clock.Now; + }); + await _repository.UpdateManyAsync(plans).ConfigureAwait(false); + } + public virtual async Task UpdateProcessedListAsync(List entities) + { + var ids = entities.Select(p => p.mesout_frozen_id); + var plans = await _repository.GetListAsync(p => ids.Contains(p.mesout_frozen_id)).ConfigureAwait(false); + plans.ForEach(p => + { + p.Yl1 = 1; + + // p.WmsDate = Clock.Now; + }); + await _repository.UpdateManyAsync(plans).ConfigureAwait(false); + } +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/IFrozenManager.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/IFrozenManager.cs new file mode 100644 index 000000000..ce90eb038 --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/IFrozenManager.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; +public interface IFrozenManager +{ + Task> GetToBeProcessedListAsync(); + Task UpdateProcessedListAsync(List entities); + Task UpdateProcesseErrordListAsync(List entities); +} \ No newline at end of file diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/IFrozenRepository.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/IFrozenRepository.cs new file mode 100644 index 000000000..0cde2a7a6 --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes/Frozen/IFrozenRepository.cs @@ -0,0 +1,7 @@ +using Volo.Abp.Domain.Repositories; + +namespace Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; +public interface IFrozenRepository : IRepository +{ + +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeDbContextModelCreatingExtensions.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeDbContextModelCreatingExtensions.cs index d932677bf..8b8e53a60 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeDbContextModelCreatingExtensions.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeDbContextModelCreatingExtensions.cs @@ -28,5 +28,6 @@ public static class DataExchangeDbContextModelCreatingExtensions builder.ConfigurePck(options); builder.ConfigureBackflu(options); builder.ConfigureQtyrfe(options); + builder.ConfigureFrozen(options); } } diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeEntityFrameworkCoreFawtygModule.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeEntityFrameworkCoreFawtygModule.cs index c71c18adb..e1cf9d642 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeEntityFrameworkCoreFawtygModule.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/DataExchangeEntityFrameworkCoreFawtygModule.cs @@ -3,6 +3,7 @@ using Volo.Abp.BackgroundJobs.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.MySQL; using Volo.Abp.Modularity; +using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.MesOut; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.PullTask; @@ -34,5 +35,6 @@ public class DataExchangeEntityFrameworkCoreFawtygModule : AbpModule context.Services.AddTransient(); context.Services.AddTransient(); context.Services.AddTransient(); + context.Services.AddTransient(); } } diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/Frozen/FrozenDbContextModelCreatingExtensions.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/Frozen/FrozenDbContextModelCreatingExtensions.cs new file mode 100644 index 000000000..35103288d --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/Frozen/FrozenDbContextModelCreatingExtensions.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Modeling; +using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; + +namespace Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes; +public static class FrozenDbContextModelCreatingExtensions +{ + public static void ConfigureFrozen(this ModelBuilder builder, MesModelBuilderConfigurationOptions options) + { + builder.Entity(b => + { + //Configure table & schema Name + b.ToTable(options.TablePrefix + "mesout_frozen", options.Schema); + //Configure ABP properties + b.ConfigureByConvention(); + + //Properties + b.Property(q => q.mesout_frozen_id).HasMaxLength(20); + b.Property(q => q.mesout_frozen_type).HasMaxLength(1); + b.Property(q => q.mesout_frozen_part).HasMaxLength(20); + b.Property(q => q.mesout_frozen_date).HasMaxLength(20); + b.Property(q => q.mesout_frozen_loc).HasMaxLength(10); + b.Property(q => q.mesout_frozen_reason).HasMaxLength(500); + b.Property(q => q.mesout_frozen_num).HasPrecision(10, 2); + b.Property(q => q.mesout_frozen_user).HasMaxLength(20); + b.Property(q => q.Yl1); + }); + + } +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/Frozen/FrozenEfCoreRepository.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/Frozen/FrozenEfCoreRepository.cs new file mode 100644 index 000000000..e9dc87935 --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/Frozen/FrozenEfCoreRepository.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; + +namespace Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes; +public class FrozenEfCoreRepository : EfCoreRepository, IFrozenRepository +{ + public FrozenEfCoreRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/IMesDbContext.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/IMesDbContext.cs index 1859f7690..0e6ea26bb 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/IMesDbContext.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/IMesDbContext.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.MesOut; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.PullTask; @@ -23,4 +24,6 @@ public interface IMesDbContext : IEfCoreDbContext DbSet Backflu { get; } DbSet Qtyrfe { get; } + + DbSet Frozen { get; } } diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/MesDbContext.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/MesDbContext.cs index 104f8a1d3..cdead9f76 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/MesDbContext.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.EntityFrameworkCore.Fawtyg.Mes/MesDbContext.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Mes; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.MesOut; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.PullTask; @@ -25,6 +26,8 @@ public class MesDbContext : public virtual DbSet Qtyrfe { get; } + public virtual DbSet Frozen { get; } + public MesDbContext(DbContextOptions options) : base(options) { diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/FawtygAutoMapperProfile.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/FawtygAutoMapperProfile.cs index 7dc28eaa9..591ccdce7 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/FawtygAutoMapperProfile.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/FawtygAutoMapperProfile.cs @@ -4,6 +4,7 @@ using Win_in.Sfs.Shared.Application; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.WMS.BackFlushNote; using Win_in.Sfs.Wms.DataExchange.WMS.MaterialRequest; +using Win_in.Sfs.Wms.DataExchange.WMS.MesNote; using Win_in.Sfs.Wms.DataExchange.WMS.PCK; using Win_in.Sfs.Wms.DataExchange.WMS.ProductReceiptNote; using Win_in.Sfs.Wms.DataExchange.WMS.ScrapNote; @@ -219,5 +220,38 @@ public class FawtygAutoMapperProfile : Profile .Ignore(x => x.Uom) .Ignore(x => x.StdPackQty) ; + + CreateMap() + .Ignore(x => x.Details) + .Ignore(x => x.ExtraProperties) + .Ignore(x => x.JobNumber) + .Ignore(x => x.Details) + .Ignore(x => x.ExtraProperties); + ; + CreateMap() + .ForMember(x=>x.FromLocationCode,y=>y.MapFrom(t=>t.FromLocationErpCode)) + .ForMember(x => x.ToLocationCode, y => y.MapFrom(t => t.ToLocationErpCode)) + .Ignore(x => x.ItemName) + .Ignore(x => x.ItemDesc1) + .Ignore(x => x.ItemDesc2) + .Ignore(x => x.FromLocationArea) + .Ignore(x => x.FromLocationGroup) + .Ignore(x => x.FromContainerCode) + .Ignore(x => x.FromWarehouseCode) + .Ignore(x => x.FromLot) + .Ignore(x => x.FromPackingCode) + .Ignore(x => x.ToPackingCode) + .Ignore(x => x.ToContainerCode) + .Ignore(x => x.ToLocationArea) + .Ignore(x => x.ToLocationGroup) + .Ignore(x => x.ToWarehouseCode) + .Ignore(x => x.ToLot) + .Ignore(x => x.SupplierBatch) + .Ignore(x => x.ArriveDate) + .Ignore(x => x.ProduceDate) + .Ignore(x => x.ExpireDate) + .Ignore(x => x.Uom) + .Ignore(x => x.StdPackQty) + ; } } diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/FrozenConverter.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/FrozenConverter.cs new file mode 100644 index 000000000..378067647 --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/FrozenConverter.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Wms.DataExchange.Domain; +using Win_in.Sfs.Wms.DataExchange.WMS.MesNote; +using Win_in.Sfs.Wms.Store.Application.Contracts; +using Volo.Abp.ObjectMapping; +using Win_in.Sfs.Wms.DataExchange.WMS.MesNote; + +namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent.Incoming; + +public class FrozenConverter : IIncomingConverter +{ + private readonly IIncomingFromExternalManager _incomingFromExternalManager; + private readonly IIncomingToWmsManager _incomingToWmsManager; + private readonly IObjectMapper _objectMapper; + private readonly IItemBasicAppService _itemBasicAppService; + private readonly ILocationAppService _locationAppService; + private readonly ILogger _logger; + + public FrozenConverter( + IIncomingToWmsManager incomingToWmsManager + , IObjectMapper objectMapper + , IItemBasicAppService itemBasicAppService + , ILogger logger, + ILocationAppService locationAppService, + IIncomingFromExternalManager incomingFromExternalManager) + { + _incomingToWmsManager = incomingToWmsManager; + _objectMapper = objectMapper; + _itemBasicAppService = itemBasicAppService; + _logger = logger; + _locationAppService = locationAppService; + _incomingFromExternalManager = incomingFromExternalManager; + } + + public virtual async Task ConvertAsync(List incomingFromExternalList) + { + if (!incomingFromExternalList.Any()) + { + _logger.LogInformation("no Frozens"); + return; + } + + //按Number合并MesNote单据 + var transferNoteList = await BuildIncomingToWmsOfMesNoteAsync(incomingFromExternalList).ConfigureAwait(false); + await _incomingToWmsManager.CreateManyAsync(transferNoteList).ConfigureAwait(false); + //归档 + await _incomingFromExternalManager.ArchiveManyAsync(incomingFromExternalList).ConfigureAwait(false); + } + + private async Task> BuildIncomingToWmsOfMesNoteAsync(List incomingDataList) + { + var incomingToWmsList = new List(); + foreach (var incomingData in incomingDataList) + { + var incomingToWms = new IncomingToWms() + { + DataType = incomingData.DataType, + DataAction = incomingData.DataAction, + SourceSystem = incomingData.SourceSystem, + DataIdentityCode = incomingData.SourceDataGroupCode, + }; + incomingToWms.SetEffectiveDate(incomingData.EffectiveDate); + var exchangeMesNote = JsonSerializer.Deserialize(incomingData.DestinationDataContent); + var wmsMesNoteDetail = _objectMapper.Map(exchangeMesNote.Detail); + var wmsMesNote = _objectMapper.Map(exchangeMesNote); + wmsMesNote.Details = new List(); + var item = await _itemBasicAppService.GetByCodeAsync(wmsMesNoteDetail.ItemCode).ConfigureAwait(false); + try + { + wmsMesNoteDetail.FromPackingCode = ""; + wmsMesNoteDetail.ToPackingCode = ""; + wmsMesNoteDetail.FromLot = ""; + wmsMesNoteDetail.ToLot = ""; + wmsMesNoteDetail.FromWarehouseCode = ""; + wmsMesNoteDetail.ToWarehouseCode = ""; + //if (transferNote.Remark.Contains("质量补移库"))//质量补 + //{ + // wmsMesNoteDetail.FromPackingCode = "RFE"; //质量补排序批次 + // wmsMesNoteDetail.FromLot = "RFE";//质量补箱标签 + // wmsMesNoteDetail.ToPackingCode = "RFE"; //质量补排序批次 + // wmsMesNoteDetail.ToLot = "RFE";//质量补箱标签 + //} + if (item != null) + { + wmsMesNoteDetail.ItemName = item.Name; + wmsMesNoteDetail.ItemDesc1 = !string.IsNullOrEmpty(item.Desc1) ? item.Desc1 : ""; + wmsMesNoteDetail.ItemDesc2 = !string.IsNullOrEmpty(item.Desc2) ? item.Desc2 : ""; + wmsMesNoteDetail.Uom = !string.IsNullOrEmpty(item.BasicUom) ? item.BasicUom : ""; + wmsMesNoteDetail.StdPackQty = item.StdPackQty; + } + //if (tolocation != null) + //{ + // wmsMesNoteDetail.ToLocationCode = tolocation.Code; + // wmsMesNoteDetail.ToLocationArea = tolocation.AreaCode; + // wmsMesNoteDetail.ToLocationGroup = tolocation.LocationGroupCode; + // wmsMesNoteDetail.ToWarehouseCode = tolocation.WarehouseCode; + // if (tolocation.Type == EnumLocationType.CUST) + // { + // wmsMesNote.Type = EnumTransSubType.Mes_Customer.ToString();//客户储位调拨 + // } + //} + //if (fromlocation != null) + //{ + // wmsMesNoteDetail.FromLocationCode = fromlocation.Code; + // wmsMesNoteDetail.FromLocationArea = fromlocation.AreaCode; + // wmsMesNoteDetail.FromLocationGroup = fromlocation.LocationGroupCode; + // wmsMesNoteDetail.FromWarehouseCode = fromlocation.WarehouseCode; + //} + } + catch (Exception) + { + wmsMesNoteDetail.ItemName = ""; + wmsMesNoteDetail.ItemDesc1 = ""; + wmsMesNoteDetail.ItemDesc2 = ""; + wmsMesNoteDetail.Uom = ""; + } + + wmsMesNote.Details.Add(wmsMesNoteDetail); + + incomingToWms.DataContent = JsonSerializer.Serialize(wmsMesNote); + incomingToWmsList.Add(incomingToWms); + } + return incomingToWmsList; + } + +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/FrozenReader.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/FrozenReader.cs new file mode 100644 index 000000000..4a2626cb3 --- /dev/null +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/FrozenReader.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; +using Win_in.Sfs.Wms.DataExchange.Domain.Shared; +using Win_in.Sfs.Wms.DataExchange.Domain; +using System.Text.Json; +using Win_in.Sfs.Wms.DataExchange.WMS.MesNote; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent.Incoming; +public class FrozenReader : IReader +{ + private readonly IFrozenManager _FrozenManager; + private readonly IIncomingFromExternalManager _incomingFromExternalManager; + private readonly ILogger _logger; + private readonly ILocationAppService _locationAppService; + + public FrozenReader( + IFrozenManager pillTaskManager + , IIncomingFromExternalManager incomingFromExternalManager + , ILogger logger + , ILocationAppService locationAppService + ) + { + _FrozenManager = pillTaskManager; + _incomingFromExternalManager = incomingFromExternalManager; + _logger = logger; + _locationAppService = locationAppService; + } + + public virtual async Task> ReadAsync() + + { + //从MES读取待处理Frozen + var toBeProcessedPillTasks = await _FrozenManager.GetToBeProcessedListAsync().ConfigureAwait(false); + if (!toBeProcessedPillTasks.Any()) + { + _logger.LogInformation("no Frozens"); + return new List(); + } + //Frozen逐一转换为MaterialRequest + var holdLocation = await _locationAppService.GetFirstByTypeAsync(EnumLocationType.HOLD).ConfigureAwait(false); + var incomingDataList = BuildIncomingFromExternalFromPillTaskAsync(toBeProcessedPillTasks, holdLocation==null?"": holdLocation.Code); + await _incomingFromExternalManager.CreateManyAsync(incomingDataList).ConfigureAwait(false); + //更新MES数据状态 + await _FrozenManager.UpdateProcessedListAsync(toBeProcessedPillTasks).ConfigureAwait(false); + + return incomingDataList; + } + + private static List BuildIncomingFromExternalFromPillTaskAsync(List toBeProcessedFrozens,string holdLocationCode) + { + var incomingDataList = new List(); + foreach (var Frozen in toBeProcessedFrozens) + { + var incomingData = BuildIncomingFromExternal(Frozen); + + incomingData.SetEffectiveDate(DateTime.Now); + incomingData.SetSuccess(); + try + { + var MaterialRequest = BuildTransferNoteCreateInput(Frozen, holdLocationCode); + incomingData.DestinationDataContent = JsonSerializer.Serialize(MaterialRequest); + } + catch (Exception ex) + { + incomingData.SetError(EnumExchangeDataErrorCode.Exception, ex.Message, ex.ToString()); + } + + incomingDataList.Add(incomingData); + + } + + return incomingDataList; + } + + private static IncomingFromExternal BuildIncomingFromExternal(Frozen Frozen) + { + var incomingData = new IncomingFromExternal() + { + DataType = EnumIncomingDataType.MesNote.ToString(), + DataAction = EnumExchangeDataAction.Add, + SourceSystem = EnumSystemType.MES.ToString(), + SourceDataId = Frozen.mesout_frozen_id.ToString(), + SourceDataGroupCode = Frozen.mesout_frozen_id, + SourceDataDetailCode = Frozen.mesout_frozen_part, + SourceDataContent = JsonSerializer.Serialize(Frozen), + WriteTime = DateTime.Now, + Writer = nameof(MesIncomingBackgroundWorker), + + DestinationSystem = EnumSystemType.WMS.ToString(), + }; + return incomingData; + } + + private static MesNoteExchangeDto BuildTransferNoteCreateInput(Frozen Frozen, string holdLocationCode) + { + var mesNote = new MesNoteExchangeDto() + { + MesRequestNumber=Frozen.mesout_frozen_id, + Worker = Frozen.mesout_frozen_user, + Remark = Frozen.mesout_frozen_reason, + Type = Frozen.mesout_frozen_type == "0" ? EnumTransType.MesFreezed.ToString() : EnumTransType.MesUnFreezed.ToString(), + ActiveDate = DateTime.TryParse(Frozen.mesout_frozen_date, out DateTime dateTime) ? dateTime : DateTime.Now + }; + var mesNoteDetail = new MesNoteDetailExchangeDto() + { + ItemCode = Frozen.mesout_frozen_part, + Qty = Frozen.mesout_frozen_num, + ToLocationErpCode = Frozen.mesout_frozen_type == "0"? holdLocationCode : Frozen.mesout_frozen_loc, + FromLocationErpCode = Frozen.mesout_frozen_type != "0"? holdLocationCode:Frozen.mesout_frozen_loc, + ToStatus= Frozen.mesout_frozen_type == "0"? EnumInventoryStatus.HOLD: EnumInventoryStatus.OK, + FromStatus = Frozen.mesout_frozen_type != "0" ? EnumInventoryStatus.HOLD : EnumInventoryStatus.OK, + }; + mesNote.Detail = mesNoteDetail; + return mesNote; + } + +} diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/MesIncomingBackgroundWorker.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/MesIncomingBackgroundWorker.cs index f54234061..c9b2af73c 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/MesIncomingBackgroundWorker.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/MesIncomingBackgroundWorker.cs @@ -45,21 +45,21 @@ public class MesIncomingBackgroundWorker : AsyncPeriodicBackgroundWorkerBase return; } - Logger.LogInformation($"Read MesOut");//缴库 - var mesOutReader = workerContext.ServiceProvider.GetRequiredService(); - var mesOutConverter = workerContext.ServiceProvider.GetRequiredService(); - var TransferNoteConverter = workerContext.ServiceProvider.GetRequiredService(); - //读取mes缴库 - var mesOutsFromExternalList = await mesOutReader.ReadAsync().ConfigureAwait(false); - var mesOutsFromExternalList_ProductReceipt = mesOutsFromExternalList.Where(r => r.DataType == EnumIncomingDataType.ProductReceipt.ToString()).ToList(); - var mesOutsFromExternalList_TransferNote = mesOutsFromExternalList.Where(r => r.DataType == EnumIncomingDataType.TransferNote.ToString()).ToList(); - //转换缴库数据(如果有质量补得数据直接生产移库数据移到客户库位) - await mesOutConverter.ConvertAsync(mesOutsFromExternalList_ProductReceipt).ConfigureAwait(false); - if (mesOutsFromExternalList_TransferNote.Count > 0) - { - await TransferNoteConverter.ConvertAsync(mesOutsFromExternalList_TransferNote).ConfigureAwait(false); - } - + //Logger.LogInformation($"Read MesOut");//缴库 + //var mesOutReader = workerContext.ServiceProvider.GetRequiredService(); + //var mesOutConverter = workerContext.ServiceProvider.GetRequiredService(); + //var TransferNoteConverter = workerContext.ServiceProvider.GetRequiredService(); + ////读取mes缴库 + //var mesOutsFromExternalList = await mesOutReader.ReadAsync().ConfigureAwait(false); + //var mesOutsFromExternalList_ProductReceipt = mesOutsFromExternalList.Where(r => r.DataType == EnumIncomingDataType.ProductReceipt.ToString()).ToList(); + //var mesOutsFromExternalList_TransferNote = mesOutsFromExternalList.Where(r => r.DataType == EnumIncomingDataType.TransferNote.ToString()).ToList(); + ////转换缴库数据(如果有质量补得数据直接生产移库数据移到客户库位) + //await mesOutConverter.ConvertAsync(mesOutsFromExternalList_ProductReceipt).ConfigureAwait(false); + //if (mesOutsFromExternalList_TransferNote.Count > 0)//如果有质量补则生产储位调拨任务 + //{ + // await TransferNoteConverter.ConvertAsync(mesOutsFromExternalList_TransferNote).ConfigureAwait(false); + //} + //上海和安徽无此接口 //Logger.LogInformation($"Read PullTask");//拉动任务 @@ -69,7 +69,7 @@ public class MesIncomingBackgroundWorker : AsyncPeriodicBackgroundWorkerBase //var pullTaskFromExternalList = await pullTaskReader.ReadAsync().ConfigureAwait(false); ////转换PullTask //await pullTaskConverter.ConvertAsync(pullTaskFromExternalList).ConfigureAwait(false); - //Logger.LogInformation($"Read Scrap"); + //Logger.LogInformation($"Read Scrap");//报废 //var scrapReader = workerContext.ServiceProvider.GetRequiredService(); //var scrapConverter = workerContext.ServiceProvider.GetRequiredService(); @@ -96,13 +96,22 @@ public class MesIncomingBackgroundWorker : AsyncPeriodicBackgroundWorkerBase //await BackFlushConverter.ConvertAsync(backFlushsFromExternalList).ConfigureAwait(false); - Logger.LogInformation($"Read TransferNote");//储位调拨 - var TransferNoteReader = workerContext.ServiceProvider.GetRequiredService(); - // var TransferNoteConverter = workerContext.ServiceProvider.GetRequiredService(); + // Logger.LogInformation($"Read TransferNote");//储位调拨 + // var TransferNoteReader = workerContext.ServiceProvider.GetRequiredService(); + //// var TransferNoteConverter = workerContext.ServiceProvider.GetRequiredService(); + // //读取并保存BackFlush + // var transferNoteFromExternalList = await TransferNoteReader.ReadAsync().ConfigureAwait(false); + // //转换BackFlush + // await TransferNoteConverter.ConvertAsync(transferNoteFromExternalList).ConfigureAwait(false); + // Logger.LogInformation($"Completed: Handling {Incoming}"); + + Logger.LogInformation($"Read Frozen");//冻结解冻 + var FrozenReader = workerContext.ServiceProvider.GetRequiredService(); + var FrozenConverter = workerContext.ServiceProvider.GetRequiredService(); //读取并保存BackFlush - var transferNoteFromExternalList = await TransferNoteReader.ReadAsync().ConfigureAwait(false); + var mesNoteFromExternalList = await FrozenReader.ReadAsync().ConfigureAwait(false); //转换BackFlush - await TransferNoteConverter.ConvertAsync(transferNoteFromExternalList).ConfigureAwait(false); + await FrozenConverter.ConvertAsync(mesNoteFromExternalList).ConfigureAwait(false); Logger.LogInformation($"Completed: Handling {Incoming}"); } diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs index 90be492d5..9d87cae93 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs @@ -194,6 +194,13 @@ public static class IncomingToWmsExtensions var transferNoteAppService = workerContext.ServiceProvider.GetRequiredService(); await transferNoteAppService.CreateAsync(transferNote).ConfigureAwait(false); } + public static async Task HandleMesNoteAsync(this IncomingToWms incomingConverted, PeriodicBackgroundWorkerContext workerContext) + { + var mesNote = JsonSerializer.Deserialize(incomingConverted.DataContent); + var mesNoteAppService = workerContext.ServiceProvider.GetRequiredService(); + await mesNoteAppService.CreateAsync(mesNote).ConfigureAwait(false); + } + public static async Task HandleScrapsAsync(this IncomingToWms incomingConverted, PeriodicBackgroundWorkerContext workerContext) { var scrap = JsonSerializer.Deserialize(incomingConverted.DataContent); diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsWorker.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsWorker.cs index c54b9ed90..44f37ee08 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsWorker.cs +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsWorker.cs @@ -190,6 +190,9 @@ public class IncomingToWmsWorker : AsyncPeriodicBackgroundWorkerBase case EnumIncomingDataType.TransferNote: await incomingToWms.HandleTransferNoteAsync(workerContext).ConfigureAwait(false); break; + case EnumIncomingDataType.MesNote: + await incomingToWms.HandleMesNoteAsync(workerContext).ConfigureAwait(false); + break; case EnumIncomingDataType.None: default: throw new ArgumentOutOfRangeException(); diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/MesNote/MesNoteDetailExchangeDto.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/MesNote/MesNoteDetailExchangeDto.cs new file mode 100644 index 000000000..4283d490f --- /dev/null +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/MesNote/MesNoteDetailExchangeDto.cs @@ -0,0 +1,48 @@ +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Wms.DataExchange.WMS.MesNote; + +public class MesNoteDetailExchangeDto +{ + /// + /// 上架单号 + /// + [Display(Name = "移库单号")] + public string Number { get; set; } + /// + /// 物品代码 + /// + [Display(Name = "物品代码")] + public string ItemCode { get; set; } + + /// + /// 目标ERP库位 + /// + [Display(Name = "目标ERP库位")] + public string ToLocationErpCode { get; set; } + + /// + /// 来源ERP库位 + /// + [Display(Name = "来源ERP库位")] + public string FromLocationErpCode { get; set; } + + /// + /// 目标ERP库位 + /// + [Display(Name = "来源库位状态")] + public EnumInventoryStatus FromStatus { get; set; } + + /// + /// 来源ERP库位 + /// + [Display(Name = "目标库位状态")] + public EnumInventoryStatus ToStatus { get; set; } + + /// + /// 数量 + /// + [Display(Name = "数量")] + public decimal Qty { get; set; } +} diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/MesNote/MesNoteExchangeDto.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/MesNote/MesNoteExchangeDto.cs new file mode 100644 index 000000000..3aa64c617 --- /dev/null +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/MesNote/MesNoteExchangeDto.cs @@ -0,0 +1,47 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Win_in.Sfs.Wms.DataExchange.WMS.MesNote; +public class MesNoteExchangeDto +{ + /// + /// 上架单号 + /// + [Display(Name = "移库单号")] + public string Number { get; set; } + /// + /// MES请求单号 + /// + [Display(Name = "MES请求单号")] + public string MesRequestNumber { get; set; } + + + /// + /// 生效日期 + /// + [Display(Name = "生效日期")] + public DateTime ActiveDate { get; set; } = DateTime.Now.Date; + + /// + /// 操作员 + /// + [Display(Name = "操作员")] + public string Worker { get; set; } + + /// + /// 调拨类型 + /// + [Display(Name = "调拨类型")] + public string Type { get; set; } + + /// + /// 备注 + /// + [Display(Name = "备注")] + public string Remark { get; set; } + /// + /// 明细列表 + /// + [Display(Name = "明细列表")] + public MesNoteDetailExchangeDto Detail { get; set; } = new(); +} diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/Win_in.Sfs.Wms.DataExchange.Application.Contracts.xml b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/Win_in.Sfs.Wms.DataExchange.Application.Contracts.xml index 9fda24075..e17d7c47d 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/Win_in.Sfs.Wms.DataExchange.Application.Contracts.xml +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/Win_in.Sfs.Wms.DataExchange.Application.Contracts.xml @@ -771,6 +771,76 @@ 明细列表 + + + 上架单号 + + + + + 物品代码 + + + + + 目标ERP库位 + + + + + 来源ERP库位 + + + + + 目标ERP库位 + + + + + 来源ERP库位 + + + + + 数量 + + + + + 上架单号 + + + + + MES请求单号 + + + + + 生效日期 + + + + + 操作员 + + + + + 调拨类型 + + + + + 备注 + + + + + 明细列表 + + 上架单号 diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Domain.Shared/Enums/EnumIncomingDataType.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Domain.Shared/Enums/EnumIncomingDataType.cs index a20feb7dc..c47ac2d27 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Domain.Shared/Enums/EnumIncomingDataType.cs +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Domain.Shared/Enums/EnumIncomingDataType.cs @@ -117,5 +117,9 @@ public enum EnumIncomingDataType /// /// 储位调拨 /// - TransferNote=28 + TransferNote=28, + /// + /// 储位调拨 + /// + MesNote = 29 } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/MesNotes/MesNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/MesNotes/MesNoteAppService.cs index ab918a9ec..7da94b615 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/MesNotes/MesNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/MesNotes/MesNoteAppService.cs @@ -63,7 +63,6 @@ public class MesNoteAppService : { var fromLocation=await _locationAppService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false); var toLocation =await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); - var itemBasicDto =await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); if (fromLocation == null) { throw new UserFriendlyException($"来源库位为空"); @@ -81,9 +80,6 @@ public class MesNoteAppService : detail.ToLocationErpCode = toLocation.ErpLocationCode; detail.ToLocationGroup = toLocation.LocationGroupCode; detail.ToWarehouseCode = toLocation.WarehouseCode; - detail.ToStatus = detail.FromStatus; - detail.Uom = itemBasicDto.BasicUom; - detail.StdPackQty = itemBasicDto.StdPackQty; #region 添加校验 @@ -91,7 +87,7 @@ public class MesNoteAppService : rInput.ItemCode = detail.ItemCode; rInput.Locations = new List() { detail.FromLocationCode }; rInput.Qty = detail.Qty; - rInput.Statuses = new List { EnumInventoryStatus.OK }; + rInput.Statuses = new List { detail.FromStatus }; var balanceLst = await _balanceAppService.GetRecommendBalancesByLocationsAsync(rInput).ConfigureAwait(false); var first = balanceLst.FirstOrDefault(); if (first != null)