diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Dapper.Fawtyg.Tyrp/DataExchangeDapperFawtygModule.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Dapper.Fawtyg.Tyrp/DataExchangeDapperFawtygModule.cs
index 3f263033a..7012a79d3 100644
--- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Dapper.Fawtyg.Tyrp/DataExchangeDapperFawtygModule.cs
+++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Dapper.Fawtyg.Tyrp/DataExchangeDapperFawtygModule.cs
@@ -11,6 +11,7 @@ using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.Boms;
using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.Customers;
using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.Dictpjs;
using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.ErpLocationItems;
+using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.ErpLocations;
using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.InterfaceCalendars;
using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.Products;
using Win_in.Sfs.Wms.DataExchange.LinqToDB.Fawtyg.Tyrp.PurchasePrices;
diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp/ErpLocation/locmout.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp/ErpLocation/locmout.cs
index c71f0d524..c05205551 100644
--- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp/ErpLocation/locmout.cs
+++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp/ErpLocation/locmout.cs
@@ -5,11 +5,11 @@ namespace Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp;
public class locmout : Entity
{
///
- /// 库位
+ /// 储位
///
public string locmout_loc { get; set; }
///
- /// 库位类型
+ /// 储位类型
///
public string locmout_stat2 { get; set; }
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 57f53ce60..c979bbb94 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
@@ -606,6 +606,31 @@
物品代码
+
+
+ 代码
+
+
+
+
+ 名称
+
+
+
+
+ 描述
+
+
+
+
+ 类型
+
+
+
+
+ 仓库代码
+
+
是否可用
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/DTOs/ErpLocationItemDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/DTOs/ErpLocationItemDTO.cs
new file mode 100644
index 000000000..2876b32c7
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/DTOs/ErpLocationItemDTO.cs
@@ -0,0 +1,25 @@
+using System.ComponentModel.DataAnnotations;
+using Win_in.Sfs.Shared.Domain;
+
+namespace Win_in.Sfs.Basedata.Application.Contracts;
+
+[Display(Name = "物料和储位对应关系")]
+
+public class ErpLocationItemDTO : SfsBaseDataDTOBase
+{
+ ///
+ /// 物料代码
+ ///
+ [Display(Name = "物料代码")]
+ [Required(ErrorMessage = "{0}是必填项")]
+ [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
+ public string ItemCode { get; set; }
+
+ ///
+ /// 储位代码
+ ///
+ [Display(Name = "储位代码")]
+ [Required(ErrorMessage = "{0}是必填项")]
+ [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
+ public string ErpLocationCode { get; set; }
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/ErpLocationItemPermissions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/ErpLocationItemPermissions.cs
new file mode 100644
index 000000000..9d992eb91
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/ErpLocationItemPermissions.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 ErpLocationItemPermissions
+{
+
+ public const string Default = BasedataPermissions.GroupName + "." + nameof(ErpLocationItem);
+ public const string Create = Default + "." + BasedataPermissions.CreateStr;
+ public const string Update = Default + "." + BasedataPermissions.UpdateStr;
+ public const string Delete = Default + "." + BasedataPermissions.DeleteStr;
+
+ public static void AddErpLocationItemPermission(this PermissionGroupDefinition permissionGroup)
+ {
+ var erpLocationItemPermission = permissionGroup.AddPermission(Default, BasedataPermissionDefinitionProvider.L(nameof(ErpLocationItem)));
+ erpLocationItemPermission.AddChild(Create, BasedataPermissionDefinitionProvider.L(BasedataPermissions.CreateStr));
+ erpLocationItemPermission.AddChild(Update, BasedataPermissionDefinitionProvider.L(BasedataPermissions.UpdateStr));
+ erpLocationItemPermission.AddChild(Delete, BasedataPermissionDefinitionProvider.L(BasedataPermissions.DeleteStr));
+ }
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/IErpLocationItemAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/IErpLocationItemAppService.cs
new file mode 100644
index 000000000..2023465c7
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/IErpLocationItemAppService.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 IErpLocationItemAppService : ISfsBaseDataAppServiceBase, ISfsUpsertAppService
+{
+ Task CheckItemErpLocationIsAvailable(string itemCode, string erpLocationCode);
+ Task> GetListByItemCodeAsync(string itemCode);
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemEditInput.cs
index 84af09533..b1146b608 100644
--- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemEditInput.cs
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemEditInput.cs
@@ -6,18 +6,21 @@ namespace Win_in.Sfs.Basedata.Application.Contracts;
public class ErpLocationItemEditInput : SfsBaseDataCreateOrUpdateInputBase
{
///
- /// 储位代码
+ /// 物料代码
///
- [Display(Name = "储位代码")]
+ [Display(Name = "物料代码")]
[Required(ErrorMessage = "{0}是必填项")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
- public string ErpLoactionCode { get; set; }
+ public string ItemCode { get; set; }
///
- /// 物料代码
+ /// 储位代码
///
- [Display(Name = "物料代码")]
+ [Display(Name = "储位代码")]
+ [Required(ErrorMessage = "{0}是必填项")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
- public string ItemCode { get; set; }
+ public string ErpLocationCode { get; set; }
+
+
}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemImportInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemImportInput.cs
new file mode 100644
index 000000000..90c39292e
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ErpLocationItems/Inputs/ErpLocationItemImportInput.cs
@@ -0,0 +1,27 @@
+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 ErpLocationItemImportInput : SfsBaseDataImportInputBase
+{
+ ///
+ /// 物料代码
+ ///
+ [Key]
+ [Display(Name = "物料代码")]
+ [Required(ErrorMessage = "{0}不能为空")]
+ [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
+ public string ItemCode { get; set; }
+
+ ///
+ /// 储位代码
+ ///
+ [Display(Name = "储位代码")]
+ [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
+ public string ErpLocationCode { get; set; }
+
+
+}
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 f4964079d..51e086b94 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.AddErpLocationItemPermission();
basedataGroup.AddItemContainerPermission();
basedataGroup.AddCategoryPermission();
basedataGroup.AddPositionCodePermission();
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/PositionCodePermissions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/PositionCodePermissions.cs
index 596671428..a8b3de088 100644
--- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/PositionCodePermissions.cs
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/PositionCodePermissions.cs
@@ -5,7 +5,6 @@ namespace Win_in.Sfs.Basedata.Application.Contracts;
public static class PositionCodePermissions
{
-
public const string Default = BasedataPermissions.GroupName + "." + nameof(PositionCode);
public const string Create = Default + "." + BasedataPermissions.CreateStr;
public const string Update = Default + "." + BasedataPermissions.UpdateStr;
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj
index 0cb41fd37..84d9de372 100644
--- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Win_in.Sfs.Basedata.Application.Contracts.csproj
@@ -25,8 +25,4 @@
-
-
-
-
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 703b60180..03ec64de1 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();
+ ErpLocationItemAutoMapperProfile();
ItemContainerAutoMapperProfile();
ItemStoreRelationAutoMapperProfile();
ItemSafetyStockAutoMapperProfile();
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ErpLocationItems/ErpLocationItemAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ErpLocationItems/ErpLocationItemAppService.cs
new file mode 100644
index 000000000..cb027a477
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ErpLocationItems/ErpLocationItemAppService.cs
@@ -0,0 +1,86 @@
+using System;
+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;
+using Volo.Abp.Caching;
+using Volo.Abp.Domain.Repositories;
+using Volo.Abp.ObjectMapping;
+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;
+
+[Authorize]
+[Route($"{BasedataConsts.RootPath}erplocation-item")]
+
+public class ErpLocationItemAppService
+ : SfsBaseDataAppServiceBase
+ , IErpLocationItemAppService
+{
+ private readonly IErpLocationItemManager _manager;
+ private new readonly IErpLocationItemRepository _repository;
+
+ public ErpLocationItemAppService(
+ IErpLocationItemRepository repository
+ , IDistributedCache cache
+ , IErpLocationItemManager manager
+ , IItemBasicAppService itemBasicAppService) : base(repository, cache)
+ {
+ base.CreatePolicyName = ErpLocationItemPermissions.Create;
+ base.UpdatePolicyName = ErpLocationItemPermissions.Update;
+ base.DeletePolicyName = ErpLocationItemPermissions.Delete;
+ _repository = repository;
+ _manager = manager;
+ }
+
+ ///
+ /// 检查物料和储位对应关系是否存在
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("check-item-erplocation-is-available")]
+ public virtual async Task CheckItemErpLocationIsAvailable(string itemCode,string erpLocationCode)
+ {
+ var entity = await _repository.FirstOrDefaultAsync(p => p.ItemCode == itemCode && p.ErpLocationCode== erpLocationCode).ConfigureAwait(false);
+
+ if (entity == null)
+ {
+ if (await SettingManager.IsTrueAsync(BasedataSettings.ErpLocationItem.NotFoundReturnInfinity).ConfigureAwait(false))
+ {
+
+ entity = new ErpLocationItem()
+ {
+ ItemCode = itemCode,
+ ErpLocationCode= erpLocationCode
+ };
+
+ }
+ }
+ var dto = ObjectMapper.Map(entity);
+ return dto;
+ }
+
+ [HttpPost("upsert")]
+ public virtual async Task UpsertAsync(ErpLocationItemEditInput 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;
+ }
+
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ErpLocationItems/ErpLocationItemAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ErpLocationItems/ErpLocationItemAutoMapperProfile.cs
new file mode 100644
index 000000000..a878e9cd4
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ErpLocationItems/ErpLocationItemAutoMapperProfile.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 ErpLocationItemAutoMapperProfile()
+ {
+ 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.Application/PositionCode/PositionCodeAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAppService.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAppService.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAutoMapperProfile.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAutoMapperProfile.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAutoMapperProfile.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/ErpLocationItem.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/ErpLocationItem.cs
new file mode 100644
index 000000000..c28ccc858
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/ErpLocationItem.cs
@@ -0,0 +1,21 @@
+using Win_in.Sfs.Shared.Domain;
+using Win_in.Sfs.Shared.Domain.Entities;
+
+namespace Win_in.Sfs.Basedata.Domain;
+
+public class ErpLocationItem : SfsBaseDataAggregateRootBase
+{
+ ///
+ /// 物料代码
+ ///
+ [IgnoreUpdate]
+ public string ItemCode { get; set; }
+
+ ///
+ /// 储位代码
+ ///
+ [IgnoreUpdate]
+ public string ErpLocationCode { get; set; }
+
+
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/ErpLocationItemManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/ErpLocationItemManager.cs
new file mode 100644
index 000000000..eeb08b3be
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/ErpLocationItemManager.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 ErpLocationItemManager : DomainService, IErpLocationItemManager
+{
+ private readonly IErpLocationItemRepository _repository;
+
+ private readonly IItemBasicRepository _itemBasicRepository;
+
+ public ErpLocationItemManager(IErpLocationItemRepository 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.Domain/ErpLocationItems/IErpLocationItemManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/IErpLocationItemManager.cs
new file mode 100644
index 000000000..32cec86c4
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/IErpLocationItemManager.cs
@@ -0,0 +1,9 @@
+using Volo.Abp.Domain.Services;
+using Win_in.Sfs.Shared.Domain;
+
+namespace Win_in.Sfs.Basedata.Domain;
+
+public interface IErpLocationItemManager : IDomainService, IBulkImportService
+{
+
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/IErpLocationItemRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/IErpLocationItemRepository.cs
new file mode 100644
index 000000000..309280a20
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/ErpLocationItems/IErpLocationItemRepository.cs
@@ -0,0 +1,9 @@
+using System.Threading.Tasks;
+using Win_in.Sfs.Shared.Domain;
+
+namespace Win_in.Sfs.Basedata.Domain;
+
+public interface IErpLocationItemRepository : ISfsBaseDataRepositoryBase, ISfsBulkRepositoryBase
+{
+ public Task UpsertAsync(ErpLocationItem entity);
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/IPositionCodeManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/IPositionCodeManager.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/IPositionCodeManager.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/IPositionCodeManager.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/IPositionCodeRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/IPositionCodeRepository.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/IPositionCodeRepository.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/IPositionCodeRepository.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCode.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/PositionCode.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCode.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/PositionCode.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCodeManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/PositionCodeManager.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCode/PositionCodeManager.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PositionCodes/PositionCodeManager.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Settings/BasedataSettings.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Settings/BasedataSettings.cs
index ef60e56e3..f7a0d9dd4 100644
--- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Settings/BasedataSettings.cs
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Settings/BasedataSettings.cs
@@ -10,7 +10,12 @@ public static class BasedataSettings
public const string LocationTypes = Default + "." + nameof(LocationTypes);
public const string NotFoundReturnInfinity = Default + "." + nameof(NotFoundReturnInfinity);
}
-
+ public static class ErpLocationItem
+ {
+ private const string Default = GroupName + "." + nameof(ErpLocationItem);
+ public const string LocationTypes = Default + "." + nameof(LocationTypes);
+ public const string NotFoundReturnInfinity = Default + "." + nameof(NotFoundReturnInfinity);
+ }
public static class ItemQuality
{
private const string Default = GroupName + "." + nameof(ItemQuality);
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 afd345a0e..d43aec3d1 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 ErpLocationItems { get; set; }
public DbSet ItemContainers { get; set; }
public DbSet ItemStoreRelations { get; set; }
public DbSet ItemSafetyStocks { 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 6b2cb3a9f..b3d8b50a5 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.ConfigureErpLocationItem(options);
builder.ConfigureItemContainer(options);
builder.ConfigureItemStoreRelation(options);
builder.ConfigureItemSafetyStock(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 117fa11d5..05750b3c9 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/ErpLocationItems/ErpLocationItemDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ErpLocationItems/ErpLocationItemDbContextModelCreatingExtensions.cs
new file mode 100644
index 000000000..6d80b5a98
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ErpLocationItems/ErpLocationItemDbContextModelCreatingExtensions.cs
@@ -0,0 +1,35 @@
+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 ErpLocationItemDbContextModelCreatingExtensions
+{
+ public static void ConfigureErpLocationItem(this ModelBuilder builder, BasedataModelBuilderConfigurationOptions options)
+ {
+ builder.Entity(b =>
+ {
+ //Configure table & schema name
+ b.ToTable(options.TablePrefix + nameof(ErpLocationItem), options.Schema);
+ //Configure ABP properties
+ b.ConfigureByConvention();
+ //Configure Sfs base properties
+ b.ConfigureSfsBase();
+
+ //Properties
+
+ b.Property(q => q.ItemCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
+ b.Property(q => q.ErpLocationCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
+
+
+ //Relations
+ //None
+
+ //Indexes
+ b.HasIndex(q => new { q.ItemCode, q.ErpLocationCode }).IsUnique();
+ });
+ }
+}
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ErpLocationItems/ErpLocationItemEfCoreRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ErpLocationItems/ErpLocationItemEfCoreRepository.cs
new file mode 100644
index 000000000..e6358853d
--- /dev/null
+++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/ErpLocationItems/ErpLocationItemEfCoreRepository.cs
@@ -0,0 +1,25 @@
+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 ErpLocationItemEfCoreRepository : SfsBaseDataEfCoreRepositoryBase, IErpLocationItemRepository, ISfsBulkRepositoryBase
+{
+ public ErpLocationItemEfCoreRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider)
+ {
+
+ }
+
+ public virtual async Task UpsertAsync(ErpLocationItem entity)
+ {
+ var dbSet = await GetDbSetAsync().ConfigureAwait(false);
+ var exist = await dbSet.FirstOrDefaultAsync(p => p.ItemCode == entity.ItemCode&&p.ErpLocationCode == entity.ErpLocationCode).ConfigureAwait(false);
+ if (exist == null)
+ {
+ var insRet = await InsertAsync(entity).ConfigureAwait(false);
+ }
+ }
+}
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 383cc21d4..8dcd0c307 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,7 @@ public interface IBasedataDbContext : IEfCoreDbContext
public DbSet ItemBasics { get; }
public DbSet ItemCategories { get; }
public DbSet ItemPacks { get; }
+ public DbSet ErpLocationItems { get; }
public DbSet ItemContainers { get; }
public DbSet PositionCodes { get; }
public DbSet ItemStoreRelations { get; }
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCode/PositionCodeDbContextModelCreatingExtensions.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCodes/PositionCodeDbContextModelCreatingExtensions.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCode/PositionCodeDbContextModelCreatingExtensions.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCodes/PositionCodeDbContextModelCreatingExtensions.cs
diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCode/PositionCodeEfCoreRepository.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCodes/PositionCodeEfCoreRepository.cs
similarity index 100%
rename from be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCode/PositionCodeEfCoreRepository.cs
rename to be/Modules/BaseData/src/Win_in.Sfs.Basedata.EntityFrameworkCore/PositionCodes/PositionCodeEfCoreRepository.cs
diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs
index cf9b64ad2..5eaf96cad 100644
--- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs
+++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs
@@ -29,6 +29,7 @@ public class BalanceManager : DomainService, IBalanceManager
private readonly IItemBasicAclService _itemBasicAclService;
private readonly ILocationAclService _locationAclService;
private readonly IItemStoreRelationAclService _itemStoreRelationAclService;
+ private readonly IErpLocationItemAppService _erpLocationItemAppService;
private readonly ISettingManager _settingManager;
private readonly IExpectInRepository _expectInRepository;
private readonly IExpectOutRepository _expectOutRepository;
@@ -41,6 +42,7 @@ public class BalanceManager : DomainService, IBalanceManager
, IExpectOutRepository expectOutRepository
, IItemStoreRelationAclService itemStoreRelationAclService
, ISettingManager settingManager
+ ,IErpLocationItemAppService erpLocationItemAppService
)
{
_objectMapper = objectMapper;
@@ -51,6 +53,7 @@ public class BalanceManager : DomainService, IBalanceManager
_itemStoreRelationAclService = itemStoreRelationAclService;
_settingManager = settingManager;
_expectOutRepository = expectOutRepository;
+ _erpLocationItemAppService= erpLocationItemAppService;
}
#region Modify
@@ -83,7 +86,8 @@ public class BalanceManager : DomainService, IBalanceManager
//检查是否存在物料存储关系
await CheckItemStoreRelationAsync(transaction, location).ConfigureAwait(false);
-
+ //校验开账信息
+ await CheckErpLocationItemAsync(transaction).ConfigureAwait(false);
//获取已存在库存
var existBalance = await GetFirstAsync(
transaction.PackingCode,
@@ -150,6 +154,21 @@ public class BalanceManager : DomainService, IBalanceManager
throw new UserFriendlyException($"未找到零件【{transaction.ItemCode}】与库位【{transaction.LocationCode}】的映射关系");
}
}
+ ///
+ /// 校验开账信息
+ ///
+ ///
+ ///
+ ///
+ private async Task CheckErpLocationItemAsync(Transaction transaction)
+ {
+ var erpLocationItem =await _erpLocationItemAppService.CheckItemErpLocationIsAvailable( transaction.ItemCode, transaction.LocationErpCode).ConfigureAwait(false);
+
+ if (erpLocationItem == null)
+ {
+ throw new UserFriendlyException($"未找到零件【{transaction.ItemCode}】与ERP储位【{transaction.LocationErpCode}】的开账信息");
+ }
+ }
///
/// 出库形式
@@ -178,6 +197,9 @@ public class BalanceManager : DomainService, IBalanceManager
//TODO 物品状态判断
item.CheckStatus(validStatusList: new List());
+ //校验开账信息
+ await CheckErpLocationItemAsync(transaction).ConfigureAwait(false);
+
var existBalance = await GetFirstAsync(
transaction.PackingCode,
transaction.ItemCode,
diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductionReturnNotes/ProductionReturnNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductionReturnNotes/ProductionReturnNoteAppService.cs
index 5202e5882..d7159cea3 100644
--- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductionReturnNotes/ProductionReturnNoteAppService.cs
+++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductionReturnNotes/ProductionReturnNoteAppService.cs
@@ -1,6 +1,10 @@
+using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
+using Volo.Abp;
+using Win_in.Sfs.Basedata.Application.Contracts;
+using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@@ -18,13 +22,19 @@ public class ProductionReturnNoteAppService :
IProductionReturnNoteAppService
{
private readonly IProductionReturnNoteManager _ProductionReturnNoteManager;
+ private readonly ILocationAppService _locationAppService;
+ private readonly IItemStoreRelationAppService _itemStoreRelationAppService;
public ProductionReturnNoteAppService(
IProductionReturnNoteRepository repository
, IProductionReturnNoteManager ProductionReturnNoteManager
- ) : base(repository)
+ , ILocationAppService locationAppService
+ , IItemStoreRelationAppService itemStoreRelationAppService
+ ) : base(repository)
{
_ProductionReturnNoteManager = ProductionReturnNoteManager;
+ _locationAppService = locationAppService;
+ _itemStoreRelationAppService = itemStoreRelationAppService;
}
///
@@ -42,6 +52,37 @@ public class ProductionReturnNoteAppService :
return dto;
}
+ ///
+ /// 新增实体(原材料生产退库)
+ ///
+ ///
+ ///
+ [HttpPost("create-yl")]
+ //[Authorize(ProductionReturnNotePermissions.Create)]
+ public async Task CreateYLAsync(ProductionReturnNoteEditInput input)
+ {
+ //校验目标库位
+ var locCodeLst = input.Details.Select(itm => itm.ToLocationCode).ToList();
+ var locLst = await _locationAppService.GetByCodesAsync(locCodeLst).ConfigureAwait(false);
+ bool allIsBCP = locLst.All(itm => itm.Type == EnumLocationType.RAW);
+ if (allIsBCP == false)
+ {
+ throw new UserFriendlyException("目标库位必须是原材料库位,不允许存在其它类型库位!");
+ }
+ //校验物料和库存关系
+ foreach (var item in input.Details)
+ {
+ var obj = await _itemStoreRelationAppService.GetFirstAsync(item.ItemCode, item.ToLocationCode).ConfigureAwait(false);
+ if (obj == null)
+ {
+ throw new UserFriendlyException($"物料{item.ItemCode}不能存在目标库位{item.ToLocationCode},物料库存关系表不存在!");
+ }
+ }
+ var entity = ObjectMapper.Map(input);
+ await _ProductionReturnNoteManager.CreateAsync(entity).ConfigureAwait(false);
+ var dto = ObjectMapper.Map(entity);
+ return dto;
+ }
}
diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAppService.cs
index c8756eb35..ffa0f0d7c 100644
--- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAppService.cs
+++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAppService.cs
@@ -33,7 +33,7 @@ public class ProductionReturnRequestAppService :
private readonly IItemBasicAppService _itemBasicAppService;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppservice;
-
+ private readonly IItemStoreRelationAppService _itemStoreRelationAppService;
@@ -45,8 +45,7 @@ public class ProductionReturnRequestAppService :
IItemBasicAppService itemBasicAppService,
ILocationAppService locationAppService,
IBalanceAppService _balanceAppservice
-
-
+ ,IItemStoreRelationAppService itemStoreRelationAppService
)
: base(repository, productionRequestReturnManager)
{
@@ -55,10 +54,13 @@ public class ProductionReturnRequestAppService :
_purchaseOrderApp = purchaseOrderApp;
_itemBasicAppService = itemBasicAppService;
_locationAppService = locationAppService;
+ _itemStoreRelationAppService = itemStoreRelationAppService;
}
///
- /// 【创建】生成退料申请
+ /// 【创建】生成退料申请(半成品生产退库)
+ /// 立库生产退库调用CreateLiKuAsync
+ /// 原材料生产退库调用ProductionReturnNote的CreateYLAsync
///
///
///
@@ -66,22 +68,75 @@ public class ProductionReturnRequestAppService :
//[Authorize(ProductionReturnRequestPermissions.Create)]
public override async Task CreateAsync(ProductionReturnRequestEditInput input)
{
-
-
-
-
-
- //SfsInventoryRequestInputBase sfsRequestInput = new SfsInventoryRequestInputBase();
- //sfsRequestInput.Condition
-
-
+ //校验目标库位
+ var locCodeLst = input.Details.Select(itm => itm.ToLocationCode).ToList();
+ var locLst = await _locationAppService.GetByCodesAsync(locCodeLst).ConfigureAwait(false);
+ bool allIsBCP = locLst.All(itm => itm.Type == EnumLocationType.SEMI);
+ if (allIsBCP == false)
+ {
+ throw new UserFriendlyException("目标库位必须是半成品库位,不允许存在其它类型库位!");
+ }
+ //校验物料和库存关系
+ foreach (var item in input.Details)
+ {
+ var obj = await _itemStoreRelationAppService.GetFirstAsync(item.ItemCode, item.ToLocationCode).ConfigureAwait(false);
+ if (obj == null)
+ {
+ throw new UserFriendlyException($"物料{item.ItemCode}不能存在目标库位{item.ToLocationCode},物料库存关系表不存在!");
+ }
+ }
+ var entity = ObjectMapper.Map(input);
+ //var subType = Enum.Parse(input.Type);
+ //var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.TransferLib, subType).ConfigureAwait(false);
+ //entity.Type = ((int)subType).ToString();
+ //entity.AutoCompleteJob = tranType.AutoCompleteJob;
+ //entity.AutoSubmit = tranType.AutoSubmitRequest;
+ //entity.AutoAgree = tranType.AutoAgreeRequest;
+ //entity.AutoHandle = tranType.AutoHandleRequest;
+ //entity.DirectCreateNote = tranType.DirectCreateNote;
+ await _productionReturnRequestManager.CreateAsync(entity).ConfigureAwait(false);
+ var dto = ObjectMapper.Map(entity);
+ return dto;
+ }
+ ///
+ /// 【创建】生成退料申请(立库生产退库)
+ ///
+ ///
+ ///
+ [HttpPost("create-liku")]
+ //[Authorize(ProductionReturnRequestPermissions.Create)]
+ public async Task CreateLiKuAsync(ProductionReturnRequestEditInput input)
+ {
+ //校验目标库位 //??没有立库类型
+ //var locCodeLst = input.Details.Select(itm => itm.ToLocationCode).ToList();
+ //var locLst = await _locationAppService.GetByCodesAsync(locCodeLst).ConfigureAwait(false);
+ //bool allIsBCP = locLst.All(itm => itm.Type == EnumLocationType.立库);
+ //if (allIsBCP == false)
+ //{
+ // throw new UserFriendlyException("目标库位必须是立库,不允许存在其它类型库位!");
+ //}
+ //校验物料和库存关系
+ foreach (var item in input.Details)
+ {
+ var obj = await _itemStoreRelationAppService.GetFirstAsync(item.ItemCode, item.ToLocationCode).ConfigureAwait(false);
+ if (obj == null)
+ {
+ throw new UserFriendlyException($"物料{item.ItemCode}不能存在目标库位{item.ToLocationCode},物料库存关系表不存在!");
+ }
+ }
var entity = ObjectMapper.Map(input);
-
+ //var subType = Enum.Parse(input.Type);
+ //var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.TransferLib, subType).ConfigureAwait(false);
+ //entity.Type = ((int)subType).ToString();
+ //entity.AutoCompleteJob = tranType.AutoCompleteJob;
+ //entity.AutoSubmit = tranType.AutoSubmitRequest;
+ //entity.AutoAgree = tranType.AutoAgreeRequest;
+ //entity.AutoHandle = tranType.AutoHandleRequest;
+ //entity.DirectCreateNote = tranType.DirectCreateNote;
await _productionReturnRequestManager.CreateAsync(entity).ConfigureAwait(false);
-
var dto = ObjectMapper.Map(entity);
return dto;
}
diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionReturnJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionReturnJobEventHandler.cs
index 4690c9f2d..656d006b3 100644
--- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionReturnJobEventHandler.cs
+++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionReturnJobEventHandler.cs
@@ -62,12 +62,23 @@ public class ProductionReturnJobEventHandler :
input.ReturnTime=DateTime.Now;
input.Details = new List();
-
- foreach (var detail in entity.Details.Where(detail => detail.HandledQty != 0))
+ foreach (var detail in entity.Details) //.Where(detail => detail.HandledQty != 0)
{
var inputDetail = ObjectMapper.Map(detail);
inputDetail.FromWarehouseCode = entity.WarehouseCode;
inputDetail.ToWarehouseCode = entity.WarehouseCode;
+
+ inputDetail.ToLocationArea = detail.HandledToLocationArea;
+ inputDetail.ToLocationCode = detail.HandledToLocationCode;
+ inputDetail.ToLocationErpCode = detail.HandledToLocationErpCode;
+ inputDetail.ToLocationGroup = detail.HandledToLocationGroup;
+ inputDetail.ToLot = detail.HandledLot;
+ inputDetail.ToPackingCode = detail.HandledPackingCode;
+ inputDetail.ToWarehouseCode = detail.HandledToWarehouseCode;
+ inputDetail.Qty = detail.HandledQty;
+ inputDetail.HandledQty = detail.HandledQty;
+ inputDetail.StdPackQty = detail.StdPackQty;
+ inputDetail.ToStatus = detail.Status;
input.Details.Add(inputDetail);
}
diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductionReturnRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductionReturnRequestEventHandler.cs
index b964e2940..12364bc6e 100644
--- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductionReturnRequestEventHandler.cs
+++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductionReturnRequestEventHandler.cs
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Forms;
using Omu.ValueInjecter;
using Volo.Abp.EventBus;
+using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
@@ -33,68 +34,65 @@ public class ProductionReturnRequestEventHandler
{
var entity = eventData.Entity;
- //CreateMap()
- // .ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number))
- // .ForMember(x => x.ReturnTime, y => y.MapFrom(d => d.CreationTime))
- // .ForMember(x => x.Worker, y => y.MapFrom(d => d.Worker))
- // .ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now))
- // .Ignore(x => x.Number);
- //CreateMap()
- // .ForMember(x => x.FromPackingCode, y => y.MapFrom(d => d.FromPackingCode))
- // .ForMember(x => x.ToPackingCode, y => y.MapFrom(d => d.ToPackingCode))
- // .ForMember(x => x.SupplierBatch, y => y.MapFrom(d => d.SupplierBatch))
- // .ForMember(x => x.ArriveDate, y => y.MapFrom(d => d.ArriveDate))
- // .ForMember(x => x.ProduceDate, y => y.MapFrom(d => d.ProduceDate))
- // .ForMember(x => x.ExpireDate, y => y.MapFrom(d => d.ExpireDate))
- // .ForMember(x => x.FromLot, y => y.MapFrom(d => string.Empty))
- // .ForMember(x => x.ToLot, y => y.MapFrom(d => d.ToLot))
- // .ForMember(x => x.ToContainerCode, y => y.MapFrom(d => d.ToContainerCode))
- // .ForMember(x => x.FromContainerCode, y => y.MapFrom(d => d.FromContainerCode))
- // .ForMember(x => x.FromStatus, y => y.MapFrom(d => d.FromStatus))
- // .ForMember(x => x.ToStatus, y => y.MapFrom(d => d.ToStatus))
- // .ForMember(x => x.Qty, y => y.MapFrom(d => d.Qty))
- // .ForMember(x => x.FromLocationCode, y => y.MapFrom(d => d.FromLocationCode))
- // .ForMember(x => x.FromLocationArea, y => y.MapFrom(d => d.ToLocationArea))
- // .ForMember(x => x.FromLocationGroup, y => y.MapFrom(d => d.ToLocationGroup))
- // .ForMember(x => x.FromLocationErpCode, y => y.MapFrom(d => d.ToLocationErpCode))
- // .ForMember(x => x.FromWarehouseCode, y => y.MapFrom(d => d.ToWarehouseCode))
- // .ForMember(x => x.Qty, y => y.MapFrom(d => d.Qty))
- // .Ignore(x => x.ArriveDate)
- // .Ignore(x => x.ToLocationCode)
- // .Ignore(x => x.ToLocationArea)
- // .Ignore(x => x.ToLocationGroup)
- // .Ignore(x => x.ToLocationErpCode)
- // .Ignore(x => x.ToWarehouseCode)
- // .Ignore(x => x.HandledContainerCode)
- // .Ignore(x => x.HandledPackingCode)
- // .Ignore(x => x.HandledToLocationCode)
- // .Ignore(x => x.HandledToLocationArea)
- // .Ignore(x => x.HandledToLocationGroup)
- // .Ignore(x => x.HandledToLocationErpCode)
- // .Ignore(x => x.HandledToWarehouseCode)
- // .Ignore(x => x.HandledExpireDate)
- // .Ignore(x => x.HandledLot)
- // .Ignore(x => x.HandledArriveDate)
- // .Ignore(x => x.HandledProduceDate)
- // .Ignore(x => x.HandledQty)
- // .Ignore(x => x.HandledSupplierBatch);
-
-
- ProductionReturnNoteEditInput input = new ProductionReturnNoteEditInput();
- input.InjectFrom(entity);
- input.ReturnTime = DateTime.Now;
- input.ActiveDate=DateTime.Now;
- input.JobNumber = input.Number;
- List inputdetail = new List();
- foreach (var itm in entity.Details)
+ if (entity.DirectCreateNote)
{
- ProductionReturnNoteDetailInput detail=new ProductionReturnNoteDetailInput();
- detail.InjectFrom(itm);
- inputdetail.Add(detail);
+ ProductionReturnNoteEditInput input = new ProductionReturnNoteEditInput();
+ input.InjectFrom(entity);
+ input.ReturnTime = DateTime.Now;
+ input.ActiveDate = DateTime.Now;
+ input.JobNumber = input.Number;
+ List inputdetail = new List();
+ foreach (var itm in entity.Details)
+ {
+ ProductionReturnNoteDetailInput detail = new ProductionReturnNoteDetailInput();
+ detail.InjectFrom(itm);
+ inputdetail.Add(detail);
+ }
+ input.Details = inputdetail.ToList();
+ //插入记录
+ await _productionReturnNoteApp.CreateAsync(input).ConfigureAwait(false);
}
- input.Details = inputdetail.ToList();
+ else
+ {
+ ProductionReturnJobEditInput input = new ProductionReturnJobEditInput();
+ input.InjectFrom(entity);
+ input.ProductionReturnRequestNumber = entity.Number;
+ input.JobType = EnumJobType.ProductionReturnJob;
+ input.JobStatus = EnumJobStatus.Open;
+ input.IsAutoComplete = entity.AutoCompleteJob;
+ List inputdetail = new List();
+ foreach (var itm in entity.Details)
+ {
+ ProductionReturnJobDetailInput detail = new ProductionReturnJobDetailInput();
+ detail.InjectFrom(itm);
- await _productionReturnNoteApp.CreateAsync(input).ConfigureAwait(false);
+ detail.RecommendToLocationArea = itm.ToLocationArea;
+ detail.RecommendToLocationCode = itm.ToLocationCode;
+ detail.RecommendToLocationErpCode = itm.ToLocationErpCode;
+ detail.RecommendToLocationGroup = itm.ToLocationGroup;
+ detail.RecommendToWarehouseCode = itm.ToWarehouseCode;
+ detail.RecommendLot = itm.ToLot;
+ detail.RecommendPackingCode = itm.ToPackingCode;
+ detail.RecommendQty = itm.Qty;
+
+ detail.HandledToLocationArea = itm.ToLocationArea;
+ detail.HandledToLocationCode = itm.ToLocationCode;
+ detail.HandledToLocationErpCode = itm.ToLocationErpCode;
+ detail.HandledToLocationGroup = itm.ToLocationGroup;
+ detail.HandledToWarehouseCode = itm.ToWarehouseCode;
+ detail.HandledLot = itm.ToLot;
+ detail.HandledPackingCode = itm.ToPackingCode;
+ detail.HandledQty = itm.Qty;
+ detail.StdPackQty = itm.StdPackQty;
+ detail.Status = itm.ToStatus;
+ inputdetail.Add(detail);
+ }
+ input.Details = inputdetail.ToList();
+ input.WarehouseCode = entity.Details.Count > 0 ? entity.Details[0].ToWarehouseCode : " ";
+ //插入任务
+ await _productionReturnJobApp.CreateAsync(input).ConfigureAwait(false);
+ }
+ entity.Complete();
}
public virtual async Task HandleEventAsync(SfsAbortedEntityEventData eventData)
diff --git a/build/src/docker/publish/conf/settings/appsettings.Development.json b/build/src/docker/publish/conf/settings/appsettings.Development.json
index 675ae449e..d575183e9 100644
--- a/build/src/docker/publish/conf/settings/appsettings.Development.json
+++ b/build/src/docker/publish/conf/settings/appsettings.Development.json
@@ -114,7 +114,8 @@
"BaseUrl": "http://dev.ccwin-in.com:60083/"
},
"BaseData": {
- "BaseUrl": "http://localhost:59094/"
+ //"BaseUrl": "http://localhost:59094/"
+ "BaseUrl": "http://dev.ccwin-in.com:60084/"
},
"Default": {
"BaseUrl": "http://dev.ccwin-in.com:60083/"