HeReport - columns order changed, new filter property bool

This commit is contained in:
Stoyan Zlatev
2023-04-13 16:09:10 +02:00
parent bd14271451
commit df43169f79
20 changed files with 201 additions and 159 deletions
@@ -70,6 +70,7 @@
<Compile Include="Models\HeliumReportItem.cs" />
<Compile Include="Models\HeliumReportModel.cs" />
<Compile Include="Models\HeliumReportModelExtensions.cs" />
<Compile Include="Models\OrderIdentity.cs" />
<Compile Include="Models\PalletPosition.cs" />
<Compile Include="Models\RoleModel.cs" />
<Compile Include="Models\UserRole.cs" />
@@ -11,25 +11,25 @@
{
var model = default(HeliumReportItem);
this.Add(model.Property(x => x.FertigungNr, this.Count));
this.Add(model.Property(x => x.AuftragNr, this.Count));
this.Add(model.Property(x => x.PositionNr, this.Count));
this.Add(model.Property(x => x.SerialNr, this.Count));
this.Add(model.Property(x => x.IdentNr, this.Count));
this.Add(model.Property(x => x.HeId, this.Count));
this.Add(model.Property(x => x.HeTestId, this.Count));
this.Add(model.Property(x => x.PcbId, this.Count));
this.Add(model.Property(x => x.Nennweite, this.Count));
this.Add(model.Property(x => x.Baulaenge, this.Count));
this.Add(model.Property(x => x.Typ, this.Count));
this.Add(model.Property(x => x.Druck, this.Count));
this.Add(model.Property(x => x.Temperatur, this.Count));
this.Add(model.Property(x => x.HeLakeRate, this.Count));
this.Add(model.Property(x => x.HeTestPressure, this.Count));
this.Add(model.Property(x => x.IsValid, this.Count));
this.Add(model.Text(x => x.FertigungNr, this.Count));
this.Add(model.Text(x => x.AuftragNr, this.Count));
this.Add(model.Text(x => x.PositionNr, this.Count));
this.Add(model.Text(x => x.SerialNr, this.Count));
this.Add(model.Text(x => x.IdentNr, this.Count));
this.Add(model.Text(x => x.HeId, this.Count));
this.Add(model.Text(x => x.HeTestId, this.Count));
this.Add(model.Text(x => x.PcbId, this.Count));
this.Add(model.Text(x => x.Nennweite, this.Count));
this.Add(model.Text(x => x.Baulaenge, this.Count));
this.Add(model.Text(x => x.Typ, this.Count));
this.Add(model.Text(x => x.Druck, this.Count));
this.Add(model.Text(x => x.Temperatur, this.Count));
this.Add(model.Text(x => x.HeLakeRate, this.Count));
this.Add(model.Text(x => x.HeTestPressure, this.Count));
this.Add(model.Boolean(x => x.IsValid, this.Count));
this.Add(model.Text(x => x.Text, this.Count));
this.Add(model.DateTime(x => x.TestDate, this.Count, -1));
this.Add(model.Property(x => x.Tester, this.Count));
this.Add(model.Property(x => x.Text, this.Count));
this.Add(model.Text(x => x.Tester, this.Count));
}
internal SqlExpression OrderBy()
@@ -57,7 +57,12 @@
foreach (var property in this)
{
if (property.Type == "date")
if (string.IsNullOrWhiteSpace(property.Like))
{
continue;
}
if (property.Type == PropertyType.Date)
{
if (!string.IsNullOrWhiteSpace(property.Like))
{
@@ -98,9 +103,12 @@
}
}
}
else if (string.IsNullOrWhiteSpace(property.Like))
else if (property.Type == PropertyType.Bool)
{
continue;
var propertyName = $"{property.Property}_{property.Index}";
var propertyValue = int.TryParse(property.Like, out int bit) ? bit : 0;
sqlExpression.Add($"{property.Column} = @{propertyName}", propertyName, property.Like);
}
else
{
@@ -4,7 +4,7 @@
{
public int Index { get; set; }
public string Type { get; set; }
public PropertyType Type { get; set; }
public string Property { get; set; }
@@ -5,31 +5,31 @@
using System.Linq.Expressions;
using System.Reflection;
public enum PropertyType
{
Text,
Date,
Bool
}
public static class HeliumReportModelExtensions
{
public static HeliumReportFilterProperty Property(this HeliumReportItem model, Expression<Func<HeliumReportItem, object>> expression, int index, int orderBy = 0)
{
var memberInfo = default(MemberInfo);
if (expression.Body is MemberExpression memberExpression)
{
memberInfo = memberExpression.Member;
}
else if (expression.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MemberExpression operandExpression)
{
memberInfo = operandExpression.Member;
}
public static HeliumReportFilterProperty Text(this HeliumReportItem model, Expression<Func<HeliumReportItem, object>> expression, int index, int orderBy = 0)
=> model.Property(expression, index, PropertyType.Text, orderBy);
return new HeliumReportFilterProperty
{
Column = memberInfo?.GetCustomAttribute<ColumnAttribute>()?.Name,
Property = memberInfo?.Name,
OrderBy = orderBy,
Index = index,
Type = "text"
};
}
public static HeliumReportFilterProperty DateTime(this HeliumReportItem model, Expression<Func<HeliumReportItem, object>> expression, int index, int orderBy = 0)
=> model.Property(expression, index, PropertyType.Date, orderBy);
public static HeliumReportFilterProperty Boolean(this HeliumReportItem model, Expression<Func<HeliumReportItem, object>> expression, int index, int orderBy = 0)
=> model.Property(expression, index, PropertyType.Bool, orderBy);
public static HeliumReportFilterProperty Property(
this HeliumReportItem model
, Expression<Func<HeliumReportItem, object>> expression
, int index
, PropertyType propertyType
, int orderBy)
{
var memberInfo = default(MemberInfo);
@@ -48,7 +48,7 @@
Property = memberInfo?.Name,
OrderBy = orderBy,
Index = index,
Type = "date"
Type = propertyType
};
}
}
@@ -0,0 +1,13 @@
namespace LaaProductionWeb.Services.Models
{
public class OrderIdentity
{
public int OrderNr { get; set; }
public int PositionNr { get; set; }
public int SerialNr { get; set; }
public string ClientSerialNr { get; set; }
}
}
@@ -9,8 +9,7 @@
[Required]
public int? OrderNr { get; set; }
[Required]
public int? PositionNr { get; set; }
[Required]
@@ -22,8 +22,7 @@
[Required(ErrorMessage = "Auftrags-Nr. ist erforderlich!")]
[Display(Name = "Auftrags-Nr. scanen oder eingeben")]
public int? OrderNr { get; set; }
[Required(ErrorMessage = "Positions-Nr. ist erforderlich!")]
[Display(Name = "Positions-Nr. auswählen")]
public int? PositionNr { get; set; }
@@ -33,11 +33,12 @@
var palletsCount = this.dbContext.FirstOrDefault(
query: $@"
SELECT COUNT(1)
FROM (SELECT [PalettenNr] AS [PalletNr]
, COUNT([SerienNr]) AS [Count]
FROM (SELECT [PalettenNr] AS [PalletNr]
, COUNT([SerienNr]) AS [Count]
FROM [PalettenScan]
WHERE [AuftragNr] = @{nameof(model.OrderNr)}
AND [PositionNr] = @{nameof(model.PositionNr)}
WHERE [AuftragNr] = @{nameof(model.OrderNr)}
AND (@{nameof(model.PositionNr)} IS NULL
OR [PositionNr] = @{nameof(model.PositionNr)})
GROUP BY [PalettenNr])
AS [Paletten]
WHERE [Count] > 0",
@@ -90,10 +91,13 @@
AND [PalettenScan].[PositionNr] = [AuftragPositionSerienNr].[PositionNr]
AND [PalettenScan].[SerienNr] = REPLACE(RTRIM(LTRIM([AuftragPositionSerienNr].[KundeneigeneSerienNr])), ' ', '')
WHERE [AuftragPositionSerienNr].[AuftragNr] = @{nameof(model.OrderNr)}
AND (@{nameof(model.PositionNr)} IS NULL
OR [AuftragPositionSerienNr].[PositionNr] = @{nameof(model.PositionNr)})
AND ([PalettenScan].[PalettenNr] = @{nameof(model.PalletNr)}
OR [PalettenScan].[PalettenNr] IS NULL)",
parameters: parameters => parameters
.Add(nameof(model.OrderNr), model.OrderNr)
.Add(nameof(model.PositionNr), model.PositionNr)
.Add(nameof(model.PalletNr), model.PalletNr),
reader: reader => new SerialNr
{
@@ -111,22 +115,24 @@
public PalletsBatchModel LoadBatchModel(OrderScanModel model)
{
const string orderNr = nameof(model.OrderNr);
const string posNr = nameof(model.PositionNr);
const string palNr = nameof(model.PalletNr);
var batchModel = this.dbContext.FirstOrDefault(
query: $@"
SELECT TOP 1
[Auftrag].[AuftragNr] -- 0
, [Auftrag].[FertigungsauftragNr] -- 1
, [Auftrag].[Menge] -- 2
, [Kunde].[Name] -- 3
, [Auftrag].[ZusatzText] -- 4
[Auftrag].[AuftragNr] -- 0
, [Auftrag].[FertigungsauftragNr] -- 1
, (SELECT SUM([AAP].[Menge])
FROM [AlleAuftragPositionen] AS [AAP]
WHERE [AAP].[AuftragNr] = [Auftrag].[AuftragNr]) -- 2
, [Kunde].[Name] -- 3
, [Auftrag].[ZusatzText] -- 4
FROM [AlleAuftragPositionen] AS [Auftrag]
JOIN [Kunde] ON [Kunde].[KundenNr] = [Auftrag].[KundenNr]
WHERE [Auftrag].[AuftragNr] = @{orderNr}
AND [Auftrag].[PositionNr] = @{posNr}
ORDER BY [Auftrag].[FertigungsauftragNr] DESC",
WHERE [Auftrag].[AuftragNr] = @{nameof(model.OrderNr)}
AND (@{nameof(model.PositionNr)} IS NULL
OR [Auftrag].[PositionNr] = @{nameof(model.PositionNr)})
ORDER BY [Auftrag].[FertigungsauftragNr] DESC",
parameters: parameters => parameters
.Add(nameof(model.OrderNr), model.OrderNr)
.Add(nameof(model.PositionNr), model.PositionNr),
@@ -196,16 +202,16 @@
return $"Der Packet mit Serien-Nr: {model.SerialNr} wurde bereits hinzugefügt.";
}
var orderKVP = this.GetOrderKVP(model.OrderNr, model.PositionNr, model.SerialNr);
var orderIdentity = this.UpdateOrderIdentifiers(model.OrderNr, model.PositionNr, model.SerialNr);
if (orderKVP.Key <= 0)
if (orderIdentity is null)
{
return $"Der Packet mit Serien-Nr: {model.SerialNr} ist nicht dem Auftrag/Position: {model.OrderNr}/{model.PositionNr} zugewiesen.";
}
else
{
model.SerialNr = orderKVP.Value;
model.PalletNr = this.GetPalletNr(model);
model.SerialNr = orderIdentity.ClientSerialNr;
model.PositionNr = orderIdentity.PositionNr;
}
var rowsAffected = this.InsertPalletEntry(model);
@@ -216,18 +222,6 @@
return false;
}
private int GetPalletNr(OrderScanModel model)
=> this.dbContext.FirstOrDefault(
query: $@"
SELECT MAX([PalettenNr]) + 1
FROM [PalettenScan]
WHERE [AuftragNr] = @{nameof(model.OrderNr)}
AND [PositionNr] = @{nameof(model.PositionNr)}",
parameters: parameters => parameters
.Add(nameof(model.OrderNr), model.OrderNr)
.Add(nameof(model.PositionNr), model.PositionNr),
reader: reader => Math.Min(reader.GetValue<int>(0), model.PalletNr));
private OrderScanModel DeletePalletEntryById(int id)
=> this.dbContext.FirstOrDefault(
query: $@"
@@ -245,26 +239,31 @@
PalletNr = reader.GetValue<short>(2)
});
private KeyValuePair<int, string> GetOrderKVP(int? orderNr, int? positionNr, string serialNr)
private OrderIdentity UpdateOrderIdentifiers(int? orderNr, int? positionNr, string serialNr)
=> this.dbContext.FirstOrDefault(
query: $@"
SELECT DISTINCT TOP 1
[AuftragPositionSerienNr].[SerienNr] -- 0
, REPLACE(RTRIM(LTRIM([AuftragPositionSerienNr].[KundeneigeneSerienNr])), ' ', '') -- 1
[AuftragPositionSerienNr].[PositionNr] -- 0
, [AuftragPositionSerienNr].[SerienNr] -- 1
, REPLACE(RTRIM(LTRIM([AuftragPositionSerienNr].[KundeneigeneSerienNr])), ' ', '') -- 2
FROM [AuftragPositionSerienNr]
WHERE [AuftragPositionSerienNr].[AuftragNr] = @{nameof(orderNr)}
AND [AuftragPositionSerienNr].[PositionNr] = @{nameof(positionNr)}
AND @{nameof(serialNr)} LIKE '%' + (REPLACE(RTRIM(LTRIM([AuftragPositionSerienNr].[KundeneigeneSerienNr])), ' ', '')) + '%'",
WHERE [AuftragPositionSerienNr].[AuftragNr] = @{nameof(orderNr)}
AND ([AuftragPositionSerienNr].[PositionNr] = @{nameof(positionNr)} OR @{nameof(positionNr)} IS NULL)
AND @{nameof(serialNr)} LIKE '%' + (REPLACE(RTRIM(LTRIM([AuftragPositionSerienNr].[KundeneigeneSerienNr])), ' ', '')) + '%'",
parameters: parameters => parameters
.Add(nameof(orderNr), orderNr)
.Add(nameof(positionNr), positionNr)
.Add(nameof(serialNr), serialNr),
reader: reader => new KeyValuePair<int, string>(
key: reader.GetValue<int>(0),
value: reader.GetValue<string>(1)));
reader: reader => new OrderIdentity
{
OrderNr = orderNr ?? -1,
PositionNr = reader.GetValue<short>(0),
SerialNr = reader.GetValue<int>(1),
ClientSerialNr = reader.GetValue<string>(2),
});
private int InsertPalletEntry(OrderScanModel model)
=> this.dbContext.ScalarTransaction<int>($@"
=> this.dbContext.ExecuteNonQuery($@"
INSERT
INTO [PalettenScan] (
[PalettenNr]
@@ -294,11 +293,9 @@
SELECT CAST(CASE WHEN [PalettenScan].[ID] IS NULL THEN 0 ELSE 1 END AS BIT)
FROM [PalettenScan]
WHERE [PalettenScan].[AuftragNr] = @{nameof(orderNr)}
AND [PalettenScan].[PositionNr] = @{nameof(positionNr)}
AND [PalettenScan].[SerienNr] = @{nameof(serialNr)}",
parameters => parameters
.Add(nameof(orderNr), orderNr)
.Add(nameof(positionNr), positionNr)
.Add(nameof(serialNr), serialNr),
reader => reader.GetValue<bool>(0));