唐明亮 2 years ago
parent
commit
8878a9d750
  1. 2
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Incoming/ItemBasicConverter.cs
  2. 6
      be/DataExchange/Iac/Win_in.Sfs.Wms.DataExchange.Application.Iac.Qad/PurchaseOrderAppService.cs
  3. 248
      be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql
  4. 16
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Accounts/AccountController.cs
  5. 3
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Inventories/BalanceController.cs
  6. 4
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/PurchaseReceiptJobController.cs
  7. 3
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueNoteController.cs
  8. 2
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/L7Controller.cs
  9. 2
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/RecycledMaterialReceiptNoteController.cs
  10. 58
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/TestController.cs
  11. 17
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs
  12. 7
      be/Modules/Label/src/Win_in.Sfs.Label.Application.Contracts/InventoryLabels/InventoryLabelWithoutCodeCreateInput.cs
  13. 76
      be/Modules/Label/src/Win_in.Sfs.Label.Application/InventoryLabels/InventoryLabelAppService.cs
  14. 4
      be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs
  15. 6
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransSubType.cs
  16. 2
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumMaterialRequestType.cs
  17. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendFromDetailWithFromToDTOBase.cs
  18. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatusDTOBase.cs
  19. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendToDetailWithFromToDTOBase.cs
  20. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusDTOBase.cs
  21. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendFromDetailWithFromToInputBase.cs
  22. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatusInputBase.cs
  23. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendToDetailWithFromToInputBase.cs
  24. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusInputBase.cs
  25. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/PurchaseReceiptJobs/IPurchaseReceiptJobAppService.cs
  26. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/CountNotes/Inputs/CountNoteImportInput.cs
  27. 26
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/DeliverNotes/IDeliverNoteAppService.cs
  28. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/IProductRecycleNoteAppService.cs
  29. 41
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/DTOs/WipWarehouseAdjustNoteDTO.cs
  30. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/DTOs/WipWarehouseAdjustNoteDetailDTO.cs
  31. 17
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/IWipWarehouseAdjustNoteAppService.cs
  32. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/Inputs/WipWarehouseAdjustNoteDetailInput.cs
  33. 48
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/Inputs/WipWarehouseAdjustNoteEditInput.cs
  34. 71
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/Inputs/WipWarehouseAdjustNoteImportInput.cs
  35. 21
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/WipWarehouseAdjustNotePermissions.cs
  36. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs
  37. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Permissions/StorePermissionDefinitionProvider.cs
  38. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductReceiptRequests/Inputs/ProductReceiptRequestEditInput.cs
  39. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/DTOs/WipWarehouseAdjustRequestDTO.cs
  40. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/DTOs/WipWarehouseAdjustRequestDetailDTO.cs
  41. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/IWipWarehouseAdjustRequestAppService.cs
  42. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/Inputs/WipWarehouseAdjustRequestDetailInput.cs
  43. 26
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/Inputs/WipWarehouseAdjustRequestEditInput.cs
  44. 54
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/Inputs/WipWarehouseAdjustRequestImportInput.cs
  45. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestPermissions.cs
  46. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Win_in.Sfs.Wms.Store.Application.Contracts.csproj
  47. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/CountJobs/CountJobAppService.cs
  48. 95
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/PurchaseReceiptJobs/PurchaseReceiptJobAppService.cs
  49. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountAdjustNotes/CountAdjustNoteAutoMapperProfile.cs
  50. 72
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountNotes/CountNoteAppService.cs
  51. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountNotes/CountNoteAutoMapperProfile.cs
  52. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/IssueNoteAppService.cs
  53. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ItemTransformNotes/ItemTransformNoteAppService.cs
  54. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ItemTransformNotes/ItemTransformNoteAutoMapperProfile.cs
  55. 17
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs
  56. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductionReturnNotes/ProductionReturnNoteAppService.cs
  57. 47
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/RecycledMaterialReceiptNotes/RecycledMaterialReceiptNoteAppService.cs
  58. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/RecycledMaterialReceiptNotes/RecycledMaterialReceiptNoteAutoMapperProfile.cs
  59. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedReceiptNotes/UnplannedReceiptNoteAutoMapperProfile.cs
  60. 136
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/WipWarehouseAdjustNotes/WipWarehouseAdjustNoteAppService.cs
  61. 88
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/WipWarehouseAdjustNotes/WipWarehouseAdjustNoteAutoMapperProfile.cs
  62. 102
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs
  63. 19
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Plans/CountPlans/CountPlanAppService.cs
  64. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Plans/CountPlans/CountPlanAutoMapperProfile.cs
  65. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Plans/SupplierAsns/SupplierAsnAppService.cs
  66. 18
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/CountAdjustRequests/CountAdjustRequestAppService.cs
  67. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/DeliverRequests/DeliverRequestAppService.cs
  68. 96
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/DeliverRequests/DeliverRequestFisAppService.cs
  69. 60
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs
  70. 42
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs
  71. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductReceiptRequests/ProductReceiptRequestAppService.cs
  72. 252
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs
  73. 46
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAppService.cs
  74. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAutoMapperProfile.cs
  75. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/PurchaseReturnRequests/PurchaseReturnRequestAppService.cs
  76. 301
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs
  77. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestAutoMapperProfile.cs
  78. 302
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs
  79. 148
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestAppService.cs
  80. 77
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestAutoMapperProfile.cs
  81. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationAutoMapperProfile.cs
  82. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Win_in.Sfs.Wms.Store.Application.csproj
  83. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendFromDetailWithFromToEntityBase.cs
  84. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatusEntityBase.cs
  85. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendToDetailWithFromToEntityBase.cs
  86. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusEntityBase.cs
  87. 13
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/IssueJobManager.cs
  88. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/RecycledMaterialReceiptNotes/IRecycledMaterialReceiptNoteManager.cs
  89. 14
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/RecycledMaterialReceiptNotes/RecycledMaterialReceiptNoteManager.cs
  90. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/IWipWarehouseAdjustNoteManager.cs
  91. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/IWipWarehouseAdjustNoteRepository.cs
  92. 65
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/WipWarehouseAdjustNote.cs
  93. 24
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/WipWarehouseAdjustNoteDetail.cs
  94. 118
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/WipWarehouseAdjustNoteManager.cs
  95. 30
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Plans/CountPlans/CountPlanManager.cs
  96. 27
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs
  97. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/IWipWarehouseAdjustRequestManager.cs
  98. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/IWipWarehouseAdjustRequestRepository.cs
  99. 25
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequest.cs
  100. 30
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestDetail.cs

2
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Incoming/ItemBasicConverter.cs

@ -49,7 +49,7 @@ public class ItemBasicConverter : IIncomingConverter
var materialRequestList = await BuildIncomingToWmsOfItemBasicRequestAsync(incomingFromExternalList).ConfigureAwait(false);
await _incomingToWmsManager.CreateBulkAsync(materialRequestList).ConfigureAwait(false);
//归档
await _incomingFromExternalManager.ArchiveBulkAsync(incomingFromExternalList);
await _incomingFromExternalManager.ArchiveBulkAsync(incomingFromExternalList).ConfigureAwait(false);
}
private async Task<List<IncomingToWms>> BuildIncomingToWmsOfItemBasicRequestAsync(List<IncomingFromExternal> incomingDataList)

6
be/DataExchange/Iac/Win_in.Sfs.Wms.DataExchange.Application.Iac.Qad/PurchaseOrderAppService.cs

@ -22,7 +22,7 @@ namespace Win_in.Sfs.Wms.DataExchange.Application.Iac.Qad;
[ApiExplorerSettings(GroupName = SwaggerGroupConsts.WmsWebApi)]
public class PurchaseOrderAppService : ApplicationService, IPurchaseOrderAppService
{
private readonly Store.Application.Contracts.IPurchaseOrderAppService _purchaseOrderAppService;
//private readonly Store.Application.Contracts.IPurchaseOrderAppService _purchaseOrderAppService;
private readonly IPo_mstrRepository _po_mstrRepository;
@ -34,7 +34,7 @@ public class PurchaseOrderAppService : ApplicationService, IPurchaseOrderAppServ
IConfiguration configuration
)
{
_purchaseOrderAppService = purchaseOrderAppService;
//_purchaseOrderAppService = purchaseOrderAppService;
_po_mstrRepository = po_mstrRepository;
_configuration = configuration;
}
@ -77,7 +77,7 @@ public class PurchaseOrderAppService : ApplicationService, IPurchaseOrderAppServ
targetObj.ContactEmail = "";
#endregion
await _purchaseOrderAppService.UpsertAsync(targetObj).ConfigureAwait(false);
//await _purchaseOrderAppService.UpsertAsync(targetObj).ConfigureAwait(false);
}
catch (Exception ex)
{

248
be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql

@ -1863,6 +1863,52 @@ CREATE TABLE [Store_WarehouseTransferNote] (
)
CREATE TABLE [Store_WipWarehouseAdjustNote] (
[Id] uniqueidentifier NOT NULL,
[Type] nvarchar(64) NULL,
[RequestNumber] nvarchar(max) NULL,
[JobNumber] nvarchar(64) NULL,
[Confirmed] bit NOT NULL,
[ConfirmTime] datetime2 NULL,
[ExtraProperties] nvarchar(max) NULL,
[ConcurrencyStamp] nvarchar(40) NULL,
[CreationTime] datetime2 NOT NULL,
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[TenantId] uniqueidentifier NULL,
[Remark] nvarchar(3072) NULL,
[Worker] nvarchar(max) NULL,
[Number] nvarchar(64) NOT NULL,
[ActiveDate] datetime2 NOT NULL,
CONSTRAINT [PK_Store_WipWarehouseAdjustNote] PRIMARY KEY ([Id])
)
CREATE TABLE [Store_WipWarehouseAdjustRequest] (
[Id] uniqueidentifier NOT NULL,
[Type] nvarchar(64) NULL,
[ExtraProperties] nvarchar(max) NULL,
[ConcurrencyStamp] nvarchar(40) NULL,
[CreationTime] datetime2 NOT NULL,
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[TenantId] uniqueidentifier NULL,
[Remark] nvarchar(3072) NULL,
[Worker] nvarchar(max) NULL,
[Number] nvarchar(64) NOT NULL,
[ActiveDate] datetime2 NOT NULL,
[AutoSubmit] bit NOT NULL,
[AutoAgree] bit NOT NULL,
[AutoHandle] bit NOT NULL,
[AutoCompleteJob] bit NOT NULL,
[DirectCreateNote] bit NOT NULL,
[RequestStatus] nvarchar(64) NOT NULL,
CONSTRAINT [PK_Store_WipWarehouseAdjustRequest] PRIMARY KEY ([Id])
)
CREATE TABLE [Store_WorkOrder] (
[Id] uniqueidentifier NOT NULL,
[WorkOrderId] nvarchar(64) NULL,
@ -3069,6 +3115,7 @@ CREATE TABLE [Store_InspectNoteDetail] (
[Weight] nvarchar(max) NULL,
[OtherPropertyJson] nvarchar(max) NULL,
[StdPackQty] decimal(18,6) NOT NULL,
[InspectDate] datetime2 NOT NULL,
[CreationTime] datetime2 NOT NULL,
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
@ -5068,6 +5115,98 @@ CREATE TABLE [Store_WarehouseTransferNoteDetail] (
)
CREATE TABLE [Store_WipWarehouseAdjustNoteDetail] (
[Id] uniqueidentifier NOT NULL,
[Reason] nvarchar(64) NULL,
[ReasonCode] nvarchar(max) NULL,
[CreationTime] datetime2 NOT NULL,
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[MasterID] uniqueidentifier NOT NULL,
[TenantId] uniqueidentifier NULL,
[Number] nvarchar(64) NOT NULL,
[Remark] nvarchar(3072) NULL,
[ItemName] nvarchar(64) NULL,
[ItemDesc1] nvarchar(64) NULL,
[ItemDesc2] nvarchar(64) NULL,
[ItemCode] nvarchar(64) NOT NULL,
[Uom] nvarchar(64) NOT NULL,
[Qty] decimal(18,6) NOT NULL,
[StdPackQty] decimal(18,6) NOT NULL,
[FromPackingCode] nvarchar(450) NULL,
[ToPackingCode] nvarchar(max) NULL,
[FromContainerCode] nvarchar(max) NULL,
[ToContainerCode] nvarchar(max) NULL,
[FromLot] nvarchar(max) NULL,
[ToLot] nvarchar(max) NULL,
[SupplierBatch] nvarchar(64) NULL,
[ArriveDate] datetime2 NOT NULL,
[ProduceDate] datetime2 NOT NULL,
[ExpireDate] datetime2 NOT NULL,
[FromLocationCode] nvarchar(64) NOT NULL,
[FromLocationArea] nvarchar(64) NULL,
[FromLocationGroup] nvarchar(64) NULL,
[FromLocationErpCode] nvarchar(64) NOT NULL,
[FromWarehouseCode] nvarchar(64) NOT NULL,
[FromStatus] nvarchar(64) NOT NULL,
[ToLocationCode] nvarchar(64) NOT NULL,
[ToLocationArea] nvarchar(64) NULL,
[ToLocationGroup] nvarchar(64) NULL,
[ToLocationErpCode] nvarchar(64) NOT NULL,
[ToWarehouseCode] nvarchar(64) NOT NULL,
[ToStatus] nvarchar(64) NOT NULL,
CONSTRAINT [PK_Store_WipWarehouseAdjustNoteDetail] PRIMARY KEY ([Id]),
CONSTRAINT [FK_Store_WipWarehouseAdjustNoteDetail_Store_WipWarehouseAdjustNote_MasterID] FOREIGN KEY ([MasterID]) REFERENCES [Store_WipWarehouseAdjustNote] ([Id]) ON DELETE CASCADE
)
CREATE TABLE [Store_WipWarehouseAdjustRequestDetail] (
[Id] uniqueidentifier NOT NULL,
[Reason] nvarchar(max) NULL,
[ReasonCode] nvarchar(max) NULL,
[CreationTime] datetime2 NOT NULL,
[CreatorId] uniqueidentifier NULL,
[LastModificationTime] datetime2 NULL,
[LastModifierId] uniqueidentifier NULL,
[MasterID] uniqueidentifier NOT NULL,
[TenantId] uniqueidentifier NULL,
[Number] nvarchar(64) NOT NULL,
[Remark] nvarchar(3072) NULL,
[ItemName] nvarchar(64) NULL,
[ItemDesc1] nvarchar(64) NULL,
[ItemDesc2] nvarchar(64) NULL,
[ItemCode] nvarchar(64) NOT NULL,
[Uom] nvarchar(64) NOT NULL,
[Qty] decimal(18,6) NOT NULL,
[StdPackQty] decimal(18,6) NOT NULL,
[FromPackingCode] nvarchar(max) NULL,
[ToPackingCode] nvarchar(max) NULL,
[FromContainerCode] nvarchar(max) NULL,
[ToContainerCode] nvarchar(max) NULL,
[FromLot] nvarchar(max) NULL,
[ToLot] nvarchar(max) NULL,
[SupplierBatch] nvarchar(64) NULL,
[ArriveDate] datetime2 NOT NULL,
[ProduceDate] datetime2 NOT NULL,
[ExpireDate] datetime2 NOT NULL,
[FromLocationCode] nvarchar(64) NOT NULL,
[FromLocationArea] nvarchar(64) NULL,
[FromLocationGroup] nvarchar(64) NULL,
[FromLocationErpCode] nvarchar(64) NOT NULL,
[FromWarehouseCode] nvarchar(64) NOT NULL,
[FromStatus] nvarchar(64) NOT NULL,
[ToLocationCode] nvarchar(64) NOT NULL,
[ToLocationArea] nvarchar(64) NULL,
[ToLocationGroup] nvarchar(64) NULL,
[ToLocationErpCode] nvarchar(64) NOT NULL,
[ToWarehouseCode] nvarchar(64) NOT NULL,
[ToStatus] nvarchar(64) NOT NULL,
CONSTRAINT [PK_Store_WipWarehouseAdjustRequestDetail] PRIMARY KEY ([Id]),
CONSTRAINT [FK_Store_WipWarehouseAdjustRequestDetail_Store_WipWarehouseAdjustRequest_MasterID] FOREIGN KEY ([MasterID]) REFERENCES [Store_WipWarehouseAdjustRequest] ([Id]) ON DELETE CASCADE
)
CREATE TABLE [Store_WorkOrderDetail] (
[Id] uniqueidentifier NOT NULL,
[EffectiveDate] datetime2 NOT NULL,
@ -5614,4 +5753,111 @@ CREATE UNIQUE INDEX [IX_Store_ScrapNote_Number] ON [Store_ScrapNote] ([Number])
CREATE INDEX [IX_Store_ScrapNoteDetail_MasterID] ON [Store_ScrapNoteDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_ScrapNoteDetail_Number_ItemCode_FromPackingCode_FromLocationCode_ToLocationCode_FromLot_FromStatus] ON [Store_ScrapNoteDetail] ([Number], [ItemCode], [FromPackingCode], [FromLocationCode], [ToLocationCode], [
CREATE UNIQUE INDEX [IX_Store_ScrapNoteDetail_Number_ItemCode_FromPackingCode_FromLocationCode_ToLocationCode_FromLot_FromStatus] ON [Store_ScrapNoteDetail] ([Number], [ItemCode], [FromPackingCode], [FromLocationCode], [ToLocationCode], [FromLot], [FromStatus]) WHERE [FromPackingCode] IS NOT NULL AND [FromLot] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_ScrapRequest_Number] ON [Store_ScrapRequest] ([Number])
CREATE INDEX [IX_Store_ScrapRequestDetail_MasterID] ON [Store_ScrapRequestDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_ScrapRequestDetail_Number_ItemCode_LocationCode] ON [Store_ScrapRequestDetail] ([Number], [ItemCode], [LocationCode])
CREATE UNIQUE INDEX [IX_Store_SupplierAsn_Number] ON [Store_SupplierAsn] ([Number])
CREATE INDEX [IX_Store_SupplierAsn_SupplierCode] ON [Store_SupplierAsn] ([SupplierCode])
CREATE INDEX [IX_Store_SupplierAsnDetail_MasterID] ON [Store_SupplierAsnDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_SupplierAsnDetail_Number_ItemCode_PackingCode] ON [Store_SupplierAsnDetail] ([Number], [ItemCode], [PackingCode])
CREATE UNIQUE INDEX [IX_Store_TransferNote_Number] ON [Store_TransferNote] ([Number])
CREATE INDEX [IX_Store_TransferNoteDetail_MasterID] ON [Store_TransferNoteDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_TransferNoteDetail_Number_FromPackingCode_FromLocationCode_ToLocationCode_FromStatus_ToStatus] ON [Store_TransferNoteDetail] ([Number], [FromPackingCode], [FromLocationCode], [ToLocationCode], [FromStatus], [ToStatus]) WHERE [FromPackingCode] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_TransferRequest_Number] ON [Store_TransferRequest] ([Number])
CREATE INDEX [IX_Store_TransferRequestDetail_MasterID] ON [Store_TransferRequestDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_UnplannedIssueNote_Number] ON [Store_UnplannedIssueNote] ([Number])
CREATE INDEX [IX_Store_UnplannedIssueNoteDetail_MasterID] ON [Store_UnplannedIssueNoteDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_UnplannedIssueNoteDetail_Number_PackingCode_ItemCode_Lot_Status] ON [Store_UnplannedIssueNoteDetail] ([Number], [PackingCode], [ItemCode], [Lot], [Status]) WHERE [Lot] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_UnplannedIssueRequest_Number] ON [Store_UnplannedIssueRequest] ([Number])
CREATE INDEX [IX_Store_UnplannedIssueRequestDetail_MasterID] ON [Store_UnplannedIssueRequestDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_UnplannedIssueRequestDetail_Number_PackingCode_ItemCode_Lot_Status] ON [Store_UnplannedIssueRequestDetail] ([Number], [PackingCode], [ItemCode], [Lot], [Status]) WHERE [Lot] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_UnplannedReceiptNote_Number] ON [Store_UnplannedReceiptNote] ([Number])
CREATE INDEX [IX_Store_UnplannedReceiptNoteDetail_MasterID] ON [Store_UnplannedReceiptNoteDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_UnplannedReceiptNoteDetail_Number_PackingCode_ItemCode_Lot_Status] ON [Store_UnplannedReceiptNoteDetail] ([Number], [PackingCode], [ItemCode], [Lot], [Status]) WHERE [Lot] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_UnplannedReceiptRequest_Number] ON [Store_UnplannedReceiptRequest] ([Number])
CREATE INDEX [IX_Store_UnplannedReceiptRequestDetail_MasterID] ON [Store_UnplannedReceiptRequestDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_UnplannedReceiptRequestDetail_Number_PackingCode_ItemCode_Lot_Status] ON [Store_UnplannedReceiptRequestDetail] ([Number], [PackingCode], [ItemCode], [Lot], [Status]) WHERE [Lot] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_WarehouseTransferNote_Number] ON [Store_WarehouseTransferNote] ([Number])
CREATE INDEX [IX_Store_WarehouseTransferNoteDetail_MasterID] ON [Store_WarehouseTransferNoteDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_WarehouseTransferNoteDetail_Number_FromPackingCode_FromLocationCode_ToLocationCode] ON [Store_WarehouseTransferNoteDetail] ([Number], [FromPackingCode], [FromLocationCode], [ToLocationCode]) WHERE [FromPackingCode] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_WipWarehouseAdjustNote_Number] ON [Store_WipWarehouseAdjustNote] ([Number])
CREATE INDEX [IX_Store_WipWarehouseAdjustNoteDetail_MasterID] ON [Store_WipWarehouseAdjustNoteDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_WipWarehouseAdjustNoteDetail_Number_FromPackingCode_FromLocationCode_ToLocationCode_FromStatus_ToStatus] ON [Store_WipWarehouseAdjustNoteDetail] ([Number], [FromPackingCode], [FromLocationCode], [ToLocationCode], [FromStatus], [ToStatus]) WHERE [FromPackingCode] IS NOT NULL
CREATE UNIQUE INDEX [IX_Store_WipWarehouseAdjustRequest_Number] ON [Store_WipWarehouseAdjustRequest] ([Number])
CREATE INDEX [IX_Store_WipWarehouseAdjustRequestDetail_MasterID] ON [Store_WipWarehouseAdjustRequestDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_WorkOrder_Number] ON [Store_WorkOrder] ([Number])
CREATE INDEX [IX_Store_WorkOrderDetail_MasterID] ON [Store_WorkOrderDetail] ([MasterID])
CREATE UNIQUE INDEX [IX_Store_WorkOrderDetail_Number_ItemCode] ON [Store_WorkOrderDetail] ([Number], [ItemCode])

