Browse Source

Merge branch 'dev_DY_CC' of http://dev.ccwin-in.com:3000/BoXu.Zheng/WZC2 into dev_DY_CC

dev_DY_CC
lvzb 12 months ago
parent
commit
1df980358b
  1. BIN
      .vs/slnx.sqlite
  2. 23
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Inventories/BalanceController.cs
  3. 2
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobController.cs
  4. 188
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobs/AssembleIssueJobsController.cs
  5. 188
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobs/CoatingIssueJobsController.cs
  6. 1
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobs/KittingIssueJobsController.cs
  7. 135
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueRequest/AssembleRequestController.cs
  8. 135
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueRequest/CoatingRequestController.cs
  9. 1
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/ILocationAppService.cs
  10. 10
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Locations/LocationAppService.cs
  11. 1
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/ExpectOuts/IExpectOutAppService.cs
  12. 30
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/ExpectOuts/ExpectOutAppService.cs
  13. 8
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs
  14. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/GaoTongs/IGaoTongAppService.cs
  15. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobPermissions.cs
  16. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/DTOs/AssembleIssueJobDTO.cs
  17. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs
  18. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/Inputs/AssembleIssueJobEditInput.cs
  19. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobPermissions.cs
  20. 31
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/DTOs/CoatingIssueJobDTO.cs
  21. 21
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs
  22. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobCheckInput.cs
  23. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobEditInput.cs
  24. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IssueJobs/IIssueJobAppService.cs
  25. 20
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/IKittingIssueJobAppService.cs
  26. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobPermissions.cs
  27. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/TransferLibJobs/ITransferLibJobAppService.cs
  28. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNotePermissions.cs
  29. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/DTOs/AssembleIssueNoteDTO.cs
  30. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/IAssembleIssueNoteAppService.cs
  31. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/Inputs/AssembleIssueNoteEditInput.cs
  32. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/Inputs/AssembleIssueNoteImportInput.cs
  33. 23
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNotePermissions.cs
  34. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/DTOs/CoatingIssueNoteDTO.cs
  35. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs
  36. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteEditInput.cs
  37. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteImportInput.cs
  38. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs
  39. 14
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/KittingIssueNotePermissions.cs
  40. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Permissions/StorePermissionDefinitionProvider.cs
  41. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/AssembleIssueRequestPermissions.cs
  42. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/DTOs/AssembleIssueRequestDTO.cs
  43. 71
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/DTOs/AssembleIssueRequestDetailDTO.cs
  44. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/IAssembleIssueRequestAppService.cs
  45. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/Inputs/AssembleIssueRequestEditInput.cs
  46. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/Inputs/AssembleIssueRequestImportInput.cs
  47. 58
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestDetailDTO.cs
  48. 19
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestPermissions.cs
  49. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDTO.cs
  50. 99
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDetailDTO.cs
  51. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/ICoatingIssueRequestAppService.cs
  52. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestDetailInput.cs
  53. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestEditInput.cs
  54. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestImportInput.cs
  55. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/TransferLibRequests/ITransferLibRequestAppService.cs
  56. 97
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/GaoTongs/GaoTongAppService.cs
  57. 479
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs
  58. 648
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs
  59. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAutoMapperProfile.cs
  60. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs
  61. 450
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs
  62. 143
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/TransferLibJobs/TransferLibJobAppService.cs
  63. 21
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteAppService.cs
  64. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs
  65. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAutoMapperProfile.cs
  66. 250
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs
  67. 303
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs
  68. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAutoMapperProfile.cs
  69. 111
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs
  70. 100
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/TransferLibRequests/TransferLibRequestAppService.cs
  71. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJob.cs
  72. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobDetail.cs
  73. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobManager.cs
  74. 14
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs
  75. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobDetail.cs
  76. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobManager.cs
  77. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobManager.cs
  78. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobRepository.cs
  79. 55
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingssueExtension.cs
  80. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNote.cs
  81. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs
  82. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteManager.cs
  83. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteManager.cs
  84. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteRepository.cs
  85. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequest.cs
  86. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequestDetail.cs
  87. 34
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequestManager.cs
  88. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequest.cs
  89. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestDetail.cs
  90. 38
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestManager.cs
  91. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestManager.cs
  92. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestRepository.cs
  93. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs
  94. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs
  95. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobEfCoreRepository.cs
  96. 32164
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Migrations/20240514023713_20240514.Designer.cs
  97. 319
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Migrations/20240514023713_20240514.cs
  98. 98
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Migrations/StoreDbContextModelSnapshot.cs
  99. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs
  100. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteEfCoreRepository.cs

BIN
.vs/slnx.sqlite

Binary file not shown.

23
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Inventories/BalanceController.cs

@ -492,21 +492,36 @@ public class BalanceController : AbpController
/// </summary> /// </summary>
/// <param name="itemCode"></param> /// <param name="itemCode"></param>
/// <param name="productLine"></param> /// <param name="productLine"></param>
/// <param name="isPackingCode"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("get-recommend-balance")] [HttpPost("get-recommend-balance")]
public async Task<List<SortBalance>> GetRecommendBalance(string itemCode,string productLine) public async Task<List<SortBalance>> GetRecommendBalance(string itemCode,string productLine,bool isPackingCode)
{ {
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(productLine, itemCode).ConfigureAwait(false); var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(productLine, itemCode).ConfigureAwait(false);
var locationList = new List<string>();
if (productionLineItemDto.RawLocationCodeListJson != null&&
productionLineItemDto.RawLocationCodeListJson.Length > 0)
{
var temp=JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson);
locationList.AddRange(temp);
}
if (productionLineItemDto.ProductLocationCodeListJson != null &&
productionLineItemDto.ProductLocationCodeListJson.Length > 0)
{
var temp = JsonSerializer.Deserialize<List<string>>(productionLineItemDto.ProductLocationCodeListJson);
locationList.AddRange(temp);
}
//获取可用库存 //获取可用库存
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = itemCode, ItemCode = itemCode,
Qty = decimal.MaxValue, Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations = locationList,
JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson), IsPackingCode = isPackingCode
IsPackingCode = true
}; };
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);

2
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobController.cs

@ -240,7 +240,7 @@ public class IssueJobController : AbpController
[HttpGet("check-job-exist")] [HttpGet("check-job-exist")]
public virtual async Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCode(string itemCode, string locationCode) public virtual async Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCode(string itemCode, string locationCode)
{ {
return await _issueJobAppService.CheckJobExistByItemCodeAndLocationCode(itemCode, locationCode).ConfigureAwait(false); return await _issueJobAppService.CheckJobExistByItemCodeAndLocationCodeAsync(itemCode, locationCode).ConfigureAwait(false);
} }
/// <summary> /// <summary>

188
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobs/AssembleIssueJobsController.cs

@ -0,0 +1,188 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Pda.Controllers.Jobs.IssueJobs;
/// <summary>
/// 装配叫料PDA任务
/// </summary>
[ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}job/assemble-issue")]
public class AssembleIssueJobsController : AbpController
{
private readonly IAssembleIssueJobAppService _assembleIssueJobAppService;
private readonly IUserWorkGroupAppService _userWorkGroupAppService;
public AssembleIssueJobsController(IAssembleIssueJobAppService assembleIssueJobAppService, IUserWorkGroupAppService userWorkGroupAppService)
{
_assembleIssueJobAppService = assembleIssueJobAppService;
_userWorkGroupAppService = userWorkGroupAppService;
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="isFinished"></param>
/// <returns></returns>
[HttpPost("list")]
public virtual async Task<PagedResultDto<AssembleIssueJobDTO>> GetListAsync(int pageSize, int pageIndex,
bool isFinished)
{
var status = new List<int>();
if (isFinished)
{
status.Add((int)EnumJobStatus.Done);
}
else
{
status.Add((int)EnumJobStatus.Open);
status.Add((int)EnumJobStatus.Wait);
status.Add((int)EnumJobStatus.Doing);
status.Add((int)EnumJobStatus.Partial);
}
var jsonStatus = JsonSerializer.Serialize(status);
var request = new SfsJobRequestInputBase
{
MaxResultCount = pageSize,
SkipCount = (pageIndex - 1) * pageSize,
Sorting = $"{nameof(ContainerJobDTO.CreationTime)} ASC",
Condition = new Condition
{
Filters = new List<Filter> { new(nameof(ContainerJobDTO.JobStatus), jsonStatus, "In") }
}
};
var list = await _assembleIssueJobAppService.GetPagedListByFilterAsync(request, true).ConfigureAwait(false);
return list;
}
/// <summary>
/// 承接任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("take/{id}")]
public virtual async Task TakeAsync(Guid id)
{
await _assembleIssueJobAppService.AcceptAsync(id).ConfigureAwait(false);
}
/// <summary>
/// 取消承接任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("cancel-take/{id}")]
public virtual async Task CancelTakeAsync(Guid id)
{
await _assembleIssueJobAppService.CancelAcceptAsync(id).ConfigureAwait(false);
}
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
[HttpPost("ExecuteDetail/{masterId}")]
public async Task ExecuteDetailAsync(Guid masterId, Guid detailId, AssembleIssueJobDetailDTO issueJobDetailDto)
{
await _assembleIssueJobAppService.ExecuteDetailAsync(masterId, detailId, issueJobDetailDto).ConfigureAwait(false);
}
/// <summary>
/// 获取任务数量
/// </summary>
/// <returns></returns>
[HttpGet("count")]
public virtual async Task<ActionResult<long>> CountAsync()
{
var status = new List<int>
{
(int)EnumJobStatus.Open, (int)EnumJobStatus.Doing, (int)EnumJobStatus.Partial, (int)EnumJobStatus.Wait
};
var jsonStatus = JsonSerializer.Serialize(status);
var request = new SfsJobRequestInputBase
{
Sorting = $"{nameof(InspectJobDTO.Priority)} ASC",
Condition = new Condition
{
Filters = new List<Filter>
{
//new(nameof(InspectJobDTO.WorkGroupCode),jsonCodes,"In"),
new(nameof(InspectJobDTO.JobStatus), jsonStatus, "In")
}
}
};
var count = await _assembleIssueJobAppService.GetCountByFilterAsync(request).ConfigureAwait(false);
return Ok(count);
}
/// <summary>
/// 获取任务详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public virtual async Task<ActionResult<AssembleIssueJobDTO>> GetAsync(Guid id)
{
var result = await _assembleIssueJobAppService.GetAsync(id).ConfigureAwait(false);
return Ok(result);
}
/// <summary>
/// 根据Job Number 获取盘点任务列表
/// </summary>
/// <param name="jobNumber"></param>
/// <returns></returns>
[HttpGet("by-number/{jobNumber}")]
public virtual async Task<ActionResult<AssembleIssueJobDTO>> GetByNumberAsync(string jobNumber)
{
var jobDto = await _assembleIssueJobAppService.GetByNumberAsync(jobNumber).ConfigureAwait(false);
if (jobDto == null)
{
throw new UserFriendlyException($"未找到编号为 {jobNumber} 的任务");
}
var wlgCodes = await _userWorkGroupAppService.GetCodsOfCurrentUserAsync().ConfigureAwait(false);
if (!wlgCodes.Contains(jobDto.WorkGroupCode))
{
return new NotFoundObjectResult($"任务属于工作组 {jobDto.WorkGroupCode}");
}
if (jobDto.JobStatus == EnumJobStatus.Doing && jobDto.AcceptUserId != CurrentUser.Id)
{
return new NotFoundObjectResult($"任务正在被 {jobDto.AcceptUserName} 处理");
}
return jobDto;
}
/// <summary>
///
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
return await _assembleIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
}
}

188
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobs/CoatingIssueJobsController.cs

@ -0,0 +1,188 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Pda.Controllers.Jobs.IssueJobs;
/// <summary>
/// 涂装叫料PDA任务
/// </summary>
[ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}job/coating-issue")]
public class CoatingIssueJobsController : AbpController
{
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService;
private readonly IUserWorkGroupAppService _userWorkGroupAppService;
public CoatingIssueJobsController(ICoatingIssueJobAppService coatingIssueJobAppService, IUserWorkGroupAppService userWorkGroupAppService)
{
_coatingIssueJobAppService = coatingIssueJobAppService;
_userWorkGroupAppService = userWorkGroupAppService;
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="isFinished"></param>
/// <returns></returns>
[HttpPost("list")]
public virtual async Task<PagedResultDto<CoatingIssueJobDTO>> GetListAsync(int pageSize, int pageIndex,
bool isFinished)
{
var status = new List<int>();
if (isFinished)
{
status.Add((int)EnumJobStatus.Done);
}
else
{
status.Add((int)EnumJobStatus.Open);
status.Add((int)EnumJobStatus.Wait);
status.Add((int)EnumJobStatus.Doing);
status.Add((int)EnumJobStatus.Partial);
}
var jsonStatus = JsonSerializer.Serialize(status);
var request = new SfsJobRequestInputBase
{
MaxResultCount = pageSize,
SkipCount = (pageIndex - 1) * pageSize,
Sorting = $"{nameof(ContainerJobDTO.CreationTime)} ASC",
Condition = new Condition
{
Filters = new List<Filter> { new(nameof(ContainerJobDTO.JobStatus), jsonStatus, "In") }
}
};
var list = await _coatingIssueJobAppService.GetPagedListByFilterAsync(request, true).ConfigureAwait(false);
return list;
}
/// <summary>
/// 承接任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("take/{id}")]
public virtual async Task TakeAsync(Guid id)
{
await _coatingIssueJobAppService.AcceptAsync(id).ConfigureAwait(false);
}
/// <summary>
/// 取消承接任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("cancel-take/{id}")]
public virtual async Task CancelTakeAsync(Guid id)
{
await _coatingIssueJobAppService.CancelAcceptAsync(id).ConfigureAwait(false);
}
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
[HttpPost("ExecuteDetail/{masterId}")]
public async Task ExecuteDetailAsync(Guid masterId, Guid detailId, CoatingIssueJobDetailDTO issueJobDetailDto)
{
await _coatingIssueJobAppService.ExecuteDetailAsync(masterId, detailId, issueJobDetailDto).ConfigureAwait(false);
}
/// <summary>
/// 获取任务数量
/// </summary>
/// <returns></returns>
[HttpGet("count")]
public virtual async Task<ActionResult<long>> CountAsync()
{
var status = new List<int>
{
(int)EnumJobStatus.Open, (int)EnumJobStatus.Doing, (int)EnumJobStatus.Partial, (int)EnumJobStatus.Wait
};
var jsonStatus = JsonSerializer.Serialize(status);
var request = new SfsJobRequestInputBase
{
Sorting = $"{nameof(InspectJobDTO.Priority)} ASC",
Condition = new Condition
{
Filters = new List<Filter>
{
//new(nameof(InspectJobDTO.WorkGroupCode),jsonCodes,"In"),
new(nameof(InspectJobDTO.JobStatus), jsonStatus, "In")
}
}
};
var count = await _coatingIssueJobAppService.GetCountByFilterAsync(request).ConfigureAwait(false);
return Ok(count);
}
/// <summary>
/// 获取任务详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public virtual async Task<ActionResult<CoatingIssueJobDTO>> GetAsync(Guid id)
{
var result = await _coatingIssueJobAppService.GetAsync(id).ConfigureAwait(false);
return Ok(result);
}
/// <summary>
/// 根据Job Number 获取盘点任务列表
/// </summary>
/// <param name="jobNumber"></param>
/// <returns></returns>
[HttpGet("by-number/{jobNumber}")]
public virtual async Task<ActionResult<CoatingIssueJobDTO>> GetByNumberAsync(string jobNumber)
{
var jobDto = await _coatingIssueJobAppService.GetByNumberAsync(jobNumber).ConfigureAwait(false);
if (jobDto == null)
{
throw new UserFriendlyException($"未找到编号为 {jobNumber} 的任务");
}
var wlgCodes = await _userWorkGroupAppService.GetCodsOfCurrentUserAsync().ConfigureAwait(false);
if (!wlgCodes.Contains(jobDto.WorkGroupCode))
{
return new NotFoundObjectResult($"任务属于工作组 {jobDto.WorkGroupCode}");
}
if (jobDto.JobStatus == EnumJobStatus.Doing && jobDto.AcceptUserId != CurrentUser.Id)
{
return new NotFoundObjectResult($"任务正在被 {jobDto.AcceptUserName} 处理");
}
return jobDto;
}
/// <summary>
///
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
return await _coatingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
}
}

1
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/IssueJobs/KittingIssueJobsController.cs

@ -14,6 +14,7 @@ using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Pda.Controllers.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Pda.Controllers.Jobs.IssueJobs;
/// <summary> /// <summary>
/// kitting叫料PDA任务
/// </summary> /// </summary>
[ApiController] [ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}job/kitting-issue")] [Route($"{PdaHostConst.ROOT_ROUTE}job/kitting-issue")]

135
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueRequest/AssembleRequestController.cs

@ -0,0 +1,135 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Pda.Controllers.Stores;
/// <summary>
/// 装配叫料请求
/// </summary>
[ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}store/assemble-request")]
public class AssembleRequestController : AbpController
{
private readonly IAssembleIssueRequestAppService _assembleIssueRequestAppService;
private readonly IUserWorkGroupAppService _userWorkGroupAppService;
/// <summary>
/// </summary>
/// <param name="assembleIssueRequestAppService"></param>
public AssembleRequestController(IAssembleIssueRequestAppService assembleIssueRequestAppService,
IUserWorkGroupAppService userWorkGroupAppService)
{
_assembleIssueRequestAppService = assembleIssueRequestAppService;
_userWorkGroupAppService = userWorkGroupAppService;
}
/// <summary>
/// 装配叫料申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("")]
public virtual async Task CreateAsync(AssembleIssueRequestEditInput input)
{
await _assembleIssueRequestAppService.CreateAndHandleAsync(input).ConfigureAwait(false);
}
/// <summary>
/// </summary>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="isFinished"></param>
/// <returns></returns>
[HttpPost("list")]
public virtual async Task<PagedResultDto<AssembleIssueRequestDTO>> GetListAsync(int pageSize, int pageIndex,
bool isFinished)
{
var status = new List<int>();
if (isFinished)
{
status.Add((int)EnumRequestStatus.Completed);
}
else
{
status.Add((int)EnumRequestStatus.Partial);
status.Add((int)EnumRequestStatus.Handling);
status.Add((int)EnumRequestStatus.New);
}
var jsonStatus = JsonSerializer.Serialize(status);
var request = new SfsStoreRequestInputBase
{
MaxResultCount = pageSize,
SkipCount = (pageIndex - 1) * pageSize,
Sorting = $"{nameof(AssembleIssueRequestDTO.CreationTime)} ASC",
Condition = new Condition
{
Filters = new List<Filter> { new(nameof(AssembleIssueRequestDTO.RequestStatus), jsonStatus, "In") }
}
};
var list = await _assembleIssueRequestAppService.GetPagedListByFilterAsync(request, true).ConfigureAwait(false);
return list;
}
/// <summary>
/// </summary>
/// <param name="id"></param>
[HttpPost("handle/{id}")]
public virtual async Task HandleAsync(Guid id)
{
await _assembleIssueRequestAppService.HandleAsync(id).ConfigureAwait(false);
}
/// <summary>
/// 根据Job Number 获取盘点任务列表
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpGet("by-number/{requestNumber}")]
public virtual async Task<ActionResult<AssembleIssueRequestDTO>> GetByNumberAsync(string requestNumber)
{
var jobDto = await _assembleIssueRequestAppService.GetByNumberAsync(requestNumber).ConfigureAwait(false);
if (jobDto == null)
{
throw new UserFriendlyException($"未找到编号为 {requestNumber} 的请求");
}
return jobDto;
}
/// <summary>
/// 获取任务详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public virtual async Task<ActionResult<AssembleIssueRequestDTO>> GetAsync(Guid id)
{
var result = await _assembleIssueRequestAppService.GetAsync(id).ConfigureAwait(false);
return Ok(result);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost("IsHasNewJob")]
public virtual async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
return await _assembleIssueRequestAppService.IsHasNewJobAsync(requestNumber, jobNumber).ConfigureAwait(false);
}
}

135
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueRequest/CoatingRequestController.cs

@ -0,0 +1,135 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Pda.Controllers.Stores;
/// <summary>
/// 涂装叫料请求
/// </summary>
[ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}store/coating-request")]
public class CoatingRequestController : AbpController
{
private readonly ICoatingIssueRequestAppService _coatingIssueRequestAppService;
private readonly IUserWorkGroupAppService _userWorkGroupAppService;
/// <summary>
/// </summary>
/// <param name="coatingIssueRequestAppService"></param>
public CoatingRequestController(ICoatingIssueRequestAppService coatingIssueRequestAppService,
IUserWorkGroupAppService userWorkGroupAppService)
{
_coatingIssueRequestAppService = coatingIssueRequestAppService;
_userWorkGroupAppService = userWorkGroupAppService;
}
/// <summary>
/// 涂装叫料申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("")]
public virtual async Task CreateAsync(CoatingIssueRequestEditInput input)
{
await _coatingIssueRequestAppService.CreateAndHandleAsync(input).ConfigureAwait(false);
}
/// <summary>
/// </summary>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="isFinished"></param>
/// <returns></returns>
[HttpPost("list")]
public virtual async Task<PagedResultDto<CoatingIssueRequestDTO>> GetListAsync(int pageSize, int pageIndex,
bool isFinished)
{
var status = new List<int>();
if (isFinished)
{
status.Add((int)EnumRequestStatus.Completed);
}
else
{
status.Add((int)EnumRequestStatus.Partial);
status.Add((int)EnumRequestStatus.Handling);
status.Add((int)EnumRequestStatus.New);
}
var jsonStatus = JsonSerializer.Serialize(status);
var request = new SfsStoreRequestInputBase
{
MaxResultCount = pageSize,
SkipCount = (pageIndex - 1) * pageSize,
Sorting = $"{nameof(CoatingIssueRequestDTO.CreationTime)} ASC",
Condition = new Condition
{
Filters = new List<Filter> { new(nameof(CoatingIssueRequestDTO.RequestStatus), jsonStatus, "In") }
}
};
var list = await _coatingIssueRequestAppService.GetPagedListByFilterAsync(request, true).ConfigureAwait(false);
return list;
}
/// <summary>
/// </summary>
/// <param name="id"></param>
[HttpPost("handle/{id}")]
public virtual async Task HandleAsync(Guid id)
{
await _coatingIssueRequestAppService.HandleAsync(id).ConfigureAwait(false);
}
/// <summary>
/// 根据Job Number 获取盘点任务列表
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpGet("by-number/{requestNumber}")]
public virtual async Task<ActionResult<CoatingIssueRequestDTO>> GetByNumberAsync(string requestNumber)
{
var jobDto = await _coatingIssueRequestAppService.GetByNumberAsync(requestNumber).ConfigureAwait(false);
if (jobDto == null)
{
throw new UserFriendlyException($"未找到编号为 {requestNumber} 的请求");
}
return jobDto;
}
/// <summary>
/// 获取任务详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public virtual async Task<ActionResult<CoatingIssueRequestDTO>> GetAsync(Guid id)
{
var result = await _coatingIssueRequestAppService.GetAsync(id).ConfigureAwait(false);
return Ok(result);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost("IsHasNewJob")]
public virtual async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
return await _coatingIssueRequestAppService.IsHasNewJobAsync(requestNumber, jobNumber).ConfigureAwait(false);
}
}

