namespace LaaProductionWeb.Services { using LaaProductionWeb.Data.Interfaces; using LaaProductionWeb.Services.Interfaces; using LaaProductionWeb.Services.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; public class ReportService : IReportService { private readonly ISqlClient sqlClient; public ReportService(ISqlClient sqlClient) => this.sqlClient = sqlClient; 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.sqlClient.ExecuteReader($@" SELECT [PT].[CordonelPressureTest_FertigungsAuftragsNr] AS [FertigungNr] -- 0 Filter , [POS].[AuftragNr] AS [AuftragNr] -- 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_Date] AS [TestDate] -- 16 Filter , [PT].[CordonelPressureTest_Text] AS [Text] -- 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 { FertigungNr = reader.GetValue(0), AuftragNr = reader.GetValue(1), PositionNr = reader.GetValue(2), SerialNr = reader.GetValue(3), IdentNr = reader.GetValue(4), HeId = reader.GetValue(5), HeTestId = reader.GetValue(6), PcbId = reader.GetValue(7), Nennweite = reader.GetValue(8), Baulaenge = reader.GetValue(9), Typ = reader.GetString(10), Druck = reader.GetValue(11), Temperatur = reader.GetValue(12), HeLakeRate = reader.GetString(13), HeTestPressure = reader.GetString(14), IsValid = reader.GetValue(15), TestDate = reader.GetValue(16), Text = reader.GetString(17), Tester = reader.GetString(18) }); return model; } public byte[] LoadHeliumPressureReportAsCSV(HeliumReportModel model) { if (model is null) { model = new HeliumReportModel(); } var where = model.Filter.Where(); var orderBy = model.Filter.OrderBy(); var csvItems = new List(); var headers = Array.Empty(); var items = this.sqlClient.ExecuteReader($@" SELECT [PT].[CordonelPressureTest_FertigungsAuftragsNr] AS [FertigungNr] -- 0 Filter , [POS].[AuftragNr] AS [AuftragNr] -- 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_Date] AS [TestDate] -- 16 Filter , [PT].[CordonelPressureTest_Text] AS [Text] -- 17 Filter , [PT_HE].[CordonelPressureTestHe_TesterName] AS [Tester] -- 18 , [CPT].[CordonelPressureTest_TestPointNr] AS [PointNr] -- 19 , CAST([CPT].[CordonelPressureTest_TestPointResult] AS NUMERIC(9, 8)) AS [PointResult] -- 20 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] LEFT JOIN [Cordonel_PressureTest_TestPoints] AS [CPT] ON [CPT].[CordonelPressureTest_Id] = [PT].[CordonelPressureTest_Id] 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 object[] { reader.GetValue(0), reader.GetValue(1), reader.GetValue(2), reader.GetValue(3), reader.GetValue(4), reader.GetValue(5), reader.GetValue(6), reader.GetValue(7), reader.GetValue(8), reader.GetValue(9), reader.GetString(10).Replace(',', ' '), reader.GetValue(11), reader.GetValue(12), reader.GetString(13).Replace(',', '.'), reader.GetString(14).Replace(',', ' '), reader.GetValue(15), $"{reader.GetValue(16):yyyy-MM-dd}", reader.GetString(17).Replace(',', ' '), reader.GetString(18).Replace(',', ' '), reader.GetValue(19), $"{reader.GetValue(20):0.000000000}", }, columns => csvItems.Add(columns)) .ToList(); csvItems.AddRange(items); var csvLines = csvItems.Select(x => string.Join(",", x)); var csvContent = string.Join(Environment.NewLine, csvLines); return Encoding.UTF8.GetBytes(csvContent); } public IEnumerable LoadHeliumPressureResults(int testId) => this.sqlClient.ExecuteReader($@" SELECT [CordonelPressureTestTestPoints_Id] , [CordonelPressureTest_TestPointNr] , CAST([CordonelPressureTest_TestPointResult] AS NUMERIC(9, 8)) FROM [Cordonel_PressureTest_TestPoints] WHERE [CordonelPressureTest_Id] = @{nameof(testId)}", parameters => parameters.Add(nameof(testId), testId), reader => new HeliumPressurePoint { TestId = reader.GetValue(0), PointNr = reader.GetValue(1), Result = reader.GetValue(2), }); } }