16
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Accounts/AccountController.cs

@ -21,7 +21,7 @@ using PdaMenuGroupDto = Win_in.Sfs.Wms.Pda.Models.PdaMenuGroupDto;
namespace Win_in.Sfs.Wms.Pda.Controllers.Accounts;
/// <summary>
///
///
/// </summary>
[AllowAnonymous]
[ApiController]
@ -38,12 +38,15 @@ public class AccountController : AbpController
private readonly ILogger<TokenService> _logger;
/// <summary>
///
///
/// </summary>
/// <param name="profileAppService"></param>
/// <param name="tokenService"></param>
/// <param name="userMenuAppService"></param>
/// <param name="userWorkGroupAppService"></param>
/// <param name="configuration"></param>
/// <param name="httpClientFactory"></param>
/// <param name="logger"></param>
public AccountController(IProfileAppService profileAppService
, ITokenService tokenService
, IUserMenuAppService userMenuAppService
@ -59,13 +62,22 @@ public class AccountController : AbpController
_logger = logger;
}
/// <summary>
///
/// </summary>
[Display]
public class LoginModel
{
/// <summary>
///
/// </summary>
[Display]
[Required]
public string UserName { get; set; }
/// <summary>
///
/// </summary>
[Display]
[Required]
public string Password { get; set; }

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

@ -39,6 +39,7 @@ public class BalanceController : AbpController
/// <param name="balanceAppService"></param>
/// <param name="itemBasicAppService"></param>
/// <param name="locationAppService"></param>
/// <param name="expectOutAppService"></param>
public BalanceController(
IBalanceAppService balanceAppService,
IItemBasicAppService itemBasicAppService,
@ -440,7 +441,7 @@ public class BalanceController : AbpController
public async Task<PagedResultDto<BalanceDTO>> GetListByLocationTypeAndInventoryStatusAndNotExpectOutAsync(
BalanceListByIssueInputByInventoryStatusAndLocationType listInput)
{
var expectOut = await _expectOutAppService.GetListByPackingCodeAsync(listInput.packingCode);
var expectOut = await _expectOutAppService.GetListByPackingCodeAsync(listInput.packingCode).ConfigureAwait(false);
if (expectOut != null && expectOut.Any())
{

4
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/PurchaseReceiptJobController.cs

@ -32,9 +32,7 @@ public class PurchaseReceiptJobController : AbpController
/// </summary>
/// <param name="purchaseReceiptJobAppService"></param>
/// <param name="userWorkGroupAppService"></param>
/// <param name="purchaseReceiptRequestAppService"></param>
/// <param name="supplierAppService"></param>
/// <param name="fileAppService"></param>
public PurchaseReceiptJobController(
IPurchaseReceiptJobAppService purchaseReceiptJobAppService
, IUserWorkGroupAppService userWorkGroupAppService
@ -53,7 +51,7 @@ public class PurchaseReceiptJobController : AbpController
[HttpGet("{id}")]
public virtual async Task<ActionResult<PurchaseReceiptJobDTO>> GetAsync(Guid id)
{
var result = await _purchaseReceiptJobAppService.GetNoCacheAsync(id).ConfigureAwait(false);
var result = await _purchaseReceiptJobAppService.GetAsync(id).ConfigureAwait(false);
var supplier = await _supplierAppService.GetByCodeAsync(result.SupplierCode).ConfigureAwait(false);
result.SupplierName = supplier.Name;

3
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/IssueNoteController.cs

@ -33,7 +33,7 @@ public class IssueNoteController : AbpController
[HttpPost("")]
public virtual async Task CreateAsync([FromBody] IssueNoteEditInput input)
{
input.RequestType = EnumMaterialRequestType.Direct_Issue.ToString();
input.RequestType = EnumMaterialRequestType.Issue_Direct.ToString();
input.Details.ForEach(p =>
{
@ -54,5 +54,4 @@ public class IssueNoteController : AbpController
{
return await _issueNoteAppService.ConfirmAsync(id).ConfigureAwait(false);
}
}

2
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/L7Controller.cs

@ -54,7 +54,7 @@ public class L7Controller : AbpController
[HttpPost("create-product-recycle-note-with-l7")]
public virtual async Task<ProductRecycleNoteDTO> CreateProductRecycleNoteWithL7Async(ProductRecycleNoteEditInput input)
{
return await _productRecycleNoteAppService.CreateWithL7Async(input).ConfigureAwait(false);
return await _productRecycleNoteAppService.CreateAsync(input).ConfigureAwait(false);
}
/// <summary>

2
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Stores/RecycledMaterialReceiptNoteController.cs

@ -26,7 +26,7 @@ public class RecycledMaterialReceiptNoteController : AbpController
}
/// <summary>
/// 获取盘点任务详情
/// 回收料调整
/// </summary>
/// <param name="id"></param>
/// <returns></returns>

58
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/TestController.cs

@ -1,58 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Account;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Mvc;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Wms.Pda.Authenticaitons;
using Win_in.Sfs.Wms.Pda.Models;
using PdaMenuDto = Win_in.Sfs.Wms.Pda.Models.PdaMenuDto;
using PdaMenuGroupDto = Win_in.Sfs.Wms.Pda.Models.PdaMenuGroupDto;
namespace Win_in.Sfs.Wms.Pda.Controllers.Accounts;
/// <summary>
///
/// </summary>
[AllowAnonymous]
[ApiController]
[Route($"{PdaHostConst.ROOT_ROUTE}asfasf")]
public class TestController: AbpController
{
//private readonly IProfileAppService _profileAppService;
//private readonly ITokenService _tokenService;
private readonly IUserMenuAppService _userMenuAppService;
//private readonly IUserWorkGroupAppService _userWorkGroupAppService;
/// <summary>
///
/// </summary>
/// <param name="profileAppService"></param>
/// <param name="tokenService"></param>
/// <param name="userMenuAppService"></param>
/// <param name="userWorkGroupAppService"></param>
public TestController(
IUserMenuAppService userMenuAppService
, IUserWorkGroupAppService userWorkGroupAppService
)
{
//_profileAppService = profileAppService;
//_tokenService = tokenService;
_userMenuAppService = userMenuAppService;
//_userWorkGroupAppService = userWorkGroupAppService;
}
/// <summary>
/// Test
/// </summary>
/// <returns></returns>
[HttpGet("Test")]
public virtual async Task<List<string>> Test()
{
return new List<string>() { "sdfsdf'" };
}
}

17
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs

@ -244,6 +244,16 @@ public class BalanceManager : DomainService, IBalanceManager
balance.Status
).ConfigureAwait(false);
//if (!existBalance.IsActive)
//{
// throw new UserFriendlyException(
// $"箱码为{balance.PackingCode}," +
// $"库位在{balance.LocationCode}," +
// $"批次为{balance.Lot}," +
// $"状态为{balance.Status.GetDisplayName()}" +
// $"的库存是不可用状态");
//}
existBalance.Qty = balance.Qty;
existBalance.ItemName = balance.ItemName;
existBalance.ItemDesc1 = balance.ItemDesc1;
@ -423,9 +433,12 @@ public class BalanceManager : DomainService, IBalanceManager
expression = expression.And(p => p.ExpireDate > DateTime.Now);
}
//筛选有效库区
if (validLocationAreas.Any())
if (validLocationAreas.Any() )
{
expression = expression.And(p => validLocationAreas.Contains(p.LocationArea));
if (!string.IsNullOrEmpty(validLocationAreas[0]))
{
expression = expression.And(p => validLocationAreas.Contains(p.LocationArea));
}
}
var allBalances = await
(await _balanceRepository.GetDbSetAsync().ConfigureAwait(false))

7
be/Modules/Label/src/Win_in.Sfs.Label.Application.Contracts/InventoryLabels/InventoryLabelWithoutCodeCreateInput.cs

@ -207,4 +207,11 @@ public class InventoryLabelWithoutCodeCreateInput
[Display(Name = "要求到货时间")]
[Required(ErrorMessage = "{0}是必填项")]
public DateTime PlanArriveDate { get; set; }
/// <summary>
/// 备注
/// </summary>
[Display(Name = "备注")]
public string Remark { get; set; }
}

76
be/Modules/Label/src/Win_in.Sfs.Label.Application/InventoryLabels/InventoryLabelAppService.cs

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
@ -15,6 +16,7 @@ using Win_in.Sfs.Label.Application.Contracts;
using Win_in.Sfs.Label.Domain;
using Win_in.Sfs.Label.Domain.Shared;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Label.Application;
@ -33,12 +35,14 @@ public class InventoryLabelAppService
private new readonly IInventoryLabelRepository _repository;
private readonly ISupplierAppService _supplierAppService;
private readonly ISupplierItemAppService _supplierItemAppService;
private readonly IItemBasicAppService _itemBasicAppService;
public InventoryLabelAppService(
IInventoryLabelRepository repository, ILabelDefinitionManager labelDefinitionManager
, ISupplierAppService supplierAppService
, IItemPackAppService itemPackAppService
, ISupplierItemAppService supplierItemAppService
, IItemBasicAppService itemBasicAppService
) : base(repository)
{
_repository = repository;
@ -46,6 +50,7 @@ public class InventoryLabelAppService
_supplierAppService = supplierAppService;
_itemPackAppService = itemPackAppService;
_supplierItemAppService = supplierItemAppService;
_itemBasicAppService = itemBasicAppService;
}
[HttpPost("")]
@ -60,6 +65,45 @@ public class InventoryLabelAppService
return await base.CreateAsync(input).ConfigureAwait(false);
}
/// <summary>
/// 按Id获取实体
/// </summary>
/// <param name="id">实体Id</param>
/// <returns></returns>
[HttpGet("{id}")]
public override async Task<InventoryLabelDto> GetAsync(Guid id)
{
var dto = await base.GetAsync(id).ConfigureAwait(false);
if (dto != null)
{
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(dto.ItemCode).ConfigureAwait(false);
if (itemBasicDto != null)
{
switch (itemBasicDto.ValidityUnit)
{
case EnumValidityUnit.Infinite:
dto.ExpireDate = DateTime.MaxValue;
break;
case EnumValidityUnit.Day:
dto.ExpireDate = DateTime.Now.AddDays(itemBasicDto.Validity);
break;
case EnumValidityUnit.WeeK:
dto.ExpireDate = DateTime.Now.AddDays(itemBasicDto.Validity * 7);
break;
case EnumValidityUnit.Month:
dto.ExpireDate = DateTime.Now.AddMonths(itemBasicDto.Validity);
break;
case EnumValidityUnit.None:
default:
break;
}
}
}
return dto;
}
[HttpPost("many")]
[UnitOfWork]
public virtual async Task<List<InventoryLabelDto>> CreateManyAsync(List<InventoryLabelEditInput> inputs)
@ -83,7 +127,7 @@ public class InventoryLabelAppService
[UnitOfWork]
public virtual async Task<List<InventoryLabelDto>> CreateManyByNoCodeAsync(List<InventoryLabelEditInput> inputs)
{
var entitys= ObjectMapper.Map<List<InventoryLabelEditInput>, List<InventoryLabel>>(inputs);
var entitys = ObjectMapper.Map<List<InventoryLabelEditInput>, List<InventoryLabel>>(inputs);
await _repository.InsertManyAsync(entitys).ConfigureAwait(false);
return ObjectMapper.Map<List<InventoryLabel>, List<InventoryLabelDto>>(entitys);
}
@ -129,6 +173,36 @@ public class InventoryLabelAppService
var createInput = ObjectMapper.Map<InventoryLabelWithoutCodeCreateInput, InventoryLabelEditInput>(input);
createInput.Code = numbers[i];
var dto = await base.CreateAsync(createInput).ConfigureAwait(false);
dto.SupplierCode = input.SupplierCode;
dto.PoNumber = input.PoNumber;
dto.Remark = input.Remark;
dto.AsnNumber = input.AsnNumber;
dto.FullBarcodeString = dto.Code;
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(dto.ItemCode).ConfigureAwait(false);
if (itemBasicDto != null)
{
switch (itemBasicDto.ValidityUnit)
{
case EnumValidityUnit.Infinite:
dto.ExpireDate = DateTime.MaxValue;
break;
case EnumValidityUnit.Day:
dto.ExpireDate = DateTime.Now.AddDays(itemBasicDto.Validity);
break;
case EnumValidityUnit.WeeK:
dto.ExpireDate = DateTime.Now.AddDays(itemBasicDto.Validity * 7);
break;
case EnumValidityUnit.Month:
dto.ExpireDate = DateTime.Now.AddMonths(itemBasicDto.Validity);
break;
case EnumValidityUnit.None:
default:
break;
}
}
dtos.Add(dto);
}
return dtos;

4
be/Modules/Shared/src/Win_in.Sfs.Shared.Application/SfsCrudWithDetailsAppServiceBase.cs

@ -512,7 +512,6 @@ public abstract class SfsCrudWithDetailsAppServiceBase<TEntity, TEntityDto, TReq
/// <summary>
/// 导入数据具体实现,可重写
/// </summary>
//[UnitOfWork]
protected virtual async Task<SfsImportResult> ImportInternalAsync(SfsImportRequestInput requestInput, byte[] inputFileBytes)
{
IList<TImportInput> modelList = null;
@ -559,7 +558,7 @@ public abstract class SfsCrudWithDetailsAppServiceBase<TEntity, TEntityDto, TReq
if (entityDict.Any())
{
//加工数据
entityDict=await ImportProcessingEntityAsync(entityDict);
entityDict=await ImportProcessingEntityAsync(entityDict).ConfigureAwait(false);
// 调用批量验证
var entityListStatus = await ValidateImportEntities(entityDict).ConfigureAwait(false);
@ -656,6 +655,7 @@ public abstract class SfsCrudWithDetailsAppServiceBase<TEntity, TEntityDto, TReq
/// <returns></returns>
protected virtual async Task<Dictionary<TEntity, EntityState>> ImportProcessingEntityAsync(Dictionary<TEntity, EntityState> dictionary)
{
await Task.CompletedTask.ConfigureAwait(false);
return dictionary;
}

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

@ -127,6 +127,12 @@ public enum EnumTransSubType
[Display(Name = "安全库存拉动")]
Issue_SafetyStock = 1504,
/// <summary>
/// 直接发料
/// </summary>
[Display(Name = "直接发料")]
Issue_Direct = 1505,
/// <summary>
/// 标准发货
/// </summary>

2
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumMaterialRequestType.cs

@ -28,5 +28,5 @@ public enum EnumMaterialRequestType
//Issue_SfaetyStock = 1504,
[Display(Name = "直接发料")]
Direct_Issue = 1505
Issue_Direct = 1505
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendFromDetailWithFromToDTOBase.cs

@ -79,11 +79,6 @@ public abstract class SfsStoreRecommendFromDetailWithFromToDTOBase : SfsStoreDet
[Display(Name = "推荐仓库")]
public string RecommendFromWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatusDTOBase.cs

@ -79,12 +79,6 @@ public abstract class SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatus
[Display(Name = "推荐仓库")]
public string RecommendFromWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendToDetailWithFromToDTOBase.cs

@ -79,12 +79,6 @@ public abstract class SfsStoreRecommendToDetailWithFromToDTOBase : SfsStoreDetai
[Display(Name = "推荐仓库")]
public string RecommendToWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/DTOs/SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusDTOBase.cs

@ -79,12 +79,6 @@ public abstract class SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusDT
[Display(Name = "推荐仓库")]
public string RecommendToWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendFromDetailWithFromToInputBase.cs

@ -79,12 +79,6 @@ public abstract class SfsStoreRecommendFromDetailWithFromToInputBase : SfsStoreD
[Display(Name = "推荐仓库")]
public string RecommendFromWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatusInputBase.cs

@ -79,12 +79,6 @@ public abstract class SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatus
[Display(Name = "推荐仓库")]
public string RecommendFromWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendToDetailWithFromToInputBase.cs

@ -79,12 +79,6 @@ public abstract class SfsStoreRecommendToDetailWithFromToInputBase : SfsStoreDet
[Display(Name = "推荐仓库")]
public string RecommendToWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Bases/Inputs/SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusInputBase.cs

@ -81,12 +81,6 @@ public abstract class SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusIn
[Display(Name = "推荐仓库")]
public string RecommendToWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/PurchaseReceiptJobs/IPurchaseReceiptJobAppService.cs

@ -42,15 +42,7 @@ public interface IPurchaseReceiptJobAppService
Task<List<PurchaseReceiptJobDetailDTO>> SetInspectWithNotInspectAsync(Guid id);
/// <summary>
/// 按Id获取实体 不走缓存
/// </summary>
/// <param name="id">实体Id</param>
/// <param name="noCache"></param>
/// <returns></returns>
Task<PurchaseReceiptJobDTO> GetNoCacheAsync(Guid id);
/// <summary>
/// 根据收货编号获取收货任务
/// 根据供应商编号获取收货任务
/// </summary>
/// <returns></returns>
Task<List<PurchaseReceiptJobDTO>> GetListBySupplierCodeOnTodayAsync(string supplierCode);

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/CountNotes/Inputs/CountNoteImportInput.cs

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -39,6 +40,13 @@ public class CountNoteImportInput : SfsStoreImportInputBase
[Required(ErrorMessage = "{0}是必填项", AllowEmptyStrings = true)]
public string PackingCode { get; set; }
/// <summary>
/// 库存状态
/// </summary>
[Display(Name = "库存状态")]
[Required(ErrorMessage = "{0}是必填项", AllowEmptyStrings = true)]
public EnumInventoryStatus Status { get; set; }
/// <summary>
/// 托码
/// </summary>

26
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/DeliverNotes/IDeliverNoteAppService.cs

@ -1,4 +1,9 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -9,4 +14,25 @@ public interface IDeliverNoteAppService :
Task<DeliverNoteDTO> CreateWithL7Async(DeliverNoteEditInput input);
Task<PagedResultDto<DeliverNoteDTO>> GetForFisListAsync(
SfsStoreRequestInputBase sfsRequestDTO,
bool includeDetails = false,
CancellationToken cancellationToken = default);
Task<PagedResultDto<DeliverNoteDTO>> GetForNormalListAsync(
SfsStoreRequestInputBase sfsRequestDTO,
bool includeDetails = false,
CancellationToken cancellationToken = default);
Task<PagedResultDto<DeliverNoteDTO>> GetForRAWListAsync(
SfsStoreRequestInputBase sfsRequestDTO,
bool includeDetails = false,
CancellationToken cancellationToken = default);
Task<IActionResult> ExportForNormalAsync(SfsStoreRequestInputBase requestInput);
Task<IActionResult> ExportForRAWAsync(SfsExportRequestInput requestInput);
Task SumPrintAsync(string number);
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/IProductRecycleNoteAppService.cs

@ -7,5 +7,4 @@ public interface IProductRecycleNoteAppService :
{
Task<ProductRecycleNoteDTO> CreateAsync(ProductRecycleNoteEditInput input);
Task<ProductRecycleNoteDTO> CreateWithL7Async(ProductRecycleNoteEditInput input);
}

41
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/DTOs/WipWarehouseAdjustNoteDTO.cs

@ -0,0 +1,41 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 线边调整-实体DTO
/// </summary>
public class WipWarehouseAdjustNoteDTO : SfsStoreDTOBase<WipWarehouseAdjustNoteDetailDTO>, IHasNumber
{
/// <summary>
/// 线边仓调整申请单号
/// </summary>
[Display(Name = "线边仓调整申请单号")]
public string RequestNumber { get; set; }
/// <summary>
/// 任务ID
/// </summary>
[Display(Name = "任务ID")]
public string JobNumber { get; set; }
/// <summary>
/// 调整类型
/// </summary>
[Display(Name = "调整类型")]
public string Type { get; set; }
/// <summary>
/// 已确认
/// </summary>
[Display(Name = "已确认")]
public bool Confirmed { get; set; }
/// <summary>
/// 确认时间
/// </summary>
[Display(Name = "确认时间")]
public DateTime? ConfirmTime { get; set; }
}

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/DTOs/WipWarehouseAdjustNoteDetailDTO.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 线边调整记录-明细表
/// </summary>
public class WipWarehouseAdjustNoteDetailDTO : SfsStoreDetailWithFromToDTOBase
{
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
}

17
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/IWipWarehouseAdjustNoteAppService.cs

@ -0,0 +1,17 @@
using System;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IWipWarehouseAdjustNoteAppService :
ISfsStoreMasterReadOnlyAppServiceBase<WipWarehouseAdjustNoteDTO, SfsStoreRequestInputBase,
WipWarehouseAdjustNoteDetailDTO, SfsStoreRequestInputBase>
{
Task<WipWarehouseAdjustNoteDTO> ConfirmAsync(Guid id);
/// <summary>
/// 新增实体
/// </summary>
/// <param name="input">CreateInput</param>
Task<WipWarehouseAdjustNoteDTO> CreateAsync(WipWarehouseAdjustNoteEditInput input);
}

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/Inputs/WipWarehouseAdjustNoteDetailInput.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 线边仓调整-明细表DTO
/// </summary>
public class WipWarehouseAdjustNoteDetailInput : SfsStoreDetailWithFromToInputBase
{
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
}

48
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/Inputs/WipWarehouseAdjustNoteEditInput.cs

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 新增和更新基础DTO
/// </summary>
public class WipWarehouseAdjustNoteEditInput : SfsStoreCreateOrUpdateInputBase
{
#region Base
/// <summary>
/// 已确认
/// </summary>
[Display(Name = "已确认")]
public bool Confirmed { get; set; }
#endregion
#region Update
/// <summary>
/// 确认时间
/// </summary>
[Display(Name = "确认时间")]
public DateTime? ConfirmTime { get; set; }
#endregion
/// <summary>
/// 线边仓调整申请单号
/// </summary>
[Display(Name = "线边仓调整申请单号")]
public string RequestNumber { get; set; }
/// <summary>
/// 任务ID
/// </summary>
[Display(Name = "任务ID")]
public string JobNumber { get; set; }
/// <summary>
/// 调拨类型
/// </summary>
[Display(Name = "调整类型")]
public string Type { get; set; }
[Display(Name = "详情")]
public List<WipWarehouseAdjustNoteDetailInput> Details { get; set; } = new List<WipWarehouseAdjustNoteDetailInput>();
}

71
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/Inputs/WipWarehouseAdjustNoteImportInput.cs

@ -0,0 +1,71 @@
using System;
using System.ComponentModel.DataAnnotations;
using DocumentFormat.OpenXml.Drawing;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class WipWarehouseAdjustNoteImportInput : SfsStoreImportInputBase
{
/// <summary>
/// 调拨类型
/// </summary>
[Display(Name = "调拨类型")]
[Required(ErrorMessage = "{0}是必填项")]
[ImporterHeader(Name = "调拨类型")]
[ExporterHeader(DisplayName = "调拨类型")]
[ValueMapping("区域内调拨(储位内移库)", EnumTransSubType.Transfer_Inside)]
public string Type { get; set; }
/// <summary>
/// 已确认
/// </summary>
[Display(Name = "已确认")]
[ImporterHeader(IsIgnore = true)]
[Required(ErrorMessage = "{0}是必填项")]
public bool Confirmed { get; set; }
/// <summary>
/// 物料号
/// </summary>
[Display(Name = "物料号")]
[Required(ErrorMessage = "{0}是必填项")]
public string ItemCode { get; set; }
/// <summary>
/// 调拨数量
/// </summary>
[Display(Name = "调拨数量")]
[Required(ErrorMessage = "{0}是必填项")]
public decimal Qty { get; set; }
/// <summary>
/// 调出库位
/// </summary>
[Display(Name = "调出库位")]
[Required(ErrorMessage = "{0}是必填项")]
public string FromLocationCode { get; set; }
/// <summary>
/// 调入库位
/// </summary>
[Display(Name = "调入库位")]
[Required(ErrorMessage = "{0}是必填项")]
public string ToLocationCode { get; set; }
/// <summary>
/// 箱码
/// </summary>
[Display(Name = "箱码")]
[Required(ErrorMessage = "{0}是必填项")]
public string PackingCode { get; set; }
/// <summary>
/// 状态
/// </summary>
[Display(Name = "状态")]
[Required(ErrorMessage = "{0}是必填项")]
public EnumInventoryStatus Status { get; set; }
}

21
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/WipWarehouseAdjustNotes/WipWarehouseAdjustNotePermissions.cs

@ -0,0 +1,21 @@
using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class WipWarehouseAdjustNotePermissions
{
public const string Default = StorePermissions.GroupName + "." + nameof(WipWarehouseAdjustNote);
public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr;
public static void AddWipWarehouseAdjustNotePermission(this PermissionGroupDefinition permissionGroup)
{
var WipWarehouseAdjustNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(WipWarehouseAdjustNote)));
WipWarehouseAdjustNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
WipWarehouseAdjustNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
WipWarehouseAdjustNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
}
}

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/Inputs/PurchaseOrderImportInput.cs

@ -20,12 +20,14 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// </summary>
[Display(Name = "采购订单号")]
[Key]
[Required(ErrorMessage = "{0}是必填项")]
public string Number { get; set; }
/// <summary>
/// 供应商代码
/// </summary>
[Display(Name = "供应商代码")]
[Required(ErrorMessage = "{0}是必填项")]
public string SupplierCode { get; set; }
/// <summary>
@ -52,6 +54,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 订单日期
/// </summary>
[Display(Name = "订单日期")]
[Required(ErrorMessage = "{0}是必填项")]
[ImporterHeader(Name = "订单日期", Format = "yyyy/MM/dd")]
[ExporterHeader(DisplayName = "订单日期", Format = "yyyy/MM/dd")]
public DateTime OrderDate { get; set; }
@ -60,6 +63,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 截止日期
/// </summary>
[Display(Name = "截止日期")]
[Required(ErrorMessage = "{0}是必填项")]
[ImporterHeader(Name = "截止日期", Format = "yyyy/MM/dd")]
[ExporterHeader(DisplayName = "截止日期", Format = "yyyy/MM/dd")]
public DateTime DueDate { get; set; }
@ -81,18 +85,21 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 仓库代码
/// </summary>
[Display(Name = "仓库代码")]
[Required(ErrorMessage = "{0}是必填项")]
public string WarehouseCode { get; set; }
/// <summary>
/// 明细-订单行
/// </summary>
[Display(Name = "明细-订单行")]
[Required(ErrorMessage = "{0}是必填项")]
public string PoLine { get; set; }
/// <summary>
/// 明细-物品代码
/// </summary>
[Display(Name = "明细-物品代码")]
[Required(ErrorMessage = "{0}是必填项")]
public string ItemCode { get; set; }
/// <summary>
@ -106,6 +113,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 数量计量单位
/// </summary>
[Display(Name = "明细-数量计量单位")]
[Required(ErrorMessage = "{0}是必填项")]
public string Uom { get; set; }
/// <summary>
@ -126,6 +134,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 明细-供应商包装单位
/// </summary>
[Display(Name = "明细-供应商包装单位")]
[Required(ErrorMessage = "{0}是必填项")]
public string SupplierPackUom { get; set; }
/// <summary>
@ -146,12 +155,14 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 筹措员代码
/// </summary>
[Display(Name = "明细-筹措员代码")]
[Required(ErrorMessage = "{0}是必填项")]
public string PlanUserCode { get; set; }
/// <summary>
/// 生产批次
/// </summary>
[Display(Name = "明细-生产批次")]
[Required(ErrorMessage = "{0}是必填项")]
public string Lot { get; set; }
/// <summary>
@ -182,6 +193,7 @@ public class PurchaseOrderImportInput : SfsStoreImportInputBase
/// 过期时间
/// </summary>
[Display(Name = "明细-过期时间")]
[Required(ErrorMessage = "{0}是必填项")]
public DateTime ExpireDate { get; set; }
/// <summary>

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

@ -79,6 +79,9 @@ public class StorePermissionDefinitionProvider : PermissionDefinitionProvider
storeGroup.AddReportPermission();
storeGroup.AddDashboardPermission();
storeGroup.AddWipWarehouseAdjustRequestPermission();
storeGroup.AddWipWarehouseAdjustNotePermission();
#region Jobs
storeGroup.AddPurchaseReceiptJobPermission();

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductReceiptRequests/Inputs/ProductReceiptRequestEditInput.cs

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -70,7 +71,7 @@ public class ProductReceiptRequestEditInput : SfsStoreRequestCreateOrUpdateInput
/// 类型
/// </summary>
[Display(Name = "类型")]
public string EnumProductReceiptType { get; set; }
public EnumProductReceiptType Type { get; set; }
/// <summary>
/// 明细列表

15
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/DTOs/WipWarehouseAdjustRequestDTO.cs

@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 线边调整-实体DTO
/// </summary>
public class WipWarehouseAdjustRequestDTO : SfsStoreRequestDTOBase<WipWarehouseAdjustRequestDetailDTO>, IHasNumber
{
/// <summary>
/// 调整类型
/// </summary>
[Display(Name = "调整类型")]
public string Type { get; set; }
}

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/DTOs/WipWarehouseAdjustRequestDetailDTO.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 线边调整-明细表
/// </summary>
public class WipWarehouseAdjustRequestDetailDTO : SfsStoreDetailWithFromToDTOBase
{
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
}

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/IWipWarehouseAdjustRequestAppService.cs

@ -0,0 +1,7 @@
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IWipWarehouseAdjustRequestAppService
: ISfsStoreRequestMasterAppServiceBase<WipWarehouseAdjustRequestDTO, SfsStoreRequestInputBase,
WipWarehouseAdjustRequestEditInput, WipWarehouseAdjustRequestDetailDTO, SfsStoreRequestInputBase>
{
}

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/Inputs/WipWarehouseAdjustRequestDetailInput.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 库存转移记录-明细表
/// </summary>
public class WipWarehouseAdjustRequestDetailInput : SfsStoreDetailWithFromToInputBase
{
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
}

26
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/Inputs/WipWarehouseAdjustRequestEditInput.cs

@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 新增和更新基础DTO
/// </summary>
public class WipWarehouseAdjustRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase
{
#region Base
/// <summary>
/// 调拨类型
/// </summary>
[Display(Name = "调整类型")]
public string Type { get; set; }
/// <summary>
/// 明细列表
/// </summary>
[Display(Name = "明细列表")]
public List<WipWarehouseAdjustRequestDetailInput> Details { get; set; }
#endregion
}

54
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/Inputs/WipWarehouseAdjustRequestImportInput.cs

@ -0,0 +1,54 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class WipWarehouseAdjustRequestImportInput : SfsStoreImportInputBase
{
/// <summary>
/// 调整类型
/// </summary>
[Display(Name = "调整类型")]
[Required(ErrorMessage = "{0}是必填项")]
[ImporterHeader(Name = "调整类型")]
[ExporterHeader(DisplayName = "调整类型")]
[ValueMapping("线边仓调整", EnumTransSubType.CountAdjust_WIP)]
public string Type { get; set; }
/// <summary>
/// 物品编号
/// </summary>
[Display(Name = "物料号")]
[Required(ErrorMessage = "{0}是必填项")]
public string ItemCode { get; set; }
/// <summary>
/// 调整数量
/// </summary>
[Display(Name = "调拨数量")]
[Required(ErrorMessage = "{0}是必填项")]
public decimal Qty { get; set; }
/// <summary>
/// 调整库位
/// </summary>
[Display(Name = "调整库位")]
[Required(ErrorMessage = "{0}是必填项")]
public string FromLocationCode { get; set; }
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
}

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestPermissions.cs

@ -0,0 +1,24 @@
using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class WipWarehouseAdjustRequestPermissions
{
public const string Default = StorePermissions.GroupName + "." + nameof(WipWarehouseAdjustRequest);
public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr;
public static void AddWipWarehouseAdjustRequestPermission(this PermissionGroupDefinition permissionGroup)
{
var WipWarehouseAdjustRequestPermission = permissionGroup.AddPermission(Default,
StorePermissionDefinitionProvider.L(nameof(WipWarehouseAdjustRequest)));
WipWarehouseAdjustRequestPermission.AddChild(Create,
StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
WipWarehouseAdjustRequestPermission.AddChild(Update,
StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
WipWarehouseAdjustRequestPermission.AddChild(Delete,
StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
}
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Win_in.Sfs.Wms.Store.Application.Contracts.csproj

@ -42,10 +42,8 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Notes" />
<Folder Include="Orders" />
<Folder Include="Plans" />
<Folder Include="Requests" />
</ItemGroup>
</Project>

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/CountJobs/CountJobAppService.cs

@ -71,6 +71,7 @@ public class CountJobAppService
throw new AbpValidationException(result.Errors);
}
var entity = ObjectMapper.Map<CountJobDTO, CountJob>(dto);
entity.Number = checkEntity.Number;
await _countJobManager.CompleteAsync(entity, CurrentUser).ConfigureAwait(false);
return dto;
}

95
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/PurchaseReceiptJobs/PurchaseReceiptJobAppService.cs

@ -22,31 +22,21 @@ public class PurchaseReceiptJobAppService :
, IPurchaseReceiptJobAppService
{
private readonly IFileAppService _fileAppService;
private readonly IInspectJobManager _inspectJobManager;
private readonly IInspectRequestAppService _inspectRequestAppService;
private readonly IPurchaseReceiptJobManager _purchaseReceiptJobManager;
private readonly IPurchaseReceiptNoteAppService _purchaseReceiptNoteAppService;
/// <summary>
/// </summary>
/// <param name="repository"></param>
/// <param name="inspectJobManager"></param>
/// <param name="purchaseReceiptJobManager"></param>
/// <param name="purchaseReceiptNoteAppService"></param>
/// <param name="inspectRequestAppService"></param>
/// <param name="fileAppService"></param>
public PurchaseReceiptJobAppService(IPurchaseReceiptJobRepository repository,
IInspectJobManager inspectJobManager,
IPurchaseReceiptJobManager purchaseReceiptJobManager,
IPurchaseReceiptNoteAppService purchaseReceiptNoteAppService,
IInspectRequestAppService inspectRequestAppService,
IFileAppService fileAppService) : base(repository, purchaseReceiptJobManager)
{
_purchaseReceiptJobManager = purchaseReceiptJobManager;
_purchaseReceiptNoteAppService = purchaseReceiptNoteAppService;
_inspectRequestAppService = inspectRequestAppService;
_fileAppService = fileAppService;
_inspectJobManager = inspectJobManager;
}
#region 东阳使用
@ -151,27 +141,28 @@ public class PurchaseReceiptJobAppService :
var dict = await _fileAppService.CreateManyHasDictAsync(input.FilesList).ConfigureAwait(false);
detail.InspectPhotoJson = JsonSerializer.Serialize(dict);
}
if (detail != null)
else
{
detail.FailedReason = input.FailedReason;
detail.MassDefect = input.MassDefect;
detail.PurchaseReceiptInspectStatus = input.PurchaseReceiptInspectStatus;
detail.HandledLot = detail.RecommendLot;
detail.HandledSupplierBatch = detail.RecommendSupplierBatch;
detail.HandledArriveDate = detail.RecommendArriveDate;
detail.HandledProduceDate = detail.RecommendProduceDate;
detail.HandledExpireDate = detail.RecommendExpireDate;
detail.HandledToLocationArea=detail.RecommendToLocationArea;
detail.HandledToLocationGroup=detail.RecommendToLocationGroup;
detail.HandledContainerCode = detail.RecommendContainerCode;
detail.HandledToLocationCode = detail.RecommendToLocationCode;
detail.HandledToLocationErpCode = detail.RecommendToLocationErpCode;
detail.HandledToWarehouseCode = detail.RecommendToWarehouseCode;
detail.HandledPackingCode = detail.RecommendPackingCode;
detail.HandledQty = detail.RecommendQty;
detail.InspectPhotoJson = string.Empty;
}
detail.FailedReason = input.FailedReason;
detail.MassDefect = input.MassDefect;
detail.PurchaseReceiptInspectStatus = input.PurchaseReceiptInspectStatus;
detail.HandledLot = detail.RecommendLot;
detail.HandledSupplierBatch = detail.RecommendSupplierBatch;
detail.HandledArriveDate = detail.RecommendArriveDate;
detail.HandledProduceDate = detail.RecommendProduceDate;
detail.HandledExpireDate = detail.RecommendExpireDate;
detail.HandledToLocationArea = detail.RecommendToLocationArea;
detail.HandledToLocationGroup = detail.RecommendToLocationGroup;
detail.HandledContainerCode = detail.RecommendContainerCode;
detail.HandledToLocationCode = detail.RecommendToLocationCode;
detail.HandledToLocationErpCode = detail.RecommendToLocationErpCode;
detail.HandledToWarehouseCode = detail.RecommendToWarehouseCode;
detail.HandledPackingCode = detail.RecommendPackingCode;
detail.HandledQty = detail.RecommendQty;
var entity = await _repository.UpdateAsync(job).ConfigureAwait(false);
return ObjectMapper.Map<PurchaseReceiptJobDetail, PurchaseReceiptJobDetailDTO>(
@ -182,7 +173,6 @@ public class PurchaseReceiptJobAppService :
/// 按Id获取实体 不走缓存
/// </summary>
/// <param name="id">实体Id</param>
/// <param name="noCache"></param>
/// <returns></returns>
[HttpGet("no-cache/{id}")]
public virtual async Task<PurchaseReceiptJobDTO> GetNoCacheAsync(Guid id)
@ -191,24 +181,10 @@ public class PurchaseReceiptJobAppService :
return ObjectMapper.Map<PurchaseReceiptJob, PurchaseReceiptJobDTO>(entity);
}
/// <summary>
/// 根据供应商编号获取收货任务
/// </summary>
/// <returns></returns>
[HttpPost("get-by-supplier-code-on-today/{supplierCode}")]
public virtual async Task<List<PurchaseReceiptJobDTO>> GetListBySupplierCodeOnTodayAsync(string supplierCode)
{
var purchaseReceiptJobs = await _repository.GetListAsync(p =>
p.SupplierCode == supplierCode &&
p.PlanArriveDate.Year == DateTime.Now.Year &&
p.PlanArriveDate.Month == DateTime.Now.Month &&
p.PlanArriveDate.Day == DateTime.Now.Day);
var dto = ObjectMapper.Map<List<PurchaseReceiptJob>, List<PurchaseReceiptJobDTO>>(purchaseReceiptJobs);
return dto;
}
#endregion
/// <summary>
/// 取消收货
/// </summary>
/// <param name="purchaseReceiptRequestNumber"></param>
[HttpPost("cancel-by-request/{purchaseReceiptRequestNumber}")]
@ -222,6 +198,37 @@ public class PurchaseReceiptJobAppService :
}
}
/// <summary>
/// 根据供应商编号获取收货任务
/// </summary>
/// <returns></returns>
[HttpPost("get-by-supplier-code-on-today/{supplierCode}")]
public virtual async Task<List<PurchaseReceiptJobDTO>> GetListBySupplierCodeOnTodayAsync(string supplierCode)
{
var purchaseReceiptJobs = await _repository.GetListAsync(p =>
p.SupplierCode == supplierCode &&
p.PlanArriveDate.Year == DateTime.Now.Year &&
p.PlanArriveDate.Month == DateTime.Now.Month &&
p.PlanArriveDate.Day == DateTime.Now.Day).ConfigureAwait(false);
var dto = ObjectMapper.Map<List<PurchaseReceiptJob>, List<PurchaseReceiptJobDTO>>(purchaseReceiptJobs);
return dto;
}
///// <summary>
///// 取消请求
///// </summary>
///// <param name="purchaseReceiptRequestNumber"></param>
//[HttpPost("cancel-by-request/{purchaseReceiptRequestNumber}")]
//public virtual async Task CancelByPurchaseReceiptRequestAsync(string purchaseReceiptRequestNumber)
//{
// var entities = await _repository
// .GetListAsync(p => p.PurchaseReceiptRequestNumber == purchaseReceiptRequestNumber).ConfigureAwait(false);
// foreach (var entity in entities)
// {
// await _purchaseReceiptJobManager.CancelAsync(entity).ConfigureAwait(false);
// }
//}
/*
/// <summary>
/// 承接收货任务

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountAdjustNotes/CountAdjustNoteAutoMapperProfile.cs

@ -21,5 +21,14 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<CountAdjustNoteEditInput, CountAdjustNote>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.Remark)
;
}
}

72
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountNotes/CountNoteAppService.cs

@ -1,11 +1,15 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
@ -25,16 +29,80 @@ public class CountNoteAppService :
{
private readonly ICountNoteManager _countNoteManager;
private readonly ICountPlanAppService _countPlanAppService;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
public CountNoteAppService(
ICountNoteRepository repository,
ICountNoteManager countNoteManager, ICountPlanAppService countPlanAppService) : base(repository)
ICountNoteManager countNoteManager, ICountPlanAppService countPlanAppService, ILocationAppService locationAppService, IItemBasicAppService itemBasicAppService) : base(repository)
{
_countNoteManager = countNoteManager;
_countPlanAppService = countPlanAppService;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
}
#region 东阳
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override async Task<Dictionary<CountNote, EntityState>> ImportProcessingEntityAsync(Dictionary<CountNote, EntityState> dictionary)
{
var dataList = dictionary.Select(p => p.Key);//查询所有的导入盘点数据
var resultDictionary = new Dictionary<CountNote, EntityState>();
var allCountPlanNumbersList= dataList.GroupBy(p => p.CountPlanNumber).Select(p => p.Key).ToList();
//特殊处理 因为盘点记录可以重复导入 所以每次导入前删除调原有记录
foreach (var countPlanNumber in allCountPlanNumbersList)
{
var countPlanDto = await _countPlanAppService.GetByNumberAsync(countPlanNumber).ConfigureAwait(false);
if (countPlanDto.RequestType != CountPlanRequestType.Import)
{
throw new UserFriendlyException("非Excel盘点执行方式不能使用导入");
}
await _repository.DeleteAsync(p => p.CountPlanNumber == countPlanNumber).ConfigureAwait(false);
}
foreach (var countNote in dataList)
{
countNote.Worker = CurrentUser.GetUserName();
countNote.CreatorId = CurrentUser.Id;
countNote.BeginTime= DateTime.Now;
countNote.Adjusted = false;
countNote.EndTime=DateTime.Now;
countNote.Stage = EnumCountStage.Audit;
foreach (var detail in countNote.Details)
{
var locationDto= await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
var itemcBasicDto=await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
detail.CountLabel =Guid.NewGuid().ToString();
detail.LocationArea = locationDto.AreaCode;
detail.LocationGroup= locationDto.LocationGroupCode;
detail.LocationErpCode= locationDto.ErpLocationCode;
detail.WarehouseCode= locationDto.WarehouseCode;
detail.ItemCode = itemcBasicDto.Code;
detail.ItemDesc1 = itemcBasicDto.Desc1;
detail.ItemDesc2 = itemcBasicDto.Desc2;
detail.ItemName= itemcBasicDto.Name;
detail.Uom = itemcBasicDto.BasicUom;
}
resultDictionary.Add(countNote,EntityState.Added);
}
return resultDictionary;
}
#endregion
/// <summary>
/// 新增接口
/// </summary>

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/CountNotes/CountNoteAutoMapperProfile.cs

@ -69,7 +69,6 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.Adjusted)
.Ignore(X => X.StdPackQty)
.Ignore(x => x.ItemName).Ignore(x => x.ItemDesc1).Ignore(x => x.ItemDesc2)
.Ignore(x => x.Status)
.Ignore(x => x.SupplierBatch)
.Ignore(x => x.ArriveDate)
.Ignore(x => x.ProduceDate)

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/IssueNoteAppService.cs

@ -8,7 +8,9 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Win_in.Sfs.Shared.Domain;
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;
@ -50,9 +52,11 @@ public class IssueNoteAppService :
[HttpPost("confirm/{id}")]
public virtual async Task<IssueNoteDTO> ConfirmAsync(Guid id)
{
var entity = await _issueNoteManager.ConfirmAsync(id).ConfigureAwait(false);
var dto = ObjectMapper.Map<IssueNote, IssueNoteDTO>(entity);
return dto;
var issueNote= await _repository.GetAsync(id).ConfigureAwait(false);
issueNote.Confirmed = true;
issueNote=await _repository.UpdateAsync(issueNote).ConfigureAwait(false);
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<IssueNote>(issueNote), false).ConfigureAwait(false);
return ObjectMapper.Map<IssueNote, IssueNoteDTO>(issueNote);
}
[HttpPost("confirm-by-number/{number}")]

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ItemTransformNotes/ItemTransformNoteAppService.cs

@ -12,7 +12,7 @@ namespace Win_in.Sfs.Wms.Store.Application;
/// 回收料调整记录
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}item-transfrom-note")]
[Route($"{StoreConsts.RootPath}item-transform-note")]
public class ItemTransformNoteAppService :
SfsStoreWithDetailsAppServiceBase<ItemTransformNote, ItemTransformNoteDTO, SfsStoreRequestInputBase, ItemTransformNoteEditInput,
ItemTransformNoteDetail, ItemTransformNoteDetailDTO, SfsStoreRequestInputBase, ItemTransformNoteImportInput>,

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ItemTransformNotes/ItemTransformNoteAutoMapperProfile.cs

@ -22,5 +22,15 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<ItemTransformNoteEditInput, ItemTransformNote>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.ConcurrencyStamp)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id)
.Ignore(x=>x.ExtraProperties)
.Ignore(x => x.Remark)
;
}
}

17
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs

@ -54,23 +54,6 @@ public class ProductRecycleNoteAppService :
return dto;
}
/// <summary>
/// 新增退货接口
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("create-with-l7")]
public virtual async Task<ProductRecycleNoteDTO> CreateWithL7Async(ProductRecycleNoteEditInput input)
{
var entity = ObjectMapper.Map<ProductRecycleNoteEditInput, ProductRecycleNote>(input);
await _productRecycleNoteManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<ProductRecycleNote, ProductRecycleNoteDTO>(entity);
return dto;
}
[HttpGet("note-and-back-flush/{id}")]
public virtual async Task<ProductRecycleNoteDTO> GetNoteAndBackFlushAsync(Guid id)
{

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductionReturnNotes/ProductionReturnNoteAppService.cs

@ -28,7 +28,7 @@ public class ProductionReturnNoteAppService :
}
/// <summary>
/// 新增接口
/// 新增实体
/// </summary>
/// <param name="input"></param>
/// <returns></returns>

47
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/RecycledMaterialReceiptNotes/RecycledMaterialReceiptNoteAppService.cs

@ -1,6 +1,11 @@
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Bibliography;
using FluentValidation.Validators;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
@ -22,24 +27,54 @@ public class RecycledMaterialReceiptNoteAppService :
{
private readonly IRecycledMaterialReceiptNoteManager _RecycledMaterialReceiptNoteManager;
private readonly ILocationCapacityAppService _locationCapacityAppService;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
public RecycledMaterialReceiptNoteAppService(IRecycledMaterialReceiptNoteRepository repository,
IRecycledMaterialReceiptNoteManager RecycledMaterialReceiptNoteManager,
ILocationCapacityAppService locationCapacityAppService) : base(repository)
ILocationCapacityAppService locationCapacityAppService,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService) : base(repository)
{
_RecycledMaterialReceiptNoteManager = RecycledMaterialReceiptNoteManager;
_locationCapacityAppService = locationCapacityAppService;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
}
/// <summary>
/// 新增实体
/// </summary>
/// <param name="input">CreateInput</param>
[HttpPost("")]
//[Authorize(RecycledMaterialReceiptNotePermissions.Create)]
public override async Task<RecycledMaterialReceiptNoteDTO> CreateAsync(RecycledMaterialReceiptNoteEditInput input)
{
var entity = ObjectMapper.Map<RecycledMaterialReceiptNoteEditInput, RecycledMaterialReceiptNote>(input);
await _RecycledMaterialReceiptNoteManager.CreateAsync(entity).ConfigureAwait(false);
var entity= ObjectMapper.Map<RecycledMaterialReceiptNoteEditInput, RecycledMaterialReceiptNote>(input);
var dto = ObjectMapper.Map<RecycledMaterialReceiptNote, RecycledMaterialReceiptNoteDTO>(entity);
entity.Number=string.IsNullOrEmpty(input.Number)
? await GenerateNumberAsync(nameof(RecycledMaterialReceiptNote), input.ActiveDate)
.ConfigureAwait(false)
: input.Number;
return dto;
foreach (var detail in entity.Details)
{
var detailNumber = await GenerateNumberAsync(nameof(RecycledMaterialReceiptNote), input.ActiveDate)
.ConfigureAwait(false);
detail.Number=detailNumber;
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
detail.LocationErpCode = locationDto.ErpLocationCode;
detail.LocationArea = locationDto.AreaCode;
detail.LocationGroup = locationDto.LocationGroupCode;
detail.WarehouseCode=locationDto.WarehouseCode;
var itemBasicDto=await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
detail.StdPackQty = itemBasicDto.StdPackQty;
detail.Uom = itemBasicDto.BasicUom;
}
entity=await _repository.InsertAsync(entity).ConfigureAwait(false);
await LocalEventBus.PublishAsync(new SfsCreatedEntityEventData<RecycledMaterialReceiptNote>(entity),false).ConfigureAwait(false);
return ObjectMapper.Map<RecycledMaterialReceiptNote, RecycledMaterialReceiptNoteDTO>(entity);
}
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/RecycledMaterialReceiptNotes/RecycledMaterialReceiptNoteAutoMapperProfile.cs

@ -22,5 +22,14 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap< RecycledMaterialReceiptNoteEditInput,RecycledMaterialReceiptNote > ()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.Remark)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
;
}
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedReceiptNotes/UnplannedReceiptNoteAutoMapperProfile.cs

@ -21,5 +21,14 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<UnplannedReceiptNoteEditInput, UnplannedReceiptNote>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id)
.Ignore(x => x.Remark)
.Ignore(x => x.ExtraProperties)
;
}
}

136
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/WipWarehouseAdjustNotes/WipWarehouseAdjustNoteAppService.cs

@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
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;
namespace Win_in.Sfs.Wms.Store.Application;
/// <summary>
/// 线边调整记录
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}wip-warehouse-adjust-note")]
public class WipWarehouseAdjustNoteAppService : SfsStoreWithDetailsAppServiceBase
<WipWarehouseAdjustNote, WipWarehouseAdjustNoteDTO, SfsStoreRequestInputBase, WipWarehouseAdjustNoteEditInput, WipWarehouseAdjustNoteDetail,
WipWarehouseAdjustNoteDetailDTO, SfsStoreRequestInputBase, WipWarehouseAdjustNoteImportInput>,
IWipWarehouseAdjustNoteAppService
{
private readonly IWipWarehouseAdjustNoteManager _WipWarehouseAdjustNoteManager;
private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService;
public WipWarehouseAdjustNoteAppService(
IWipWarehouseAdjustNoteRepository repository,
IWipWarehouseAdjustNoteManager WipWarehouseAdjustNoteManager,
IBalanceAppService balanceAppService,
ILocationAppService locationAppService) : base(repository)
{
_WipWarehouseAdjustNoteManager = WipWarehouseAdjustNoteManager;
_balanceAppService = balanceAppService;
_locationAppService = locationAppService;
}
#region 东阳使用
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override async Task<Dictionary<WipWarehouseAdjustNote, EntityState>> ImportProcessingEntityAsync(
Dictionary<WipWarehouseAdjustNote, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var WipWarehouseAdjustNote in addList)
{
if (WipWarehouseAdjustNote.Type == EnumTransSubType.Transfer_Inside.GetDisplayName()) //储位内调拨
{
WipWarehouseAdjustNote.Type = EnumTransSubType.Transfer_Inside.ToString();//重点 需要转换
foreach (var detail in WipWarehouseAdjustNote.Details)
{
var balanceDto = await _balanceAppService.GetByItemLocationAndPackingAsync(detail.FromPackingCode,
detail.ItemCode, detail.FromLocationCode).ConfigureAwait(false);
var toLocationDto = await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false);
detail.ItemCode = balanceDto.ItemCode;
detail.ArriveDate = balanceDto.ArriveDate;
detail.ItemDesc1 = balanceDto.ItemDesc1;
detail.ItemDesc2 = balanceDto.ItemDesc2;
detail.ItemName = balanceDto.ItemName;
detail.ProduceDate = balanceDto.ProduceDate;
detail.Qty = balanceDto.Qty;
detail.Uom = balanceDto.Uom;
detail.ExpireDate = balanceDto.ExpireDate;
detail.StdPackQty = balanceDto.StdPackQty;
detail.SupplierBatch = balanceDto.SupplierBatch;
detail.FromLocationArea = balanceDto.LocationArea;
detail.FromContainerCode = balanceDto.ContainerCode;
detail.FromLocationErpCode = balanceDto.LocationErpCode;
detail.FromLocationGroup = balanceDto.LocationGroup;
detail.FromPackingCode = balanceDto.PackingCode;
detail.FromLocationArea = balanceDto.LocationArea;
detail.FromStatus = balanceDto.Status;
detail.FromWarehouseCode = balanceDto.WarehouseCode;
detail.FromLot = balanceDto.Lot;
detail.ToLocationArea = toLocationDto.AreaCode;
detail.ToLocationErpCode = toLocationDto.LocationGroupCode;
detail.ToLocationGroup = toLocationDto.LocationGroupCode;
detail.ToWarehouseCode = toLocationDto.WarehouseCode;
detail.ToContainerCode = balanceDto.ContainerCode;
detail.ToPackingCode = balanceDto.PackingCode;
detail.ToLocationArea = balanceDto.LocationArea;
detail.ToStatus = balanceDto.Status;
detail.ToLot = balanceDto.Lot;
}
}
}
return dictionary;
}
/// <summary>
/// 确认对应的记录单
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("confirm/{id}")]
public virtual async Task<WipWarehouseAdjustNoteDTO> ConfirmAsync(Guid id)
{
var entity = await _WipWarehouseAdjustNoteManager.ConfirmAsync(id).ConfigureAwait(false);
var dto = ObjectMapper.Map<WipWarehouseAdjustNote, WipWarehouseAdjustNoteDTO>(entity);
return dto;
}
/// <summary>
/// 新增实体
/// </summary>
/// <param name="input">CreateInput</param>
[HttpPost("")]
public override async Task<WipWarehouseAdjustNoteDTO> CreateAsync(WipWarehouseAdjustNoteEditInput input)
{
var entity = ObjectMapper.Map<WipWarehouseAdjustNoteEditInput, WipWarehouseAdjustNote>(input);
entity=await _WipWarehouseAdjustNoteManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<WipWarehouseAdjustNote, WipWarehouseAdjustNoteDTO>(entity);
return dto;
}
#endregion
}

88
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/WipWarehouseAdjustNotes/WipWarehouseAdjustNoteAutoMapperProfile.cs

@ -0,0 +1,88 @@
using AutoMapper;
using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application;
public partial class StoreApplicationAutoMapperProfile : Profile
{
private void WipWarehouseAdjustNoteMapperProfile()
{
CreateMap<WipWarehouseAdjustNote, WipWarehouseAdjustNoteDTO>()
.ReverseMap();
CreateMap<WipWarehouseAdjustNoteEditInput, WipWarehouseAdjustNote>()
.IgnoreAuditedObjectProperties()
;
CreateMap<WipWarehouseAdjustNoteDetailInput, WipWarehouseAdjustNoteDetail>()
.IgnoreAuditedObjectProperties()
;
CreateMap<WipWarehouseAdjustNoteDetailDTO, WipWarehouseAdjustNoteDetail>();
CreateMap<WipWarehouseAdjustNoteDetail, WipWarehouseAdjustNoteDetailDTO>();
CreateMap<WipWarehouseAdjustNoteEditInput, WipWarehouseAdjustNote>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.Id)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.Remark)
.Ignore(x => x.TenantId)
.Ignore(x => x.ConcurrencyStamp)
;
CreateMap<WipWarehouseAdjustNoteDetailInput, WipWarehouseAdjustNoteDetail>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.MasterID)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<WipWarehouseAdjustNoteImportInput, WipWarehouseAdjustNote>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.ConfirmTime)
.Ignore(x => x.RequestNumber)
.Ignore(x => x.JobNumber)
.Ignore(x => x.ActiveDate)
.Ignore(x => x.Remark)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.ConcurrencyStamp)
.Ignore(x => x.Details)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<WipWarehouseAdjustNoteImportInput, WipWarehouseAdjustNoteDetail>()
.IgnoreAuditedObjectProperties()
.ForMember(x => x.ToPackingCode, y => y.MapFrom(d => d.PackingCode))
.ForMember(x => x.FromPackingCode, y => y.MapFrom(d => d.PackingCode))
.ForMember(x => x.FromStatus, y => y.MapFrom(d => d.Status))
.ForMember(x => x.ToStatus, y => y.MapFrom(d => d.Status))
.Ignore(x => x.FromLocationGroup)
.Ignore(x => x.FromLocationArea)
.Ignore(x => x.FromLocationErpCode)
.Ignore(x => x.FromWarehouseCode)
.Ignore(x => x.ToLocationArea)
.Ignore(x => x.ToLocationGroup)
.Ignore(x => x.ToLocationErpCode)
.Ignore(x => x.ToWarehouseCode)
.Ignore(x => x.Reason)
.Ignore(x => x.SupplierBatch).Ignore(x => x.ArriveDate).Ignore(x => x.ProduceDate).Ignore(x => x.ExpireDate)
.Ignore(x => x.Remark)
.Ignore(x => x.ItemName)
.Ignore(x => x.ItemDesc1)
.Ignore(x => x.ItemDesc2)
.Ignore(x => x.FromContainerCode)
.Ignore(x => x.ToContainerCode)
.Ignore(x => x.FromLot)
.Ignore(x => x.ToLot)
.Ignore(x => x.StdPackQty)
.Ignore(x => x.Uom)
.Ignore(x => x.MasterID)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
}
}

102
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs

@ -3,23 +3,15 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office2010.ExcelAc;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Uow;
using Volo.Abp.Users;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
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 PurchaseOrderDetail = Win_in.Sfs.Wms.Store.Domain.PurchaseOrderDetail;
namespace Win_in.Sfs.Wms.Store.Application;
@ -34,7 +26,7 @@ public class PurchaseOrderAppService :
private readonly IPurchaseOrderManager _purchaseOrderManager;
private readonly ISupplierAppService _supplierAppService;
private readonly IItemBasicAppService _itemBasicAppService;
public PurchaseOrderAppService(
IPurchaseOrderRepository repository,
IPurchaseOrderManager purchaseOrderManager,
@ -53,30 +45,31 @@ public class PurchaseOrderAppService :
#region 东阳使用
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override async Task<Dictionary<PurchaseOrder, EntityState>> ImportProcessingEntityAsync(
Dictionary<PurchaseOrder, EntityState> dictionary)
{
var addList= dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var purchaseOrder in addList)
{
purchaseOrder.CreatorId = CurrentUser.Id;
purchaseOrder.Worker = CurrentUser.Name;
var supplierDto=await _supplierAppService.GetByCodeAsync(purchaseOrder.SupplierCode).ConfigureAwait(false);
var supplierDto =
await _supplierAppService.GetByCodeAsync(purchaseOrder.SupplierCode).ConfigureAwait(false);
purchaseOrder.SupplierCode = supplierDto.Code;
purchaseOrder.SupplierAddress = supplierDto.Address;
purchaseOrder.SupplierName= supplierDto.Name;
purchaseOrder.SupplierName = supplierDto.Name;
foreach (var detail in purchaseOrder.Details)
{
var itemBasicDto= await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
detail.ItemName= itemBasicDto.Name;
detail.ItemName = itemBasicDto.Name;
detail.ItemDesc1 = itemBasicDto.Desc1;
detail.ItemDesc2 = itemBasicDto.Desc2;
}
@ -87,10 +80,8 @@ public class PurchaseOrderAppService :
#endregion
/// <summary>
/// 【创建】采购订单
/// 【创建】采购订单
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
@ -111,7 +102,7 @@ public class PurchaseOrderAppService :
}
/// <summary>
/// 【批量创建】采购订单
/// 【批量创建】采购订单
/// </summary>
/// <param name="inputs"></param>
/// <returns></returns>
@ -163,8 +154,6 @@ public class PurchaseOrderAppService :
await _repository.UpdateAsync(entity).ConfigureAwait(false);
}
#region Function
[HttpPost("complete/{number}")]
public async Task<PurchaseOrderDTO> CompleteAsync(string number)
{
@ -173,9 +162,6 @@ public class PurchaseOrderAppService :
}
[HttpPost("cancel/{id}")]
#endregion
[HttpPost("{id}/detail/open/{detailId}")]
public virtual async Task OpenDetailAsync(Guid id, Guid detailId)
{
@ -188,13 +174,6 @@ public class PurchaseOrderAppService :
await _purchaseOrderManager.CloseDetailAsync(id, detailId).ConfigureAwait(false);
}
[HttpPost("check-status")]
public virtual async Task CheckStatusAsync(string number)
{
await Task.CompletedTask.ConfigureAwait(false);
throw new NotImplementedException();
}
[HttpPost("upsert")]
public virtual async Task UpsertAsync(PurchaseOrderEditInput input)
{
@ -202,6 +181,27 @@ public class PurchaseOrderAppService :
await _repository.UpsertAsync(entity).ConfigureAwait(false);
}
[HttpGet("get-list-by-item-code")]
public virtual async Task<List<PurchaseOrderDTO>> GetListByItemCodeAsync(string itemCode)
{
var entitys = await _repository.GetListAsync(p => p.Details.Any(y => y.ItemCode == itemCode))
.ConfigureAwait(false);
var dtos = ObjectMapper.Map<List<PurchaseOrder>, List<PurchaseOrderDTO>>(entitys);
return dtos;
}
#region 校验
[HttpPost("check-status")]
public virtual async Task CheckStatusAsync(string number)
{
await Task.CompletedTask.ConfigureAwait(false);
throw new NotImplementedException();
}
protected virtual async Task CheckImportInputBusinessAsync(PurchaseOrderImportInput importInput,
EnumImportMethod importMethod, List<ValidationResult> validationRresult)
{
@ -231,47 +231,17 @@ public class PurchaseOrderAppService :
Check.NotNull(item, "供应商代码", "供应商不存在");
}
protected override async Task<PurchaseOrder> GetEntityAsync(PurchaseOrderImportInput importInput)
{
return await _repository.FindAsync(t => t.Number == importInput.Number).ConfigureAwait(false);
}
protected virtual async Task ImportDataAsync(List<PurchaseOrder> entites, List<PurchaseOrder> deleteEntities)
{
await _purchaseOrderManager.ImportDataAsync(entites, deleteEntities).ConfigureAwait(false);
}
protected override Func<PurchaseOrderImportInput, object> GetEntityExpression()
{
return t => t.Number;
}
[HttpGet("get-list-by-item-code")]
public virtual async Task<List<PurchaseOrderDTO>> GetListByItemCodeAsync(string itemCode)
{
var entitys = await _repository.GetListAsync(p => p.Details.Any(y => y.ItemCode == itemCode))
.ConfigureAwait(false);
var dtos = ObjectMapper.Map<List<PurchaseOrder>, List<PurchaseOrderDTO>>(entitys);
return dtos;
}
#endregion
[HttpGet("get-list-by-supplier-code-and-item-code")]
public virtual async Task<List<PurchaseOrderDTO>> GetListBySupplierCodeAsync(string supplierCode, string itemCode)
{
var entitys = await _repository.GetListAsync(p => p.Details.Any(y => y.ItemCode == itemCode) && p.SupplierCode == supplierCode);
List<PurchaseOrder> list = new List<PurchaseOrder>();
var entitys = await _repository.GetListAsync(p => p.Details.Any(y => y.ItemCode == itemCode) && p.SupplierCode == supplierCode).ConfigureAwait(false);
foreach (var entity in entitys)
{
var purchaseOrder = await _repository.GetAsync(entity.Id);
list.Add(purchaseOrder);
}
var dtos = ObjectMapper.Map<List<PurchaseOrder>, List<PurchaseOrderDTO>>(list);
var dtos = ObjectMapper.Map<List<PurchaseOrder>, List<PurchaseOrderDTO>>(entitys);
return dtos;
}
}

19
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Plans/CountPlans/CountPlanAppService.cs

@ -106,7 +106,7 @@ public class CountPlanAppService :
public virtual async Task UpdateByJobAsync(CountPlanEditInput input)
{
var entity = ObjectMapper.Map<CountPlanEditInput, CountPlan>(input);
entity.Number = input.Number;
await _countPlanManager.CompleteByJobAsync(entity).ConfigureAwait(false);
}
@ -121,23 +121,6 @@ public class CountPlanAppService :
await _countPlanManager.CompleteAsync(id, type).ConfigureAwait(false);
}
/*
/// <summary>
/// 校正库存
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("adjust/{id}")]
public virtual async Task AdjustAsync(Guid id)
{
var entity = await _repository.FindAsync(id);
Check.NotNull(entity, EntityClassName);
await _countPlanManager.AdjustAsync(entity);
}
*/
[HttpPost("check-status")]
public virtual async Task CheckStatusAsync(string number)
{

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Plans/CountPlans/CountPlanAutoMapperProfile.cs

@ -39,5 +39,14 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<CountPlanEditInput, CountPlan>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.Remark)
;
}
}

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Plans/SupplierAsns/SupplierAsnAppService.cs

