From 30d2984add0089d040c973c9bb91677b789dbf6b Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Tue, 17 Jun 2025 22:05:15 +0200 Subject: [PATCH] * Further improvements --- .../Controllers/WzRowMeyleController.cs | 7 + .../Components/Pages/WarehousePackList.razor | 133 ++++++++++-------- OrdersManagement/Models/TransactionModel.cs | 29 ++++ OrdersManagement/Services/WarehouseService.cs | 14 +- .../Services/IMaterialTransactionService.cs | 1 + .../Services/MaterialTransactionService.cs | 7 + 6 files changed, 133 insertions(+), 58 deletions(-) create mode 100644 OrdersManagement/Models/TransactionModel.cs diff --git a/FaKrosnoApi/Controllers/WzRowMeyleController.cs b/FaKrosnoApi/Controllers/WzRowMeyleController.cs index 97d7305..265176d 100644 --- a/FaKrosnoApi/Controllers/WzRowMeyleController.cs +++ b/FaKrosnoApi/Controllers/WzRowMeyleController.cs @@ -41,6 +41,13 @@ public class WzRowMeyleController(IWzRowMeyleService service, IMaterialTransacti return Ok(materialTransaction); } + [HttpGet("transactions-with-part-number")] + public async Task> GetTransactionsWithPartNumber() + { + IEnumerable materialTransactions = await materialTransactionService.GetWithPartNumber(); + return Ok(materialTransactions); + } + [HttpPut] public async Task UpdateRows([FromBody] IEnumerable rows) { diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 7103e87..8237e42 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -30,9 +30,6 @@ - - Błąd: Nie Wszystkie linie mają wypełniony NUMER PALETY.
Packing List nie zostanie wygenerowany!

} + else if (!_notValidatedNumber) + { +

Błąd: Proszę zeskanować poprawny Numer Partii SL (istniejący w tabeli) lub poprawny numer Partii Meyle zaczynający się od @($"{DateTime.Now.Year - 2001}X")!

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

Błąd: Proszę zeskanować poprawny Numer Partii SL (istniejący w tabeli) lub poprawny numer Partii Meyle zaczynający się od @($"{DateTime.Now.Year - 2000}X")!

@@ -120,21 +132,22 @@ [Parameter] public Guid WzHeader { get; set; } private SfGrid _grid; - private List WzRowsMeyle { get; set; } = new List(); + private List WzRowsMeyle { get; set; } = new(); + private IDictionary> TransactionModelsByPartNumber { get; set; } = new Dictionary>(); + private List ChangedRecords = new(); private WzHeaderDto _wzHeader; private SfTextBox _scanner; private WzRowMeyleDto? SelectedRow { get; set; } private bool _isValid; + private bool _notValidatedNumber; private bool Visibility { get; set; } + private bool VisibilityValidation { get; set; } private string? EmailAddresses { get; set; } = string.Empty; private string PalletNumber { get; set; } = "0"; - private string ScannedValues { get; set; } = string.Empty; - - private IDictionary ScannedValuesWithItems { get; set; } = new Dictionary(); private string LastScannedValue { get; set; } = string.Empty; private string ScannedValue { get; set; } = string.Empty; @@ -142,6 +155,7 @@ private void HideModal() { Visibility = false; + VisibilityValidation = false; } protected override async Task OnAfterRenderAsync(bool firstRender) @@ -150,15 +164,9 @@ { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - - WzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(new RowMeyleModel - { - ItemNumber = x.ItemNumber.Replace(" ", "").Replace("-", ""), - PartNumberSl = x.PartNumberSl, - TransactionNumber = x.TransactionNumber, - WzNumber = x.WzNumber - }, null)); - + + TransactionModelsByPartNumber = await GetTransactionModels(); + EmailAddresses = _wzHeader.EmailAddresses; await _scanner.FocusAsync(); @@ -167,29 +175,15 @@ } private async Task SaveChanges() - { - List changedRecords = new List(); - + { if (!string.IsNullOrWhiteSpace(EmailAddresses)) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); } - IDictionary scannedValuesWithNotNullValues = ScannedValuesWithItems.Where(x => x.Value is not null).ToDictionary(x => x.Key, y => y.Value); - - foreach (KeyValuePair scannedValueWithNotNullValue in scannedValuesWithNotNullValues) + if (ChangedRecords.Any()) { - WzRowMeyleDto rowMeyleDto = WzRowsMeyle.First(r => r.ItemNumber.Replace(" ", "").Replace("-", "").Trim() == scannedValueWithNotNullValue.Key.ItemNumber && r.PartNumberSl == scannedValueWithNotNullValue.Key.PartNumberSl && r.WzNumber == scannedValueWithNotNullValue.Key.WzNumber); - - rowMeyleDto.PalletNumber = int.Parse(PalletNumber); - rowMeyleDto.PartNumber = scannedValueWithNotNullValue.Value; - - changedRecords.Add(rowMeyleDto); - } - - if (changedRecords.Any()) - { - await UpdateRows(changedRecords); + await UpdateRows(ChangedRecords); } await _grid.EndEditAsync(); @@ -223,55 +217,75 @@ private async Task ScanValue(ChangedEventArgs obj) { + _notValidatedNumber = false; + if (string.IsNullOrWhiteSpace(obj.Value)) return; - MaterialTransactionDto? materialTransactionByPartNumber = await GetMaterialTransactionByPartNumber(ScannedValue).ConfigureAwait(false); + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); + + TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); if (materialTransactionByPartNumber != null) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.Item && x.Quantity == materialTransactionByPartNumber.Qty); - rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA24278.18" && x.Quantity == 70); + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); + + SelectedRow = WzRowsMeyle[rowIndex]; + + SelectedRow.PartNumberSl = ScannedValue; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + await SaveChanges(); + await InvokeAsync(StateHasChanged); + await _grid.Refresh(); if (_grid.AllowPaging) { int pageSize = _grid.PageSettings.PageSize; int targetPage = (rowIndex / pageSize) + 1; - await _grid.GoToPageAsync(targetPage).ConfigureAwait(false); + await _grid.GoToPageAsync(targetPage); rowIndex %= pageSize; } - - await _grid.SelectRowAsync(rowIndex).ConfigureAwait(false); - await _grid.ScrollIntoViewAsync(rowIndex: rowIndex).ConfigureAwait(false); - await _grid.FocusAsync().ConfigureAwait(false); - - SelectedRow = WzRowsMeyle[rowIndex]; + + await _grid.SelectRowAsync(rowIndex); + await _grid.ScrollIntoViewAsync(rowIndex: rowIndex); + await _grid.FocusAsync(); + + ChangedRecords.Clear(); } else if (ValidateScannedValue(obj.Value) && SelectedRow != null) { SelectedRow.PartNumber = obj.Value.Trim(); - await InvokeAsync(StateHasChanged).ConfigureAwait(false); - await _grid.Refresh().ConfigureAwait(false); + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + await SaveChanges(); + await InvokeAsync(StateHasChanged); + await _grid.Refresh(); + + ChangedRecords.Clear(); } else { + _notValidatedNumber = true; + VisibilityValidation = true; + ScannedValue = obj.Value.Trim(); SelectedRow = null; } - // if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim())) - // { - // RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key; - // ScannedValuesWithItems[key] = ScannedValue.Trim(); - // ScannedValues += $"{ScannedValue}\n"; - // } - // else if (!string.IsNullOrWhiteSpace(ScannedValue)) - // { - // ScannedValues += $"{ScannedValue}: "; - // } - LastScannedValue = ScannedValue; ScannedValue = string.Empty; + + await _scanner.FocusAsync(); } private bool ValidateScannedValue(string scannedValue) @@ -290,12 +304,17 @@ return materialTransaction; } + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + private async Task UpdateRows(IList changedRecords) { await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - StateHasChanged(); + await InvokeAsync(StateHasChanged); await _grid.Refresh(); } } \ No newline at end of file diff --git a/OrdersManagement/Models/TransactionModel.cs b/OrdersManagement/Models/TransactionModel.cs new file mode 100644 index 0000000..5348642 --- /dev/null +++ b/OrdersManagement/Models/TransactionModel.cs @@ -0,0 +1,29 @@ +namespace OrdersManagement.Models; + +public class TransactionModel : IEquatable +{ + public string? PartNumber { get; set; } + public string? ItemNumber { get; set; } + public decimal? Quantity { get; set; } + + + public bool Equals(TransactionModel? other) + { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + return PartNumber == other.PartNumber; + } + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((TransactionModel)obj); + } + + public override int GetHashCode() + { + return PartNumber.GetHashCode(); + } +} \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index f9321ae..c05c99f 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -1,5 +1,6 @@ using System.Net; using System.Web; +using OrdersManagement.Models; using SytelineSaAppEfDataModel.Dtos; namespace OrdersManagement.Services; @@ -100,7 +101,18 @@ public class WarehouseService(IHttpClientFactory httpClientFactory) response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync>(); } - + + public async Task>> GetTransactionsModels() + { + var response = await _httpClient.GetAsync($"api/WzRowMeyle/transactions-with-part-number"); + response.EnsureSuccessStatusCode(); + IEnumerable materialTransactions = + await response.Content.ReadFromJsonAsync>(); + + return materialTransactions.GroupBy(x => x.NR_KARTY_KONTROLNEJ).ToDictionary(x => x.Key ?? "", + y => y.Select(z => new TransactionModel() { ItemNumber = z.Item, PartNumber = z.NR_KARTY_KONTROLNEJ, Quantity = z.Qty }).ToList()); + } + public async Task UpdateWzRowsMeyleAsync(IEnumerable wzRowsMeyle) { if (wzRowsMeyle == null || !wzRowsMeyle.Any()) diff --git a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs index ccae08a..b7709ce 100644 --- a/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/IMaterialTransactionService.cs @@ -11,4 +11,5 @@ public interface IMaterialTransactionService Task> GetOrderNumbersByWz(ISet wzNumbers); Task> GetByCustomerNumber(string customerNumber, int customerSequence); Task GetByPartNumber(string partNumber); + Task> GetWithPartNumber(); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs index 46e5ffb..2ff8933 100644 --- a/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs +++ b/SytelineSaAppEfDataModel/Services/MaterialTransactionService.cs @@ -90,4 +90,11 @@ public class MaterialTransactionService(SytelineSaAppDbContext context, IMapper .Where(x => x.NR_KARTY_KONTROLNEJ == partNumber) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); } + + public async Task> GetWithPartNumber() + { + return await context.MaterialTransactions + .Where(x => x.NR_KARTY_KONTROLNEJ != null) + .Select(x => mapper.Map(x)).ToListAsync(); + } } \ No newline at end of file