* Further improvements of scanning data

This commit is contained in:
2025-06-29 09:50:13 +02:00
parent 2bf87c0091
commit d3e6c815ac
2 changed files with 149 additions and 75 deletions

View File

@@ -210,7 +210,7 @@
private void OnRowDataBound(RowDataBoundEventArgs<ScheduleOrderDetailDetailDto> args) private void OnRowDataBound(RowDataBoundEventArgs<ScheduleOrderDetailDetailDto> args)
{ {
if (args.Data.QtyType == "83" || args.Data.QtyType == "84") if (new[] { "54", "83", "84" }.Any(x => x == args.Data.QtyType))
{ {
args.Row.AddClass(["highlight-red"]); args.Row.AddClass(["highlight-red"]);
} }

View File

@@ -1,4 +1,5 @@
@page "/Warehouse/PackList/{WzHeader:guid}" @page "/Warehouse/PackList/{WzHeader:guid}"
@using System.Diagnostics
@using OrdersManagement.Models @using OrdersManagement.Models
@using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Cards
@using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Grids
@@ -6,6 +7,7 @@
@using Syncfusion.Blazor.Navigations @using Syncfusion.Blazor.Navigations
@using Syncfusion.Blazor.Popups @using Syncfusion.Blazor.Popups
@using Syncfusion.Blazor.Inputs @using Syncfusion.Blazor.Inputs
@using Action = System.Action
@inject WarehouseService WarehouseService @inject WarehouseService WarehouseService
@@ -22,6 +24,12 @@
CssClass="e-outline"/> CssClass="e-outline"/>
</CardContent> </CardContent>
</SfCard> </SfCard>
<SfCard CssClass="shadow" style="width: 100%; max-width: 1200px;">
<CardContent>
<label for="textBox" class="form-label">Numer WZ:</label>
<SfTextBox ID="textBox" @bind-Value=@WzNumber CssClass="e-outline"/>
</CardContent>
</SfCard>
<SfCard> <SfCard>
<CardContent> <CardContent>
<label for="textBox" class="form-label">Wprowadź numer palety:</label> <label for="textBox" class="form-label">Wprowadź numer palety:</label>
@@ -64,8 +72,6 @@
HeaderText="Ilość w Dostawie" Width="80"></GridColumn> HeaderText="Ilość w Dostawie" Width="80"></GridColumn>
<GridColumn Field=@nameof(WzRowMeyleDto.PalletNumber) AllowEditing="true" <GridColumn Field=@nameof(WzRowMeyleDto.PalletNumber) AllowEditing="true"
TextAlign="TextAlign.Center" HeaderText="Nr Palety" Width="100"></GridColumn> TextAlign="TextAlign.Center" HeaderText="Nr Palety" Width="100"></GridColumn>
<GridColumn Field=@nameof(WzRowMeyleDto.WzNumber) AllowEditing="false" TextAlign="TextAlign.Center"
HeaderText="Nr WZ" Width="100"></GridColumn>
<GridColumn Field=@nameof(WzRowMeyleDto.PartNumberSl) AllowEditing="true" TextAlign="TextAlign.Center" <GridColumn Field=@nameof(WzRowMeyleDto.PartNumberSl) AllowEditing="true" TextAlign="TextAlign.Center"
HeaderText="Nr Partii SL" Width="80"></GridColumn> HeaderText="Nr Partii SL" Width="80"></GridColumn>
<GridColumn Field=@nameof(WzRowMeyleDto.PartNumber) AllowEditing="true" TextAlign="TextAlign.Center" <GridColumn Field=@nameof(WzRowMeyleDto.PartNumber) AllowEditing="true" TextAlign="TextAlign.Center"
@@ -112,11 +118,11 @@
<SfDialog Width="500px" Title="Błąd" IsModal="true" @bind-Visible="VisibilityValidation" AllowPrerender="true"> <SfDialog Width="500px" Title="Błąd" IsModal="true" @bind-Visible="VisibilityValidation" AllowPrerender="true">
<DialogTemplates> <DialogTemplates>
<Content> <Content>
<p>Błąd skanowania! Wystąpił jeden z wyjątków:</p> <p>Błąd skanowania! Wystąpił jeden z wyjątków (Zeskanowana wartość '<b>@ScannedValue</b>'):</p>
<ul> <ul>
<li><p>Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)</p></li> <li><p>Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)</p></li>
<li><p>Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od <b>@($"{DateTime.Now.Year - 2000}X")</b>)</p></li> <li><p>Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od <b>@($"{DateTime.Now.Year - 2000}X")</b>)</p></li>
<li><p>Numer Palety nie jest większy niż 0</p></li> <li><p>Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: '<b>@PalletNumber</b>')</p></li>
</ul> </ul>
</Content> </Content>
</DialogTemplates> </DialogTemplates>
@@ -156,6 +162,9 @@
private SfTextBox _scanner; private SfTextBox _scanner;
private WzRowMeyleDto? SelectedRow { get; set; } private WzRowMeyleDto? SelectedRow { get; set; }
private List<WzRowMeyleDto> SelectedRows { get; set; } = new();
private string WzNumber { get; set; } = string.Empty;
private bool _isValid; private bool _isValid;
@@ -178,6 +187,11 @@
Visibility = false; Visibility = false;
VisibilityValidation = false; VisibilityValidation = false;
VisibilityLineSplitter = false; VisibilityLineSplitter = false;
LastScannedValue = ScannedValue;
ScannedValue = string.Empty;
_scanner.FocusAsync();
} }
protected override async Task OnAfterRenderAsync(bool firstRender) protected override async Task OnAfterRenderAsync(bool firstRender)
@@ -191,6 +205,8 @@
EmailAddresses = _wzHeader.EmailAddresses; EmailAddresses = _wzHeader.EmailAddresses;
WzNumber = _wzHeader.WzNumbers ?? string.Empty;
await _scanner.FocusAsync(); await _scanner.FocusAsync();
StateHasChanged(); StateHasChanged();
} }
@@ -237,91 +253,51 @@
Visibility = true; Visibility = true;
} }
private async Task ScanValue(ChangedEventArgs obj) private void ScanValue(ChangedEventArgs obj)
{ {
if (string.IsNullOrWhiteSpace(obj.Value)) return; if (string.IsNullOrWhiteSpace(obj.Value)) return;
if (int.Parse(PalletNumber) <= 0)
{
ShowValidationMessage();
return;
}
int palletNumber = int.Parse(PalletNumber); ScannedValue = obj.Value.Trim();
StateHasChanged();
TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List<TransactionModel>? materialTransactionsByPartNumber); TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List<TransactionModel>? materialTransactionsByPartNumber);
TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault();
if (materialTransactionByPartNumber == null && IsValidScannedValue(obj.Value))
{
FillMeylePartNumber(ScannedValue);
LastScannedValue = ScannedValue;
ScannedValue = string.Empty;
return;
}
if (materialTransactionByPartNumber != null) if (materialTransactionByPartNumber != null)
{ {
var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); SelectedRows.Clear();
//rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == "FA23956.18" && x.Quantity == 130); FillFaPartNumberAndPalletNumber(materialTransactionByPartNumber, obj.Value.Trim());
if (rowIndex == -1 || palletNumber <= 0)
{
VisibilityValidation = true;
LastScannedValue = ScannedValue;
ScannedValue = string.Empty;
await _scanner.FocusAsync();
return;
}
SelectedRow = WzRowsMeyle[rowIndex];
SelectedRow.PartNumberSl = ScannedValue;
SelectedRow.PalletNumber = palletNumber;
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);
rowIndex %= pageSize;
}
await _grid.SelectRowAsync(rowIndex);
await _grid.ScrollIntoViewAsync(rowIndex: rowIndex);
await _grid.FocusAsync();
ChangedRecords.Clear();
} }
else if (ValidateScannedValue(obj.Value) && SelectedRow != null)
if (materialTransactionByPartNumber == null)
{ {
SelectedRow.PartNumber = obj.Value.Trim(); ShowValidationMessage();
return;
if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber))
{
ChangedRecords.Add(SelectedRow);
}
await SaveChanges();
await InvokeAsync(StateHasChanged);
await _grid.Refresh();
ChangedRecords.Clear();
}
else
{
VisibilityValidation = true;
ScannedValue = obj.Value.Trim();
SelectedRow = null;
} }
LastScannedValue = ScannedValue; LastScannedValue = ScannedValue;
ScannedValue = string.Empty; ScannedValue = string.Empty;
await _scanner.FocusAsync(); _scanner.FocusAsync();
} }
private bool ValidateScannedValue(string scannedValue) private bool IsValidScannedValue(string scannedValue)
{ {
int year = DateTime.Now.Year - 2000; int year = DateTime.Now.Year - 2000;
@@ -330,6 +306,104 @@
return scannedValue.StartsWith(format); return scannedValue.StartsWith(format);
} }
private void FillMeylePartNumber(string scannedValue)
{
if (SelectedRow != null)
{
SelectedRow.PartNumber = scannedValue;
ChangedRecords.Add(SelectedRow);
}
foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows)
{
wzRowMeyleDto.PartNumber = scannedValue;
ChangedRecords.Add(wzRowMeyleDto);
}
SaveChanges();
InvokeAsync(StateHasChanged);
_grid.Refresh();
_scanner.FocusAsync();
ChangedRecords.Clear();
}
private void FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue)
{
var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity);
switch (rowIndex)
{
case -1 when int.Parse(PalletNumber) <= 0:
ShowValidationMessage();
LastScannedValue = ScannedValue;
ScannedValue = string.Empty;
return;
case -1:
{
SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList();
if (SelectedRows.Count == 0)
{
ShowValidationMessage();
return;
}
foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows)
{
wzRowMeyleDto.PartNumberSl = scannedValue;
ChangedRecords.Add(wzRowMeyleDto);
}
break;
}
default:
{
SelectedRow = WzRowsMeyle[rowIndex];
SelectedRow.PartNumberSl = ScannedValue;
SelectedRow.PalletNumber = int.Parse(PalletNumber);
if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber))
{
ChangedRecords.Add(SelectedRow);
}
FocusGridRow(rowIndex);
break;
}
}
SaveChanges();
InvokeAsync(StateHasChanged);
_grid.Refresh();
_scanner.FocusAsync();
ChangedRecords.Clear();
}
private void FocusGridRow(int rowIndex)
{
if (_grid.AllowPaging)
{
int pageSize = _grid.PageSettings.PageSize;
int targetPage = (rowIndex / pageSize) + 1;
_grid.GoToPageAsync(targetPage);
rowIndex %= pageSize;
}
_grid.SelectRowAsync(rowIndex);
_grid.ScrollIntoViewAsync(rowIndex: rowIndex);
_grid.FocusAsync();
}
private void ShowValidationMessage()
{
VisibilityValidation = true;
ChangedRecords.Clear();
_scanner.FocusAsync();
}
private async Task<IDictionary<string, List<TransactionModel>>> GetTransactionModels() private async Task<IDictionary<string, List<TransactionModel>>> GetTransactionModels()
{ {
return await WarehouseService.GetTransactionsModels(); return await WarehouseService.GetTransactionsModels();
@@ -360,7 +434,7 @@
OrderNumber = SelectedRow.OrderNumber, OrderNumber = SelectedRow.OrderNumber,
PalletNumber = SelectedRow.PalletNumber, PalletNumber = SelectedRow.PalletNumber,
WzNumber = SelectedRow.WzNumber, WzNumber = SelectedRow.WzNumber,
TransactionNumber = SelectedRow.TransactionNumber TransactionNumber = SelectedRow.TransactionNumber += 10000
}; };
WzRowsMeyle.Add(splitRow); WzRowsMeyle.Add(splitRow);