diff --git a/LaaProductionWeb/LaaProductionWeb.Data/Interfaces/ISqlClient.cs b/LaaProductionWeb/LaaProductionWeb.Data/Interfaces/ISqlClient.cs index 8f66d1ec..e2a923d8 100644 --- a/LaaProductionWeb/LaaProductionWeb.Data/Interfaces/ISqlClient.cs +++ b/LaaProductionWeb/LaaProductionWeb.Data/Interfaces/ISqlClient.cs @@ -10,8 +10,12 @@ IEnumerable ExecuteReader(string query, Func reader, SqlInfoMessageEventHandler errorCallback = null); + IEnumerable ExecuteReader(string query, Func reader, Action columns, SqlInfoMessageEventHandler errorCallback = null); + IEnumerable ExecuteReader(string query, Action parameters, Func reader, SqlInfoMessageEventHandler errorCallback = null); + IEnumerable ExecuteReader(string query, Action parameters, Func reader, Action columns, SqlInfoMessageEventHandler errorCallback = null); + T ExecuteScalar(string query, Action parameters, SqlInfoMessageEventHandler errorCallback = null); T FirstOrDefault(string query, Func reader, SqlInfoMessageEventHandler errorCallback = null); diff --git a/LaaProductionWeb/LaaProductionWeb.Data/SqlClient.cs b/LaaProductionWeb/LaaProductionWeb.Data/SqlClient.cs index 28cd5de9..b8b3a5fe 100644 --- a/LaaProductionWeb/LaaProductionWeb.Data/SqlClient.cs +++ b/LaaProductionWeb/LaaProductionWeb.Data/SqlClient.cs @@ -34,7 +34,7 @@ return rowsAffected; } - public IEnumerable ExecuteReader(string query, Func output, SqlInfoMessageEventHandler errorCallback = null) + public IEnumerable ExecuteReader(string query, Func reader, SqlInfoMessageEventHandler errorCallback = null) { using (var sqlConnection = new SqlConnection(this.connectionString)) { @@ -48,14 +48,14 @@ { while (sqlReader.Read()) { - yield return output(sqlReader); + yield return reader(sqlReader); } } } } } - public IEnumerable ExecuteReader(string query, Action parameters, Func output, SqlInfoMessageEventHandler errorCallback = null) + public IEnumerable ExecuteReader(string query, Action parameters, Func reader, SqlInfoMessageEventHandler errorCallback = null) { using (var sqlConnection = new SqlConnection(this.connectionString)) { @@ -71,7 +71,55 @@ { while (sqlReader.Read()) { - yield return output(sqlReader); + yield return reader(sqlReader); + } + } + } + } + } + + public IEnumerable ExecuteReader(string query, Func reader, Action columns, SqlInfoMessageEventHandler errorCallback = null) + { + using (var sqlConnection = new SqlConnection(this.connectionString)) + { + sqlConnection.OpenWithErrorHandling(errorCallback); + + using (var sqlCommand = sqlConnection.CreateCommand()) + { + sqlCommand.CommandText = query; + + using (SqlReader sqlReader = sqlCommand.ExecuteReader()) + { + columns(sqlReader.GetColumns()); + + while (sqlReader.Read()) + { + yield return reader(sqlReader); + } + } + } + } + } + + public IEnumerable ExecuteReader(string query, Action parameters, Func reader, Action columns, SqlInfoMessageEventHandler errorCallback = null) + { + using (var sqlConnection = new SqlConnection(this.connectionString)) + { + sqlConnection.OpenWithErrorHandling(errorCallback); + + using (var sqlCommand = sqlConnection.CreateCommand()) + { + parameters(sqlCommand.Parameters); + + sqlCommand.CommandText = query; + + using (SqlReader sqlReader = sqlCommand.ExecuteReader()) + { + columns(sqlReader.GetColumns()); + + while (sqlReader.Read()) + { + yield return reader(sqlReader); } } } @@ -104,7 +152,7 @@ return scalarResult; } - public T FirstOrDefault(string query, Func output, SqlInfoMessageEventHandler errorCallback = null) + public T FirstOrDefault(string query, Func reader, SqlInfoMessageEventHandler errorCallback = null) { var firstOrDefaultResult = default(T); @@ -120,7 +168,7 @@ { if (sqlReader.Read()) { - firstOrDefaultResult = output(sqlReader); + firstOrDefaultResult = reader(sqlReader); } } } @@ -129,7 +177,7 @@ return firstOrDefaultResult; } - public T FirstOrDefault(string query, Action parameters, Func output, SqlInfoMessageEventHandler errorCallback = null) + public T FirstOrDefault(string query, Action parameters, Func reader, SqlInfoMessageEventHandler errorCallback = null) { var firstOrDefaultResult = default(T); @@ -147,7 +195,7 @@ { if (sqlReader.Read()) { - firstOrDefaultResult = output(sqlReader); + firstOrDefaultResult = reader(sqlReader); } } } diff --git a/LaaProductionWeb/LaaProductionWeb.Data/SqlReader.cs b/LaaProductionWeb/LaaProductionWeb.Data/SqlReader.cs index 3c136845..a5f81cba 100644 --- a/LaaProductionWeb/LaaProductionWeb.Data/SqlReader.cs +++ b/LaaProductionWeb/LaaProductionWeb.Data/SqlReader.cs @@ -23,7 +23,11 @@ public byte[] GetBytes(int index = -1) { var bytes = default(byte[]); - index = Math.Max(index, this.column++); + + if (index < 0) + { + index = this.column++; + } if (!this.sqlDataReader.IsDBNull(index)) { @@ -33,9 +37,25 @@ return bytes ?? Array.Empty(); } + internal string[] GetColumns() + { + var columnsCount = this.sqlDataReader.FieldCount; + var columns = new string[columnsCount]; + + for (int i = 0; i < columnsCount; i++) + { + columns[i] = this.sqlDataReader.GetName(i); + } + + return columns; + } + public string GetString(int index = -1) { - index = Math.Max(index, this.column++); + if (index < 0) + { + index = this.column++; + } if (!this.sqlDataReader.IsDBNull(index)) { @@ -47,7 +67,10 @@ public T GetValue(int index = -1) { - index = Math.Max(index, this.column++); + if (index < 0) + { + index = this.column++; + } if (!this.sqlDataReader.IsDBNull(index)) { diff --git a/LaaProductionWeb/LaaProductionWeb.Services/Interfaces/IReportService.cs b/LaaProductionWeb/LaaProductionWeb.Services/Interfaces/IReportService.cs index 3c94b121..0caad7d8 100644 --- a/LaaProductionWeb/LaaProductionWeb.Services/Interfaces/IReportService.cs +++ b/LaaProductionWeb/LaaProductionWeb.Services/Interfaces/IReportService.cs @@ -9,5 +9,7 @@ HeliumReportModel LoadHeliumPressureReport(HeliumReportModel model = null); IEnumerable LoadHeliumPressureResults(int testId); + + byte[] LoadHeliumPressureReportAsCSV(HeliumReportModel model); } } diff --git a/LaaProductionWeb/LaaProductionWeb.Services/ReportService.cs b/LaaProductionWeb/LaaProductionWeb.Services/ReportService.cs index d071c2ae..34c124ff 100644 --- a/LaaProductionWeb/LaaProductionWeb.Services/ReportService.cs +++ b/LaaProductionWeb/LaaProductionWeb.Services/ReportService.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; + using System.Text; public class ReportService : IReportService { @@ -87,18 +88,108 @@ TestDate = reader.GetValue(16), Text = reader.GetString(17), Tester = reader.GetString(18) - }) - .ToList(); + }); 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), + 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 [Auftrag].[dbo].[Cordonel_PressureTest_TestPoints] + FROM [Cordonel_PressureTest_TestPoints] WHERE [CordonelPressureTest_Id] = @{nameof(testId)}", parameters => parameters.Add(nameof(testId), testId), reader => new HeliumPressurePoint diff --git a/LaaProductionWeb/LaaProductionWeb/Controllers/ApprovalsController.cs b/LaaProductionWeb/LaaProductionWeb/Controllers/ApprovalsController.cs index 2d90f433..7695bafe 100644 --- a/LaaProductionWeb/LaaProductionWeb/Controllers/ApprovalsController.cs +++ b/LaaProductionWeb/LaaProductionWeb/Controllers/ApprovalsController.cs @@ -20,7 +20,7 @@ public ActionResult Add() => this.View(new ProductionApproval { - ApproverName = this.User.Identity.Name, + ApproverName = this.User.Name(), ApprovalDate = DateTime.Now }); @@ -31,7 +31,7 @@ if (this.ModelState.IsValid) { approval.ApprovalDate = DateTime.Now; - approval.ApproverName = this.User.Identity.Name; + approval.ApproverName = this.User.Name(); var addResult = this.approvals.Add(approval); diff --git a/LaaProductionWeb/LaaProductionWeb/Controllers/ReportController.cs b/LaaProductionWeb/LaaProductionWeb/Controllers/ReportController.cs index c4a9a8f1..0048c5da 100644 --- a/LaaProductionWeb/LaaProductionWeb/Controllers/ReportController.cs +++ b/LaaProductionWeb/LaaProductionWeb/Controllers/ReportController.cs @@ -3,7 +3,7 @@ using LaaProductionWeb.App_Infrastructure; using LaaProductionWeb.Services.Interfaces; using LaaProductionWeb.Services.Models; - + using System; using System.Web.Mvc; [Authorize] @@ -31,6 +31,18 @@ return this.View(model); } + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult CSV(HeliumReportModel model) + { + var csvReport = this.reportService.LoadHeliumPressureReportAsCSV(model); + var fileName = $"HeReport_{DateTime.Now:yyyyMMddhhmmss}.csv"; + + this.Response.AddHeader("Content-Disposition", $"attachment;filename={fileName}"); + + return this.File(csvReport, "application/csv"); + } + public ActionResult Results(int testId = 0) { var results = this.reportService.LoadHeliumPressureResults(testId); diff --git a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj index c43f69de..f772eff2 100644 --- a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj +++ b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj @@ -189,6 +189,7 @@ + diff --git a/LaaProductionWeb/LaaProductionWeb/Views/Report/HiddenFilter.cshtml b/LaaProductionWeb/LaaProductionWeb/Views/Report/HiddenFilter.cshtml new file mode 100644 index 00000000..b183db15 --- /dev/null +++ b/LaaProductionWeb/LaaProductionWeb/Views/Report/HiddenFilter.cshtml @@ -0,0 +1,8 @@ +@model LaaProductionWeb.Services.Models.HeliumReportFilterProperty + + + + + + + diff --git a/LaaProductionWeb/LaaProductionWeb/Views/Report/Index.cshtml b/LaaProductionWeb/LaaProductionWeb/Views/Report/Index.cshtml index f51cc352..d389e019 100644 --- a/LaaProductionWeb/LaaProductionWeb/Views/Report/Index.cshtml +++ b/LaaProductionWeb/LaaProductionWeb/Views/Report/Index.cshtml @@ -42,37 +42,48 @@ @foreach (var item in this.Model.Items) { - - @item.FertigungNr - @item.AuftragNr - @item.PositionNr - @item.SerialNr - @item.IdentNr - @item.HeId - - - @item.HeTestId - - - @item.PcbId - @item.Nennweite - @item.Baulaenge - @item.Typ - @item.Druck - @item.Temperatur - @item.HeLakeRate - @item.HeTestPressure - - @item.Text - @($"{item.TestDate:dd.MM.yyyy}") - @item.Tester - + + @item.FertigungNr + @item.AuftragNr + @item.PositionNr + @item.SerialNr + @item.IdentNr + @item.HeId + + + @item.HeTestId + + + @item.PcbId + @item.Nennweite + @item.Baulaenge + @item.Typ + @item.Druck + @item.Temperatur + @item.HeLakeRate + @item.HeTestPressure + + @item.Text + @($"{item.TestDate:dd.MM.yyyy}") + @item.Tester + } +
+ @this.Html.AntiForgeryToken() + @foreach (var filter in this.Model.Filter) + { + this.Html.Partial("HiddenFilter", filter); + } + +
+