@ -73,7 +73,7 @@ public class SupplierAsnAppService :
/// <summary>
/// 生成ASN订单号
/// </summary>
/// <param name="input"></param>
/// <param name="activeDate"></param>
/// <returns></returns>
[HttpPost("generate-supplierasn-number")]
public async Task<string> GenerateSupplierAsnNumberAsync(DateTime activeDate)
@ -101,7 +101,7 @@ public class SupplierAsnAppService :
{
var entities = await _repository.GetListAsync(
p => p.PlanArriveDate.Year == DateTime.Now.Year && p.PlanArriveDate.Month == DateTime.Now.Month &&
p.PlanArriveDate.Day == DateTime.Now.Day, true);
p.PlanArriveDate.Day == DateTime.Now.Day, true).ConfigureAwait(false);
return ObjectMapper.Map<List<SupplierAsn>, List<SupplierAsnDTO>>(entities);
}

18
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/CountAdjustRequests/CountAdjustRequestAppService.cs

@ -25,22 +25,4 @@ public abstract class CountAdjustRequestAppService :
{
_countAdjustRequestManager = countAdjustRequestManager;
}
/// <summary>
/// 【创建】盘点调整申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("")]
//[Authorize(CountAdjustRequestPermissions.Create)]
public override async Task<CountAdjustRequestDTO> CreateAsync(CountAdjustRequestEditInput input)
{
var entity = ObjectMapper.Map<CountAdjustRequestEditInput, CountAdjustRequest>(input);
await _countAdjustRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<CountAdjustRequest, CountAdjustRequestDTO>(entity);
return dto;
}
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/DeliverRequests/DeliverRequestAppService.cs

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Basedata.Application.Contracts;
@ -29,7 +30,6 @@ public class DeliverRequestAppService :
{
private readonly IDeliverRequestManager _deliverRequestManager;
private readonly IAreaAppService _areaApp;
private readonly ICustomerAppService _customerApp;
private readonly ICustomerAddressAppService _customerAddressApp;

96
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/DeliverRequests/DeliverRequestFisAppService.cs

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
@ -32,22 +33,97 @@ public class DeliverRequestFisAppService :
private readonly IAreaAppService _areaApp;
private readonly ICustomerAppService _customerApp;
private readonly ICustomerAddressAppService _customerAddressApp;
private readonly ITransactionTypeAppService _transactionTypeAppService;
private readonly IBalanceAppService _balanceAppService;
private readonly IItemBasicAppService _itemBasicAppService;
public DeliverRequestFisAppService(
IDeliverRequestRepository repository,
IDeliverRequestManager deliverRequestManager,
IAreaAppService areaApp,
ICustomerAppService customerApp,
ICustomerAddressAppService customerAddressApp
)
ICustomerAddressAppService customerAddressApp,
ITransactionTypeAppService transactionTypeAppService,
IBalanceAppService balanceAppService,
IItemBasicAppService itemBasicAppService)
: base(repository, deliverRequestManager)
{
_deliverRequestManager = deliverRequestManager;
_areaApp = areaApp;
_customerApp = customerApp;
_customerAddressApp = customerAddressApp;
_transactionTypeAppService = transactionTypeAppService;
_balanceAppService = balanceAppService;
_itemBasicAppService = itemBasicAppService;
}
#region 东阳
private async Task SetRequestAutoPropertiesAsync(DeliverRequest entity)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Deliver, EnumTransSubType.Deliver_FIS).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
entity.DeliverRequestType = EnumDeliverRequestType.FIS;
}
protected override async Task<Dictionary<DeliverRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<DeliverRequest, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var itemTransformRequest in addList)
{
itemTransformRequest.Worker = CurrentUser.GetUserName();
itemTransformRequest.CreatorId = CurrentUser.Id;
itemTransformRequest.DeliverRequestType = EnumDeliverRequestType.FIS;
await SetRequestAutoPropertiesAsync(itemTransformRequest).ConfigureAwait(false);
foreach (var detail in itemTransformRequest.Details)
{
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
var transactionType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Deliver,
EnumTransSubType.Deliver_FIS)
.ConfigureAwait(false);
var balances = await _balanceAppService.GetRecommendBalancesAsync(
new RecommendBalanceRequestInput()
{
ItemCode = itemBasicDto.Code,
Qty = detail.Qty,
LocationTypes = transactionType.OutLocationTypes,
LocationAreas = new List<string>() { detail.AreaCode },
Statuses = transactionType.OutInventoryStatuses
}).ConfigureAwait(false);
var balanceSumQty = balances.Sum(t => t.Qty);
if (balanceSumQty < detail.Qty)
{
throw new UserFriendlyException($"物料号 {detail.ItemCode} " +
$"在库位类型 {transactionType.OutLocationTypes.JoinAsString(",")}," +
$"库区 {detail.AreaCode} " +
$"状态 {transactionType.OutInventoryStatuses.JoinAsString(",")}" +
$"库存余额 {balanceSumQty} 小于 {detail.Qty}。");
}
detail.ItemDesc1 = itemBasicDto.Desc1;
detail.ItemDesc2 = itemBasicDto.Desc2;
detail.ItemName = itemBasicDto.Name;
detail.Uom = itemBasicDto.BasicUom;
}
}
return dictionary;
}
#endregion
[HttpPost("list")]
public override Task<PagedResultDto<DeliverRequestDTO>> GetPagedListByFilterAsync(
SfsStoreRequestInputBase sfsRequestInput,
@ -55,7 +131,7 @@ public class DeliverRequestFisAppService :
CancellationToken cancellationToken = default)
{
sfsRequestInput.Condition.Filters.Add(
new Filter(nameof(DeliverRequest.DeliverRequestType), "2"));
new Filter(nameof(DeliverRequest.DeliverRequestType), "FIS"));
return base.GetPagedListByFilterAsync(sfsRequestInput, includeDetails, cancellationToken);
}
@ -285,19 +361,7 @@ public class DeliverRequestFisAppService :
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
private async Task SetRequestAutoPropertiesAsync(DeliverRequest entity)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Deliver, EnumTransSubType.Deliver_FIS).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
entity.DeliverRequestType = EnumDeliverRequestType.FIS;
}
#endregion
}

