@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}");
}
}