|
@ -57,7 +57,7 @@ public class UnplannedReceiptJobAppService |
|
|
private readonly IPostionLocationAppService _postionLocationAppService; |
|
|
private readonly IPostionLocationAppService _postionLocationAppService; |
|
|
private readonly ILogger<UnplannedReceiptJobAppService> _logger; |
|
|
private readonly ILogger<UnplannedReceiptJobAppService> _logger; |
|
|
private readonly ITransferNoteAppService _transferNoteAppService; |
|
|
private readonly ITransferNoteAppService _transferNoteAppService; |
|
|
|
|
|
private readonly ILocationDeliveryAppService _locationDeliveryAppService; |
|
|
|
|
|
|
|
|
public UnplannedReceiptJobAppService( |
|
|
public UnplannedReceiptJobAppService( |
|
|
IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager, IPostionLocationAppService postionLocationAppService, |
|
|
IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager, IPostionLocationAppService postionLocationAppService, |
|
@ -68,10 +68,8 @@ public class UnplannedReceiptJobAppService |
|
|
IHttpClientFactory httpClientFactory, |
|
|
IHttpClientFactory httpClientFactory, |
|
|
IUnitOfWorkManager unitOfWorkManager, |
|
|
IUnitOfWorkManager unitOfWorkManager, |
|
|
ILogger<UnplannedReceiptJobAppService> logger, |
|
|
ILogger<UnplannedReceiptJobAppService> logger, |
|
|
ITransferNoteAppService transferNoteAppService |
|
|
ITransferNoteAppService transferNoteAppService, |
|
|
|
|
|
ILocationDeliveryAppService locationDeliveryAppService) : base(repository, UnplannedReceiptJobManager) |
|
|
|
|
|
|
|
|
) : base(repository, UnplannedReceiptJobManager) |
|
|
|
|
|
{ |
|
|
{ |
|
|
_unplannedReceiptJobManager = UnplannedReceiptJobManager; |
|
|
_unplannedReceiptJobManager = UnplannedReceiptJobManager; |
|
|
_locationAppService = locationAppService; |
|
|
_locationAppService = locationAppService; |
|
@ -84,6 +82,7 @@ public class UnplannedReceiptJobAppService |
|
|
_logger = logger; |
|
|
_logger = logger; |
|
|
_postionLocationAppService = postionLocationAppService; |
|
|
_postionLocationAppService = postionLocationAppService; |
|
|
_transferNoteAppService = transferNoteAppService; |
|
|
_transferNoteAppService = transferNoteAppService; |
|
|
|
|
|
_locationDeliveryAppService = locationDeliveryAppService; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -110,6 +109,7 @@ public class UnplannedReceiptJobAppService |
|
|
public async Task CreateByFreeAsync(UnplannedReceiptRequestDTO requestDto) |
|
|
public async Task CreateByFreeAsync(UnplannedReceiptRequestDTO requestDto) |
|
|
{ |
|
|
{ |
|
|
var jobs=await BuildUnplannedReceiptJobAsync(requestDto).ConfigureAwait(false); |
|
|
var jobs=await BuildUnplannedReceiptJobAsync(requestDto).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
await CreateManyAsync(jobs).ConfigureAwait(false); |
|
|
await CreateManyAsync(jobs).ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -126,6 +126,7 @@ public class UnplannedReceiptJobAppService |
|
|
{ |
|
|
{ |
|
|
var details = ObjectMapper.Map<List<UnplannedReceiptJobDetailDTO>, List<UnplannedReceiptJobDetail>>(detailDtos); |
|
|
var details = ObjectMapper.Map<List<UnplannedReceiptJobDetailDTO>, List<UnplannedReceiptJobDetail>>(detailDtos); |
|
|
var job=await _repository.FindAsync(p => p.Number == jobNumber).ConfigureAwait(false); |
|
|
var job=await _repository.FindAsync(p => p.Number == jobNumber).ConfigureAwait(false); |
|
|
|
|
|
var isHasAgvFlag = false; |
|
|
|
|
|
|
|
|
if (job == null) |
|
|
if (job == null) |
|
|
{ |
|
|
{ |
|
@ -194,6 +195,13 @@ public class UnplannedReceiptJobAppService |
|
|
{ |
|
|
{ |
|
|
throw new UserFriendlyException("立库功能暂未开放"); |
|
|
throw new UserFriendlyException("立库功能暂未开放"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var dto=await _locationDeliveryAppService.GetByFromLocationCodeAndToLocationCodeAsync(detail.HandledToLocationCode, detail.HandledToLocationCode).ConfigureAwait(false); |
|
|
|
|
|
if (dto != null) |
|
|
|
|
|
{ |
|
|
|
|
|
await CallAgvAsync(job,detail).ConfigureAwait(false); |
|
|
|
|
|
isHasAgvFlag = true; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
job.Details = details; |
|
|
job.Details = details; |
|
@ -201,9 +209,20 @@ public class UnplannedReceiptJobAppService |
|
|
job.JobStatus = EnumJobStatus.Done; |
|
|
job.JobStatus = EnumJobStatus.Done; |
|
|
job.CompleteTime=DateTime.Now; |
|
|
job.CompleteTime=DateTime.Now; |
|
|
job.Worker=worker; |
|
|
job.Worker=worker; |
|
|
|
|
|
|
|
|
|
|
|
if (isHasAgvFlag) |
|
|
|
|
|
{ |
|
|
|
|
|
job.JobStatus = EnumJobStatus.WaitAgv; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
job =await _repository.UpdateAsync(job).ConfigureAwait(false); |
|
|
job =await _repository.UpdateAsync(job).ConfigureAwait(false); |
|
|
await LocalEventBus.PublishAsync(new SfsCompletedEntityEventData<UnplannedReceiptJob>(job), false).ConfigureAwait(false); |
|
|
|
|
|
await UpdateRequestStatusAsync(job.UnplannedReceiptRequestNumber).ConfigureAwait(false); |
|
|
if (!isHasAgvFlag)//没有AGV就执行
|
|
|
|
|
|
{ |
|
|
|
|
|
await LocalEventBus.PublishAsync(new SfsCompletedEntityEventData<UnplannedReceiptJob>(job), false) |
|
|
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
await UpdateRequestStatusAsync(job.UnplannedReceiptRequestNumber).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
@ -326,21 +345,21 @@ public class UnplannedReceiptJobAppService |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 调用 Agv 接口
|
|
|
/// 调用 Agv 接口
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <param name="job"></param>
|
|
|
/// <param name="pLoc"></param>
|
|
|
/// <param name="detail"></param>
|
|
|
/// <param name="uid"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
[HttpPost("call-agv")] |
|
|
[HttpPost("call-agv")] |
|
|
public async Task<ReusltObject> CallAgvAsync(UnplannedReceiptJobDTO input) |
|
|
public async Task<ReusltObject> CallAgvAsync(UnplannedReceiptJob job,UnplannedReceiptJobDetail detail) |
|
|
{ |
|
|
{ |
|
|
var res = new ReusltObject(); |
|
|
var res = new ReusltObject(); |
|
|
List<string> errors = new List<string>(); |
|
|
List<string> errors = new List<string>(); |
|
|
List<string> successList = new List<string>(); |
|
|
List<string> successList = new List<string>(); |
|
|
|
|
|
|
|
|
var jobres = await SendInterFaceAsync(input).ConfigureAwait(false); |
|
|
var jobres = await SendInterFaceAsync(job,detail).ConfigureAwait(false); |
|
|
if (jobres.Code != "0") |
|
|
if (jobres.Code != "0") |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation(jobres.Message); |
|
|
_logger.LogInformation(jobres.Message); |
|
@ -368,321 +387,53 @@ public class UnplannedReceiptJobAppService |
|
|
[HttpPost("call-back-agv")] |
|
|
[HttpPost("call-back-agv")] |
|
|
public async Task<AgvResultObject> CallBackAgvAsync(AgvRequestUnplannedDto request) |
|
|
public async Task<AgvResultObject> CallBackAgvAsync(AgvRequestUnplannedDto request) |
|
|
{ |
|
|
{ |
|
|
var json = JsonSerializer.Serialize(request); |
|
|
var agvRequest = request.Data.First(); |
|
|
var flag = DateTime.Now.ToString("yyyyMMddHHmmss"); |
|
|
|
|
|
_logger.LogInformation($"{flag}接收到AGV确认单据内容:" + json); |
|
|
|
|
|
#if DEBUG
|
|
|
|
|
|
#endif
|
|
|
|
|
|
var errors = new List<string>(); |
|
|
|
|
|
var first = request.Data.FirstOrDefault(); |
|
|
|
|
|
var job = await _repository.GetAsync(p => p.Number == first.OrderNum).ConfigureAwait(false); |
|
|
|
|
|
var ret = new AgvResultObject |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "0", |
|
|
|
|
|
Message = "OK", |
|
|
|
|
|
ReqCode = job.UnplannedReceiptRequestNumber, |
|
|
|
|
|
}; |
|
|
|
|
|
using var unitOfWork = _unitOfWorkManager.Begin(); |
|
|
|
|
|
try |
|
|
|
|
|
{ |
|
|
|
|
|
if (request.Data.Count > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
var jobs = request.Data; |
|
|
|
|
|
var numbers = jobs.Select(p => p.OrderNum); |
|
|
|
|
|
var query = _repository.WithDetails() |
|
|
|
|
|
.Where(p => numbers.Contains(p.Number) && p.JobStatus != EnumJobStatus.Done); |
|
|
|
|
|
var entities = query.ToList(); |
|
|
|
|
|
if (entities.Count == 0) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"任务号{string.Join(",", numbers)}不存在!"); |
|
|
|
|
|
} |
|
|
|
|
|
var dtos = ObjectMapper.Map<List<UnplannedReceiptJob>, List<UnplannedReceiptJobDTO>>(entities); |
|
|
|
|
|
|
|
|
|
|
|
foreach (var itm in dtos) |
|
|
|
|
|
{ |
|
|
|
|
|
var arys = jobs.Where(p => p.OrderNum == itm.Number); |
|
|
|
|
|
var itmDetails = itm.Details.ToList(); |
|
|
|
|
|
var details = new List<UnplannedReceiptJobDetailDTO>(); |
|
|
|
|
|
foreach (var detail in arys) |
|
|
|
|
|
{ |
|
|
|
|
|
var fromloc = await _postionLocationAppService.GetByCodeAsync(detail.BeginPosition).ConfigureAwait(false); |
|
|
|
|
|
if (fromloc == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"来源起始点{detail.BeginPosition}没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LocationDTO fromlocation = null; |
|
|
|
|
|
|
|
|
|
|
|
if (fromloc != null) |
|
|
|
|
|
{ |
|
|
|
|
|
fromlocation = await _locationAppService.GetByCodeAsync(fromloc.LocationCode).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
if (fromlocation == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"来源起始点{detail.BeginPosition}库位没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var toloc = await _postionLocationAppService.GetByCodeAsync(detail.EndPosition) |
|
|
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
if (toloc == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"结束点{detail.EndPosition}库位没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LocationDTO tolocation = null; |
|
|
|
|
|
|
|
|
|
|
|
if (toloc != null) |
|
|
|
|
|
{ |
|
|
|
|
|
tolocation = await _locationAppService.GetByCodeAsync(toloc.LocationCode).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
if (tolocation == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"结束点{detail.EndPosition}库位没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var item = await _itemBasicAppService.GetByCodeAsync(detail.MatCode).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
|
|
|
if (item == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"零件号{detail.MatCode}不存在!"); |
|
|
|
|
|
} |
|
|
|
|
|
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.MatCode); |
|
|
|
|
|
if (entity == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"零件号{detail.MatCode}不在任务明细内!"); |
|
|
|
|
|
} |
|
|
|
|
|
if (errors.Count > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
await unitOfWork.RollbackAsync().ConfigureAwait(false); |
|
|
|
|
|
return ret = new AgvResultObject() |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
ReqCode = "", |
|
|
|
|
|
Message = string.Join(",", errors.ToArray()) |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
var dto = new UnplannedReceiptJobDetailDTO(); |
|
|
|
|
|
dto.InjectFrom(entity); |
|
|
|
|
|
dto.HandledQty = detail.MatQty; |
|
|
|
|
|
dto.HandledPackingCode = detail.PakingCode; |
|
|
|
|
|
dto.HandledToWarehouseCode = tolocation.WarehouseCode; |
|
|
|
|
|
dto.HandledToLocationCode = tolocation.Code; |
|
|
|
|
|
dto.HandledToLocationGroup = tolocation.LocationGroupCode; |
|
|
|
|
|
dto.HandledToLocationArea = tolocation.AreaCode; |
|
|
|
|
|
dto.HandledToLocationErpCode = tolocation.ErpLocationCode; |
|
|
|
|
|
|
|
|
|
|
|
details.Add(dto); |
|
|
|
|
|
//await ExecuteDetailExtAsync(itm.Id, entity.Id, dto).ConfigureAwait(false);
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (errors.Count > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
await unitOfWork.RollbackAsync().ConfigureAwait(false); |
|
|
|
|
|
ret = new AgvResultObject() |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
ReqCode = "", |
|
|
|
|
|
Message = string.Join(",", errors.ToArray()) |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
itm.Worker = "AGV"; |
|
|
|
|
|
itm.Details = details; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await CompleteAsync(itm.Id, itm).ConfigureAwait(false);//是否这么调待明确
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation($"{flag}接收Agv确认单据内容:" + json + "Agv任务完成"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add("Agv确认单据里无数据! \n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
catch (Exception ex) |
|
|
|
|
|
{ |
|
|
|
|
|
ret = new AgvResultObject |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
ReqCode = job.UnplannedReceiptRequestNumber, |
|
|
|
|
|
Message = ex.Message |
|
|
|
|
|
}; |
|
|
|
|
|
await unitOfWork.RollbackAsync().ConfigureAwait(false); |
|
|
|
|
|
return ret; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (errors.Count > 0) |
|
|
var job = await _repository.FindAsync(p => p.Number == agvRequest.OrderNum).ConfigureAwait(false); |
|
|
{ |
|
|
if (job == null) |
|
|
ret = new AgvResultObject |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
Message = string.Join(",", errors.ToArray()), |
|
|
|
|
|
ReqCode = job.UnplannedReceiptRequestNumber |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
return ret; |
|
|
|
|
|
} |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Agv 回库 接口
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="request"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpPost("call-return-back-agv")] |
|
|
|
|
|
public async Task<AgvResultObject> CallReturnBackAgvAsync(AgvRequestDto request) |
|
|
|
|
|
{ |
|
|
|
|
|
var json = JsonSerializer.Serialize(request); |
|
|
|
|
|
var flag = DateTime.Now.ToString("yyyyMMddHHmmss"); |
|
|
|
|
|
_logger.LogInformation($"{flag}接收到AGV确认单据内容:" + json); |
|
|
|
|
|
#if DEBUG
|
|
|
|
|
|
#endif
|
|
|
|
|
|
var errors = new List<string>(); |
|
|
|
|
|
var ret = new AgvResultObject |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "0", |
|
|
|
|
|
Message = "OK", |
|
|
|
|
|
ReqCode = "", |
|
|
|
|
|
}; |
|
|
|
|
|
using var unitOfWork = _unitOfWorkManager.Begin(); |
|
|
|
|
|
try |
|
|
|
|
|
{ |
|
|
|
|
|
if (request.Data.Count > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
var notes = request.Data; |
|
|
|
|
|
|
|
|
|
|
|
foreach (var detail in notes) |
|
|
|
|
|
{ |
|
|
|
|
|
TransferNoteEditInput transfer = new TransferNoteEditInput(); |
|
|
|
|
|
transfer.CallJobNumber = detail.OrderNum; |
|
|
|
|
|
transfer.Type = EnumTransSubType.Agv_Transfer_WIP.ToString(); |
|
|
|
|
|
transfer.Worker = "Agv"; |
|
|
|
|
|
transfer.UseOnTheWayLocation = false; |
|
|
|
|
|
List<TransferNoteDetailInput> transferNoteDetailInputs = new List<TransferNoteDetailInput>(); |
|
|
|
|
|
TransferNoteDetailInput detailInput = new TransferNoteDetailInput(); |
|
|
|
|
|
var fromloc = await _postionLocationAppService.GetByCodeAsync(detail.BeginPosition).ConfigureAwait(false); |
|
|
|
|
|
if (fromloc == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"来源起始点{detail.BeginPosition}没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
LocationDTO fromlocation = null; |
|
|
|
|
|
if (fromloc != null) |
|
|
|
|
|
{ |
|
|
|
|
|
fromlocation = await _locationAppService.GetByCodeAsync(fromloc.LocationCode).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
if (fromlocation == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"来源起始点{detail.BeginPosition}库位没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
var toloc = await _postionLocationAppService.GetByCodeAsync(detail.EndPosition) |
|
|
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
if (toloc == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"结束点{detail.EndPosition}没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
LocationDTO tolocation = null; |
|
|
|
|
|
if (toloc != null) |
|
|
|
|
|
{ |
|
|
|
|
|
tolocation = await _locationAppService.GetByCodeAsync(toloc.LocationCode).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
if (tolocation == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"结束点{detail.EndPosition}库位没查到"); |
|
|
|
|
|
} |
|
|
|
|
|
var item = await _itemBasicAppService.GetByCodeAsync(detail.MatCode).ConfigureAwait(false); |
|
|
|
|
|
if (item == null) |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add($"零件号{detail.MatCode}的零件不存在!"); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
detailInput.ItemCode = item.Code; |
|
|
|
|
|
detailInput.Uom = item.BasicUom; |
|
|
|
|
|
detailInput.ItemName = item.Name; |
|
|
|
|
|
detailInput.ItemDesc1 = !string.IsNullOrEmpty(item.Desc1) ? item.Desc1 : string.Empty; |
|
|
|
|
|
} |
|
|
|
|
|
if (errors.Count > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
return ret = new AgvResultObject() |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
ReqCode = "", |
|
|
|
|
|
Message = string.Join(",", errors.ToArray()) |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
detailInput.ToLocationCode = tolocation.Code; |
|
|
|
|
|
detailInput.ToLocationGroup = tolocation.LocationGroupCode; |
|
|
|
|
|
detailInput.ToLocationArea = tolocation.AreaCode; |
|
|
|
|
|
detailInput.ToLocationErpCode = tolocation.ErpLocationCode; |
|
|
|
|
|
detailInput.ToWarehouseCode = tolocation.WarehouseCode; |
|
|
|
|
|
detailInput.FromStatus = tolocation.DefaultInventoryStatus; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
detailInput.Qty = detail.MatQty; |
|
|
|
|
|
detailInput.ToLot = !string.IsNullOrEmpty(detail.BatchAttr07) ? detail.BatchAttr07 : string.Empty; |
|
|
|
|
|
detailInput.ToPackingCode = string.Empty; |
|
|
|
|
|
detailInput.FromWarehouseCode = fromlocation.WarehouseCode; |
|
|
|
|
|
detailInput.FromLocationCode = fromlocation.Code; |
|
|
|
|
|
detailInput.FromLocationGroup = fromlocation.LocationGroupCode; |
|
|
|
|
|
detailInput.FromLocationArea = fromlocation.AreaCode; |
|
|
|
|
|
detailInput.FromLocationErpCode = fromlocation.ErpLocationCode; |
|
|
|
|
|
detailInput.ToStatus = fromlocation.DefaultInventoryStatus; |
|
|
|
|
|
detailInput.Qty = detail.MatQty; |
|
|
|
|
|
detailInput.FromLot = !string.IsNullOrEmpty(detail.BatchAttr07) ? detail.BatchAttr07 : string.Empty; |
|
|
|
|
|
detailInput.FromPackingCode = string.Empty; |
|
|
|
|
|
|
|
|
|
|
|
transfer.Details.Add(detailInput); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await _transferNoteAppService.CreateAsync(transfer).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
errors.Add("Agv确认单据里无数据! \n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
catch (Exception ex) |
|
|
|
|
|
{ |
|
|
{ |
|
|
ret = new AgvResultObject |
|
|
throw new UserFriendlyException("未找到该任务"); |
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
ReqCode = "", |
|
|
|
|
|
Message = ex.Message |
|
|
|
|
|
}; |
|
|
|
|
|
await unitOfWork.RollbackAsync().ConfigureAwait(false); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (errors.Count > 0) |
|
|
if (job.JobStatus != EnumJobStatus.WaitAgv) |
|
|
{ |
|
|
{ |
|
|
ret = new AgvResultObject |
|
|
throw new UserFriendlyException("该任务状态不是等待AGV中"); |
|
|
{ |
|
|
|
|
|
Code = "-1", |
|
|
|
|
|
Message = string.Join(",", errors.ToArray()), |
|
|
|
|
|
ReqCode = "" |
|
|
|
|
|
}; |
|
|
|
|
|
await unitOfWork.RollbackAsync().ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
} |
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var toLocationDto = await _locationAppService.GetByCodeAsync(agvRequest.EndPosition).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
|
|
|
var detail = job.Details.First(); |
|
|
|
|
|
detail.HandledQty = agvRequest.MatQty; |
|
|
|
|
|
detail.HandledPackingCode = agvRequest.PakingCode; |
|
|
|
|
|
detail.HandledToWarehouseCode = toLocationDto.WarehouseCode; |
|
|
|
|
|
detail.HandledToLocationCode = toLocationDto.Code; |
|
|
|
|
|
detail.HandledToLocationGroup = toLocationDto.LocationGroupCode; |
|
|
|
|
|
detail.HandledToLocationArea = toLocationDto.AreaCode; |
|
|
|
|
|
detail.HandledToLocationErpCode = toLocationDto.ErpLocationCode; |
|
|
|
|
|
|
|
|
|
|
|
job = await _repository.UpdateAsync(job).ConfigureAwait(false); |
|
|
|
|
|
await LocalEventBus.PublishAsync(new SfsCompletedEntityEventData<UnplannedReceiptJob>(job), false) |
|
|
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
await UpdateRequestStatusAsync(job.UnplannedReceiptRequestNumber).ConfigureAwait(false);//await ExecuteDetailExtAsync(itm.Id, entity.Id, dto).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
|
|
return new AgvResultObject() |
|
|
|
|
|
{ |
|
|
|
|
|
Code = "", |
|
|
|
|
|
Message = "", |
|
|
|
|
|
ReqCode = "" |
|
|
|
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 调用Agv接口实现
|
|
|
/// 调用Agv接口实现
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="job"></param>
|
|
|
/// <param name="job"></param>
|
|
|
|
|
|
/// <param name="detail"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
private async Task<AgvResultObject> SendInterFaceAsync(UnplannedReceiptJobDTO job) |
|
|
private async Task<AgvResultObject> SendInterFaceAsync(UnplannedReceiptJob job,UnplannedReceiptJobDetail detail) |
|
|
{ |
|
|
{ |
|
|
#if DEBUG
|
|
|
#if DEBUG
|
|
|
|
|
|
return new AgvResultObject(); |
|
|
#endif
|
|
|
#endif
|
|
|
var ret = new AgvResultObject |
|
|
var ret = new AgvResultObject |
|
|
{ |
|
|
{ |
|
@ -698,21 +449,15 @@ public class UnplannedReceiptJobAppService |
|
|
{ |
|
|
{ |
|
|
throw new UserFriendlyException($"任务{job.Number}为已完成状态,不能发起AGV任务!"); |
|
|
throw new UserFriendlyException($"任务{job.Number}为已完成状态,不能发起AGV任务!"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (job.Details.Count==0) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new UserFriendlyException($"任务{job.Number}没有推荐库存!"); |
|
|
|
|
|
} |
|
|
|
|
|
var first = job.Details.FirstOrDefault(); |
|
|
|
|
|
|
|
|
|
|
|
var request = new AgvRequestUnplanned(); |
|
|
var request = new AgvRequestUnplanned(); |
|
|
request.MatCode = first.ItemCode; |
|
|
request.MatCode = detail.ItemCode; |
|
|
request.MatQty = first.RecommendQty; |
|
|
request.MatQty = detail.RecommendQty; |
|
|
request.OrderNum = job.Number; |
|
|
request.OrderNum = job.Number; |
|
|
request.Batch = first.HandledPackingCode; |
|
|
request.Batch = detail.HandledPackingCode; |
|
|
request.ErpLocationCode = job.FromErpLocationCode; |
|
|
request.ErpLocationCode = job.FromErpLocationCode; |
|
|
request.PakingCode = first.HandledPackingCode; |
|
|
request.PakingCode = detail.HandledPackingCode; |
|
|
request.EndPosition = first.HandledToLocationCode; |
|
|
request.EndPosition = detail.HandledToLocationCode; |
|
|
|
|
|
|
|
|
request.OrderType = request.OrderType = job.UnplannedReceiptType == EnumUnplannedReceiptType.Raw ? EnumJobType.UnplannedReceiptJobHasPacking.ToString() : EnumJobType.UnplannedReceiptJobNoPacking.ToString(); ; |
|
|
request.OrderType = request.OrderType = job.UnplannedReceiptType == EnumUnplannedReceiptType.Raw ? EnumJobType.UnplannedReceiptJobHasPacking.ToString() : EnumJobType.UnplannedReceiptJobNoPacking.ToString(); ; |
|
|
|
|
|
|
|
|