diff --git a/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor new file mode 100644 index 0000000..d88359b --- /dev/null +++ b/OrdersManagement/Components/Pages/WarehousePacklistSimple.razor @@ -0,0 +1,413 @@ +@page "/Warehouse/PackList/{WzHeader:guid}/Simple" +@using OrdersManagement.Models +@using Syncfusion.Blazor.Cards +@using Syncfusion.Blazor.Grids +@using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Popups +@using Syncfusion.Blazor.Inputs +@using FilterType = Syncfusion.Blazor.Grids.FilterType + +@inject WarehouseService WarehouseService + +
+ + +

Packing List

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @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! Wystąpił jeden z wyjątków (Zeskanowana wartość '@ScannedValue'):

+
    +
  • Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)

  • +
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od + @($"{DateTime.Now.Year - 2000}X"))

  • +
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: + '@PalletNumber')

  • +
+
+
+ + + +
+ + + + +

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 WzRowsMeyle { 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 PartNumberSl { get; set; } = string.Empty; + private string PartNumberMeyle { get; set; } = string.Empty; + + private string WzNumber { get; set; } = string.Empty; + + private WzRowMeyleDto? SelectedRow { get; set; } + private List SelectedRows { get; set; } = new(); + + private bool _isValid; + + private bool Visibility { get; set; } + private bool VisibilityValidation { get; set; } + private bool VisibilityLineSplitter { 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() + { + Visibility = false; + VisibilityValidation = false; + VisibilityLineSplitter = false; + VisibilityPalletNumber = false; + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); + WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(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 OnBatchSave(BeforeBatchSaveArgs obj) + { + var changes = obj.BatchChanges; + List changedRecords = changes.ChangedRecords; + + if (!changedRecords.Any()) return; + + await UpdateRows(changedRecords); + } + + private async Task ExportXls() + { + int count = WzRowsMeyle.Count(x => x.PalletNumber == null); + + _isValid = count == 0; + _isValid = _isValid && !string.IsNullOrWhiteSpace(EmailAddresses); + + if (_isValid) + { + await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); + await WarehouseService.GenerateXlsForMeyleAsync(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 && IsValidScannedValue(obj.Value)) + { + FillMeylePartNumber(ScannedValue); + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + return; + } + + if (materialTransactionByPartNumber != null) + { + FillFaPartNumberAndPalletNumber(materialTransactionByPartNumber, obj.Value.Trim()); + } + + if (materialTransactionByPartNumber == null) + { + ShowValidationMessage(); + return; + } + + LastScannedValue = ScannedValue; + ScannedValue = string.Empty; + + _scanner.FocusAsync(); + } + + private bool IsValidScannedValue(string scannedValue) + { + int year = DateTime.Now.Year - 2000; + + string format = $"{year}X"; + + return scannedValue.StartsWith(format); + } + + private async Task FillMeylePartNumber(string scannedValue) + { + if (SelectedRow != null && !SelectedRows.Any()) + { + SelectedRow.PartNumber = scannedValue; + ChangedRecords.Add(SelectedRow); + + PartNumberMeyle = scannedValue; + } + + foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows) + { + wzRowMeyleDto.PartNumber = scannedValue; + ChangedRecords.Add(wzRowMeyleDto); + } + + await SaveChanges(); + + ChangedRecords.Clear(); + SelectedRows.Clear(); + + await _scanner.FocusAsync(); + } + + private async Task FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + { + await InvokeAsync(StateHasChanged); + + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + + switch (rowIndex) + { + case -1: + { + SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); + + if (SelectedRows.Count == 0) + { + ShowValidationMessage(); + return; + } + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) + { + foreach (var record in combination) + { + record.PartNumberSl = scannedValue; + record.PalletNumber = palletNumber; + ChangedRecords.Add(record); + } + } + + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + + SelectedRow = SelectedRows.FirstOrDefault(); + + break; + } + default: + { + SelectedRow = WzRowsMeyle[rowIndex]; + + SelectedRow.PartNumberSl = scannedValue; + SelectedRow.PalletNumber = palletNumber; + + if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) + { + ChangedRecords.Add(SelectedRow); + } + + break; + } + } + + PartNumberSl = SelectedRow?.PartNumberSl ?? string.Empty; + PalletNumberOutput = SelectedRow?.PalletNumber.ToString() ?? "0"; + ItemNumber = SelectedRow?.FaIndex ?? string.Empty; + Qty = SelectedRow?.Quantity.ToString() ?? "0"; + + await SaveChanges(); + ChangedRecords.Clear(); + await _scanner.FocusAsync(); + } + + private void ShowValidationMessage() + { + VisibilityValidation = true; + + ChangedRecords.Clear(); + _scanner.FocusAsync(); + } + + private async Task>> GetTransactionModels() + { + return await WarehouseService.GetTransactionsModels(); + } + + private async Task UpdateRows(IList changedRecords) + { + await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); + + WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(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; + } +} \ No newline at end of file