1
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/ILocationAppService.cs

@ -32,4 +32,5 @@ public interface ILocationAppService
Task<List<LocationDTO>> GetListByTypesAndErpCodeAsync(List<EnumLocationType> types, string erpCode); Task<List<LocationDTO>> GetListByTypesAndErpCodeAsync(List<EnumLocationType> types, string erpCode);
Task<List<LocationDTO>> GetListByTypesAndErpCodeAsync(List<EnumLocationType> types, string erpCode,string locCode); Task<List<LocationDTO>> GetListByTypesAndErpCodeAsync(List<EnumLocationType> types, string erpCode,string locCode);
Task<List<LocationDTO>> GetListByErpLocationCodes(List<string> ErpLocationCodes); Task<List<LocationDTO>> GetListByErpLocationCodes(List<string> ErpLocationCodes);
Task<LocationDTO> GetFirstRowOneAsync();
} }

10
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Locations/LocationAppService.cs

@ -1,12 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain; using Win_in.Sfs.Basedata.Domain;
@ -220,6 +222,14 @@ public class LocationAppService
return ObjectMapper.Map<List<Domain.Location>, List<LocationDTO>>(list); return ObjectMapper.Map<List<Domain.Location>, List<LocationDTO>>(list);
} }
[HttpGet("get-first-row-one")]
public virtual async Task<LocationDTO> GetFirstRowOneAsync()
{
var first = await _repository.GetListAsync(p => p.RowCode == 1).ConfigureAwait(false);
return ObjectMapper.Map<Location, LocationDTO>(first.FirstOrDefault());
}
protected override async Task ValidateImportModelAsync(LocationImportInput importInput, List<ValidationResult> validationRresult) protected override async Task ValidateImportModelAsync(LocationImportInput importInput, List<ValidationResult> validationRresult)
{ {
await base.ValidateImportModelAsync(importInput, validationRresult).ConfigureAwait(false); await base.ValidateImportModelAsync(importInput, validationRresult).ConfigureAwait(false);

1
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/ExpectOuts/IExpectOutAppService.cs

@ -47,4 +47,5 @@ public interface IExpectOutAppService
decimal qty); decimal qty);
Task RemoveByNumberAsync(string number); Task RemoveByNumberAsync(string number);
Task<ExpectOutDTO> UpdateLocationByPackingCodeAsync(string packingCode,string locationCode);
} }

30
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/ExpectOuts/ExpectOutAppService.cs

@ -5,7 +5,9 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.ObjectMapping; using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain.Shared; using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Basedata.SplitPackings.Commons; using Win_in.Sfs.Basedata.SplitPackings.Commons;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
@ -27,14 +29,15 @@ public class ExpectOutAppService
, IExpectOutAppService , IExpectOutAppService
{ {
private readonly IExpectOutManager _expectOutManager; private readonly IExpectOutManager _expectOutManager;
private readonly ILocationAppService _locationAppService;
public ExpectOutAppService( public ExpectOutAppService(
IExpectOutRepository repository, IExpectOutRepository repository,
IExpectOutManager expectOutManager IExpectOutManager expectOutManager, ILocationAppService locationAppService) : base(repository)
) : base(repository)
{ {
_expectOutManager = expectOutManager; _expectOutManager = expectOutManager;
_locationAppService = locationAppService;
} }
[HttpPost("remove")] [HttpPost("remove")]
@ -64,7 +67,7 @@ public class ExpectOutAppService
if (expectOut != null) if (expectOut != null)
{ {
expectOut.Qty -= qty; expectOut.Qty -= qty;
if (expectOut.Qty == 0) if (expectOut.Qty <= 0)
{ {
await _repository.DeleteAsync(expectOut).ConfigureAwait(false); await _repository.DeleteAsync(expectOut).ConfigureAwait(false);
} }
@ -274,4 +277,25 @@ public class ExpectOutAppService
{ {
return await _repository.GetListAsync(p => p.JobNumber == input.Number && p.PackingCode == input.FromPackingCode && p.Qty == input.FromQty && p.LocationCode == input.FromLocationCode).ConfigureAwait(false); return await _repository.GetListAsync(p => p.JobNumber == input.Number && p.PackingCode == input.FromPackingCode && p.Qty == input.FromQty && p.LocationCode == input.FromLocationCode).ConfigureAwait(false);
} }
[HttpPost("Update-Location-By-PackingCode")]
public virtual async Task<ExpectOutDTO> UpdateLocationByPackingCodeAsync(string packingCode,string locationCode)
{
var expectOut=await _repository.FindAsync(p=>p.PackingCode== packingCode).ConfigureAwait(false);
if (expectOut != null)
{
var locationDto=await _locationAppService.GetByCodeAsync(locationCode).ConfigureAwait(false);
expectOut.LocationCode = locationDto.Code;
expectOut.LocationArea = locationDto.AreaCode;
expectOut.LocationErpCode = locationDto.ErpLocationCode;
expectOut.WarehouseCode = locationDto.WarehouseCode;
expectOut.LocationGroup = locationDto.LocationGroupCode;
await _repository.UpdateAsync(expectOut).ConfigureAwait(false);
}
return ObjectMapper.Map<ExpectOut, ExpectOutDTO>(expectOut);
}
} }

8
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs

@ -214,8 +214,10 @@ public enum EnumTransSubType
/// </summary> /// </summary>
[Display(Name = "导入盘点计划")] [Display(Name = "导入盘点计划")]
ExcelInCountPlan = 6002, ExcelInCountPlan = 6002,
/// <summary>
/// 立库出库
/// </summary>
[Display(Name = "立库出库")]
Depot_Out = 1510
} }

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/GaoTongs/IGaoTongAppService.cs

@ -26,4 +26,12 @@ public interface IGaoTongAppService : IApplicationService
/// <param name="input">位置码列表</param> /// <param name="input">位置码列表</param>
/// <returns>库位信息列表</returns> /// <returns>库位信息列表</returns>
Task<List<LocationCodeInfoDTO>> GetLocationInfoByPositionCode(LocationCodeInfoEditInput input); Task<List<LocationCodeInfoDTO>> GetLocationInfoByPositionCode(LocationCodeInfoEditInput input);
/// <summary>
/// 人工拣选反馈富维东阳WMS【我方提供】【出库、立库系统直接出库、通知我方】
/// 人工拣选出库缴库完成,高通WMS反馈到富维东阳WMS
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<GaoTongResultDTO> ManualSelection(ZuPanEditInput input);
} }

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobPermissions.cs

@ -16,10 +16,10 @@ public static class AssembleIssueJobPermissions
public static void AddAssembleIssueJobPermission(this PermissionGroupDefinition permissionGroup) public static void AddAssembleIssueJobPermission(this PermissionGroupDefinition permissionGroup)
{ {
var AssembleIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueJob))); var assembleIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueJob)));
AssembleIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); assembleIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
AssembleIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); assembleIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
AssembleIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); assembleIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoAssembleIssueJob, StorePermissionDefinitionProvider.L(nameof(AutoAssembleIssueJob))); permissionGroup.AddPermission(AutoAssembleIssueJob, StorePermissionDefinitionProvider.L(nameof(AutoAssembleIssueJob)));

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/DTOs/AssembleIssueJobDTO.cs

@ -36,4 +36,6 @@ public class AssembleIssueJobDTO : SfsJobDTOBase<AssembleIssueJobDetailDTO>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

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

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -8,8 +9,15 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IAssembleIssueJobAppService public interface IAssembleIssueJobAppService
: ISfsJobAppServiceBase<AssembleIssueJobDTO, SfsJobRequestInputBase, AssembleIssueJobCheckInput, AssembleIssueJobEditInput> : ISfsJobAppServiceBase<AssembleIssueJobDTO, SfsJobRequestInputBase, AssembleIssueJobCheckInput, AssembleIssueJobEditInput>
{ {
Task CancelByMaterialRequestAsync(string assembleNumber); Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber); Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
Task ExecuteDetailAsync(Guid masterId, Guid detailId, AssembleIssueJobDetailDTO issueJobDetailDto);
Task CompleteAsync(Guid id);
} }

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/Inputs/AssembleIssueJobEditInput.cs

@ -58,12 +58,13 @@ public class AssembleIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCre
[Display(Name = "任务明细")] [Display(Name = "任务明细")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public List<AssembleIssueJobDetailInput> Details { get; set; } = new(); public List<AssembleIssueJobDetailInput> Details { get; set; } = new();
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#endregion #endregion
} }

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobPermissions.cs

@ -1,7 +1,5 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -15,9 +13,10 @@ public static class CoatingIssueJobPermissions
public static void AddCoatingIssueJobPermission(this PermissionGroupDefinition permissionGroup) public static void AddCoatingIssueJobPermission(this PermissionGroupDefinition permissionGroup)
{ {
var IssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(IssueJob))); var coatingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueJob)));
IssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); coatingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
IssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); coatingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
IssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); coatingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

31
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/DTOs/CoatingIssueJobDTO.cs

@ -1,15 +1,14 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary> /// <summary>
/// 料任务 /// 涂装叫料任务
/// </summary> /// </summary>
[Display(Name = "料任务")] [Display(Name = "涂装叫料任务")]
public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO> public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO>
{ {
/// <summary> /// <summary>
@ -17,37 +16,25 @@ public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO>
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public EnumIssueRequestType IssueRequestType { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 生产线 /// 生产线
/// </summary> /// </summary>
[Display(Name = "生产线")] [Display(Name = "生产线")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ProdLine { get; set; } public string ProdLine { get; set; }
/// <summary> /// <summary>
/// 要货单号 /// 要货单号
/// </summary> /// </summary>
[Display(Name = "要货单号")] [Display(Name = "要货单号")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string MaterialRequestNumber { get; set; } public string CoatingRequestNumber { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

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

@ -1,15 +1,30 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueJobAppService public interface ICoatingIssueJobAppService
: ISfsJobAppServiceBase<CoatingIssueJobDTO, SfsJobRequestInputBase, CoatingIssueJobCheckInput, CoatingIssueJobEditInput> : ISfsJobAppServiceBase<CoatingIssueJobDTO, SfsJobRequestInputBase, CoatingIssueJobCheckInput, CoatingIssueJobEditInput>
{ {
Task CancelByMaterialRequestAsync(string coatingIssueNumber); Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber); Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
Task ExecuteDetailAsync(Guid masterId, Guid detailId, CoatingIssueJobDetailDTO issueJobDetailDto);
Task CompleteAsync(Guid id);
/// <summary>
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
Task CompleteByRequestNumberAsync(string requestNumber);
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobCheckInput.cs

@ -1,6 +1,4 @@
using Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
public class CoatingIssueJobCheckInput : SfsJobCheckInputBase public class CoatingIssueJobCheckInput : SfsJobCheckInputBase
{ {

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobEditInput.cs

@ -4,9 +4,8 @@ using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<CoatingIssueJobDetailInput> public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<CoatingIssueJobDetailInput>
{ {
@ -24,7 +23,7 @@ public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCrea
[Display(Name = "要货单号")] [Display(Name = "要货单号")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string MaterialRequestNumber { get; set; } public string KittingRequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
@ -59,12 +58,13 @@ public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCrea
[Display(Name = "任务明细")] [Display(Name = "任务明细")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public List<CoatingIssueJobDetailInput> Details { get; set; } = new(); public List<CoatingIssueJobDetailInput> Details { get; set; } = new();
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#endregion #endregion
} }

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

@ -8,7 +8,7 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IIssueJobAppService public interface IIssueJobAppService
: ISfsJobAppServiceBase<IssueJobDTO, SfsJobRequestInputBase, IssueJobCheckInput, IssueJobEditInput> : ISfsJobAppServiceBase<IssueJobDTO, SfsJobRequestInputBase, IssueJobCheckInput, IssueJobEditInput>
{ {
Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCode(string itemCode, string locationCode); Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCodeAsync(string itemCode, string locationCode);
Task CancelByMaterialRequestAsync(string materialNumber); Task CancelByMaterialRequestAsync(string materialNumber);

20
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/IKittingIssueJobAppService.cs

@ -1,23 +1,27 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IKittingIssueJobAppService public interface IKittingIssueJobAppService
: ISfsJobAppServiceBase<KittingIssueJobDTO, SfsJobRequestInputBase, KittingIssueJobCheckInput, KittingIssueJobEditInput> : ISfsJobAppServiceBase<KittingIssueJobDTO, SfsJobRequestInputBase, KittingIssueJobCheckInput,
KittingIssueJobEditInput>
{ {
Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber); Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary> /// <summary>
/// 执行任务明细 /// 执行任务明细
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
Task ExecuteDetailAsync(Guid masterId,Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto); Task ExecuteDetailAsync(Guid masterId, Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto);
Task CompleteAsync(Guid id); Task CompleteAsync(Guid id);
/// <summary>
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
Task CompleteByRequestNumberAsync(string requestNumber);
} }

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobPermissions.cs

@ -14,11 +14,10 @@ public static class KittingIssueJobPermissions
public static void AddKittingIssueJobPermission(this PermissionGroupDefinition permissionGroup) public static void AddKittingIssueJobPermission(this PermissionGroupDefinition permissionGroup)
{ {
var KittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob))); var kittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob)));
KittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); kittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
KittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); kittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
KittingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); kittingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/TransferLibJobs/ITransferLibJobAppService.cs

@ -1,7 +1,11 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ITransferLibJobAppService public interface ITransferLibJobAppService
: ISfsJobAppServiceBase<TransferLibJobDTO, SfsJobRequestInputBase, TransferLibJobCheckInput, TransferLibJobEditInput> : ISfsJobAppServiceBase<TransferLibJobDTO, SfsJobRequestInputBase, TransferLibJobCheckInput, TransferLibJobEditInput>
{ {
Task<List<TransferLibJobDTO>> GetByRequestNumberAsync(string requestNumber);
Task CompleteByRequestAsync(string requestNumber);
} }

15
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNotePermissions.cs

@ -5,26 +5,19 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class AssembleIssueNotePermissions public static class AssembleIssueNotePermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(AssembleIssueNote); public const string Default = StorePermissions.GroupName + "." + nameof(AssembleIssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
//自动发料记录
public const string AutoAssembleIssueNote = StorePermissions.GroupName + "." + nameof(AutoAssembleIssueNote);
//直接发料
public const string DirectAssembleIssueNote = StorePermissions.GroupName + "." + nameof(DirectAssembleIssueNote);
public static void AddAssembleIssueNotePermission(this PermissionGroupDefinition permissionGroup) public static void AddAssembleIssueNotePermission(this PermissionGroupDefinition permissionGroup)
{ {
var AssembleIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueNote))); var assembleIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueNote)));
AssembleIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); assembleIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
AssembleIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); assembleIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
AssembleIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); assembleIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoAssembleIssueNote, StorePermissionDefinitionProvider.L(nameof(AutoAssembleIssueNote)));
permissionGroup.AddPermission(DirectAssembleIssueNote, StorePermissionDefinitionProvider.L(nameof(DirectAssembleIssueNote)));
} }
} }

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/DTOs/AssembleIssueNoteDTO.cs

@ -44,4 +44,5 @@ public class AssembleIssueNoteDTO : SfsStoreDTOBase<AssembleIssueNoteDetailDTO>,
[Display(Name = "确认时间")] [Display(Name = "确认时间")]
public DateTime? ConfirmTime { get; set; } public DateTime? ConfirmTime { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/IAssembleIssueNoteAppService.cs

@ -12,5 +12,4 @@ public interface IAssembleIssueNoteAppService : ISfsStoreMasterReadOnlyAppServic
Task<AssembleIssueNoteDTO> ConfirmAsync(Guid id); Task<AssembleIssueNoteDTO> ConfirmAsync(Guid id);
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/Inputs/AssembleIssueNoteEditInput.cs

@ -27,7 +27,7 @@ public class AssembleIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary> /// </summary>
[Display(Name = "任务ID")] [Display(Name = "任务ID")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public string JobNumber { get; set; } public string JobNumber { get; set; }
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
@ -52,5 +52,7 @@ public class AssembleIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#endregion #endregion
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/Inputs/AssembleIssueNoteImportInput.cs

@ -31,4 +31,6 @@ public class AssembleIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumb
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

23
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNotePermissions.cs

@ -1,31 +1,20 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class CoatingIssueNotePermissions public static class CoatingIssueNotePermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueNote);
public const string Default = StorePermissions.GroupName + "." + nameof(IssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
//自动发料记录
public const string AutoIssueNote = StorePermissions.GroupName + "." + nameof(AutoIssueNote);
//直接发料
public const string DirectIssueNote = StorePermissions.GroupName + "." + nameof(DirectIssueNote);
public static void AddCoatingIssueNotePermission(this PermissionGroupDefinition permissionGroup) public static void AddCoatingIssueNotePermission(this PermissionGroupDefinition permissionGroup)
{ {
var issueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(IssueNote))); var coatingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueNote)));
issueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); coatingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
issueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); coatingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
issueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); coatingIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoIssueNote, StorePermissionDefinitionProvider.L(nameof(AutoIssueNote)));
permissionGroup.AddPermission(DirectIssueNote, StorePermissionDefinitionProvider.L(nameof(DirectIssueNote)));
} }
} }

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/DTOs/CoatingIssueNoteDTO.cs

@ -2,12 +2,12 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, IHasJobNumber, IHasRequestNumber public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, IHasJobNumber, IHasRequestNumber
{ {
/// <summary> /// <summary>
/// 任务ID /// 任务ID
/// </summary> /// </summary>
@ -19,6 +19,7 @@ public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, I
/// </summary> /// </summary>
[Display(Name = "请求代码")] [Display(Name = "请求代码")]
public string RequestNumber { get; set; } public string RequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
@ -42,4 +43,6 @@ public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, I
/// </summary> /// </summary>
[Display(Name = "确认时间")] [Display(Name = "确认时间")]
public DateTime? ConfirmTime { get; set; } public DateTime? ConfirmTime { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs

@ -3,15 +3,12 @@ using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueNoteAppService : ISfsStoreMasterReadOnlyAppServiceBase<CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase> public interface ICoatingIssueNoteAppService : ISfsStoreMasterReadOnlyAppServiceBase<CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase>
{ {
Task<CoatingIssueNoteDTO> CreateAsync(CoatingIssueNoteEditInput input); Task<CoatingIssueNoteDTO> CreateAsync(CoatingIssueNoteEditInput input);
Task<CoatingIssueNoteDTO> ConfirmAsync(Guid id); Task<CoatingIssueNoteDTO> ConfirmAsync(Guid id);
} }

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteEditInput.cs

@ -2,9 +2,8 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
{ {
@ -28,7 +27,7 @@ public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary> /// </summary>
[Display(Name = "任务ID")] [Display(Name = "任务ID")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public string JobNumber { get; set; } public string JobNumber { get; set; }
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
@ -53,5 +52,7 @@ public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#endregion #endregion
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteImportInput.cs

@ -1,8 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumber, IHasRequestNumber public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumber, IHasRequestNumber
{ {
@ -32,4 +31,6 @@ public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumbe
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs

@ -10,7 +10,5 @@ public interface IKittingIssueNoteAppService : ISfsStoreMasterReadOnlyAppService
{ {
Task<KittingIssueNoteDTO> CreateAsync(KittingIssueNoteEditInput input); Task<KittingIssueNoteDTO> CreateAsync(KittingIssueNoteEditInput input);
Task<KittingIssueNoteDTO> ConfirmAsync(Guid id); Task<KittingIssueNoteDTO> ConfirmAsync(Guid id);
} }

14
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/KittingIssueNotePermissions.cs

@ -5,20 +5,16 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class KittingIssueNotePermissions public static class KittingIssueNotePermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueNote); public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
public static void AddKittingIssueNotePermission(this PermissionGroupDefinition permissionGroup) public static void AddKittingIssueNotePermission(this PermissionGroupDefinition permissionGroup)
{ {
var injectionNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote))); var kittingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote)));
injectionNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); kittingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
injectionNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); kittingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
injectionNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); kittingIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Permissions/StorePermissionDefinitionProvider.cs

@ -29,13 +29,15 @@ public class StorePermissionDefinitionProvider : PermissionDefinitionProvider
storeGroup.AddMaterialRequestPermission(); storeGroup.AddMaterialRequestPermission();
storeGroup.AddInjectionIssueRequestPermission(); storeGroup.AddInjectionIssueRequestPermission();
storeGroup.AddKittingIssueRequestPermission(); storeGroup.AddKittingIssueRequestPermission();
storeGroup.AddCoatingIssueRequestPermission();
storeGroup.AddAssembleIssueRequestPermission(); storeGroup.AddAssembleIssueRequestPermission();
storeGroup.AddThirdLocationRequestPermission(); storeGroup.AddThirdLocationRequestPermission();
storeGroup.AddContainerRequestPermission(); storeGroup.AddContainerRequestPermission();
storeGroup.AddIssueNotePermission(); storeGroup.AddIssueNotePermission();
storeGroup.AddInjectionIssueNotePermission(); storeGroup.AddInjectionIssueNotePermission();
storeGroup.AddAssembleIssueNotePermission(); storeGroup.AddAssembleIssueNotePermission();
storeGroup.AddKittingIssueNotePermission(); storeGroup.AddCoatingIssueNotePermission();
storeGroup.AddKittingIssueNotePermission();
storeGroup.AddThirdLocationNotePermission(); storeGroup.AddThirdLocationNotePermission();
storeGroup.AddContainerNotePermission(); storeGroup.AddContainerNotePermission();
storeGroup.AddUnplannedReceiptNotePermission(); storeGroup.AddUnplannedReceiptNotePermission();

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/AssembleIssueRequestPermissions.cs

