|
|
@ -42,7 +42,8 @@ public class UnplannedIssueJobAppService |
|
|
|
IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, |
|
|
|
ILocationAppService locationAppService, |
|
|
|
IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, |
|
|
|
IUnitOfWorkManager unitOfWorkManager, ILogger<UnplannedIssueJobAppService> logger, IItemBasicAppService itemBasicAppService) : base(repository, unplannedIssueJobManager) |
|
|
|
IUnitOfWorkManager unitOfWorkManager, ILogger<UnplannedIssueJobAppService> logger, |
|
|
|
IItemBasicAppService itemBasicAppService) : base(repository, unplannedIssueJobManager) |
|
|
|
{ |
|
|
|
_unplannedIssueJobManager = unplannedIssueJobManager; |
|
|
|
_locationAppService = locationAppService; |
|
|
@ -84,41 +85,15 @@ public class UnplannedIssueJobAppService |
|
|
|
{ |
|
|
|
List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>(); |
|
|
|
var jobs = await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false); |
|
|
|
//if (useBalancesOut.Count == 0)
|
|
|
|
//{
|
|
|
|
// throw new UserFriendlyException($"请求单号{requestDto.Number},无推荐库位请检查是否又库存!");
|
|
|
|
//}
|
|
|
|
|
|
|
|
foreach (var job in jobs) |
|
|
|
{ |
|
|
|
job.SetIdAndNumberWithDetails(GuidGenerator, job.Number); |
|
|
|
//await SendNotifyMessageAsync(job).ConfigureAwait(false);
|
|
|
|
} |
|
|
|
|
|
|
|
//await PublishCreatedAsync(jobs).ConfigureAwait(false);
|
|
|
|
await Repository.InsertManyAsync(jobs).ConfigureAwait(false); |
|
|
|
|
|
|
|
//await _unplannedIssueJobManager.AddManyAsync(jobs).ConfigureAwait(false);
|
|
|
|
//await _repository.InsertManyAsync(jobs.ToList()).ConfigureAwait(false);
|
|
|
|
|
|
|
|
var outEditInputs = await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false); |
|
|
|
//foreach (var itm in outEditInputs)
|
|
|
|
//{
|
|
|
|
// itm.JobNumber = first.Number;
|
|
|
|
//}
|
|
|
|
await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//public static string[] GetAllFields(Type type)
|
|
|
|
//{
|
|
|
|
// // 获取公共实例字段
|
|
|
|
// var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
|
|
|
|
|
|
|
|
// // 返回字段名称
|
|
|
|
// return fields.Select(f => f.Name).ToArray();
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
private async Task<Tuple<List<BalanceDTO>, List<BalanceDTO>>> DeductInventory(List<BalanceDTO> inventory, |
|
|
|
decimal quantityToDeduct, EnumLocationType enumLocationType) |
|
|
|
{ |
|
|
@ -142,7 +117,7 @@ public class UnplannedIssueJobAppService |
|
|
|
if (enumLocationType == EnumLocationType.RAW) |
|
|
|
{ |
|
|
|
undto.InjectFrom(item); |
|
|
|
|
|
|
|
|
|
|
|
undto.Qty = item.Qty; |
|
|
|
unbalanceDTOs.Add(undto); |
|
|
|
} |
|
|
@ -161,7 +136,7 @@ public class UnplannedIssueJobAppService |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var tuple = new Tuple<List<BalanceDTO>, List<BalanceDTO>>(balanceDTOs, unbalanceDTOs);//ITEM1整箱、
|
|
|
|
var tuple = new Tuple<List<BalanceDTO>, List<BalanceDTO>>(balanceDTOs, unbalanceDTOs); //ITEM1整箱、
|
|
|
|
|
|
|
|
|
|
|
|
// 返回实际扣减的库存数量
|
|
|
@ -173,120 +148,141 @@ public class UnplannedIssueJobAppService |
|
|
|
List<BalanceDTO> useBalancesOut) |
|
|
|
{ |
|
|
|
List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>(); |
|
|
|
var Errors = new List<string>(); |
|
|
|
|
|
|
|
foreach (var requestDtoDetail in requestDto.Details) //非计划领料明细
|
|
|
|
{ |
|
|
|
var locationCodes = await _locationAppService |
|
|
|
.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)) |
|
|
|
.ConfigureAwait(false); //获取存放库位
|
|
|
|
var locationDto = locationCodes.First(); |
|
|
|
|
|
|
|
if (locationCodes.Count == 0) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException("ERP库位没有对应WMS库位!"); |
|
|
|
} |
|
|
|
|
|
|
|
var first = locationCodes.FirstOrDefault(); |
|
|
|
var locationDto = await _locationAppService.GetByCodeAsync(first.Code).ConfigureAwait(false); |
|
|
|
var input = new RecommendBalanceRequestInput(); |
|
|
|
var job = new UnplannedIssueJob(); |
|
|
|
|
|
|
|
switch (locationDto.Type) |
|
|
|
{ |
|
|
|
case EnumLocationType.SEMI: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.CUST: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.FG: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.RAW: |
|
|
|
job.IsHasPackingCode = 1; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.THIRDPARTY: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.OUTSIDE: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.DimensionalStorehouse: |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
break; |
|
|
|
case EnumLocationType.KittingWip: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.WIP: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
job.ItemCode = requestDtoDetail.ItemCode; |
|
|
|
job.ItemName = requestDtoDetail.ItemName; |
|
|
|
job.ItemDesc1 = requestDtoDetail.ItemDesc1; |
|
|
|
job.ItemDesc2 = requestDtoDetail.ItemDesc2; |
|
|
|
job.FromErpLocationCode = requestDtoDetail.LocationErpCode; |
|
|
|
job.Qty = requestDtoDetail.Qty; |
|
|
|
job.SetId(GuidGenerator.Create()); |
|
|
|
job.UnplannedIssueRequestNumber = requestDto.Number; |
|
|
|
job.JobType = EnumJobType.UnplannedIssueJob; |
|
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
|
job.IsAutoComplete = false; |
|
|
|
job.DeptCode = requestDto.DeptCode; |
|
|
|
job.DeptName = requestDto.DeptName; |
|
|
|
job.Worker = "未执行"; |
|
|
|
job.OANumber = requestDto.OANumber; |
|
|
|
job.Number = await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true); |
|
|
|
job.Details = new List<UnplannedIssueJobDetail>(); |
|
|
|
job.FacDetails = new List<UnplannedIssueJobFacDetail>(); |
|
|
|
job.WarehouseCode = locationDto.WarehouseCode; |
|
|
|
job.BuildDate = DateTime.Now; |
|
|
|
|
|
|
|
var input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList() |
|
|
|
}; |
|
|
|
|
|
|
|
switch (locationDto.Type) |
|
|
|
{ |
|
|
|
case EnumLocationType.RAW: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = true |
|
|
|
}; |
|
|
|
input.IsPackingCode = true; |
|
|
|
job.IsHasPackingCode = 1; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.FG: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.DimensionalStorehouse: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.CUST: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.KittingWip: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.OUTSIDE: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.SEMI: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.WIP: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.THIRDPARTY: |
|
|
|
input = new RecommendBalanceRequestInput |
|
|
|
{ |
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
Locations = locationCodes.Select(p => p.Code).ToList(), |
|
|
|
IsPackingCode = false |
|
|
|
}; |
|
|
|
input.IsPackingCode = false; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); //获取推荐库存
|
|
|
|
|
|
|
|
|
|
|
|
usableList = usableList |
|
|
|
.OrderBy(p => p.Lot) |
|
|
|
.ThenBy(p => p.PutInTime) |
|
|
@ -296,114 +292,17 @@ public class UnplannedIssueJobAppService |
|
|
|
.ToList(); |
|
|
|
var usableList1 = usableList.Where(p => p.Qty > 0).ToList(); |
|
|
|
|
|
|
|
decimal qty = 0; |
|
|
|
//实际要用库存
|
|
|
|
var useBalances = new List<BalanceDTO>(); |
|
|
|
var returnlist = await DeductInventory(usableList1, requestDtoDetail.Qty, locationDto.Type) |
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
useBalances.AddRange(returnlist.Item1); |
|
|
|
|
|
|
|
|
|
|
|
//foreach (var balanceDto in usableList)
|
|
|
|
//{
|
|
|
|
// decimal availableToDeduct = Math.Min(balanceDto.Qty, balanceDto.Qty - qty);
|
|
|
|
// balanceDto.Qty -= availableToDeduct;
|
|
|
|
// qty += availableToDeduct;
|
|
|
|
// if (qty >= balanceDto.Qty)
|
|
|
|
// break;
|
|
|
|
// if (qty >= requestDtoDetail.Qty)
|
|
|
|
// {
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// if (qty + balanceDto.Qty > requestDtoDetail.Qty)
|
|
|
|
// {
|
|
|
|
// qty += requestDtoDetail.Qty - balanceDto.Qty;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// qty += balanceDto.Qty;
|
|
|
|
// }
|
|
|
|
// if (qty > 0)
|
|
|
|
// {
|
|
|
|
// useBalances.Add(balanceDto);
|
|
|
|
// useBalancesOut.Add(balanceDto);
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
if (returnlist.Item1.Count == 0) |
|
|
|
{ |
|
|
|
_logger.LogError( |
|
|
|
$"{"非生产领料" + requestDto.Number + "零件号:" + requestDtoDetail.ItemCode + "库存不够" + requestDtoDetail.Qty}"); |
|
|
|
// Errors.Add($"{"非生产领料"+requestDto.Number+"零件号:"+requestDtoDetail.ItemCode + "库存不够" + requestDtoDetail.Qty.ToString()}");
|
|
|
|
} |
|
|
|
|
|
|
|
if (useBalances.Count > 0) |
|
|
|
{ |
|
|
|
foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationErpCode)) |
|
|
|
{ |
|
|
|
//var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false);
|
|
|
|
var job = new UnplannedIssueJob(); |
|
|
|
|
|
|
|
|
|
|
|
switch (locationDto.Type) |
|
|
|
{ |
|
|
|
case EnumLocationType.CUST: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.FG: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.RAW: |
|
|
|
job.IsHasPackingCode = 1; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.THIRDPARTY: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.OUTSIDE: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
//------------------
|
|
|
|
case EnumLocationType.KittingWip: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.WIP: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.SEMI: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.DimensionalStorehouse: |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
job.ItemCode = requestDtoDetail.ItemCode; |
|
|
|
job.ItemName = requestDtoDetail.ItemName; |
|
|
|
job.ItemDesc1 = requestDtoDetail.ItemDesc1; |
|
|
|
job.ItemDesc2 = requestDtoDetail.ItemDesc2; |
|
|
|
job.FromErpLocationCode = requestDtoDetail.LocationErpCode; |
|
|
|
job.Qty = requestDtoDetail.Qty; |
|
|
|
|
|
|
|
|
|
|
|
job.SetId(GuidGenerator.Create()); |
|
|
|
job.UnplannedIssueRequestNumber = requestDto.Number; |
|
|
|
job.JobType = EnumJobType.UnplannedIssueJob; |
|
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
|
job.IsAutoComplete = false; |
|
|
|
job.DeptCode = requestDto.DeptCode; |
|
|
|
job.DeptName = requestDto.DeptName; |
|
|
|
job.Worker = "未执行"; |
|
|
|
job.OANumber = requestDto.OANumber; |
|
|
|
job.Number = await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true); |
|
|
|
job.Details = new List<UnplannedIssueJobDetail>(); |
|
|
|
job.FacDetails = new List<UnplannedIssueJobFacDetail>(); |
|
|
|
job.WarehouseCode = balanceDtoGroup.First().WarehouseCode; |
|
|
@ -460,7 +359,6 @@ public class UnplannedIssueJobAppService |
|
|
|
jobfacDetail.Status = balanceDto.Status; |
|
|
|
jobfacDetail.HandledQty = balanceDto.Qty; |
|
|
|
jobfacDetail.Uom = balanceDto.Uom; |
|
|
|
//job.Details.Add(jobDetail);
|
|
|
|
job.FacDetails.Add(jobfacDetail); |
|
|
|
} |
|
|
|
|
|
|
@ -478,99 +376,33 @@ public class UnplannedIssueJobAppService |
|
|
|
itm.Remark = job.Number; |
|
|
|
useBalancesOut.Add(itm); |
|
|
|
} |
|
|
|
//useBalancesOut.AddRange(returnlist.Item2);
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var job = new UnplannedIssueJob(); |
|
|
|
|
|
|
|
switch (locationDto.Type) |
|
|
|
{ |
|
|
|
case EnumLocationType.SEMI: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.CUST: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.FG: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.RAW: |
|
|
|
job.IsHasPackingCode = 1; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.THIRDPARTY: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.OUTSIDE: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
break; |
|
|
|
case EnumLocationType.DimensionalStorehouse: |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Raw; |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
break; |
|
|
|
case EnumLocationType.KittingWip: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
case EnumLocationType.WIP: |
|
|
|
job.IsHasPackingCode = 0; |
|
|
|
job.UnplannedIssueType = EnumUnplannedIssueType.Wip; |
|
|
|
break; |
|
|
|
} |
|
|
|
var outEditInputs = await BuildExpectOutAsync(useBalances, job.Number).ConfigureAwait(false); |
|
|
|
await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false); |
|
|
|
|
|
|
|
job.ItemCode = requestDtoDetail.ItemCode; |
|
|
|
job.ItemName = requestDtoDetail.ItemName; |
|
|
|
job.ItemDesc1 = requestDtoDetail.ItemDesc1; |
|
|
|
job.ItemDesc2 = requestDtoDetail.ItemDesc2; |
|
|
|
job.FromErpLocationCode = requestDtoDetail.LocationErpCode; |
|
|
|
job.Qty = requestDtoDetail.Qty; |
|
|
|
|
|
|
|
|
|
|
|
job.SetId(GuidGenerator.Create()); |
|
|
|
job.UnplannedIssueRequestNumber = requestDto.Number; |
|
|
|
job.JobType = EnumJobType.UnplannedIssueJob; |
|
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
|
job.IsAutoComplete = false; |
|
|
|
job.DeptCode = requestDto.DeptCode; |
|
|
|
job.DeptName = requestDto.DeptName; |
|
|
|
job.Worker = requestDto.Worker; |
|
|
|
job.OANumber = requestDto.OANumber; |
|
|
|
job.Number = await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true); |
|
|
|
job.Details = new List<UnplannedIssueJobDetail>(); |
|
|
|
job.FacDetails = new List<UnplannedIssueJobFacDetail>(); |
|
|
|
job.WarehouseCode = locationDto.WarehouseCode; |
|
|
|
job.BuildDate = DateTime.Now; |
|
|
|
|
|
|
|
jobs.Add(job); |
|
|
|
} |
|
|
|
jobs.Add(job); |
|
|
|
} |
|
|
|
//if (Errors.Count > 0)
|
|
|
|
//{
|
|
|
|
// foreach (var itm in Errors)
|
|
|
|
// {
|
|
|
|
// _logger.LogError(itm);
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
|
|
return jobs; |
|
|
|
} |
|
|
|
|
|
|
|
private async Task<List<ExpectOutEditInput>> BuildExpectOutAsync(List<BalanceDTO> balanceDtos) |
|
|
|
private async Task<List<ExpectOutEditInput>> BuildExpectOutAsync(List<BalanceDTO> balanceDtos, string jobNumber) |
|
|
|
{ |
|
|
|
var lst = ObjectMapper.Map<List<BalanceDTO>, List<ExpectOutEditInput>>(balanceDtos); |
|
|
|
foreach (var itm in lst) |
|
|
|
var list = ObjectMapper.Map<List<BalanceDTO>, List<ExpectOutEditInput>>(balanceDtos); |
|
|
|
foreach (var outEditInput in list) |
|
|
|
{ |
|
|
|
itm.JobNumber = itm.Remark; |
|
|
|
outEditInput.JobNumber = jobNumber; |
|
|
|
if (!string.IsNullOrEmpty(outEditInput.PackingCode)) |
|
|
|
{ |
|
|
|
var balanceDto = await _balanceAppService.GetByPackingCodeAsync(outEditInput.PackingCode) |
|
|
|
.ConfigureAwait(false); |
|
|
|
outEditInput.Qty = balanceDto.Qty; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return lst; |
|
|
|
return list; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -582,42 +414,6 @@ public class UnplannedIssueJobAppService |
|
|
|
throw new NotImplementedException(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 创建补料记录实体
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="coatingIssueJobDto"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private async Task<UnplannedIssueNoteEditInput> BuildUnplannedIssueNoteAsync(UnplannedIssueJob unplannedIssueJobDto) |
|
|
|
{ |
|
|
|
if (!unplannedIssueJobDto.Details.Any()) |
|
|
|
{ |
|
|
|
return new UnplannedIssueNoteEditInput(); |
|
|
|
} |
|
|
|
|
|
|
|
//var createInput =
|
|
|
|
// ObjectMapper.Map<UnplannedIssueJob, UnplannedIssueNoteEditInput>(unplannedIssueJobDto);
|
|
|
|
var issuenote = new UnplannedIssueNoteEditInput(); |
|
|
|
|
|
|
|
issuenote.DeptCode = unplannedIssueJobDto.DeptCode; |
|
|
|
issuenote.DeptName = unplannedIssueJobDto.DeptName; |
|
|
|
issuenote.BuildDate = unplannedIssueJobDto.BuildDate; |
|
|
|
issuenote.UnplannedIssueRequestNumber = unplannedIssueJobDto.UnplannedIssueRequestNumber; |
|
|
|
issuenote.JobNumber = unplannedIssueJobDto.Number; |
|
|
|
issuenote.UnplannedIssueType = issuenote.UnplannedIssueType; |
|
|
|
issuenote.OANumber = issuenote.OANumber; |
|
|
|
issuenote.Details = new List<UnplannedIssueNoteDetailInput>(); |
|
|
|
foreach (var detail in unplannedIssueJobDto.FacDetails) |
|
|
|
{ |
|
|
|
var entity = new UnplannedIssueNoteDetailInput(); |
|
|
|
entity.InjectFrom(detail); |
|
|
|
entity.Qty = detail.HandledQty; |
|
|
|
issuenote.Details.Add(entity); |
|
|
|
} |
|
|
|
|
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
|
return issuenote; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 根据申请单号判断下面的任务是否都是完成或取消
|
|
|
|
/// </summary>
|
|
|
@ -643,16 +439,13 @@ public class UnplannedIssueJobAppService |
|
|
|
{ |
|
|
|
var job = await _repository.GetAsync(id).ConfigureAwait(false); |
|
|
|
//var facQuery=job.FacDetails.GroupBy(p => new { p.ItemCode }).Select(p=>new {ItemCode= p.Key.ItemCode,Qty= p.Sum(itm=>itm.RecommendQty) });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (dto.Details.Count > 0) |
|
|
|
{ |
|
|
|
|
|
|
|
var query = dto.Details.GroupBy(p => new { p.ItemCode }) |
|
|
|
.Select(p => new { p.Key.ItemCode, Qty = p.Sum(itm => itm.HandledQty) }); |
|
|
|
|
|
|
|
.Select(p => new { p.Key.ItemCode, Qty = p.Sum(itm => itm.HandledQty) }); |
|
|
|
|
|
|
|
var sumQty = query.FirstOrDefault().Qty; |
|
|
|
|
|
|
|
if (job.Qty < sumQty) |
|
|
@ -661,14 +454,11 @@ public class UnplannedIssueJobAppService |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (dto.FacDetails.Count == 0) |
|
|
|
{ |
|
|
|
var locationCodes = await _locationAppService |
|
|
|
.GetListByErpLocationCodes(new StringList(job.FromErpLocationCode)) |
|
|
|
.ConfigureAwait(false); //获取存放库位
|
|
|
|
.GetListByErpLocationCodes(new StringList(job.FromErpLocationCode)) |
|
|
|
.ConfigureAwait(false); //获取存放库位
|
|
|
|
|
|
|
|
if (locationCodes.Count == 0) |
|
|
|
{ |
|
|
@ -784,38 +574,22 @@ public class UnplannedIssueJobAppService |
|
|
|
.ThenBy(p => p.PackingCode) |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
var avbQty= usableList.Sum(p => p.Qty); |
|
|
|
var avbQty = usableList.Sum(p => p.Qty); |
|
|
|
|
|
|
|
|
|
|
|
if (usableList.Count == 0) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException("库存数量不够!"); |
|
|
|
} |
|
|
|
else |
|
|
|
|
|
|
|
if (avbQty < sumQty) |
|
|
|
{ |
|
|
|
if (avbQty < sumQty) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException("库存数量不够!"); |
|
|
|
} |
|
|
|
throw new UserFriendlyException("库存数量不够!"); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var handleDto = new UnplannedIssueJobDTO(); |
|
|
|
//using (var uow = _unitOfWorkManager.Begin())
|
|
|
|
//{
|
|
|
@ -830,9 +604,10 @@ public class UnplannedIssueJobAppService |
|
|
|
var handleEntity = ObjectMapper.Map<UnplannedIssueJobDTO, UnplannedIssueJob>(dto); |
|
|
|
foreach (var detail in dto.Details) |
|
|
|
{ |
|
|
|
var itemBasicDto=await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); |
|
|
|
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); |
|
|
|
detail.Uom = itemBasicDto.BasicUom; |
|
|
|
} |
|
|
|
|
|
|
|
var handleResult = |
|
|
|
await _unplannedIssueJobManager.CompleteAsync(handleEntity, CurrentUser).ConfigureAwait(false); |
|
|
|
handleDto = ObjectMapper.Map<UnplannedIssueJob, UnplannedIssueJobDTO>(handleResult); |
|
|
|