Browse Source

修改agv

Agv分支2024-11-19
郑勃旭 5 months ago
parent
commit
a3c488a537
  1. 6
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/DTOs/LocationDTO.cs
  2. 6
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/Inputs/LocationEditInput.cs
  3. 6
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/Inputs/LocationImportInput.cs
  4. 2
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PostionLocations/DTOs/PostionLocationDTO.cs
  5. 2
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Locations/Location.cs
  6. 84
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PostionLocations/PostionLocation.cs
  7. 6
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs
  8. 200
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs
  9. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs
  10. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs
  11. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs
  12. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/SparePartIssueJobs/SparePartIssueJobAppService.cs

6
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/DTOs/LocationDTO.cs

@ -189,4 +189,10 @@ public class LocationDTO : SfsBaseDataDTOBase, IHasCode, IHasName, IHasLocationS
/// </summary>
[Display(Name = "是否可以拆托")]
public bool EnableSplitPallet { get; set; } = true;
/// <summary>
/// 是否AGV配送
/// </summary>
[Display(Name = "是否AGV配送")]
public bool EnableAgv { get; set; } = false; //是否AGV配送
}

6
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/Inputs/LocationEditInput.cs

@ -177,6 +177,12 @@ public class LocationEditInput : SfsBaseDataWithWarehouseCreateOrUpdateInputBase
/// </summary>
[Display(Name = "是否可以拆托")]
public bool EnableSplitPallet { get; set; } = true;
/// <summary>
/// 是否AGV配送
/// </summary>
[Display(Name = "是否AGV配送")]
public bool EnableAgv { get; set; } = false; //是否AGV配送
#endregion
#region Create

6
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/Inputs/LocationImportInput.cs

@ -210,6 +210,12 @@ public class LocationImportInput : SfsBaseDataImportInputBase, IHasLocationSwitc
[Required(ErrorMessage = "{0}是必填项")]
public bool EnableSplitPallet { get; set; } = true;
/// <summary>
/// 是否AGV配送
/// </summary>
[Display(Name = "是否AGV配送")]
public bool EnableAgv { get; set; } = false; //是否AGV配送
/// <summary>
/// 描述
/// </summary>

2
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PostionLocations/DTOs/PostionLocationDTO.cs

@ -5,7 +5,7 @@ using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Basedata.Application.Contracts;
/// <summary>
/// 库位
/// 工作站库位对应关系
/// </summary>
[Display(Name = "工作站库位对应关系")]
public class PostionLocationDTO : SfsBaseDataDTOBase, IHasCode, IHasName

2
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Locations/Location.cs

@ -98,5 +98,5 @@ public class Location : SfsBaseDataAggregateRootBase, IHasCode, IHasName, IHasLo
public bool EnableReturnFromCustomer { get; set; } = true; // 可以接收客户退货
public bool EnableSplitBox { get; set; } = true; //是否可以拆箱
public bool EnableSplitPallet { get; set; } = true; //是否可以拆托
public bool EnableAgv { get; set; } = false; //是否AGV配送
}

84
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/PostionLocations/PostionLocation.cs