60
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs

@ -6,10 +6,13 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Win_in.Sfs.Label.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
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;
@ -20,7 +23,7 @@ namespace Win_in.Sfs.Wms.Store.Application;
/// 回收料调整申请
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}item-transfrom-request")]
[Route($"{StoreConsts.RootPath}item-transform-request")]
public class ItemTransformRequestAppService :
SfsStoreRequestAppServiceBase<ItemTransformRequest, ItemTransformRequestDTO, SfsStoreRequestInputBase, ItemTransformRequestEditInput, ItemTransformRequestDetail, ItemTransformRequestDetailDTO, SfsStoreRequestInputBase, ItemTransformRequestImportInput>,
IItemTransformRequestAppService
@ -29,14 +32,17 @@ public class ItemTransformRequestAppService :
private readonly IItemTransformRequestManager _manager;
private readonly IInventoryLabelAppService _inventoryLabelAppService;
private readonly IBalanceAppService _balanceAppService;
public ItemTransformRequestAppService(
IItemTransformRequestRepository repository
, IItemTransformRequestManager manager,
IInventoryLabelAppService inventoryLabelAppService) : base(repository, manager)
IItemTransformRequestRepository repository,
IItemTransformRequestManager manager,
IInventoryLabelAppService inventoryLabelAppService,
IBalanceAppService balanceAppService) : base(repository, manager)
{
_manager = manager;
_inventoryLabelAppService = inventoryLabelAppService;
_balanceAppService = balanceAppService;
}
/// <summary>
@ -57,6 +63,52 @@ public class ItemTransformRequestAppService :
return dto;
}
protected override async Task<Dictionary<ItemTransformRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<ItemTransformRequest, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var itemTransformRequest in addList)
{
itemTransformRequest.Worker = CurrentUser.GetUserName();
itemTransformRequest.CreatorId = CurrentUser.Id;
foreach (var detail in itemTransformRequest.Details)
{
var fromLocationDto= await LocationAclService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false);
var toLocationDto= await LocationAclService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false);
var itemBasicDto=await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
var balanceDto= await _balanceAppService.GetByItemLocationAndPackingAsync(detail.FromPackingCode, detail.ItemCode,
detail.FromLocationCode).ConfigureAwait(false);
detail.FromLocationArea = fromLocationDto.AreaCode;
detail.FromLocationErpCode = fromLocationDto.ErpLocationCode;
detail.FromLocationGroup = fromLocationDto.LocationGroupCode;
detail.FromWarehouseCode = fromLocationDto.WarehouseCode;
detail.FromSupplierBatch = balanceDto.SupplierBatch;
detail.FromLot = balanceDto.Lot;
detail.FromStatus = balanceDto.Status;
detail.ToSupplierBatch = string.Empty;
detail.ToLot = balanceDto.Lot;
detail.ToStatus = balanceDto.Status;
detail.ToLocationArea = toLocationDto.AreaCode;
detail.ToLocationErpCode = toLocationDto.ErpLocationCode;
detail.ToLocationGroup = toLocationDto.LocationGroupCode;
detail.ToWarehouseCode = toLocationDto.WarehouseCode;
detail.ItemDesc1 = itemBasicDto.Desc1;
detail.ItemDesc2= itemBasicDto.Desc2;
detail.ItemName= itemBasicDto.Name;
detail.Uom = itemBasicDto.BasicUom;
}
}
return dictionary;
}
protected virtual async Task ImportDataAsync(List<ItemTransformRequest> entites, List<ItemTransformRequest> deleteEntities)
{
await _manager.ImportDataAsync(entites, deleteEntities).ConfigureAwait(false);

42
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs

@ -42,7 +42,7 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
public MaterialRequestAppService(
IMaterialRequestRepository repository,
IMaterialRequestManager materialRequestManager,
@ -50,7 +50,8 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp
, ILocationAppService locationAppService
, IItemBasicAppService itemBasicAppService)
, IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService)
: base(repository, materialRequestManager)
{
_materialRequestManager = materialRequestManager;
@ -59,6 +60,7 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
_areaApp = areaApp;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
}
#region 东阳使用
@ -93,7 +95,7 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
}
}
return await base.ImportProcessingEntityAsync(dictionary).ConfigureAwait(false);
return dictionary;
}
public override async Task<MaterialRequestDTO> HandleAsync(Guid id)
@ -170,19 +172,35 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
}
}
foreach (var item in input.Details) //赋值生产线
{
var location = await LocationAclService.GetByCodeAsync(item.ToLocationCode).ConfigureAwait(false);
item.ProdLine = location.LocationGroupCode;
input.ProdLine = location.LocationGroupCode;
input.Worker = input.Worker;
}
input.AutoSubmit = true;
input.AutoAgree = true;
input.AutoHandle = true;
foreach (var detailInput in input.Details)
{
var toLocationDto= await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
var productionLineDto=await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationDto.LocationGroupCode).ConfigureAwait(false);
detailInput.ToLocationCode = toLocationDto.ErpLocationCode;
if (productionLineDto != null)
{
detailInput.ProdLine = productionLineDto.Code;
}
}
var entity = ObjectMapper.Map<MaterialRequestEditInput, MaterialRequest>(input);
foreach (var detail in entity.Details)
{
var toLocationDto = await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false);
var productionLineDto = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationDto.LocationGroupCode).ConfigureAwait(false);
detail.ToLocationArea= toLocationDto.AreaCode;
detail.ToLocationErpCode = toLocationDto.ErpLocationCode;
detail.ToLocationGroup = toLocationDto.LocationGroupCode;
detail.ToWarehouseCode= toLocationDto.WarehouseCode;
}
entity.UseOnTheWayLocation = true;
var result = await _materialRequestManager.CreateBynNumberAsync(entity).ConfigureAwait(false);
@ -372,7 +390,7 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
protected async Task<ItemBasicDTO> CheckItemBasicAsync(MaterialRequestImportInput importInput,
List<ValidationResult> validationRresult)
{
var item = await ItemBasicAclService.GetByCodeAsync(importInput.ItemCode).ConfigureAwait(false);
var item = await _itemBasicAppService.GetByCodeAsync(importInput.ItemCode).ConfigureAwait(false);
if (item == null)
{
validationRresult.Add(new ValidationResult($"物品代码{importInput.ItemCode}不存在", new[] { "物品代码" }));

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductReceiptRequests/ProductReceiptRequestAppService.cs

@ -6,12 +6,14 @@ using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office.CustomUI;
using FluentValidation;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
@ -84,7 +86,6 @@ public class ProductReceiptRequestAppService :
/// 赋值详情
/// </summary>
/// <param name="detail"></param>
/// <param name="input"></param>
/// <returns></returns>
private async Task SetDetailPropertiesAsync(ProductReceiptRequestDetail detail)
{
@ -176,7 +177,12 @@ public class ProductReceiptRequestAppService :
bool includeDetails = false,
CancellationToken cancellationToken = default)
{
Expression<Func<ProductReceiptRequest, bool>> expression = p => p.Type.ToString() == type;
if (!EnumProductReceiptType.TryParse(type, true, out EnumProductReceiptType enumType))
{
throw new AbpValidationException($"type {type} is not valid");
}
Expression<Func<ProductReceiptRequest, bool>> expression = p => p.Type == enumType;
if (requestInput.Condition.Filters?.Count > 0)
{
expression = expression.And(requestInput.Condition.Filters.ToLambda<ProductReceiptRequest>());

252
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
@ -17,6 +18,7 @@ namespace Win_in.Sfs.Wms.Store.Application;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
@ -27,23 +29,34 @@ using Win_in.Sfs.Wms.Inventory.Application.Contracts;
[Route($"{StoreConsts.RootPath}product-recycle-request")]
public class ProductRecycleRequestAppService :
SfsStoreRequestAppServiceBase<ProductRecycleRequest, ProductRecycleRequestDTO, SfsStoreRequestInputBase, ProductRecycleRequestEditInput, ProductRecycleRequestDetail, ProductRecycleRequestDetailDTO, SfsStoreRequestInputBase, ProductRecycleRequestImportInput>,
SfsStoreRequestAppServiceBase<ProductRecycleRequest, ProductRecycleRequestDTO,
SfsStoreRequestInputBase, ProductRecycleRequestEditInput
, ProductRecycleRequestDetail, ProductRecycleRequestDetailDTO, SfsStoreRequestInputBase, ProductRecycleRequestImportInput>,
IProductRecycleRequestAppService
{
private readonly IProductRecycleRequestManager _productRecycleRequestManager;
private readonly IBomAppService _bomApp;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
public ProductRecycleRequestAppService(
IProductRecycleRequestRepository repository,
IProductRecycleRequestManager productRecycleRequestManager,
IBomAppService bomApp,
IItemStoreRelationAppService itemStoreRelationApp)
IItemStoreRelationAppService itemStoreRelationApp,
ILocationAppService locationAppService,
IBalanceAppService balanceAppService,
ITransactionTypeAppService transactionTypeAppService)
: base(repository, productRecycleRequestManager)
{
_productRecycleRequestManager = productRecycleRequestManager;
_bomApp = bomApp;
_itemStoreRelationApp = itemStoreRelationApp;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
_transactionTypeAppService = transactionTypeAppService;
base.CreatePolicyName = ProductRecycleRequestPermissions.Create;
base.UpdatePolicyName = ProductRecycleRequestPermissions.Update;
@ -75,6 +88,100 @@ public class ProductRecycleRequestAppService :
throw new NotImplementedException();
}
#region 东阳
protected override async Task<Dictionary<ProductRecycleRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<ProductRecycleRequest, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var productRecycleRequest in addList)
{
await SetRequestAutoPropertiesAsync(productRecycleRequest)
.ConfigureAwait(false);
productRecycleRequest.Worker = CurrentUser.GetUserName();
foreach (var detail in productRecycleRequest.Details)
{
var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
string.Empty,
detail.ItemCode,
detail.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.Status = balance.Status;
}
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode)
.ConfigureAwait(false);
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
}
}
return dictionary;
}
private async Task SetRequestAutoPropertiesAsync(ProductRecycleRequest entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.ProductRecycle, EnumTransSubType.None).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
private async Task SetDetailPropertiesAsync(
ProductRecycleRequestDetail detail)
{
var item = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
if (item != null)
{
detail.ItemName = item.Name;
detail.ItemDesc1 = item.Desc1;
detail.ItemDesc2 = item.Desc2;
detail.Uom = item.BasicUom;
detail.Qty = detail.Qty;
}
var location = await LocationAclService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (location != null)
{
detail.LocationErpCode = location.ErpLocationCode;
detail.WarehouseCode = location.WarehouseCode;
detail.LocationGroup = location.LocationGroupCode;
detail.LocationArea = location.AreaCode;
}
var rawLocation = await LocationAclService.GetByCodeAsync(detail.RawLocationCode).ConfigureAwait(false);
if (rawLocation != null)
{
detail.RawLocationErpCode = rawLocation.ErpLocationCode;
detail.RawWarehouseCode = rawLocation.WarehouseCode;
detail.RawLocationArea = rawLocation.AreaCode;
detail.RawLocationGroup = rawLocation.LocationGroupCode;
}
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty,
detail.ItemCode,
detail.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.Status = balance.Status;
}
}
#endregion
#region Import
protected virtual async Task CheckImportInputBusinessAsync(ProductRecycleRequestImportInput importInput, EnumImportMethod importMethod, List<ValidationResult> validationRresult)
@ -202,147 +309,6 @@ public class ProductRecycleRequestAppService :
return boms;
}
protected virtual async Task ImportDataAsync(List<ProductRecycleRequest> entites, List<ProductRecycleRequest> deleteEntities)
{
await _productRecycleRequestManager.ImportDataAsync(entites, deleteEntities).ConfigureAwait(false);
}
protected override Func<ProductRecycleRequestImportInput, object> GetEntityExpression()
{
return p => 1;
}
protected virtual async Task<(List<ProductRecycleRequest> entites, List<ProductRecycleRequest> deleteEntities)> BuildImportDataAsync(ImportResult<ProductRecycleRequestImportInput> importResult, EnumImportMethod importMethod = EnumImportMethod.Update, bool isAllowPartImport = false)
{
if (importResult.Data.Any(t => t.ReportStatus == EnumImportReportStatus.Failed))
{
if (!isAllowPartImport)
{
return (null, null);
}
}
var entites = new List<ProductRecycleRequest>();
var details = new List<ProductRecycleRequestDetail>();
var deleteEntites = new List<ProductRecycleRequest>();
var entityExpression = GetEntityExpression();
var groupList = importResult.Data.ToList().GroupBy(entityExpression).Distinct().ToList();
foreach (var group in groupList)
{
var input = group.FirstOrDefault();
var inputDetails = group.ToList();
if (!inputDetails.Any(t => t.ReportStatus == EnumImportReportStatus.Failed))
{
var exist = await GetEntityAsync(input).ConfigureAwait(false);
var entity = ObjectMapper.Map<ProductRecycleRequestImportInput, ProductRecycleRequest>(input);
await SetEntityPropertiesAsync(entity, input).ConfigureAwait(false);
switch (importMethod)
{
case EnumImportMethod.Update:
if (exist != null)
{
entity.SetId(exist.Id);
}
break;
case EnumImportMethod.Replace:
if (exist != null)
{
deleteEntites.Add(exist);
}
break;
}
foreach (var inputDetail in inputDetails)
{
var detail = ObjectMapper.Map<ProductRecycleRequestImportInput, ProductRecycleRequestDetail>(inputDetail);
detail.SetIdAndNumber(GuidGenerator, entity.Id, entity.Number);
await SetDetailPropertiesAsync(detail, input).ConfigureAwait(false);
entity.AddDetail(detail);
}
entites.Add(entity);
}
}
return (entites, deleteEntites);
}
private async Task SetDetailPropertiesAsync(
ProductRecycleRequestDetail detail,
ProductRecycleRequestImportInput input)
{
var item = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
if (item != null)
{
detail.ItemName = item.Name;
detail.ItemDesc1 = item.Desc1;
detail.ItemDesc2 = item.Desc2;
detail.Qty = input.Qty;
}
var location = await LocationAclService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (location != null)
{
detail.LocationErpCode = location.ErpLocationCode;
detail.WarehouseCode = location.WarehouseCode;
}
var rawLocation = await LocationAclService.GetByCodeAsync(detail.RawLocationCode).ConfigureAwait(false);
if (rawLocation != null)
{
detail.RawLocationErpCode = rawLocation.ErpLocationCode;
detail.RawWarehouseCode = rawLocation.WarehouseCode;
}
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty,
detail.ItemCode,
input.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.Status = balance.Status;
}
detail.SetProperty(nameof(input.PreStartTime), input.PreStartTime);
detail.SetProperty(nameof(input.WorkHour), input.WorkHour);
}
private async Task SetEntityPropertiesAsync(ProductRecycleRequest entity, ProductRecycleRequestImportInput input)
{
entity.Worker = CurrentUser.GetUserName();
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
private async Task SetRequestAutoPropertiesAsync(ProductRecycleRequest entity)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.ProductRecycle, EnumTransSubType.None).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
#endregion
}

