Browse Source

优化代码

dev_DY_CC
郑勃旭 12 months ago
parent
commit
79e1107189
  1. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs
  2. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs
  3. 440
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs
  4. 181
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs
  5. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs
  6. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs
  7. 270
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs
  8. 265
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs
  9. 259
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs
  10. 211
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs

@ -9,8 +9,6 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IAssembleIssueJobAppService
: ISfsJobAppServiceBase<AssembleIssueJobDTO, SfsJobRequestInputBase, AssembleIssueJobCheckInput, AssembleIssueJobEditInput>
{
Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>
@ -20,4 +18,11 @@ public interface IAssembleIssueJobAppService
Task ExecuteDetailAsync(Guid masterId, Guid detailId, AssembleIssueJobDetailDTO issueJobDetailDto);
Task CompleteAsync(Guid id);
/// <summary>
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
Task CompleteByRequestNumberAsync(string requestNumber);
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs

@ -9,8 +9,6 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueJobAppService
: ISfsJobAppServiceBase<CoatingIssueJobDTO, SfsJobRequestInputBase, CoatingIssueJobCheckInput, CoatingIssueJobEditInput>
{
Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>

440
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs

@ -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
}

181
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs

@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization;
@ -10,7 +12,6 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MyNamespace;
using Volo.Abp;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
@ -18,12 +19,9 @@ using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options;
using static IdentityModel.ClaimComparer;
using static Volo.Abp.Identity.Settings.IdentitySettingNames;
namespace Win_in.Sfs.Wms.Store.Application;
@ -36,10 +34,10 @@ public class CoatingIssueJobAppService
{
private readonly ICoatingIssueJobManager _coatingIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly ICoatingIssueNoteAppService _coatingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
@ -47,23 +45,19 @@ public class CoatingIssueJobAppService
public CoatingIssueJobAppService(
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
ILocationAppService locationAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options
) : base(
, IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService) : base(
repository, coatingIssueJobManager)
{
_coatingIssueJobManager = coatingIssueJobManager;
_locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
_coatingIssueNoteAppService = coatingIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory;
_options = options;
_transferLibRequestAppService = transferLibRequestAppService;
}
[HttpPost("add-many")]
@ -105,27 +99,25 @@ public class CoatingIssueJobAppService
throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
if (coatingJob.JobStatus == EnumJobStatus.Open || coatingJob.JobStatus == EnumJobStatus.Partial ||
coatingJob.JobStatus == EnumJobStatus.Wait)
if (coatingJob.JobStatus == EnumJobStatus.Open ||
coatingJob.JobStatus == EnumJobStatus.Partial ||
coatingJob.JobStatus == EnumJobStatus.Wait ||
coatingJob.JobStatus == EnumJobStatus.Doing)
{
throw new UserFriendlyException($"任务状态不是{coatingJob.JobStatus == EnumJobStatus.Open}、" +
$"{coatingJob.JobStatus == EnumJobStatus.Partial}、" +
$"{coatingJob.JobStatus == EnumJobStatus.Wait}");
}
await _expectOutAppService.RemoveByNumberAsync(coatingJob.Number).ConfigureAwait(false);
coatingJob.JobStatus = EnumJobStatus.Cancelled;
await _repository.UpdateAsync(coatingJob).ConfigureAwait(false);
}
await _expectOutAppService.RemoveByNumberAsync(coatingJob.Number).ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(coatingJob.CoatingRequestNumber)
.ConfigureAwait(false);
[HttpPost("cancel-by-request/{requestNumber}")]
public virtual async Task CancelByMaterialRequestAsync(string requestNumber)
{
var entities = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
.ConfigureAwait(false);
foreach (var entity in entities)
coatingJob.JobStatus = EnumJobStatus.Cancelled;
await _repository.UpdateAsync(coatingJob).ConfigureAwait(false);
}
else
{
await _coatingIssueJobManager.CancelAsync(entity).ConfigureAwait(false);
throw new UserFriendlyException($"任务状态不是" +
$"{EnumJobStatus.Open.GetDisplayName()}、" +
$"{EnumJobStatus.Partial.GetDisplayName()}、" +
$"{EnumJobStatus.Doing.GetDisplayName()}、" +
$"{EnumJobStatus.Wait.GetDisplayName()}");
}
}
@ -211,22 +203,32 @@ public class CoatingIssueJobAppService
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty;
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty;
coatingIssueJob.Details = new EditableList<CoatingIssueJobDetail>() { issueJobDetail };
coatingIssueJob.Details = new EditableList<CoatingIssueJobDetail> { issueJobDetail };
if (coatingIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
{
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
if (issueJobDetailDto.RecommendToPackingCode != issueJobDetailDto.HandledToPackingCode)
{
await CheckPackingCodeIsUserAsync(issueJobDetailDto.HandledToPackingCode, coatingIssueJob.Number)
.ConfigureAwait(false);
}
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty)
.ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
}
else
{
var detail = coatingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id);
if (issueJobDetail.HandledToQty >= detail.RequestQty)
{
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto,
issueJobDetailDto.HandledToQty).ConfigureAwait(false);
}
else
{
await RemoveExpectOutAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
await RemoveExpectOutAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty)
.ConfigureAwait(false);
}
}
@ -234,7 +236,7 @@ public class CoatingIssueJobAppService
}
/// <summary>
/// 完成任务
/// 完成任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
@ -247,72 +249,79 @@ public class CoatingIssueJobAppService
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber).ConfigureAwait(false);
await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber)
.ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(coatingIssueJob.CoatingRequestNumber)
.ConfigureAwait(false);
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
}
/// <summary>
/// 请求点了完成,任务全部都完成
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpPost("complete-by-request/{requestNumber}")]
public async Task CompleteByRequestNumberAsync(string requestNumber)
{
var coatingIssueJobs = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber).ConfigureAwait(false);
var coatingIssueJobs = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
.ConfigureAwait(false);
foreach (var coatingIssueJob in coatingIssueJobs)
{
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(coatingIssueJob.CoatingRequestNumber)
.ConfigureAwait(false);
}
}
#region 立库
/// <summary>
/// 立体库同步
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <param name="pLoc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<CoatingIssueJobDTO> input, string p_loc)
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<CoatingIssueJobDTO> input, string pLoc)
{
ReusltObject ret = new ReusltObject();
var ret = new ReusltObject();
ret.Code = "1";
ret.Message = "操作成功";
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
try
{
List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
IssueJobToRestoDTO main = new IssueJobToRestoDTO();
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()
IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO
{
Count = jobitem.HandledToQty,
ProductNo = jobitem.ItemCode,
NeedSite = p_loc,
NeedSite = pLoc,
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 = "";//测试密码
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))
@ -320,14 +329,16 @@ public class CoatingIssueJobAppService
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}")));
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch (Exception ex)
@ -339,47 +350,40 @@ public class CoatingIssueJobAppService
}
return ret;
}
[HttpPost("receive-issue-job-stereo")]
public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input)
{
#if DEBUG
var json = System.Text.Json.JsonSerializer.Serialize(input);
var 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 = "操作成功"
};
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));
.Where(p => numbers.Contains(p.Number));
var entities = query.ToList();
var dtos = ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(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 first = jobs.FirstOrDefault(p => p.JobNumber == itm.Number);
var itmDetails = itm.Details.ToList();
List<CoatingIssueJobDetailDTO> details = new List<CoatingIssueJobDetailDTO>();
var details = new List<CoatingIssueJobDetailDTO>();
foreach (var detail in first.Details)
{
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
CoatingIssueJobDetailDTO dto = new CoatingIssueJobDetailDTO();
var dto = new CoatingIssueJobDetailDTO();
dto.HandledFromLocationCode = entity.HandledFromLocationCode;
dto.HandledToLocationCode = entity.HandledToLocationCode;
dto.ItemCode = detail.ItemCode;
@ -390,6 +394,7 @@ public class CoatingIssueJobAppService
dto.Status = entity.Status;
details.Add(dto);
}
itm.Details = details;
await CompleteAsync(itm.Id, itm).ConfigureAwait(false);
}
@ -401,24 +406,23 @@ public class CoatingIssueJobAppService
}
catch (Exception ex)
{
ret = new ReusltObject()
ret = new ReusltObject
{
Code = "2",
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
Message = ex.Message
Code = "2", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = ex.Message
};
return ret;
}
if (errors.Count > 0)
{
ret = new ReusltObject()
ret = new ReusltObject
{
Code = "2",
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
Message = string.Join(",", errors.ToArray())
};
}
return ret;
}
@ -523,18 +527,17 @@ public class CoatingIssueJobAppService
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
//TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<CoatingIssueJobDTO> { coatingIssueJobDto }, loctionDto.Code).ConfigureAwait(false);
var ret = await SyncIssueJobStereoAsync(new List<CoatingIssueJobDTO> { coatingIssueJobDto },
loctionDto.Code).ConfigureAwait(false);
if (ret.Code != "1")
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
}
}
}
/// <summary>
/// 修改当前任务状态 和 该任务的请求状态
/// 修改当前任务状态 和 该任务的请求状态
/// </summary>
/// <param name="coatingIssueJob"></param>
/// <param name="coatingIssueJobDetailDto"></param>
@ -563,7 +566,25 @@ public class CoatingIssueJobAppService
await Task.CompletedTask.ConfigureAwait(false);
}
private async Task RemoveExpectOutAsync(CoatingIssueJob coatingIssueJob, CoatingIssueJobDetailDTO coatingIssueJobDetailDto,
/// <summary>
/// 判断实际TO的箱码是否被占用
/// </summary>
/// <param name="packingCode"></param>
/// <param name="jobNumber"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task CheckPackingCodeIsUserAsync(string packingCode, string jobNumber)
{
var list = await _expectOutAppService.GetListByPackingCodeAsync(packingCode).ConfigureAwait(false);
list = list.Where(p => p.JobNumber != jobNumber).ToList();
if (list.Any())
{
throw new UserFriendlyException($"任务号【{list.First().JobNumber}】的任务,已占用【{packingCode}】箱码的库存。");
}
}
private async Task RemoveExpectOutAsync(CoatingIssueJob coatingIssueJob,
CoatingIssueJobDetailDTO coatingIssueJobDetailDto,
decimal handledToQty)
{
await _expectOutAppService.RemoveByNumberAndInventoryAsync(coatingIssueJob.Number,

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs

@ -283,10 +283,10 @@ public class InjectionIssueJobAppService
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <param name="pLoc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<InjectionIssueJobDTO> input, string p_loc)
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<InjectionIssueJobDTO> input, string pLoc)
{
var ret = new ReusltObject();
ret.Code = "1";
@ -305,7 +305,7 @@ public class InjectionIssueJobAppService
{
Count = jobitem.HandledToQty,
ProductNo = jobitem.ItemCode,
NeedSite = p_loc,
NeedSite = pLoc,
WorkNo = job.Number,
TaskNo = job.Number
});

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs

@ -283,10 +283,10 @@ public class KittingIssueJobAppService
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <param name="pLoc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<KittingIssueJobDTO> input, string p_loc)
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<KittingIssueJobDTO> input, string pLoc)
{
var ret = new ReusltObject();
ret.Code = "1";
@ -305,7 +305,7 @@ public class KittingIssueJobAppService
{
Count = jobitem.HandledToQty,
ProductNo = jobitem.ItemCode,
NeedSite = p_loc,
NeedSite = pLoc,
WorkNo = job.Number,
TaskNo = job.Number
});

270
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs

@ -9,6 +9,7 @@ using NUglify.Helpers;
using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -16,44 +17,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application;
/// <summary>
/// 装配叫料申请
/// 装配叫料申请
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}assemble-issue-request")]
public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<AssembleIssueRequest, AssembleIssueRequestDTO,
SfsStoreRequestInputBase, AssembleIssueRequestEditInput, AssembleIssueRequestDetail, AssembleIssueRequestDetailDTO,
public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<AssembleIssueRequest,
AssembleIssueRequestDTO,
SfsStoreRequestInputBase, AssembleIssueRequestEditInput, AssembleIssueRequestDetail,
AssembleIssueRequestDetailDTO,
SfsStoreRequestInputBase, AssembleIssueRequestImportInput>,
IAssembleIssueRequestAppService
{
private readonly IAssembleIssueRequestManager _assembleIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IAssembleIssueJobAppService _assembleIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public AssembleIssueRequestAppService(
IAssembleIssueRequestRepository repository,
IAssembleIssueRequestManager assembleIssueRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService, IAssembleIssueJobAppService assembleIssueJobAppService)
ITransactionTypeAppService transactionTypeAppService,
IAssembleIssueJobAppService assembleIssueJobAppService)
: base(repository, assembleIssueRequestManager)
{
_assembleIssueRequestManager = assembleIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService;
_assembleIssueJobAppService = assembleIssueJobAppService;
}
@ -63,6 +58,61 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
return await base.HandleAsync(id).ConfigureAwait(false);
}
public override async Task<AssembleIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _assembleIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var assembleIssueJobDto in list)
{
if (assembleIssueJobDto.JobStatus == EnumJobStatus.Open ||
assembleIssueJobDto.JobStatus == EnumJobStatus.Partial ||
assembleIssueJobDto.JobStatus == EnumJobStatus.Doing ||
assembleIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _assembleIssueJobAppService.CancelAsync(assembleIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<AssembleIssueRequest, AssembleIssueRequestDTO>(request);
}
public override async Task<AssembleIssueRequestDTO> CompleteAsync(Guid id)
{
var assembleIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (assembleIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
assembleIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
assembleIssueRequest.RequestStatus == EnumRequestStatus.New)
{
assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{assembleIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _assembleIssueJobAppService.CompleteByRequestNumberAsync(assembleIssueRequest.Number)
.ConfigureAwait(false);
return ObjectMapper.Map<AssembleIssueRequest, AssembleIssueRequestDTO>(await _repository
.UpdateAsync(assembleIssueRequest)
.ConfigureAwait(false));
}
[HttpPost("")]
public override async Task<AssembleIssueRequestDTO> CreateAsync(AssembleIssueRequestEditInput input)
{
@ -81,7 +131,8 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode)
.ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
@ -100,7 +151,7 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
//因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.SEMI;
detailInput.RecommendType = EnumRecommendType.KITTING;
}
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
@ -113,23 +164,6 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
return dto;
}
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(AssembleIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
[HttpPost("create-and-handle")]
public async Task<AssembleIssueRequestDTO> CreateAndHandleAsync(AssembleIssueRequestEditInput input)
{
@ -140,36 +174,17 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
return assembleIssueRequestDto;
}
public override async Task<AssembleIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _assembleIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var assembleIssueJobDto in list)
{
if (assembleIssueJobDto.JobStatus == EnumJobStatus.Open ||
assembleIssueJobDto.JobStatus == EnumJobStatus.Partial ||
assembleIssueJobDto.JobStatus == EnumJobStatus.Doing ||
assembleIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _assembleIssueJobAppService.CancelAsync(assembleIssueJobDto.Id).ConfigureAwait(false);
}
}
}
return await base.CancelAsync(id).ConfigureAwait(false);
}
[HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number)
{
var assembleIssueRequest = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false);
await UpdateAssembleIssueRequestDetailQtyAsync(assembleIssueRequest, new EditableList<AssembleIssueJobDTO>()).ConfigureAwait(false);
await UpdateAssembleIssueRequestDetailQtyAsync(assembleIssueRequest, new EditableList<AssembleIssueJobDTO>())
.ConfigureAwait(false);
var assembleIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(assembleIssueRequest.Number).ConfigureAwait(false);
var assembleIssueJobDtos = await _assembleIssueJobAppService
.GetByRequestNumberAsync(assembleIssueRequest.Number)
.ConfigureAwait(false);
if (assembleIssueJobDtos.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
@ -177,26 +192,61 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
{
return;
}
else
{
bool flag = true;
foreach (var detail in assembleIssueRequest.Details)
foreach (var detail in assembleIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
return;
}
}
CheckStatus(EnumRequestStatus.Completed, assembleIssueRequest.RequestStatus);
assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(assembleIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _assembleIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
if (flag)
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
CheckStatus(EnumRequestStatus.Completed, assembleIssueRequest.RequestStatus);
assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(assembleIssueRequest).ConfigureAwait(false);
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
#region 私有
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(AssembleIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
/// <summary>
@ -209,7 +259,8 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
List<AssembleIssueJobDTO> addAssembleIssueJobDtos)
{
//原有任务
var existAssembleIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(assembleIssueRequest.Number)
var existAssembleIssueJobDtos = await _assembleIssueJobAppService
.GetByRequestNumberAsync(assembleIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
@ -247,32 +298,7 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
await _repository.UpdateAsync(assembleIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
else
{
return "无任务生成,请检查库存";
}
}
else
{
return "无任务生成,请检查库存";
}
}
#endregion
#region 校验
@ -297,32 +323,32 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Agreed, EnumRequestStatus.Partial,
EnumRequestStatus.Agreed, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed,
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed
};
break;
case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
}
@ -354,7 +380,8 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
if (locationDto.Type != EnumLocationType.WIP)
{
throw new UserFriendlyException($"库位代码【{locationCode}】不是【{EnumLocationType.WIP.GetDisplayName()}】类型");
throw new UserFriendlyException(
$"库位代码【{locationCode}】不是【{EnumLocationType.WIP.GetDisplayName()}】类型");
}
}
@ -367,4 +394,43 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
}
#endregion
#region 视觉使用
/// <summary>
/// 获取已完成的叫料单数量
/// </summary>
/// <returns></returns>
[HttpPost("get-uncompleted-request")]
public async Task<List<UnCompletedRequestDto>> GetUnCompletedRequestAsync(List<UnCompletedRequestDto> pList)
{
var returnList = new List<UnCompletedRequestDto>();
//枚举类型查不到改成SQL查询
var list = await _repository.GetListAsync(p =>
p.RequestStatus != EnumRequestStatus.Completed && p.IssueRequestType == EnumIssueRequestType.Vision)
.ConfigureAwait(false);
foreach (var itm in list)
{
var query = from detail in itm.Details
join citm in pList on new
{
detail.ItemCode,
locCode = detail.ToLocationCode,
areaCode = detail.PositionCode
} equals
new { citm.ItemCode, locCode = citm.LocCode, areaCode = citm.PositionCode }
select new UnCompletedRequestDto
{
ItemCode = detail.ItemCode,
LocCode = detail.ToLocationCode,
PositionCode = detail.PositionCode
};
returnList.AddRange(query.ToList());
}
return returnList;
}
#endregion
}