@ -4,14 +4,16 @@ using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Basedata.Domain;
/// <summary>
/// 工位 库位 关系
/// </summary>
public class PostionLocation : SfsBaseDataAggregateRootBase, IHasCode, IHasName
{
/// <summary>
/// 代码
/// </summary>
[IgnoreUpdate]
[Display(Name ="工作站编号")]
[Display(Name = "工位代码")]
public string Code { get; set; }
/// <summary>
@ -25,82 +27,4 @@ public class PostionLocation : SfsBaseDataAggregateRootBase, IHasCode, IHasName
/// </summary>
[Display(Name ="库位")]
public string LocationCode { get; set; }
///// <summary>
///// 库位类型
///// </summary>
//public EnumLocationType Type { get; set; }
///// <summary>
///// ERP系统库位代码
///// </summary>
//public string ErpLocationCode { get; set; }
///// <summary>
///// 仓库代码
///// </summary>
//public string WarehouseCode { get; set; }
///// <summary>
///// 区域代码
///// </summary>
//public string AreaCode { get; set; }
///// <summary>
///// 库位组代码
///// </summary>
//public string LocationGroupCode { get; set; }
///// <summary>
///// 工作组代码
///// </summary>
//public string WorkGroupCode { get; set; }
///// <summary>
///// 货架号
///// </summary>
//public string ShelfCode { get; set; }
///// <summary>
///// 行号
///// </summary>
//public int RowCode { get; set; }
///// <summary>
///// 列号
///// </summary>
//public int ColumnCode { get; set; }
///// <summary>
///// 默认库存状态
///// </summary>
//public EnumInventoryStatus DefaultInventoryStatus { get; set; }
///// <summary>
///// 拣料优先级
///// </summary>
//public int PickPriority { get; set; }
///// <summary>
///// 拣料顺序
///// </summary>
//public int PickOrder { get; set; }
//public bool EnableMixItem { get; set; } = true; // 可以混物品
//public bool EnableMixLot { get; set; } = true; // 可以混批次
//public bool EnableMixStatus { get; set; } = true; // 可以混状态
//public bool EnableNegative { get; set; } = true; // 可以负库存
//public bool EnableKeepZero { get; set; } = true; // 可以保留零库存
//public bool EnableOpportunityCount { get; set; } = true; // 可以机会盘点
//public bool EnablePick { get; set; } = true; // 可以领料
//public bool EnableOverPick { get; set; } = true; // 可以过量领料
//public bool EnableWholeStore { get; set; } = true; // 可以整包存储
//public bool EnableBreakStore { get; set; } = true; // 可以散件存储
//public bool EnableShip { get; set; } = true; // 可以发出
//public bool EnableReceive { get; set; } = true; // 可以接收
//public bool EnableReturnToSupplier { get; set; } = true; // 可以退货给供应商
//public bool EnableReturnFromCustomer { get; set; } = true; // 可以接收客户退货
//public bool EnableSplitBox { get; set; } = true; //是否可以拆箱
//public bool EnableSplitPallet { get; set; } = true; //是否可以拆托
}

6
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs

@ -52,4 +52,10 @@ public enum EnumJobStatus
/// </summary>
[Display(Name = "待库移")]
Wait=30,
/// <summary>
/// 待AGV库移
/// </summary>
[Display(Name = "待AGV库移")]
WaitAgv = 31,
}

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