46
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAppService.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
@ -27,22 +28,25 @@ public class ProductionReturnRequestAppService :
IProductionReturnRequestAppService
{
private readonly IProductionReturnRequestManager _productionReturnRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IPurchaseOrderAppService _purchaseOrderApp;
private readonly IItemBasicAppService _itemBasicAppService;
private readonly ILocationAppService _locationAppService;
public ProductionReturnRequestAppService(
IProductionReturnRequestRepository repository,
IProductionReturnRequestManager productionRequestReturnManager,
IItemStoreRelationAppService itemStoreRelationApp,
IPurchaseOrderAppService purchaseOrderApp
)
IPurchaseOrderAppService purchaseOrderApp,
IItemBasicAppService itemBasicAppService,
ILocationAppService locationAppService)
: base(repository, productionRequestReturnManager)
{
_productionReturnRequestManager = productionRequestReturnManager;
_itemStoreRelationApp = itemStoreRelationApp;
_purchaseOrderApp = purchaseOrderApp;
_itemBasicAppService = itemBasicAppService;
_locationAppService = locationAppService;
}
/// <summary>
@ -62,6 +66,40 @@ public class ProductionReturnRequestAppService :
return dto;
}
protected override async Task<Dictionary<ProductionReturnRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<ProductionReturnRequest, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var productionReturnRequest in addList)
{
productionReturnRequest.Worker = CurrentUser.GetUserName();
productionReturnRequest.CreatorId = CurrentUser.Id;
await SetRequestAutoPropertiesAsync(productionReturnRequest).ConfigureAwait(false);
foreach (var detail in productionReturnRequest.Details)
{
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
detail.Uom = itemBasicDto.BasicUom;
detail.StdPackQty=itemBasicDto.StdPackQty;
var fromLocationDto= await _locationAppService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false);
var toLocationDto = await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false);
detail.FromLocationArea = fromLocationDto.AreaCode;
detail.FromWarehouseCode = fromLocationDto.WarehouseCode;
detail.FromLocationGroup = fromLocationDto.LocationGroupCode;
detail.FromLocationErpCode= fromLocationDto.ErpLocationCode;
detail.ToLocationArea = toLocationDto.AreaCode;
detail.ToWarehouseCode = toLocationDto.WarehouseCode;
detail.ToLocationGroup = toLocationDto.LocationGroupCode;
detail.ToLocationErpCode = toLocationDto.ErpLocationCode;
}
}
return dictionary;
}
#region import
protected virtual async Task CheckImportInputBusinessAsync(ProductionReturnRequestImportInput importInput, EnumImportMethod importMethod, List<ValidationResult> validationRresult)
{

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductionReturnRequests/ProductionReturnRequestAutoMapperProfile.cs

@ -20,7 +20,6 @@ public partial class StoreApplicationAutoMapperProfile : Profile
CreateMap<ProductionReturnRequestDetailInput, ProductionReturnRequestDetail>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.ToWarehouseCode)
.Ignore(x => x.MasterID)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/PurchaseReturnRequests/PurchaseReturnRequestAppService.cs

