唐明亮 2 years ago
parent
commit
d24156dc18
  1. 92
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountNotes/CountNoteAppService.cs
  2. 56
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/DeliverRequests/DeliverRequestFisAppService.cs
  3. 131
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs
  4. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs
  5. 89
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/PurchaseReturnRequests/PurchaseReturnRequestAppService.cs
  6. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Plans/SupplierAsns/SupplierAsnManager.cs
  7. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs
  8. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Orders/PurchaseOrderEventHandler.cs
  9. 23
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductReceiptNoteEventHandler.cs

92
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountNotes/CountNoteAppService.cs

@ -8,7 +8,6 @@ using Microsoft.EntityFrameworkCore;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
@ -18,11 +17,10 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
/// <summary> /// <summary>
/// 盘点记录 /// 盘点记录
/// </summary> /// </summary>
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}count-note")] [Route($"{StoreConsts.RootPath}count-note")]
public class CountNoteAppService : public class CountNoteAppService :
SfsStoreWithDetailsAppServiceBase<CountNote, SfsStoreWithDetailsAppServiceBase<CountNote,
CountNoteDTO, CountNoteDTO,
@ -41,7 +39,6 @@ public class CountNoteAppService :
public CountNoteAppService( public CountNoteAppService(
ICountNoteRepository repository, ICountNoteRepository repository,
ICountNoteManager countNoteManager, ICountNoteManager countNoteManager,
ICountPlanAppService countPlanAppService, ICountPlanAppService countPlanAppService,
ILocationAppService locationAppService, ILocationAppService locationAppService,
@ -56,24 +53,23 @@ public class CountNoteAppService :
#region 东阳 #region 东阳
/// <summary> /// <summary>
/// 用来重写 导入数据时可以加工数据 /// 用来重写 导入数据时可以加工数据
/// </summary> /// </summary>
/// <param name="dictionary"></param> /// <param name="dictionary"></param>
/// <returns></returns> /// <returns></returns>
protected override async Task<Dictionary<CountNote, EntityState>> ImportProcessingEntityAsync(Dictionary<CountNote, EntityState> dictionary) protected override async Task<Dictionary<CountNote, EntityState>> ImportProcessingEntityAsync(
Dictionary<CountNote, EntityState> dictionary)
{ {
var dataList = dictionary.Select(p => p.Key);//查询所有的导入盘点数据 var dataList = dictionary.Select(p => p.Key); //查询所有的导入盘点数据
var resultDictionary = new Dictionary<CountNote, EntityState>(); var resultDictionary = new Dictionary<CountNote, EntityState>();
var allCountPlanNumbersList= dataList.GroupBy(p => p.CountPlanNumber).Select(p => p.Key).ToList(); var allCountPlanNumbersList = dataList.GroupBy(p => p.CountPlanNumber).Select(p => p.Key).ToList();
//特殊处理 因为盘点记录可以重复导入 所以每次导入前删除调原有记录 //特殊处理 因为盘点记录可以重复导入 所以每次导入前删除调原有记录
foreach (var countPlanNumber in allCountPlanNumbersList) foreach (var countPlanNumber in allCountPlanNumbersList)
{ {
var countPlanDto = await _countPlanAppService.GetByNumberAsync(countPlanNumber).ConfigureAwait(false); var countPlanDto = await _countPlanAppService.GetByNumberAsync(countPlanNumber).ConfigureAwait(false);
if (countPlanDto.RequestType != CountPlanRequestType.Import) CheckCountPlanNumber(countPlanDto, countPlanNumber);
{ CheckCountPlanRequestType(countPlanDto);
throw new UserFriendlyException("非Excel盘点执行方式不能使用导入");
}
await _repository.DeleteAsync(p => p.CountPlanNumber == countPlanNumber).ConfigureAwait(false); await _repository.DeleteAsync(p => p.CountPlanNumber == countPlanNumber).ConfigureAwait(false);
} }
@ -81,40 +77,78 @@ public class CountNoteAppService :
{ {
countNote.Worker = CurrentUser.GetUserName(); countNote.Worker = CurrentUser.GetUserName();
countNote.CreatorId = CurrentUser.Id; countNote.CreatorId = CurrentUser.Id;
countNote.BeginTime= DateTime.Now; countNote.BeginTime = DateTime.Now;
countNote.Adjusted = false; countNote.Adjusted = false;
countNote.EndTime=DateTime.Now; countNote.EndTime = DateTime.Now;
countNote.Stage = EnumCountStage.Audit; countNote.Stage = EnumCountStage.Audit;
foreach (var detail in countNote.Details) foreach (var detail in countNote.Details)
{ {
var locationDto= await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false); var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
var itemcBasicDto=await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); var itemcBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
CheckLocation(locationDto, detail);
CheckItemBasic(itemcBasicDto, detail);
detail.CountLabel =Guid.NewGuid().ToString(); detail.CountLabel = Guid.NewGuid().ToString();
detail.LocationArea = locationDto.AreaCode; detail.LocationArea = locationDto.AreaCode;
detail.LocationGroup= locationDto.LocationGroupCode; detail.LocationGroup = locationDto.LocationGroupCode;
detail.LocationErpCode= locationDto.ErpLocationCode; detail.LocationErpCode = locationDto.ErpLocationCode;
detail.WarehouseCode= locationDto.WarehouseCode; detail.WarehouseCode = locationDto.WarehouseCode;
detail.ItemCode = itemcBasicDto.Code; detail.ItemCode = itemcBasicDto.Code;
detail.ItemDesc1 = itemcBasicDto.Desc1; detail.ItemDesc1 = itemcBasicDto.Desc1;
detail.ItemDesc2 = itemcBasicDto.Desc2; detail.ItemDesc2 = itemcBasicDto.Desc2;
detail.ItemName= itemcBasicDto.Name; detail.ItemName = itemcBasicDto.Name;
detail.Uom = itemcBasicDto.BasicUom; detail.Uom = itemcBasicDto.BasicUom;
} }
resultDictionary.Add(countNote,EntityState.Added); resultDictionary.Add(countNote, EntityState.Added);
} }
return resultDictionary; return resultDictionary;
} }
#region 校验
private static void CheckItemBasic(ItemBasicDTO itemcBasicDto, CountNoteDetail detail)
{
if (itemcBasicDto == null)
{
throw new UserFriendlyException($"物品代码为【{detail.LocationCode}】不存在");
}
}
private static void CheckLocation(LocationDTO locationDto, CountNoteDetail detail)
{
if (locationDto == null)
{
throw new UserFriendlyException($"库位代码为【{detail.LocationCode}】不存在");
}
}
private static void CheckCountPlanRequestType(CountPlanDTO countPlanDto)
{
if (countPlanDto.RequestType != CountPlanRequestType.Import)
{
throw new UserFriendlyException("非Excel盘点执行方式不能使用导入");
}
}
private static void CheckCountPlanNumber(CountPlanDTO countPlanDto, string countPlanNumber)
{
if (countPlanDto == null)
{
throw new UserFriendlyException($"盘点计划单号为【{countPlanNumber}】不存在");
}
}
#endregion
#endregion #endregion
/// <summary> /// <summary>
/// 新增接口 /// 新增接口
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
@ -129,7 +163,7 @@ public class CountNoteAppService :
} }
/// <summary> /// <summary>
/// 生成盘点调整申请 /// 生成盘点调整申请
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpPost("{id}/generate-adjust-request")] [HttpPost("{id}/generate-adjust-request")]
@ -150,11 +184,13 @@ public class CountNoteAppService :
protected override async Task<CountNote> GetEntityAsync(CountNoteImportInput importInput) protected override async Task<CountNote> GetEntityAsync(CountNoteImportInput importInput)
{ {
var countNote = await _repository.FirstOrDefaultAsync(t => t.CountPlanNumber == importInput.CountPlanNumber).ConfigureAwait(false); var countNote = await _repository.FirstOrDefaultAsync(t => t.CountPlanNumber == importInput.CountPlanNumber)
.ConfigureAwait(false);
if (countNote != null)//特殊处理 因为盘点记录可以重复导入 所以每次导入前删除调原有记录 if (countNote != null) //特殊处理 因为盘点记录可以重复导入 所以每次导入前删除调原有记录
{ {
var countplan = await _countPlanAppService.GetByNumberAsync(countNote.CountPlanNumber).ConfigureAwait(false); var countplan = await _countPlanAppService.GetByNumberAsync(countNote.CountPlanNumber)
.ConfigureAwait(false);
if (countplan != null) if (countplan != null)
{ {
@ -178,7 +214,7 @@ public class CountNoteAppService :
{ {
var groups = entites.Select(p => p.CountPlanNumber).GroupBy(p => p); var groups = entites.Select(p => p.CountPlanNumber).GroupBy(p => p);
if (entites.Any(p => p.Adjusted == true)) if (entites.Any(p => p.Adjusted))
{ {
throw new UserFriendlyException("库存已调整,不能导入"); throw new UserFriendlyException("库存已调整,不能导入");
} }

56
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/DeliverRequests/DeliverRequestFisAppService.cs

@ -86,6 +86,8 @@ public class DeliverRequestFisAppService :
foreach (var detail in itemTransformRequest.Details) foreach (var detail in itemTransformRequest.Details)
{ {
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detail.ItemCode);
var transactionType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Deliver, var transactionType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Deliver,
EnumTransSubType.Deliver_FIS) EnumTransSubType.Deliver_FIS)
.ConfigureAwait(false); .ConfigureAwait(false);
@ -100,16 +102,11 @@ public class DeliverRequestFisAppService :
Statuses = transactionType.OutInventoryStatuses Statuses = transactionType.OutInventoryStatuses
}).ConfigureAwait(false); }).ConfigureAwait(false);
CheckBalances(balances, transactionType, itemBasicDto, detail);
var balanceSumQty = balances.Sum(t => t.Qty); var balanceSumQty = balances.Sum(t => t.Qty);
if (balanceSumQty < detail.Qty) CheckBalancesSumQty(balanceSumQty, detail, transactionType);
{
throw new UserFriendlyException($"物料号 {detail.ItemCode} " +
$"在库位类型 {transactionType.OutLocationTypes.JoinAsString(",")}," +
$"库区 {detail.AreaCode} " +
$"状态 {transactionType.OutInventoryStatuses.JoinAsString(",")}" +
$"库存余额 {balanceSumQty} 小于 {detail.Qty}。");
}
detail.ItemDesc1 = itemBasicDto.Desc1; detail.ItemDesc1 = itemBasicDto.Desc1;
detail.ItemDesc2 = itemBasicDto.Desc2; detail.ItemDesc2 = itemBasicDto.Desc2;
@ -122,6 +119,49 @@ public class DeliverRequestFisAppService :
return dictionary; return dictionary;
} }
#region 校验
private static void CheckBalancesSumQty(decimal balanceSumQty, DeliverRequestDetail detail,
TransactionTypeDTO transactionType)
{
if (balanceSumQty < detail.Qty)
{
throw new UserFriendlyException($"物料号 {detail.ItemCode} " +
$"在库位类型 {transactionType.OutLocationTypes.JoinAsString(",")}," +
$"库区 {detail.AreaCode} " +
$"状态 {transactionType.OutInventoryStatuses.JoinAsString(",")}" +
$"库存余额 {balanceSumQty} 小于 {detail.Qty}。");
}
}
private static void CheckBalances(List<BalanceDTO> balances, TransactionTypeDTO transactionType, ItemBasicDTO itemBasicDto,
DeliverRequestDetail detail)
{
if (balances == null)
{
var sbLocationTypes = string.Empty;
transactionType.OutLocationTypes.ForEach(p => sbLocationTypes += " " + p.GetDisplayName() + " ");
var sbStatuses = string.Empty;
transactionType.OutInventoryStatuses.ForEach(p => sbLocationTypes += " " + p.GetDisplayName() + " ");
throw new UserFriendlyException(
$"没有物品代码为【{itemBasicDto.Code}】," +
$"数量为【{detail.Qty}】," +
$"出库库位类型为【{sbLocationTypes}】," +
$"区域为【{detail.AreaCode}】," +
$"出库可用状态为【{sbStatuses}】的可用的库存。");
}
}
private static void CheckItemBasic(ItemBasicDTO itemcBasicDto, string itemCode)
{
if (itemcBasicDto == null)
{
throw new UserFriendlyException($"物品代码为【{itemCode}】不存在");
}
}
#endregion
#endregion #endregion
[HttpPost("list")] [HttpPost("list")]

131
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs

@ -3,11 +3,11 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp; using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Label.Application.Contracts; using Win_in.Sfs.Label.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
@ -20,12 +20,14 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
/// <summary> /// <summary>
/// 回收料调整申请 /// 回收料调整申请
/// </summary> /// </summary>
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}item-transform-request")] [Route($"{StoreConsts.RootPath}item-transform-request")]
public class ItemTransformRequestAppService : public class ItemTransformRequestAppService :
SfsStoreRequestAppServiceBase<ItemTransformRequest, ItemTransformRequestDTO, SfsStoreRequestInputBase, ItemTransformRequestEditInput, ItemTransformRequestDetail, ItemTransformRequestDetailDTO, SfsStoreRequestInputBase, ItemTransformRequestImportInput>, SfsStoreRequestAppServiceBase<ItemTransformRequest, ItemTransformRequestDTO, SfsStoreRequestInputBase,
ItemTransformRequestEditInput, ItemTransformRequestDetail, ItemTransformRequestDetailDTO,
SfsStoreRequestInputBase, ItemTransformRequestImportInput>,
IItemTransformRequestAppService IItemTransformRequestAppService
{ {
private const EnumTransSubType SubType = EnumTransSubType.Item_Transform; private const EnumTransSubType SubType = EnumTransSubType.Item_Transform;
@ -45,25 +47,12 @@ public class ItemTransformRequestAppService :
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
} }
/// <summary>
/// 新增方法
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("")]
public override async Task<ItemTransformRequestDTO> CreateAsync(ItemTransformRequestEditInput input)
{
var entity = ObjectMapper.Map<ItemTransformRequestEditInput, ItemTransformRequest>(input);
await _manager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<ItemTransformRequest, ItemTransformRequestDTO>(entity);
return dto; #region 东阳
}
protected override async Task<Dictionary<ItemTransformRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<ItemTransformRequest, EntityState> dictionary) protected override async Task<Dictionary<ItemTransformRequest, EntityState>> ImportProcessingEntityAsync(
Dictionary<ItemTransformRequest, EntityState> dictionary)
{ {
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key); var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
@ -73,13 +62,27 @@ public class ItemTransformRequestAppService :
itemTransformRequest.CreatorId = CurrentUser.Id; itemTransformRequest.CreatorId = CurrentUser.Id;
foreach (var detail in itemTransformRequest.Details) foreach (var detail in itemTransformRequest.Details)
{ {
var fromLocationDto= await LocationAclService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false); var fromLocationDto =
var toLocationDto= await LocationAclService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); await LocationAclService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false);
var fromItemBasicDto=await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); CheckLocation(fromLocationDto, detail.FromLocationCode);
var toLocationDto =
await LocationAclService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detail.ToLocationCode);
var fromItemBasicDto = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
CheckItemBasic(fromItemBasicDto, detail.ItemCode);
var toItemBasicDto = await ItemBasicAclService.GetByCodeAsync(detail.ToItemCode).ConfigureAwait(false); var toItemBasicDto = await ItemBasicAclService.GetByCodeAsync(detail.ToItemCode).ConfigureAwait(false);
var balanceDto= await _balanceAppService.GetByItemLocationAndPackingAsync(detail.FromPackingCode, detail.ItemCode, CheckItemBasic(toItemBasicDto, detail.ToItemCode);
var balanceDto = await _balanceAppService.GetByItemLocationAndPackingAsync(detail.FromPackingCode,
detail.ItemCode,
detail.FromLocationCode).ConfigureAwait(false); detail.FromLocationCode).ConfigureAwait(false);
var inventoryLabelDto= await _inventoryLabelAppService.GetByCodeAsync(detail.ToPackingCode).ConfigureAwait(false);
var inventoryLabelDto = await _inventoryLabelAppService.GetByCodeAsync(detail.ToPackingCode)
.ConfigureAwait(false);
CheckLabel(inventoryLabelDto, detail);
detail.FromLocationArea = fromLocationDto.AreaCode; detail.FromLocationArea = fromLocationDto.AreaCode;
detail.FromLocationErpCode = fromLocationDto.ErpLocationCode; detail.FromLocationErpCode = fromLocationDto.ErpLocationCode;
@ -100,8 +103,8 @@ public class ItemTransformRequestAppService :
detail.ToWarehouseCode = toLocationDto.WarehouseCode; detail.ToWarehouseCode = toLocationDto.WarehouseCode;
detail.ItemDesc1 = fromItemBasicDto.Desc1; detail.ItemDesc1 = fromItemBasicDto.Desc1;
detail.ItemDesc2= fromItemBasicDto.Desc2; detail.ItemDesc2 = fromItemBasicDto.Desc2;
detail.ItemName= fromItemBasicDto.Name; detail.ItemName = fromItemBasicDto.Name;
detail.Uom = fromItemBasicDto.BasicUom; detail.Uom = fromItemBasicDto.BasicUom;
detail.ToItemCode = toItemBasicDto.Code; detail.ToItemCode = toItemBasicDto.Code;
@ -112,11 +115,58 @@ public class ItemTransformRequestAppService :
} }
return dictionary; return dictionary;
}
#region 校验
private void CheckLabel(InventoryLabelDto inventoryLabelDto, ItemTransformRequestDetail detail)
{
if (inventoryLabelDto == null)
{
throw new UserFriendlyException($"标签箱码为【{detail.ToPackingCode}】不存在");
}
}
private void CheckItemBasic(ItemBasicDTO ItemBasicDto, string itemCode)
{
if (ItemBasicDto == null)
{
throw new UserFriendlyException($"物品代码为【{itemCode}】不存在");
}
}
private void CheckLocation(LocationDTO LocationDto, string LocationCode)
{
if (LocationDto == null)
{
throw new UserFriendlyException($"库位代码为【{LocationCode}】不存在");
}
}
#endregion
#endregion
/// <summary>
/// 新增方法
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("")]
public override async Task<ItemTransformRequestDTO> CreateAsync(ItemTransformRequestEditInput input)
{
var entity = ObjectMapper.Map<ItemTransformRequestEditInput, ItemTransformRequest>(input);
await _manager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<ItemTransformRequest, ItemTransformRequestDTO>(entity);
return dto;
} }
protected virtual async Task ImportDataAsync(List<ItemTransformRequest> entites, List<ItemTransformRequest> deleteEntities) protected virtual async Task ImportDataAsync(List<ItemTransformRequest> entites,
List<ItemTransformRequest> deleteEntities)
{ {
await _manager.ImportDataAsync(entites, deleteEntities).ConfigureAwait(false); await _manager.ImportDataAsync(entites, deleteEntities).ConfigureAwait(false);
} }
@ -126,7 +176,9 @@ public class ItemTransformRequestAppService :
return t => t.Worker; return t => t.Worker;
} }
protected virtual async Task<(List<ItemTransformRequest> entites, List<ItemTransformRequest> deleteEntities)> BuildImportDataAsync(ImportResult<ItemTransformRequestImportInput> importResult, EnumImportMethod importMethod = EnumImportMethod.Update, bool isAllowPartImport = false) protected virtual async Task<(List<ItemTransformRequest> entites, List<ItemTransformRequest> deleteEntities)>
BuildImportDataAsync(ImportResult<ItemTransformRequestImportInput> importResult,
EnumImportMethod importMethod = EnumImportMethod.Update, bool isAllowPartImport = false)
{ {
if (importResult.Data.Any(t => t.ReportStatus == EnumImportReportStatus.Failed)) if (importResult.Data.Any(t => t.ReportStatus == EnumImportReportStatus.Failed))
{ {
@ -167,18 +219,21 @@ public class ItemTransformRequestAppService :
{ {
entity.SetId(exist.Id); entity.SetId(exist.Id);
} }
break; break;
case EnumImportMethod.Replace: case EnumImportMethod.Replace:
if (exist != null) if (exist != null)
{ {
deleteEntites.Add(exist); deleteEntites.Add(exist);
} }
break; break;
} }
foreach (var inputDetail in inputDetails) foreach (var inputDetail in inputDetails)
{ {
var detail = ObjectMapper.Map<ItemTransformRequestImportInput, ItemTransformRequestDetail>(inputDetail); var detail =
ObjectMapper.Map<ItemTransformRequestImportInput, ItemTransformRequestDetail>(inputDetail);
await SetDetailPropertiesAsync(detail, input).ConfigureAwait(false); await SetDetailPropertiesAsync(detail, input).ConfigureAwait(false);
entity.AddDetail(detail); entity.AddDetail(detail);
@ -191,7 +246,8 @@ public class ItemTransformRequestAppService :
return (entites, deleteEntites); return (entites, deleteEntites);
} }
private async Task SetDetailPropertiesAsync(ItemTransformRequestDetail detail, ItemTransformRequestImportInput input) private async Task SetDetailPropertiesAsync(ItemTransformRequestDetail detail,
ItemTransformRequestImportInput input)
{ {
var balanceDTO = await BalanceAclService.GetByPackingCodeAsync(detail.FromPackingCode).ConfigureAwait(false); var balanceDTO = await BalanceAclService.GetByPackingCodeAsync(detail.FromPackingCode).ConfigureAwait(false);
var toItemBasicDTO = await ItemBasicAclService.GetByCodeAsync(detail.ToItemCode).ConfigureAwait(false); var toItemBasicDTO = await ItemBasicAclService.GetByCodeAsync(detail.ToItemCode).ConfigureAwait(false);
@ -223,7 +279,8 @@ public class ItemTransformRequestAppService :
private async Task SetEntityPropertiesAsync(ItemTransformRequest entity, ItemTransformRequestImportInput input) private async Task SetEntityPropertiesAsync(ItemTransformRequest entity, ItemTransformRequestImportInput input)
{ {
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Adjust, SubType).ConfigureAwait(false); var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Adjust, SubType)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在"); Check.NotNull(tranType, "事务类型", "事务类型不存在");
@ -234,7 +291,8 @@ public class ItemTransformRequestAppService :
entity.DirectCreateNote = tranType.DirectCreateNote; entity.DirectCreateNote = tranType.DirectCreateNote;
} }
protected virtual async Task CheckImportInputBusinessAsync(ItemTransformRequestImportInput importInput, EnumImportMethod importMethod, List<ValidationResult> validationRresult) protected virtual async Task CheckImportInputBusinessAsync(ItemTransformRequestImportInput importInput,
EnumImportMethod importMethod, List<ValidationResult> validationRresult)
{ {
//await base.CheckImportInputBusinessAsync(importInput, importMethod); //await base.CheckImportInputBusinessAsync(importInput, importMethod);
@ -298,15 +356,16 @@ public class ItemTransformRequestAppService :
var label = await _inventoryLabelAppService.GetByCodeAsync(packingCode).ConfigureAwait(false); var label = await _inventoryLabelAppService.GetByCodeAsync(packingCode).ConfigureAwait(false);
if (label != null) if (label != null)
{ {
var inventory = await BalanceAclService.GetListByPackingCodesAsync(new List<string> { packingCode }).ConfigureAwait(false); var inventory = await BalanceAclService.GetListByPackingCodesAsync(new List<string> { packingCode })
.ConfigureAwait(false);
if (inventory.Count > 0) if (inventory.Count > 0)
{ {
validationRresult.Add("库存余额已存在", $"库存余额已存在,请重新打印标签并导入。"); validationRresult.Add("库存余额已存在", "库存余额已存在,请重新打印标签并导入。");
} }
} }
else else
{ {
validationRresult.Add("标签不存在", $"标签不存在,请重新打印标签并导入。"); validationRresult.Add("标签不存在", "标签不存在,请重新打印标签并导入。");
} }
} }
} }

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs

