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>
/// <param name="itemCode"></param>
/// <param name="productLine"></param>
/// <param name="isPackingCode"></param>
/// <returns></returns>
[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 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
{
ItemCode = itemCode,
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson),
IsPackingCode = true
Locations = locationList,
IsPackingCode = isPackingCode
};
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")]
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>

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;
/// <summary>
/// kitting叫料PDA任务
/// </summary>
[ApiController]
[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,string locCode);
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.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Caching;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Validation;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain;
@ -220,6 +222,14 @@ public class LocationAppService
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)
{
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);
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.Mvc;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Basedata.SplitPackings.Commons;
using Win_in.Sfs.Shared.Application.Contracts;
@ -27,14 +29,15 @@ public class ExpectOutAppService
, IExpectOutAppService
{
private readonly IExpectOutManager _expectOutManager;
private readonly ILocationAppService _locationAppService;
public ExpectOutAppService(
IExpectOutRepository repository,
IExpectOutManager expectOutManager
) : base(repository)
IExpectOutManager expectOutManager, ILocationAppService locationAppService) : base(repository)
{
_expectOutManager = expectOutManager;
_locationAppService = locationAppService;
}
[HttpPost("remove")]
@ -64,7 +67,7 @@ public class ExpectOutAppService
if (expectOut != null)
{
expectOut.Qty -= qty;
if (expectOut.Qty == 0)
if (expectOut.Qty <= 0)
{
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);
}
[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>
[Display(Name = "导入盘点计划")]
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>
/// <returns>库位信息列表</returns>
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)
{
var AssembleIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueJob)));
AssembleIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
AssembleIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
AssembleIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
var assembleIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueJob)));
assembleIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
assembleIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
assembleIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
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 = "使用在途库")]
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.Threading;
using System.Threading.Tasks;
@ -8,8 +9,15 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IAssembleIssueJobAppService
: ISfsJobAppServiceBase<AssembleIssueJobDTO, SfsJobRequestInputBase, AssembleIssueJobCheckInput, AssembleIssueJobEditInput>
{
Task CancelByMaterialRequestAsync(string assembleNumber);
Task CancelByMaterialRequestAsync(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 = "任务明细")]
[Required(ErrorMessage = "{0}是必填项")]
public List<AssembleIssueJobDetailInput> Details { get; set; } = new();
/// <summary>
/// 使用在途库
/// </summary>
[Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#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 Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -15,9 +13,10 @@ public static class CoatingIssueJobPermissions
public static void AddCoatingIssueJobPermission(this PermissionGroupDefinition permissionGroup)
{
var IssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(IssueJob)));
IssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
IssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
IssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
var coatingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueJob)));
coatingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
coatingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
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 Microsoft.EntityFrameworkCore;
using Win_in.Sfs.Shared.Domain;
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>
[Display(Name = "料任务")]
[Display(Name = "涂装叫料任务")]
public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO>
{
/// <summary>
@ -17,37 +16,25 @@ public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO>
/// </summary>
[Display(Name = "叫料类型")]
public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary>
/// 生产线
/// 生产线
/// </summary>
[Display(Name = "生产线")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ProdLine { get; set; }
/// <summary>
/// 要货单号
/// 要货单号
/// </summary>
[Display(Name = "要货单号")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string MaterialRequestNumber { get; set; }
public string CoatingRequestNumber { get; set; }
/// <summary>
/// 使用在途库
/// 使用在途库
/// </summary>
[Display(Name = "使用在途库")]
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.Threading;
using System.Threading.Tasks;
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
: ISfsJobAppServiceBase<CoatingIssueJobDTO, SfsJobRequestInputBase, CoatingIssueJobCheckInput, CoatingIssueJobEditInput>
{
Task CancelByMaterialRequestAsync(string coatingIssueNumber);
Task CancelByMaterialRequestAsync(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.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
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.Shared;
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>
{
@ -24,7 +23,7 @@ public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCrea
[Display(Name = "要货单号")]
[Required(ErrorMessage = "{0}是必填项")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string MaterialRequestNumber { get; set; }
public string KittingRequestNumber { get; set; }
/// <summary>
/// 叫料类型
@ -59,12 +58,13 @@ public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCrea
[Display(Name = "任务明细")]
[Required(ErrorMessage = "{0}是必填项")]
public List<CoatingIssueJobDetailInput> Details { get; set; } = new();
/// <summary>
/// 使用在途库
/// </summary>
[Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#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
: 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);

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.Threading;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IKittingIssueJobAppService
: ISfsJobAppServiceBase<KittingIssueJobDTO, SfsJobRequestInputBase, KittingIssueJobCheckInput, KittingIssueJobEditInput>
: ISfsJobAppServiceBase<KittingIssueJobDTO, SfsJobRequestInputBase, KittingIssueJobCheckInput,
KittingIssueJobEditInput>
{
Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>
/// 执行任务明细
/// 执行任务明细
/// </summary>
/// <returns></returns>
Task ExecuteDetailAsync(Guid masterId,Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto);
Task ExecuteDetailAsync(Guid masterId, Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto);
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)
{
var KittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob)));
KittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
KittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
KittingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
var kittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob)));
kittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
kittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
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;
public interface ITransferLibJobAppService
: 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 const string Default = StorePermissions.GroupName + "." + nameof(AssembleIssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr;
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)
{
var AssembleIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueNote)));
AssembleIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
AssembleIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
AssembleIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
var assembleIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueNote)));
assembleIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
assembleIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
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 = "确认时间")]
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);
}

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>
[Display(Name = "任务ID")]
[Required(ErrorMessage = "{0}是必填项")]
public string JobNumber { get; set; }
public string JobNumber { get; set; }
/// <summary>
/// 明细列表
@ -52,5 +52,7 @@ public class AssembleIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary>
[Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#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 = "使用在途库")]
[Required(ErrorMessage = "{0}是必填项")]
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 Win_in.Sfs.Wms.Store.Application.Contracts;
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 const string Default = StorePermissions.GroupName + "." + nameof(IssueNote);
public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr;
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)
{
var issueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(IssueNote)));
issueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
issueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
issueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoIssueNote, StorePermissionDefinitionProvider.L(nameof(AutoIssueNote)));
permissionGroup.AddPermission(DirectIssueNote, StorePermissionDefinitionProvider.L(nameof(DirectIssueNote)));
var coatingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueNote)));
coatingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
coatingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
coatingIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
}
}

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 Win_in.Sfs.Shared.Domain;
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
{
/// <summary>
/// 任务ID
/// </summary>
@ -19,6 +19,7 @@ public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, I
/// </summary>
[Display(Name = "请求代码")]
public string RequestNumber { get; set; }
/// <summary>
/// 叫料类型
/// </summary>
@ -42,4 +43,6 @@ public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, I
/// </summary>
[Display(Name = "确认时间")]
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.Tasks;
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>
{
Task<CoatingIssueNoteDTO> CreateAsync(CoatingIssueNoteEditInput input);
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 Win_in.Sfs.Shared.Domain;
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
{
@ -28,7 +27,7 @@ public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary>
[Display(Name = "任务ID")]
[Required(ErrorMessage = "{0}是必填项")]
public string JobNumber { get; set; }
public string JobNumber { get; set; }
/// <summary>
/// 明细列表
@ -53,5 +52,7 @@ public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary>
[Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#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 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
{
@ -32,4 +31,6 @@ public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumbe
[Display(Name = "使用在途库")]
[Required(ErrorMessage = "{0}是必填项")]
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> 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 const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr;
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)
{
var injectionNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote)));
injectionNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
injectionNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
injectionNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
var kittingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote)));
kittingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
kittingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
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.AddInjectionIssueRequestPermission();
storeGroup.AddKittingIssueRequestPermission();
storeGroup.AddCoatingIssueRequestPermission();
storeGroup.AddAssembleIssueRequestPermission();
storeGroup.AddThirdLocationRequestPermission();
storeGroup.AddContainerRequestPermission();
storeGroup.AddIssueNotePermission();
storeGroup.AddInjectionIssueNotePermission();
storeGroup.AddAssembleIssueNotePermission();
storeGroup.AddKittingIssueNotePermission();
storeGroup.AddCoatingIssueNotePermission();
storeGroup.AddKittingIssueNotePermission();
storeGroup.AddThirdLocationNotePermission();
storeGroup.AddContainerNotePermission();
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 Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr;
public static void AddAssembleIssueRequestPermission(this PermissionGroupDefinition permissionGroup)
{
var AssembleIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueRequest)));
AssembleIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
AssembleIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
AssembleIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
var assembleIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(AssembleIssueRequest)));
assembleIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
assembleIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
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 Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -8,8 +9,7 @@ public class AssembleIssueRequestDTO : SfsStoreRequestDTOBase<AssembleIssueReque
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
public string Type { get; set; }
public EnumIssueRequestType IssueRequestType { get; set; }
/// <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
{
#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>
[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>
public string PositionCode { get; set; }
/// <summary>
/// 推荐类型
/// </summary>
public EnumRecommendType RecommendType { get; set; }
/// <summary>
/// 需求箱数量
/// </summary>
[Display(Name = "需求箱数量")]
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 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.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -9,10 +10,10 @@ public class AssembleIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputB
#region Base
/// <summary>
/// 叫料类型
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
public string Type { get; set; }
public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary>
/// 使用在途库
@ -24,7 +25,7 @@ public class AssembleIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputB
/// 明细列表
/// </summary>
[Display(Name = "明细列表")]
public List<AssembleIssueRequestDetailInput> Details { get; set; } = new List<AssembleIssueRequestDetailInput>();
public List<KittingIssueRequestDetailInput> Details { get; set; } = new List<KittingIssueRequestDetailInput>();
#endregion
#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 Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
[Display(Name = "叫料申请")]
[Display(Name = "叫料申请导入")]
public class AssembleIssueRequestImportInput : SfsStoreImportInputBase
{
/// <summary>
/// 叫料类型
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
[Required(ErrorMessage = "{0}是必填项")]
[ImporterHeader(Name = "叫料类型")]
[ExporterHeader(DisplayName = "叫料类型")]
[ValueMapping("人工拉动", EnumMaterialRequestType.Issue_Manual)]
public string Type { get; set; }
public EnumIssueRequestType IssueRequestType { get; set; }
/// <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 Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class CoatingIssueRequestPermissions
{
public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueRequest);
public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr;
//自动叫料申请
public const string AutoMaterialRequest = StorePermissions.GroupName + "." + nameof(AutoMaterialRequest);
public static void AddCoatingIssueRequestPermission(this PermissionGroupDefinition permissionGroup)
{
var MaterialRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueRequest)));
MaterialRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
MaterialRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
MaterialRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoMaterialRequest, StorePermissionDefinitionProvider.L(nameof(AutoMaterialRequest)));
var coatingIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueRequest)));
coatingIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
coatingIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
coatingIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
}
}

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 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
{
@ -9,8 +9,7 @@ public class CoatingIssueRequestDTO : SfsStoreRequestDTOBase<CoatingIssueRequest
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
public string Type { get; set; }
public EnumIssueRequestType IssueRequestType { get; set; }
/// <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.Threading;
using System.Threading.Tasks;
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
: 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 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;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
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.ComponentModel.DataAnnotations;
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
{
#region Base
/// <summary>
/// 叫料类型
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
public string Type { get; set; }
public EnumIssueRequestType IssueRequestType { get; set; }
/// <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 Win_in.Sfs.Shared.Application.Contracts;
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
{
/// <summary>
/// 叫料类型
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
[Required(ErrorMessage = "{0}是必填项")]
[ImporterHeader(Name = "叫料类型")]
[ExporterHeader(DisplayName = "叫料类型")]
[ValueMapping("人工拉动", EnumMaterialRequestType.Issue_Manual)]
public string Type { get; set; }
public EnumIssueRequestType IssueRequestType { get; set; }
/// <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,
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();
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.Linq;
using System.Linq.Expressions;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MyNamespace;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options;
namespace Win_in.Sfs.Wms.Store.Application;
@ -28,17 +36,36 @@ public class AssembleIssueJobAppService
AssembleIssueJobCheckInput, AssembleIssueJobEditInput>,
IAssembleIssueJobAppService, ITransferLibCallback
{
private readonly IAssembleIssueJobManager _assembleJobManager;
private readonly IAssembleIssueJobManager _assembleIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<RestoOptions> _options;
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestAppService>();
public AssembleIssueJobAppService(
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService) : base(repository, assembleJobManager)
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
IAssembleIssueNoteAppService assembleIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options
) : base(
repository, assembleIssueJobManager)
{
_assembleJobManager = assembleJobManager;
_assembleIssueJobManager = assembleIssueJobManager;
_locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
_assembleIssueNoteAppService = assembleIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory;
_options = options;
}
[HttpPost("add-many")]
@ -47,17 +74,183 @@ public class AssembleIssueJobAppService
foreach (var input in inputs)
{
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("")]
public override async Task<AssembleIssueJobDTO> CreateAsync(AssembleIssueJobEditInput input)
{
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>
@ -75,7 +268,9 @@ public class AssembleIssueJobAppService
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;
@ -93,101 +288,247 @@ public class AssembleIssueJobAppService
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate;
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode;
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.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
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}")]
public virtual async Task CancelByMaterialRequestAsync(string assembleNumber)
/// <summary>
/// 判断是不是在立体库
/// </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);
foreach (var entity in entities)
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
await _assembleJobManager.CancelAsync(entity).ConfigureAwait(false);
input.JobStatus = EnumJobStatus.Wait;
}
}
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="assembleIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(AssembleIssueJobDTO assembleIssueJobDto)
{
var assembleJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (assembleJob == null)
var jobDetailInputdetail = assembleIssueJobDto.Details.FirstOrDefault();
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}")]
public virtual async Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
/// <summary>
/// 修改当前任务状态 和 该任务的请求状态
/// </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);
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();
job.JobStatus = EnumJobStatus.Open;
/// <summary>
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
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;
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<AssembleIssueJobDTO> 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
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;
string json = System.Text.Json.JsonSerializer.Serialize(main);
_options.Value.Address = "http://localhost:59094/";//测试地址
_options.Value.Token = "";//测试token
_options.Value.UserName = "";//测试用户名
_options.Value.Password = "";//测试密码
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")]
public virtual async Task Test()
[HttpPost("receive-issue-job-stereo")]
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.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Net.Http;
using System.Threading;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MyNamespace;
using Omu.ValueInjecter;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
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.Notes;
using Win_in.Sfs.Wms.Store.Options;
using static IdentityModel.ClaimComparer;
using static Volo.Abp.Identity.Settings.IdentitySettingNames;
namespace Win_in.Sfs.Wms.Store.Application;
@ -41,94 +37,91 @@ public class CoatingIssueJobAppService
private readonly ICoatingIssueJobManager _coatingIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly ICoatingIssueNoteAppService _coatingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<RestoOptions> _options;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>();
public CoatingIssueJobAppService(
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options
) : base(repository, coatingIssueJobManager)
) : base(
repository, coatingIssueJobManager)
{
_coatingIssueJobManager = coatingIssueJobManager;
_locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
_coatingIssueNoteAppService = coatingIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory;
_options=options;
_options = options;
}
[HttpPost("add-many")]
public override async Task<List<CoatingIssueJobDTO>> CreateManyAsync(List<CoatingIssueJobEditInput> inputs)
{
foreach (var input in inputs)
{
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("")]
public override async Task<CoatingIssueJobDTO> CreateAsync(CoatingIssueJobEditInput input)
{
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>
/// 判断是不是在最底层 如果不是则把状态变更为等待 并把库移推荐的From和To赋值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckMinRowAndSetStatusAsync(CoatingIssueJobEditInput input)
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1)
var kittingJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (kittingJob == null)
{
input.JobStatus = EnumJobStatus.Wait;
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;
throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate;
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode;
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.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch;
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.RecommendToWarehouseCode;
if (kittingJob.JobStatus == EnumJobStatus.Open || kittingJob.JobStatus == EnumJobStatus.Partial ||
kittingJob.JobStatus == EnumJobStatus.Wait)
{
throw new UserFriendlyException($"任务状态不是{kittingJob.JobStatus == EnumJobStatus.Open}、" +
$"{kittingJob.JobStatus == EnumJobStatus.Partial}、" +
$"{kittingJob.JobStatus == EnumJobStatus.Wait}");
}
await _expectOutAppService.RemoveByNumberAsync(kittingJob.Number).ConfigureAwait(false);
kittingJob.JobStatus = EnumJobStatus.Cancelled;
await _repository.UpdateAsync(kittingJob).ConfigureAwait(false);
}
[HttpPost("cancel-by-request/{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);
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}")]
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);
return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(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.JobNumber).ConfigureAwait(false);
var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false);
//todo 等云峰写好换成真实的
var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync("AAA").ConfigureAwait(false);
var transferLibNote = new TransferLibNote();
if (job.JobStatus != EnumJobStatus.Wait)
{
throw new UserFriendlyException($"任务状态不是{EnumJobStatus.Wait.GetDisplayName()}");
}
var transferLibNoteDetail = transferLibNote.Details.First();
var transferLibNoteDetail = dto.Details.First();
var jobDetail = job.Details.First();
job.JobStatus = EnumJobStatus.Open;
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate;
@ -199,133 +187,391 @@ public class CoatingIssueJobAppService
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, 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")]
//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;
//}
#endregion
}

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 Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application;
@ -13,8 +12,6 @@ public partial class StoreApplicationAutoMapperProfile : Profile
CreateMap<CoatingIssueJob, CoatingIssueJobDTO>()
.ReverseMap();
//CreateMap<CoatingIssueJobDTO, CoatingIssueJob>();
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>
[Authorize]
[HttpGet("check-job-exist")]
public virtual async Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCode(string itemCode,
public virtual async Task<List<IssueJobDTO>> CheckJobExistByItemCodeAndLocationCodeAsync(string itemCode,
string locationCode)
{
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.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization;
@ -10,7 +12,6 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MyNamespace;
using Volo.Abp;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
@ -18,12 +19,9 @@ using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options;
using static IdentityModel.ClaimComparer;
using static Volo.Abp.Identity.Settings.IdentitySettingNames;
namespace Win_in.Sfs.Wms.Store.Application;
@ -36,10 +34,10 @@ public class KittingIssueJobAppService
{
private readonly IKittingIssueJobManager _kittingIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly IKittingIssueNoteAppService _kittingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
protected IKittingIssueRequestAppService KittingIssueRequestAppService =>
@ -47,23 +45,19 @@ public class KittingIssueJobAppService
public KittingIssueJobAppService(
IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
ILocationAppService locationAppService,
IKittingIssueNoteAppService kittingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options
) : base(
, IOptions<RestoOptions> options, ITransferLibRequestAppService transferLibRequestAppService) : base(
repository, kittingIssueJobManager)
{
_kittingIssueJobManager = kittingIssueJobManager;
_locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
_kittingIssueNoteAppService = kittingIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory;
_options = options;
_transferLibRequestAppService = transferLibRequestAppService;
}
[HttpPost("add-many")]
@ -75,12 +69,12 @@ public class KittingIssueJobAppService
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)
{
await CheckDimensionalStorehouseAsync(kittingIssueJobDto).ConfigureAwait(false);
}
return kittingIssueJobDtos;
}
@ -90,7 +84,7 @@ public class KittingIssueJobAppService
await CheckMinRowAndSetStatusAsync(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);
return kittingIssueJobDto;
@ -99,23 +93,31 @@ public class KittingIssueJobAppService
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
{
var injectionJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (injectionJob == null)
var kittingJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (kittingJob == null)
{
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}")]
public virtual async Task CancelByMaterialRequestAsync(string requestNumber)
{
var entities = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber)
.ConfigureAwait(false);
foreach (var entity in entities)
kittingJob.JobStatus = EnumJobStatus.Cancelled;
await _repository.UpdateAsync(kittingJob).ConfigureAwait(false);
}
else
{
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 transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false);
if (job.JobStatus != EnumJobStatus.Wait)
{
throw new UserFriendlyException($"任务状态不是{EnumJobStatus.Wait.GetDisplayName()}");
}
var transferLibNoteDetail = dto.Details.First();
var jobDetail = job.Details.First();
job.JobStatus = EnumJobStatus.Open;
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate;
@ -190,49 +196,237 @@ public class KittingIssueJobAppService
var kittingIssueNoteEditInput = await BuildKittingIssueNoteAsync(kittingIssueJobDto).ConfigureAwait(false);
await _kittingIssueNoteAppService.CreateAsync(kittingIssueNoteEditInput).ConfigureAwait(false);
var issueJobDetail=ObjectMapper.Map<KittingIssueJobDetailDTO, KittingIssueJobDetail>(issueJobDetailDto);
var entityDetail=kittingIssueJob.Details.Find(p => p.Id == detailId);
var issueJobDetail = ObjectMapper.Map<KittingIssueJobDetailDTO, KittingIssueJobDetail>(issueJobDetailDto);
var entityDetail = kittingIssueJob.Details.Find(p => p.Id == detailId);
issueJobDetail.HandledFromQty = entityDetail.HandledFromQty;
issueJobDetail.HandledToQty = entityDetail.HandledToQty;
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty;
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty;
kittingIssueJob.Details = new EditableList<KittingIssueJobDetail>() { issueJobDetail };
kittingIssueJob.Details = new EditableList<KittingIssueJobDetail> { issueJobDetail };
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
{
var detail = kittingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id);
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);
}
[HttpPost("CompleteAsync/{id}")]
/// <summary>
/// 完成任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("Complete/{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;
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 KittingIssueRequestAppService.UpdateStatusCompletedAsync(kittingIssueJob.KittingRequestNumber)
.ConfigureAwait(false);
await _transferLibRequestAppService.CancelByCallRequestNumberAsync(kittingIssueJob.KittingRequestNumber)
.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 私有
/// <summary>
@ -332,25 +526,25 @@ public class KittingIssueJobAppService
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
//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")
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
}
}
}
/// <summary>
/// 修改当前任务状态 和 该任务的请求状态
/// 修改当前任务状态 和 该任务的请求状态
/// </summary>
/// <param name="kittingIssueJob"></param>
/// <param name="kittingIssueJobDetailDto"></param>
/// <param name="handledToQty"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
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
or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中
@ -361,11 +555,7 @@ public class KittingIssueJobAppService
kittingIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAndInventoryAsync(kittingIssueJob.Number,
kittingIssueJobDetailDto.ItemCode,
kittingIssueJobDetailDto.HandledToLocationCode, kittingIssueJobDetailDto.HandledToPackingCode,
kittingIssueJobDetailDto.Status, kittingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
await RemoveExpectOutAsync(kittingIssueJob, kittingIssueJobDetailDto, handledToQty).ConfigureAwait(false);
//await _expectOutAppService.RemoveByNumberAsync(kittingIssueJob.Number).ConfigureAwait(false);
@ -375,157 +565,33 @@ public class KittingIssueJobAppService
await Task.CompletedTask.ConfigureAwait(false);
}
/// <summary>
/// 立体库同步
/// 判断实际TO的箱码是否被占用
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <param name="packingCode"></param>
/// <param name="jobNumber"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<KittingIssueJobDTO> input,string p_loc)
/// <exception cref="UserFriendlyException"></exception>
private async Task CheckPackingCodeIsUserAsync(string packingCode,string jobNumber)
{
ReusltObject ret = new ReusltObject();
ret.Code = "1";
ret.Message = "操作成功";
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
try
var list = await _expectOutAppService.GetListByPackingCodeAsync(packingCode).ConfigureAwait(false);
list=list.Where(p => p.JobNumber != jobNumber).ToList();
if (list.Any())
{
List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
IssueJobToRestoDTO main = new IssueJobToRestoDTO();
main.OperatorName = CurrentUser.UserName;
foreach (var job in input)
{
foreach (var jobitem in job.Details)
{
IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO()
{
Count = jobitem.HandledToQty,
ProductNo = jobitem.ItemCode,
NeedSite = p_loc,
WorkNo = job.Number,
TaskNo = job.Number
});
}
}
main.Details = IssueJobToRestoDetailDTOs;
var httpclient = _httpClientFactory.CreateClient();
#if DEBUG
string json= System.Text.Json.JsonSerializer.Serialize(main);
_options.Value.Address = "http://localhost:59094/";//测试地址
_options.Value.Token = "";//测试token
_options.Value.UserName = "";//测试用户名
_options.Value.Password = "";//测试密码
#endif
if (!string.IsNullOrEmpty(_options.Value.Token))
{
var token = _options.Value.Token;
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",token );
}
if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password))
{
var username = _options.Value.UserName;
var password = _options.Value.Password;
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{username}:{password}")));
}
IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch(Exception ex) {
ret = new ReusltObject();
ret.Code = "2";
ret.Message=ex.Message;
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
throw new UserFriendlyException($"任务号【{list.First().JobNumber}】已占用,【{packingCode}】箱码");
}
return ret;
}
[HttpPost("receive-issue-job-stereo")]
public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input)
private async Task RemoveExpectOutAsync(KittingIssueJob kittingIssueJob,
KittingIssueJobDetailDTO kittingIssueJobDetailDto,
decimal handledToQty)
{
#if DEBUG
var json= System.Text.Json.JsonSerializer.Serialize(input);
#endif
List<string> errors = new List<string>();
var ret = new ReusltObject()
{
Code = "1",
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
Message = "操作成功"
};
try
{
if (input.Jobs.Count > 0)
{
var jobs = input.Jobs;
var numbers = jobs.Select(p => p.JobNumber);
var query = _repository.WithDetails()
.Where(p => numbers.Contains(p.Number));
var entities = query.ToList();
var dtos = ObjectMapper.Map<List<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;
await _expectOutAppService.RemoveByNumberAndInventoryAsync(kittingIssueJob.Number,
kittingIssueJobDetailDto.ItemCode,
kittingIssueJobDetailDto.HandledToLocationCode, kittingIssueJobDetailDto.HandledToPackingCode,
kittingIssueJobDetailDto.Status, kittingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
#endregion
}

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

@ -1,12 +1,14 @@
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
using Volo.Abp.Uow;
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.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -16,23 +18,31 @@ namespace Win_in.Sfs.Wms.Store.Application;
[Authorize]
[Route($"{StoreConsts.RootPath}transfer-lib-job")]
public class TransferLibJobAppService
: SfsJobAppServiceBase<TransferLibJob, TransferLibJobDetail, TransferLibJobDTO, SfsJobRequestInputBase, TransferLibJobCheckInput, TransferLibJobEditInput>,
ITransferLibJobAppService
: SfsJobAppServiceBase<TransferLibJob, TransferLibJobDetail, TransferLibJobDTO, SfsJobRequestInputBase,
TransferLibJobCheckInput, TransferLibJobEditInput>,
ITransferLibJobAppService
{
private readonly IServiceProvider _serviceProvider;
private readonly ILocationAppService _locationAppService;
private readonly IExpectOutAppService _expectOutAppService;
protected ITransferLibRequestAppService TransferLibRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ITransferLibRequestAppService>();
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;
_locationAppService = locationAppService;
_expectOutAppService = expectOutAppService;
}
/// <summary>
/// 新移库完成任务
/// 新移库完成任务
/// </summary>
/// <param name="id"></param>
/// <param name="dto"></param>
@ -41,32 +51,41 @@ public class TransferLibJobAppService
[UnitOfWork]
public override async Task<TransferLibJobDTO> CompleteAsync(Guid id, TransferLibJobDTO dto)
{
string methodPrefix = "TransferLibJobAppService.CompleteAsync - ";
var methodPrefix = "TransferLibJobAppService.CompleteAsync - ";
if (dto.CallServerName.IsNullOrEmpty())
{
throw new UserFriendlyException($"{methodPrefix}CallServerName 不能为空");
}
if (dto.CallBusinessType.IsNullOrEmpty())
{
throw new UserFriendlyException($"{methodPrefix}CallBusinessType 不能为空");
}
if (dto.CallRequestNumber.IsNullOrEmpty())
{
throw new UserFriendlyException($"{methodPrefix}CallRequestNumber 不能为空");
}
if (dto.CallJobNumber.IsNullOrEmpty())
{
throw new UserFriendlyException($"{methodPrefix}CallJobNumber 不能为空");
}
#region 校验
foreach (var detailObj in dto.Details)
{
if (detailObj.RecommendToPackingCode != detailObj.HandledToPackingCode)
{
await CheckPackingCodeIsUserAsync(detailObj.HandledToPackingCode, dto.CallJobNumber).ConfigureAwait(false);
}
if (detailObj.IsPackingCodeFrom)
{
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)
{
throw new UserFriendlyException($"触发校验:推荐To箱码必须等于实际To箱码");
throw new UserFriendlyException("触发校验:推荐To箱码必须等于实际To箱码");
}
}
@ -82,7 +101,7 @@ public class TransferLibJobAppService
{
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)
{
throw new UserFriendlyException($"触发校验:推荐To批次必须等于实际To批次");
throw new UserFriendlyException("触发校验:推荐To批次必须等于实际To批次");
}
}
//if (detailObj.IsItemCodeFrom)
//if (detailObj.IsItemCodeTo)
//if (detailObj.IsStatusFrom)
@ -101,7 +121,7 @@ public class TransferLibJobAppService
{
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)
{
throw new UserFriendlyException($"触发校验:推荐To库位必须等于实际To库位");
throw new UserFriendlyException("触发校验:推荐To库位必须等于实际To库位");
}
}
@ -117,7 +137,7 @@ public class TransferLibJobAppService
{
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)
{
throw new UserFriendlyException($"触发校验:推荐To库位组必须等于实际To库位组");
throw new UserFriendlyException("触发校验:推荐To库位组必须等于实际To库位组");
}
}
if (detailObj.IsLocationAreaFrom)
{
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)
{
throw new UserFriendlyException($"触发校验:推荐To库区必须等于实际To库区");
throw new UserFriendlyException("触发校验:推荐To库区必须等于实际To库区");
}
}
if (detailObj.IsLocationErpCodeFrom)
{
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)
{
throw new UserFriendlyException($"触发校验:推荐To ERP库区必须等于实际To ERP库区");
throw new UserFriendlyException("触发校验:推荐To ERP库区必须等于实际To ERP库区");
}
}
if (detailObj.IsQtyFrom)
{
if (detailObj.RecommendFromQty != detailObj.HandledFromQty)
{
throw new UserFriendlyException($"触发校验:推荐From数量必须等于实际From数量");
throw new UserFriendlyException("触发校验:推荐From数量必须等于实际From数量");
}
}
if (detailObj.IsQtyTo)
{
if (detailObj.RecommendToQty != detailObj.HandledToQty)
{
throw new UserFriendlyException($"触发校验:推荐To数量必须等于实际To数量");
throw new UserFriendlyException("触发校验:推荐To数量必须等于实际To数量");
}
}
}
#endregion
foreach (var detail in dto.Details)
@ -180,8 +205,10 @@ public class TransferLibJobAppService
detail.HandledFromContainerCode = string.Empty;
detail.HandledToContainerCode = string.Empty;
var fromLocationDto=await _locationAppService.GetByCodeAsync(detail.HandledFromLocationCode).ConfigureAwait(false);
var toLocationDto=await _locationAppService.GetByCodeAsync(detail.HandledToLocationCode).ConfigureAwait(false);
var fromLocationDto = await _locationAppService.GetByCodeAsync(detail.HandledFromLocationCode)
.ConfigureAwait(false);
var toLocationDto =
await _locationAppService.GetByCodeAsync(detail.HandledToLocationCode).ConfigureAwait(false);
detail.HandledFromLocationArea = fromLocationDto.AreaCode;
detail.HandledFromLocationCode = fromLocationDto.Code;
@ -190,7 +217,7 @@ public class TransferLibJobAppService
detail.HandledFromWarehouseCode = fromLocationDto.WarehouseCode;
detail.HandledToLocationArea = toLocationDto.AreaCode;
detail.HandledToLocationCode = toLocationDto.Code ;
detail.HandledToLocationCode = toLocationDto.Code;
detail.HandledToLocationErpCode = toLocationDto.ErpLocationCode;
detail.HandledToLocationGroup = toLocationDto.LocationGroupCode;
detail.HandledToWarehouseCode = toLocationDto.WarehouseCode;
@ -199,23 +226,85 @@ public class TransferLibJobAppService
var ret = await base.CompleteAsync(id, dto).ConfigureAwait(false);
if (ret != null)
{
Type ty = Type.GetType(dto.CallServerName);
var ty = Type.GetType(dto.CallServerName);
if (ty == null)
{
throw new UserFriendlyException($"{methodPrefix}没有找到类型为{dto.CallServerName}的对象");
}
var instance = _serviceProvider.GetService(ty);
if (instance == null)
{
throw new UserFriendlyException($"{methodPrefix}类型为{dto.CallServerName}的对象创建失败");
}
ITransferLibCallback transferLibCallback = (ITransferLibCallback)instance;
var transferLibCallback = (ITransferLibCallback)instance;
if (transferLibCallback == null)
{
throw new UserFriendlyException($"{methodPrefix}类型为{dto.CallServerName}的对象没有实现ITransferLibCallback接口");
}
await transferLibCallback.DoTransferLibCallbackAsync(dto).ConfigureAwait(false);
}
await TransferLibRequestAppService.CompleteByJobAsync(dto.RequestNumber).ConfigureAwait(false);
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;
[Authorize]
[Route($"{StoreConsts.RootPath}assemble-note")]
[Route($"{StoreConsts.RootPath}assemble-issue-note")]
public class AssembleIssueNoteAppService :
SfsStoreWithDetailsAppServiceBase<AssembleIssueNote, AssembleIssueNoteDTO, SfsStoreRequestInputBase, AssembleIssueNoteEditInput, AssembleIssueNoteDetail,
AssembleIssueNoteDetailDTO, SfsStoreRequestInputBase, AssembleIssueNoteImportInput>,
IAssembleIssueNoteAppService
{
private readonly IAssembleIssueNoteManager _assembleNoteManager;
private readonly IAssembleIssueNoteManager _assembleIssueNoteManager;
public AssembleIssueNoteAppService(
IAssembleIssueNoteRepository repository,
IAssembleIssueNoteManager assembleNoteManager
IAssembleIssueNoteManager assembleIssueNoteManager
) : base(repository)
{
_assembleNoteManager = assembleNoteManager;
_assembleIssueNoteManager = assembleIssueNoteManager;
}
[HttpPost("")]
@ -39,7 +39,7 @@ public class AssembleIssueNoteAppService :
public override async Task<AssembleIssueNoteDTO> CreateAsync(AssembleIssueNoteEditInput 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);
return dto;
}
@ -52,10 +52,11 @@ public class AssembleIssueNoteAppService :
[HttpPost("confirm/{id}")]
public virtual async Task<AssembleIssueNoteDTO> ConfirmAsync(Guid id)
{
var assembleNote= await _repository.GetAsync(id).ConfigureAwait(false);
assembleNote.Confirmed = true;
assembleNote=await _repository.UpdateAsync(assembleNote).ConfigureAwait(false);
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<AssembleIssueNote>(assembleNote), false).ConfigureAwait(false);
return ObjectMapper.Map<AssembleIssueNote, AssembleIssueNoteDTO>(assembleNote);
var assembleIssueNote = await _repository.GetAsync(id).ConfigureAwait(false);
assembleIssueNote.Confirmed = true;
assembleIssueNote = await _repository.UpdateAsync(assembleIssueNote).ConfigureAwait(false);
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<AssembleIssueNote>(assembleIssueNote), false).ConfigureAwait(false);
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.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Application;
[Authorize]
[Route($"{StoreConsts.RootPath}coating-note")]
[Route($"{StoreConsts.RootPath}coating-issue-note")]
public class CoatingIssueNoteAppService :
SfsStoreWithDetailsAppServiceBase<CoatingIssueNote, CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteEditInput, CoatingIssueNoteDetail,
CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase, CoatingIssueNoteImportInput>,
@ -60,6 +59,4 @@ public class CoatingIssueNoteAppService :
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 Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
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.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NUglify.Helpers;
using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts;
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;
/// <summary>
/// 装配叫料
/// 装配叫料申请
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}assemble-request")]
public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<AssembleIssueRequest,
AssembleIssueRequestDTO,
SfsStoreRequestInputBase, AssembleIssueRequestEditInput, AssembleIssueRequestDetail,
AssembleIssueRequestDetailDTO,
[Route($"{StoreConsts.RootPath}assemble-issue-request")]
public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<AssembleIssueRequest, AssembleIssueRequestDTO,
SfsStoreRequestInputBase, AssembleIssueRequestEditInput, AssembleIssueRequestDetail, AssembleIssueRequestDetailDTO,
SfsStoreRequestInputBase, AssembleIssueRequestImportInput>,
IAssembleIssueRequestAppService
{
private readonly IAssembleIssueRequestManager _assembleRequestManager;
private readonly IAssembleIssueRequestManager _assembleIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IAssembleIssueJobAppService _assembleIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public AssembleIssueRequestAppService(
IAssembleIssueRequestRepository repository,
IAssembleIssueRequestManager assembleRequestManager,
IAssembleIssueRequestManager assembleIssueRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService
)
: base(repository, assembleRequestManager)
ITransactionTypeAppService transactionTypeAppService, IAssembleIssueJobAppService assembleIssueJobAppService)
: base(repository, assembleIssueRequestManager)
{
_assembleRequestManager = assembleRequestManager;
_assembleIssueRequestManager = assembleIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp;
_locationAppService = locationAppService;
@ -52,13 +55,12 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
_productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService;
_assembleIssueJobAppService = assembleIssueJobAppService;
}
public override async Task<AssembleIssueRequestDTO> HandleAsync(Guid id)
{
await Task.CompletedTask.ConfigureAwait(false);
return null;
return await base.HandleAsync(id).ConfigureAwait(false);
}
[HttpPost("")]
@ -72,18 +74,21 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
}
}
foreach (var detailInput in input.Details) //赋值生产线
foreach (var detailInput in input.Details)
{
var toLocationDto =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
detailInput.ToLocationArea = toLocationDto.AreaCode;
detailInput.ToLocationGroup = toLocationDto.LocationGroupCode;
detailInput.ToWarehouseCode = toLocationDto.WarehouseCode;
detailInput.ProdLine = detailInput.ToLocationCode;
detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode;
detailInput.ItemDesc1 = itemBasicDto.Desc1;
@ -95,12 +100,13 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
//因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.SEMI;
}
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
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);
@ -127,16 +133,210 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
[HttpPost("create-and-handle")]
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 校验
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)
{
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
}

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

