diff --git a/FaKrosnoApi/Controllers/WzRowMareliController.cs b/FaKrosnoApi/Controllers/WzRowMarelliController.cs similarity index 93% rename from FaKrosnoApi/Controllers/WzRowMareliController.cs rename to FaKrosnoApi/Controllers/WzRowMarelliController.cs index 3569631..e3f18fb 100644 --- a/FaKrosnoApi/Controllers/WzRowMareliController.cs +++ b/FaKrosnoApi/Controllers/WzRowMarelliController.cs @@ -6,7 +6,7 @@ namespace FaKrosnoApi.Controllers; [ApiController] [Route("api/[controller]")] -public class WzRowMareliController(IWzRowMareliService service, IMaterialTransactionService materialTransactionService) : Controller +public class WzRowMarelliController(IWzRowMareliService service, IMaterialTransactionService materialTransactionService) : Controller { [HttpGet] public async Task>> GetAll() diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor index d4b68ef..accd200 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPackList.razor @@ -67,22 +67,19 @@ - - - - - - + + + + + changedRecords) { - await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + await WarehouseService.UpdateWzRowsMarelliAsync(changedRecords); - WzRowsMarelli = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMarelli = (await WarehouseService.GetWzRowsMarelliByWzHeaderId(WzHeader)).ToList(); await InvokeAsync(StateHasChanged); await _grid.Refresh(); } @@ -388,7 +385,7 @@ { if (currentSum == targetSum) { - result.Add(new List(currentCombination)); + result.Add([..currentCombination]); return; } diff --git a/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor new file mode 100644 index 0000000..d210f66 --- /dev/null +++ b/OrdersManagement/Components/Pages/PackingLists/Marelli/MarelliPacklistSimple.razor @@ -0,0 +1,316 @@ +@page "/Warehouse/Marelli/PackList/{WzHeader:guid}/Simple" +@using OrdersManagement.Models +@using Syncfusion.Blazor.Cards +@using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.Popups +@using Syncfusion.Blazor.Inputs +@using Syncfusion.Blazor.Buttons + +@inject NavigationManager NavigationManager +@inject WarehouseService WarehouseService + +
+ + +

Packing List

+
+ + + + Zmień widok + Generuj XLS i Wyślij + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @if (_isValid) + { +

Packing List został wygenerowany i wysłany!

+ } + else if (string.IsNullOrWhiteSpace(EmailAddresses)) + { +

Błąd: Proszę wprowadzić przynajmniej jeden ADRES EMAIL do wysyłki raportu!

+ } + else if (!_isValid) + { +

Błąd: Nie Wszystkie linie mają wypełniony NUMER PALETY.
Packing List nie zostanie + wygenerowany!

+ } +
+
+ + + +
+ + + + +

Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):