@ -131,8 +131,10 @@ public class PurchaseReturnRequestAppService :
/// <summary>
/// 赋值详情
/// </summary>
/// <param name="detail"></param>
/// <param name="labelDto"></param>
/// <param name="balanceDto"></param>
/// <param name="locationDto"></param>
/// <returns></returns>
private async Task SetDetailPropertiesAsync(
PurchaseReturnRequestDetail detail,
@ -268,7 +270,7 @@ public class PurchaseReturnRequestAppService :
/// <param name="transactionType"></param>
/// <param name="item"></param>
/// <param name="location"></param>
/// <param name="dataRowErrorInfo"></param>
/// <param name="validationRresult"></param>
/// <exception cref="UserFriendlyException"></exception>
/// <exception cref="ArgumentOutOfRangeException"></exception>
private static void CheckTransactionType(

301
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs

@ -20,16 +20,189 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
{
private readonly IDepartmentAppService _departmentApp;
private readonly IUnplannedIssueRequestManager _unplannedIssueRequestManager;
private readonly IBalanceAppService _balanceAppService;
private readonly IDepartmentAppService _departmentAppService;
public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository,
IUnplannedIssueRequestManager unplannedIssueRequestManager,
IDepartmentAppService departmentApp
) : base(repository, unplannedIssueRequestManager)
IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, IDepartmentAppService departmentAppService) : base(repository, unplannedIssueRequestManager)
{
_unplannedIssueRequestManager = unplannedIssueRequestManager;
_departmentApp = departmentApp;
_balanceAppService = balanceAppService;
_departmentAppService = departmentAppService;
}
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override async Task<Dictionary<UnplannedIssueRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<UnplannedIssueRequest, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var unplannedIssueRequest in addList)
{
unplannedIssueRequest.Worker = CurrentUser.GetUserName();
unplannedIssueRequest.CreatorId = CurrentUser.Id;
await SetRequestAutoPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false);
await SetEntityPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false);
foreach (var detail in unplannedIssueRequest.Details)
{
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
}
}
return dictionary;
}
#region 赋值
/// <summary>
/// 赋值详情
/// </summary>
/// <param name="detail"></param>
/// <returns></returns>
private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail)
{
var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
if (itemBasic != null)
{
detail.ItemCode = itemBasic.Code;
detail.ItemName = itemBasic.Name;
detail.ItemDesc1 = itemBasic.Desc1;
detail.ItemDesc2 = itemBasic.Desc2;
detail.StdPackQty = itemBasic.StdPackQty;
detail.Uom = itemBasic.BasicUom;
}
var location = await LocationAclService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (location != null)
{
detail.WarehouseCode = location.WarehouseCode;
detail.LocationErpCode = location.ErpLocationCode;
detail.LocationGroup = location.LocationGroupCode;
detail.LocationArea = location.AreaCode;
detail.LocationCode = location.Code;
}
var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
string.Empty,
detail.ItemCode,
detail.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.SupplierBatch = balance.SupplierBatch;
detail.ArriveDate = balance.ArriveDate;
detail.ProduceDate = balance.ProduceDate;
detail.ExpireDate = balance.ExpireDate;
detail.Lot = balance.Lot;
detail.ContainerCode = balance.ContainerCode;
detail.PackingCode = balance.PackingCode;
detail.Qty = balance.Qty;
detail.Status = balance.Status;
}
//if (!string.IsNullOrEmpty(detail))
//{
// var dict = await DictAppService.GetByCodeAsync(nameof(input.OnceBusiCode)).ConfigureAwait(false);
// if (dict.Items != null && dict.Items.Count > 0)
// {
// var item = dict.Items.FirstOrDefault(t => t.Code == input.OnceBusiCode);
// Check.NotNull(item, "次交易码", "次交易码不存在");
// detail.SetProperty("OnceBusiCode", item.Code);
// detail.SetProperty("OnceBusiName", item.Name);
// }
//}
//if (!string.IsNullOrEmpty(input.CaseCode))
//{
// var dict = await DictAppService.GetByCodeAsync(nameof(input.CaseCode)).ConfigureAwait(false);
// if (dict.Items != null && dict.Items.Count > 0)
// {
// var item = dict.Items.FirstOrDefault(t => t.Code == input.CaseCode);
// Check.NotNull(item, "专案代码", "专案代码不存在");
// detail.SetProperty("CaseCode", item.Code);
// detail.SetProperty("CaseName", item.Name);
// }
//}
//if (!string.IsNullOrEmpty(input.ProjCapacityCode))
//{
// var dict = await DictAppService.GetByCodeAsync(nameof(input.ProjCapacityCode)).ConfigureAwait(false);
// if (dict.Items != null && dict.Items.Count > 0)
// {
// var item = dict.Items.FirstOrDefault(t => t.Code == input.ProjCapacityCode);
// Check.NotNull(item, "项目分类代码", "项目分类代码不存在");
// detail.SetProperty("ProjCapacityCode", item.Code);
// detail.SetProperty("ProjCapacityName", item.Name);
// }
//}
}
/// <summary>
/// 赋值主记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetEntityPropertiesAsync(UnplannedIssueRequest entity)
{
var userName = CurrentUser.GetUserName();
var department = await _departmentAppService.GetByUsernameAsync(userName).ConfigureAwait(false);
if (department != null)
{
entity.DeptCode = department.Code;
entity.DeptName = department.Name;
}
entity.Worker = userName;
entity.BuildDate = DateTime.Now;
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
/// <summary>
/// 赋值业务事务
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(UnplannedIssueRequest entity)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.UnplannedIssue, EnumTransSubType.None).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
#endregion
#region 校验
protected async Task<BalanceDTO> CheckBalanceAsync(UnplannedIssueRequestImportInput importInput, List<ValidationResult> validationRresult)
{
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
@ -155,127 +328,5 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
}
}
protected override Func<UnplannedIssueRequestImportInput, object> GetEntityExpression()
{
return p => (1);
}
protected override async Task ValidateImportEntityAsync(UnplannedIssueRequestImportInput input, UnplannedIssueRequest entity, List<ValidationResult> validationRresult)
{
foreach (var detail in entity.Details)
{
var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
if (itemBasic != null)
{
detail.ItemName = itemBasic.Name;
detail.ItemDesc1 = itemBasic.Desc1;
detail.ItemDesc2 = itemBasic.Desc2;
detail.StdPackQty = itemBasic.StdPackQty;
}
var location = await LocationAclService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (location != null)
{
detail.LocationErpCode = location.ErpLocationCode;
detail.WarehouseCode = location.WarehouseCode;
}
// var balance = await this._balanceApp.GetByPackingCodeAsync(input.PackingCode);
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty,
input.ItemCode,
input.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.SupplierBatch = balance.SupplierBatch;
detail.ArriveDate = balance.ArriveDate;
detail.ProduceDate = balance.ProduceDate;
detail.ExpireDate = balance.ExpireDate;
detail.Lot = balance.Lot;
detail.ContainerCode = balance.ContainerCode;
detail.PackingCode = balance.PackingCode;
detail.Qty = input.Qty;
detail.Status = balance.Status;
}
if (!string.IsNullOrEmpty(input.OnceBusiCode))
{
var dict = await DictAppService.GetByCodeAsync(nameof(input.OnceBusiCode)).ConfigureAwait(false);
if (dict.Items != null && dict.Items.Count > 0)
{
var item = dict.Items.FirstOrDefault(t => t.Code == input.OnceBusiCode);
Check.NotNull(item, "次交易码", "次交易码不存在");
detail.SetProperty("OnceBusiCode", item.Code);
detail.SetProperty("OnceBusiName", item.Name);
}
}
if (!string.IsNullOrEmpty(input.CaseCode))
{
var dict = await DictAppService.GetByCodeAsync(nameof(input.CaseCode)).ConfigureAwait(false);
if (dict.Items != null && dict.Items.Count > 0)
{
var item = dict.Items.FirstOrDefault(t => t.Code == input.CaseCode);
Check.NotNull(item, "专案代码", "专案代码不存在");
detail.SetProperty("CaseCode", item.Code);
detail.SetProperty("CaseName", item.Name);
}
}
if (!string.IsNullOrEmpty(input.ProjCapacityCode))
{
var dict = await DictAppService.GetByCodeAsync(nameof(input.ProjCapacityCode)).ConfigureAwait(false);
if (dict.Items != null && dict.Items.Count > 0)
{
var item = dict.Items.FirstOrDefault(t => t.Code == input.ProjCapacityCode);
Check.NotNull(item, "项目分类代码", "项目分类代码不存在");
detail.SetProperty("ProjCapacityCode", item.Code);
detail.SetProperty("ProjCapacityName", item.Name);
}
}
}
}
protected override async Task<bool> ValidateImportEntities(Dictionary<UnplannedIssueRequest, EntityState> dicts)
{
foreach (var entity in dicts.Keys)
{
var userName = CurrentUser.GetUserName();
var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false);
if (department != null)
{
entity.DeptCode = department.Code;
entity.DeptName = department.Name;
}
entity.Worker = userName;
entity.BuildDate = DateTime.Now;
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.UnplannedIssue, EnumTransSubType.None).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
return await base.ValidateImportEntities(dicts).ConfigureAwait(false);
}
#endregion
}

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestAutoMapperProfile.cs

