Helium Pressure Report
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
namespace LaaProductionWeb.Services.Interfaces
|
||||
{
|
||||
using LaaProductionWeb.Services.Models;
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
public interface IReportService : ITransient
|
||||
{
|
||||
HeliumReportModel LoadHeliumPressureReport(HeliumReportModel model = null);
|
||||
|
||||
IEnumerable<HeliumPressurePoint> LoadHeliumPressureResults(int testId);
|
||||
}
|
||||
}
|
||||
@@ -61,8 +61,15 @@
|
||||
<Compile Include="Interfaces\IAccountService.cs" />
|
||||
<Compile Include="Interfaces\IOrdersService.cs" />
|
||||
<Compile Include="Interfaces\IProtocolService.cs" />
|
||||
<Compile Include="Interfaces\IReportService.cs" />
|
||||
<Compile Include="Interfaces\IShipmentsService.cs" />
|
||||
<Compile Include="Interfaces\ITransient.cs" />
|
||||
<Compile Include="Models\HeliumPressurePoint.cs" />
|
||||
<Compile Include="Models\HeliumReportFilter.cs" />
|
||||
<Compile Include="Models\HeliumReportFilterProperty.cs" />
|
||||
<Compile Include="Models\HeliumReportItem.cs" />
|
||||
<Compile Include="Models\HeliumReportModel.cs" />
|
||||
<Compile Include="Models\HeliumReportModelExtensions.cs" />
|
||||
<Compile Include="Models\PalletPosition.cs" />
|
||||
<Compile Include="Models\RoleModel.cs" />
|
||||
<Compile Include="Models\UserRole.cs" />
|
||||
@@ -84,6 +91,7 @@
|
||||
<Compile Include="OrdersService.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="ProtocolService.cs" />
|
||||
<Compile Include="ReportService.cs" />
|
||||
<Compile Include="ServicesExtensions.cs" />
|
||||
<Compile Include="ShipmentsService.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace LaaProductionWeb.Services.Models
|
||||
{
|
||||
public class HeliumPressurePoint
|
||||
{
|
||||
public int TestId { get; set; }
|
||||
|
||||
public int PointNr { get; set; }
|
||||
|
||||
public decimal Result { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
namespace LaaProductionWeb.Services.Models
|
||||
{
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class HeliumReportFilter : List<HeliumReportFilterProperty>
|
||||
{
|
||||
public HeliumReportFilter()
|
||||
{
|
||||
var model = default(HeliumReportItem);
|
||||
|
||||
this.Add(model.Property(x => x.AuftragNr, this.Count));
|
||||
this.Add(model.Property(x => x.FertigungNr, 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.Property(x => x.Text, this.Count));
|
||||
this.Add(model.Property(x => x.TestDate, this.Count, -1));
|
||||
this.Add(model.Property(x => x.Tester, this.Count));
|
||||
}
|
||||
|
||||
internal SqlExpression OrderBy()
|
||||
{
|
||||
var sqlExpression = new SqlExpression();
|
||||
|
||||
foreach (var property in this)
|
||||
{
|
||||
if (property.OrderBy == 1)
|
||||
{
|
||||
sqlExpression.Add($"{property.Column}");
|
||||
}
|
||||
else if (property.OrderBy == -1)
|
||||
{
|
||||
sqlExpression.Add($"{property.Column} DESC");
|
||||
}
|
||||
}
|
||||
|
||||
return sqlExpression.BuildOrderBy(", ");
|
||||
}
|
||||
|
||||
internal SqlExpression Where()
|
||||
{
|
||||
var sqlExpression = new SqlExpression();
|
||||
|
||||
foreach (var property in this)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(property.Like))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var propertyName = $"{property.Property}_{property.Index}";
|
||||
var propertyValue = $"%{property.Like}%";
|
||||
|
||||
sqlExpression.Add($"{property.Column} LIKE @{propertyName}", propertyName, propertyValue);
|
||||
}
|
||||
|
||||
return sqlExpression.BuildWhere(" AND ");
|
||||
}
|
||||
|
||||
public class SqlExpression
|
||||
{
|
||||
private readonly ICollection<string> expressions
|
||||
= new List<string>();
|
||||
|
||||
public string Query { get; set; }
|
||||
|
||||
public IDictionary<string, object> Parameters { get; set; }
|
||||
= new Dictionary<string, object>();
|
||||
|
||||
internal void Add(string expression)
|
||||
=> this.expressions.Add(expression);
|
||||
|
||||
internal void Add(string expression, string propertyName, string propertyValue)
|
||||
{
|
||||
this.Parameters[propertyName] = propertyValue;
|
||||
|
||||
this.expressions.Add(expression);
|
||||
}
|
||||
|
||||
internal SqlExpression BuildOrderBy(string delimiter)
|
||||
{
|
||||
this.Query = string.Join(delimiter, this.expressions);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
internal SqlExpression BuildWhere(string delimiter)
|
||||
{
|
||||
this.Query = this.expressions.Any()
|
||||
? string.Join(delimiter, this.expressions)
|
||||
: "1 = 1";
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
namespace LaaProductionWeb.Services.Models
|
||||
{
|
||||
public class HeliumReportFilterProperty
|
||||
{
|
||||
public int Index { get; set; }
|
||||
|
||||
public string IndexName
|
||||
=> $"Filter[{this.Index}].{nameof(this.Index)}";
|
||||
|
||||
public string Property { get; set; }
|
||||
|
||||
public string PropertyName
|
||||
=> $"Filter[{this.Index}].{nameof(this.Property)}";
|
||||
|
||||
public string Column { get; set; }
|
||||
public string ColumnName
|
||||
=> $"Filter[{this.Index}].{nameof(this.Column)}";
|
||||
|
||||
public string Like { get; set; }
|
||||
|
||||
public string LikeName
|
||||
=> $"Filter[{this.Index}].{nameof(this.Like)}";
|
||||
|
||||
public int OrderBy { get; set; }
|
||||
|
||||
public string OrderByName
|
||||
=> $"Filter[{this.Index}].{nameof(this.OrderBy)}";
|
||||
|
||||
public string OrderById
|
||||
=> $"Filter_{this.Index}_{nameof(this.OrderBy)}";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
namespace LaaProductionWeb.Services.Models
|
||||
{
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
public class HeliumReportItem
|
||||
{
|
||||
[Display(Name = "Auftrag Nr.")]
|
||||
[Column("[POS].[AuftragNr]")]
|
||||
public int AuftragNr { get; set; }
|
||||
|
||||
[Display(Name = "Fertigung Nr.")]
|
||||
[Column("[PT].[CordonelPressureTest_FertigungsAuftragsNr]")]
|
||||
public int FertigungNr { get; set; }
|
||||
|
||||
[Display(Name = "Pos.")]
|
||||
[Column("[POS].[PositionNr]")]
|
||||
public short PositionNr { get; set; }
|
||||
|
||||
[Display(Name = "Serial Nr.")]
|
||||
[Column("[PCB2SN].[MapPcbIdToSerialNumber_SerialNumber]")]
|
||||
public int SerialNr { get; set; }
|
||||
|
||||
[Display(Name = "Ident Nr.")]
|
||||
[Column("[ID].[IdentNr]")]
|
||||
public int IdentNr { get; set; }
|
||||
|
||||
[Display(Name = "He Id")]
|
||||
[Column("[PT_HE].[CordonelPressureTestHe_Id]")]
|
||||
public int HeId { get; set; }
|
||||
|
||||
[Display(Name = "He TestId")]
|
||||
[Column("[PT_HE].[CordonelPressureTestHe_TestID]")]
|
||||
public int HeTestId { get; set; }
|
||||
|
||||
[Display(Name = "Pcb Id")]
|
||||
[Column("[PT].[CordonelPressureTest_PcbId]")]
|
||||
public int PcbId { get; set; }
|
||||
|
||||
[Display(Name = "Nennweite")]
|
||||
[Column("[ID].[Nennweite]")]
|
||||
public int? Nennweite { get; set; }
|
||||
|
||||
[Display(Name = "Baulänge")]
|
||||
[Column("[ID].[Baulaenge]")]
|
||||
public int? Baulaenge { get; set; }
|
||||
|
||||
[Display(Name = "Typ")]
|
||||
[Column("[ID].[Typ]")]
|
||||
public string Typ { get; set; }
|
||||
|
||||
[Display(Name = "Druck")]
|
||||
[Column("[ID].[Druck]")]
|
||||
public int? Druck { get; set; }
|
||||
|
||||
[Display(Name = "°C")]
|
||||
[Column("[ID].[Temperatur]")]
|
||||
public int? Temperatur { get; set; }
|
||||
|
||||
[Display(Name = "Lake Rate")]
|
||||
[Column("[PT_HE].[CordonelPressureTestHe_LeakRate]")]
|
||||
public string HeLakeRate { get; set; }
|
||||
|
||||
[Display(Name = "He Druck")]
|
||||
[Column("[PT_HE].[CordonelPressureTestHe_TestPressure]")]
|
||||
public string HeTestPressure { get; set; }
|
||||
|
||||
[Display(Name = "Valid")]
|
||||
[Column("[PT].[CordonelPressureTest_Valid]")]
|
||||
public bool IsValid { get; set; }
|
||||
|
||||
[Display(Name = "Text")]
|
||||
[Column("[PT].[CordonelPressureTest_Text]")]
|
||||
public string Text { get; set; }
|
||||
|
||||
[Display(Name = "Datum")]
|
||||
[Column("[PT].[CordonelPressureTest_Date]")]
|
||||
public DateTimeOffset TestDate { get; set; }
|
||||
|
||||
[Display(Name = "Tester")]
|
||||
[Column("[PT_HE].[CordonelPressureTestHe_TesterName]")]
|
||||
public string Tester { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
namespace LaaProductionWeb.Services.Models
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
|
||||
public class HeliumReportModel
|
||||
{
|
||||
public HeliumReportFilter Filter { get; set; }
|
||||
= new HeliumReportFilter();
|
||||
|
||||
public IEnumerable<HeliumReportItem> Items { get; set; }
|
||||
= Array.Empty<HeliumReportItem>();
|
||||
|
||||
public static implicit operator HeliumReportModel(HeliumReportFilter filter)
|
||||
=> new HeliumReportModel { Filter = filter };
|
||||
|
||||
public string Display(Expression<Func<HeliumReportItem, object>> expression)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
return memberInfo
|
||||
?.GetCustomAttribute<DisplayAttribute>()
|
||||
?.Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
namespace LaaProductionWeb.Services.Models
|
||||
{
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
return new HeliumReportFilterProperty
|
||||
{
|
||||
Column = memberInfo?.GetCustomAttribute<ColumnAttribute>()?.Name,
|
||||
Property = memberInfo?.Name,
|
||||
OrderBy = orderBy,
|
||||
Index = index,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
namespace LaaProductionWeb.Services
|
||||
{
|
||||
using LaaProductionWeb.Data.Interfaces;
|
||||
using LaaProductionWeb.Services.Interfaces;
|
||||
using LaaProductionWeb.Services.Models;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class ReportService : IReportService
|
||||
{
|
||||
private readonly IDbContext dbContext;
|
||||
|
||||
public ReportService(IDbContext dbContext)
|
||||
=> this.dbContext = dbContext;
|
||||
|
||||
public HeliumReportModel LoadHeliumPressureReport(HeliumReportModel model = null)
|
||||
{
|
||||
if (model is null)
|
||||
{
|
||||
model = new HeliumReportModel();
|
||||
}
|
||||
|
||||
var where = model.Filter.Where();
|
||||
var orderBy = model.Filter.OrderBy();
|
||||
|
||||
model.Items = this.dbContext.AsEnumerable($@"
|
||||
SELECT [POS].[AuftragNr] AS [AuftragNr] -- 0 Filter
|
||||
, [PT].[CordonelPressureTest_FertigungsAuftragsNr] AS [FertigungNr] -- 1 Filter
|
||||
, [POS].[PositionNr] AS [PositionNr] -- 2 Filter
|
||||
, [PCB2SN].[MapPcbIdToSerialNumber_SerialNumber] AS [SerialNr] -- 3
|
||||
, [ID].[IdentNr] AS [IdentNr] -- 4 Filter
|
||||
, [PT_HE].[CordonelPressureTestHe_Id] AS [HeId] -- 5
|
||||
, [PT_HE].[CordonelPressureTestHe_TestID] AS [HeTestId] -- 6
|
||||
, [PT].[CordonelPressureTest_PcbId] AS [PcbId] -- 7 Filter
|
||||
, [ID].[Nennweite] AS [Nennweite] -- 8 Filter
|
||||
, [ID].[Baulaenge] AS [Baulaenge] -- 9 Filter
|
||||
, [ID].[Typ] AS [Typ] -- 10 Filter
|
||||
, [ID].[Druck] AS [Druck] -- 11 Filter
|
||||
, [ID].[Temperatur] AS [Temperatur] -- 12 Filter
|
||||
, [PT_HE].[CordonelPressureTestHe_LeakRate] AS [HeLakeRate] -- 13
|
||||
, [PT_HE].[CordonelPressureTestHe_TestPressure] AS [HeTestPressure] -- 14
|
||||
, [PT].[CordonelPressureTest_Valid] AS [IsValid] -- 15 Filter
|
||||
, [PT].[CordonelPressureTest_Text] AS [Text] -- 16 Filter
|
||||
, [PT].[CordonelPressureTest_Date] AS [TestDate] -- 17 Filter
|
||||
, [PT_HE].[CordonelPressureTestHe_TesterName] AS [Tester] -- 18
|
||||
FROM [Cordonel_PressureTest] AS [PT]
|
||||
JOIN [Cordonel_PressureTest_He] AS [PT_HE] ON [PT_HE].[CordonelPressureTestHe_TestID] = [PT].[CordonelPressureTest_Id]
|
||||
LEFT JOIN [Druckpruefung] AS [DP] ON [DP].[FabNr] = [PT].[CordonelPressureTest_PcbId]
|
||||
JOIN [MapPcbIdToSerialNumber] AS [PCB2SN] ON [PCB2SN].[MapPcbIdToSerialNumber_PcbId] = [PT].[CordonelPressureTest_PcbId]
|
||||
JOIN [AuftragPosition_Gesamt] AS [POS] ON [POS].[FertigungsauftragNr] = [PT].[CordonelPressureTest_FertigungsAuftragsNr]
|
||||
JOIN [Identnr] AS [ID] ON [ID].[IdentNr] = [POS].[Identnr]
|
||||
WHERE [CordonelPressureTest_IsDeleted] = 0
|
||||
AND {where.Query}
|
||||
ORDER BY {orderBy.Query}",
|
||||
parameters =>
|
||||
{
|
||||
foreach (var kvp in where.Parameters)
|
||||
{
|
||||
parameters.Add(kvp.Key, kvp.Value);
|
||||
}
|
||||
|
||||
foreach (var kvp in orderBy.Parameters)
|
||||
{
|
||||
parameters.Add(kvp.Key, kvp.Value);
|
||||
}
|
||||
},
|
||||
reader => new HeliumReportItem
|
||||
{
|
||||
AuftragNr = reader.GetValue<int>(0),
|
||||
FertigungNr = reader.GetValue<int>(1),
|
||||
PositionNr = reader.GetValue<short>(2),
|
||||
SerialNr = reader.GetValue<int>(3),
|
||||
IdentNr = reader.GetValue<int>(4),
|
||||
HeId = reader.GetValue<int>(5),
|
||||
HeTestId = reader.GetValue<int>(6),
|
||||
PcbId = reader.GetValue<int>(7),
|
||||
Nennweite = reader.GetValue<int?>(8),
|
||||
Baulaenge = reader.GetValue<int?>(9),
|
||||
Typ = reader.GetString(10),
|
||||
Druck = reader.GetValue<int?>(11),
|
||||
Temperatur = reader.GetValue<int?>(12),
|
||||
HeLakeRate = reader.GetString(13),
|
||||
HeTestPressure = reader.GetString(14),
|
||||
IsValid = reader.GetValue<bool>(15),
|
||||
Text = reader.GetString(16),
|
||||
TestDate = reader.GetValue<DateTimeOffset>(17),
|
||||
Tester = reader.GetString(18)
|
||||
});
|
||||
|
||||
return model;
|
||||
}
|
||||
|
||||
public IEnumerable<HeliumPressurePoint> LoadHeliumPressureResults(int testId)
|
||||
=> this.dbContext.AsEnumerable($@"
|
||||
SELECT [CordonelPressureTestTestPoints_Id]
|
||||
, [CordonelPressureTest_TestPointNr]
|
||||
, CAST([CordonelPressureTest_TestPointResult] AS NUMERIC(9, 8))
|
||||
FROM [Auftrag].[dbo].[Cordonel_PressureTest_TestPoints]
|
||||
WHERE [CordonelPressureTest_Id] = @{nameof(testId)}",
|
||||
parameters => parameters.Add(nameof(testId), testId),
|
||||
reader => new HeliumPressurePoint
|
||||
{
|
||||
TestId = reader.GetValue<int>(0),
|
||||
PointNr = reader.GetValue<int>(1),
|
||||
Result = reader.GetValue<decimal>(2),
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user