+
+
+ + + +
+ + + FA Krosno Manager © @(DateTime.Now.Year) + +
+
+ +@code { + [Parameter] public Guid WzHeader { get; set; } + + private List WzRowsMarelli { get; set; } = new(); + private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>(); + private List ChangedRecords = new(); + private WzHeaderDto _wzHeader; + private SfTextBox _scanner; + + private string ItemNumber { get; set; } = string.Empty; + private string Qty { get; set; } = "0"; + private string PalletNumberOutput { get; set; } = "0"; + + private string WzNumber { get; set; } = string.Empty; + + private WzRowMarelliDto? SelectedRow { get; set; } + private List SelectedRows { get; set; } = new(); + + private bool _isValid; + + public bool Visibility { get; set; } + public bool VisibilityPalletNumber { get; set; } + + private string? EmailAddresses { get; set; } = string.Empty; + private string PalletNumber { get; set; } = "0"; + + private string LastScannedValue { get; set; } = string.Empty; + private string ScannedValue { get; set; } = string.Empty; + + private void HideModal() + { + VisibilityPalletNumber = false; + Visibility = false; + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); + WzRowsMarelli = (await WarehouseService.GetWzRowsMarelliByWzHeaderId(WzHeader)).ToList(); + + TransactionModelsByPartNumber = await GetTransactionModels(); + + EmailAddresses = _wzHeader.EmailAddresses; + + WzNumber = _wzHeader.WzNumbers ?? string.Empty; + + await _scanner.FocusAsync(); + StateHasChanged(); + } + } + + private async Task SaveChanges() + { + if (!string.IsNullOrWhiteSpace(EmailAddresses)) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + } + + if (ChangedRecords.Any()) + { + await UpdateRows(ChangedRecords); + } + } + + private async Task ExportXls() + { + int count = WzRowsMarelli.Count(x => x.PalletNumber == null); + + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + + if (_isValid) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + await WarehouseService.GenerateXlsForMarelliAsync(WzHeader); + } + + Visibility = true; + } + + private void ScanValue(ChangedEventArgs obj) + { + if (string.IsNullOrWhiteSpace(obj.Value)) return; + if (int.Parse(PalletNumber) <= 0) + { + VisibilityPalletNumber = true; + return; + } + + ScannedValue = obj.Value.Trim(); + + StateHasChanged(); + + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); + TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); + + if (materialTransactionByPartNumber != null) + { + FillPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); + } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + private async Task FillPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + { + await InvokeAsync(StateHasChanged); + + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMarelli.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + + switch (rowIndex) + { + case -1: + { + SelectedRows = WzRowsMarelli.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) + { + foreach (var record in combination) + { + record.PalletNumber = palletNumber; + ChangedRecords.Add(record); + } + } + + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + + SelectedRow = SelectedRows.FirstOrDefault(); + + break; + } + default: + { + SelectedRow = WzRowsMarelli[rowIndex]; + + SelectedRow.PalletNumber = palletNumber; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + break; + } + } + + await SaveChanges(); + ChangedRecords.Clear(); + + await InvokeAsync(StateHasChanged); + + await _scanner.FocusAsync(); + } + + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + + private async Task UpdateRows(IList changedRecords) + { + await WarehouseService.UpdateWzRowsMarelliAsync(changedRecords); + + WzRowsMarelli = (await WarehouseService.GetWzRowsMarelliByWzHeaderId(WzHeader)).ToList(); + await InvokeAsync(StateHasChanged); + } + + private List> FindCombinations(List records, int targetSum) + { + var result = new List>(); + var currentCombination = new List(); + + void Backtrack(int start, int currentSum) + { + if (currentSum == targetSum) + { + result.Add(new List(currentCombination)); + return; + } + + for (int i = start; i < records.Count; i++) + { + if (currentSum + records[i].Quantity <= targetSum) + { + currentCombination.Add(records[i]); + Backtrack(i + 1, currentSum + records[i].Quantity ?? 0); + currentCombination.RemoveAt(currentCombination.Count - 1); + } + } + } + + Backtrack(0, 0); + return result; + } + + private void ChangeView() + { + NavigationManager.NavigateTo($"/Warehouse/Marelli/PackList/{WzHeader}"); + } +} \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor index 37594ce..65be4b2 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePackList.razor @@ -227,7 +227,7 @@ if (firstRender) { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); TransactionModelsByPartNumber = await GetTransactionModels(); @@ -479,7 +479,7 @@ { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); await InvokeAsync(StateHasChanged); await _grid.Refresh(); } diff --git a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor index e900381..855edbe 100644 --- a/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor +++ b/OrdersManagement/Components/Pages/PackingLists/Meyle/MeylePacklistSimple.razor @@ -176,7 +176,7 @@ if (firstRender) { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); TransactionModelsByPartNumber = await GetTransactionModels(); @@ -385,7 +385,7 @@ { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); - WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); + WzRowsMeyle = (await WarehouseService.GetWzRowsMeyleByWzHeaderId(WzHeader)).ToList(); await InvokeAsync(StateHasChanged); } @@ -419,6 +419,6 @@ private void ChangeView() { - NavigationManager.NavigateTo($"/Warehouse/PackList/{WzHeader}"); + NavigationManager.NavigateTo($"/Warehouse/Meyle/PackList/{WzHeader}"); } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index bbf81ab..0214ac5 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -133,7 +133,7 @@ if (firstRender) { _clients = await WarehouseService.GetAllClientsAsync(); - _clients = _clients.Where(x => x.Name.Equals("MEYLE", StringComparison.OrdinalIgnoreCase)); + _clients = _clients.Where(x => new[] { "MAGNETI MARELLI", "MEYLE" }.Any(y => y.Equals(x.Name, StringComparison.OrdinalIgnoreCase))).ToList(); StateHasChanged(); @@ -179,7 +179,7 @@ Guid headerId = obj.RowData.ID; - NavigationManager.NavigateTo($"/Warehouse/{_selectedClient.Name}/PackList/" + headerId); + NavigationManager.NavigateTo($"/Warehouse/{_selectedClient.ShortName}/PackList/" + headerId); } private async Task CreatePackingList() @@ -210,18 +210,18 @@ await WarehouseService.CreateWzHeaderAsync(wzHeader); - switch (_selectedClient?.Name.ToUpper()) + switch (_selectedClient?.ShortName.ToUpper()) { case "MEYLE": - IList rows = new List(); - IList materialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); + IList meyleRows = new List(); + IList meyleMaterialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); - foreach (MaterialTransactionDto materialTransactionDto in materialTransactions) + foreach (MaterialTransactionDto materialTransactionDto in meyleMaterialTransactions) { CustomerOrderDto customerOrder = await WarehouseService.GetCustomerOrder(materialTransactionDto.RefNum ?? string.Empty); ItemCustDto item = await WarehouseService.GetItem(materialTransactionDto.Item ?? string.Empty, customerOrder.CustNum); - rows.Add(new WzRowMeyleDto + meyleRows.Add(new WzRowMeyleDto { ID = Guid.NewGuid(), Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), @@ -235,10 +235,39 @@ }); } - await WarehouseService.CreateWzRowsMeyleAsync(rows); + await WarehouseService.CreateWzRowsMeyleAsync(meyleRows); NavigationManager.NavigateTo("/Warehouse/Meyle/PackList/" + wzHeader.ID); + break; + case "MARELLI": + IList marelliRows = new List(); + IList marelliMaterialTransactions = _materialTransactions.Where(x => selectedRecords.Any(y => y.MTGroupNum == x.MTGroupNum)).ToList(); + + foreach (MaterialTransactionDto materialTransactionDto in marelliMaterialTransactions) + { + CustomerOrderDto customerOrder = await WarehouseService.GetCustomerOrder(materialTransactionDto.RefNum ?? string.Empty); + ItemCustDto item = await WarehouseService.GetItem(materialTransactionDto.Item ?? string.Empty, customerOrder.CustNum); + + marelliRows.Add(new WzRowMarelliDto + { + ID = Guid.NewGuid(), + Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), + ItemNumber = item.CustItem, + OrderNumber = customerOrder.CustPo, + WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, + FKHeader = wzHeader.ID, + TransactionNumber = (int?)materialTransactionDto.TransNum ?? 0, + Type = "MIX", + FaIndex = item.Item, + EngineerNumber = item.Uf_FKR_CustItem2 + }); + } + + await WarehouseService.CreateWzRowsMarelliAsync(marelliRows); + + NavigationManager.NavigateTo("/Warehouse/Marelli/PackList/" + wzHeader.ID); + break; } } diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 824a7ec..e82fd52 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -63,20 +63,34 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) } } - public async Task CreateWzRowsMeyleAsync(IEnumerable wzRowMeyles) + public async Task CreateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) { - if (wzRowMeyles == null || !wzRowMeyles.Any()) + if (wzRowsMeyle == null || !wzRowsMeyle.Any()) { throw new ArgumentException("No rows provided to create."); } - var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowMeyles); + var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowsMeyle); if (!response.IsSuccessStatusCode) { var errorContent = await response.Content.ReadAsStringAsync(); throw new HttpRequestException($"Failed to create WzRowMeyle: {response.StatusCode}, Content: {errorContent}"); } + } + + public async Task CreateWzRowsMarelliAsync(IEnumerable wzRowsMarelli) + { + if (wzRowsMarelli == null || !wzRowsMarelli.Any()) + { + throw new ArgumentException("No rows provided to create."); + } + var response = await _httpClient.PostAsJsonAsync("api/WzRowMarelli", wzRowsMarelli); + if (!response.IsSuccessStatusCode) + { + var errorContent = await response.Content.ReadAsStringAsync(); + throw new HttpRequestException($"Failed to create WzRowMarelli: {response.StatusCode}, Content: {errorContent}"); + } } public async Task GetCustomerOrder(string customerOrderNumber) @@ -95,12 +109,19 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) return await response.Content.ReadFromJsonAsync(); } - public async Task> GetWzRowsByWzHeaderId(Guid wzHeaderId) + public async Task> GetWzRowsMeyleByWzHeaderId(Guid wzHeaderId) { var response = await _httpClient.GetAsync($"api/WzRowMeyle/by-wz-header-id?wzHeaderId={wzHeaderId}"); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync>(); } + + public async Task> GetWzRowsMarelliByWzHeaderId(Guid wzHeaderId) + { + var response = await _httpClient.GetAsync($"api/WzRowMarelli/by-wz-header-id?wzHeaderId={wzHeaderId}"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); + } public async Task>> GetTransactionsModels() { @@ -124,6 +145,17 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) response.EnsureSuccessStatusCode(); } + public async Task UpdateWzRowsMarelliAsync(IEnumerable wzRowsMarelli) + { + if (wzRowsMarelli == null || !wzRowsMarelli.Any()) + { + throw new ArgumentException("No rows provided to update."); + } + + var response = await _httpClient.PutAsJsonAsync("api/WzRowMarelli", wzRowsMarelli); + response.EnsureSuccessStatusCode(); + } + public async Task GenerateXlsForMeyleAsync(Guid wzHeaderId) { var response = await _httpClient.GetAsync($"api/ExcelGenerator/generate-meyle?packListId={wzHeaderId}"); diff --git a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs index 05950ce..1d2d974 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs @@ -7,4 +7,5 @@ public class WzClientDto public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } public string Name { get; set; } + public string ShortName { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzClient.cs b/SytelineSaAppEfDataModel/Entities/WzClient.cs index d9af197..b83bc51 100644 --- a/SytelineSaAppEfDataModel/Entities/WzClient.cs +++ b/SytelineSaAppEfDataModel/Entities/WzClient.cs @@ -7,4 +7,5 @@ public class WzClient public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } public string Name { get; set; } + public string ShortName { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 1d9ee84..66ff00f 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -954,6 +954,11 @@ namespace SytelineSaAppEfDataModel .HasColumnName("Name") .HasMaxLength(255) .IsRequired(false); + + entity.Property(e => e.ShortName) + .HasColumnName("ShortName") + .HasMaxLength(30) + .IsRequired(false); }); modelBuilder.Entity(entity => @@ -2559,7 +2564,7 @@ namespace SytelineSaAppEfDataModel .HasMaxLength(50) .IsRequired(false); - entity.Property(e => e.WzNumber) + entity.Property(e => e.FaIndex) .HasColumnName("fa_index") .HasMaxLength(30) .IsRequired(false);