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 ; }