From 4ad3e33a9085b565000cac3fa68919764425ab8c Mon Sep 17 00:00:00 2001 From: zhouhongjun <565221961@qq.com> Date: Tue, 2 Apr 2024 10:36:09 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E5=AE=B9?= =?UTF-8?q?=E6=95=B0=E6=A0=87=E5=8C=85=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jobs/ContainerJobController.cs | 8 +- .../ItemContainers/DTOs/ItemContainerDTO.cs | 47 ++++++++++++ .../IItemContainerAppService.cs | 11 +++ .../Inputs/ItemContainerEditInput.cs | 53 +++++++++++++ .../Inputs/ItemContainerImportInput.cs | 64 ++++++++++++++++ .../ItemContainerPermissions.cs | 21 ++++++ .../BasedataPermissionDefinitionProvider.cs | 1 + .../BasedataApplicationAutoMapperProfile.cs | 1 + .../ItemContainers/ItemContainerAppService.cs | 69 +++++++++++++++++ .../ItemContainerAutoMapperProfile.cs | 33 +++++++++ .../ItemContainers/IItemContainerManager.cs | 9 +++ .../IItemContainerRepository.cs | 9 +++ .../ItemContainers/ItemContainer.cs | 46 ++++++++++++ .../ItemContainers/ItemContainerManager.cs | 31 ++++++++ .../BasedataDbContext.cs | 1 + ...asedataDbContextModelCreatingExtensions.cs | 1 + .../BasedataEntityFrameworkCoreModule.cs | 1 + .../IBasedataDbContext.cs | 2 + ...ntainerDbContextModelCreatingExtensions.cs | 36 +++++++++ .../ItemContainerEfCoreRepository.cs | 32 ++++++++ .../Inputs/ContainerJobEditInput.cs | 9 +-- .../Inputs/ContainerNoteEditInput.cs | 8 +- .../Inputs/ContainerRequestEditInput.cs | 3 +- .../ContainerRequestAppService.cs | 3 +- .../Jobs/ContainerJobs/ContainerJob.cs | 7 +- .../Notes/ContainerNotes/ContainerNote.cs | 7 +- .../ContainerRequests/ContainerRequest.cs | 7 +- .../Jobs/ContainerJobAutoMapperProfile.cs | 3 +- .../Notes/ContainerNoteAutoMapperProfile.cs | 22 ++++++ .../Requests/ContainerRequestMapperProfile.cs | 7 +- .../Requests/ContainerRequestEventHandler.cs | 74 +++++++++---------- 31 files changed, 544 insertions(+), 82 deletions(-) create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/DTOs/ItemContainerDTO.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/IItemContainerAppService.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerEditInput.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerImportInput.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/ItemContainerPermissions.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAutoMapperProfile.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerManager.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerRepository.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainer.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainerManager.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerDbContextModelCreatingExtensions.cs create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerEfCoreRepository.cs create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Notes/ContainerNoteAutoMapperProfile.cs diff --git a/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/ContainerJobController.cs b/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/ContainerJobController.cs index 758982be3..a01a2b9d3 100644 --- a/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/ContainerJobController.cs +++ b/be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/ContainerJobController.cs @@ -111,8 +111,12 @@ public class ContainerJobController : AbpController { if(!string.IsNullOrEmpty(item.SpecificationsType)) { - var dictName= dtos.Items.FirstOrDefault(t => t.Code == item.SpecificationsType); - item.SpecificationsTypeName = dictName.Name; + var dictName = dtos.Items.FirstOrDefault(t => t.Code == item.SpecificationsType); + if(dictName != null) + { + item.SpecificationsTypeName = dictName.Name; + } + } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/DTOs/ItemContainerDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/DTOs/ItemContainerDTO.cs new file mode 100644 index 000000000..a43c1ff30 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/DTOs/ItemContainerDTO.cs @@ -0,0 +1,47 @@ +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "物品收容器信息")] + +public class ItemContainerDTO : SfsBaseDataDTOBase +{ + /// + /// 收容器代码 + /// + [Display(Name = "收容器代码")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerCode { get; set; } + + /// + /// 收容器名称 + /// + [Display(Name = "收容器名称")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerName { get; set; } + /// + /// 收容器类型 + /// + [Display(Name = "收容器类型")] + [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerType { get; set; } + /// + /// 物品代码 + /// + [Display(Name = "物品代码")] + [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ItemCode { get; set; } + + /// + /// 收容器计量单位 + /// + [Display(Name = "收容器计量单位")] + public string BasicUom { get; set; } + + /// + /// 收容器数量 + /// + [Display(Name = "收容器数量")] + public decimal Qty { get; set; } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/IItemContainerAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/IItemContainerAppService.cs new file mode 100644 index 000000000..783e1ab02 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/IItemContainerAppService.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Win_in.Sfs.Shared.Application.Contracts; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public interface IItemContainerAppService : ISfsBaseDataAppServiceBase, ISfsUpsertAppService +{ + Task> GetListByItemCodeAsync(string itemCode); + Task UpsertAndItemBasicUomAsync(string itemCode,decimal stdPackQty); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerEditInput.cs new file mode 100644 index 000000000..ce87fa288 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerEditInput.cs @@ -0,0 +1,53 @@ +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public class ItemContainerEditInput : SfsBaseDataCreateOrUpdateInputBase +{ + #region Base + /// + /// 收容器名称 + /// + [Display(Name = "收容器名称")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerName { get; set; } + + /// + /// 收容器类型 + /// + [Display(Name = "收容器类型")] + [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerType { get; set; } + + /// + /// 收容器计量单位 + /// + [Display(Name = "收容器计量单位")] + public string BasicUom { get; set; } + + /// + /// 收容器数量 + /// + [Display(Name = "收容器数量")] + public decimal Qty { get; set; } + #endregion + + #region Create + /// + /// 收容器代码 + /// + [Display(Name = "收容器代码")] + [Required(ErrorMessage = "{0}是必填项")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerCode { get; set; } + + /// + /// 物品代码 + /// + [Display(Name = "物品代码")] + [Required(ErrorMessage = "{0}是必填项")] + [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ItemCode { get; set; } + #endregion +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerImportInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerImportInput.cs new file mode 100644 index 000000000..4cc761d6c --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/Inputs/ItemContainerImportInput.cs @@ -0,0 +1,64 @@ +using System.ComponentModel.DataAnnotations; +using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +[Display(Name = "物品收容器")] +public class ItemContainerImportInput : SfsBaseDataImportInputBase +{ + /// + /// 收容器代码 + /// + [Key] + [Display(Name = "收容器代码")] + [Required(ErrorMessage = "{0}不能为空")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerCode { get; set; } + + /// + /// 收容器名称 + /// + [Display(Name = "收容器名称")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ContainerName { get; set; } + + /// + /// 收容器类型 + /// + [Display(Name = "收容器类型")] + [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + [ValueMapping("EA", "EA")] + [ValueMapping("Box", "Box")] + [ValueMapping("Pallet", "Pallet")] + public string ContainerType { get; set; } + + /// + /// 物品编号 + /// + [Key] + [Display(Name = "物品编号")] + [Required(ErrorMessage = "物品编号不能为空")] + [StringLength(SfsEfCorePropertyConst.DescLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ItemCode { get; set; } + + /// + /// 收容器计量单位 + /// + [Display(Name = "收容器计量单位")] + public string BasicUom { get; set; } + + /// + /// 收容器数量 + /// + [Display(Name = "收容器数量")] + [Required(ErrorMessage = "{0}是必填项")] + public decimal Qty { get; set; } + + /// + /// 备注 + /// + [Display(Name = "备注")] + [StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string Remark { get; set; } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/ItemContainerPermissions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/ItemContainerPermissions.cs new file mode 100644 index 000000000..7ad3d1227 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ItemContainers/ItemContainerPermissions.cs @@ -0,0 +1,21 @@ +using Volo.Abp.Authorization.Permissions; +using Win_in.Sfs.Basedata.Domain; + +namespace Win_in.Sfs.Basedata.Application.Contracts; + +public static class ItemContainerPermissions +{ + + public const string Default = BasedataPermissions.GroupName + "." + nameof(ItemContainer); + public const string Create = Default + "." + BasedataPermissions.CreateStr; + public const string Update = Default + "." + BasedataPermissions.UpdateStr; + public const string Delete = Default + "." + BasedataPermissions.DeleteStr; + + public static void AddItemContainerPermission(this PermissionGroupDefinition permissionGroup) + { + var itemContainerPermission = permissionGroup.AddPermission(Default, BasedataPermissionDefinitionProvider.L(nameof(ItemContainer))); + itemContainerPermission.AddChild(Create, BasedataPermissionDefinitionProvider.L(BasedataPermissions.CreateStr)); + itemContainerPermission.AddChild(Update, BasedataPermissionDefinitionProvider.L(BasedataPermissions.UpdateStr)); + itemContainerPermission.AddChild(Delete, BasedataPermissionDefinitionProvider.L(BasedataPermissions.DeleteStr)); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Permissions/BasedataPermissionDefinitionProvider.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Permissions/BasedataPermissionDefinitionProvider.cs index 761725ba0..f4964079d 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Permissions/BasedataPermissionDefinitionProvider.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Permissions/BasedataPermissionDefinitionProvider.cs @@ -35,6 +35,7 @@ public class BasedataPermissionDefinitionProvider : PermissionDefinitionProvider basedataGroup.AddItemBasicPermission(); basedataGroup.AddItemCategoryPermission(); basedataGroup.AddItemPackPermission(); + basedataGroup.AddItemContainerPermission(); basedataGroup.AddCategoryPermission(); basedataGroup.AddPositionCodePermission(); basedataGroup.AddWorkShopPermission(); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs index c5301da0f..703b60180 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationAutoMapperProfile.cs @@ -27,6 +27,7 @@ public partial class BasedataApplicationAutoMapperProfile : Profile ItemBasicAutoMapperProfile(); ItemCategoryAutoMapperProfile(); ItemPackAutoMapperProfile(); + ItemContainerAutoMapperProfile(); ItemStoreRelationAutoMapperProfile(); ItemSafetyStockAutoMapperProfile(); LocationAutoMapperProfile(); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs new file mode 100644 index 000000000..79ff81b08 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Caching; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application; + +[Authorize] +[Route($"{BasedataConsts.RootPath}item-container")] + +public class ItemContainerAppService + : SfsBaseDataAppServiceBase + , IItemContainerAppService +{ + private readonly IItemContainerManager _manager; + private new readonly IItemContainerRepository _repository; + + public ItemContainerAppService( + IItemContainerRepository repository + , IDistributedCache cache + , IItemContainerManager manager + , IItemBasicAppService itemBasicAppService) : base(repository, cache) + { + base.CreatePolicyName = ItemContainerPermissions.Create; + base.UpdatePolicyName = ItemContainerPermissions.Update; + base.DeletePolicyName = ItemContainerPermissions.Delete; + _repository = repository; + _manager = manager; + } + + [HttpPost("upsert")] + public virtual async Task UpsertAsync(ItemContainerEditInput input) + { + var entity = ObjectMapper.Map(input); + await _repository.UpsertAsync(entity).ConfigureAwait(false); + } + + [HttpGet("list/by-item")] + public virtual async Task> GetListByItemCodeAsync(string itemCode) + { + var entities = await _repository.GetListAsync(c => c.ItemCode == itemCode).ConfigureAwait(false); + var dtos = ObjectMapper.Map, List>(entities); + return dtos; + } + + + protected override async Task ValidateImportModelAsync(ItemContainerImportInput importInput, List validationRresult) + { + await base.CheckItemBasicPackUomAsync(importInput.ItemCode, importInput.BasicUom, validationRresult).ConfigureAwait(false); + //await base.CheckItemContainerAsync(importInput.ContainerCode, validationRresult).ConfigureAwait(false); + } + + [HttpPut("upsert-and-item-basic-std-pack")] + public async Task UpsertAndItemBasicUomAsync(string itemCode,decimal stdPackQty) + { + var itemContainers=await _repository.GetListAsync(p => p.ItemCode == itemCode).ConfigureAwait(false); + var entity=itemContainers.First(); + entity.Qty = stdPackQty; + await _repository.UpsertAsync(entity).ConfigureAwait(false); + await ItemBasicAppService.UpsertStdPackQtyAsync(itemCode, stdPackQty).ConfigureAwait(false); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAutoMapperProfile.cs new file mode 100644 index 000000000..e19b2260e --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAutoMapperProfile.cs @@ -0,0 +1,33 @@ +using AutoMapper; +using Volo.Abp.AutoMapper; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; + +namespace Win_in.Sfs.Basedata.Application; + +public partial class BasedataApplicationAutoMapperProfile : Profile +{ + private void ItemContainerAutoMapperProfile() + { + CreateMap() + .ReverseMap(); + + CreateMap() + .IgnoreAuditedObjectProperties() + .Ignore(x => x.TenantId) + .Ignore(x => x.ExtraProperties) + .Ignore(x => x.ConcurrencyStamp) + ; + + CreateMap() + .IgnoreAuditedObjectProperties() + .Ignore(x => x.TenantId) + .Ignore(x=>x.Id) + .Ignore(x => x.ExtraProperties) + .Ignore(x => x.ConcurrencyStamp) + ; + CreateMap() + .IgnoreAuditedObjectProperties() + .Ignore(x => x.ConcurrencyStamp).Ignore(x => x.Id); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerManager.cs new file mode 100644 index 000000000..83adc37e2 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerManager.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Domain.Services; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public interface IItemContainerManager : IDomainService, IBulkImportService +{ + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerRepository.cs new file mode 100644 index 000000000..d88876c21 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/IItemContainerRepository.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.Domain; + +public interface IItemContainerRepository : ISfsBaseDataRepositoryBase, ISfsBulkRepositoryBase +{ + Task UpsertAsync(ItemContainer entity); +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainer.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainer.cs new file mode 100644 index 000000000..67fc5c48e --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainer.cs @@ -0,0 +1,46 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Domain; + +public class ItemContainer : SfsBaseDataAggregateRootBase +{ + /// + /// 收容器代码 + /// + [IgnoreUpdate] + public string ContainerCode { get; set; } + + /// + /// 收容器名称 + /// + public string ContainerName { get; set; } + + /// + /// 收容器类型 + /// + public string ContainerType { get; set; } + + /// + /// 物品代码 + /// + [IgnoreUpdate] + public string ItemCode { get; set; } + + /// + /// 计量单位 + /// + [Display(Name = "计量单位")] + [MaxLength(SfsPropertyConst.CodeLength)] + public string BasicUom { get; set; } + + /// + /// 数量 + /// + [Display(Name = "数量")] + [Column(TypeName = "decimal(18,6)")] + public decimal Qty { get; set; } + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainerManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainerManager.cs new file mode 100644 index 000000000..89579161d --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ItemContainers/ItemContainerManager.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace Win_in.Sfs.Basedata.Domain; + +public class ItemContainerManager : DomainService, IItemContainerManager +{ + private readonly IItemContainerRepository _repository; + + private readonly IItemBasicRepository _itemBasicRepository; + + public ItemContainerManager(IItemContainerRepository repository, IItemBasicRepository itemBasicRepository) + { + _repository = repository; + _itemBasicRepository = itemBasicRepository; + } + + /// + /// 执行导入 + /// + public virtual async Task ImportDataAsync(List mergeEntities, List deleteEntities = null) + { + if (deleteEntities != null && deleteEntities.Count > 0) + { + await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false); + } + + await _repository.BulkMergeAsync(mergeEntities).ConfigureAwait(false); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContext.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContext.cs index 239048798..afd345a0e 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContext.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContext.cs @@ -36,6 +36,7 @@ public class BasedataDbContext : AbpDbContext, IBasedataDbCon public DbSet ItemBasics { get; set; } public DbSet ItemCategories { get; set; } public DbSet ItemPacks { get; set; } + public DbSet ItemContainers { get; set; } public DbSet ItemStoreRelations { get; set; } public DbSet ItemSafetyStocks { get; set; } public DbSet Categories { get; set; } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs index cb9249054..6b2cb3a9f 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataDbContextModelCreatingExtensions.cs @@ -47,6 +47,7 @@ public static class BasedataDbContextModelCreatingExtensions builder.ConfigureItemBasic(options); builder.ConfigureItemCategory(options); builder.ConfigureItemPack(options); + builder.ConfigureItemContainer(options); builder.ConfigureItemStoreRelation(options); builder.ConfigureItemSafetyStock(options); builder.ConfigureCategory(options); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs index c2fa0071a..117fa11d5 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/BasedataEntityFrameworkCoreModule.cs @@ -51,6 +51,7 @@ public class BasedataEntityFrameworkCoreModule : AbpModule context.Services.AddTransient(); context.Services.AddTransient(); context.Services.AddTransient(); + context.Services.AddTransient(); context.Services.AddTransient(); context.Services.AddTransient(); context.Services.AddTransient(); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/IBasedataDbContext.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/IBasedataDbContext.cs index c259efd44..383cc21d4 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/IBasedataDbContext.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/IBasedataDbContext.cs @@ -36,6 +36,8 @@ public interface IBasedataDbContext : IEfCoreDbContext public DbSet ItemBasics { get; } public DbSet ItemCategories { get; } public DbSet ItemPacks { get; } + public DbSet ItemContainers { get; } + public DbSet PositionCodes { get; } public DbSet ItemStoreRelations { get; } public DbSet ItemSafetyStocks { get; } public DbSet Categories { get; } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerDbContextModelCreatingExtensions.cs new file mode 100644 index 000000000..b94ff820a --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerDbContextModelCreatingExtensions.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Modeling; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.EntityFrameworkCore; + +namespace Win_in.Sfs.Basedata.EntityFrameworkCore; + +public static class ItemContainerDbContextModelCreatingExtensions +{ + public static void ConfigureItemContainer(this ModelBuilder builder, BasedataModelBuilderConfigurationOptions options) + { + builder.Entity(b => + { + //Configure table & schema name + b.ToTable(options.TablePrefix + nameof(ItemContainer), options.Schema); + //Configure ABP properties + b.ConfigureByConvention(); + //Configure Sfs base properties + b.ConfigureSfsBase(); + + //Properties + + b.Property(q => q.ContainerCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.ItemCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.ContainerName).HasMaxLength(SfsPropertyConst.NameLength); + b.Property(q => q.ContainerType).HasMaxLength(SfsPropertyConst.NameLength); + + //Relations + //None + + //Indexes + b.HasIndex(q => new { q.ItemCode, q.ContainerCode }).IsUnique(); + }); + } +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerEfCoreRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerEfCoreRepository.cs new file mode 100644 index 000000000..72106066c --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ItemContainers/ItemContainerEfCoreRepository.cs @@ -0,0 +1,32 @@ +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Shared.Domain; + +namespace Win_in.Sfs.Basedata.EntityFrameworkCore; + +public class ItemContainerEfCoreRepository : SfsBaseDataEfCoreRepositoryBase, IItemContainerRepository, ISfsBulkRepositoryBase +{ + public ItemContainerEfCoreRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + + } + + public virtual async Task UpsertAsync(ItemContainer entity) + { + var dbSet = await GetDbSetAsync().ConfigureAwait(false); + var exist = await dbSet.FirstOrDefaultAsync(p => p.ItemCode == entity.ItemCode).ConfigureAwait(false); + if (exist == null) + { + var insRet = await InsertAsync(entity).ConfigureAwait(false); + } + else + { + exist.ContainerName = entity.ContainerName; + exist.ContainerCode = entity.ContainerCode; + exist.BasicUom = entity.BasicUom; + exist.Qty = entity.Qty; + } + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ContainerJobs/Inputs/ContainerJobEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ContainerJobs/Inputs/ContainerJobEditInput.cs index f688c14c4..48643221f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ContainerJobs/Inputs/ContainerJobEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ContainerJobs/Inputs/ContainerJobEditInput.cs @@ -6,7 +6,7 @@ using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Application.Contracts; -public class ContainerJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput +public class ContainerJobEditInput : SfsJobCreateUpdateInputBase { #region Create @@ -60,11 +60,6 @@ public class ContainerJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateI [Required(ErrorMessage = "{0}是必填项")] public bool IsAutoComplete { get; set; } - /// - /// 任务明细 - /// - [Display(Name = "任务明细")] - [Required(ErrorMessage = "{0}是必填项")] - public List Details { get; set; } = new(); + #endregion } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ContainerNotes/Inputs/ContainerNoteEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ContainerNotes/Inputs/ContainerNoteEditInput.cs index 55420ab2a..50574b316 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ContainerNotes/Inputs/ContainerNoteEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ContainerNotes/Inputs/ContainerNoteEditInput.cs @@ -57,13 +57,7 @@ public class ContainerNoteEditInput : SfsStoreCreateOrUpdateInputBase [Display(Name = "器具规格")] [StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}最多输入{1}个字符")] public string SpecificationsType { get; set; } - - /// - /// 明细列表 - /// - [Display(Name = "明细列表")] - public List Details { get; set; } - + #endregion } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ContainerRequests/Inputs/ContainerRequestEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ContainerRequests/Inputs/ContainerRequestEditInput.cs index 25d984db2..d00e56002 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ContainerRequests/Inputs/ContainerRequestEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ContainerRequests/Inputs/ContainerRequestEditInput.cs @@ -30,7 +30,6 @@ public class ContainerRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase [Required(ErrorMessage = "{0}是必填项")] public string SpecificationsType { get; set; } - [Display(Name = "明细列表")] - public List Details { get; set; } + #endregion } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ContainerRequests/ContainerRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ContainerRequests/ContainerRequestAppService.cs index 8bcb88c9f..79f901e1f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ContainerRequests/ContainerRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ContainerRequests/ContainerRequestAppService.cs @@ -56,10 +56,11 @@ public class ContainerRequestAppService : [HttpPost("")] public override async Task CreateAsync(ContainerRequestEditInput input) { - input.AutoCompleteJob = false; + input.AutoAgree = true; input.AutoHandle = true; input.AutoSubmit = true; + input.AutoCompleteJob = false; input.DirectCreateNote = false; var entity = ObjectMapper.Map(input); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ContainerJobs/ContainerJob.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ContainerJobs/ContainerJob.cs index 99e95973c..dabcfd882 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ContainerJobs/ContainerJob.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ContainerJobs/ContainerJob.cs @@ -36,12 +36,7 @@ public class ContainerJob : SfsJobAggregateRootBase /// [IgnoreUpdate] public string SpecificationsType { get; set; } - - /// - /// 任务明细 - /// - [IgnoreUpdate] - public override List Details { get; set; } = new List(); + /// /// 设置任务明细的实际库位和实际数量 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ContainerNotes/ContainerNote.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ContainerNotes/ContainerNote.cs index 79edc854b..200d68d17 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ContainerNotes/ContainerNote.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ContainerNotes/ContainerNote.cs @@ -54,12 +54,7 @@ public class ContainerNote : SfsStoreAggregateRootBase, IHa /// [Display(Name = "确认时间")] public DateTime? ConfirmTime { get; set; } - - /// - /// 任务明细 - /// - [IgnoreUpdate] - public override List Details { get; set; } = new(); + public void Confirm(DateTime confirmTime) { diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ContainerRequests/ContainerRequest.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ContainerRequests/ContainerRequest.cs index d2f13e5cb..446074d86 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ContainerRequests/ContainerRequest.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ContainerRequests/ContainerRequest.cs @@ -28,10 +28,5 @@ public class ContainerRequest : SfsStoreRequestAggregateRootBase [IgnoreUpdate] public string SpecificationsType { get; set; } - - /// - /// 任务明细 - /// - [IgnoreUpdate] - public override List Details { get; set; } = new(); + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ContainerJobAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ContainerJobAutoMapperProfile.cs index ae83fb30c..f1d3e5380 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ContainerJobAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ContainerJobAutoMapperProfile.cs @@ -14,8 +14,7 @@ public partial class StoreEventAutoMapperProfile : Profile .ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number)) .Ignore(x => x.Confirmed) .Ignore(x => x.ConfirmTime) - .Ignore(x => x.ActiveDate) - .Ignore(x => x.Details) + .Ignore(x => x.ActiveDate) ; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Notes/ContainerNoteAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Notes/ContainerNoteAutoMapperProfile.cs new file mode 100644 index 000000000..3676ad795 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Notes/ContainerNoteAutoMapperProfile.cs @@ -0,0 +1,22 @@ +using AutoMapper; +using Volo.Abp.AutoMapper; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; +using Win_in.Sfs.Wms.Store.Domain; + +namespace Win_in.Sfs.Wms.Store.Event; + +public partial class StoreEventAutoMapperProfile : Profile +{ + private void ContainerNoteAutoMapperProfile() + { + CreateMap() + .Ignore(x => x.DocNumber) + .Ignore(x => x.JobNumber) + .Ignore(x => x.Worker) + .Ignore(x => x.TransType) + .Ignore(x => x.ExtraProperties) + .Ignore(x => x.TransSubType) + ; + } + +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ContainerRequestMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ContainerRequestMapperProfile.cs index cddd0c9fd..4d67b8284 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ContainerRequestMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ContainerRequestMapperProfile.cs @@ -31,16 +31,15 @@ public partial class StoreEventAutoMapperProfile : Profile .Ignore(x => x.AcceptTime) .Ignore(x => x.CompleteUserId) .Ignore(x => x.CompleteUserName) - .Ignore(x => x.CompleteTime) - .Ignore(x => x.Details) + .Ignore(x => x.CompleteTime) ; CreateMap() .ForMember(x => x.ContainerRequestNumber, y => y.MapFrom(d => d.Number)) .Ignore(x => x.JobNumber) .Ignore(x => x.Confirmed) - .Ignore(x => x.ConfirmTime) - .Ignore(x => x.Details); + .Ignore(x => x.ConfirmTime); + CreateMap() .ForMember(x => x.FromContainerCode, y => y.MapFrom(d => d.ContainerCode)) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ContainerRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ContainerRequestEventHandler.cs index 97219e3ee..d190cae40 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ContainerRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ContainerRequestEventHandler.cs @@ -125,33 +125,32 @@ public class ContainerRequestEventHandler { var createInput = ObjectMapper.Map(request); - - ContainerNoteDetailInput detail=new ContainerNoteDetailInput(); - createInput.Details = new List(); - detail.ToLocationCode = request.RequestLocationCode; - - detail.FromLocationCode = "123"; - detail.FromPackingCode = "123"; - detail.ToPackingCode = "123"; - detail.FromLot = "123"; - detail.ToLot = "123"; - detail.FromLocationErpCode = "123"; - detail.FromWarehouseCode = "123"; - detail.ToLocationErpCode = "123"; - detail.ToWarehouseCode = "123"; - detail.Uom = "123"; - detail.ItemCode = "123"; - detail.ItemName = "123"; - - //var container = await _equipmentLocApp.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); - - //if (container != null) - //{ - // detail.ItemCode = container.Code; - //} - createInput.Details.Add(detail); + //createInput.Details = new List(); + //detail.ToLocationCode = request.RequestLocationCode; + + //detail.FromLocationCode = "123"; + //detail.FromPackingCode = "123"; + //detail.ToPackingCode = "123"; + //detail.FromLot = "123"; + //detail.ToLot = "123"; + //detail.FromLocationErpCode = "123"; + //detail.FromWarehouseCode = "123"; + //detail.ToLocationErpCode = "123"; + //detail.ToWarehouseCode = "123"; + //detail.Uom = "123"; + //detail.ItemCode = "123"; + //detail.ItemName = "123"; + + ////var container = await _equipmentLocApp.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); + + ////if (container != null) + ////{ + //// detail.ItemCode = container.Code; + ////} + + //createInput.Details.Add(detail); return createInput; } @@ -165,25 +164,22 @@ public class ContainerRequestEventHandler createInput.WarehouseCode = "T8"; - ContainerJobDetailInput detail=new ContainerJobDetailInput(); + //ContainerJobDetailInput detail=new ContainerJobDetailInput(); - detail.FromLocationCode = "123"; - detail.ToLocationCode = "123"; + //detail.FromLocationCode = "123"; + //detail.ToLocationCode = "123"; - detail.ItemCode = "123"; - detail.ItemName = "123"; - detail.RecommendPackingCode = "123"; - detail.RecommendLot = "123"; - detail.RecommendFromLocationCode = "123"; - detail.RecommendFromLocationErpCode = "123"; - detail.Uom = "123"; + //detail.ItemCode = "123"; + //detail.ItemName = "123"; + //detail.RecommendPackingCode = "123"; + //detail.RecommendLot = "123"; + //detail.RecommendFromLocationCode = "123"; + //detail.RecommendFromLocationErpCode = "123"; + //detail.Uom = "123"; - createInput.Details.Add(detail); - - + //createInput.Details.Add(detail); - return createInput ; } From 405427b6f430f58f84ebc6bd4f9c35ae85031620 Mon Sep 17 00:00:00 2001 From: zhaoxinyu <89237069@qq.com> Date: Tue, 2 Apr 2024 11:06:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Enums/Inventory/EnumTransSubType.cs | 9 + .../Enums/Store/Types/EnumMesType.cs | 13 ++ .../Notes/MesNotes/DTOs/MesNoteDTO.cs | 8 +- .../Notes/MesNotes/Inputs/MesNoteEditInput.cs | 11 +- .../MesNotes/Inputs/MesNoteImportInput.cs | 4 +- .../Notes/MesNotes/MesNote.cs | 3 +- ...MesNoteDbContextModelCreatingExtensions.cs | 2 +- .../CoatingIssueNoteEventHandler.cs | 159 ++++++++++++++++++ 8 files changed, 196 insertions(+), 13 deletions(-) create mode 100644 be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/Types/EnumMesType.cs create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/CoatingIssueNoteEventHandler.cs diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs index 57d1e43cd..2ca7b36ab 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs @@ -198,4 +198,13 @@ public enum EnumTransSubType /// [Display(Name = "导入盘点计划")] ExcelInCountPlan = 6002, + [Display(Name = "MES冻结")] + MesFreeze = 10001, + [Display(Name = "MES解冻")] + MesUnFreeze = 10002, + [Display(Name = "MES不合格")] + MesUnQualified = 10003 + + + } diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/Types/EnumMesType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/Types/EnumMesType.cs new file mode 100644 index 000000000..da72d0acb --- /dev/null +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/Types/EnumMesType.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.Shared.Domain.Shared.Enums.Store.Types; +public enum EnumMesType +{ + MesFreeze=10001, + MesUnFreeze=10002, + MesUnQualified=10003 +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/DTOs/MesNoteDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/DTOs/MesNoteDTO.cs index 06a7a4a5e..24ca29a90 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/DTOs/MesNoteDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/DTOs/MesNoteDTO.cs @@ -12,15 +12,15 @@ public class MesNoteDTO : SfsStoreDTOBase, IHasNumber public string JobNumber { get; set; } /// - /// 报废类型 + /// 类型 /// - [Display(Name = "报废类型")] + [Display(Name = "类型")] public string Type { get; set; } /// - /// 报废请求单号 + /// 请求单号 /// - [Display(Name = "报废请求单号")] + [Display(Name = "请求单号")] public string ScrapRequestNumber { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteEditInput.cs index 8f36d14c6..ee271489d 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteEditInput.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store.Types; namespace Win_in.Sfs.Wms.Store.Application.Contracts; @@ -16,20 +17,20 @@ public class MesNoteEditInput : SfsStoreCreateOrUpdateInputBase /// /// 报废记录号 /// - [Display(Name = "报废记录号")] + [Display(Name = "记录号")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] public string Number { get; set; } /// - /// 报废请求单号 + /// 请求单号 /// - [Display(Name = "报废请求单号")] - public string ScrapRequestNumber { get; set; } + [Display(Name = "请求单号")] + public string MesRequestNumber { get; set; } /// /// 报废类型 /// - [Display(Name = "报废类型")] + [Display(Name = "类型")] public string Type { get; set; } /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteImportInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteImportInput.cs index 138e02958..5a56ab8c6 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteImportInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/MesNotes/Inputs/MesNoteImportInput.cs @@ -14,7 +14,7 @@ public class MesNoteImportInput : SfsStoreImportInputBase /// /// 报废请求单号 /// - [Display(Name = "报废请求单号")] - public string ScrapRequestNumber { get; set; } + [Display(Name = "请求单号")] + public string MesRequestNumber { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/MesNotes/MesNote.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/MesNotes/MesNote.cs index 22b6cae8b..8f08e2041 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/MesNotes/MesNote.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/MesNotes/MesNote.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store.Types; namespace Win_in.Sfs.Wms.Store.Domain; @@ -18,7 +19,7 @@ public class MesNote : SfsStoreAggregateRootBase, IHasJobNumber /// 报废请求单号 /// [IgnoreUpdate] - public string ScrapRequestNumber { get; set; } + public string MesRequestNumber { get; set; } /// /// Mes类型 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/MesNotes/MesNoteDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/MesNotes/MesNoteDbContextModelCreatingExtensions.cs index 27a3b4842..38d31326e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/MesNotes/MesNoteDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/MesNotes/MesNoteDbContextModelCreatingExtensions.cs @@ -20,7 +20,7 @@ public static class MesNoteDbContextModelCreatingExtensions //Properties b.Property(q => q.Type).HasMaxLength(SfsPropertyConst.CodeLength); - b.Property(q => q.ScrapRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.MesRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); //Relations b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/CoatingIssueNoteEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/CoatingIssueNoteEventHandler.cs new file mode 100644 index 000000000..e6c6f076d --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/CoatingIssueNoteEventHandler.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.EventBus; +using Volo.Abp.Uow; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Event; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; +using Win_in.Sfs.Wms.Store.Domain; +using Win_in.Sfs.Wms.Store.Event.Transaction; +using Win_in.Sfs.Wms.Store.Notes.IssueNotes; + +namespace Win_in.Sfs.Wms.Store.Event.Transactions; + +public class CoatingIssueNoteEventHandler + : StoreInventoryEventHandlerBase + , ILocalEventHandler> + , ILocalEventHandler>> + , ILocalEventHandler> +{ + private const EnumTransType TransType = EnumTransType.Issue; + + private readonly ILocationAppService _locationAppService; + + public CoatingIssueNoteEventHandler(ILocationAppService locationAppService) + { + _locationAppService = locationAppService; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) + { + var entity = eventData.Entity; + var transferLogs = new List(); + var route = entity.UseOnTheWayLocation + ? EnumTransferRoute.SourceToOnTheWay + : EnumTransferRoute.SourceToDestination; + transferLogs.AddRange(await BuildTransferLogsAsync(entity, route).ConfigureAwait(false)); + + //如果是mes拉动 先发到在途 + if (entity.RequestType == EnumMaterialRequestType.Issue_WIP.ToString()) + { + route = EnumTransferRoute.SourceToOnTheWay; + } + + await TransferLogAppService.AddManyAsync(transferLogs).ConfigureAwait(false); + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData> eventData) + { + var entities = eventData.Entity; + var transferLogs = new List(); + //如果要做库存事务汇总,可以修改此处 + foreach (var CoatingIssueNote in entities) + { + var route = CoatingIssueNote.UseOnTheWayLocation + ? EnumTransferRoute.SourceToOnTheWay + : EnumTransferRoute.SourceToDestination; + transferLogs.AddRange(await BuildTransferLogsAsync(CoatingIssueNote, route).ConfigureAwait(false)); + } + + await TransferLogAppService.AddManyAsync(transferLogs).ConfigureAwait(false); + } + + [UnitOfWork] + + public virtual async Task HandleEventAsync(SfsConfirmedEntityEventData eventData) + { + var entity = eventData.Entity; + + var inputList = await BuildTransferLogsAsync(entity, EnumTransferRoute.OnTheWayToDestination).ConfigureAwait(false); + await AddTransferLogsAsync(inputList).ConfigureAwait(false); + } + + private async Task AddTransferLogsAsync(List inputList) + { + var transferLogs = new List(); + + transferLogs.AddRange(inputList); + + await TransferLogAppService.AddManyAsync(transferLogs).ConfigureAwait(false); + + } + + private async Task> BuildTransferLogsAsync(CoatingIssueNote CoatingIssueNote, EnumTransferRoute route) + { + var transferLogs = new List(); + foreach (var detail in CoatingIssueNote.Details.Where(detail => detail.Qty != 0)) + { + var transferLog = ObjectMapper.Map(detail); + + LocationDTO fromLocationDTO = null; + LocationDTO toLocationDTO = null; + + if (CoatingIssueNote.UseOnTheWayLocation) + { + var location = await _locationAppService.GetByCodeAsync(detail.OnTheWayLocationCode).ConfigureAwait(false); + switch (route) + { + case EnumTransferRoute.SourceToOnTheWay: + fromLocationDTO = await _locationAppService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false); + + toLocationDTO = await _locationAppService.GetByCodeAsync(detail.OnTheWayLocationCode).ConfigureAwait(false); + break; + case EnumTransferRoute.OnTheWayToDestination: + fromLocationDTO = await _locationAppService.GetByCodeAsync(detail.OnTheWayLocationCode).ConfigureAwait(false); + + toLocationDTO = await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); + + await RemovePackingCodeAndContainerCodeAndLotAsync(transferLog).ConfigureAwait(false); + break; + case EnumTransferRoute.SourceToDestination: + default: + throw new ArgumentOutOfRangeException(nameof(route), route, null); + } + } + else + { + fromLocationDTO = await _locationAppService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false); + toLocationDTO = await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); + } + + transferLog.FromLocationCode = fromLocationDTO.Code; + transferLog.FromLocationArea = fromLocationDTO.AreaCode; + transferLog.FromLocationErpCode = fromLocationDTO.ErpLocationCode; + transferLog.FromLocationGroup = fromLocationDTO.LocationGroupCode; + + transferLog.ToLocationCode = toLocationDTO.Code; + transferLog.ToLocationArea = toLocationDTO.AreaCode; + transferLog.ToLocationErpCode = toLocationDTO.ErpLocationCode; + transferLog.ToLocationGroup = toLocationDTO.LocationGroupCode; + transferLog.TransSubType = Enum.Parse(CoatingIssueNote.RequestType); + transferLog.TransType = TransType; + transferLog.DocNumber = CoatingIssueNote.Number; + transferLog.JobNumber = CoatingIssueNote.JobNumber; + + transferLogs.Add(transferLog); + } + + return transferLogs; + } + + private async Task RemovePackingCodeAndContainerCodeAndLotAsync(TransferLogEditInput transferLogCreateInput) + { + transferLogCreateInput.ToPackingCode = ""; + transferLogCreateInput.ToLot = ""; + transferLogCreateInput.ToContainerCode = ""; + + transferLogCreateInput.FromPackingCode = ""; + transferLogCreateInput.FromLot = ""; + transferLogCreateInput.FromContainerCode = ""; + + + } + +} From fe954d1143e04ab7f8a6b6ebb3823aeac6b14436 Mon Sep 17 00:00:00 2001 From: zhouhongjun <565221961@qq.com> Date: Tue, 2 Apr 2024 11:17:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=94=B6=E5=AE=B9=E5=99=A8=E6=A0=87?= =?UTF-8?q?=E5=8C=85=E9=87=8D=E5=86=99=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=9F=BA=E7=A1=80=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ItemContainers/ItemContainerAppService.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs index 79ff81b08..a7210b64c 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ItemContainers/ItemContainerAppService.cs @@ -5,10 +5,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Volo.Abp; using Volo.Abp.Caching; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Uow; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Domain; using Win_in.Sfs.Basedata.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Application; @@ -35,6 +39,33 @@ public class ItemContainerAppService _manager = manager; } + /// + /// 用来重写 新增实体 + /// + /// + /// + /// + [HttpPost("")] + [UnitOfWork] + public override async Task CreateAsync(ItemContainerEditInput input) + { + var existEntity = await _repository.FirstOrDefaultAsync(p=>p.ContainerCode==input.ContainerCode).ConfigureAwait(false); + if (existEntity != null) + { + throw new UserFriendlyException($"{input.ContainerCode} 已存在"); + } + + var itemBasic = await ItemBasicAppService.GetByCodeAsync(input.ItemCode).ConfigureAwait(false); + Check.NotNull(itemBasic, "物品代码", $"物品 {input.ItemCode} 不存在"); + if(itemBasic != null) + { + input.BasicUom = itemBasic.BasicUom; + } + + + return await base.CreateAsync(input).ConfigureAwait(false); + } + [HttpPost("upsert")] public virtual async Task UpsertAsync(ItemContainerEditInput input) {