@ -10,15 +10,13 @@ public static class AssembleIssueRequestPermissions
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
public static void AddAssembleIssueRequestPermission(this PermissionGroupDefinition permissionGroup) public static void AddAssembleIssueRequestPermission(this PermissionGroupDefinition permissionGroup)
{ {
var AssembleIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueRequest))); var assembleIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueRequest)));
AssembleIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); assembleIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
AssembleIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); assembleIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
AssembleIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); assembleIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/DTOs/AssembleIssueRequestDTO.cs

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -8,8 +9,7 @@ public class AssembleIssueRequestDTO : SfsStoreRequestDTOBase<AssembleIssueReque
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public string Type { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 是否使用在途库 /// 是否使用在途库
/// </summary> /// </summary>

71
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/DTOs/AssembleIssueRequestDetailDTO.cs

@ -8,49 +8,92 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class AssembleIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase public class AssembleIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase
{ {
#region 目标库位信息
/// <summary>
/// 目标库位
/// </summary>
[Display(Name = "目标库位")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ToLocationCode { get; set; }
/// <summary>
/// 目标库区
/// </summary>
[Display(Name = "目标库区")]
public string ToLocationArea { get; set; }
/// <summary> /// <summary>
/// 已发数量 /// 目标库位组
/// </summary>
[Display(Name = "目标库位组")]
public string ToLocationGroup { get; set; }
/// <summary>
/// 目标ERP储位
/// </summary>
[Display(Name = "目标ERP储位")]
public string ToLocationErpCode { get; set; }
/// <summary>
/// 目标仓库
/// </summary>
[Display(Name = "目标仓库")]
public string ToWarehouseCode { get; set; }
#endregion
/// <summary>
/// 生产线
/// </summary>
public string ProdLine { get; set; }
/// <summary>
/// 已发数量
/// </summary> /// </summary>
[Display(Name = "已发数量")]
public decimal IssuedQty { get; set; } public decimal IssuedQty { get; set; }
/// <summary> /// <summary>
/// 已收数量 /// 已收数量
/// </summary> /// </summary>
[Display(Name = "已收数量")]
public decimal ReceivedQty { get; set; } public decimal ReceivedQty { get; set; }
/// <summary> /// <summary>
/// 明细状态 /// 明细状态
/// </summary> /// </summary>
[Display(Name = "明细状态")]
public EnumStatus Status { get; set; } public EnumStatus Status { get; set; }
/// <summary> /// <summary>
/// 请求未发 /// 请求未发 还未发送的数量
/// </summary> /// </summary>
[Display(Name = "请求未发")]
[NotMapped] [NotMapped]
public decimal ToBeIssuedQty => Qty - IssuedQty; public decimal ToBeIssuedQty => Qty - IssuedQty;
/// <summary> /// <summary>
/// 已发未收 /// 已发未收
/// </summary> /// </summary>
[Display(Name = "已发未收")]
[NotMapped] [NotMapped]
public decimal ToBeReceivedQty => IssuedQty - ReceivedQty; public decimal ToBeReceivedQty => IssuedQty - ReceivedQty;
/// <summary> /// <summary>
/// 请求未收 /// 请求未收
/// </summary> /// </summary>
[Display(Name = "请求未收")]
[NotMapped] [NotMapped]
public decimal NotFinishQty => Qty - ReceivedQty; public decimal NotFinishQty => Qty - ReceivedQty;
/// <summary> /// <summary>
/// 需求箱数量 /// 位置码
/// </summary>
public string PositionCode { get; set; }
/// <summary>
/// 推荐类型
/// </summary>
public EnumRecommendType RecommendType { get; set; }
/// <summary>
/// 需求箱数量
/// </summary> /// </summary>
[Display(Name = "需求箱数量")] [Display(Name = "需求箱数量")]
public decimal BoxQty { get; set; } public decimal BoxQty { get; set; }
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/IAssembleIssueRequestAppService.cs

@ -10,4 +10,6 @@ public interface IAssembleIssueRequestAppService
{ {
Task<AssembleIssueRequestDTO> CreateAndHandleAsync(AssembleIssueRequestEditInput input); Task<AssembleIssueRequestDTO> CreateAndHandleAsync(AssembleIssueRequestEditInput input);
Task UpdateStatusCompletedAsync(string number);
Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber);
} }

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/Inputs/AssembleIssueRequestEditInput.cs

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -9,10 +10,10 @@ public class AssembleIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputB
#region Base #region Base
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public string Type { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
@ -24,7 +25,7 @@ public class AssembleIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputB
/// 明细列表 /// 明细列表
/// </summary> /// </summary>
[Display(Name = "明细列表")] [Display(Name = "明细列表")]
public List<AssembleIssueRequestDetailInput> Details { get; set; } = new List<AssembleIssueRequestDetailInput>(); public List<KittingIssueRequestDetailInput> Details { get; set; } = new List<KittingIssueRequestDetailInput>();
#endregion #endregion
#region Create #region Create

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/AssembleIssueRequests/Inputs/AssembleIssueRequestImportInput.cs

@ -1,22 +1,18 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
[Display(Name = "叫料申请")] [Display(Name = "叫料申请导入")]
public class AssembleIssueRequestImportInput : SfsStoreImportInputBase public class AssembleIssueRequestImportInput : SfsStoreImportInputBase
{ {
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
[Required(ErrorMessage = "{0}是必填项")] public EnumIssueRequestType IssueRequestType { get; set; }
[ImporterHeader(Name = "叫料类型")]
[ExporterHeader(DisplayName = "叫料类型")]
[ValueMapping("人工拉动", EnumMaterialRequestType.Issue_Manual)]
public string Type { get; set; }
/// <summary> /// <summary>
/// 物品代码 /// 物品代码

58
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestDetailDTO.cs

@ -1,58 +0,0 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
public class CoatingIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase
{
/// <summary>
/// 已发数量
/// </summary>
[Display(Name = "已发数量")]
public decimal IssuedQty { get; set; }
/// <summary>
/// 已收数量
/// </summary>
[Display(Name = "已收数量")]
public decimal ReceivedQty { get; set; }
/// <summary>
/// 明细状态
/// </summary>
[Display(Name = "明细状态")]
public EnumStatus Status { get; set; }
/// <summary>
/// 请求未发
/// </summary>
[Display(Name = "请求未发")]
[NotMapped]
public decimal ToBeIssuedQty => Qty - IssuedQty;
/// <summary>
/// 已发未收
/// </summary>
[Display(Name = "已发未收")]
[NotMapped]
public decimal ToBeReceivedQty => IssuedQty - ReceivedQty;
/// <summary>
/// 请求未收
/// </summary>
[Display(Name = "请求未收")]
[NotMapped]
public decimal NotFinishQty => Qty - ReceivedQty;
/// <summary>
/// 需求箱数量
/// </summary>
[Display(Name = "需求箱数量")]
public decimal BoxQty { get; set; }
}

19
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestPermissions.cs

@ -1,27 +1,20 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class CoatingIssueRequestPermissions public static class CoatingIssueRequestPermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueRequest); public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueRequest);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
//自动叫料申请
public const string AutoMaterialRequest = StorePermissions.GroupName + "." + nameof(AutoMaterialRequest);
public static void AddCoatingIssueRequestPermission(this PermissionGroupDefinition permissionGroup) public static void AddCoatingIssueRequestPermission(this PermissionGroupDefinition permissionGroup)
{ {
var MaterialRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueRequest))); var coatingIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueRequest)));
MaterialRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); coatingIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
MaterialRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); coatingIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
MaterialRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); coatingIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoMaterialRequest, StorePermissionDefinitionProvider.L(nameof(AutoMaterialRequest)));
} }
} }

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestDTO.cs → be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDTO.cs

@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestDTO : SfsStoreRequestDTOBase<CoatingIssueRequestDetailDTO>, IHasNumber public class CoatingIssueRequestDTO : SfsStoreRequestDTOBase<CoatingIssueRequestDetailDTO>, IHasNumber
{ {
@ -9,8 +9,7 @@ public class CoatingIssueRequestDTO : SfsStoreRequestDTOBase<CoatingIssueRequest
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public string Type { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 是否使用在途库 /// 是否使用在途库
/// </summary> /// </summary>

99
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDetailDTO.cs

@ -0,0 +1,99 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase
{
#region 目标库位信息
/// <summary>
/// 目标库位
/// </summary>
[Display(Name = "目标库位")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ToLocationCode { get; set; }
/// <summary>
/// 目标库区
/// </summary>
[Display(Name = "目标库区")]
public string ToLocationArea { get; set; }
/// <summary>
/// 目标库位组
/// </summary>
[Display(Name = "目标库位组")]
public string ToLocationGroup { get; set; }
/// <summary>
/// 目标ERP储位
/// </summary>
[Display(Name = "目标ERP储位")]
public string ToLocationErpCode { get; set; }
/// <summary>
/// 目标仓库
/// </summary>
[Display(Name = "目标仓库")]
public string ToWarehouseCode { get; set; }
#endregion
/// <summary>
/// 生产线
/// </summary>
public string ProdLine { get; set; }
/// <summary>
/// 已发数量
/// </summary>
public decimal IssuedQty { get; set; }
/// <summary>
/// 已收数量
/// </summary>
public decimal ReceivedQty { get; set; }
/// <summary>
/// 明细状态
/// </summary>
public EnumStatus Status { get; set; }
/// <summary>
/// 请求未发 还未发送的数量
/// </summary>
[NotMapped]
public decimal ToBeIssuedQty => Qty - IssuedQty;
/// <summary>
/// 已发未收
/// </summary>
[NotMapped]
public decimal ToBeReceivedQty => IssuedQty - ReceivedQty;
/// <summary>
/// 请求未收
/// </summary>
[NotMapped]
public decimal NotFinishQty => Qty - ReceivedQty;
/// <summary>
/// 位置码
/// </summary>
public string PositionCode { get; set; }
/// <summary>
/// 推荐类型
/// </summary>
public EnumRecommendType RecommendType { get; set; }
/// <summary>
/// 需求箱数量
/// </summary>
[Display(Name = "需求箱数量")]
public decimal BoxQty { get; set; }
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/ICoatingIssueRequestAppService.cs

@ -1,15 +1,16 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueRequestAppService public interface ICoatingIssueRequestAppService
: ISfsStoreRequestMasterAppServiceBase<CoatingIssueRequestDTO, SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetailDTO, SfsStoreRequestInputBase> : ISfsStoreRequestMasterAppServiceBase<CoatingIssueRequestDTO, SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetailDTO, SfsStoreRequestInputBase>
{ {
Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input); Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input);
Task UpdateStatusCompletedAsync(string number);
Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber);
} }

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestDetailInput.cs → be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestDetailInput.cs

@ -2,9 +2,8 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestDetailInput : SfsStoreDetailWithQtyInputBase public class CoatingIssueRequestDetailInput : SfsStoreDetailWithQtyInputBase
{ {

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestEditInput.cs → be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestEditInput.cs

@ -1,19 +1,19 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase public class CoatingIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase
{ {
#region Base #region Base
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public string Type { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库

15
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestImportInput.cs → be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestImportInput.cs

@ -1,23 +1,18 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
[Display(Name = "叫料申请")] [Display(Name = "喷涂叫料申请导入")]
public class CoatingIssueRequestImportInput : SfsStoreImportInputBase public class CoatingIssueRequestImportInput : SfsStoreImportInputBase
{ {
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
[Required(ErrorMessage = "{0}是必填项")] public EnumIssueRequestType IssueRequestType { get; set; }
[ImporterHeader(Name = "叫料类型")]
[ExporterHeader(DisplayName = "叫料类型")]
[ValueMapping("人工拉动", EnumMaterialRequestType.Issue_Manual)]
public string Type { get; set; }
/// <summary> /// <summary>
/// 物品代码 /// 物品代码

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/TransferLibRequests/ITransferLibRequestAppService.cs

@ -17,4 +17,7 @@ public interface ITransferLibRequestAppService
Task<PagedResultDto<TransferLibRequestDTO>> GetListForCustomAsync(SfsStoreRequestInputBase sfsRequestDTO, bool includeDetails = false, Task<PagedResultDto<TransferLibRequestDTO>> GetListForCustomAsync(SfsStoreRequestInputBase sfsRequestDTO, bool includeDetails = false,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task CompleteByJobAsync(string requestNumber);
Task CancelByCallRequestNumberAsync(string callRequestNumber);
Task CompleteByCallRequestNumberAsync(string callRequestNumber);
} }

97
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/GaoTongs/GaoTongAppService.cs

@ -162,5 +162,102 @@ public class GaoTongAppService : ApplicationService, IGaoTongAppService
}).ToList(); }).ToList();
return ret; return ret;
} }
/// <summary>
/// 人工拣选反馈富维东阳WMS【我方提供】【出库、立库系统直接出库、通知我方】
/// 人工拣选出库缴库完成,高通WMS反馈到富维东阳WMS
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("manual-selection")]
public async Task<GaoTongResultDTO> ManualSelection(ZuPanEditInput input)
{
GaoTongResultDTO ret = new GaoTongResultDTO();
try
{
ItemBasicDTO itemBasicObj = await _itemBasicAppService.GetByCodeAsync(input.ItemCode).ConfigureAwait(false);
if (itemBasicObj == null)
{
throw new UserFriendlyException($"{input.ItemCode}在Item表不存在!");
}
TransferNoteEditInput transferNoteEditInput = new TransferNoteEditInput();
transferNoteEditInput.TenantId = null;
transferNoteEditInput.Remark = String.Empty;
transferNoteEditInput.Worker = _currentUser.UserName;
transferNoteEditInput.ActiveDate = CommonHelper.CurTime;
transferNoteEditInput.Type = EnumTransSubType.Depot_Out.ToString(); //喷涂完工转储
transferNoteEditInput.UseOnTheWayLocation = false;
//transferNoteEditInput.number
//transferNoteEditInput.CallServerName
//transferNoteEditInput.Confirmed = true;
//transferNoteEditInput.ConfirmTime = CommonHelper.CurTime;
if (transferNoteEditInput.Details == null)
{
transferNoteEditInput.Details = new List<TransferNoteDetailInput>();
}
TransferNoteDetailInput detailObj = new TransferNoteDetailInput();
transferNoteEditInput.Details.Add(detailObj);
detailObj.Remark = "";
detailObj.ItemCode = input.ItemCode;
detailObj.ItemName = itemBasicObj.Name;
detailObj.ItemDesc1 = itemBasicObj.Desc1;
detailObj.ItemDesc2 = itemBasicObj.Desc2;
detailObj.Uom = itemBasicObj.BasicUom;
detailObj.Qty = input.Qty.TryToDecimalZero();
detailObj.StdPackQty = itemBasicObj.StdPackQty;
#region 去箱、去批、去托
detailObj.FromPackingCode = String.Empty;
detailObj.ToPackingCode = String.Empty;
detailObj.FromContainerCode = String.Empty;
detailObj.ToContainerCode = String.Empty;
detailObj.FromLot = String.Empty;
detailObj.ToLot = String.Empty;
#endregion
detailObj.SupplierBatch = String.Empty;
detailObj.ArriveDate = CommonHelper.CurTime;
detailObj.ProduceDate = CommonHelper.CurTime;
detailObj.ExpireDate = DateTime.MaxValue;
var fromLocationObj = await _locationAppService.GetByCodeAsync(input.FromLocationCode).ConfigureAwait(false);
if (fromLocationObj == null)
{
throw new UserFriendlyException($"{input.FromLocationCode}在Location表不存在!");
}
detailObj.FromLocationCode = input.FromLocationCode;
detailObj.FromLocationArea = fromLocationObj.AreaCode;
detailObj.FromLocationGroup = fromLocationObj.LocationGroupCode;
detailObj.FromLocationErpCode = fromLocationObj.ErpLocationCode;
detailObj.FromWarehouseCode = fromLocationObj.WarehouseCode;
var toLocationObj = await _locationAppService.GetByCodeAsync(input.ToLocationCode).ConfigureAwait(false);
if (toLocationObj == null)
{
throw new UserFriendlyException($"{input.ToLocationCode}在Location表不存在!");
}
detailObj.ToLocationCode = input.ToLocationCode;
detailObj.ToLocationArea = toLocationObj.AreaCode;
detailObj.ToLocationGroup = toLocationObj.LocationGroupCode;
detailObj.ToLocationErpCode = toLocationObj.ErpLocationCode;
detailObj.ToWarehouseCode = toLocationObj.WarehouseCode;
detailObj.FromStatus = EnumInventoryStatus.OK;
detailObj.ToStatus = EnumInventoryStatus.OK;
detailObj.OnTheWayLocationCode = String.Empty;
detailObj.Reason = "";
var temp = await _transferNoteAppService.CreateAsync(transferNoteEditInput).ConfigureAwait(false);
ret.Code = GaoTongResultStatus.Success;
ret.Message = "接收成功";
ret.OperateTime = CommonHelper.CurTimeStr;
return ret;
}
catch (Exception ex)
{
ret.Code = GaoTongResultStatus.Failure;
ret.Message = "ManualSelection执行失败:" + ex.Message;
ret.OperateTime = CommonHelper.CurTimeStr;
return ret;
}
}
} }

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

