@page "/Warehouse/PackList/{WzHeader:guid}/Simple" @using OrdersManagement.Models @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @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 @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; } private void ChangeView() { NavigationManager.NavigateTo($"/Warehouse/PackList/{WzHeader}"); } }