@ -86,7 +86,10 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
foreach (var detail in materialRequest.Details) foreach (var detail in materialRequest.Details)
{ {
var locationDto= await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); var locationDto= await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false);
CheckLocation(locationDto,detail.ToLocationCode);
var itemBasicDto=await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); var itemBasicDto=await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto,detail.ItemCode);
detail.ToLocationArea = locationDto.AreaCode; detail.ToLocationArea = locationDto.AreaCode;
detail.ToLocationErpCode = locationDto.ErpLocationCode; detail.ToLocationErpCode = locationDto.ErpLocationCode;
@ -109,6 +112,27 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
return ObjectMapper.Map<MaterialRequest, MaterialRequestDTO>(entity); return ObjectMapper.Map<MaterialRequest, MaterialRequestDTO>(entity);
} }
#region 校验
private void CheckItemBasic(ItemBasicDTO ItemBasicDto, string itemCode)
{
if (ItemBasicDto == null)
{
throw new UserFriendlyException($"物品代码为【{itemCode}】不存在");
}
}
private void CheckLocation(LocationDTO LocationDto, string LocationCode)
{
if (LocationDto == null)
{
throw new UserFriendlyException($"库位代码为【{LocationCode}】不存在");
}
}
#endregion
#endregion #endregion
[HttpPost("")] [HttpPost("")]

