|
|
@ -1,11 +1,10 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Data; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq.Expressions; |
|
|
|
using System.Net.Http.Headers; |
|
|
|
using System.Net.Http; |
|
|
|
using System.Threading; |
|
|
|
using System.Net.Http.Headers; |
|
|
|
using System.Text; |
|
|
|
using System.Text.Json; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Castle.Components.DictionaryAdapter; |
|
|
|
using Microsoft.AspNetCore.Authorization; |
|
|
@ -13,10 +12,7 @@ using Microsoft.AspNetCore.Mvc; |
|
|
|
using Microsoft.Extensions.Options; |
|
|
|
using MyNamespace; |
|
|
|
using Volo.Abp; |
|
|
|
using Volo.Abp.Application.Dtos; |
|
|
|
using Win_in.Sfs.Basedata.Application.Contracts; |
|
|
|
using Win_in.Sfs.Basedata.Domain.Shared; |
|
|
|
using Win_in.Sfs.Shared.Domain; |
|
|
|
using Win_in.Sfs.Shared.Domain.Shared; |
|
|
|
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; |
|
|
|
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|
|
@ -38,10 +34,10 @@ public class AssembleIssueJobAppService |
|
|
|
{ |
|
|
|
private readonly IAssembleIssueJobManager _assembleIssueJobManager; |
|
|
|
private readonly ILocationAppService _locationAppService; |
|
|
|
private readonly ITransferLibJobAppService _transferLibJobAppService; |
|
|
|
private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService; |
|
|
|
private readonly IExpectOutAppService _expectOutAppService; |
|
|
|
private readonly IHttpClientFactory _httpClientFactory; |
|
|
|
private readonly ITransferLibRequestAppService _transferLibRequestAppService; |
|
|
|
private readonly IOptions<RestoOptions> _options; |
|
|
|
|
|
|
|
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService => |
|
|
@ -49,23 +45,19 @@ public class AssembleIssueJobAppService |
|
|
|
|
|
|
|
public AssembleIssueJobAppService( |
|
|
|
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager, |
|
|
|
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService, |
|
|
|
ILocationAppService locationAppService, |
|
|
|
IAssembleIssueNoteAppService assembleIssueNoteAppService, IExpectOutAppService expectOutAppService |
|
|
|
, IHttpClientFactory httpClientFactory |
|
|
|
, IOptions<RestoOptions> options |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
) : base( |
|
|
|
, IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService) : base( |
|
|
|
repository, assembleIssueJobManager) |
|
|
|
{ |
|
|
|
_assembleIssueJobManager = assembleIssueJobManager; |
|
|
|
_locationAppService = locationAppService; |
|
|
|
_transferLibJobAppService = transferLibJobAppService; |
|
|
|
_assembleIssueNoteAppService = assembleIssueNoteAppService; |
|
|
|
_expectOutAppService = expectOutAppService; |
|
|
|
_httpClientFactory = httpClientFactory; |
|
|
|
_options = options; |
|
|
|
_transferLibRequestAppService = transferLibRequestAppService; |
|
|
|
} |
|
|
|
|
|
|
|
[HttpPost("add-many")] |
|
|
@ -101,23 +93,31 @@ public class AssembleIssueJobAppService |
|
|
|
[HttpPost("invalid")] |
|
|
|
public override async Task CancelAsync(Guid id) |
|
|
|
{ |
|
|
|
var injectionJob = await _repository.GetAsync(id).ConfigureAwait(false); |
|
|
|
if (injectionJob == null) |
|
|
|
var assembleJob = await _repository.GetAsync(id).ConfigureAwait(false); |
|
|
|
if (assembleJob == null) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException($"未找到ID为 {id} 的任务"); |
|
|
|
} |
|
|
|
|
|
|
|
await _assembleIssueJobManager.CancelAsync(injectionJob).ConfigureAwait(false); |
|
|
|
} |
|
|
|
if (assembleJob.JobStatus == EnumJobStatus.Open || |
|
|
|
assembleJob.JobStatus == EnumJobStatus.Partial || |
|
|
|
assembleJob.JobStatus == EnumJobStatus.Wait || |
|
|
|
assembleJob.JobStatus == EnumJobStatus.Doing) |
|
|
|
{ |
|
|
|
await _expectOutAppService.RemoveByNumberAsync(assembleJob.Number).ConfigureAwait(false); |
|
|
|
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(assembleJob.AssembleRequestNumber) |
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
[HttpPost("cancel-by-request/{requestNumber}")] |
|
|
|
public virtual async Task CancelByMaterialRequestAsync(string requestNumber) |
|
|
|
{ |
|
|
|
var entities = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber) |
|
|
|
.ConfigureAwait(false); |
|
|
|
foreach (var entity in entities) |
|
|
|
assembleJob.JobStatus = EnumJobStatus.Cancelled; |
|
|
|
await _repository.UpdateAsync(assembleJob).ConfigureAwait(false); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
await _assembleIssueJobManager.CancelAsync(entity).ConfigureAwait(false); |
|
|
|
throw new UserFriendlyException($"任务状态不是" + |
|
|
|
$"{EnumJobStatus.Open.GetDisplayName()}、" + |
|
|
|
$"{EnumJobStatus.Partial.GetDisplayName()}、" + |
|
|
|
$"{EnumJobStatus.Doing.GetDisplayName()}、" + |
|
|
|
$"{EnumJobStatus.Wait.GetDisplayName()}"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -139,11 +139,15 @@ public class AssembleIssueJobAppService |
|
|
|
{ |
|
|
|
var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false); |
|
|
|
|
|
|
|
var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false); |
|
|
|
if (job.JobStatus != EnumJobStatus.Wait) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException($"任务状态不是{EnumJobStatus.Wait.GetDisplayName()}"); |
|
|
|
} |
|
|
|
|
|
|
|
var transferLibNoteDetail = dto.Details.First(); |
|
|
|
|
|
|
|
var jobDetail = job.Details.First(); |
|
|
|
|
|
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
|
|
|
|
|
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; |
|
|
@ -199,24 +203,43 @@ public class AssembleIssueJobAppService |
|
|
|
|
|
|
|
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty; |
|
|
|
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty; |
|
|
|
assembleIssueJob.Details = new EditableList<AssembleIssueJobDetail>() { issueJobDetail }; |
|
|
|
assembleIssueJob.Details = new EditableList<AssembleIssueJobDetail> { issueJobDetail }; |
|
|
|
|
|
|
|
if (assembleIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
|
|
|
|
{ |
|
|
|
await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); |
|
|
|
if (issueJobDetailDto.RecommendToPackingCode != issueJobDetailDto.HandledToPackingCode) |
|
|
|
{ |
|
|
|
await CheckPackingCodeIsUserAsync(issueJobDetailDto.HandledToPackingCode, assembleIssueJob.Number) |
|
|
|
.ConfigureAwait(false); |
|
|
|
} |
|
|
|
|
|
|
|
await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty) |
|
|
|
.ConfigureAwait(false); |
|
|
|
await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var detail = assembleIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id); |
|
|
|
if (issueJobDetail.HandledToQty >= detail.RequestQty) |
|
|
|
{ |
|
|
|
await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); |
|
|
|
await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, |
|
|
|
issueJobDetailDto.HandledToQty).ConfigureAwait(false); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
await RemoveExpectOutAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty) |
|
|
|
.ConfigureAwait(false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
await _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 完成任务
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="id"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPost("Complete/{id}")] |
|
|
|
public async Task CompleteAsync(Guid id) |
|
|
|
{ |
|
|
@ -224,17 +247,187 @@ public class AssembleIssueJobAppService |
|
|
|
|
|
|
|
assembleIssueJob.JobStatus = EnumJobStatus.Done; |
|
|
|
|
|
|
|
await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number, |
|
|
|
assembleIssueJob.Details.First().ItemCode, |
|
|
|
assembleIssueJob.Details.First().HandledToLocationCode, assembleIssueJob.Details.First().HandledToPackingCode, |
|
|
|
assembleIssueJob.Details.First().Status, assembleIssueJob.Details.First().HandledToLot, |
|
|
|
assembleIssueJob.Details.First().HandledToQty).ConfigureAwait(false); |
|
|
|
|
|
|
|
await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); |
|
|
|
|
|
|
|
await AssembleIssueRequestAppService.UpdateStatusCompletedAsync(assembleIssueJob.AssembleRequestNumber) |
|
|
|
.ConfigureAwait(false); |
|
|
|
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(assembleIssueJob.AssembleRequestNumber) |
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
await _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 请求点了完成,任务全部都完成
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="requestNumber"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPost("complete-by-request/{requestNumber}")] |
|
|
|
public async Task CompleteByRequestNumberAsync(string requestNumber) |
|
|
|
{ |
|
|
|
var assembleIssueJobs = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber) |
|
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
foreach (var assembleIssueJob in assembleIssueJobs) |
|
|
|
{ |
|
|
|
assembleIssueJob.JobStatus = EnumJobStatus.Done; |
|
|
|
await _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false); |
|
|
|
await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); |
|
|
|
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(assembleIssueJob.AssembleRequestNumber) |
|
|
|
.ConfigureAwait(false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#region 立库
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 立体库同步
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="input"></param>
|
|
|
|
/// <param name="pLoc"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPost("sync-issue-job-stereo")] |
|
|
|
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<AssembleIssueJobDTO> input, string pLoc) |
|
|
|
{ |
|
|
|
var ret = new ReusltObject(); |
|
|
|
ret.Code = "1"; |
|
|
|
ret.Message = "操作成功"; |
|
|
|
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); |
|
|
|
try |
|
|
|
{ |
|
|
|
var IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>(); |
|
|
|
var main = new IssueJobToRestoDTO(); |
|
|
|
main.OperatorName = CurrentUser.UserName; |
|
|
|
foreach (var job in input) |
|
|
|
{ |
|
|
|
foreach (var jobitem in job.Details) |
|
|
|
{ |
|
|
|
IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO |
|
|
|
{ |
|
|
|
Count = jobitem.HandledToQty, |
|
|
|
ProductNo = jobitem.ItemCode, |
|
|
|
NeedSite = pLoc, |
|
|
|
WorkNo = job.Number, |
|
|
|
TaskNo = job.Number |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
main.Details = IssueJobToRestoDetailDTOs; |
|
|
|
var httpclient = _httpClientFactory.CreateClient(); |
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
var json = JsonSerializer.Serialize(main); |
|
|
|
_options.Value.Address = "http://localhost:59094/"; //测试地址
|
|
|
|
_options.Value.Token = ""; //测试token
|
|
|
|
_options.Value.UserName = ""; //测试用户名
|
|
|
|
_options.Value.Password = ""; //测试密码
|
|
|
|
|
|
|
|
#endif
|
|
|
|
if (!string.IsNullOrEmpty(_options.Value.Token)) |
|
|
|
{ |
|
|
|
var token = _options.Value.Token; |
|
|
|
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); |
|
|
|
} |
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password)) |
|
|
|
{ |
|
|
|
var username = _options.Value.UserName; |
|
|
|
var password = _options.Value.Password; |
|
|
|
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", |
|
|
|
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); |
|
|
|
} |
|
|
|
|
|
|
|
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient); |
|
|
|
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
ret = new ReusltObject(); |
|
|
|
ret.Code = "2"; |
|
|
|
ret.Message = ex.Message; |
|
|
|
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
[HttpPost("receive-issue-job-stereo")] |
|
|
|
public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input) |
|
|
|
{ |
|
|
|
#if DEBUG
|
|
|
|
var json = JsonSerializer.Serialize(input); |
|
|
|
#endif
|
|
|
|
var errors = new List<string>(); |
|
|
|
var ret = new ReusltObject { Code = "1", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = "操作成功" }; |
|
|
|
try |
|
|
|
{ |
|
|
|
if (input.Jobs.Count > 0) |
|
|
|
{ |
|
|
|
var jobs = input.Jobs; |
|
|
|
var numbers = jobs.Select(p => p.JobNumber); |
|
|
|
var query = _repository.WithDetails() |
|
|
|
.Where(p => numbers.Contains(p.Number)); |
|
|
|
var entities = query.ToList(); |
|
|
|
var dtos = ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entities); |
|
|
|
if (input.Jobs.Count == entities.Count) |
|
|
|
{ |
|
|
|
errors.Add("立体库提交出库任务和WMS任务不符,请核对! \n"); |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var itm in dtos) |
|
|
|
{ |
|
|
|
var first = jobs.FirstOrDefault(p => p.JobNumber == itm.Number); |
|
|
|
var itmDetails = itm.Details.ToList(); |
|
|
|
var details = new List<AssembleIssueJobDetailDTO>(); |
|
|
|
foreach (var detail in first.Details) |
|
|
|
{ |
|
|
|
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode); |
|
|
|
var dto = new AssembleIssueJobDetailDTO(); |
|
|
|
dto.HandledFromLocationCode = entity.HandledFromLocationCode; |
|
|
|
dto.HandledToLocationCode = entity.HandledToLocationCode; |
|
|
|
dto.ItemCode = detail.ItemCode; |
|
|
|
dto.RecommendFromQty = detail.Qty; |
|
|
|
dto.RecommendToQty = detail.Qty; |
|
|
|
dto.HandledFromQty = detail.Qty; |
|
|
|
dto.HandledToQty = detail.Qty; |
|
|
|
dto.Status = entity.Status; |
|
|
|
details.Add(dto); |
|
|
|
} |
|
|
|
|
|
|
|
itm.Details = details; |
|
|
|
await CompleteAsync(itm.Id, itm).ConfigureAwait(false); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
errors.Add("立体库确认单据里无数据! \n"); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
ret = new ReusltObject |
|
|
|
{ |
|
|
|
Code = "2", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = ex.Message |
|
|
|
}; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
if (errors.Count > 0) |
|
|
|
{ |
|
|
|
ret = new ReusltObject |
|
|
|
{ |
|
|
|
Code = "2", |
|
|
|
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), |
|
|
|
Message = string.Join(",", errors.ToArray()) |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 私有
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -334,21 +527,21 @@ public class AssembleIssueJobAppService |
|
|
|
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse) |
|
|
|
{ |
|
|
|
//TODO 立体库
|
|
|
|
var ret = await SyncIssueJobStereoAsync(new List<AssembleIssueJobDTO> { assembleIssueJobDto }, loctionDto.Code).ConfigureAwait(false); |
|
|
|
var ret = await SyncIssueJobStereoAsync(new List<AssembleIssueJobDTO> { assembleIssueJobDto }, |
|
|
|
loctionDto.Code).ConfigureAwait(false); |
|
|
|
if (ret.Code != "1") |
|
|
|
{ |
|
|
|
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 修改当前任务状态 和 该任务的请求状态
|
|
|
|
/// 修改当前任务状态 和 该任务的请求状态
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="assembleIssueJob"></param>
|
|
|
|
/// <param name="assembleIssueJobDetailDto"></param>
|
|
|
|
/// <param name="handledToQty"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
/// <exception cref="UserFriendlyException"></exception>
|
|
|
|
private async Task UpdateRequestAndjobStatusDoneAsync(AssembleIssueJob assembleIssueJob, |
|
|
@ -363,11 +556,7 @@ public class AssembleIssueJobAppService |
|
|
|
|
|
|
|
assembleIssueJob.JobStatus = EnumJobStatus.Done; |
|
|
|
|
|
|
|
await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number, |
|
|
|
assembleIssueJobDetailDto.ItemCode, |
|
|
|
assembleIssueJobDetailDto.HandledToLocationCode, assembleIssueJobDetailDto.HandledToPackingCode, |
|
|
|
assembleIssueJobDetailDto.Status, assembleIssueJobDetailDto.HandledToLot, |
|
|
|
handledToQty).ConfigureAwait(false); |
|
|
|
await RemoveExpectOutAsync(assembleIssueJob, assembleIssueJobDetailDto, handledToQty).ConfigureAwait(false); |
|
|
|
|
|
|
|
//await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false);
|
|
|
|
|
|
|
@ -377,158 +566,33 @@ public class AssembleIssueJobAppService |
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 立体库同步
|
|
|
|
/// 判断实际TO的箱码是否被占用
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="input"></param>
|
|
|
|
/// <param name="p_loc"></param>
|
|
|
|
/// <param name="packingCode"></param>
|
|
|
|
/// <param name="jobNumber"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPost("sync-issue-job-stereo")] |
|
|
|
|
|
|
|
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<AssembleIssueJobDTO> input, string p_loc) |
|
|
|
/// <exception cref="UserFriendlyException"></exception>
|
|
|
|
private async Task CheckPackingCodeIsUserAsync(string packingCode, string jobNumber) |
|
|
|
{ |
|
|
|
ReusltObject ret = new ReusltObject(); |
|
|
|
ret.Code = "1"; |
|
|
|
ret.Message = "操作成功"; |
|
|
|
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); |
|
|
|
try |
|
|
|
var list = await _expectOutAppService.GetListByPackingCodeAsync(packingCode).ConfigureAwait(false); |
|
|
|
list = list.Where(p => p.JobNumber != jobNumber).ToList(); |
|
|
|
if (list.Any()) |
|
|
|
{ |
|
|
|
List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>(); |
|
|
|
IssueJobToRestoDTO main = new IssueJobToRestoDTO(); |
|
|
|
main.OperatorName = CurrentUser.UserName; |
|
|
|
foreach (var job in input) |
|
|
|
{ |
|
|
|
foreach (var jobitem in job.Details) |
|
|
|
{ |
|
|
|
IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO() |
|
|
|
{ |
|
|
|
Count = jobitem.HandledToQty, |
|
|
|
ProductNo = jobitem.ItemCode, |
|
|
|
NeedSite = p_loc, |
|
|
|
WorkNo = job.Number, |
|
|
|
TaskNo = job.Number |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
main.Details = IssueJobToRestoDetailDTOs; |
|
|
|
var httpclient = _httpClientFactory.CreateClient(); |
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
string json = System.Text.Json.JsonSerializer.Serialize(main); |
|
|
|
_options.Value.Address = "http://localhost:59094/";//测试地址
|
|
|
|
_options.Value.Token = "";//测试token
|
|
|
|
_options.Value.UserName = "";//测试用户名
|
|
|
|
_options.Value.Password = "";//测试密码
|
|
|
|
|
|
|
|
#endif
|
|
|
|
if (!string.IsNullOrEmpty(_options.Value.Token)) |
|
|
|
{ |
|
|
|
var token = _options.Value.Token; |
|
|
|
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); |
|
|
|
} |
|
|
|
if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password)) |
|
|
|
{ |
|
|
|
var username = _options.Value.UserName; |
|
|
|
var password = _options.Value.Password; |
|
|
|
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{username}:{password}"))); |
|
|
|
} |
|
|
|
|
|
|
|
IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, httpclient); |
|
|
|
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
ret = new ReusltObject(); |
|
|
|
ret.Code = "2"; |
|
|
|
ret.Message = ex.Message; |
|
|
|
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); |
|
|
|
throw new UserFriendlyException($"任务号【{list.First().JobNumber}】的任务,已占用【{packingCode}】箱码的库存。"); |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
[HttpPost("receive-issue-job-stereo")] |
|
|
|
public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input) |
|
|
|
private async Task RemoveExpectOutAsync(AssembleIssueJob assembleIssueJob, |
|
|
|
AssembleIssueJobDetailDTO assembleIssueJobDetailDto, |
|
|
|
decimal handledToQty) |
|
|
|
{ |
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
var json = System.Text.Json.JsonSerializer.Serialize(input); |
|
|
|
#endif
|
|
|
|
List<string> errors = new List<string>(); |
|
|
|
var ret = new ReusltObject() |
|
|
|
{ |
|
|
|
Code = "1", |
|
|
|
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), |
|
|
|
Message = "操作成功" |
|
|
|
}; |
|
|
|
try |
|
|
|
{ |
|
|
|
|
|
|
|
if (input.Jobs.Count > 0) |
|
|
|
{ |
|
|
|
var jobs = input.Jobs; |
|
|
|
var numbers = jobs.Select(p => p.JobNumber); |
|
|
|
var query = _repository.WithDetails() |
|
|
|
.Where(p => numbers.Contains(p.Number)); |
|
|
|
var entities = query.ToList(); |
|
|
|
var dtos = ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entities); |
|
|
|
if (input.Jobs.Count == entities.Count) |
|
|
|
{ |
|
|
|
errors.Add("立体库提交出库任务和WMS任务不符,请核对! \n"); |
|
|
|
} |
|
|
|
foreach (var itm in dtos) |
|
|
|
{ |
|
|
|
var first = jobs.FirstOrDefault<IssueJobFromRestoDTO>(p => p.JobNumber == itm.Number); |
|
|
|
var itmDetails = itm.Details.ToList(); |
|
|
|
List<AssembleIssueJobDetailDTO> details = new List<AssembleIssueJobDetailDTO>(); |
|
|
|
foreach (var detail in first.Details) |
|
|
|
{ |
|
|
|
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode); |
|
|
|
AssembleIssueJobDetailDTO dto = new AssembleIssueJobDetailDTO(); |
|
|
|
dto.HandledFromLocationCode = entity.HandledFromLocationCode; |
|
|
|
dto.HandledToLocationCode = entity.HandledToLocationCode; |
|
|
|
dto.ItemCode = detail.ItemCode; |
|
|
|
dto.RecommendFromQty = detail.Qty; |
|
|
|
dto.RecommendToQty = detail.Qty; |
|
|
|
dto.HandledFromQty = detail.Qty; |
|
|
|
dto.HandledToQty = detail.Qty; |
|
|
|
dto.Status = entity.Status; |
|
|
|
details.Add(dto); |
|
|
|
} |
|
|
|
itm.Details = details; |
|
|
|
await CompleteAsync(itm.Id, itm).ConfigureAwait(false); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
errors.Add("立体库确认单据里无数据! \n"); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
ret = new ReusltObject() |
|
|
|
{ |
|
|
|
Code = "2", |
|
|
|
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), |
|
|
|
Message = ex.Message |
|
|
|
}; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
if (errors.Count > 0) |
|
|
|
{ |
|
|
|
|
|
|
|
ret = new ReusltObject() |
|
|
|
{ |
|
|
|
Code = "2", |
|
|
|
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), |
|
|
|
Message = string.Join(",", errors.ToArray()) |
|
|
|
}; |
|
|
|
} |
|
|
|
return ret; |
|
|
|
await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number, |
|
|
|
assembleIssueJobDetailDto.ItemCode, |
|
|
|
assembleIssueJobDetailDto.HandledToLocationCode, assembleIssueJobDetailDto.HandledToPackingCode, |
|
|
|
assembleIssueJobDetailDto.Status, assembleIssueJobDetailDto.HandledToLot, |
|
|
|
handledToQty).ConfigureAwait(false); |
|
|
|
} |
|
|
|
|
|
|
|
#endregion
|
|
|
|
} |
|
|
|