@ -3,21 +3,29 @@ using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter; using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MyNamespace;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain.Shared; using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes; using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
@ -28,17 +36,36 @@ public class AssembleIssueJobAppService
AssembleIssueJobCheckInput, AssembleIssueJobEditInput>, AssembleIssueJobCheckInput, AssembleIssueJobEditInput>,
IAssembleIssueJobAppService, ITransferLibCallback IAssembleIssueJobAppService, ITransferLibCallback
{ {
private readonly IAssembleIssueJobManager _assembleJobManager; private readonly IAssembleIssueJobManager _assembleIssueJobManager;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService; private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<RestoOptions> _options;
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestAppService>();
public AssembleIssueJobAppService( public AssembleIssueJobAppService(
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleJobManager, IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService) : base(repository, assembleJobManager) ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
IAssembleIssueNoteAppService assembleIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options
) : base(
repository, assembleIssueJobManager)
{ {
_assembleJobManager = assembleJobManager; _assembleIssueJobManager = assembleIssueJobManager;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService; _transferLibJobAppService = transferLibJobAppService;
_assembleIssueNoteAppService = assembleIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory;
_options = options;
} }
[HttpPost("add-many")] [HttpPost("add-many")]
@ -47,17 +74,183 @@ public class AssembleIssueJobAppService
foreach (var input in inputs) foreach (var input in inputs)
{ {
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
}
var assembleIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var assembleIssueJobDto in assembleIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(assembleIssueJobDto).ConfigureAwait(false);
} }
return await base.CreateManyAsync(inputs).ConfigureAwait(false); return assembleIssueJobDtos;
} }
[HttpPost("")] [HttpPost("")]
public override async Task<AssembleIssueJobDTO> CreateAsync(AssembleIssueJobEditInput input) public override async Task<AssembleIssueJobDTO> CreateAsync(AssembleIssueJobEditInput input)
{ {
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var assembleIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(assembleIssueJobDto).ConfigureAwait(false);
return assembleIssueJobDto;
}
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
{
var injectionJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (injectionJob == null)
{
throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
await _assembleIssueJobManager.CancelAsync(injectionJob).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)
{
await _assembleIssueJobManager.CancelAsync(entity).ConfigureAwait(false);
}
}
return await base.CreateAsync(input).ConfigureAwait(false); [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber)
.ConfigureAwait(false);
return ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entitys);
}
/// <summary>
/// 库移回调
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost("Do-Call-Back")]
public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto)
{
var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false);
var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false);
var transferLibNoteDetail = dto.Details.First();
var jobDetail = job.Details.First();
job.JobStatus = EnumJobStatus.Open;
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate;
jobDetail.TransferLibFromContainerCode = transferLibNoteDetail.HandledFromContainerCode;
jobDetail.TransferLibFromExpireDate = transferLibNoteDetail.HandledFromExpireDate;
jobDetail.TransferLibFromLocationArea = transferLibNoteDetail.HandledFromLocationArea;
jobDetail.TransferLibFromLocationCode = transferLibNoteDetail.HandledFromLocationCode;
jobDetail.TransferLibFromLocationErpCode = transferLibNoteDetail.HandledFromLocationErpCode;
jobDetail.TransferLibFromLocationGroup = transferLibNoteDetail.HandledFromLocationGroup;
jobDetail.TransferLibFromLot = transferLibNoteDetail.HandledFromLot;
jobDetail.TransferLibFromPackingCode = transferLibNoteDetail.HandledFromPackingCode;
jobDetail.TransferLibFromProduceDate = transferLibNoteDetail.HandledFromProduceDate;
jobDetail.TransferLibFromQty = transferLibNoteDetail.HandledFromQty;
jobDetail.TransferLibFromSupplierBatch = transferLibNoteDetail.HandledFromSupplierBatch;
jobDetail.TransferLibFromWarehouseCode = transferLibNoteDetail.HandledFromWarehouseCode;
jobDetail.TransferLibToArriveDate = transferLibNoteDetail.HandledToArriveDate;
jobDetail.TransferLibToContainerCode = transferLibNoteDetail.HandledToContainerCode;
jobDetail.TransferLibToExpireDate = transferLibNoteDetail.HandledToExpireDate;
jobDetail.TransferLibToLocationArea = transferLibNoteDetail.HandledToLocationArea;
jobDetail.TransferLibToLocationCode = transferLibNoteDetail.HandledToLocationCode;
jobDetail.TransferLibToLocationErpCode = transferLibNoteDetail.HandledToLocationErpCode;
jobDetail.TransferLibToLocationGroup = transferLibNoteDetail.HandledToLocationGroup;
jobDetail.TransferLibToLot = transferLibNoteDetail.HandledToLot;
jobDetail.TransferLibToPackingCode = transferLibNoteDetail.HandledToPackingCode;
jobDetail.TransferLibToProduceDate = transferLibNoteDetail.HandledToProduceDate;
jobDetail.TransferLibToQty = transferLibNoteDetail.HandledToQty;
jobDetail.TransferLibToSupplierBatch = transferLibNoteDetail.HandledToSupplierBatch;
jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode;
await _repository.UpdateAsync(job).ConfigureAwait(false);
}
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
[HttpPost("ExecuteDetail/{masterId}")]
public async Task ExecuteDetailAsync(Guid masterId, Guid detailId, AssembleIssueJobDetailDTO issueJobDetailDto)
{
var assembleIssueJob = await _repository.GetAsync(masterId).ConfigureAwait(false);
assembleIssueJob.JobStatus = EnumJobStatus.Doing;
var assembleIssueJobDto = ObjectMapper.Map<AssembleIssueJob, AssembleIssueJobDTO>(assembleIssueJob);
assembleIssueJobDto.Details = new List<AssembleIssueJobDetailDTO> { issueJobDetailDto };
var assembleIssueNoteEditInput = await BuildAssembleIssueNoteAsync(assembleIssueJobDto).ConfigureAwait(false);
await _assembleIssueNoteAppService.CreateAsync(assembleIssueNoteEditInput).ConfigureAwait(false);
var issueJobDetail = ObjectMapper.Map<AssembleIssueJobDetailDTO, AssembleIssueJobDetail>(issueJobDetailDto);
var entityDetail = assembleIssueJob.Details.Find(p => p.Id == detailId);
issueJobDetail.HandledFromQty = entityDetail.HandledFromQty;
issueJobDetail.HandledToQty = entityDetail.HandledToQty;
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty;
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty;
assembleIssueJob.Details = new EditableList<AssembleIssueJobDetail>() { issueJobDetail };
if (assembleIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
{
await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).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 _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false);
}
[HttpPost("CompleteAsync/{id}")]
public async Task CompleteAsync(Guid id)
{
var assembleIssueJob = await _repository.FindAsync(id).ConfigureAwait(false);
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 _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false);
}
#region 私有
/// <summary>
/// 创建补料记录实体
/// </summary>
/// <param name="assembleIssueJobDto"></param>
/// <returns></returns>
private async Task<AssembleIssueNoteEditInput> BuildAssembleIssueNoteAsync(AssembleIssueJobDTO assembleIssueJobDto)
{
var assembleIssueNoteCreateInput =
ObjectMapper.Map<AssembleIssueJobDTO, AssembleIssueNoteEditInput>(assembleIssueJobDto);
assembleIssueNoteCreateInput.JobNumber = assembleIssueJobDto.Number;
await Task.CompletedTask.ConfigureAwait(false);
return assembleIssueNoteCreateInput;
} }
/// <summary> /// <summary>
@ -75,7 +268,9 @@ public class AssembleIssueJobAppService
if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1) if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1)
{ {
input.JobStatus = EnumJobStatus.Wait; input.JobStatus = EnumJobStatus.Wait;
}
else if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode == 1)
{
jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate; jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate;
jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode; jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode;
jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate; jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate;
@ -93,101 +288,247 @@ public class AssembleIssueJobAppService
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate; jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate;
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode; jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode;
jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate; jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate;
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.RecommendToLocationArea;
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.RecommendToLocationCode;
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.RecommendToLocationErpCode;
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.RecommendToLocationGroup;
jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot; jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot;
jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode; jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate; jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty; jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch; jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch;
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.RecommendToWarehouseCode; jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.TransferLibFromWarehouseCode;
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.TransferLibFromLocationArea;
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.TransferLibFromLocationCode;
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.TransferLibFromLocationErpCode;
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.TransferLibFromLocationGroup;
} }
} }
[HttpPost("cancel-by-request/{assembleRequestNumber}")] /// <summary>
public virtual async Task CancelByMaterialRequestAsync(string assembleNumber) /// 判断是不是在立体库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(AssembleIssueJobEditInput input)
{ {
var entities = await _repository.GetListAsync(p => p.AssembleRequestNumber == assembleNumber) var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false); .ConfigureAwait(false);
foreach (var entity in entities)
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{ {
await _assembleJobManager.CancelAsync(entity).ConfigureAwait(false); input.JobStatus = EnumJobStatus.Wait;
} }
} }
[HttpPost("invalid")] /// <summary>
public override async Task CancelAsync(Guid id) /// 判断是不是在立体库
/// </summary>
/// <param name="assembleIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(AssembleIssueJobDTO assembleIssueJobDto)
{ {
var assembleJob = await _repository.GetAsync(id).ConfigureAwait(false); var jobDetailInputdetail = assembleIssueJobDto.Details.FirstOrDefault();
if (assembleJob == null)
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{ {
throw new UserFriendlyException($"未找到ID为 {id} 的任务"); //TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<AssembleIssueJobDTO> { assembleIssueJobDto }, loctionDto.Code).ConfigureAwait(false);
if (ret.Code != "1")
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
}
} }
await _assembleJobManager.CancelAsync(assembleJob).ConfigureAwait(false);
} }
[HttpPost("by-request-number/{requestNumber}")] /// <summary>
public virtual async Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber) /// 修改当前任务状态 和 该任务的请求状态
/// </summary>
/// <param name="assembleIssueJob"></param>
/// <param name="assembleIssueJobDetailDto"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task UpdateRequestAndjobStatusDoneAsync(AssembleIssueJob assembleIssueJob,
AssembleIssueJobDetailDTO assembleIssueJobDetailDto, decimal handledToQty)
{ {
var entitys = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber) if (assembleIssueJob.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None
or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中
{
throw new UserFriendlyException(
$"任务状态错误:编号为【{assembleIssueJob.Number}】的任务状态为【{assembleIssueJob.JobStatus.GetDisplayName()}】");
}
assembleIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number,
assembleIssueJobDetailDto.ItemCode,
assembleIssueJobDetailDto.HandledToLocationCode, assembleIssueJobDetailDto.HandledToPackingCode,
assembleIssueJobDetailDto.Status, assembleIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
//await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false);
await AssembleIssueRequestAppService.UpdateStatusCompletedAsync(assembleIssueJob.AssembleRequestNumber)
.ConfigureAwait(false); .ConfigureAwait(false);
return ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entitys);
await Task.CompletedTask.ConfigureAwait(false);
} }
[HttpPost("Do-Call-Back")]
public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto)
{
var job = await _repository.FindAsync(p => p.Number == dto.JobNumber).ConfigureAwait(false);
//todo 等云峰写好换成真实的
var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync("AAA").ConfigureAwait(false);
var transferLibNote = new TransferLibNote();
var transferLibNoteDetail = transferLibNote.Details.First();
var jobDetail = job.Details.First(); /// <summary>
job.JobStatus = EnumJobStatus.Open; /// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; public async Task<ReusltObject> SyncIssueJobStereoAsync(List<AssembleIssueJobDTO> input, string p_loc)
jobDetail.TransferLibFromContainerCode = transferLibNoteDetail.HandledFromContainerCode; {
jobDetail.TransferLibFromExpireDate = transferLibNoteDetail.HandledFromExpireDate; ReusltObject ret = new ReusltObject();
jobDetail.TransferLibFromLocationArea = transferLibNoteDetail.HandledFromLocationArea; ret.Code = "1";
jobDetail.TransferLibFromLocationCode = transferLibNoteDetail.HandledFromLocationCode; ret.Message = "操作成功";
jobDetail.TransferLibFromLocationErpCode = transferLibNoteDetail.HandledFromLocationErpCode; ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
jobDetail.TransferLibFromLocationGroup = transferLibNoteDetail.HandledFromLocationGroup; try
jobDetail.TransferLibFromLot = transferLibNoteDetail.HandledFromLot; {
jobDetail.TransferLibFromPackingCode = transferLibNoteDetail.HandledFromPackingCode; List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
jobDetail.TransferLibFromProduceDate = transferLibNoteDetail.HandledFromProduceDate; IssueJobToRestoDTO main = new IssueJobToRestoDTO();
jobDetail.TransferLibFromQty = transferLibNoteDetail.HandledFromQty; main.OperatorName = CurrentUser.UserName;
jobDetail.TransferLibFromSupplierBatch = transferLibNoteDetail.HandledFromSupplierBatch; foreach (var job in input)
jobDetail.TransferLibFromWarehouseCode = transferLibNoteDetail.HandledFromWarehouseCode; {
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
jobDetail.TransferLibToArriveDate = transferLibNoteDetail.HandledToArriveDate; string json = System.Text.Json.JsonSerializer.Serialize(main);
jobDetail.TransferLibToContainerCode = transferLibNoteDetail.HandledToContainerCode; _options.Value.Address = "http://localhost:59094/";//测试地址
jobDetail.TransferLibToExpireDate = transferLibNoteDetail.HandledToExpireDate; _options.Value.Token = "";//测试token
jobDetail.TransferLibToLocationArea = transferLibNoteDetail.HandledToLocationArea; _options.Value.UserName = "";//测试用户名
jobDetail.TransferLibToLocationCode = transferLibNoteDetail.HandledToLocationCode; _options.Value.Password = "";//测试密码
jobDetail.TransferLibToLocationErpCode = transferLibNoteDetail.HandledToLocationErpCode;
jobDetail.TransferLibToLocationGroup = transferLibNoteDetail.HandledToLocationGroup;
jobDetail.TransferLibToLot = transferLibNoteDetail.HandledToLot;
jobDetail.TransferLibToPackingCode = transferLibNoteDetail.HandledToPackingCode;
jobDetail.TransferLibToProduceDate = transferLibNoteDetail.HandledToProduceDate;
jobDetail.TransferLibToQty = transferLibNoteDetail.HandledToQty;
jobDetail.TransferLibToSupplierBatch = transferLibNoteDetail.HandledToSupplierBatch;
jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode;
await _repository.UpdateAsync(job).ConfigureAwait(false); #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");
}
return ret;
return;
} }
[HttpPost("test")] [HttpPost("receive-issue-job-stereo")]
public virtual async Task Test() public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input)
{ {
Console.WriteLine("FuAZCZXVZXVXZVZ");
await Task.CompletedTask; #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;
} }
#endregion
} }

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

