Warehouses #1

Merged
trent merged 159 commits from Warehouses into master 2026-01-10 20:24:17 +00:00
6 changed files with 101 additions and 24 deletions
Showing only changes of commit 9cb7210aa5 - Show all commits

View File

@@ -206,7 +206,8 @@
ItemNumber = item.CustItem, ItemNumber = item.CustItem,
OrderNumber = customerOrder.CustPo, OrderNumber = customerOrder.CustPo,
WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty, WzNumber = materialTransactionDto.MTGroupNum ?? string.Empty,
FK_Header = wzHeader.ID FK_Header = wzHeader.ID,
TransactionNumber = (int?)materialTransactionDto.TransNum ?? 0
}); });
} }

View File

@@ -1,4 +1,5 @@
@page "/Warehouse/PackList/{WzHeader:guid}" @page "/Warehouse/PackList/{WzHeader:guid}"
@using OrdersManagement.Models
@using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Cards
@using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Grids
@using SytelineSaAppEfDataModel.Dtos @using SytelineSaAppEfDataModel.Dtos
@@ -17,17 +18,21 @@
<SfCard CssClass="shadow" style="width: 100%; max-width: 1200px;"> <SfCard CssClass="shadow" style="width: 100%; max-width: 1200px;">
<CardContent> <CardContent>
<label for="textBox" class="form-label">Adresy Email do Wysyłki raportu:</label> <label for="textBox" class="form-label">Adresy Email do Wysyłki raportu:</label>
<SfTextBox ID="textBox" Placeholder="Wprowadź adresy..." @bind-Value="@EmailAddresses" CssClass="e-outline"/> <SfTextBox ID="textBox" Placeholder="Wprowadź adresy..." @bind-Value="@EmailAddresses"
CssClass="e-outline"/>
</CardContent> </CardContent>
</SfCard> </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>
<SfTextBox ID="palletNumber" Type="InputType.Number" @bind-Value="@PalletNumber" CssClass="e-outline"/> <SfTextBox ID="palletNumber" Type="InputType.Number" @bind-Value="@PalletNumber"
CssClass="e-outline"/>
<label for="textBox" class="form-label">Zeskanowana wartość:</label> <label for="textBox" class="form-label">Zeskanowana wartość:</label>
<SfTextBox ID="scannedValue" @onkeydown="ScanValue" @bind-Value="ScannedValue" CssClass="e-outline"/> <SfTextBox ID="scannedValue" ValueChange="ScanValue" @bind-Value="ScannedValue"
CssClass="e-outline" @ref="_scanner" />
<label for="textBox" class="form-label">Zeskanowane wartości:</label> <label for="textBox" class="form-label">Zeskanowane wartości:</label>
<SfTextBox ID="scannedText" Multiline="true" @bind-Value="@ScannedValues" Readonly="true" CssClass="e-outline"/> <SfTextBox ID="scannedText" Multiline="true" @bind-Value="@ScannedValues" Readonly="true"
CssClass="e-outline"/>
</CardContent> </CardContent>
</SfCard> </SfCard>
<SfGrid @ref="_grid" <SfGrid @ref="_grid"
@@ -91,7 +96,8 @@
} }
else if (!_isValid) else if (!_isValid)
{ {
<p>Błąd: Nie Wszystkie linie mają wypełniony <b>NUMER PALETY</b>.<br/>Packing List nie zostanie wygenerowany!</p> <p>Błąd: Nie Wszystkie linie mają wypełniony <b>NUMER PALETY</b>.<br/>Packing List nie zostanie
wygenerowany!</p>
} }
</Content> </Content>
</DialogTemplates> </DialogTemplates>
@@ -112,6 +118,7 @@
private SfGrid<WzRowMeyleDto> _grid; private SfGrid<WzRowMeyleDto> _grid;
private IEnumerable<WzRowMeyleDto> _wzRowsMeyle { get; set; } = new List<WzRowMeyleDto>(); private IEnumerable<WzRowMeyleDto> _wzRowsMeyle { get; set; } = new List<WzRowMeyleDto>();
private WzHeaderDto _wzHeader; private WzHeaderDto _wzHeader;
private SfTextBox _scanner;
private bool _isValid; private bool _isValid;
@@ -121,7 +128,7 @@
private string PalletNumber { get; set; } = "0"; private string PalletNumber { get; set; } = "0";
private string ScannedValues { get; set; } = string.Empty; private string ScannedValues { get; set; } = string.Empty;
private IDictionary<string, string?> ScannedValuesWithItems { get; set; } = new Dictionary<string, string?>(); private IDictionary<RowMeyleModel, string?> ScannedValuesWithItems { get; set; } = new Dictionary<RowMeyleModel, string?>();
private string LastScannedValue { get; set; } = string.Empty; private string LastScannedValue { get; set; } = string.Empty;
private string ScannedValue { get; set; } = string.Empty; private string ScannedValue { get; set; } = string.Empty;
@@ -138,21 +145,46 @@
_wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader);
_wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader); _wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader);
_wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(x.ItemNumber.Replace(" ", ""), null)); _wzRowsMeyle.ToList().ForEach(x => ScannedValuesWithItems.Add(new RowMeyleModel
{
ItemNumber = x.ItemNumber.Replace(" ", "").Replace("-", ""),
TransactionNumber = x.TransactionNumber,
WzNumber = x.WzNumber
}, null));
EmailAddresses = _wzHeader.EmailAddresses; EmailAddresses = _wzHeader.EmailAddresses;
await _scanner.FocusAsync();
StateHasChanged(); StateHasChanged();
} }
} }
private async Task SaveChanges() private async Task SaveChanges()
{ {
List<WzRowMeyleDto> changedRecords = new List<WzRowMeyleDto>();
if (!string.IsNullOrWhiteSpace(EmailAddresses)) if (!string.IsNullOrWhiteSpace(EmailAddresses))
{ {
await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses);
} }
IDictionary<RowMeyleModel, string?> scannedValuesWithNotNullValues = ScannedValuesWithItems.Where(x => x.Value is not null).ToDictionary(x => x.Key, y => y.Value);
foreach (KeyValuePair<RowMeyleModel, string?> scannedValueWithNotNullValue in scannedValuesWithNotNullValues)
{
WzRowMeyleDto rowMeyleDto = _wzRowsMeyle.First(r => r.ItemNumber.Replace(" ", "").Replace("-", "").Trim() == scannedValueWithNotNullValue.Key.ItemNumber && r.TransactionNumber == scannedValueWithNotNullValue.Key.TransactionNumber && r.WzNumber == scannedValueWithNotNullValue.Key.WzNumber);
rowMeyleDto.PalletNumber = int.Parse(PalletNumber);
rowMeyleDto.PartNumber = scannedValueWithNotNullValue.Value;
changedRecords.Add(rowMeyleDto);
}
if (changedRecords.Any())
{
await UpdateRows(changedRecords);
}
await _grid.EndEditAsync(); await _grid.EndEditAsync();
} }
@@ -163,11 +195,7 @@
if (!changedRecords.Any()) return; if (!changedRecords.Any()) return;
await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords); await UpdateRows(changedRecords);
_wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader);
StateHasChanged();
await _grid.Refresh();
} }
private async Task ExportXls() private async Task ExportXls()
@@ -186,20 +214,33 @@
Visibility = true; Visibility = true;
} }
private void ScanValue(KeyboardEventArgs obj) private void ScanValue(ChangedEventArgs obj)
{ {
if (obj.Key != "Enter") return; if (string.IsNullOrWhiteSpace(obj.Value)) return;
LastScannedValue = ScannedValue.Trim(); ScannedValue = obj.Value.Replace(" ", "").Replace("-", "").Replace("http://qr.meyle.com/", "").Trim();
ScannedValue = ScannedValue.Replace("40409100006", "1409100076");
if (!ScannedValuesWithItems.ContainsKey(ScannedValues.Replace(" ", "").Trim()) && ScannedValuesWithItems.ContainsKey(LastScannedValue.Replace(" ", "").Trim())) if (ScannedValuesWithItems.All(x => x.Key.ItemNumber != ScannedValue.Replace(" ", "").Trim()) && ScannedValuesWithItems.Any(x => x.Key.ItemNumber == LastScannedValue.Replace(" ", "").Trim()))
{ {
ScannedValuesWithItems[LastScannedValue] = ScannedValue.Trim(); RowMeyleModel key = ScannedValuesWithItems.First(x => x.Key.ItemNumber == LastScannedValue).Key;
ScannedValues += $"{ScannedValue})\n"; ScannedValuesWithItems[key] = ScannedValue.Trim();
ScannedValues += $"{ScannedValue}\n";
} }
else if (!string.IsNullOrWhiteSpace(ScannedValue)) else if (!string.IsNullOrWhiteSpace(ScannedValue))
{ {
ScannedValues += $"{ScannedValue}: "; ScannedValues += $"{ScannedValue}: ";
} }
LastScannedValue = ScannedValue;
ScannedValue = string.Empty;
}
private async Task UpdateRows(IList<WzRowMeyleDto> changedRecords)
{
await WarehouseService.UpdateWzRowsMeyleAsync(changedRecords);
_wzRowsMeyle = await WarehouseService.GetWzRowsByWzHeaderId(WzHeader);
StateHasChanged();
await _grid.Refresh();
} }
} }