@ -59,6 +59,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.ContainerCode)
.Ignore(x => x.Lot)
.Ignore(x => x.Status)
.Ignore(x => x.Number);
.Ignore(x => x.Number)
;
}
}

302
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Data;
using Win_in.Sfs.Auth.Application.Contracts;
@ -29,75 +29,160 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
_departmentApp = departmentApp;
}
protected virtual async Task<(List<UnplannedReceiptRequest> entites, List<UnplannedReceiptRequest> deleteEntities)> BuildImportDataAsync(ImportResult<UnplannedReceiptRequestImportInput> importResult, EnumImportMethod importMethod = EnumImportMethod.Update, bool isAllowPartImport = false)
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override async Task<Dictionary<UnplannedReceiptRequest, EntityState>> ImportProcessingEntityAsync(Dictionary<UnplannedReceiptRequest, EntityState> dictionary)
{
if (importResult.Data.Any(t => t.ReportStatus == EnumImportReportStatus.Failed))
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var unplannedIssueRequest in addList)
{
if (!isAllowPartImport)
unplannedIssueRequest.Worker = CurrentUser.GetUserName();
unplannedIssueRequest.CreatorId = CurrentUser.Id;
await SetRequestAutoPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false);
await SetEntityPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false);
foreach (var detail in unplannedIssueRequest.Details)
{
return (null, null);
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
}
}
var entites = new List<UnplannedReceiptRequest>();
return dictionary;
}
var details = new List<UnplannedReceiptRequestDetail>();
#region 赋值
var deleteEntites = new List<UnplannedReceiptRequest>();
/// <summary>
/// 赋值详情
/// </summary>
/// <param name="detail"></param>
/// <returns></returns>
private async Task SetDetailPropertiesAsync(UnplannedReceiptRequestDetail detail)
{
var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
var entityExpression = GetEntityExpression();
if (itemBasic != null)
{
detail.ItemName = itemBasic.Name;
detail.ItemDesc1 = itemBasic.Desc1;
detail.ItemDesc2 = itemBasic.Desc2;
detail.StdPackQty = itemBasic.StdPackQty;
detail.Uom = itemBasic.BasicUom;
}
var groupList = importResult.Data.ToList().GroupBy(entityExpression).Distinct().ToList();
var location = await LocationAclService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
foreach (var group in groupList)
if (location != null)
{
var input = group.FirstOrDefault();
detail.LocationErpCode = location.ErpLocationCode;
detail.WarehouseCode = location.WarehouseCode;
detail.LocationArea = location.AreaCode;
detail.LocationGroup = location.LocationGroupCode;
}
var inputDetails = group.ToList();
detail.Lot = string.Empty;
detail.ContainerCode = string.Empty;
detail.PackingCode = string.Empty;
detail.Status = EnumInventoryStatus.OK;
if (!inputDetails.Any(t => t.ReportStatus == EnumImportReportStatus.Failed))
{
var exist = await GetEntityAsync(input).ConfigureAwait(false);
//if (!string.IsNullOrEmpty(detail.OnceBusiCode))
//{
// var dict = await DictAclService.GetByCodeAsync(nameof(input.OnceBusiCode)).ConfigureAwait(false);
var entity = ObjectMapper.Map<UnplannedReceiptRequestImportInput, UnplannedReceiptRequest>(input);
// if (dict.Items != null && dict.Items.Count > 0)
// {
// var item = dict.Items.FirstOrDefault(t => t.Code == input.OnceBusiCode);
await SetEntityPropertiesAsync(entity, input).ConfigureAwait(false);
// Check.NotNull(item, "次交易码", "次交易码不存在");
switch (importMethod)
{
case EnumImportMethod.Update:
if (exist != null)
{
entity.SetId(exist.Id);
}
break;
case EnumImportMethod.Replace:
if (exist != null)
{
deleteEntites.Add(exist);
}
break;
}
// detail.SetProperty("OnceBusiCode", item.Code);
// detail.SetProperty("OnceBusiName", item.Name);
// }
//}
foreach (var inputDetail in inputDetails)
{
var detail = ObjectMapper.Map<UnplannedReceiptRequestImportInput, UnplannedReceiptRequestDetail>(inputDetail);
//if (!string.IsNullOrEmpty(input.CaseCode))
//{
// var dict = await DictAclService.GetByCodeAsync(nameof(input.CaseCode)).ConfigureAwait(false);
detail.SetIdAndNumber(GuidGenerator, entity.Id, entity.Number);
// if (dict.Items != null && dict.Items.Count > 0)
// {
// var item = dict.Items.FirstOrDefault(t => t.Code == input.CaseCode);
await SetDetailPropertiesAsync(detail, inputDetail).ConfigureAwait(false);
entity.AddDetail(detail);
}
// Check.NotNull(item, "专案代码", "专案代码不存在");
entites.Add(entity);
}
// detail.SetProperty("CaseCode", item.Code);
// detail.SetProperty("CaseName", item.Name);
// }
//}
//if (!string.IsNullOrEmpty(input.ProjCapacityCode))
//{
// var dict = await DictAclService.GetByCodeAsync(nameof(input.ProjCapacityCode)).ConfigureAwait(false);
// if (dict.Items != null && dict.Items.Count > 0)
// {
// var item = dict.Items.FirstOrDefault(t => t.Code == input.ProjCapacityCode);
// Check.NotNull(item, "项目分类代码", "项目分类代码不存在");
// detail.SetProperty("ProjCapacityCode", item.Code);
// detail.SetProperty("ProjCapacityName", item.Name);
// }
//}
}
/// <summary>
/// 赋值主记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetEntityPropertiesAsync(UnplannedReceiptRequest entity)
{
var userName = CurrentUser.GetUserName();
var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false);
if (department != null)
{
entity.DeptCode = department.Code;
entity.DeptName = department.Name;
}
return (entites, deleteEntites);
entity.Worker = userName;
entity.BuildDate = DateTime.Now;
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
protected async Task<BalanceDTO> CheckBalanceAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
/// <summary>
/// 赋值业务事务
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(UnplannedReceiptRequest entity)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.UnplannedReceipt, EnumTransSubType.None).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
#endregion
#region 校验
protected virtual async Task<BalanceDTO> CheckBalanceAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
{
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty,
@ -118,7 +203,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
return balance;
}
protected async Task CheckCaseCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
protected virtual async Task CheckCaseCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
{
if (!string.IsNullOrEmpty(importInput.CaseCode))
{
@ -161,7 +246,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
//}
}
protected async Task<ItemBasicDTO> CheckItemBasicAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
protected virtual async Task<ItemBasicDTO> CheckItemBasicAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
{
var item = await ItemBasicAclService.GetByCodeAsync(importInput.ItemCode).ConfigureAwait(false);
if (item == null)
@ -176,7 +261,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
return item;
}
protected async Task<LocationDTO> CheckLocationAsync(string locationCode, List<ValidationResult> validationRresult)
protected virtual async Task<LocationDTO> CheckLocationAsync(string locationCode, List<ValidationResult> validationRresult)
{
var location = await LocationAclService.GetByCodeAsync(locationCode).ConfigureAwait(false);
if (location == null)
@ -186,7 +271,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
return location;
}
protected async Task CheckOnceBusiCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
protected virtual async Task CheckOnceBusiCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
{
if (!string.IsNullOrEmpty(importInput.OnceBusiCode))
{
@ -208,7 +293,8 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
}
}
}
protected async Task CheckProjCapacityCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
protected virtual async Task CheckProjCapacityCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
{
var dict = await DictAclService.GetByCodeAsync(nameof(importInput.ProjCapacityCode)).ConfigureAwait(false);
if (dict == null)
@ -227,7 +313,8 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
}
}
}
protected async Task<TransactionTypeDTO> CheckTransactionTypeAsync(EnumTransType enumTransType, List<ValidationResult> validationRresult)
protected virtual async Task<TransactionTypeDTO> CheckTransactionTypeAsync(EnumTransType enumTransType, List<ValidationResult> validationRresult)
{
var transactionType = await TransactionTypeAclService.GetByTransTypeAsync(enumTransType, EnumTransSubType.None).ConfigureAwait(false);
if (transactionType == null)
@ -237,116 +324,5 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
return transactionType;
}
protected override Func<UnplannedReceiptRequestImportInput, object> GetEntityExpression()
{
return p => (1);
}
protected virtual async Task ImportDataAsync(List<UnplannedReceiptRequest> entites, List<UnplannedReceiptRequest> deleteEntities)
{
await _unplannedReceiptRequestManager.ImportDataAsync(entites, deleteEntities).ConfigureAwait(false);
}
private async Task SetDetailPropertiesAsync(UnplannedReceiptRequestDetail detail, UnplannedReceiptRequestImportInput input)
{
var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
if (itemBasic != null)
{
detail.ItemName = itemBasic.Name;
detail.ItemDesc1 = itemBasic.Desc1;
detail.ItemDesc2 = itemBasic.Desc2;
detail.StdPackQty = itemBasic.StdPackQty;
}
var location = await LocationAclService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (location != null)
{
detail.LocationErpCode = location.ErpLocationCode;
detail.WarehouseCode = location.WarehouseCode;
detail.Lot = string.Empty;
detail.ContainerCode = string.Empty;
}
detail.PackingCode = string.Empty;
detail.Status = EnumInventoryStatus.OK;
if (!string.IsNullOrEmpty(input.OnceBusiCode))
{
var dict = await DictAclService.GetByCodeAsync(nameof(input.OnceBusiCode)).ConfigureAwait(false);
if (dict.Items != null && dict.Items.Count > 0)
{
var item = dict.Items.FirstOrDefault(t => t.Code == input.OnceBusiCode);
Check.NotNull(item, "次交易码", "次交易码不存在");
detail.SetProperty("OnceBusiCode", item.Code);
detail.SetProperty("OnceBusiName", item.Name);
}
}
if (!string.IsNullOrEmpty(input.CaseCode))
{
var dict = await DictAclService.GetByCodeAsync(nameof(input.CaseCode)).ConfigureAwait(false);
if (dict.Items != null && dict.Items.Count > 0)
{
var item = dict.Items.FirstOrDefault(t => t.Code == input.CaseCode);
Check.NotNull(item, "专案代码", "专案代码不存在");
detail.SetProperty("CaseCode", item.Code);
detail.SetProperty("CaseName", item.Name);
}
}
if (!string.IsNullOrEmpty(input.ProjCapacityCode))
{
var dict = await DictAclService.GetByCodeAsync(nameof(input.ProjCapacityCode)).ConfigureAwait(false);
if (dict.Items != null && dict.Items.Count > 0)
{
var item = dict.Items.FirstOrDefault(t => t.Code == input.ProjCapacityCode);
Check.NotNull(item, "项目分类代码", "项目分类代码不存在");
detail.SetProperty("ProjCapacityCode", item.Code);
detail.SetProperty("ProjCapacityName", item.Name);
}
}
}
private async Task SetEntityPropertiesAsync(UnplannedReceiptRequest entity, UnplannedReceiptRequestImportInput input)
{
var userName = CurrentUser.GetUserName();
var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false);
if (department != null)
{
entity.DeptCode = department.Code;
entity.DeptName = department.Name;
}
entity.Worker = userName;
entity.BuildDate = DateTime.Now;
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
private async Task SetRequestAutoPropertiesAsync(UnplannedReceiptRequest entity)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.UnplannedReceipt, EnumTransSubType.None).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
#endregion
}

148
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestAppService.cs

@ -0,0 +1,148 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
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;
namespace Win_in.Sfs.Wms.Store.Application;
/// <summary>
/// 调拨转移记录
/// </summary>
[Authorize]
[Route($"{StoreConsts.RootPath}wip-warehouse-adjust-request")]
public class WipWarehouseAdjustRequestAppService : SfsStoreRequestAppServiceBase
<WipWarehouseAdjustRequest,
WipWarehouseAdjustRequestDTO,
SfsStoreRequestInputBase,
WipWarehouseAdjustRequestEditInput,
WipWarehouseAdjustRequestDetail,
WipWarehouseAdjustRequestDetailDTO,
SfsStoreRequestInputBase,
WipWarehouseAdjustRequestImportInput>,
IWipWarehouseAdjustRequestAppService
{
private readonly IWipWarehouseAdjustRequestManager _WipWarehouseAdjustRequestManager;
private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService;
public WipWarehouseAdjustRequestAppService(
IWipWarehouseAdjustRequestRepository repository,
IWipWarehouseAdjustRequestManager WipWarehouseAdjustRequestManager,
IBalanceAppService balanceAppService,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService) : base(repository, WipWarehouseAdjustRequestManager)
{
_WipWarehouseAdjustRequestManager = WipWarehouseAdjustRequestManager;
_balanceAppService = balanceAppService;
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
}
#region 东阳使用
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
protected override async Task<Dictionary<WipWarehouseAdjustRequest, EntityState>> ImportProcessingEntityAsync(
Dictionary<WipWarehouseAdjustRequest, EntityState> dictionary)
{
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var WipWarehouseAdjustRequest in addList)
{
WipWarehouseAdjustRequest.Worker = CurrentUser.GetUserName();
WipWarehouseAdjustRequest.CreatorId = CurrentUser.Id;
await SetEntityPropertiesAsync(WipWarehouseAdjustRequest, EnumTransSubType.CountAdjust_WIP).ConfigureAwait(false);
foreach (var detail in WipWarehouseAdjustRequest.Details)
{
detail.ToLocationCode = detail.FromLocationCode;//调整库位一致
var itemBasicDto =await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
var toLocationDto = await _locationAppService.GetByCodeAsync(detail.ToLocationCode)
.ConfigureAwait(false);
var fromLocationDto = await _locationAppService.GetByCodeAsync(detail.FromLocationCode)
.ConfigureAwait(false);
detail.ItemCode = itemBasicDto.Code;
detail.ItemDesc1 = itemBasicDto.Desc1;
detail.ItemDesc2 = itemBasicDto.Desc2;
detail.ItemName = itemBasicDto.Name;
detail.Uom = itemBasicDto.BasicUom;
detail.StdPackQty = itemBasicDto.StdPackQty;
detail.Qty = detail.Qty;
detail.FromLocationErpCode = fromLocationDto.ErpLocationCode;
detail.FromLocationGroup = fromLocationDto.LocationGroupCode;
detail.FromLocationArea = fromLocationDto.AreaCode;
detail.FromWarehouseCode = fromLocationDto.WarehouseCode;
detail.ToLocationErpCode = toLocationDto.ErpLocationCode;
detail.ToLocationGroup = toLocationDto.LocationGroupCode;
detail.ToLocationArea = toLocationDto.AreaCode;
detail.ToWarehouseCode = toLocationDto.WarehouseCode;
detail.FromPackingCode = string.Empty;
detail.FromContainerCode = string.Empty;
detail.ToPackingCode = string.Empty;
detail.ToContainerCode = string.Empty;
detail.FromStatus = EnumInventoryStatus.OK;
detail.ToStatus = EnumInventoryStatus.OK;
detail.FromLot = string.Empty;
detail.ToLot = string.Empty;
}
}
return dictionary;
}
private async Task SetEntityPropertiesAsync(WipWarehouseAdjustRequest entity, EnumTransSubType subType)
{
var tranType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Adjust, subType)
.ConfigureAwait(false);
entity.Worker = CurrentUser.GetUserName();
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
}
/// <summary>
/// 新增实体
/// </summary>
/// <param name="input">CreateInput</param>
public override async Task<WipWarehouseAdjustRequestDTO> CreateAsync(WipWarehouseAdjustRequestEditInput input)
{
var entity = ObjectMapper.Map<WipWarehouseAdjustRequestEditInput, WipWarehouseAdjustRequest>(input);
await _WipWarehouseAdjustRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<WipWarehouseAdjustRequest, WipWarehouseAdjustRequestDTO>(entity);
return dto;
}
#endregion
}

77
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestAutoMapperProfile.cs