265
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs

@ -9,6 +9,7 @@ using NUglify.Helpers;
using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -16,44 +17,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application;
/// <summary>
/// 喷涂叫料申请
/// 喷涂叫料申请
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}coating-issue-request")]
public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest, CoatingIssueRequestDTO,
SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail, CoatingIssueRequestDetailDTO,
public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest,
CoatingIssueRequestDTO,
SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail,
CoatingIssueRequestDetailDTO,
SfsStoreRequestInputBase, CoatingIssueRequestImportInput>,
ICoatingIssueRequestAppService
{
private readonly ICoatingIssueRequestManager _coatingIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public CoatingIssueRequestAppService(
ICoatingIssueRequestRepository repository,
ICoatingIssueRequestManager coatingIssueRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService, ICoatingIssueJobAppService coatingIssueJobAppService)
ITransactionTypeAppService transactionTypeAppService,
ICoatingIssueJobAppService coatingIssueJobAppService)
: base(repository, coatingIssueRequestManager)
{
_coatingIssueRequestManager = coatingIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService;
_coatingIssueJobAppService = coatingIssueJobAppService;
}
@ -63,6 +58,61 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
return await base.HandleAsync(id).ConfigureAwait(false);
}
public override async Task<CoatingIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _coatingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var coatingIssueJobDto in list)
{
if (coatingIssueJobDto.JobStatus == EnumJobStatus.Open ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Partial ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Doing ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _coatingIssueJobAppService.CancelAsync(coatingIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(request);
}
public override async Task<CoatingIssueRequestDTO> CompleteAsync(Guid id)
{
var coatingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (coatingIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
coatingIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
coatingIssueRequest.RequestStatus == EnumRequestStatus.New)
{
coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{coatingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _coatingIssueJobAppService.CompleteByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(await _repository
.UpdateAsync(coatingIssueRequest)
.ConfigureAwait(false));
}
[HttpPost("")]
public override async Task<CoatingIssueRequestDTO> CreateAsync(CoatingIssueRequestEditInput input)
{
@ -101,7 +151,7 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
//因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.SEMI;
detailInput.RecommendType = EnumRecommendType.KITTING;
}
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
@ -114,23 +164,6 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
return dto;
}
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
[HttpPost("create-and-handle")]
public async Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input)
{
@ -141,39 +174,6 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
return coatingIssueRequestDto;
}
public override async Task<CoatingIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _coatingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var coatingIssueJobDto in list)
{
if (coatingIssueJobDto.JobStatus == EnumJobStatus.Open ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Partial ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Doing ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _coatingIssueJobAppService.CancelAsync(coatingIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(request);
}
[HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number)
{
@ -182,7 +182,8 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
await UpdateCoatingIssueRequestDetailQtyAsync(coatingIssueRequest, new EditableList<CoatingIssueJobDTO>())
.ConfigureAwait(false);
var coatingIssueJobDtos = await _coatingIssueJobAppService.GetByRequestNumberAsync(coatingIssueRequest.Number)
var coatingIssueJobDtos = await _coatingIssueJobAppService
.GetByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
if (coatingIssueJobDtos.Any(p =>
@ -192,23 +193,60 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
return;
}
var flag = true;
foreach (var detail in coatingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag)
CheckStatus(EnumRequestStatus.Completed, coatingIssueRequest.RequestStatus);
coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _coatingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
CheckStatus(EnumRequestStatus.Completed, coatingIssueRequest.RequestStatus);
coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false);
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
#region 私有
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
/// <summary>
@ -260,49 +298,7 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _coatingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
public override async Task<CoatingIssueRequestDTO> CompleteAsync(Guid id)
{
var coatingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (coatingIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
coatingIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
coatingIssueRequest.RequestStatus == EnumRequestStatus.New)
{
coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{coatingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _coatingIssueJobAppService.CompleteByRequestNumberAsync(coatingIssueRequest.Number).ConfigureAwait(false);
return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(await _repository.UpdateAsync(coatingIssueRequest)
.ConfigureAwait(false));
}
#endregion
#region 校验
@ -398,4 +394,43 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
}
#endregion
#region 视觉使用
/// <summary>
/// 获取已完成的叫料单数量
/// </summary>
/// <returns></returns>
[HttpPost("get-uncompleted-request")]
public async Task<List<UnCompletedRequestDto>> GetUnCompletedRequestAsync(List<UnCompletedRequestDto> pList)
{
var returnList = new List<UnCompletedRequestDto>();
//枚举类型查不到改成SQL查询
var list = await _repository.GetListAsync(p =>
p.RequestStatus != EnumRequestStatus.Completed && p.IssueRequestType == EnumIssueRequestType.Vision)
.ConfigureAwait(false);
foreach (var itm in list)
{
var query = from detail in itm.Details
join citm in pList on new
{
detail.ItemCode,
locCode = detail.ToLocationCode,
areaCode = detail.PositionCode
} equals
new { citm.ItemCode, locCode = citm.LocCode, areaCode = citm.PositionCode }
select new UnCompletedRequestDto
{
ItemCode = detail.ItemCode,
LocCode = detail.ToLocationCode,
PositionCode = detail.PositionCode
};
returnList.AddRange(query.ToList());
}
return returnList;
}
#endregion
}

259
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs

@ -17,44 +17,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application;
/// <summary>
/// 注塑叫料申请
/// 注塑叫料申请
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}injection-issue-request")]
public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<InjectionIssueRequest, InjectionIssueRequestDTO,
SfsStoreRequestInputBase, InjectionIssueRequestEditInput, InjectionIssueRequestDetail, InjectionIssueRequestDetailDTO,
public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<InjectionIssueRequest,
InjectionIssueRequestDTO,
SfsStoreRequestInputBase, InjectionIssueRequestEditInput, InjectionIssueRequestDetail,
InjectionIssueRequestDetailDTO,
SfsStoreRequestInputBase, InjectionIssueRequestImportInput>,
IInjectionIssueRequestAppService
{
private readonly IInjectionIssueRequestManager _injectionIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IInjectionIssueJobAppService _injectionIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public InjectionIssueRequestAppService(
IInjectionIssueRequestRepository repository,
IInjectionIssueRequestManager injectionIssueRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService, IInjectionIssueJobAppService injectionIssueJobAppService)
ITransactionTypeAppService transactionTypeAppService,
IInjectionIssueJobAppService injectionIssueJobAppService)
: base(repository, injectionIssueRequestManager)
{
_injectionIssueRequestManager = injectionIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService;
_injectionIssueJobAppService = injectionIssueJobAppService;
}
@ -64,6 +58,61 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
return await base.HandleAsync(id).ConfigureAwait(false);
}
public override async Task<InjectionIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _injectionIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var injectionIssueJobDto in list)
{
if (injectionIssueJobDto.JobStatus == EnumJobStatus.Open ||
injectionIssueJobDto.JobStatus == EnumJobStatus.Partial ||
injectionIssueJobDto.JobStatus == EnumJobStatus.Doing ||
injectionIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _injectionIssueJobAppService.CancelAsync(injectionIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<InjectionIssueRequest, InjectionIssueRequestDTO>(request);
}
public override async Task<InjectionIssueRequestDTO> CompleteAsync(Guid id)
{
var injectionIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (injectionIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
injectionIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
injectionIssueRequest.RequestStatus == EnumRequestStatus.New)
{
injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{injectionIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _injectionIssueJobAppService.CompleteByRequestNumberAsync(injectionIssueRequest.Number)
.ConfigureAwait(false);
return ObjectMapper.Map<InjectionIssueRequest, InjectionIssueRequestDTO>(await _repository
.UpdateAsync(injectionIssueRequest)
.ConfigureAwait(false));
}
[HttpPost("")]
public override async Task<InjectionIssueRequestDTO> CreateAsync(InjectionIssueRequestEditInput input)
{
@ -115,23 +164,6 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
return dto;
}
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(InjectionIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
[HttpPost("create-and-handle")]
public async Task<InjectionIssueRequestDTO> CreateAndHandleAsync(InjectionIssueRequestEditInput input)
{
@ -142,39 +174,6 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
return injectionIssueRequestDto;
}
public override async Task<InjectionIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _injectionIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var injectionIssueJobDto in list)
{
if (injectionIssueJobDto.JobStatus == EnumJobStatus.Open ||
injectionIssueJobDto.JobStatus == EnumJobStatus.Partial ||
injectionIssueJobDto.JobStatus == EnumJobStatus.Doing ||
injectionIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _injectionIssueJobAppService.CancelAsync(injectionIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<InjectionIssueRequest, InjectionIssueRequestDTO>(request);
}
[HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number)
{
@ -183,7 +182,8 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
await UpdateInjectionIssueRequestDetailQtyAsync(injectionIssueRequest, new EditableList<InjectionIssueJobDTO>())
.ConfigureAwait(false);
var injectionIssueJobDtos = await _injectionIssueJobAppService.GetByRequestNumberAsync(injectionIssueRequest.Number)
var injectionIssueJobDtos = await _injectionIssueJobAppService
.GetByRequestNumberAsync(injectionIssueRequest.Number)
.ConfigureAwait(false);
if (injectionIssueJobDtos.Any(p =>
@ -193,23 +193,60 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
return;
}
var flag = true;
foreach (var detail in injectionIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag)
CheckStatus(EnumRequestStatus.Completed, injectionIssueRequest.RequestStatus);
injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(injectionIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _injectionIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
CheckStatus(EnumRequestStatus.Completed, injectionIssueRequest.RequestStatus);
injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(injectionIssueRequest).ConfigureAwait(false);
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
#region 私有
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(InjectionIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
/// <summary>
@ -261,49 +298,7 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
await _repository.UpdateAsync(injectionIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _injectionIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
public override async Task<InjectionIssueRequestDTO> CompleteAsync(Guid id)
{
var injectionIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (injectionIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
injectionIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
injectionIssueRequest.RequestStatus == EnumRequestStatus.New)
{
injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{injectionIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _injectionIssueJobAppService.CompleteByRequestNumberAsync(injectionIssueRequest.Number).ConfigureAwait(false);
return ObjectMapper.Map<InjectionIssueRequest, InjectionIssueRequestDTO>(await _repository.UpdateAsync(injectionIssueRequest)
.ConfigureAwait(false));
}
#endregion
#region 校验
@ -350,13 +345,13 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
}
break;
}
default:
throw new ArgumentOutOfRangeException(nameof(targetStatus), targetStatus, null);
}
@ -398,12 +393,16 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
}
}
#endregion
#region 视觉使用
/// <summary>
/// 获取已完成的叫料单数量
/// </summary>
/// <returns></returns>
[HttpPost("get-uncompleted-request")]
public async Task<List<UnCompletedRequestDto>> GetUnCompletedRequestAsync(List<UnCompletedRequestDto> p_list)
public async Task<List<UnCompletedRequestDto>> GetUnCompletedRequestAsync(List<UnCompletedRequestDto> pList)
{
var returnList = new List<UnCompletedRequestDto>();
//枚举类型查不到改成SQL查询
@ -413,19 +412,15 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
foreach (var itm in list)
{
var query = from detail in itm.Details
join citm in p_list on new
{
detail.ItemCode,
locCode = detail.ToLocationCode,
areaCode = detail.PositionCode
} equals
new { citm.ItemCode, locCode = citm.LocCode, areaCode = citm.PositionCode }
select new UnCompletedRequestDto
{
ItemCode = detail.ItemCode,
LocCode = detail.ToLocationCode,
PositionCode = detail.PositionCode
};
join citm in pList on new
{
detail.ItemCode, locCode = detail.ToLocationCode, areaCode = detail.PositionCode
} equals
new { citm.ItemCode, locCode = citm.LocCode, areaCode = citm.PositionCode }
select new UnCompletedRequestDto
{
ItemCode = detail.ItemCode, LocCode = detail.ToLocationCode, PositionCode = detail.PositionCode
};
returnList.AddRange(query.ToList());
}

211
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs

@ -26,34 +26,26 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
IKittingIssueRequestAppService
{
private readonly IKittingIssueRequestManager _kittingIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IKittingIssueJobAppService _kittingIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public KittingIssueRequestAppService(
IKittingIssueRequestRepository repository,
IKittingIssueRequestManager kittingIssueRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService, IKittingIssueJobAppService kittingIssueJobAppService)
ITransactionTypeAppService transactionTypeAppService,
IKittingIssueJobAppService kittingIssueJobAppService)
: base(repository, kittingIssueRequestManager)
{
_kittingIssueRequestManager = kittingIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService;
_kittingIssueJobAppService = kittingIssueJobAppService;
}
@ -63,6 +55,60 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
return await base.HandleAsync(id).ConfigureAwait(false);
}
public override async Task<KittingIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _kittingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var kittingIssueJobDto in list)
{
if (kittingIssueJobDto.JobStatus == EnumJobStatus.Open ||
kittingIssueJobDto.JobStatus == EnumJobStatus.Partial ||
kittingIssueJobDto.JobStatus == EnumJobStatus.Doing ||
kittingIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _kittingIssueJobAppService.CancelAsync(kittingIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<KittingIssueRequest, KittingIssueRequestDTO>(request);
}
public override async Task<KittingIssueRequestDTO> CompleteAsync(Guid id)
{
var kittingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (kittingIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
kittingIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
kittingIssueRequest.RequestStatus == EnumRequestStatus.New)
{
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{kittingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _kittingIssueJobAppService.CompleteByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false);
return ObjectMapper.Map<KittingIssueRequest, KittingIssueRequestDTO>(await _repository
.UpdateAsync(kittingIssueRequest)
.ConfigureAwait(false));
}
[HttpPost("")]
public override async Task<KittingIssueRequestDTO> CreateAsync(KittingIssueRequestEditInput input)
{
@ -114,23 +160,6 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
return dto;
}
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(KittingIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
[HttpPost("create-and-handle")]
public async Task<KittingIssueRequestDTO> CreateAndHandleAsync(KittingIssueRequestEditInput input)
{
@ -141,39 +170,6 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
return kittingIssueRequestDto;
}
public override async Task<KittingIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _kittingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var kittingIssueJobDto in list)
{
if (kittingIssueJobDto.JobStatus == EnumJobStatus.Open ||
kittingIssueJobDto.JobStatus == EnumJobStatus.Partial ||
kittingIssueJobDto.JobStatus == EnumJobStatus.Doing ||
kittingIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _kittingIssueJobAppService.CancelAsync(kittingIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<KittingIssueRequest, KittingIssueRequestDTO>(request);
}
[HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number)
{
@ -192,23 +188,60 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
return;
}
var flag = true;
foreach (var detail in kittingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag)
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus);
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _kittingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus);
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
#region 私有
/// <summary>
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(KittingIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
/// <summary>
@ -260,49 +293,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _kittingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
public override async Task<KittingIssueRequestDTO> CompleteAsync(Guid id)
{
var kittingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (kittingIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
kittingIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
kittingIssueRequest.RequestStatus == EnumRequestStatus.New)
{
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{kittingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await _kittingIssueJobAppService.CompleteByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false);
return ObjectMapper.Map<KittingIssueRequest, KittingIssueRequestDTO>(await _repository.UpdateAsync(kittingIssueRequest)
.ConfigureAwait(false));
}
#endregion
#region 校验

Loading…
Cancel
Save