@ -1,26 +1,20 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Net.Http.Headers;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter; using Castle.Components.DictionaryAdapter;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MyNamespace; using MyNamespace;
using Omu.ValueInjecter;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.ObjectMapping; using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts; 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;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -28,6 +22,8 @@ using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy; using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes; using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options; 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; namespace Win_in.Sfs.Wms.Store.Application;
@ -41,94 +37,91 @@ public class CoatingIssueJobAppService
private readonly ICoatingIssueJobManager _coatingIssueJobManager; private readonly ICoatingIssueJobManager _coatingIssueJobManager;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService; private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly ICoatingIssueNoteAppService _coatingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<RestoOptions> _options; private readonly IOptions<RestoOptions> _options;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>();
public CoatingIssueJobAppService( public CoatingIssueJobAppService(
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager, ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory , IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options , IOptions<RestoOptions> options
) : base(repository, coatingIssueJobManager)
) : base(
repository, coatingIssueJobManager)
{ {
_coatingIssueJobManager = coatingIssueJobManager; _coatingIssueJobManager = coatingIssueJobManager;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService; _transferLibJobAppService = transferLibJobAppService;
_coatingIssueNoteAppService = coatingIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
_options=options; _options = options;
} }
[HttpPost("add-many")] [HttpPost("add-many")]
public override async Task<List<CoatingIssueJobDTO>> CreateManyAsync(List<CoatingIssueJobEditInput> inputs) public override async Task<List<CoatingIssueJobDTO>> CreateManyAsync(List<CoatingIssueJobEditInput> inputs)
{ {
foreach (var input in inputs) foreach (var input in inputs)
{ {
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
} }
return await base.CreateManyAsync(inputs).ConfigureAwait(false); var coatingIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var coatingIssueJobDto in coatingIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
}
return coatingIssueJobDtos;
} }
[HttpPost("")] [HttpPost("")]
public override async Task<CoatingIssueJobDTO> CreateAsync(CoatingIssueJobEditInput input) public override async Task<CoatingIssueJobDTO> CreateAsync(CoatingIssueJobEditInput input)
{ {
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var coatingIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
return await base.CreateAsync(input).ConfigureAwait(false); return coatingIssueJobDto;
} }
/// <summary> [HttpPost("invalid")]
/// 判断是不是在最底层 如果不是则把状态变更为等待 并把库移推荐的From和To赋值 public override async Task CancelAsync(Guid id)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckMinRowAndSetStatusAsync(CoatingIssueJobEditInput input)
{ {
var jobDetailInputdetail = input.Details.FirstOrDefault(); var kittingJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (kittingJob == null)
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1)
{ {
input.JobStatus = EnumJobStatus.Wait; throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate;
jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode;
jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate;
jobDetailInputdetail.TransferLibFromLocationArea = jobDetailInputdetail.RecommendFromLocationArea;
jobDetailInputdetail.TransferLibFromLocationCode = jobDetailInputdetail.RecommendFromLocationCode;
jobDetailInputdetail.TransferLibFromLocationErpCode = jobDetailInputdetail.RecommendFromLocationErpCode;
jobDetailInputdetail.TransferLibFromLocationGroup = jobDetailInputdetail.RecommendFromLocationGroup;
jobDetailInputdetail.TransferLibFromLot = jobDetailInputdetail.RecommendFromLot;
jobDetailInputdetail.TransferLibFromPackingCode = jobDetailInputdetail.RecommendFromPackingCode;
jobDetailInputdetail.TransferLibFromProduceDate = jobDetailInputdetail.RecommendFromProduceDate;
jobDetailInputdetail.TransferLibFromQty = jobDetailInputdetail.RecommendFromQty;
jobDetailInputdetail.TransferLibFromSupplierBatch = jobDetailInputdetail.RecommendFromSupplierBatch;
jobDetailInputdetail.TransferLibFromWarehouseCode = jobDetailInputdetail.RecommendFromWarehouseCode;
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate; if (kittingJob.JobStatus == EnumJobStatus.Open || kittingJob.JobStatus == EnumJobStatus.Partial ||
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode; kittingJob.JobStatus == EnumJobStatus.Wait)
jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate; {
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.RecommendToLocationArea; throw new UserFriendlyException($"任务状态不是{kittingJob.JobStatus == EnumJobStatus.Open}、" +
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.RecommendToLocationCode; $"{kittingJob.JobStatus == EnumJobStatus.Partial}、" +
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.RecommendToLocationErpCode; $"{kittingJob.JobStatus == EnumJobStatus.Wait}");
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.RecommendToLocationGroup;
jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot;
jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch;
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.RecommendToWarehouseCode;
} }
await _expectOutAppService.RemoveByNumberAsync(kittingJob.Number).ConfigureAwait(false);
kittingJob.JobStatus = EnumJobStatus.Cancelled;
await _repository.UpdateAsync(kittingJob).ConfigureAwait(false);
} }
[HttpPost("cancel-by-request/{requestNumber}")] [HttpPost("cancel-by-request/{requestNumber}")]
public virtual async Task CancelByMaterialRequestAsync(string requestNumber) public virtual async Task CancelByMaterialRequestAsync(string requestNumber)
{ {
var entities = await _repository.GetListAsync(p => p.MaterialRequestNumber == requestNumber) var entities = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
.ConfigureAwait(false); .ConfigureAwait(false);
foreach (var entity in entities) foreach (var entity in entities)
{ {
@ -136,38 +129,33 @@ public class CoatingIssueJobAppService
} }
} }
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
{
var coatingIssueJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (coatingIssueJob == null)
{
throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
await _coatingIssueJobManager.CancelAsync(coatingIssueJob).ConfigureAwait(false);
}
[HttpPost("by-request-number/{requestNumber}")] [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber) public virtual async Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{ {
var entitys = await _repository.GetListAsync(p => p.MaterialRequestNumber == requestNumber) var entitys = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
.ConfigureAwait(false); .ConfigureAwait(false);
return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys); return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys);
} }
/// <summary>
/// 库移回调
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost("Do-Call-Back")] [HttpPost("Do-Call-Back")]
public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto) public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto)
{ {
var job = await _repository.FindAsync(p => p.Number == dto.JobNumber).ConfigureAwait(false); var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false);
//todo 等云峰写好换成真实的 if (job.JobStatus != EnumJobStatus.Wait)
var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync("AAA").ConfigureAwait(false); {
var transferLibNote = new TransferLibNote(); throw new UserFriendlyException($"任务状态不是{EnumJobStatus.Wait.GetDisplayName()}");
}
var transferLibNoteDetail = transferLibNote.Details.First(); var transferLibNoteDetail = dto.Details.First();
var jobDetail = job.Details.First(); var jobDetail = job.Details.First();
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate;
@ -199,133 +187,391 @@ public class CoatingIssueJobAppService
jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode; jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode;
await _repository.UpdateAsync(job).ConfigureAwait(false); await _repository.UpdateAsync(job).ConfigureAwait(false);
}
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
[HttpPost("ExecuteDetail/{masterId}")]
public async Task ExecuteDetailAsync(Guid masterId, Guid detailId, CoatingIssueJobDetailDTO issueJobDetailDto)
{
var coatingIssueJob = await _repository.GetAsync(masterId).ConfigureAwait(false);
coatingIssueJob.JobStatus = EnumJobStatus.Doing;
var coatingIssueJobDto = ObjectMapper.Map<CoatingIssueJob, CoatingIssueJobDTO>(coatingIssueJob);
coatingIssueJobDto.Details = new List<CoatingIssueJobDetailDTO> { issueJobDetailDto };
var coatingIssueNoteEditInput = await BuildCoatingIssueNoteAsync(coatingIssueJobDto).ConfigureAwait(false);
await _coatingIssueNoteAppService.CreateAsync(coatingIssueNoteEditInput).ConfigureAwait(false);
var issueJobDetail = ObjectMapper.Map<CoatingIssueJobDetailDTO, CoatingIssueJobDetail>(issueJobDetailDto);
var entityDetail = coatingIssueJob.Details.Find(p => p.Id == detailId);
issueJobDetail.HandledFromQty = entityDetail.HandledFromQty;
issueJobDetail.HandledToQty = entityDetail.HandledToQty;
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty;
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty;
coatingIssueJob.Details = new EditableList<CoatingIssueJobDetail>() { issueJobDetail };
if (coatingIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
{
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).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);
}
else
{
await RemoveExpectOutAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
}
}
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
}
/// <summary>
/// 完成任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("Complete/{id}")]
public async Task CompleteAsync(Guid id)
{
var coatingIssueJob = await _repository.FindAsync(id).ConfigureAwait(false);
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(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);
foreach (var coatingIssueJob in coatingIssueJobs)
{
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
}
}
#region 立库
/// <summary>
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<CoatingIssueJobDTO> input, string p_loc)
{
ReusltObject 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();
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");
}
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);
#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<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 itmDetails = itm.Details.ToList();
List<CoatingIssueJobDetailDTO> details = new List<CoatingIssueJobDetailDTO>();
foreach (var detail in first.Details)
{
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
CoatingIssueJobDetailDTO dto = new CoatingIssueJobDetailDTO();
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>
/// 创建补料记录实体
/// </summary>
/// <param name="coatingIssueJobDto"></param>
/// <returns></returns>
private async Task<CoatingIssueNoteEditInput> BuildCoatingIssueNoteAsync(CoatingIssueJobDTO coatingIssueJobDto)
{
var coatingIssueNoteCreateInput =
ObjectMapper.Map<CoatingIssueJobDTO, CoatingIssueNoteEditInput>(coatingIssueJobDto);
coatingIssueNoteCreateInput.JobNumber = coatingIssueJobDto.Number;
await Task.CompletedTask.ConfigureAwait(false);
return coatingIssueNoteCreateInput;
}
/// <summary>
/// 判断是不是在最底层 如果不是则把状态变更为等待 并把库移推荐的From和To赋值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckMinRowAndSetStatusAsync(CoatingIssueJobEditInput input)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1)
{
input.JobStatus = EnumJobStatus.Wait;
}
else if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode == 1)
{
jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate;
jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode;
jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate;
jobDetailInputdetail.TransferLibFromLocationArea = jobDetailInputdetail.RecommendFromLocationArea;
jobDetailInputdetail.TransferLibFromLocationCode = jobDetailInputdetail.RecommendFromLocationCode;
jobDetailInputdetail.TransferLibFromLocationErpCode = jobDetailInputdetail.RecommendFromLocationErpCode;
jobDetailInputdetail.TransferLibFromLocationGroup = jobDetailInputdetail.RecommendFromLocationGroup;
jobDetailInputdetail.TransferLibFromLot = jobDetailInputdetail.RecommendFromLot;
jobDetailInputdetail.TransferLibFromPackingCode = jobDetailInputdetail.RecommendFromPackingCode;
jobDetailInputdetail.TransferLibFromProduceDate = jobDetailInputdetail.RecommendFromProduceDate;
jobDetailInputdetail.TransferLibFromQty = jobDetailInputdetail.RecommendFromQty;
jobDetailInputdetail.TransferLibFromSupplierBatch = jobDetailInputdetail.RecommendFromSupplierBatch;
jobDetailInputdetail.TransferLibFromWarehouseCode = jobDetailInputdetail.RecommendFromWarehouseCode;
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate;
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode;
jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate;
jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot;
jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch;
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.TransferLibFromWarehouseCode;
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.TransferLibFromLocationArea;
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.TransferLibFromLocationCode;
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.TransferLibFromLocationErpCode;
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.TransferLibFromLocationGroup;
}
}
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(CoatingIssueJobEditInput 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; /// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="coatingIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(CoatingIssueJobDTO coatingIssueJobDto)
{
var jobDetailInputdetail = coatingIssueJobDto.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
//TODO 立体库
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>
/// <param name="handledToQty"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task UpdateRequestAndjobStatusDoneAsync(CoatingIssueJob coatingIssueJob,
CoatingIssueJobDetailDTO coatingIssueJobDetailDto, decimal handledToQty)
{
if (coatingIssueJob.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None
or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中
{
throw new UserFriendlyException(
$"任务状态错误:编号为【{coatingIssueJob.Number}】的任务状态为【{coatingIssueJob.JobStatus.GetDisplayName()}】");
}
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await RemoveExpectOutAsync(coatingIssueJob, coatingIssueJobDetailDto, handledToQty).ConfigureAwait(false);
//await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber)
.ConfigureAwait(false);
await Task.CompletedTask.ConfigureAwait(false);
} }
private async Task RemoveExpectOutAsync(CoatingIssueJob coatingIssueJob, CoatingIssueJobDetailDTO coatingIssueJobDetailDto,
decimal handledToQty)
{
await _expectOutAppService.RemoveByNumberAndInventoryAsync(coatingIssueJob.Number,
coatingIssueJobDetailDto.ItemCode,
coatingIssueJobDetailDto.HandledToLocationCode, coatingIssueJobDetailDto.HandledToPackingCode,
coatingIssueJobDetailDto.Status, coatingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
//[HttpPost("sync-issue-job-stereo")] #endregion
//public virtual async Task<ReusltObject> SyncCoatingJobStereoAsync(List<CoatingIssueJobDTO> input)
//{
// ReusltObject ret=new ReusltObject();
// ret.Code = "1";
// ret.Message = "操作成功";
// ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
// 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=jobitem.HandledToLocationCode,
// WorkNo=job.Number,
// TaskNo=job.Number
// });
// }
// }
// main.Details=IssueJobToRestoDetailDTOs;
// #region
// IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, _httpClientFactory.CreateClient());
// ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
// #endregion
// return ret;
//}
//[HttpPost("receive-issue-job-stereo")]
//public virtual async Task<ReusltObject> SyncReciveCoatingJobStereoAsync(IssueRequestFromRestoDTO input)
//{
// 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 inputs = input.Jobs;
// var numbers = inputs.Select(p => p.JobNumber);
// var query = _repository.WithDetails()
// .Where(p => numbers.Contains(p.Number));
// var entities = query.ToList();
// if (input.Jobs.Count == entities.Count) {
// errors.Add("出库任务和WMS出库任务不符,请核对! \n");
// }
// var dtos = ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entities);
// foreach (var itm in dtos)
// {
// var first = inputs.FirstOrDefault<IssueJobFromRestoDTO>(p => p.JobNumber == itm.Number);
// var itmDetails = itm.Details;
// List<CoatingIssueJobDetailDTO> details = new List<CoatingIssueJobDetailDTO>();
// foreach (var detail in first.Details)
// {
// var entity=itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
// CoatingIssueJobDetailDTO dto = new CoatingIssueJobDetailDTO();
// dto.HandledFromLocationCode = entity.HandledFromContainerCode;
// dto.HandledToLocationCode = entity.HandledToLocationCode;
// dto.ItemCode = detail.ItemCode;
// dto.RecommendFromQty = detail.Qty;
// dto.RecommendToQty = detail.Qty;
// dto.HandledFromQty = detail.Qty;
// dto.HandledToQty = detail.Qty;
// 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;
//}
} }

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAutoMapperProfile.cs

@ -2,7 +2,6 @@ using AutoMapper;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
@ -13,8 +12,6 @@ public partial class StoreApplicationAutoMapperProfile : Profile
CreateMap<CoatingIssueJob, CoatingIssueJobDTO>() CreateMap<CoatingIssueJob, CoatingIssueJobDTO>()
.ReverseMap(); .ReverseMap();
//CreateMap<CoatingIssueJobDTO, CoatingIssueJob>();
CreateMap<CoatingIssueJobDetail, CoatingIssueJobDetailDTO>() CreateMap<CoatingIssueJobDetail, CoatingIssueJobDetailDTO>()
; ;

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs

@ -43,7 +43,7 @@ public class IssueJobAppService
/// <exception cref="NotImplementedException"></exception> /// <exception cref="NotImplementedException"></exception>
[Authorize] [Authorize]
[HttpGet("check-job-exist")] [HttpGet("check-job-exist")]
public virtual async Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCode(string itemCode, public virtual async Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCodeAsync(string itemCode,
string locationCode) string locationCode)
{ {
var entities = await _repository.GetListAsync(c => var entities = await _repository.GetListAsync(c =>

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

@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter; using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
@ -10,7 +12,6 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MyNamespace; using MyNamespace;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; 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.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; 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.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes; using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options; 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; namespace Win_in.Sfs.Wms.Store.Application;
@ -36,10 +34,10 @@ public class KittingIssueJobAppService
{ {
private readonly IKittingIssueJobManager _kittingIssueJobManager; private readonly IKittingIssueJobManager _kittingIssueJobManager;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly IKittingIssueNoteAppService _kittingIssueNoteAppService; private readonly IKittingIssueNoteAppService _kittingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService; private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options; private readonly IOptions<RestoOptions> _options;
protected IKittingIssueRequestAppService KittingIssueRequestAppService => protected IKittingIssueRequestAppService KittingIssueRequestAppService =>
@ -47,23 +45,19 @@ public class KittingIssueJobAppService
public KittingIssueJobAppService( public KittingIssueJobAppService(
IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager, IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService, ILocationAppService locationAppService,
IKittingIssueNoteAppService kittingIssueNoteAppService, IExpectOutAppService expectOutAppService IKittingIssueNoteAppService kittingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory , IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options , IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService) : base(
) : base(
repository, kittingIssueJobManager) repository, kittingIssueJobManager)
{ {
_kittingIssueJobManager = kittingIssueJobManager; _kittingIssueJobManager = kittingIssueJobManager;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
_kittingIssueNoteAppService = kittingIssueNoteAppService; _kittingIssueNoteAppService = kittingIssueNoteAppService;
_expectOutAppService = expectOutAppService; _expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
_options = options; _options = options;
_transferLibRequestAppService = transferLibRequestAppService;
} }
[HttpPost("add-many")] [HttpPost("add-many")]
@ -75,12 +69,12 @@ public class KittingIssueJobAppService
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false); await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
} }
var kittingIssueJobDtos=await base.CreateManyAsync(inputs).ConfigureAwait(false); var kittingIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var kittingIssueJobDto in kittingIssueJobDtos) foreach (var kittingIssueJobDto in kittingIssueJobDtos)
{ {
await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false); await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
} }
return kittingIssueJobDtos; return kittingIssueJobDtos;
} }
@ -90,7 +84,7 @@ public class KittingIssueJobAppService
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false); await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var kittingIssueJobDto=await base.CreateAsync(input).ConfigureAwait(false); var kittingIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false); await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
return kittingIssueJobDto; return kittingIssueJobDto;
@ -99,23 +93,31 @@ public class KittingIssueJobAppService
[HttpPost("invalid")] [HttpPost("invalid")]
public override async Task CancelAsync(Guid id) public override async Task CancelAsync(Guid id)
{ {
var injectionJob = await _repository.GetAsync(id).ConfigureAwait(false); var kittingJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (injectionJob == null) if (kittingJob == null)
{ {
throw new UserFriendlyException($"未找到ID为 {id} 的任务"); throw new UserFriendlyException($"未找到ID为 {id} 的任务");
} }
await _kittingIssueJobManager.CancelAsync(injectionJob).ConfigureAwait(false); if (kittingJob.JobStatus == EnumJobStatus.Open ||
} kittingJob.JobStatus == EnumJobStatus.Partial ||
kittingJob.JobStatus == EnumJobStatus.Wait||
kittingJob.JobStatus == EnumJobStatus.Doing)
{
await _expectOutAppService.RemoveByNumberAsync(kittingJob.Number).ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(kittingJob.KittingRequestNumber)
.ConfigureAwait(false);
[HttpPost("cancel-by-request/{requestNumber}")] kittingJob.JobStatus = EnumJobStatus.Cancelled;
public virtual async Task CancelByMaterialRequestAsync(string requestNumber) await _repository.UpdateAsync(kittingJob).ConfigureAwait(false);
{ }
var entities = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber) else
.ConfigureAwait(false);
foreach (var entity in entities)
{ {
await _kittingIssueJobManager.CancelAsync(entity).ConfigureAwait(false); throw new UserFriendlyException($"任务状态不是" +
$"{EnumJobStatus.Open.GetDisplayName()}、" +
$"{EnumJobStatus.Partial.GetDisplayName()}、" +
$"{EnumJobStatus.Doing.GetDisplayName()}、" +
$"{EnumJobStatus.Wait.GetDisplayName()}");
} }
} }
@ -137,11 +139,15 @@ public class KittingIssueJobAppService
{ {
var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false); 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 transferLibNoteDetail = dto.Details.First();
var jobDetail = job.Details.First(); var jobDetail = job.Details.First();
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate;
@ -190,49 +196,237 @@ public class KittingIssueJobAppService
var kittingIssueNoteEditInput = await BuildKittingIssueNoteAsync(kittingIssueJobDto).ConfigureAwait(false); var kittingIssueNoteEditInput = await BuildKittingIssueNoteAsync(kittingIssueJobDto).ConfigureAwait(false);
await _kittingIssueNoteAppService.CreateAsync(kittingIssueNoteEditInput).ConfigureAwait(false); await _kittingIssueNoteAppService.CreateAsync(kittingIssueNoteEditInput).ConfigureAwait(false);
var issueJobDetail=ObjectMapper.Map<KittingIssueJobDetailDTO, KittingIssueJobDetail>(issueJobDetailDto); var issueJobDetail = ObjectMapper.Map<KittingIssueJobDetailDTO, KittingIssueJobDetail>(issueJobDetailDto);
var entityDetail=kittingIssueJob.Details.Find(p => p.Id == detailId); var entityDetail = kittingIssueJob.Details.Find(p => p.Id == detailId);
issueJobDetail.HandledFromQty = entityDetail.HandledFromQty; issueJobDetail.HandledFromQty = entityDetail.HandledFromQty;
issueJobDetail.HandledToQty = entityDetail.HandledToQty; issueJobDetail.HandledToQty = entityDetail.HandledToQty;
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty; issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty;
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty; issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty;
kittingIssueJob.Details = new EditableList<KittingIssueJobDetail>() { issueJobDetail }; kittingIssueJob.Details = new EditableList<KittingIssueJobDetail> { issueJobDetail };
if (kittingIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成 if (kittingIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
{ {
await UpdateRequestAndjobStatusDoneAsync(kittingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); if (issueJobDetailDto.RecommendToPackingCode != issueJobDetailDto.HandledToPackingCode)
{
await CheckPackingCodeIsUserAsync(issueJobDetailDto.HandledToPackingCode, kittingIssueJob.Number).ConfigureAwait(false);
}
await UpdateRequestAndjobStatusDoneAsync(kittingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty)
.ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false);
} }
else else
{ {
var detail = kittingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id); var detail = kittingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id);
if (issueJobDetail.HandledToQty >= detail.RequestQty) if (issueJobDetail.HandledToQty >= detail.RequestQty)
{ {
await UpdateRequestAndjobStatusDoneAsync(kittingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); await UpdateRequestAndjobStatusDoneAsync(kittingIssueJob, issueJobDetailDto,
issueJobDetailDto.HandledToQty).ConfigureAwait(false);
}
else
{
await RemoveExpectOutAsync(kittingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty)
.ConfigureAwait(false);
} }
} }
await _repository.UpdateAsync(kittingIssueJob).ConfigureAwait(false); await _repository.UpdateAsync(kittingIssueJob).ConfigureAwait(false);
} }
[HttpPost("CompleteAsync/{id}")] /// <summary>
/// 完成任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("Complete/{id}")]
public async Task CompleteAsync(Guid id) public async Task CompleteAsync(Guid id)
{ {
var kittingIssueJob=await _repository.FindAsync(id).ConfigureAwait(false); var kittingIssueJob = await _repository.FindAsync(id).ConfigureAwait(false);
kittingIssueJob.JobStatus = EnumJobStatus.Done; kittingIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAndInventoryAsync(kittingIssueJob.Number,
kittingIssueJob.Details.First().ItemCode,
kittingIssueJob.Details.First().HandledToLocationCode, kittingIssueJob.Details.First().HandledToPackingCode,
kittingIssueJob.Details.First().Status, kittingIssueJob.Details.First().HandledToLot,
kittingIssueJob.Details.First().HandledToQty).ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false); await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false);
await KittingIssueRequestAppService.UpdateStatusCompletedAsync(kittingIssueJob.KittingRequestNumber)
.ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(kittingIssueJob.KittingRequestNumber)
.ConfigureAwait(false);
await _repository.UpdateAsync(kittingIssueJob).ConfigureAwait(false); await _repository.UpdateAsync(kittingIssueJob).ConfigureAwait(false);
} }
/// <summary>
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpPost("complete-by-request/{requestNumber}")]
public async Task CompleteByRequestNumberAsync(string requestNumber)
{
var kittingIssueJobs = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber)
.ConfigureAwait(false);
foreach (var kittingIssueJob in kittingIssueJobs)
{
kittingIssueJob.JobStatus = EnumJobStatus.Done;
await _repository.UpdateAsync(kittingIssueJob).ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(kittingIssueJob.KittingRequestNumber)
.ConfigureAwait(false);
}
}
#region 立库
/// <summary>
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<KittingIssueJobDTO> input, string p_loc)
{
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 = p_loc,
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<KittingIssueJob>, List<KittingIssueJobDTO>>(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<KittingIssueJobDetailDTO>();
foreach (var detail in first.Details)
{
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
var dto = new KittingIssueJobDetailDTO();
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 私有 #region 私有
/// <summary> /// <summary>
@ -332,25 +526,25 @@ public class KittingIssueJobAppService
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse) if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{ {
//TODO 立体库 //TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<KittingIssueJobDTO> { kittingIssueJobDto }, loctionDto.Code).ConfigureAwait(false); var ret = await SyncIssueJobStereoAsync(new List<KittingIssueJobDTO> { kittingIssueJobDto },
loctionDto.Code).ConfigureAwait(false);
if (ret.Code != "1") if (ret.Code != "1")
{ {
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}"); throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
} }
} }
} }
/// <summary> /// <summary>
/// 修改当前任务状态 和 该任务的请求状态 /// 修改当前任务状态 和 该任务的请求状态
/// </summary> /// </summary>
/// <param name="kittingIssueJob"></param> /// <param name="kittingIssueJob"></param>
/// <param name="kittingIssueJobDetailDto"></param> /// <param name="kittingIssueJobDetailDto"></param>
/// <param name="handledToQty"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task UpdateRequestAndjobStatusDoneAsync(KittingIssueJob kittingIssueJob, private async Task UpdateRequestAndjobStatusDoneAsync(KittingIssueJob kittingIssueJob,
KittingIssueJobDetailDTO kittingIssueJobDetailDto,decimal handledToQty) KittingIssueJobDetailDTO kittingIssueJobDetailDto, decimal handledToQty)
{ {
if (kittingIssueJob.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None if (kittingIssueJob.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None
or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中 or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中
@ -361,11 +555,7 @@ public class KittingIssueJobAppService
kittingIssueJob.JobStatus = EnumJobStatus.Done; kittingIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAndInventoryAsync(kittingIssueJob.Number, await RemoveExpectOutAsync(kittingIssueJob, kittingIssueJobDetailDto, handledToQty).ConfigureAwait(false);
kittingIssueJobDetailDto.ItemCode,
kittingIssueJobDetailDto.HandledToLocationCode, kittingIssueJobDetailDto.HandledToPackingCode,
kittingIssueJobDetailDto.Status, kittingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
//await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false); //await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false);
@ -375,157 +565,33 @@ public class KittingIssueJobAppService
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
} }
/// <summary> /// <summary>
/// 立体库同步 /// 判断实际TO的箱码是否被占用
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="packingCode"></param>
/// <param name="p_loc"></param> /// <param name="jobNumber"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("sync-issue-job-stereo")] /// <exception cref="UserFriendlyException"></exception>
private async Task CheckPackingCodeIsUserAsync(string packingCode,string jobNumber)
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<KittingIssueJobDTO> input,string p_loc)
{ {
ReusltObject ret = new ReusltObject(); var list = await _expectOutAppService.GetListByPackingCodeAsync(packingCode).ConfigureAwait(false);
ret.Code = "1"; list=list.Where(p => p.JobNumber != jobNumber).ToList();
ret.Message = "操作成功"; if (list.Any())
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
try
{ {
List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>(); throw new UserFriendlyException($"任务号【{list.First().JobNumber}】已占用,【{packingCode}】箱码");
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");
} }
return ret;
} }
[HttpPost("receive-issue-job-stereo")] private async Task RemoveExpectOutAsync(KittingIssueJob kittingIssueJob,
public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input) KittingIssueJobDetailDTO kittingIssueJobDetailDto,
decimal handledToQty)
{ {
await _expectOutAppService.RemoveByNumberAndInventoryAsync(kittingIssueJob.Number,
#if DEBUG kittingIssueJobDetailDto.ItemCode,
var json= System.Text.Json.JsonSerializer.Serialize(input); kittingIssueJobDetailDto.HandledToLocationCode, kittingIssueJobDetailDto.HandledToPackingCode,
#endif kittingIssueJobDetailDto.Status, kittingIssueJobDetailDto.HandledToLot,
List<string> errors = new List<string>(); handledToQty).ConfigureAwait(false);
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<KittingIssueJob>, List<KittingIssueJobDTO>>(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<KittingIssueJobDetailDTO> details = new List<KittingIssueJobDetailDTO>();
foreach (var detail in first.Details)
{
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
KittingIssueJobDetailDTO dto = new KittingIssueJobDetailDTO();
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 #endregion
} }

143
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/TransferLibJobs/TransferLibJobAppService.cs

@ -1,12 +1,14 @@
using System; using System;
using System.Reflection; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -16,23 +18,31 @@ namespace Win_in.Sfs.Wms.Store.Application;
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}transfer-lib-job")] [Route($"{StoreConsts.RootPath}transfer-lib-job")]
public class TransferLibJobAppService public class TransferLibJobAppService
: SfsJobAppServiceBase<TransferLibJob, TransferLibJobDetail, TransferLibJobDTO, SfsJobRequestInputBase, TransferLibJobCheckInput, TransferLibJobEditInput>, : SfsJobAppServiceBase<TransferLibJob, TransferLibJobDetail, TransferLibJobDTO, SfsJobRequestInputBase,
ITransferLibJobAppService TransferLibJobCheckInput, TransferLibJobEditInput>,
ITransferLibJobAppService
{ {
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IExpectOutAppService _expectOutAppService;
protected ITransferLibRequestAppService TransferLibRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ITransferLibRequestAppService>();
public TransferLibJobAppService( public TransferLibJobAppService(
ITransferLibJobRepository repository, ITransferLibJobManager TransferLibJobManager, IServiceProvider serviceProvider, ILocationAppService locationAppService) : base(repository, TransferLibJobManager) ITransferLibJobRepository repository, ITransferLibJobManager TransferLibJobManager,
IServiceProvider serviceProvider, ILocationAppService locationAppService,
IExpectOutAppService expectOutAppService) : base(repository,
TransferLibJobManager)
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_expectOutAppService = expectOutAppService;
} }
/// <summary> /// <summary>
/// 新移库完成任务 /// 新移库完成任务
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name="id"></param>
/// <param name="dto"></param> /// <param name="dto"></param>
@ -41,32 +51,41 @@ public class TransferLibJobAppService
[UnitOfWork] [UnitOfWork]
public override async Task<TransferLibJobDTO> CompleteAsync(Guid id, TransferLibJobDTO dto) public override async Task<TransferLibJobDTO> CompleteAsync(Guid id, TransferLibJobDTO dto)
{ {
string methodPrefix = "TransferLibJobAppService.CompleteAsync - "; var methodPrefix = "TransferLibJobAppService.CompleteAsync - ";
if (dto.CallServerName.IsNullOrEmpty()) if (dto.CallServerName.IsNullOrEmpty())
{ {
throw new UserFriendlyException($"{methodPrefix}CallServerName 不能为空"); throw new UserFriendlyException($"{methodPrefix}CallServerName 不能为空");
} }
if (dto.CallBusinessType.IsNullOrEmpty()) if (dto.CallBusinessType.IsNullOrEmpty())
{ {
throw new UserFriendlyException($"{methodPrefix}CallBusinessType 不能为空"); throw new UserFriendlyException($"{methodPrefix}CallBusinessType 不能为空");
} }
if (dto.CallRequestNumber.IsNullOrEmpty()) if (dto.CallRequestNumber.IsNullOrEmpty())
{ {
throw new UserFriendlyException($"{methodPrefix}CallRequestNumber 不能为空"); throw new UserFriendlyException($"{methodPrefix}CallRequestNumber 不能为空");
} }
if (dto.CallJobNumber.IsNullOrEmpty()) if (dto.CallJobNumber.IsNullOrEmpty())
{ {
throw new UserFriendlyException($"{methodPrefix}CallJobNumber 不能为空"); throw new UserFriendlyException($"{methodPrefix}CallJobNumber 不能为空");
} }
#region 校验 #region 校验
foreach (var detailObj in dto.Details) foreach (var detailObj in dto.Details)
{ {
if (detailObj.RecommendToPackingCode != detailObj.HandledToPackingCode)
{
await CheckPackingCodeIsUserAsync(detailObj.HandledToPackingCode, dto.CallJobNumber).ConfigureAwait(false);
}
if (detailObj.IsPackingCodeFrom) if (detailObj.IsPackingCodeFrom)
{ {
if (detailObj.RecommendFromPackingCode != detailObj.HandledFromPackingCode) if (detailObj.RecommendFromPackingCode != detailObj.HandledFromPackingCode)
{ {
throw new UserFriendlyException($"触发校验:推荐From箱码必须等于实际From箱码"); throw new UserFriendlyException("触发校验:推荐From箱码必须等于实际From箱码");
} }
} }
@ -74,7 +93,7 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendToPackingCode != detailObj.HandledToPackingCode) if (detailObj.RecommendToPackingCode != detailObj.HandledToPackingCode)
{ {
throw new UserFriendlyException($"触发校验:推荐To箱码必须等于实际To箱码"); throw new UserFriendlyException("触发校验:推荐To箱码必须等于实际To箱码");
} }
} }
@ -82,7 +101,7 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendFromLot != detailObj.HandledFromLot) if (detailObj.RecommendFromLot != detailObj.HandledFromLot)
{ {
throw new UserFriendlyException($"触发校验:推荐From批次必须等于实际From批次"); throw new UserFriendlyException("触发校验:推荐From批次必须等于实际From批次");
} }
} }
@ -90,9 +109,10 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendToLot != detailObj.HandledToLot) if (detailObj.RecommendToLot != detailObj.HandledToLot)
{ {
throw new UserFriendlyException($"触发校验:推荐To批次必须等于实际To批次"); throw new UserFriendlyException("触发校验:推荐To批次必须等于实际To批次");
} }
} }
//if (detailObj.IsItemCodeFrom) //if (detailObj.IsItemCodeFrom)
//if (detailObj.IsItemCodeTo) //if (detailObj.IsItemCodeTo)
//if (detailObj.IsStatusFrom) //if (detailObj.IsStatusFrom)
@ -101,7 +121,7 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendFromLocationCode != detailObj.HandledFromLocationCode) if (detailObj.RecommendFromLocationCode != detailObj.HandledFromLocationCode)
{ {
throw new UserFriendlyException($"触发校验:推荐From库位必须等于实际From库位"); throw new UserFriendlyException("触发校验:推荐From库位必须等于实际From库位");
} }
} }
@ -109,7 +129,7 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendToLocationCode != detailObj.HandledToLocationCode) if (detailObj.RecommendToLocationCode != detailObj.HandledToLocationCode)
{ {
throw new UserFriendlyException($"触发校验:推荐To库位必须等于实际To库位"); throw new UserFriendlyException("触发校验:推荐To库位必须等于实际To库位");
} }
} }
@ -117,7 +137,7 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendFromLocationGroup != detailObj.HandledFromLocationGroup) if (detailObj.RecommendFromLocationGroup != detailObj.HandledFromLocationGroup)
{ {
throw new UserFriendlyException($"触发校验:推荐From库位组必须等于实际From库位组"); throw new UserFriendlyException("触发校验:推荐From库位组必须等于实际From库位组");
} }
} }
@ -125,14 +145,15 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendToLocationGroup != detailObj.HandledToLocationGroup) if (detailObj.RecommendToLocationGroup != detailObj.HandledToLocationGroup)
{ {
throw new UserFriendlyException($"触发校验:推荐To库位组必须等于实际To库位组"); throw new UserFriendlyException("触发校验:推荐To库位组必须等于实际To库位组");
} }
} }
if (detailObj.IsLocationAreaFrom) if (detailObj.IsLocationAreaFrom)
{ {
if (detailObj.RecommendFromLocationArea != detailObj.HandledFromLocationArea) if (detailObj.RecommendFromLocationArea != detailObj.HandledFromLocationArea)
{ {
throw new UserFriendlyException($"触发校验:推荐From库区必须等于实际From库区"); throw new UserFriendlyException("触发校验:推荐From库区必须等于实际From库区");
} }
} }
@ -140,14 +161,15 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendToLocationArea != detailObj.HandledToLocationArea) if (detailObj.RecommendToLocationArea != detailObj.HandledToLocationArea)
{ {
throw new UserFriendlyException($"触发校验:推荐To库区必须等于实际To库区"); throw new UserFriendlyException("触发校验:推荐To库区必须等于实际To库区");
} }
} }
if (detailObj.IsLocationErpCodeFrom) if (detailObj.IsLocationErpCodeFrom)
{ {
if (detailObj.RecommendFromLocationErpCode != detailObj.HandledFromLocationErpCode) if (detailObj.RecommendFromLocationErpCode != detailObj.HandledFromLocationErpCode)
{ {
throw new UserFriendlyException($"触发校验:推荐From ERP库区必须等于实际From ERP库区"); throw new UserFriendlyException("触发校验:推荐From ERP库区必须等于实际From ERP库区");
} }
} }
@ -155,24 +177,27 @@ public class TransferLibJobAppService
{ {
if (detailObj.RecommendToLocationErpCode != detailObj.HandledToLocationErpCode) if (detailObj.RecommendToLocationErpCode != detailObj.HandledToLocationErpCode)
{ {
throw new UserFriendlyException($"触发校验:推荐To ERP库区必须等于实际To ERP库区"); throw new UserFriendlyException("触发校验:推荐To ERP库区必须等于实际To ERP库区");
} }
} }
if (detailObj.IsQtyFrom) if (detailObj.IsQtyFrom)
{ {
if (detailObj.RecommendFromQty != detailObj.HandledFromQty) if (detailObj.RecommendFromQty != detailObj.HandledFromQty)
{ {
throw new UserFriendlyException($"触发校验:推荐From数量必须等于实际From数量"); throw new UserFriendlyException("触发校验:推荐From数量必须等于实际From数量");
} }
} }
if (detailObj.IsQtyTo) if (detailObj.IsQtyTo)
{ {
if (detailObj.RecommendToQty != detailObj.HandledToQty) if (detailObj.RecommendToQty != detailObj.HandledToQty)
{ {
throw new UserFriendlyException($"触发校验:推荐To数量必须等于实际To数量"); throw new UserFriendlyException("触发校验:推荐To数量必须等于实际To数量");
} }
} }
} }
#endregion #endregion
foreach (var detail in dto.Details) foreach (var detail in dto.Details)
@ -180,8 +205,10 @@ public class TransferLibJobAppService
detail.HandledFromContainerCode = string.Empty; detail.HandledFromContainerCode = string.Empty;
detail.HandledToContainerCode = string.Empty; detail.HandledToContainerCode = string.Empty;
var fromLocationDto=await _locationAppService.GetByCodeAsync(detail.HandledFromLocationCode).ConfigureAwait(false); var fromLocationDto = await _locationAppService.GetByCodeAsync(detail.HandledFromLocationCode)
var toLocationDto=await _locationAppService.GetByCodeAsync(detail.HandledToLocationCode).ConfigureAwait(false); .ConfigureAwait(false);
var toLocationDto =
await _locationAppService.GetByCodeAsync(detail.HandledToLocationCode).ConfigureAwait(false);
detail.HandledFromLocationArea = fromLocationDto.AreaCode; detail.HandledFromLocationArea = fromLocationDto.AreaCode;
detail.HandledFromLocationCode = fromLocationDto.Code; detail.HandledFromLocationCode = fromLocationDto.Code;
@ -190,7 +217,7 @@ public class TransferLibJobAppService
detail.HandledFromWarehouseCode = fromLocationDto.WarehouseCode; detail.HandledFromWarehouseCode = fromLocationDto.WarehouseCode;
detail.HandledToLocationArea = toLocationDto.AreaCode; detail.HandledToLocationArea = toLocationDto.AreaCode;
detail.HandledToLocationCode = toLocationDto.Code ; detail.HandledToLocationCode = toLocationDto.Code;
detail.HandledToLocationErpCode = toLocationDto.ErpLocationCode; detail.HandledToLocationErpCode = toLocationDto.ErpLocationCode;
detail.HandledToLocationGroup = toLocationDto.LocationGroupCode; detail.HandledToLocationGroup = toLocationDto.LocationGroupCode;
detail.HandledToWarehouseCode = toLocationDto.WarehouseCode; detail.HandledToWarehouseCode = toLocationDto.WarehouseCode;
@ -199,23 +226,85 @@ public class TransferLibJobAppService
var ret = await base.CompleteAsync(id, dto).ConfigureAwait(false); var ret = await base.CompleteAsync(id, dto).ConfigureAwait(false);
if (ret != null) if (ret != null)
{ {
Type ty = Type.GetType(dto.CallServerName); var ty = Type.GetType(dto.CallServerName);
if (ty == null) if (ty == null)
{ {
throw new UserFriendlyException($"{methodPrefix}没有找到类型为{dto.CallServerName}的对象"); throw new UserFriendlyException($"{methodPrefix}没有找到类型为{dto.CallServerName}的对象");
} }
var instance = _serviceProvider.GetService(ty); var instance = _serviceProvider.GetService(ty);
if (instance == null) if (instance == null)
{ {
throw new UserFriendlyException($"{methodPrefix}类型为{dto.CallServerName}的对象创建失败"); throw new UserFriendlyException($"{methodPrefix}类型为{dto.CallServerName}的对象创建失败");
} }
ITransferLibCallback transferLibCallback = (ITransferLibCallback)instance;
var transferLibCallback = (ITransferLibCallback)instance;
if (transferLibCallback == null) if (transferLibCallback == null)
{ {
throw new UserFriendlyException($"{methodPrefix}类型为{dto.CallServerName}的对象没有实现ITransferLibCallback接口"); throw new UserFriendlyException($"{methodPrefix}类型为{dto.CallServerName}的对象没有实现ITransferLibCallback接口");
} }
await transferLibCallback.DoTransferLibCallbackAsync(dto).ConfigureAwait(false); await transferLibCallback.DoTransferLibCallbackAsync(dto).ConfigureAwait(false);
} }
await TransferLibRequestAppService.CompleteByJobAsync(dto.RequestNumber).ConfigureAwait(false);
return ret; return ret;
} }
[HttpPost("get-by-request/{requestNumber}")]
[UnitOfWork]
public async Task<List<TransferLibJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var list = await _repository.GetListAsync(p => p.RequestNumber == requestNumber).ConfigureAwait(false);
return ObjectMapper.Map<List<TransferLibJob>, List<TransferLibJobDTO>>(list);
}
public override async Task CancelAcceptAsync(Guid id)
{
var job = await _repository.FindAsync(p => p.Id == id).ConfigureAwait(false);
if (job.JobStatus == EnumJobStatus.Open || job.JobStatus == EnumJobStatus.Partial ||
job.JobStatus == EnumJobStatus.Doing || job.JobStatus == EnumJobStatus.Wait)
{
await _repository.UpdateAsync(job).ConfigureAwait(false);
}
await _expectOutAppService.RemoveByNumberAsync(job.Number).ConfigureAwait(false);
}
[HttpPost("complete-by-request/{requestNumber}")]
[UnitOfWork]
public async Task CompleteByRequestAsync(string requestNumber)
{
var list = await _repository.GetListAsync(p => p.RequestNumber == requestNumber).ConfigureAwait(false);
foreach (var job in list)
{
if (job.JobStatus == EnumJobStatus.Open || job.JobStatus == EnumJobStatus.Partial ||
job.JobStatus == EnumJobStatus.Doing || job.JobStatus == EnumJobStatus.Wait)
{
await _repository.UpdateAsync(job).ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(job.Number).ConfigureAwait(false);
}
}
}
/// <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}】箱码");
}
}
} }