@ -87,7 +87,7 @@ public class AssembleIssueJobAppService
{
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
//如果是立库 就给直接承接了
var dimensionalStorehouseflag = await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var dimensionalStorehouseflag = await UpdateJobStatusWaitByDimensionalStorehouseAsync(input).ConfigureAwait(false);
if (dimensionalStorehouseflag)
{
input.IsClaims = true;
@ -98,12 +98,26 @@ public class AssembleIssueJobAppService
? "LYF"
: _options.Value.StereosPassword;
}
//如果是Agv
var agvFlag = await UpdateJobStatusWaitByAgvAsync(input).ConfigureAwait(false);
if (agvFlag)
{
input.IsClaims = true;
input.ClaimsUserId = string.IsNullOrEmpty(_options.Value.StereosUser)
? "AGV"
: _options.Value.StereosUser;
input.ClaimsUserName = string.IsNullOrEmpty(_options.Value.StereosPassword)
? "AGV"
: _options.Value.StereosPassword;
}
}
var assembleIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var assembleIssueJobDto in assembleIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(assembleIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(assembleIssueJobDto).ConfigureAwait(false);
await DoingAgvAsync(assembleIssueJobDto).ConfigureAwait(false);
}
return assembleIssueJobDtos;
@ -113,10 +127,12 @@ public class AssembleIssueJobAppService
public override async Task<AssembleIssueJobDTO> CreateAsync(AssembleIssueJobEditInput input)
{
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
await UpdateJobStatusWaitByDimensionalStorehouseAsync(input).ConfigureAwait(false);
await UpdateJobStatusWaitByAgvAsync(input).ConfigureAwait(false);
var assembleIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(assembleIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(assembleIssueJobDto).ConfigureAwait(false);
await DoingAgvAsync(assembleIssueJobDto).ConfigureAwait(false);
return assembleIssueJobDto;
}
@ -447,6 +463,50 @@ public class AssembleIssueJobAppService
#region 立库
/// <summary>
/// 调用立体库
/// </summary>
/// <param name="assembleIssueJobDto"></param>
/// <returns></returns>
private async Task DoingDimensionalStorehouseAsync(AssembleIssueJobDTO assembleIssueJobDto)
{
var jobDetailInputdetail = assembleIssueJobDto.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
//TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<AssembleIssueJobDTO> { assembleIssueJobDto },
jobDetailInputdetail.RecommendToLocationCode, assembleIssueJobDto.Id).ConfigureAwait(false);
if (ret.Code != 0)
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
}
}
}
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task<bool> UpdateJobStatusWaitByDimensionalStorehouseAsync(AssembleIssueJobEditInput input)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
input.JobStatus = EnumJobStatus.Wait;
return true;
}
return false;
}
/// <summary>
/// 立体库同步
/// </summary>
@ -710,6 +770,74 @@ public class AssembleIssueJobAppService
#endregion
#region Agv
/// <summary>
/// 调用AGV
/// </summary>
/// <param name="assembleIssueJobDto"></param>
/// <returns></returns>
private async Task DoingAgvAsync(AssembleIssueJobDTO assembleIssueJobDto)
{
var jobDetailInputdetail = assembleIssueJobDto.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.EnableAgv)
{
//TODO AGV
var ret = await SyncIssueJobStereoAsync(new List<AssembleIssueJobDTO> { assembleIssueJobDto },
jobDetailInputdetail.RecommendToLocationCode, assembleIssueJobDto.Id).ConfigureAwait(false);
if (ret.Code != 0)
{
throw new UserFriendlyException($"调用AGV不成功!原因:{ret.Message}");
}
}
}
/// <summary>
/// 判断是不是有Agv
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task<bool> UpdateJobStatusWaitByAgvAsync(AssembleIssueJobEditInput input)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.EnableAgv)
{
input.JobStatus = EnumJobStatus.WaitAgv;
return true;
}
return false;
}
/// <summary>
/// 调用 Agv 接口
/// </summary>
/// <param name="input"></param>
/// <param name="pLoc"></param>
/// <param name="uid"></param>
/// <returns></returns>
[HttpPost("call-agv")]
public async Task<ReusltObject> CallAgvAsync(List<AssembleIssueJobDTO> input)
{
return null;
}
[HttpPost("call-back-agv")]
public virtual async Task<ReusltObject> CallBackAgvAsync(IssueRequestFromRestoDTO input)
{
return null;
}
#endregion
#region 私有
/// <summary>
@ -776,70 +904,6 @@ public class AssembleIssueJobAppService
}
}
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
//private async Task CheckDimensionalStorehouseAsync(AssembleIssueJobEditInput input)
//{
// var jobDetailInputdetail = input.Details.FirstOrDefault();
// var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
// .ConfigureAwait(false);
// if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
// {
// input.JobStatus = EnumJobStatus.Wait;
// }
//}
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task<bool> CheckDimensionalStorehouseAsync(AssembleIssueJobEditInput input)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
input.JobStatus = EnumJobStatus.Wait;
return true;
}
return false;
}
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="assembleIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(AssembleIssueJobDTO assembleIssueJobDto)
{
var jobDetailInputdetail = assembleIssueJobDto.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
//TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<AssembleIssueJobDTO> { assembleIssueJobDto },
jobDetailInputdetail.RecommendToLocationCode, assembleIssueJobDto.Id).ConfigureAwait(false);
if (ret.Code != 0)
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
}
}
}
/// <summary>
/// 修改当前任务状态 和 该任务的请求状态
/// </summary>

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