@ -0,0 +1,77 @@
using AutoMapper;
using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application;
public partial class StoreApplicationAutoMapperProfile : Profile
{
private void WipWarehouseAdjustRequestMapperProfile()
{
CreateMap<WipWarehouseAdjustRequest, WipWarehouseAdjustRequestDTO>()
.ReverseMap();
CreateMap<WipWarehouseAdjustRequestDetailDTO, WipWarehouseAdjustRequestDetail>();
CreateMap<WipWarehouseAdjustRequestDetail, WipWarehouseAdjustRequestDetailDTO>();
CreateMap<WipWarehouseAdjustRequestDetailInput, WipWarehouseAdjustRequestDetail>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.MasterID)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<WipWarehouseAdjustRequestImportInput, WipWarehouseAdjustRequest>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.ActiveDate)
.Ignore(x => x.Remark)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.ConcurrencyStamp)
.Ignore(x => x.RequestStatus)
.Ignore(x => x.Details)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<WipWarehouseAdjustRequestImportInput, WipWarehouseAdjustRequestDetail>()
.IgnoreAuditedObjectProperties()
.Ignore(x=>x.ToPackingCode)
.Ignore(x => x.FromPackingCode)
.Ignore(x => x.FromStatus)
.Ignore(x => x.ToStatus)
.Ignore(x => x.FromLocationGroup)
.Ignore(x => x.FromLocationArea)
.Ignore(x => x.FromLocationErpCode)
.Ignore(x => x.FromWarehouseCode)
.Ignore(x => x.ToLocationArea)
.Ignore(x => x.ToLocationGroup)
.Ignore(x => x.ToLocationErpCode)
.Ignore(x => x.ToWarehouseCode)
.Ignore(x => x.SupplierBatch).Ignore(x => x.ArriveDate).Ignore(x => x.ProduceDate).Ignore(x => x.ExpireDate)
.Ignore(x => x.Remark)
.Ignore(x => x.ItemName)
.Ignore(x => x.ItemDesc1)
.Ignore(x => x.ItemDesc2)
.Ignore(x => x.FromContainerCode)
.Ignore(x => x.ToContainerCode)
.Ignore(x => x.FromLot)
.Ignore(x => x.ToLot)
.Ignore(x => x.StdPackQty)
.Ignore(x => x.Uom)
.Ignore(x => x.MasterID)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<WipWarehouseAdjustRequestEditInput, WipWarehouseAdjustRequest>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.Id)
.Ignore(x => x.Number)
.Ignore(x => x.ExtraProperties)
.Ignore(x => x.Remark)
.Ignore(x => x.TenantId)
;
}
}

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationAutoMapperProfile.cs

@ -23,6 +23,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile
PutawayRequestAutoMapperProfile();
CountAdjustRequestAutoMapperProfile();
ScrapRequestAutoMapperProfile();
WipWarehouseAdjustRequestMapperProfile();
#endregion
@ -78,6 +79,8 @@ public partial class StoreApplicationAutoMapperProfile : Profile
TransferNoteMapperProfile();
NoOkConvertOkNoteAutoMapperProfile();
InventoryInitialNoteAutoMapperProfile();
WipWarehouseAdjustNoteMapperProfile();
#endregion
#region Jobs

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Win_in.Sfs.Wms.Store.Application.csproj

@ -22,6 +22,7 @@
<PackageReference Include="Volo.Abp.AutoMapper" Version="5.3.5" />
<PackageReference Include="Volo.Abp.Ddd.Application" Version="5.3.5" />
<PackageReference Include="Volo.Abp.SettingManagement.Application" Version="5.3.5" />
<ProjectReference Include="..\..\..\BaseData\src\Win_in.Sfs.Basedata.Application\Win_in.Sfs.Basedata.Application.csproj" />
<ProjectReference Include="..\..\..\Shared\src\Win_in.Sfs.Shared.Application\Win_in.Sfs.Shared.Application.csproj" />
<ProjectReference Include="..\Win_in.Sfs.Wms.Store.Application.Contracts\Win_in.Sfs.Wms.Store.Application.Contracts.csproj" />
<ProjectReference Include="..\Win_in.Sfs.Wms.Store.Domain\Win_in.Sfs.Wms.Store.Domain.csproj" />

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendFromDetailWithFromToEntityBase.cs

@ -66,11 +66,6 @@ public abstract class SfsStoreRecommendFromDetailWithFromToEntityBase : SfsStore
/// </summary>
public string RecommendFromWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatusEntityBase.cs

@ -66,10 +66,6 @@ public abstract class SfsStoreRecommendFromDetailWithLotPackingQtyLocationStatus
/// </summary>
public string RecommendFromWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Uom { get; set; }
/// <summary>
/// 推荐数量

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendToDetailWithFromToEntityBase.cs

@ -66,11 +66,6 @@ public abstract class SfsStoreRecommendToDetailWithFromToEntityBase : SfsStoreDe
/// </summary>
public string RecommendToWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusEntityBase.cs

@ -66,11 +66,6 @@ public abstract class SfsStoreRecommendToDetailWithLotPackingQtyLocationStatusEn
/// </summary>
public string RecommendToWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Uom { get; set; }
/// <summary>
/// 推荐数量
/// </summary>

13
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/IssueJobManager.cs

@ -33,8 +33,17 @@ public class IssueJobManager : SfsJobManagerBase<IssueJob, IssueJobDetail>, IIss
foreach (var detail in input.Details)
{
//发料子任务 赋值实际转移
await entity.BuildDetail(detail.Id, detail.HandledFromLocationCode, detail.HandledFromLocationErpCode, detail.HandledFromWarehouseCode,
detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate, detail.HandledContainerCode, detail.HandledLot,
await entity.BuildDetail(detail.Id,
detail.HandledFromLocationCode,
detail.HandledFromLocationErpCode,
detail.HandledFromWarehouseCode,
detail.HandledQty,
detail.HandledSupplierBatch,
detail.HandledArriveDate,
detail.HandledProduceDate,
detail.HandledExpireDate,
detail.HandledContainerCode,
detail.HandledLot,
detail.HandledPackingCode).ConfigureAwait(false);
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/RecycledMaterialReceiptNotes/IRecycledMaterialReceiptNoteManager.cs

@ -4,5 +4,5 @@ namespace Win_in.Sfs.Wms.Store.Domain;
public interface IRecycledMaterialReceiptNoteManager : ISfsStoreManager<RecycledMaterialReceiptNote, RecycledMaterialReceiptNoteDetail>
{
Task CreateByPurchaseReceiptNoteAsync(PurchaseReceiptNote purchaseReceiptNote);
}

14
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/RecycledMaterialReceiptNotes/RecycledMaterialReceiptNoteManager.cs

@ -10,18 +10,4 @@ public class RecycledMaterialReceiptNoteManager : SfsStoreManagerBase<RecycledMa
) : base(repository)
{
}
public override async Task<RecycledMaterialReceiptNote> CreateAsync(RecycledMaterialReceiptNote entity)
{
return await base.CreateAsync(entity).ConfigureAwait(false);
}
public virtual async Task CreateByPurchaseReceiptNoteAsync(PurchaseReceiptNote purchaseReceiptNote)
{
var RecycledMaterialReceiptNote = ObjectMapper.Map<PurchaseReceiptNote, RecycledMaterialReceiptNote>(purchaseReceiptNote);
await base.CreateAsync(RecycledMaterialReceiptNote).ConfigureAwait(false);
}
}

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/IWipWarehouseAdjustNoteManager.cs

@ -0,0 +1,11 @@
using System;
using System.Threading.Tasks;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface IWipWarehouseAdjustNoteManager :
ISfsStoreManager<WipWarehouseAdjustNote, WipWarehouseAdjustNoteDetail>, IBulkImportService<WipWarehouseAdjustNote>
{
Task<WipWarehouseAdjustNote> ConfirmAsync(Guid id);
}

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/IWipWarehouseAdjustNoteRepository.cs

@ -0,0 +1,8 @@
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface IWipWarehouseAdjustNoteRepository : ISfsStoreRepositoryBase<WipWarehouseAdjustNote>,
ISfsBulkRepositoryBase<WipWarehouseAdjustNote>
{
}

65
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/WipWarehouseAdjustNote.cs

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Volo.Abp;
using Win_in.Sfs.Shared.Domain.Entities;
namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary>
/// 盘点差异调整记录
/// </summary>
public class WipWarehouseAdjustNote : SfsStoreAggregateRootBase<WipWarehouseAdjustNoteDetail>, IHasJobNumber
{
/// <summary>
/// 调整类型
/// </summary>
[Display(Name = "调整类型")]
public string Type { get; set; }
/// <summary>
/// 任务ID
/// </summary>
[IgnoreUpdate]
public string RequestNumber { get; set; }
/// <summary>
/// 任务ID
/// </summary>
[IgnoreUpdate]
public string JobNumber { get; set; }
/// <summary>
/// 明细列表
/// </summary>
[IgnoreUpdate]
public override List<WipWarehouseAdjustNoteDetail> Details { get; set; } = new();
/// <summary>
/// 已确认
/// </summary>
[Display(Name = "已确认")]
public bool Confirmed { get; set; }
/// <summary>
/// 确认时间
/// </summary>
[Display(Name = "确认时间")]
[IgnoreUpdate]
public DateTime? ConfirmTime { get; set; }
public void Confirm(DateTime confirmTime)
{
CheckStatus(Confirmed);
Confirmed = true;
ConfirmTime = confirmTime;
}
private static void CheckStatus(bool confirmed)
{
if (confirmed)
{
throw new UserFriendlyException("当前状态为 【已确认】 ,无法再次确认!");
}
}
}

24
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/WipWarehouseAdjustNoteDetail.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary>
/// 盘点差异调整记录-明细表
/// </summary>
public class WipWarehouseAdjustNoteDetail : SfsStoreDetailWithFromToEntityBase
{
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
}

118
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/WipWarehouseAdjustNote/WipWarehouseAdjustNoteManager.cs

@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Volo.Abp;
using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Event;
namespace Win_in.Sfs.Wms.Store.Domain;
public class WipWarehouseAdjustNoteManager : SfsStoreManagerBase<WipWarehouseAdjustNote, WipWarehouseAdjustNoteDetail>,
IWipWarehouseAdjustNoteManager
{
private readonly IWipWarehouseAdjustNoteRepository _repository;
public WipWarehouseAdjustNoteManager(
IWipWarehouseAdjustNoteRepository repository
) : base(repository)
{
_repository = repository;
}
[UnitOfWork]
public virtual async Task<WipWarehouseAdjustNote> ConfirmAsync(Guid id)
{
var entity = await Repository.FindAsync(id).ConfigureAwait(false);
Check.NotNull(entity, EntityClassName);
entity.Confirm(Clock.Now);
await PublishConfirmedAsync(entity).ConfigureAwait(false);
return await Repository.UpdateAsync(entity).ConfigureAwait(false);
}
private async Task PublishConfirmedAsync(WipWarehouseAdjustNote entity)
{
try
{
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<WipWarehouseAdjustNote>(entity), false)
.ConfigureAwait(false);
}
catch (Exception ex)
{
Logger.LogDebug($"{nameof(WipWarehouseAdjustNote)} Confirmed Event:{ex.Message}", null);
Console.WriteLine(ex.Source);
throw;
}
}
/// <summary>
/// 执行导入
/// </summary>
public virtual async Task ImportDataAsync(List<WipWarehouseAdjustNote> mergeEntities,
List<WipWarehouseAdjustNote> deleteEntities = null)
{
if (deleteEntities != null && deleteEntities.Count > 0)
{
await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false);
}
foreach (var entity in mergeEntities)
{
entity.SetIdAndNumberWithDetails(GuidGenerator,
await GenerateNumberAsync(nameof(WipWarehouseAdjustNote), Clock.Now).ConfigureAwait(false));
}
await _repository.BulkMergeAsync(mergeEntities).ConfigureAwait(false);
var insertDetails = new List<WipWarehouseAdjustNoteDetail>();
foreach (var item in mergeEntities)
{
await SetDetailAsync(item.Details).ConfigureAwait(false);
insertDetails.AddRange(item.Details);
}
await _repository.BulkInsertAsync(insertDetails).ConfigureAwait(false);
}
private async Task SetDetailAsync(List<WipWarehouseAdjustNoteDetail> details)
{
foreach (var detail in details)
{
var item = await ItemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
Check.NotNull(item, "物品代码", $"物品 {detail.ItemCode} 不存在");
if (item != null)
{
detail.ItemName = item.Name;
detail.ItemDesc1 = item.Desc1;
detail.ItemDesc2 = item.Desc2;
}
var balance = await BalanceAppService.GetByItemLocationPackingAndStatusAsync(detail.FromPackingCode,
detail.ItemCode, detail.FromLocationCode, detail.FromStatus).ConfigureAwait(false);
Check.NotNull(balance, "库存",
$"不存在箱码为{detail.FromPackingCode},零件编码为{detail.ItemCode},库位为{detail.FromLocationCode},状态为{detail.FromStatus}的库存!");
detail.SupplierBatch = balance.SupplierBatch;
detail.ArriveDate = balance.ArriveDate;
detail.ProduceDate = balance.ProduceDate;
detail.ExpireDate = balance.ExpireDate;
//通过箱码和库位获取库存信息
detail.FromStatus = balance.Status;
detail.FromLot = balance.Lot;
detail.FromWarehouseCode = balance.WarehouseCode;
detail.FromContainerCode = balance.ContainerCode;
detail.ToLot = balance.Lot;
detail.ToWarehouseCode = balance.WarehouseCode;
detail.ToContainerCode = balance.ContainerCode;
detail.ToStatus = balance.Status;
}
}
}

30
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Plans/CountPlans/CountPlanManager.cs

@ -14,12 +14,14 @@ namespace Win_in.Sfs.Wms.Store.Domain;
public class CountPlanManager : SfsStoreRequestManagerBase<CountPlan, CountPlanDetail>, ICountPlanManager
{
private readonly ICountPlanRepository _repository;
public CountPlanManager(
ICountPlanRepository repository
)
: base(repository)
{
_repository = repository;
}
/// <summary>
@ -107,9 +109,11 @@ public class CountPlanManager : SfsStoreRequestManagerBase<CountPlan, CountPlanD
//零件查询
if (partCondition.Filters.Count > 0)
{
SfsBaseDataRequestInputBase itemInput = new SfsBaseDataRequestInputBase();
itemInput.Condition = partCondition;
itemInput.MaxResultCount = 99999;
var itemInput = new SfsBaseDataRequestInputBase
{
Condition = partCondition,
MaxResultCount = 99999
};
var itemBaseList = await ItemBasicAppService.GetAllListByFilterAsync(itemInput, false).ConfigureAwait(false);
@ -119,16 +123,18 @@ public class CountPlanManager : SfsStoreRequestManagerBase<CountPlan, CountPlanD
//库位查询
if (locCondition.Filters.Count > 0)
{
SfsBaseDataRequestInputBase locInput = new SfsBaseDataRequestInputBase();
locInput.Condition = locCondition;
locInput.MaxResultCount = 99999;
var locInput = new SfsBaseDataRequestInputBase
{
Condition = locCondition,
MaxResultCount = 99999
};
var locList = await LocationAppService.GetAllListByFilterAsync(locInput, false).ConfigureAwait(false);
//库位列表
selectLocationCodes = locList.Select(p => p.Code).Distinct().ToList();
}
//状态查询
string statusStr = System.Text.Json.JsonSerializer.Serialize(selectStatusList.Select(p => (int)p).ToList());
var statusStr = System.Text.Json.JsonSerializer.Serialize(selectStatusList.Select(p => (int)p).ToList());
//最终的查询条件语句
SfsInventoryRequestInputBase banlanceInput = new SfsInventoryRequestInputBase();
@ -196,10 +202,8 @@ public class CountPlanManager : SfsStoreRequestManagerBase<CountPlan, CountPlanD
{
// 盘点标签
CountLabel = GuidGenerator.Create().ToString(),
// 数量
InventoryQty = inventory.Qty,
// 最终盘点数量
FinalCountQty = 0,
// 状态
@ -210,23 +214,29 @@ public class CountPlanManager : SfsStoreRequestManagerBase<CountPlan, CountPlanD
PackingCode = inventory.PackingCode,
// 托标签
ContainerCode = inventory.ContainerCode,
// 物品
ItemName = inventory.ItemName,
ItemDesc1 = inventory.ItemDesc1,
ItemDesc2 = inventory.ItemDesc2,
ItemCode = inventory.ItemCode,
Uom =inventory.Uom,
// 排序批次
Lot = inventory.Lot,
/// 批次
// 批次
SupplierBatch = inventory.SupplierBatch,
ArriveDate = inventory.ArriveDate,
ProduceDate = inventory.ProduceDate,
ExpireDate = inventory.ExpireDate,
// 库位
LocationArea = inventory.LocationArea,
LocationCode = inventory.LocationCode,
LocationErpCode = inventory.LocationErpCode,
LocationGroup = inventory.LocationGroup,
WarehouseCode = inventory.WarehouseCode,
// 库存状态
Status = inventory.Status,
StdPackQty = inventory.StdPackQty,
};
return detail;

27
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs

@ -1,6 +1,9 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event;
using static Win_in.Sfs.Wms.Store.Domain.Shared.StoreSettings;
namespace Win_in.Sfs.Wms.Store.Domain;
@ -26,16 +29,13 @@ public class MaterialRequestManager
{
var number = string.IsNullOrEmpty(entity.Number) ? await GenerateNumberAsync(typeof(MaterialRequest).Name, entity.ActiveDate).ConfigureAwait(false) : entity.Number;
entity.SetIdAndNumberWithDetails(GuidGenerator, number);
await PublishCreatedAsync(entity).ConfigureAwait(false);
if (entity.AutoSubmit)
{
return await SubmitAsync(entity).ConfigureAwait(false);
}
else
{
return await Repository.InsertAsync(entity).ConfigureAwait(false);
}
entity.Submit();
entity.Agree();
entity.RequestStatus = EnumRequestStatus.Partial;
await LocalEventBus.PublishAsync(new SfsHandledEntityEventData<MaterialRequest>(entity), false)
.ConfigureAwait(false);
await _repository.InsertAsync(entity).ConfigureAwait(false);
return entity;
}
@ -128,6 +128,13 @@ public class MaterialRequestManager
oldEntity.ReplaceDetail(newDetail.Id, newDetail);
}
var flag=oldEntity.Details.Any(p => p.ReceivedQty < p.Qty);//还有补料完 没收到的货
if (!flag)
{
oldEntity.Complete();
}
await Repository.UpdateAsync(oldEntity).ConfigureAwait(false);
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/IWipWarehouseAdjustRequestManager.cs

@ -0,0 +1,9 @@
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface IWipWarehouseAdjustRequestManager :
ISfsStoreRequestManager<WipWarehouseAdjustRequest, WipWarehouseAdjustRequestDetail>,
IBulkImportService<WipWarehouseAdjustRequest>
{
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/IWipWarehouseAdjustRequestRepository.cs

@ -0,0 +1,9 @@
using System;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain
{
public interface IWipWarehouseAdjustRequestRepository : ISfsStoreRepositoryBase<WipWarehouseAdjustRequest>, ISfsBulkRepositoryBase<WipWarehouseAdjustRequest>
{
}
}

25
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequest.cs

@ -0,0 +1,25 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Entities;
namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary>
/// 调拨申请
/// </summary>
public class WipWarehouseAdjustRequest : SfsStoreRequestAggregateRootBase<WipWarehouseAdjustRequestDetail>
{
/// <summary>
/// 调整类型
/// </summary>
[Display(Name = "调整类型")]
public string Type { get; set; }
/// <summary>
/// 明细列表
/// </summary>
[IgnoreUpdate]
public override List<WipWarehouseAdjustRequestDetail> Details { get; set; } = new List<WipWarehouseAdjustRequestDetail>();
}

30
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/WipWarehouseAdjustRequests/WipWarehouseAdjustRequestDetail.cs

@ -0,0 +1,30 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary>
/// 线边库存调整调整明细
/// </summary>
public class WipWarehouseAdjustRequestDetail : SfsStoreDetailWithFromToEntityBase
{
/// <summary>
/// 原因
/// </summary>
[Display(Name = "调整原因")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Reason { get; set; }
/// <summary>
/// 调整代码
/// </summary>
[Display(Name = "原因代码")]
[StringLength(SfsEfCorePropertyConst.RemarkLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ReasonCode { get; set; }
public override string ToString()
{
return JsonSerializer.Serialize(this);
}
}

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

Loading…
Cancel
Save