21
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteAppService.cs

@ -18,20 +18,20 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}assemble-note")] [Route($"{StoreConsts.RootPath}assemble-issue-note")]
public class AssembleIssueNoteAppService : public class AssembleIssueNoteAppService :
SfsStoreWithDetailsAppServiceBase<AssembleIssueNote, AssembleIssueNoteDTO, SfsStoreRequestInputBase, AssembleIssueNoteEditInput, AssembleIssueNoteDetail, SfsStoreWithDetailsAppServiceBase<AssembleIssueNote, AssembleIssueNoteDTO, SfsStoreRequestInputBase, AssembleIssueNoteEditInput, AssembleIssueNoteDetail,
AssembleIssueNoteDetailDTO, SfsStoreRequestInputBase, AssembleIssueNoteImportInput>, AssembleIssueNoteDetailDTO, SfsStoreRequestInputBase, AssembleIssueNoteImportInput>,
IAssembleIssueNoteAppService IAssembleIssueNoteAppService
{ {
private readonly IAssembleIssueNoteManager _assembleNoteManager; private readonly IAssembleIssueNoteManager _assembleIssueNoteManager;
public AssembleIssueNoteAppService( public AssembleIssueNoteAppService(
IAssembleIssueNoteRepository repository, IAssembleIssueNoteRepository repository,
IAssembleIssueNoteManager assembleNoteManager IAssembleIssueNoteManager assembleIssueNoteManager
) : base(repository) ) : base(repository)
{ {
_assembleNoteManager = assembleNoteManager; _assembleIssueNoteManager = assembleIssueNoteManager;
} }
[HttpPost("")] [HttpPost("")]
@ -39,7 +39,7 @@ public class AssembleIssueNoteAppService :
public override async Task<AssembleIssueNoteDTO> CreateAsync(AssembleIssueNoteEditInput input) public override async Task<AssembleIssueNoteDTO> CreateAsync(AssembleIssueNoteEditInput input)
{ {
var entity = ObjectMapper.Map<AssembleIssueNoteEditInput, AssembleIssueNote>(input); var entity = ObjectMapper.Map<AssembleIssueNoteEditInput, AssembleIssueNote>(input);
await _assembleNoteManager.CreateAsync(entity).ConfigureAwait(false); await _assembleIssueNoteManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<AssembleIssueNote, AssembleIssueNoteDTO>(entity); var dto = ObjectMapper.Map<AssembleIssueNote, AssembleIssueNoteDTO>(entity);
return dto; return dto;
} }
@ -52,10 +52,11 @@ public class AssembleIssueNoteAppService :
[HttpPost("confirm/{id}")] [HttpPost("confirm/{id}")]
public virtual async Task<AssembleIssueNoteDTO> ConfirmAsync(Guid id) public virtual async Task<AssembleIssueNoteDTO> ConfirmAsync(Guid id)
{ {
var assembleNote= await _repository.GetAsync(id).ConfigureAwait(false); var assembleIssueNote = await _repository.GetAsync(id).ConfigureAwait(false);
assembleNote.Confirmed = true; assembleIssueNote.Confirmed = true;
assembleNote=await _repository.UpdateAsync(assembleNote).ConfigureAwait(false); assembleIssueNote = await _repository.UpdateAsync(assembleIssueNote).ConfigureAwait(false);
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<AssembleIssueNote>(assembleNote), false).ConfigureAwait(false); await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<AssembleIssueNote>(assembleIssueNote), false).ConfigureAwait(false);
return ObjectMapper.Map<AssembleIssueNote, AssembleIssueNoteDTO>(assembleNote); return ObjectMapper.Map<AssembleIssueNote, AssembleIssueNoteDTO>(assembleIssueNote);
} }
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs

@ -14,12 +14,11 @@ using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}coating-note")] [Route($"{StoreConsts.RootPath}coating-issue-note")]
public class CoatingIssueNoteAppService : public class CoatingIssueNoteAppService :
SfsStoreWithDetailsAppServiceBase<CoatingIssueNote, CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteEditInput, CoatingIssueNoteDetail, SfsStoreWithDetailsAppServiceBase<CoatingIssueNote, CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteEditInput, CoatingIssueNoteDetail,
CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase, CoatingIssueNoteImportInput>, CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase, CoatingIssueNoteImportInput>,
@ -60,6 +59,4 @@ public class CoatingIssueNoteAppService :
return ObjectMapper.Map<CoatingIssueNote, CoatingIssueNoteDTO>(coatingIssueNote); return ObjectMapper.Map<CoatingIssueNote, CoatingIssueNoteDTO>(coatingIssueNote);
} }
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAutoMapperProfile.cs

@ -2,8 +2,6 @@ using AutoMapper;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;

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

@ -1,7 +1,11 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using NUglify.Helpers;
using Volo.Abp; using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
@ -12,39 +16,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
/// <summary> /// <summary>
/// 装配叫料 /// 装配叫料申请
/// </summary> /// </summary>
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}assemble-request")] [Route($"{StoreConsts.RootPath}assemble-issue-request")]
public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<AssembleIssueRequest, public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<AssembleIssueRequest, AssembleIssueRequestDTO,
AssembleIssueRequestDTO, SfsStoreRequestInputBase, AssembleIssueRequestEditInput, AssembleIssueRequestDetail, AssembleIssueRequestDetailDTO,
SfsStoreRequestInputBase, AssembleIssueRequestEditInput, AssembleIssueRequestDetail,
AssembleIssueRequestDetailDTO,
SfsStoreRequestInputBase, AssembleIssueRequestImportInput>, SfsStoreRequestInputBase, AssembleIssueRequestImportInput>,
IAssembleIssueRequestAppService IAssembleIssueRequestAppService
{ {
private readonly IAssembleIssueRequestManager _assembleRequestManager; private readonly IAssembleIssueRequestManager _assembleIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp; private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp; private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService; private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly IAssembleIssueJobAppService _assembleIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService; private readonly ITransactionTypeAppService _transactionTypeAppService;
public AssembleIssueRequestAppService( public AssembleIssueRequestAppService(
IAssembleIssueRequestRepository repository, IAssembleIssueRequestRepository repository,
IAssembleIssueRequestManager assembleRequestManager, IAssembleIssueRequestManager assembleIssueRequestManager,
IPreparationPlanManager preparationPlanManager, IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp, IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp, IAreaAppService areaApp,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService, IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService, IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService ITransactionTypeAppService transactionTypeAppService, IAssembleIssueJobAppService assembleIssueJobAppService)
) : base(repository, assembleIssueRequestManager)
: base(repository, assembleRequestManager)
{ {
_assembleRequestManager = assembleRequestManager; _assembleIssueRequestManager = assembleIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp; _itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp; _areaApp = areaApp;
_locationAppService = locationAppService; _locationAppService = locationAppService;
@ -52,13 +55,12 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService; _transactionTypeAppService = transactionTypeAppService;
_assembleIssueJobAppService = assembleIssueJobAppService;
} }
public override async Task<AssembleIssueRequestDTO> HandleAsync(Guid id) public override async Task<AssembleIssueRequestDTO> HandleAsync(Guid id)
{ {
await Task.CompletedTask.ConfigureAwait(false); return await base.HandleAsync(id).ConfigureAwait(false);
return null;
} }
[HttpPost("")] [HttpPost("")]
@ -72,18 +74,21 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
} }
} }
foreach (var detailInput in input.Details) //赋值生产线 foreach (var detailInput in input.Details)
{ {
var toLocationDto = var toLocationDto =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false); await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode); CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false); var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode); CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
detailInput.ToLocationArea = toLocationDto.AreaCode; detailInput.ToLocationArea = toLocationDto.AreaCode;
detailInput.ToLocationGroup = toLocationDto.LocationGroupCode; detailInput.ToLocationGroup = toLocationDto.LocationGroupCode;
detailInput.ToWarehouseCode = toLocationDto.WarehouseCode; detailInput.ToWarehouseCode = toLocationDto.WarehouseCode;
detailInput.ProdLine = detailInput.ToLocationCode;
detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode; detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode;
detailInput.ItemDesc1 = itemBasicDto.Desc1; detailInput.ItemDesc1 = itemBasicDto.Desc1;
@ -95,12 +100,13 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
//因为是刚创建的 所以发料数一定是0 //因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0; detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.SEMI;
} }
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false); await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
var entity = ObjectMapper.Map<AssembleIssueRequestEditInput, AssembleIssueRequest>(input); var entity = ObjectMapper.Map<AssembleIssueRequestEditInput, AssembleIssueRequest>(input);
var result = await _assembleRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false); var result = await _assembleIssueRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<AssembleIssueRequest, AssembleIssueRequestDTO>(result); var dto = ObjectMapper.Map<AssembleIssueRequest, AssembleIssueRequestDTO>(result);
@ -127,16 +133,210 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
[HttpPost("create-and-handle")] [HttpPost("create-and-handle")]
public async Task<AssembleIssueRequestDTO> CreateAndHandleAsync(AssembleIssueRequestEditInput input) public async Task<AssembleIssueRequestDTO> CreateAndHandleAsync(AssembleIssueRequestEditInput input)
{ {
var assembleRequestDto = await CreateAsync(input).ConfigureAwait(false); var assembleIssueRequestDto = await CreateAsync(input).ConfigureAwait(false);
await HandleAsync(assembleRequestDto.Id).ConfigureAwait(false); //await HandleAsync(assembleIssueRequestDto.Id).ConfigureAwait(false);
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 assembleRequestDto; 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);
var assembleIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(assembleIssueRequest.Number).ConfigureAwait(false);
if (assembleIssueJobDtos.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
p.JobStatus == EnumJobStatus.Partial))
{
return;
}
else
{
bool flag = true;
foreach (var detail in assembleIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag)
{
CheckStatus(EnumRequestStatus.Completed, assembleIssueRequest.RequestStatus);
assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(assembleIssueRequest).ConfigureAwait(false);
}
}
}
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="assembleIssueRequest"></param>
/// <param name="addAssembleIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateAssembleIssueRequestDetailQtyAsync(AssembleIssueRequest assembleIssueRequest,
List<AssembleIssueJobDTO> addAssembleIssueJobDtos)
{
//原有任务
var existAssembleIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(assembleIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
var allAssembleIssueJobDtos = new List<AssembleIssueJobDTO>();
allAssembleIssueJobDtos.AddRange(addAssembleIssueJobDtos);
allAssembleIssueJobDtos.AddRange(existAssembleIssueJobDtos);
var groupByItemCodeLocationCode = assembleIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
foreach (var requestDetail in group)
{
//所有已发数量
decimal allIssuedQty = 0;
//所有已发数量
decimal allReceivedQty = 0;
foreach (var allAssembleIssueJobDto in allAssembleIssueJobDtos)
{
var jobDetailDtos = allAssembleIssueJobDto.Details.Where(p =>
p.ItemCode == group.Key.ItemCode && p.RequestLocationCode == group.Key.ToLocationCode);
//所有已发数量
allIssuedQty += jobDetailDtos.Sum(p => p.RequestQty);
//所有已发数量
allReceivedQty += jobDetailDtos.Sum(p => p.HandledToQty);
}
requestDetail.IssuedQty += allIssuedQty;
requestDetail.ReceivedQty += allReceivedQty;
}
}
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 "无任务生成,请检查库存";
}
}
#region 校验 #region 校验
private void CheckStatus(EnumRequestStatus targetStatus, EnumRequestStatus nowStatus)
{
var validSourceStatuses = new List<EnumRequestStatus>();
switch (targetStatus)
{
case EnumRequestStatus.None:
break;
case EnumRequestStatus.New:
break;
case EnumRequestStatus.Reviewing:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.New };
break;
case EnumRequestStatus.Refused:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Agreed:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Agreed, EnumRequestStatus.Partial,
};
break;
case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
};
break;
case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed,
};
break;
case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
};
break;
}
default:
throw new ArgumentOutOfRangeException(nameof(targetStatus), targetStatus, null);
}
if (!validSourceStatuses.Contains(nowStatus))
{
throw new UserFriendlyException(
$"当前状态为 {nowStatus.GetDisplayName()} ,无法变更为 {targetStatus.GetDisplayName()}");
}
}
private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode) private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode)
{ {
if (itemBasicDto == null) if (itemBasicDto == null)
@ -158,5 +358,13 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
} }
} }
private void CheckProductionLine(ProductionLineDTO productionLineDto, string productionCode)
{
if (productionLineDto == null)
{
throw new UserFriendlyException($"未找到生产线【{productionCode}】");
}
}
#endregion #endregion
} }

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