89
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/PurchaseReturnRequests/PurchaseReturnRequestAppService.cs

@ -38,19 +38,22 @@ public class PurchaseReturnRequestAppService :
private readonly ITransactionTypeAppService _transactionTypeAppService; private readonly ITransactionTypeAppService _transactionTypeAppService;
private readonly IPurchaseReturnRequestManager _purchaseReturnRequestManager; private readonly IPurchaseReturnRequestManager _purchaseReturnRequestManager;
private readonly IPurchaseOrderAppService _purchaseOrderAppService; private readonly IPurchaseOrderAppService _purchaseOrderAppService;
private readonly IBalanceAppService _balanceAppService;
public PurchaseReturnRequestAppService( public PurchaseReturnRequestAppService(
IPurchaseReturnRequestRepository repository, IPurchaseReturnRequestRepository repository,
IPurchaseReturnRequestManager purchaseReturnRequestManager, IPurchaseReturnRequestManager purchaseReturnRequestManager,
IInventoryLabelAppService inventoryLabelApp, IInventoryLabelAppService inventoryLabelApp,
ILocationAppService locationAppService, ILocationAppService locationAppService,
ITransactionTypeAppService transactionTypeAppService, ITransactionTypeAppService transactionTypeAppService,
IPurchaseOrderAppService purchaseOrderAppService) : base(repository, purchaseReturnRequestManager) IPurchaseOrderAppService purchaseOrderAppService,
IBalanceAppService balanceAppService) : base(repository, purchaseReturnRequestManager)
{ {
_purchaseReturnRequestManager = purchaseReturnRequestManager; _purchaseReturnRequestManager = purchaseReturnRequestManager;
_inventoryLabelApp = inventoryLabelApp; _inventoryLabelApp = inventoryLabelApp;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transactionTypeAppService = transactionTypeAppService; _transactionTypeAppService = transactionTypeAppService;
_purchaseOrderAppService = purchaseOrderAppService; _purchaseOrderAppService = purchaseOrderAppService;
_balanceAppService = balanceAppService;
base.CreatePolicyName = PurchaseReturnRequestPermissions.Create; base.CreatePolicyName = PurchaseReturnRequestPermissions.Create;
base.UpdatePolicyName = PurchaseReturnRequestPermissions.Update; base.UpdatePolicyName = PurchaseReturnRequestPermissions.Update;
@ -97,11 +100,18 @@ public class PurchaseReturnRequestAppService :
{ {
//通过箱标签 查找标签服务 构造其他字段 //通过箱标签 查找标签服务 构造其他字段
var labelDto = await _inventoryLabelApp.GetByCodeAsync(detail.PackingCode).ConfigureAwait(false); var labelDto = await _inventoryLabelApp.GetByCodeAsync(detail.PackingCode).ConfigureAwait(false);
var balanceDto = await BalanceAclService.GetByPackingCodeAsync(detail.PackingCode).ConfigureAwait(false); CheckLabel(labelDto, detail);
var balanceDto = await _balanceAppService.GetByPackingCodeAsync(detail.PackingCode).ConfigureAwait(false);
CheckBalance(balanceDto, detail);
var locationDto= await _locationAppService.GetByCodeAsync(balanceDto.LocationCode).ConfigureAwait(false); var locationDto= await _locationAppService.GetByCodeAsync(balanceDto.LocationCode).ConfigureAwait(false);
var purchaseOrderDto= await _purchaseOrderAppService.GetByNumberAsync(labelDto.PoNumber).ConfigureAwait(false); CheckLocation(locationDto, balanceDto);
purchaseOrderDto = await _purchaseOrderAppService.GetAsync(purchaseOrderDto.Id).ConfigureAwait(false);
var purchaseOrderDto = await _purchaseOrderAppService.GetByNumberAsync(labelDto.PoNumber).ConfigureAwait(false);
purchaseOrderDto = await _purchaseOrderAppService.GetAsync(purchaseOrderDto.Id).ConfigureAwait(false);
CheckPurchaseOrder(purchaseOrderDto, labelDto);
purchaseReturnRequest.AsnNumber = labelDto.AsnNumber; purchaseReturnRequest.AsnNumber = labelDto.AsnNumber;
purchaseReturnRequest.RpNumber = labelDto.RpNumber; purchaseReturnRequest.RpNumber = labelDto.RpNumber;
purchaseReturnRequest.ReturnTime=DateTime.Now; purchaseReturnRequest.ReturnTime=DateTime.Now;
@ -182,11 +192,78 @@ public class PurchaseReturnRequestAppService :
if (purchaseOrderDto != null) if (purchaseOrderDto != null)
{ {
detail.PoLine = var purchaseOrderDetailDto=purchaseOrderDto.Details.FirstOrDefault(p => p.ItemCode == balanceDto.ItemCode && p.Lot == balanceDto.Lot);
purchaseOrderDto.Details.FirstOrDefault(p => p.ItemCode == balanceDto.ItemCode && p.Lot == balanceDto.Lot).PoLine; if (purchaseOrderDetailDto == null)
{
purchaseOrderDetailDto =
purchaseOrderDto.Details.FirstOrDefault(p => p.ItemCode == balanceDto.ItemCode);
}
if (purchaseOrderDetailDto == null)
{
throw new UserFriendlyException($"未找到物品代码为【{balanceDto.ItemCode}】,批次为【{balanceDto.Lot}】的订单详情");
}
detail.PoLine = purchaseOrderDetailDto.PoLine;
}
}
#region 校验
private void CheckPurchaseOrder(PurchaseOrderDTO purchaseOrderDto, InventoryLabelDto labelDto)
{
if (purchaseOrderDto == null)
{
throw new UserFriendlyException($"采购订单编号为【{labelDto.PoNumber}】不存在");
} }
} }
/// <summary>
/// 校验库位
/// </summary>
/// <param name="locationDto"></param>
/// <param name="balanceDto"></param>
/// <exception cref="UserFriendlyException"></exception>
private void CheckLocation(LocationDTO locationDto, BalanceDTO balanceDto)
{
if (locationDto == null)
{
throw new UserFriendlyException($"库位为【{balanceDto.LocationCode}】不存在");
}
}
/// <summary>
/// 校验库存
/// </summary>
/// <param name="balanceDto"></param>
/// <param name="detail"></param>
/// <exception cref="UserFriendlyException"></exception>
private void CheckBalance(BalanceDTO balanceDto, PurchaseReturnRequestDetail detail)
{
if (balanceDto == null)
{
throw new UserFriendlyException($"箱码为【{detail.PackingCode}】不存在");
}
}
/// <summary>
/// 校验标签
/// </summary>
/// <param name="labelDto"></param>
/// <param name="detail"></param>
/// <exception cref="UserFriendlyException"></exception>
private void CheckLabel(InventoryLabelDto labelDto, PurchaseReturnRequestDetail detail)
{
if (labelDto == null)
{
throw new UserFriendlyException($"标签为【{detail.PackingCode}】不存在");
}
}
#endregion
#endregion #endregion
#region 校验 #region 校验

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Plans/SupplierAsns/SupplierAsnManager.cs

@ -1,7 +1,12 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Label.Application.Contracts;
using Win_in.Sfs.Label.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
@ -14,10 +19,14 @@ public class SupplierAsnManager : SfsStoreManagerBase<SupplierAsn, SupplierAsnDe
{ {
_repository = repository; _repository = repository;
} }
#region 东阳使用
#endregion
[UnitOfWork] [UnitOfWork]
public override async Task<SupplierAsn> CreateAsync(SupplierAsn entity) public override async Task<SupplierAsn> CreateAsync(SupplierAsn entity)
{ {
if (!string.IsNullOrWhiteSpace(entity.Number))//考虑 接口过来的数据是有Number的 if (!string.IsNullOrWhiteSpace(entity.Number))//接口过来的数据是有Number的
{ {
entity.SetIdAndNumberWithDetails(GuidGenerator, entity.Number); entity.SetIdAndNumberWithDetails(GuidGenerator, entity.Number);
entity = await Repository.InsertAsync(entity).ConfigureAwait(false); entity = await Repository.InsertAsync(entity).ConfigureAwait(false);
@ -86,7 +95,6 @@ public class SupplierAsnManager : SfsStoreManagerBase<SupplierAsn, SupplierAsnDe
// await PublishSupplierAsnAsync(entity); // await PublishSupplierAsnAsync(entity);
//} //}
} }
private async Task SetDetailAsync(List<SupplierAsnDetail> details) private async Task SetDetailAsync(List<SupplierAsnDetail> details)
{ {
foreach (var detail in details) foreach (var detail in details)

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs

@ -85,7 +85,7 @@ public class MaterialRequestManager
var issueJobs = await _issueJobRepository.GetListAsync(t => t.MaterialRequestNumber == materialRequest.Number).ConfigureAwait(false); var issueJobs = await _issueJobRepository.GetListAsync(t => t.MaterialRequestNumber == materialRequest.Number).ConfigureAwait(false);
if (issueJobs.Count > 0) if (issueJobs.Count > 0)
{ {
if (issueJobs.All(t => t.JobStatus == EnumJobStatus.Done || t.JobStatus == EnumJobStatus.Closed || t.JobStatus == EnumJobStatus.Cancelled)) if (issueJobs.All(t => t.JobStatus is EnumJobStatus.Done or EnumJobStatus.Closed or EnumJobStatus.Cancelled))
{ {
if (materialRequest.Details.All(p => p.ReceivedQty >= p.Qty)) if (materialRequest.Details.All(p => p.ReceivedQty >= p.Qty))
{ {

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Orders/PurchaseOrderEventHandler.cs

@ -267,15 +267,18 @@ public class PurchaseOrderEventHandler
SupplierItemDTO supplierItemDto) SupplierItemDTO supplierItemDto)
{ {
if (itemBasicDto == null) if (itemBasicDto == null)
{
throw new UserFriendlyException($"【{itemBasicDto.Code}】物品不存在");
}
if (supplierDto == null) if (supplierDto == null)
{ {
throw new UserFriendlyException($"{supplierAsn.SupplierCode}供应商为空"); throw new UserFriendlyException($"{supplierAsn.SupplierCode}供应商为空");
} }
if (supplierItemDto == null) if (supplierItemDto == null)
{ {
throw new UserFriendlyException($"{supplierAsn.SupplierCode}供应商零件或{itemBasicDto.Code}零件信息为空"); throw new UserFriendlyException($"{supplierAsn.SupplierCode}供应商零件或{itemBasicDto.Code}零件信息为空");
} }
var inputLabel = new InventoryLabelEditInput(); var inputLabel = new InventoryLabelEditInput();

23
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductReceiptNoteEventHandler.cs

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
@ -76,15 +77,27 @@ public class ProductReceiptNoteEventHandler
var transaction = ObjectMapper.Map<ProductReceiptNoteDetail, TransactionEditInput>(detail); var transaction = ObjectMapper.Map<ProductReceiptNoteDetail, TransactionEditInput>(detail);
var itemBasicDto= await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); var itemBasicDto= await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
; var locationDtos = await _locationAppService.GetListByTypesAndErpCodeAsync(
new List<EnumLocationType> { EnumLocationType.WIP },
detail.LocationErpCode).ConfigureAwait(false);
if (locationDtos == null)
{
throw new UserFriendlyException(
$"Erp储位为【{detail.LocationErpCode}】,库位类型为{EnumLocationType.WIP.GetDisplayName()}的库位不存在。");
}
if (itemBasicDto == null)
{
throw new UserFriendlyException(
$"物品编号为【{detail.ItemCode}】不存在。");
}
detail.ItemDesc1 = itemBasicDto.Desc1; detail.ItemDesc1 = itemBasicDto.Desc1;
detail.ItemDesc2 = itemBasicDto.Desc2; detail.ItemDesc2 = itemBasicDto.Desc2;
detail.ItemName=itemBasicDto.Name; detail.ItemName=itemBasicDto.Name;
detail.StdPackQty=itemBasicDto.StdPackQty; detail.StdPackQty=itemBasicDto.StdPackQty;
var erpLocationDto = locationDtos.First();
var erpLocationDtos= await _locationAppService.GetListByTypesAndErpCodeAsync(new List<EnumLocationType> { EnumLocationType.WIP },
detail.LocationErpCode).ConfigureAwait(false);
var erpLocationDto = erpLocationDtos.First();
detail.LocationArea = erpLocationDto.Code; detail.LocationArea = erpLocationDto.Code;
detail.LocationGroup = erpLocationDto.LocationGroupCode; detail.LocationGroup = erpLocationDto.LocationGroupCode;
detail.LocationErpCode= erpLocationDto.Code; detail.LocationErpCode= erpLocationDto.Code;

Loading…
Cancel
Save