View File

@@ -0,0 +1,28 @@
namespace OrdersManagement.Models;
public class RowMeyleModel : IEquatable<RowMeyleModel>
{
public string ItemNumber {get; set;} = string.Empty;
public string WzNumber { get; set; } = string.Empty;
public int? TransactionNumber { get; set; }
public bool Equals(RowMeyleModel? other)
{
if (other is null) return false;
if (ReferenceEquals(this, other)) return true;
return ItemNumber == other.ItemNumber && WzNumber == other.WzNumber && TransactionNumber == other.TransactionNumber;
}
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((RowMeyleModel)obj);
}
public override int GetHashCode()
{
return HashCode.Combine(ItemNumber, WzNumber, TransactionNumber);
}
}

View File

@@ -10,4 +10,5 @@ public class WzRowMeyleDto
public int? PalletNumber { get; set; } public int? PalletNumber { get; set; }
public string WzNumber { get; set; } public string WzNumber { get; set; }
public string? PartNumber { get; set; } public string? PartNumber { get; set; }
public int? TransactionNumber { get; set; }
} }

View File

@@ -10,6 +10,7 @@ public class WzRowMeyle
public int? PalletNumber { get; set; } public int? PalletNumber { get; set; }
public string WzNumber { get; set; } public string WzNumber { get; set; }
public string? PartNumber { get; set; } public string? PartNumber { get; set; }
public int? TransactionNumber { get; set; }
// Navigation property // Navigation property
public WzHeader Header { get; set; } public WzHeader Header { get; set; }

View File

@@ -996,6 +996,11 @@ namespace SytelineSaAppEfDataModel
.HasMaxLength(100) .HasMaxLength(100)
.IsRequired(false); .IsRequired(false);
entity.Property(e => e.TransactionNumber)
.HasColumnName("trans_num")
.HasColumnType("int")
.IsRequired(false);
// Relationship // Relationship
entity.HasOne(e => e.Header) entity.HasOne(e => e.Header)
.WithMany() .WithMany()