@ -1,80 +1,68 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office.PowerPoint.Y2021.M06.Main; using Castle.Components.DictionaryAdapter;
using IdentityModel;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using NUglify.Helpers;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
/// <summary> /// <summary>
/// 喷涂叫料 /// 喷涂叫料申请
/// </summary> /// </summary>
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}coating-request")] [Route($"{StoreConsts.RootPath}coating-issue-request")]
public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest, CoatingIssueRequestDTO, public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest, CoatingIssueRequestDTO,
SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail, CoatingIssueRequestDetailDTO, SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail, CoatingIssueRequestDetailDTO,
SfsStoreRequestInputBase, CoatingIssueRequestImportInput>, SfsStoreRequestInputBase, CoatingIssueRequestImportInput>,
ICoatingIssueRequestAppService ICoatingIssueRequestAppService
{ {
private readonly ICoatingIssueRequestManager _coatingMaterialRequestManager; private readonly ICoatingIssueRequestManager _coatingIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp; private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp; private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService; private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService; private readonly ITransactionTypeAppService _transactionTypeAppService;
public CoatingIssueRequestAppService( public CoatingIssueRequestAppService(
ICoatingIssueRequestRepository repository, ICoatingIssueRequestRepository repository,
ICoatingIssueRequestManager coatingMaterialRequestManager, ICoatingIssueRequestManager coatingIssueRequestManager,
IPreparationPlanManager preparationPlanManager, IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp, IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp, IAreaAppService areaApp,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService, IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService, IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService ITransactionTypeAppService transactionTypeAppService, ICoatingIssueJobAppService coatingIssueJobAppService)
) : base(repository, coatingIssueRequestManager)
: base(repository, coatingMaterialRequestManager)
{ {
_coatingMaterialRequestManager = coatingMaterialRequestManager; _coatingIssueRequestManager = coatingIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp; _itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp; _areaApp = areaApp;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService; _itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService; _transactionTypeAppService = transactionTypeAppService;
_coatingIssueJobAppService = coatingIssueJobAppService;
} }
public override async Task<CoatingIssueRequestDTO> HandleAsync(Guid id) public override async Task<CoatingIssueRequestDTO> HandleAsync(Guid id)
{ {
await Task.CompletedTask.ConfigureAwait(false); return await base.HandleAsync(id).ConfigureAwait(false);
return null;
} }
[HttpPost("")] [HttpPost("")]
public override async Task<CoatingIssueRequestDTO> CreateAsync(CoatingIssueRequestEditInput input) public override async Task<CoatingIssueRequestDTO> CreateAsync(CoatingIssueRequestEditInput input)
{ {
@ -86,18 +74,22 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
} }
} }
foreach (var detailInput in input.Details) //赋值生产线 foreach (var detailInput in input.Details)
{ {
var toLocationDto = var toLocationDto =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false); await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode); CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false); var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode); CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode)
.ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
detailInput.ToLocationArea = toLocationDto.AreaCode; detailInput.ToLocationArea = toLocationDto.AreaCode;
detailInput.ToLocationGroup = toLocationDto.LocationGroupCode; detailInput.ToLocationGroup = toLocationDto.LocationGroupCode;
detailInput.ToWarehouseCode = toLocationDto.WarehouseCode; detailInput.ToWarehouseCode = toLocationDto.WarehouseCode;
detailInput.ProdLine = detailInput.ToLocationCode;
detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode; detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode;
detailInput.ItemDesc1 = itemBasicDto.Desc1; detailInput.ItemDesc1 = itemBasicDto.Desc1;
@ -109,12 +101,13 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
//因为是刚创建的 所以发料数一定是0 //因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0; detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.SEMI;
} }
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false); await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
var entity = ObjectMapper.Map<CoatingIssueRequestEditInput, CoatingIssueRequest>(input); var entity = ObjectMapper.Map<CoatingIssueRequestEditInput, CoatingIssueRequest>(input);
var result = await _coatingMaterialRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false); var result = await _coatingIssueRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(result); var dto = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(result);
@ -122,13 +115,14 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
} }
/// <summary> /// <summary>
/// 赋值Request业务属性 /// 赋值Request业务属性
/// </summary> /// </summary>
/// <param name="entity"></param> /// <param name="entity"></param>
/// <returns></returns> /// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity) private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity)
{ {
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false); var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在"); Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest; entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest; entity.AutoAgree = tranType.AutoAgreeRequest;
@ -140,15 +134,239 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
[HttpPost("create-and-handle")] [HttpPost("create-and-handle")]
public async Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input) public async Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input)
{ {
var coatingMaterialRequestDto = await CreateAsync(input).ConfigureAwait(false); var coatingIssueRequestDto = await CreateAsync(input).ConfigureAwait(false);
//await HandleAsync(coatingIssueRequestDto.Id).ConfigureAwait(false);
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)
{
var coatingIssueRequest = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false);
await UpdateCoatingIssueRequestDetailQtyAsync(coatingIssueRequest, new EditableList<CoatingIssueJobDTO>())
.ConfigureAwait(false);
var coatingIssueJobDtos = await _coatingIssueJobAppService.GetByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
if (coatingIssueJobDtos.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
p.JobStatus == EnumJobStatus.Partial))
{
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);
}
}
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="addCoatingIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest coatingIssueRequest,
List<CoatingIssueJobDTO> addCoatingIssueJobDtos)
{
//原有任务
var existCoatingIssueJobDtos = await _coatingIssueJobAppService
.GetByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
var allCoatingIssueJobDtos = new List<CoatingIssueJobDTO>();
allCoatingIssueJobDtos.AddRange(addCoatingIssueJobDtos);
allCoatingIssueJobDtos.AddRange(existCoatingIssueJobDtos);
var groupByItemCodeLocationCode = coatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
foreach (var requestDetail in group)
{
//所有已发数量
decimal allIssuedQty = 0;
//所有已发数量
decimal allReceivedQty = 0;
foreach (var allCoatingIssueJobDto in allCoatingIssueJobDtos)
{
var jobDetailDtos = allCoatingIssueJobDto.Details.Where(p =>
p.ItemCode == group.Key.ItemCode && p.RequestLocationCode == group.Key.ToLocationCode);
//所有已发数量
allIssuedQty += jobDetailDtos.Sum(p => p.RequestQty);
//所有已发数量
allReceivedQty += jobDetailDtos.Sum(p => p.HandledToQty);
}
requestDetail.IssuedQty += allIssuedQty;
requestDetail.ReceivedQty += allReceivedQty;
}
}
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 HandleAsync(coatingMaterialRequestDto.Id).ConfigureAwait(false); await _coatingIssueJobAppService.CompleteByRequestNumberAsync(coatingIssueRequest.Number).ConfigureAwait(false);
return coatingMaterialRequestDto; return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(await _repository.UpdateAsync(coatingIssueRequest)
.ConfigureAwait(false));
} }
#region 校验 #region 校验
private void CheckStatus(EnumRequestStatus targetStatus, EnumRequestStatus nowStatus)
{
var validSourceStatuses = new List<EnumRequestStatus>();
switch (targetStatus)
{
case EnumRequestStatus.None:
break;
case EnumRequestStatus.New:
break;
case EnumRequestStatus.Reviewing:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.New };
break;
case EnumRequestStatus.Refused:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Agreed:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Agreed, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed
};
break;
case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
}
default:
throw new ArgumentOutOfRangeException(nameof(targetStatus), targetStatus, null);
}
if (!validSourceStatuses.Contains(nowStatus))
{
throw new UserFriendlyException(
$"当前状态为 {nowStatus.GetDisplayName()} ,无法变更为 {targetStatus.GetDisplayName()}");
}
}
private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode) private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode)
{ {
if (itemBasicDto == null) if (itemBasicDto == null)
@ -164,9 +382,18 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
throw new UserFriendlyException($"库位代码为【{locationCode}】不存在"); throw new UserFriendlyException($"库位代码为【{locationCode}】不存在");
} }
if (locationDto.Type != EnumLocationType.WIP) if (locationDto.Type != EnumLocationType.KittingWip)
{
throw new UserFriendlyException(
$"库位代码【{locationCode}】不是【{EnumLocationType.KittingWip.GetDisplayName()}】类型");
}
}
private void CheckProductionLine(ProductionLineDTO productionLineDto, string productionCode)
{
if (productionLineDto == null)
{ {
throw new UserFriendlyException($"库位代码【{locationCode}】不是【{EnumLocationType.WIP.GetDisplayName()}】类型"); throw new UserFriendlyException($"未找到生产线【{productionCode}】");
} }
} }

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAutoMapperProfile.cs

@ -3,7 +3,6 @@ using Volo.Abp.AutoMapper;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;

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

@ -74,15 +74,16 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
} }
} }
foreach (var detailInput in input.Details) foreach (var detailInput in input.Details)
{ {
var toLocationDto = var toLocationDto =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false); await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode); CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false); var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode); CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto= await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false); var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode)
CheckProductionLine(productionLineDto,detailInput.ProdLine); .ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code; detailInput.ProdLine = productionLineDto.Code;
@ -142,9 +143,9 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
public override async Task<KittingIssueRequestDTO> CancelAsync(Guid id) public override async Task<KittingIssueRequestDTO> CancelAsync(Guid id)
{ {
var request=await _repository.GetAsync(id).ConfigureAwait(false); var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list=await _kittingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); var list = await _kittingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any()) if (list.Any())
{ {
foreach (var kittingIssueJobDto in list) foreach (var kittingIssueJobDto in list)
@ -159,44 +160,55 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
} }
} }
return await base.CancelAsync(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")] [HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number) public async Task UpdateStatusCompletedAsync(string number)
{ {
var kittingIssueRequest=await _repository.FindAsync(p=>p.Number== number).ConfigureAwait(false); var kittingIssueRequest = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false);
await UpdateKittingIssueRequestDetailQtyAsync(kittingIssueRequest,new EditableList<KittingIssueJobDTO>()).ConfigureAwait(false); await UpdateKittingIssueRequestDetailQtyAsync(kittingIssueRequest, new EditableList<KittingIssueJobDTO>())
.ConfigureAwait(false);
var kittingIssueJobDtos=await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false); var kittingIssueJobDtos = await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number)
.ConfigureAwait(false);
if (kittingIssueJobDtos.Any(p => if (kittingIssueJobDtos.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing || p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
p.JobStatus == EnumJobStatus.Partial) ) p.JobStatus == EnumJobStatus.Partial))
{ {
return; return;
} }
else
{
bool flag = true;
foreach (var detail in kittingIssueRequest.Details) var flag = true;
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag) foreach (var detail in kittingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{ {
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus); flag = false;
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed; return;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
} }
} }
if (flag)
{
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus);
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
}
} }
/// <summary> /// <summary>
@ -209,7 +221,8 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
List<KittingIssueJobDTO> addKittingIssueJobDtos) List<KittingIssueJobDTO> addKittingIssueJobDtos)
{ {
//原有任务 //原有任务
var existKittingIssueJobDtos = await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number) var existKittingIssueJobDtos = await _kittingIssueJobAppService
.GetByRequestNumberAsync(kittingIssueRequest.Number)
.ConfigureAwait(false); .ConfigureAwait(false);
//新增的任务和已有的任务总和 //新增的任务和已有的任务总和
@ -248,9 +261,10 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
} }
[HttpPost("IsHasNewJob")] [HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber,List<string> jobNumber) public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{ {
var joblIssueJobDtos=await _kittingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); var joblIssueJobDtos =
await _kittingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{ {
var jobNumberList = joblIssueJobDtos.Select(p => p.Number); var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
@ -259,19 +273,35 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
if (difference.Any()) if (difference.Any())
{ {
var result = "已生成任务号"; var result = "已生成任务号";
difference.ForEach(p=> result+="【"+p+"】"); difference.ForEach(p => result += "【" + p + "】");
result += "的任务"; result += "的任务";
return result; return result;
} }
else
{ return "无任务生成,请检查库存";
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 else
{ {
return "无任务生成,请检查库存"; throw new UserFriendlyException($"【{kittingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
} }
await _kittingIssueJobAppService.CompleteByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false);
return ObjectMapper.Map<KittingIssueRequest, KittingIssueRequestDTO>(await _repository.UpdateAsync(kittingIssueRequest)
.ConfigureAwait(false));
} }
#region 校验 #region 校验
@ -297,32 +327,32 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
case EnumRequestStatus.Handling: case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus> validSourceStatuses = new List<EnumRequestStatus>
{ {
EnumRequestStatus.Agreed, EnumRequestStatus.Partial, EnumRequestStatus.Agreed, EnumRequestStatus.Partial
}; };
break; break;
case EnumRequestStatus.Completed: case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus> validSourceStatuses = new List<EnumRequestStatus>
{ {
EnumRequestStatus.Handling, EnumRequestStatus.Partial, EnumRequestStatus.Handling, EnumRequestStatus.Partial
}; };
break; break;
case EnumRequestStatus.Cancelled: case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus> validSourceStatuses = new List<EnumRequestStatus>
{ {
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed, EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed
}; };
break; break;
case EnumRequestStatus.Abort: case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus> validSourceStatuses = new List<EnumRequestStatus>
{ {
EnumRequestStatus.Handling, EnumRequestStatus.Partial, EnumRequestStatus.Handling, EnumRequestStatus.Partial
}; };
break; break;
case EnumRequestStatus.Partial: case EnumRequestStatus.Partial:
{ {
validSourceStatuses = new List<EnumRequestStatus> validSourceStatuses = new List<EnumRequestStatus>
{ {
EnumRequestStatus.Handling, EnumRequestStatus.Partial, EnumRequestStatus.Handling, EnumRequestStatus.Partial
}; };
break; break;
} }
@ -354,7 +384,8 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
if (locationDto.Type != EnumLocationType.KittingWip) if (locationDto.Type != EnumLocationType.KittingWip)
{ {
throw new UserFriendlyException($"库位代码【{locationCode}】不是【{EnumLocationType.KittingWip.GetDisplayName()}】类型"); throw new UserFriendlyException(
$"库位代码【{locationCode}】不是【{EnumLocationType.KittingWip.GetDisplayName()}】类型");
} }
} }

100
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/TransferLibRequests/TransferLibRequestAppService.cs

@ -4,11 +4,13 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office2010.Excel;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
@ -17,6 +19,8 @@ using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
using static ClosedXML.Excel.XLPredefinedFormat;
using Filter = Win_in.Sfs.Shared.Domain.Filter;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
@ -39,16 +43,18 @@ public class TransferLibRequestAppService : SfsStoreRequestAppServiceBase
private readonly ITransferLibRequestManager _transferLibRequestManager; private readonly ITransferLibRequestManager _transferLibRequestManager;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
public TransferLibRequestAppService( public TransferLibRequestAppService(
ITransferLibRequestRepository repository, ITransferLibRequestRepository repository,
ITransferLibRequestManager transferLibRequestManager, ITransferLibRequestManager transferLibRequestManager,
IBalanceAppService balanceAppService, IBalanceAppService balanceAppService,
ILocationAppService locationAppService) : base(repository, transferLibRequestManager) ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService) : base(repository, transferLibRequestManager)
{ {
_transferLibRequestManager = transferLibRequestManager; _transferLibRequestManager = transferLibRequestManager;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
} }
#region 东阳使用 #region 东阳使用
@ -307,6 +313,98 @@ public class TransferLibRequestAppService : SfsStoreRequestAppServiceBase
#endregion #endregion
[HttpPost("Cancel-By-CallRequestNumber")]
public async Task CancelByCallRequestNumberAsync(string callRequestNumber)
{
var list=await _repository.GetListAsync(p=>p.CallRequestNumber==callRequestNumber).ConfigureAwait(false);
foreach (var request in list)
{
await CancelAsync(request.Id).ConfigureAwait(false);
}
}
[HttpPost("Complete-By-CallRequestNumber")]
public async Task CompleteByCallRequestNumberAsync(string callRequestNumber)
{
var list = await _repository.GetListAsync(p => p.CallRequestNumber == callRequestNumber).ConfigureAwait(false);
foreach (var request in list)
{
await CompleteAsync(request.Id).ConfigureAwait(false);
}
}
public override async Task<TransferLibRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _transferLibJobAppService.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 _transferLibJobAppService.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<TransferLibRequest, TransferLibRequestDTO>(request);
}
public override async Task<TransferLibRequestDTO> CompleteAsync(Guid id)
{
var request = await _repository.FindAsync(p => p.Id == id).ConfigureAwait(false);
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
await _transferLibJobAppService.CompleteByRequestAsync(request.Number).ConfigureAwait(false);
return ObjectMapper.Map<TransferLibRequest, TransferLibRequestDTO>(request);
}
[HttpPost("Complete-By-Job")]
public async Task CompleteByJobAsync(string requestNumber)
{
var request = await _repository.FindAsync(p => p.Number == requestNumber).ConfigureAwait(false);
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
if (request.RequestStatus != EnumRequestStatus.Completed)
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
}
}
/// <summary> /// <summary>
/// 【创建】库移请求 /// 【创建】库移请求

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJob.cs