@ -1,80 +1,68 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office.PowerPoint.Y2021.M06.Main;
using IdentityModel;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using NUglify.Helpers;
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.Shared.Domain;
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.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application;
/// <summary>
/// 喷涂叫料
/// 喷涂叫料申请
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}coating-request")]
[Route($"{StoreConsts.RootPath}coating-issue-request")]
public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest, CoatingIssueRequestDTO,
SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail, CoatingIssueRequestDetailDTO,
SfsStoreRequestInputBase, CoatingIssueRequestImportInput>,
ICoatingIssueRequestAppService
{
private readonly ICoatingIssueRequestManager _coatingMaterialRequestManager;
private readonly ICoatingIssueRequestManager _coatingIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public CoatingIssueRequestAppService(
ICoatingIssueRequestRepository repository,
ICoatingIssueRequestManager coatingMaterialRequestManager,
ICoatingIssueRequestManager coatingIssueRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService
)
: base(repository, coatingMaterialRequestManager)
ITransactionTypeAppService transactionTypeAppService, ICoatingIssueJobAppService coatingIssueJobAppService)
: base(repository, coatingIssueRequestManager)
{
_coatingMaterialRequestManager = coatingMaterialRequestManager;
_coatingIssueRequestManager = coatingIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
_productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService;
_coatingIssueJobAppService = coatingIssueJobAppService;
}
public override async Task<CoatingIssueRequestDTO> HandleAsync(Guid id)
{
await Task.CompletedTask.ConfigureAwait(false);
return null;
return await base.HandleAsync(id).ConfigureAwait(false);
}
[HttpPost("")]
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 =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode)
.ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
detailInput.ToLocationArea = toLocationDto.AreaCode;
detailInput.ToLocationGroup = toLocationDto.LocationGroupCode;
detailInput.ToWarehouseCode = toLocationDto.WarehouseCode;
detailInput.ProdLine = detailInput.ToLocationCode;
detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode;
detailInput.ItemDesc1 = itemBasicDto.Desc1;
@ -109,12 +101,13 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
//因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.SEMI;
}
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
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);
@ -122,13 +115,14 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
}
/// <summary>
/// 赋值Request业务属性
/// 赋值Request业务属性
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false);
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
@ -140,15 +134,239 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
[HttpPost("create-and-handle")]
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 校验
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)
{
if (itemBasicDto == null)
@ -164,9 +382,18 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
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.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
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 =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto= await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckProductionLine(productionLineDto,detailInput.ProdLine);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode)
.ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
@ -142,9 +143,9 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
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())
{
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")]
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 =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
p.JobStatus == EnumJobStatus.Partial) )
p.JobStatus == EnumJobStatus.Partial))
{
return;
}
else
{
bool flag = true;
foreach (var detail in kittingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
var flag = true;
if (flag)
foreach (var detail in kittingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus);
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
flag = false;
return;
}
}
if (flag)
{
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus);
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
}
}
/// <summary>
@ -209,7 +221,8 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
List<KittingIssueJobDTO> addKittingIssueJobDtos)
{
//原有任务
var existKittingIssueJobDtos = await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number)
var existKittingIssueJobDtos = await _kittingIssueJobAppService
.GetByRequestNumberAsync(kittingIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
@ -248,9 +261,10 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
}
[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())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
@ -259,19 +273,35 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p=> result+="【"+p+"】");
difference.ForEach(p => result += "【" + p + "】");
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
{
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 校验
@ -297,32 +327,32 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Agreed, EnumRequestStatus.Partial,
EnumRequestStatus.Agreed, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed,
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed
};
break;
case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
}
@ -354,7 +384,8 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
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.Threading;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office2010.Excel;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
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.Domain;
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;
@ -39,16 +43,18 @@ public class TransferLibRequestAppService : SfsStoreRequestAppServiceBase
private readonly ITransferLibRequestManager _transferLibRequestManager;
private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService;
public TransferLibRequestAppService(
ITransferLibRequestRepository repository,
ITransferLibRequestManager transferLibRequestManager,
IBalanceAppService balanceAppService,
ILocationAppService locationAppService) : base(repository, transferLibRequestManager)
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService) : base(repository, transferLibRequestManager)
{
_transferLibRequestManager = transferLibRequestManager;
_balanceAppService = balanceAppService;
_locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService;
}
#region 东阳使用
@ -307,6 +313,98 @@ public class TransferLibRequestAppService : SfsStoreRequestAppServiceBase
#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>
/// 【创建】库移请求

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 = "装配发料任务")]
public class AssembleIssueJob : SfsJobAggregateRootBase<AssembleIssueJobDetail>
{
/// <summary>
/// 叫料类型
/// </summary>
@ -44,6 +43,6 @@ public class AssembleIssueJob : SfsJobAggregateRootBase<AssembleIssueJobDetail>
/// </summary>
[IgnoreUpdate]
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
{
#region 库存基础信息
/// <summary>
@ -522,4 +521,5 @@ public class AssembleIssueJobDetail : SfsDetailEntityBase
{
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;
public AssembleIssueJobManager(
IAssembleIssueJobRepository repository, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService) : base(repository)
IAssembleIssueJobRepository repository,
IBalanceAppService balanceAppService,
IExpectOutAppService expectOutAppService) : base(repository)
{
_balanceAppService = balanceAppService;
_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);
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 Win_in.Sfs.Shared.Domain.Entities;
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>
/// 涂装发料任务
@ -23,26 +22,23 @@ public class CoatingIssueJob : SfsJobAggregateRootBase<CoatingIssueJobDetail>
/// <summary>
/// 生产线
/// </summary>
[IgnoreUpdate]
public string ProdLine { get; set; }
/// <summary>
/// 要单号
/// 要单号
/// </summary>
[IgnoreUpdate]
public string MaterialRequestNumber { get; set; }
public string CoatingRequestNumber { get; set; }
/// <summary>
/// 使用在途库
/// </summary>
[Display(Name = "使用在途库")]
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; }
/// <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
{
#region 库存基础信息
/// <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 Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Domain;
@ -18,14 +17,14 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
{
private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly ICoatingIssueJobRepository _repository;
public CoatingIssueJobManager(
ICoatingIssueJobRepository repository, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService) : base(repository)
ICoatingIssueJobRepository repository,
IBalanceAppService balanceAppService,
IExpectOutAppService expectOutAppService) : base(repository)
{
_balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService;
_repository= repository;
}
/// <summary>
@ -38,7 +37,6 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
public override async Task<CoatingIssueJob> CompleteAsync(CoatingIssueJob input, ICurrentUser user)
{
var entity = await Repository.FindAsync(input.Id).ConfigureAwait(false);
var inputDetail = input.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);
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.Linq.Expressions;
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>
{

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.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Domain;
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>
[IgnoreUpdate]
public override List<AssembleIssueNoteDetail> Details { get; set; } = new List<AssembleIssueNoteDetail>();
[IgnoreUpdate]
public string RequestNumber { get; set; }
/// <summary>
/// 叫料类型
/// </summary>
@ -36,14 +33,12 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase<AssembleIssueNoteDeta
/// <summary>
/// 使用在途库
/// </summary>
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; }
/// <summary>
/// 确认时间
/// </summary>
[Display(Name = "确认时间")]
[IgnoreUpdate]
public DateTime? ConfirmTime { get; set; }
/// <summary>
@ -52,6 +47,8 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase<AssembleIssueNoteDeta
[Display(Name = "已确认")]
public bool Confirmed { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
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 Win_in.Sfs.Shared.Domain.Entities;
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>
public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail>, IHasJobNumber, IHasRequestNumber
{
@ -22,12 +21,9 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
/// <summary>
/// 明细列表
/// </summary>
[IgnoreUpdate]
public override List<CoatingIssueNoteDetail> Details { get; set; } = new List<CoatingIssueNoteDetail>();
[IgnoreUpdate]
public string RequestNumber { get; set; }
/// <summary>
/// 叫料类型
/// </summary>
@ -37,14 +33,12 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
/// <summary>
/// 使用在途库
/// </summary>
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; }
/// <summary>
/// 确认时间
/// </summary>
[Display(Name = "确认时间")]
[IgnoreUpdate]
public DateTime? ConfirmTime { get; set; }
/// <summary>
@ -53,6 +47,8 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
[Display(Name = "已确认")]
public bool Confirmed { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
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.Uow;
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
{

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

@ -1,8 +1,7 @@
using System;
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>
{

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.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Domain;
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>
{
/// <summary>
/// 叫料类型
/// 叫料类型
/// </summary>
[Display(Name = "叫料类型")]
public EnumIssueRequestType IssueRequestType { get; set; }
@ -20,10 +20,5 @@ public class AssembleIssueRequest : SfsStoreRequestAggregateRootBase<AssembleIss
/// 使用在途库
/// </summary>
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>
public class AssembleIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation
{
#region 目标库位信息
/// <summary>
@ -47,6 +46,7 @@ public class AssembleIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasT
#endregion
/// <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
{
private readonly IAssembleIssueRequestRepository _repository;
public AssembleIssueRequestManager(
IAssembleIssueRequestRepository repository
) : base(repository)
) : base(repository)
{
_repository = repository;
}
#region 东阳V2
#endregion
/// <summary>
/// 创建
/// 创建 同时 直接赋值Number 为了返回Number
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
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.Submit();
entity.Agree();
@ -47,7 +42,6 @@ public class AssembleIssueRequestManager
return entity;
}
public virtual async Task CompleteAsync(string number)
{
var entity = await GetByNumberAsync(number).ConfigureAwait(false);
@ -56,23 +50,9 @@ public class AssembleIssueRequestManager
await CompleteAsync(entity).ConfigureAwait(false);
}
}
#region 导入
/// <summary>
/// 执行导入
/// </summary>
public virtual async Task ImportDataAsync(List<AssembleIssueRequest> mergeEntities, List<AssembleIssueRequest> deleteEntities = null)
public Task ImportDataAsync(List<AssembleIssueRequest> entities, List<AssembleIssueRequest> deleteEntities = null)
{
if (deleteEntities != null && deleteEntities.Count > 0)
{
await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false);
}
await CreateManyAsync(mergeEntities).ConfigureAwait(false);
throw new System.NotImplementedException();
}
#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 Win_in.Sfs.Shared.Domain.Entities;
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>
/// 喷涂叫料申请
@ -21,11 +20,4 @@ public class CoatingIssueRequest : SfsStoreRequestAggregateRootBase<CoatingIssue
/// 使用在途库
/// </summary>
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 Win_in.Sfs.Shared.Domain;
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
{
#region 目标库位信息
/// <summary>
@ -45,6 +43,7 @@ public class CoatingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasTo
#endregion
/// <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.Linq;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Math;
using Win_in.Sfs.Shared.Domain.Shared;
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
: SfsStoreRequestManagerBase<CoatingIssueRequest, CoatingIssueRequestDetail>
, ICoatingIssueRequestManager
{
private readonly ICoatingIssueRequestRepository _repository;
public CoatingIssueRequestManager(
ICoatingIssueRequestRepository repository
, ICoatingIssueJobRepository issueJobRepository
) : base(repository)
) : base(repository)
{
_repository = repository;
}
/// <summary>
/// 创建
/// 创建 同时 直接赋值Number 为了返回Number
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
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.Submit();
entity.Agree();
@ -44,7 +38,7 @@ public class CoatingIssueRequestManager
await _repository.InsertAsync(entity).ConfigureAwait(false);
return entity;
}
public virtual async Task CompleteAsync(string number)
{
var entity = await GetByNumberAsync(number).ConfigureAwait(false);
@ -53,23 +47,9 @@ public class CoatingIssueRequestManager
await CompleteAsync(entity).ConfigureAwait(false);
}
}
#region Import
/// <summary>
/// 执行导入
/// </summary>
public virtual async Task ImportDataAsync(List<CoatingIssueRequest> mergeEntities, List<CoatingIssueRequest> deleteEntities = null)
public Task ImportDataAsync(List<CoatingIssueRequest> entities, List<CoatingIssueRequest> deleteEntities = null)
{
if (deleteEntities != null && deleteEntities.Count > 0)
{
await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false);
}
await CreateManyAsync(mergeEntities).ConfigureAwait(false);
throw new System.NotImplementedException();
}
#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 Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueRequestManager : ISfsStoreRequestManager<CoatingIssueRequest, CoatingIssueRequestDetail>,
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.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueRequestRepository : ISfsStoreRepositoryBase<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.EntityFrameworkCore;
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;
[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.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
@ -22,7 +21,7 @@ public static class CoatingIssueJobDbContextModelCreatingExtensions
//Configure Job base properties
b.ConfigureJob<CoatingIssueJob, CoatingIssueJobDetail>();
//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.JobType).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 Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Domain;
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")
.HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
@ -76,6 +79,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobDescription")
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
@ -122,10 +128,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(3072)")
.HasColumnName("Remark");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
@ -519,10 +521,16 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobNumber")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)")
@ -551,10 +559,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
@ -1515,6 +1519,18 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(max)")
.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")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
@ -6771,6 +6787,10 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(64)")
.HasColumnName("HandledSupplierBatch");
b.Property<string>("IdentityNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ItemCode")
.IsRequired()
.HasMaxLength(64)
@ -6803,6 +6823,14 @@ namespace Win_in.Sfs.Wms.Store.Migrations
b.Property<Guid>("MasterID")
.HasColumnType("uniqueidentifier");
b.Property<string>("MesDeliveryNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("MesDeliveryPlan")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Number")
.IsRequired()
.HasMaxLength(64)
@ -7273,6 +7301,10 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<string>("IdentityNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ItemCode")
.IsRequired()
.HasMaxLength(64)
@ -7305,6 +7337,14 @@ namespace Win_in.Sfs.Wms.Store.Migrations
b.Property<Guid>("MasterID")
.HasColumnType("uniqueidentifier");
b.Property<string>("MesDeliveryNo")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("MesDeliveryPlan")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Number")
.IsRequired()
.HasMaxLength(64)
@ -13347,6 +13387,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
@ -13356,6 +13399,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobDescription")
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
@ -13406,10 +13452,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(3072)")
.HasColumnName("Remark");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
@ -13803,10 +13845,16 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<int>("EnumIssueSendType")
.HasColumnType("int");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobNumber")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)")
@ -13835,10 +13883,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
@ -17709,6 +17753,14 @@ namespace Win_in.Sfs.Wms.Store.Migrations
b.Property<Guid>("MasterID")
.HasColumnType("uniqueidentifier");
b.Property<string>("MesBarCode")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("MesQuality")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Number")
.IsRequired()
.HasMaxLength(64)
@ -30282,6 +30334,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobDescription")
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
@ -30332,10 +30387,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(3072)")
.HasColumnName("Remark");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
@ -30397,6 +30448,9 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<int>("IssueRequestType")
.HasColumnType("int");
b.Property<string>("JobNumber")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)")
@ -30425,10 +30479,6 @@ namespace Win_in.Sfs.Wms.Store.Migrations
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("RequestType")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.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 Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
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 Win_in.Sfs.Wms.Store.Notes.IssueNotes;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

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

Loading…
Cancel
Save