@ -92,7 +92,7 @@ public class CoatingIssueJobAppService
var coatingIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var coatingIssueJobDto in coatingIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
}
return coatingIssueJobDtos;
@ -105,7 +105,7 @@ public class CoatingIssueJobAppService
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var coatingIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
return coatingIssueJobDto;
}
@ -637,11 +637,11 @@ public class CoatingIssueJobAppService
}
/// <summary>
/// 判断是不是在立体库
/// 调用立体库
/// </summary>
/// <param name="coatingIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(CoatingIssueJobDTO coatingIssueJobDto)
private async Task DoingDimensionalStorehouseAsync(CoatingIssueJobDTO coatingIssueJobDto)
{
var jobDetailInputdetail = coatingIssueJobDto.Details.FirstOrDefault();

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

@ -84,7 +84,7 @@ public class InjectionIssueJobAppService
var injectionIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var injectionIssueJobDto in injectionIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(injectionIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(injectionIssueJobDto).ConfigureAwait(false);
}
return injectionIssueJobDtos;
@ -97,7 +97,7 @@ public class InjectionIssueJobAppService
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var injectionIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(injectionIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(injectionIssueJobDto).ConfigureAwait(false);
return injectionIssueJobDto;
}
@ -590,11 +590,11 @@ public class InjectionIssueJobAppService
}
/// <summary>
/// 判断是不是在立体库
/// 调用立体库
/// </summary>
/// <param name="injectionIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(InjectionIssueJobDTO injectionIssueJobDto)
private async Task DoingDimensionalStorehouseAsync(InjectionIssueJobDTO injectionIssueJobDto)
{
var jobDetailInputdetail = injectionIssueJobDto.Details.FirstOrDefault();

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

@ -92,7 +92,7 @@ public class KittingIssueJobAppService
var kittingIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var kittingIssueJobDto in kittingIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
}
return kittingIssueJobDtos;
@ -105,7 +105,7 @@ public class KittingIssueJobAppService
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var kittingIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
return kittingIssueJobDto;
}
@ -600,11 +600,11 @@ public class KittingIssueJobAppService
}
/// <summary>
/// 判断是不是在立体库
/// 调用立体库
/// </summary>
/// <param name="kittingIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(KittingIssueJobDTO kittingIssueJobDto)
private async Task DoingDimensionalStorehouseAsync(KittingIssueJobDTO kittingIssueJobDto)
{
var jobDetailInputdetail = kittingIssueJobDto.Details.FirstOrDefault();

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/SparePartIssueJobs/SparePartIssueJobAppService.cs

@ -85,7 +85,7 @@ public class SparePartIssueJobAppService
var sparePartIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var sparePartIssueJobDto in sparePartIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(sparePartIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(sparePartIssueJobDto).ConfigureAwait(false);
}
return sparePartIssueJobDtos;
@ -98,7 +98,7 @@ public class SparePartIssueJobAppService
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var sparePartIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(sparePartIssueJobDto).ConfigureAwait(false);
await DoingDimensionalStorehouseAsync(sparePartIssueJobDto).ConfigureAwait(false);
return sparePartIssueJobDto;
}
@ -581,11 +581,11 @@ public class SparePartIssueJobAppService
}
/// <summary>
/// 判断是不是在立体库
/// 调用立体库
/// </summary>
/// <param name="sparePartIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(SparePartIssueJobDTO sparePartIssueJobDto)
private async Task DoingDimensionalStorehouseAsync(SparePartIssueJobDTO sparePartIssueJobDto)
{
var jobDetailInputdetail = sparePartIssueJobDto.Details.FirstOrDefault();

Loading…
Cancel
Save