@ -13,7 +13,6 @@ namespace Win_in.Sfs.Wms.Store.Domain;
[Display(Name = "装配发料任务")] [Display(Name = "装配发料任务")]
public class AssembleIssueJob : SfsJobAggregateRootBase<AssembleIssueJobDetail> public class AssembleIssueJob : SfsJobAggregateRootBase<AssembleIssueJobDetail>
{ {
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
@ -44,6 +43,6 @@ public class AssembleIssueJob : SfsJobAggregateRootBase<AssembleIssueJobDetail>
/// </summary> /// </summary>
[IgnoreUpdate] [IgnoreUpdate]
public override List<AssembleIssueJobDetail> Details { get; set; } = new List<AssembleIssueJobDetail>(); public override List<AssembleIssueJobDetail> Details { get; set; } = new List<AssembleIssueJobDetail>();
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobDetail.cs

@ -8,7 +8,6 @@ namespace Win_in.Sfs.Wms.Store.Domain;
public class AssembleIssueJobDetail : SfsDetailEntityBase public class AssembleIssueJobDetail : SfsDetailEntityBase
{ {
#region 库存基础信息 #region 库存基础信息
/// <summary> /// <summary>
@ -522,4 +521,5 @@ public class AssembleIssueJobDetail : SfsDetailEntityBase
{ {
this.Id = id; this.Id = id;
} }
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobManager.cs

@ -18,7 +18,9 @@ public class AssembleIssueJobManager : SfsJobManagerBase<AssembleIssueJob, Assem
private readonly IExpectOutAppService _expectOutAppService; private readonly IExpectOutAppService _expectOutAppService;
public AssembleIssueJobManager( public AssembleIssueJobManager(
IAssembleIssueJobRepository repository, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService) : base(repository) IAssembleIssueJobRepository repository,
IBalanceAppService balanceAppService,
IExpectOutAppService expectOutAppService) : base(repository)
{ {
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService; _expectOutAppService = expectOutAppService;
@ -49,7 +51,6 @@ public class AssembleIssueJobManager : SfsJobManagerBase<AssembleIssueJob, Assem
$" 的库存被占用【预计出】"); $" 的库存被占用【预计出】");
} }
//var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(detail.HandledFromPackingCode, detail.ItemCode, detail.HandledFromLocationCode, detail.Status, detail.HandledFromLot).ConfigureAwait(false);
var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false); var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false);
if (balanceDto.Qty <= 0) if (balanceDto.Qty <= 0)
{ {

14
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs

@ -4,9 +4,8 @@ using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary> /// <summary>
/// 涂装发料任务 /// 涂装发料任务
@ -23,26 +22,23 @@ public class CoatingIssueJob : SfsJobAggregateRootBase<CoatingIssueJobDetail>
/// <summary> /// <summary>
/// 生产线 /// 生产线
/// </summary> /// </summary>
[IgnoreUpdate]
public string ProdLine { get; set; } public string ProdLine { get; set; }
/// <summary> /// <summary>
/// 要单号 /// 要单号
/// </summary> /// </summary>
[IgnoreUpdate] public string CoatingRequestNumber { get; set; }
public string MaterialRequestNumber { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary> /// <summary>
/// 任务明细 /// 任务明细
/// </summary> /// </summary>
[IgnoreUpdate] public override List<CoatingIssueJobDetail> Details { get; set; } = new List<CoatingIssueJobDetail>();
public override List<CoatingIssueJobDetail> Details { get; set; } = new List<CoatingIssueJobDetail>();
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobDetail.cs

@ -8,7 +8,6 @@ namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueJobDetail : SfsDetailEntityBase public class CoatingIssueJobDetail : SfsDetailEntityBase
{ {
#region 库存基础信息 #region 库存基础信息
/// <summary> /// <summary>

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobManager.cs

@ -10,7 +10,6 @@ using Volo.Abp.Users;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
@ -18,14 +17,14 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
{ {
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService; private readonly IExpectOutAppService _expectOutAppService;
private readonly ICoatingIssueJobRepository _repository;
public CoatingIssueJobManager( public CoatingIssueJobManager(
ICoatingIssueJobRepository repository, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService) : base(repository) ICoatingIssueJobRepository repository,
IBalanceAppService balanceAppService,
IExpectOutAppService expectOutAppService) : base(repository)
{ {
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService; _expectOutAppService = expectOutAppService;
_repository= repository;
} }
/// <summary> /// <summary>
@ -38,7 +37,6 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
public override async Task<CoatingIssueJob> CompleteAsync(CoatingIssueJob input, ICurrentUser user) public override async Task<CoatingIssueJob> CompleteAsync(CoatingIssueJob input, ICurrentUser user)
{ {
var entity = await Repository.FindAsync(input.Id).ConfigureAwait(false); var entity = await Repository.FindAsync(input.Id).ConfigureAwait(false);
var inputDetail = input.Details.First(); var inputDetail = input.Details.First();
var detail = entity.Details.First(); var detail = entity.Details.First();
@ -54,7 +52,6 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
$" 的库存被占用【预计出】"); $" 的库存被占用【预计出】");
} }
//var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(detail.HandledFromPackingCode, detail.ItemCode, detail.HandledFromLocationCode, detail.Status, detail.HandledFromLot).ConfigureAwait(false);
var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false); var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false);
if (balanceDto.Qty <= 0) if (balanceDto.Qty <= 0)
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobManager.cs

@ -1,9 +1,8 @@
using System; using System;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueJobManager : IJobManager<CoatingIssueJob> public interface ICoatingIssueJobManager : IJobManager<CoatingIssueJob>
{ {

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobRepository.cs

@ -1,6 +1,4 @@
using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
public interface ICoatingIssueJobRepository : ISfsJobRepositoryBase<CoatingIssueJob> public interface ICoatingIssueJobRepository : ISfsJobRepositoryBase<CoatingIssueJob>
{ {

55
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingssueExtension.cs

@ -1,55 +0,0 @@
using Volo.Abp.Timing;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
public static class CoatingIssueExtension
{
// public static IssueJob SetDetails(this IssueJob job,IGuidGenerator guidGenerator, LocationDTO location)
// {
// foreach (var detail in job.Details)
// {
// detail.SetIdAndNumber(guidGenerator,job.Id,job.Number);
// detail.RecommendLocationCode = location.Code;
// detail.SetBatch(detail.RecommendBatch);
// }
// return job;
// }
public static IssueJob Init(this IssueJob job)
{
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
return job;
}
public static IssueJob SetWorkGroup(this IssueJob job, string warehouseCode, string workGroupCode, string groupCode)
{
job.WorkGroupCode = workGroupCode;
job.WarehouseCode = warehouseCode;
job.ProdLine = groupCode;
return job;
}
public static IssueJob SetWorker(this IssueJob job, string worker)
{
job.Worker = worker;
return job;
}
public static IssueJob SetPriority(this IssueJob job, IClock clock)
{
job.Priority = PriorityHelper.GetPriority(clock);
job.PriorityIncrement = 1;
return job;
}
// public static IssueJob SetIdAndNumber(this IssueJob job,IGuidGenerator guidGenerator, ISnowflakeIdGenerator numberGenerator)
// {
// var number = (numberGenerator.CreateAsync().GetAwaiter().GetResult()).ToString();
// job.SetIdAndNumber(guidGenerator, number);
// return job;
// }
}

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNote.cs

@ -21,12 +21,9 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase<AssembleIssueNoteDeta
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
/// </summary> /// </summary>
[IgnoreUpdate]
public override List<AssembleIssueNoteDetail> Details { get; set; } = new List<AssembleIssueNoteDetail>(); public override List<AssembleIssueNoteDetail> Details { get; set; } = new List<AssembleIssueNoteDetail>();
[IgnoreUpdate]
public string RequestNumber { get; set; } public string RequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
@ -36,14 +33,12 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase<AssembleIssueNoteDeta
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary> /// <summary>
/// 确认时间 /// 确认时间
/// </summary> /// </summary>
[Display(Name = "确认时间")] [Display(Name = "确认时间")]
[IgnoreUpdate]
public DateTime? ConfirmTime { get; set; } public DateTime? ConfirmTime { get; set; }
/// <summary> /// <summary>
@ -52,6 +47,8 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase<AssembleIssueNoteDeta
[Display(Name = "已确认")] [Display(Name = "已确认")]
public bool Confirmed { get; set; } public bool Confirmed { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
public void Confirm(DateTime confirmTime) public void Confirm(DateTime confirmTime)
{ {
@ -68,4 +65,5 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase<AssembleIssueNoteDeta
} }
} }
} }

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs

@ -4,12 +4,11 @@ using System.ComponentModel.DataAnnotations;
using Volo.Abp; using Volo.Abp;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary> /// <summary>
/// 喷涂叫料申请 /// 涂装叫料记录
/// </summary> /// </summary>
public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail>, IHasJobNumber, IHasRequestNumber public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail>, IHasJobNumber, IHasRequestNumber
{ {
@ -22,12 +21,9 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
/// </summary> /// </summary>
[IgnoreUpdate]
public override List<CoatingIssueNoteDetail> Details { get; set; } = new List<CoatingIssueNoteDetail>(); public override List<CoatingIssueNoteDetail> Details { get; set; } = new List<CoatingIssueNoteDetail>();
[IgnoreUpdate]
public string RequestNumber { get; set; } public string RequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
@ -37,14 +33,12 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary> /// <summary>
/// 确认时间 /// 确认时间
/// </summary> /// </summary>
[Display(Name = "确认时间")] [Display(Name = "确认时间")]
[IgnoreUpdate]
public DateTime? ConfirmTime { get; set; } public DateTime? ConfirmTime { get; set; }
/// <summary> /// <summary>
@ -53,6 +47,8 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
[Display(Name = "已确认")] [Display(Name = "已确认")]
public bool Confirmed { get; set; } public bool Confirmed { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
public void Confirm(DateTime confirmTime) public void Confirm(DateTime confirmTime)
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteManager.cs

@ -4,9 +4,8 @@ using Microsoft.Extensions.Logging;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueNoteManager : SfsStoreManagerBase<CoatingIssueNote, CoatingIssueNoteDetail>, ICoatingIssueNoteManager public class CoatingIssueNoteManager : SfsStoreManagerBase<CoatingIssueNote, CoatingIssueNoteDetail>, ICoatingIssueNoteManager
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteManager.cs

@ -1,8 +1,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueNoteManager : ISfsStoreManager<CoatingIssueNote, CoatingIssueNoteDetail> public interface ICoatingIssueNoteManager : ISfsStoreManager<CoatingIssueNote, CoatingIssueNoteDetail>
{ {

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteRepository.cs

@ -1,6 +1,4 @@
using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes;
public interface ICoatingIssueNoteRepository : ISfsStoreRepositoryBase<CoatingIssueNote> public interface ICoatingIssueNoteRepository : ISfsStoreRepositoryBase<CoatingIssueNote>
{ {

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequest.cs

@ -11,7 +11,7 @@ namespace Win_in.Sfs.Wms.Store.Domain;
public class AssembleIssueRequest : SfsStoreRequestAggregateRootBase<AssembleIssueRequestDetail> public class AssembleIssueRequest : SfsStoreRequestAggregateRootBase<AssembleIssueRequestDetail>
{ {
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public EnumIssueRequestType IssueRequestType { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
@ -20,10 +20,5 @@ public class AssembleIssueRequest : SfsStoreRequestAggregateRootBase<AssembleIss
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary>
/// 明细列表
/// </summary>
[IgnoreUpdate]
public override List<AssembleIssueRequestDetail> Details { get; set; } = new List<AssembleIssueRequestDetail>();
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequestDetail.cs

@ -11,7 +11,6 @@ namespace Win_in.Sfs.Wms.Store.Domain;
/// </summary> /// </summary>
public class AssembleIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation public class AssembleIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation
{ {
#region 目标库位信息 #region 目标库位信息
/// <summary> /// <summary>
@ -47,6 +46,7 @@ public class AssembleIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasT
#endregion #endregion
/// <summary> /// <summary>
/// 生产线 /// 生产线
/// </summary> /// </summary>

34
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequestManager.cs

@ -14,29 +14,24 @@ public class AssembleIssueRequestManager
, IAssembleIssueRequestManager , IAssembleIssueRequestManager
{ {
private readonly IAssembleIssueRequestRepository _repository; private readonly IAssembleIssueRequestRepository _repository;
public AssembleIssueRequestManager( public AssembleIssueRequestManager(
IAssembleIssueRequestRepository repository IAssembleIssueRequestRepository repository
) : base(repository)
) : base(repository)
{ {
_repository = repository; _repository = repository;
} }
#region 东阳V2
#endregion
/// <summary> /// <summary>
/// 创建 /// 创建 同时 直接赋值Number 为了返回Number
/// </summary> /// </summary>
/// <param name="entity"></param> /// <param name="entity"></param>
/// <returns></returns> /// <returns></returns>
public virtual async Task<AssembleIssueRequest> CreateByNumberAsync(AssembleIssueRequest entity) public virtual async Task<AssembleIssueRequest> CreateByNumberAsync(AssembleIssueRequest entity)
{ {
var number = string.IsNullOrEmpty(entity.Number) ? await GenerateNumberAsync(nameof(AssembleIssueRequest), entity.ActiveDate).ConfigureAwait(false) : entity.Number; var number = string.IsNullOrEmpty(entity.Number)
? await GenerateNumberAsync(nameof(AssembleIssueRequest), entity.ActiveDate).ConfigureAwait(false)
: entity.Number;
entity.SetIdAndNumberWithDetails(GuidGenerator, number); entity.SetIdAndNumberWithDetails(GuidGenerator, number);
entity.Submit(); entity.Submit();
entity.Agree(); entity.Agree();
@ -47,7 +42,6 @@ public class AssembleIssueRequestManager
return entity; return entity;
} }
public virtual async Task CompleteAsync(string number) public virtual async Task CompleteAsync(string number)
{ {
var entity = await GetByNumberAsync(number).ConfigureAwait(false); var entity = await GetByNumberAsync(number).ConfigureAwait(false);
@ -56,23 +50,9 @@ public class AssembleIssueRequestManager
await CompleteAsync(entity).ConfigureAwait(false); await CompleteAsync(entity).ConfigureAwait(false);
} }
} }
#region 导入
/// <summary> public Task ImportDataAsync(List<AssembleIssueRequest> entities, List<AssembleIssueRequest> deleteEntities = null)
/// 执行导入
/// </summary>
public virtual async Task ImportDataAsync(List<AssembleIssueRequest> mergeEntities, List<AssembleIssueRequest> deleteEntities = null)
{ {
if (deleteEntities != null && deleteEntities.Count > 0) throw new System.NotImplementedException();
{
await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false);
}
await CreateManyAsync(mergeEntities).ConfigureAwait(false);
} }
#endregion
} }

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequest.cs

@ -2,9 +2,8 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary> /// <summary>
/// 喷涂叫料申请 /// 喷涂叫料申请
@ -21,11 +20,4 @@ public class CoatingIssueRequest : SfsStoreRequestAggregateRootBase<CoatingIssue
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary>
/// 明细列表
/// </summary>
[IgnoreUpdate]
public override List<CoatingIssueRequestDetail> Details { get; set; } = new List<CoatingIssueRequestDetail>();
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestDetail.cs

@ -3,13 +3,11 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation public class CoatingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation
{ {
#region 目标库位信息 #region 目标库位信息
/// <summary> /// <summary>
@ -45,6 +43,7 @@ public class CoatingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasTo
#endregion #endregion
/// <summary> /// <summary>
/// 生产线 /// 生产线
/// </summary> /// </summary>

38
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestManager.cs

@ -1,40 +1,34 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using DocumentFormat.OpenXml.Math;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using static Win_in.Sfs.Wms.Store.Domain.Shared.StoreSettings;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueRequestManager public class CoatingIssueRequestManager
: SfsStoreRequestManagerBase<CoatingIssueRequest, CoatingIssueRequestDetail> : SfsStoreRequestManagerBase<CoatingIssueRequest, CoatingIssueRequestDetail>
, ICoatingIssueRequestManager , ICoatingIssueRequestManager
{ {
private readonly ICoatingIssueRequestRepository _repository; private readonly ICoatingIssueRequestRepository _repository;
public CoatingIssueRequestManager( public CoatingIssueRequestManager(
ICoatingIssueRequestRepository repository ICoatingIssueRequestRepository repository
, ICoatingIssueJobRepository issueJobRepository ) : base(repository)
) : base(repository)
{ {
_repository = repository; _repository = repository;
} }
/// <summary> /// <summary>
/// 创建 /// 创建 同时 直接赋值Number 为了返回Number
/// </summary> /// </summary>
/// <param name="entity"></param> /// <param name="entity"></param>
/// <returns></returns> /// <returns></returns>
public virtual async Task<CoatingIssueRequest> CreateByNumberAsync(CoatingIssueRequest entity) public virtual async Task<CoatingIssueRequest> CreateByNumberAsync(CoatingIssueRequest entity)
{ {
var number = string.IsNullOrEmpty(entity.Number) ? await GenerateNumberAsync(nameof(CoatingIssueRequest), entity.ActiveDate).ConfigureAwait(false) : entity.Number; var number = string.IsNullOrEmpty(entity.Number)
? await GenerateNumberAsync(nameof(CoatingIssueRequest), entity.ActiveDate).ConfigureAwait(false)
: entity.Number;
entity.SetIdAndNumberWithDetails(GuidGenerator, number); entity.SetIdAndNumberWithDetails(GuidGenerator, number);
entity.Submit(); entity.Submit();
entity.Agree(); entity.Agree();
@ -44,7 +38,7 @@ public class CoatingIssueRequestManager
await _repository.InsertAsync(entity).ConfigureAwait(false); await _repository.InsertAsync(entity).ConfigureAwait(false);
return entity; return entity;
} }
public virtual async Task CompleteAsync(string number) public virtual async Task CompleteAsync(string number)
{ {
var entity = await GetByNumberAsync(number).ConfigureAwait(false); var entity = await GetByNumberAsync(number).ConfigureAwait(false);
@ -53,23 +47,9 @@ public class CoatingIssueRequestManager
await CompleteAsync(entity).ConfigureAwait(false); await CompleteAsync(entity).ConfigureAwait(false);
} }
} }
#region Import
/// <summary> public Task ImportDataAsync(List<CoatingIssueRequest> entities, List<CoatingIssueRequest> deleteEntities = null)
/// 执行导入
/// </summary>
public virtual async Task ImportDataAsync(List<CoatingIssueRequest> mergeEntities, List<CoatingIssueRequest> deleteEntities = null)
{ {
if (deleteEntities != null && deleteEntities.Count > 0) throw new System.NotImplementedException();
{
await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false);
}
await CreateManyAsync(mergeEntities).ConfigureAwait(false);
} }
#endregion
} }

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestManager.cs

@ -1,10 +1,8 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueRequestManager : ISfsStoreRequestManager<CoatingIssueRequest, CoatingIssueRequestDetail>, public interface ICoatingIssueRequestManager : ISfsStoreRequestManager<CoatingIssueRequest, CoatingIssueRequestDetail>,
IBulkImportService<CoatingIssueRequest> IBulkImportService<CoatingIssueRequest>
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestRepository.cs

@ -1,7 +1,6 @@
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueRequestRepository : ISfsStoreRepositoryBase<CoatingIssueRequest>, public interface ICoatingIssueRequestRepository : ISfsStoreRepositoryBase<CoatingIssueRequest>,
ISfsBulkRepositoryBase<CoatingIssueRequest> ISfsBulkRepositoryBase<CoatingIssueRequest>

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs

@ -2,10 +2,6 @@ using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
[ConnectionStringName(StoreDbProperties.ConnectionStringName)] [ConnectionStringName(StoreDbProperties.ConnectionStringName)]

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs

@ -3,7 +3,6 @@ using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.EntityFrameworkCore; using Win_in.Sfs.Shared.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
@ -22,7 +21,7 @@ public static class CoatingIssueJobDbContextModelCreatingExtensions
//Configure Job base properties //Configure Job base properties
b.ConfigureJob<CoatingIssueJob, CoatingIssueJobDetail>(); b.ConfigureJob<CoatingIssueJob, CoatingIssueJobDetail>();
//Properties //Properties
b.Property(q => q.MaterialRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.CoatingRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.JobType).HasConversion<string>(); b.Property(q => q.JobType).HasConversion<string>();
b.Property(q => q.JobStatus).HasConversion<string>(); b.Property(q => q.JobStatus).HasConversion<string>();

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobEfCoreRepository.cs

@ -1,5 +1,5 @@
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

32164
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Migrations/20240514023713_20240514.Designer.cs

File diff suppressed because it is too large

319
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Migrations/20240514023713_20240514.cs

@ -0,0 +1,319 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Win_in.Sfs.Wms.Store.Migrations
{
public partial class _20240514 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "RequestType",
table: "Store_KittingIssueNote");
migrationBuilder.DropColumn(
name: "RequestType",
table: "Store_CoatingIssueNote");
migrationBuilder.DropColumn(
name: "RequestType",
table: "Store_AssembleIssueNote");
migrationBuilder.DropColumn(
name: "RequestType",
table: "Job_KittingIssueJob");
migrationBuilder.DropColumn(
name: "RequestType",
table: "Job_CoatingIssueJob");
migrationBuilder.DropColumn(
name: "RequestType",
table: "Job_AssembleIssueJob");
migrationBuilder.AddColumn<string>(
name: "MesBarCode",
table: "Store_ProductReceiptNoteDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "MesQuality",
table: "Store_ProductReceiptNoteDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<int>(
name: "EnumIssueSendType",
table: "Store_KittingIssueNote",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "IssueRequestType",
table: "Store_KittingIssueNote",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<string>(
name: "IdentityNo",
table: "Store_DeliverRequestDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "MesDeliveryNo",
table: "Store_DeliverRequestDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "MesDeliveryPlan",
table: "Store_DeliverRequestDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "IdentityNo",
table: "Store_DeliverNoteDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "MesDeliveryNo",
table: "Store_DeliverNoteDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "MesDeliveryPlan",
table: "Store_DeliverNoteDetail",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<int>(
name: "IssueRequestType",
table: "Store_CoatingIssueNote",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<string>(
name: "ItemCode",
table: "Store_Chassis",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ItemDesc1",
table: "Store_Chassis",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ItemDesc2",
table: "Store_Chassis",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ItemName",
table: "Store_Chassis",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<int>(
name: "EnumIssueSendType",
table: "Store_AssembleIssueNote",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "IssueRequestType",
table: "Store_AssembleIssueNote",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "EnumIssueSendType",
table: "Job_KittingIssueJob",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "IssueRequestType",
table: "Job_KittingIssueJob",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "IssueRequestType",
table: "Job_CoatingIssueJob",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "EnumIssueSendType",
table: "Job_AssembleIssueJob",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<int>(
name: "IssueRequestType",
table: "Job_AssembleIssueJob",
type: "int",
nullable: false,
defaultValue: 0);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "MesBarCode",
table: "Store_ProductReceiptNoteDetail");
migrationBuilder.DropColumn(
name: "MesQuality",
table: "Store_ProductReceiptNoteDetail");
migrationBuilder.DropColumn(
name: "EnumIssueSendType",
table: "Store_KittingIssueNote");
migrationBuilder.DropColumn(
name: "IssueRequestType",
table: "Store_KittingIssueNote");
migrationBuilder.DropColumn(
name: "IdentityNo",
table: "Store_DeliverRequestDetail");
migrationBuilder.DropColumn(
name: "MesDeliveryNo",
table: "Store_DeliverRequestDetail");
migrationBuilder.DropColumn(
name: "MesDeliveryPlan",
table: "Store_DeliverRequestDetail");
migrationBuilder.DropColumn(
name: "IdentityNo",
table: "Store_DeliverNoteDetail");
migrationBuilder.DropColumn(
name: "MesDeliveryNo",
table: "Store_DeliverNoteDetail");
migrationBuilder.DropColumn(
name: "MesDeliveryPlan",
table: "Store_DeliverNoteDetail");
migrationBuilder.DropColumn(
name: "IssueRequestType",
table: "Store_CoatingIssueNote");
migrationBuilder.DropColumn(
name: "ItemCode",
table: "Store_Chassis");
migrationBuilder.DropColumn(
name: "ItemDesc1",
table: "Store_Chassis");
migrationBuilder.DropColumn(
name: "ItemDesc2",
table: "Store_Chassis");
migrationBuilder.DropColumn(
name: "ItemName",
table: "Store_Chassis");
migrationBuilder.DropColumn(
name: "EnumIssueSendType",
table: "Store_AssembleIssueNote");
migrationBuilder.DropColumn(
name: "IssueRequestType",
table: "Store_AssembleIssueNote");
migrationBuilder.DropColumn(
name: "EnumIssueSendType",
table: "Job_KittingIssueJob");
migrationBuilder.DropColumn(
name: "IssueRequestType",
table: "Job_KittingIssueJob");
migrationBuilder.DropColumn(
name: "IssueRequestType",
table: "Job_CoatingIssueJob");
migrationBuilder.DropColumn(
name: "EnumIssueSendType",
table: "Job_AssembleIssueJob");
migrationBuilder.DropColumn(
name: "IssueRequestType",
table: "Job_AssembleIssueJob");
migrationBuilder.AddColumn<string>(
name: "RequestType",
table: "Store_KittingIssueNote",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "RequestType",
table: "Store_CoatingIssueNote",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "RequestType",
table: "Store_AssembleIssueNote",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "RequestType",
table: "Job_KittingIssueJob",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "RequestType",
table: "Job_CoatingIssueJob",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
migrationBuilder.AddColumn<string>(
name: "RequestType",
table: "Job_AssembleIssueJob",
type: "nvarchar(64)",
maxLength: 64,
nullable: true);
}
}
}

98
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Migrations/StoreDbContextModelSnapshot.cs

@ -67,6 +67,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId"); .HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties") b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
@ -76,6 +79,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("bit") .HasColumnType("bit")
.HasDefaultValue(false); .HasDefaultValue(false);
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobDescription") b.Property<string>("JobDescription")
.HasMaxLength(1024) .HasMaxLength(1024)
.HasColumnType("nvarchar(1024)"); .HasColumnType("nvarchar(1024)");
@ -122,10 +128,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(3072)") .HasColumnType("nvarchar(3072)")
.HasColumnName("Remark"); .HasColumnName("Remark");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("TenantId"); .HasColumnName("TenantId");
@ -519,10 +521,16 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId"); .HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties") b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobNumber") b.Property<string>("JobNumber")
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)") .HasColumnType("nvarchar(64)")
@ -551,10 +559,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("TenantId"); .HasColumnName("TenantId");
@ -1515,6 +1519,18 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
b.Property<string>("ItemCode")
.HasColumnType("nvarchar(max)");
b.Property<string>("ItemDesc1")
.HasColumnType("nvarchar(max)");
b.Property<string>("ItemDesc2")
.HasColumnType("nvarchar(max)");
b.Property<string>("ItemName")
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("LastModificationTime") b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2") .HasColumnType("datetime2")
.HasColumnName("LastModificationTime"); .HasColumnName("LastModificationTime");
@ -6771,6 +6787,10 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(64)") .HasColumnType("nvarchar(64)")
.HasColumnName("HandledSupplierBatch"); .HasColumnName("HandledSupplierBatch");
b.Property<string>("IdentityNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ItemCode") b.Property<string>("ItemCode")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -6803,6 +6823,14 @@ namespace Win_in.Sfs.Wms.Store.Migrations
b.Property<Guid>("MasterID") b.Property<Guid>("MasterID")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("MesDeliveryNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("MesDeliveryPlan")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Number") b.Property<string>("Number")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -7273,6 +7301,10 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
b.Property<string>("IdentityNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ItemCode") b.Property<string>("ItemCode")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -7305,6 +7337,14 @@ namespace Win_in.Sfs.Wms.Store.Migrations
b.Property<Guid>("MasterID") b.Property<Guid>("MasterID")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("MesDeliveryNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("MesDeliveryPlan")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Number") b.Property<string>("Number")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -13347,6 +13387,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId"); .HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties") b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
@ -13356,6 +13399,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("bit") .HasColumnType("bit")
.HasDefaultValue(false); .HasDefaultValue(false);
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobDescription") b.Property<string>("JobDescription")
.HasMaxLength(1024) .HasMaxLength(1024)
.HasColumnType("nvarchar(1024)"); .HasColumnType("nvarchar(1024)");
@ -13406,10 +13452,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(3072)") .HasColumnType("nvarchar(3072)")
.HasColumnName("Remark"); .HasColumnName("Remark");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("TenantId"); .HasColumnName("TenantId");
@ -13803,10 +13845,16 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId"); .HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties") b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobNumber") b.Property<string>("JobNumber")
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)") .HasColumnType("nvarchar(64)")
@ -13835,10 +13883,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("TenantId"); .HasColumnName("TenantId");
@ -17709,6 +17753,14 @@ namespace Win_in.Sfs.Wms.Store.Migrations
b.Property<Guid>("MasterID") b.Property<Guid>("MasterID")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("MesBarCode")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("MesQuality")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Number") b.Property<string>("Number")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -30282,6 +30334,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("bit") .HasColumnType("bit")
.HasDefaultValue(false); .HasDefaultValue(false);
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobDescription") b.Property<string>("JobDescription")
.HasMaxLength(1024) .HasMaxLength(1024)
.HasColumnType("nvarchar(1024)"); .HasColumnType("nvarchar(1024)");
@ -30332,10 +30387,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(3072)") .HasColumnType("nvarchar(3072)")
.HasColumnName("Remark"); .HasColumnName("Remark");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("TenantId"); .HasColumnName("TenantId");
@ -30397,6 +30448,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobNumber") b.Property<string>("JobNumber")
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)") .HasColumnType("nvarchar(64)")
@ -30425,10 +30479,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier") .HasColumnType("uniqueidentifier")
.HasColumnName("TenantId"); .HasColumnName("TenantId");

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs

@ -2,7 +2,6 @@ using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling; using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteEfCoreRepository.cs

@ -1,5 +1,5 @@
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save