diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac index da184b7..891c031 100644 Binary files a/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac and b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac differ diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac index 3d50610..8388292 100644 Binary files a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac and b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac differ diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac index 43c8247..0cd8447 100644 Binary files a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac and b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac differ diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac index 5688695..bf6c284 100644 Binary files a/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac and b/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac differ diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.VPKI_DataDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.VPKI_DataDB.dacpac index 606e544..93e1afa 100644 Binary files a/DBPatch/sqlScripts/dacpac/SystemX.DB.VPKI_DataDB.dacpac and b/DBPatch/sqlScripts/dacpac/SystemX.DB.VPKI_DataDB.dacpac differ diff --git a/Projects/DLL/SystemX.Core.dll b/Projects/DLL/SystemX.Core.dll index 582c331..f2cf488 100644 Binary files a/Projects/DLL/SystemX.Core.dll and b/Projects/DLL/SystemX.Core.dll differ diff --git a/Projects/SystemX.Core/SystemX.Core/Utils/Gzip.cs b/Projects/SystemX.Core/SystemX.Core/Utils/Gzip.cs new file mode 100644 index 0000000..712c220 --- /dev/null +++ b/Projects/SystemX.Core/SystemX.Core/Utils/Gzip.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SystemX.Core.Utils +{ + public static class Gzip + { + public static string Compress(string stringData) + { + byte[] bytes = Encoding.UTF8.GetBytes(stringData); + byte[] inArray = null; + using (MemoryStream memoryStream = new MemoryStream()) + { + using (GZipStream gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) + { + gZipStream.Write(bytes, 0, bytes.Length); + } + + inArray = memoryStream.ToArray(); + } + + return Convert.ToBase64String(inArray); + } + + public static string Decompression(string compressedDataStr) + { + string result = null; + byte[] buffer = Convert.FromBase64String(compressedDataStr); + using (MemoryStream stream = new MemoryStream(buffer)) + { + using GZipStream stream2 = new GZipStream(stream, CompressionMode.Decompress); + using StreamReader streamReader = new StreamReader(stream2); + result = streamReader.ReadToEnd(); + } + + return result; + } + + public static string GzipCompress(this string stringData) + { + return Compress(stringData); + } + + public static string GzipDecompress(this string compressedDataStr) + { + return Decompression(compressedDataStr); + } + } +} diff --git a/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor b/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor index 3449f0d..47a5e61 100644 --- a/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor +++ b/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor @@ -2,18 +2,7 @@ @inject ContextMenuService ContextMenuService - - - - - - - - - - - - @@ -117,6 +106,9 @@ [Parameter] public bool HostColumnMerge { get; set; } + [Parameter] + public bool AllowPaging { get; set; } = true; + [Parameter] public int PageSize { get; set; } = 30; @@ -127,26 +119,7 @@ private string SummaryTestResult = string.Empty; private string SummaryTestTime = string.Empty; - - protected override async Task OnParametersSetAsync() - { - if(typeof(TDataModel) == typeof(TestHistory)) - { - var dataList = DataList.Cast(); - - int ok = dataList.Count(x => x.TestResult.ToLower().Contains("ok")); - int ng = dataList.Count(x => !x.TestResult.ToLower().Contains("ok")); - double ratio = (double)(ok) / (double)(ok + ng) * 100.0; - - double testTimeAvg = dataList.Average(x => Convert.ToInt32(x.Duration)) / 1000.0; - double testTimeMin = dataList.Min(x => Convert.ToInt32(x.Duration)) / 1000.0; - double testTimeMax = dataList.Max(x => Convert.ToInt32(x.Duration)) / 1000.0; - - SummaryTestResult = $"Test Result: {ok + ng} (OK:{ok}/NG:{ng}) - Ratio:{ratio.ToString("F2")}%"; - SummaryTestTime = $"Test Time: Average={testTimeAvg.ToString("F2")}sec Min={testTimeMin.ToString("F2")}sec Max={testTimeMax.ToString("F2")}sec"; - } - } - + private void CellRender(DataGridCellRenderEventArgs args) { if (args.Column.Property == null) @@ -204,30 +177,7 @@ args.Attributes.Add("rowspan", rowCount); } } - - // private async Task OnCellContextMenu(DataGridCellMouseEventArgs args) - // { - // SelectedRow = new List() { args.Data }; - - // ContextMenuService.Open(args, - // new List { - // new ContextMenuItem(){ Text = "Overview", Value = 1, Icon = "home" }, - // new ContextMenuItem(){ Text = "Detail Overview", Value =2 , Icon = "assessment" }, - // new ContextMenuItem(){ Text = "Test History", Value = 3, Icon = "description" }, - // new ContextMenuItem(){ Text = "Test Summary", Value = 4, Icon = "assignment_turned_in" }, - // new ContextMenuItem(){ Text = "Detail Data", Value = 5, Icon = "list" }, - // new ContextMenuItem(){ Text = "Test-Error/Extended Search", Value = 6, Icon = "search" }, - // }, - // (e) => - // { - // ContextMenuService.Close(); - // OnClickContextMenu.InvokeAsync(); - // } - // ); - - // await OnSelectRow.InvokeAsync(args.Data); - // } - + private async Task SelectRow(TDataModel data) { await OnSelectRow.InvokeAsync(data); diff --git a/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor b/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor index 8b5f8cf..e898eca 100644 --- a/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor +++ b/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor @@ -79,7 +79,7 @@ - + @foreach (var tab in Tabs.OrderBy(x=>x.Key.Id)) { @@ -88,30 +88,95 @@ @context.Text + - @if (tab.Key.EnumTab == EnumTabs.OverviewC1) - { - - - } + + + + + + + + + + + + + - @if (tab.Key.EnumTab == EnumTabs.OverviewC1Detail) - { - - - } + + @if (tab.Key.EnumTab == EnumTabs.OverviewC1) + { + + + } - @if (tab.Key.EnumTab == EnumTabs.TestHistoryC1) - { - - - } + @if (tab.Key.EnumTab == EnumTabs.OverviewC1Detail) + { + + + } + + @if (tab.Key.EnumTab == EnumTabs.TestHistoryC1) + { + + + } + + @if (tab.Key.EnumTab == EnumTabs.TestResultC1) + { + + + + @{ + var history = tab.Key.Parent as TestHistory; + if(history.TestResult.ToLower().Contains("ok") == true) + { + + } + else + { + + } + + + + + + + + + + + @foreach (var prop in history.GetType().GetProperties()) + { + + @prop.Name + @prop.GetValue(history) + + } + + + + } + + + + + + + + + } + + } @@ -188,7 +253,7 @@ } Tabs.AddOrUpdate( - new OrderdTab {Id = tabId, TabName = $"{EnumTabs.OverviewC1} ({tabId})" , EnumTab = EnumTabs.OverviewC1 }, + new OrderdTab {Id = tabId, TabName = $"{EnumTabs.OverviewC1} ({tabId})" , EnumTab = EnumTabs.OverviewC1, Parent = null }, key => overviews.Cast().ToList(), (key, oldValue) => overviews.Cast().ToList()); SelectedTabIndex = Tabs.Count - 1; @@ -196,38 +261,46 @@ private void OnSelectRowOverview(IDataModel overview) { - SelectionStationName = $"{overview.StationName} ({overview.Host},{overview.Section})"; - SelectionProductNO = $"{overview.ProductNo} ({overview.TestCode})"; - SelectionParentInfo = $"{overview.ParentNo} ({overview.FileVersion},{overview.FileCode})"; + var selectOverview = overview as Overview; + if(selectOverview is not null) + { + SelectionStationName = $"{selectOverview.StationName} ({selectOverview.Host},{selectOverview.Section})"; + SelectionProductNO = $"{selectOverview.ProductNo} ({selectOverview.TestCode})"; + SelectionParentInfo = $"{selectOverview.ParentNo} ({selectOverview.FileVersion},{selectOverview.FileCode})"; - SelectionSearchBegin = $"{overview.TestDate?.ToString("yyyy-MM-dd")} {overview.FirstTestTime}"; - SelectionSearchEnd = $"{overview.TestDate?.ToString("yyyy-MM-dd")} {overview.FinalTestTime}"; - SelectionStepVersion = $"{overview.StepVersion}"; + SelectionSearchBegin = $"{selectOverview.TestDate?.ToString("yyyy-MM-dd")} {selectOverview.FirstTestTime}"; + SelectionSearchEnd = $"{selectOverview.TestDate?.ToString("yyyy-MM-dd")} {selectOverview.FinalTestTime}"; + SelectionStepVersion = $"{selectOverview.StepVersion}"; + } } private async Task OnDoubleClickRowOverview(IDataModel row) { - List detailOverviews = new(); - - if (IsMergePartNumberOption == false) + var selectRow = row as Overview; + if(selectRow is not null) { - detailOverviews = await CPXV2LogService.GetDetailOverview(SearchDataOverviews, row); - } - else - { - detailOverviews = await CPXV2LogService.GetDetailOverviewMerged(SearchDataOverviews, row); - } + List detailOverviews = new(); - int tabId = Tabs.Max(x => x.Key.Id) + 1; - Tabs.AddOrUpdate( - new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1Detail} ({tabId})", EnumTab = EnumTabs.OverviewC1Detail }, - key => detailOverviews.Cast().ToList(), (key, oldValue) => detailOverviews.Cast().ToList()); + if (IsMergePartNumberOption == false) + { + detailOverviews = await CPXV2LogService.GetDetailOverview(SearchDataOverviews, selectRow); + } + else + { + detailOverviews = await CPXV2LogService.GetDetailOverviewMerged(SearchDataOverviews, selectRow); + } - tabs.Reload(); - SelectedTabIndex = Tabs.Count - 1; + int tabId = Tabs.Max(x => x.Key.Id) + 1; + Tabs.AddOrUpdate( + new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1Detail} ({tabId})", EnumTab = EnumTabs.OverviewC1Detail, Parent = row }, + key => detailOverviews.Cast().ToList(), (key, oldValue) => detailOverviews.Cast().ToList()); + + tabs.Reload(); + SelectedTabIndex = Tabs.Count - 1; + } } - private async Task OnDoubleClickRowDetailOverview(IDataModel row) + private async Task OnDoubleClickRowDetailOverview(IOverviewModel row) { List histories = new(); if (IsMergePartNumberOption == false) @@ -241,13 +314,26 @@ int tabId = Tabs.Max(x => x.Key.Id) + 1; Tabs.AddOrUpdate( - new OrderdTab { Id = tabId, TabName = $"{EnumTabs.TestHistoryC1}({tabId})", EnumTab = EnumTabs.TestHistoryC1 }, + new OrderdTab { Id = tabId, TabName = $"{EnumTabs.TestHistoryC1}({tabId})", EnumTab = EnumTabs.TestHistoryC1, Parent = row }, key => histories.Cast().ToList(), (key, oldValue) => histories.Cast().ToList()); tabs.Reload(); SelectedTabIndex = Tabs.Count - 1; } + private async Task OnDoubleClickRowHistory(IDataModel row) + { + var s = await CPXV2LogService.GetTestResult(row); + + int tabId = Tabs.Max(x => x.Key.Id) + 1; + Tabs.AddOrUpdate( + new OrderdTab { Id = tabId, TabName = $"{EnumTabs.TestResultC1}({tabId})", EnumTab = EnumTabs.TestResultC1, Parent = row }, + key => s.DecompressTestResult.Cast().ToList(), (key, oldValue) => s.DecompressTestResult.Cast().ToList()); + + tabs.Reload(); + SelectedTabIndex = Tabs.Count - 1; + } + private void OnClickDetailOverviewContextMenu() { // DetailOverviews = OverviewService.SearchDetailOverview(SelectedDataService.SelectedOverview); diff --git a/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs b/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs index 5c65df0..902445b 100644 --- a/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs +++ b/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs @@ -1,4 +1,7 @@ -using Web.Tra.Model; +using Newtonsoft.Json; +using SystemX.Core.DB; +using Web.Tra.Model; +using SystemX.Core.Utils; public static class ObjectExtend { @@ -83,4 +86,22 @@ public static class ObjectExtend TestListReqID = data.Summary.TestListCntID }; } + + public static List ToTestResult(this HIST_TestResult histTestResult) + { + var decompStr = histTestResult?.LogData.GzipDecompress(); + var logData = JsonConvert.DeserializeObject>(decompStr); + + foreach (var log in logData) + { + if (string.IsNullOrEmpty(log.Message) == false) + log.MesauredValue = log.Message; + else if (string.IsNullOrEmpty(log.MeasValStr) == false) + log.MesauredValue = log.MeasValStr; + else + log.MesauredValue = log.MeasVal.ToString(); + } + + return logData; + } } \ No newline at end of file diff --git a/Projects/WebClient/Web.Tra/Model/Enum/EnumTabs.cs b/Projects/WebClient/Web.Tra/Model/Enum/EnumTabs.cs index 36f02d2..4c54436 100644 --- a/Projects/WebClient/Web.Tra/Model/Enum/EnumTabs.cs +++ b/Projects/WebClient/Web.Tra/Model/Enum/EnumTabs.cs @@ -6,6 +6,7 @@ OverviewC1 = 10, OverviewC1Detail = 20, TestHistoryC1 = 30, + TestResultC1 = 40, End = 10000 } } diff --git a/Projects/WebClient/Web.Tra/Model/IDataModel.cs b/Projects/WebClient/Web.Tra/Model/IDataModel.cs index a9bd399..3c7b75b 100644 --- a/Projects/WebClient/Web.Tra/Model/IDataModel.cs +++ b/Projects/WebClient/Web.Tra/Model/IDataModel.cs @@ -2,19 +2,8 @@ { public interface IDataModel { - public DateTime? TestDate { get; set; } - public string StationName { get; set; } - public string Host { get; set; } - public string Section { get; set; } - public string ModelName { get; set; } - public string ProductNo { get; set; } - public string TestCode { get; set; } - public string ParentNo { get; set; } - public string FileCode { get; set; } - public string FileVersion { get; set; } - public int? StepVersion { get; set; } - public string FirstTestTime { get; set; } - public string FinalTestTime { get; set; } - public string TestListCntID { get; set; } + public DateTime? TestDate { get; set; } + public string Host { get; set; } + public string ModelName { get; set; } } } diff --git a/Projects/WebClient/Web.Tra/Model/IOverviewModel.cs b/Projects/WebClient/Web.Tra/Model/IOverviewModel.cs new file mode 100644 index 0000000..8dda12e --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/IOverviewModel.cs @@ -0,0 +1,20 @@ +namespace Web.Tra.Model +{ + public interface IOverviewModel : IDataModel + { + public DateTime? TestDate { get; set; } + public string StationName { get; set; } + public string Host { get; set; } + public string Section { get; set; } + public string ModelName { get; set; } + public string ProductNo { get; set; } + public string TestCode { get; set; } + public string ParentNo { get; set; } + public string FileCode { get; set; } + public string FileVersion { get; set; } + public int? StepVersion { get; set; } + public string FirstTestTime { get; set; } + public string FinalTestTime { get; set; } + public string TestListCntID { get; set; } + } +} diff --git a/Projects/WebClient/Web.Tra/Model/ITestResultModel.cs b/Projects/WebClient/Web.Tra/Model/ITestResultModel.cs new file mode 100644 index 0000000..caf5d37 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/ITestResultModel.cs @@ -0,0 +1,7 @@ +namespace Web.Tra.Model +{ + public interface ITestResultModel : IDataModel + { + public long No { get; set; } + } +} diff --git a/Projects/WebClient/Web.Tra/Model/OrderdTab.cs b/Projects/WebClient/Web.Tra/Model/OrderdTab.cs index f7b7f2c..361c66f 100644 --- a/Projects/WebClient/Web.Tra/Model/OrderdTab.cs +++ b/Projects/WebClient/Web.Tra/Model/OrderdTab.cs @@ -7,5 +7,7 @@ namespace Web.Tra.Model public int Id { get; set; } public string TabName { get; set; } public EnumTabs EnumTab { get; set; } + + public IDataModel Parent { get; set; } } } diff --git a/Projects/WebClient/Web.Tra/Model/Overview.cs b/Projects/WebClient/Web.Tra/Model/Overview.cs index ff2ffeb..caf7473 100644 --- a/Projects/WebClient/Web.Tra/Model/Overview.cs +++ b/Projects/WebClient/Web.Tra/Model/Overview.cs @@ -1,6 +1,6 @@ namespace Web.Tra.Model { - public class Overview : IDataModel + public class Overview : IOverviewModel { public DateTime? TestDate { get; set; } public string StationName { get; set; } diff --git a/Projects/WebClient/Web.Tra/Model/TestHistory.cs b/Projects/WebClient/Web.Tra/Model/TestHistory.cs index f35e1c3..647ca63 100644 --- a/Projects/WebClient/Web.Tra/Model/TestHistory.cs +++ b/Projects/WebClient/Web.Tra/Model/TestHistory.cs @@ -1,6 +1,6 @@ namespace Web.Tra.Model { - public class TestHistory : IDataModel + public class TestHistory : IOverviewModel { public long No { get; set; } public DateTime? TestDate { get; set; } diff --git a/Projects/WebClient/Web.Tra/Model/TestResult.cs b/Projects/WebClient/Web.Tra/Model/TestResult.cs new file mode 100644 index 0000000..b491b71 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/TestResult.cs @@ -0,0 +1,45 @@ + +namespace Web.Tra.Model +{ + public class TestResult : ITestResultModel + { + public long No { get; set; } + + public DateTime? TestDate { get; set; } + public string StationName { get; set; } + public string Host { get; set; } + public string Section { get; set; } + public string ModelName { get; set; } + public string ProductNo { get; set; } + public string TestCode { get; set; } + public string ParentNo { get; set; } + public string FileCode { get; set; } + public string FileVersion { get; set; } + public int? StepVersion { get; set; } + public string FirstTestTime { get; set; } + public string FinalTestTime { get; set; } + public string TestListCntID { get; set; } + + + public List DecompressTestResult { get; set; } + } + + public class DecompressTestResult : ITestResultModel + { + public long No { get; set; } + public DateTime? TestDate { get; set; } + public string StationName { get; set; } + public string Host { get; set; } + public string ModelName { get; set; } + + public int StepID { get; set; } + public double MeasVal { get; set; } + public string MeasValStr { get; set; } + public string Message { get; set; } + public string GlobalMin { get; set; } + public string MesauredValue { get; set; } + public string GlobalMax { get; set; } + public string Result { get; set; } + public string SpentTime { get; set; } + } +} diff --git a/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs b/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs index c3b207c..47ddbeb 100644 --- a/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs +++ b/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs @@ -114,7 +114,7 @@ namespace Web.Tra.Services return group.ToList(); } - public async Task> GetDetailOverview(List request, IDataModel row) + public async Task> GetDetailOverview(List request, IOverviewModel row) { var detailOverview = request .Where(x => x.Summary.HostID == row.Host && @@ -134,7 +134,7 @@ namespace Web.Tra.Services return detailOverview.ToList(); } - public async Task> GetDetailOverviewMerged(List request, IDataModel row) + public async Task> GetDetailOverviewMerged(List request, IOverviewModel row) { var detailOverview = request .Where(x => x.Summary.Testcode == row.TestCode && @@ -151,7 +151,7 @@ namespace Web.Tra.Services return detailOverview.ToList(); } - public async Task> GetTestHistory(List request, IDataModel row) + public async Task> GetTestHistory(List request, IOverviewModel row) { var testHistory = request .Where(x => x.Summary.TestDT.Date == row.TestDate.Value.Date && @@ -166,7 +166,7 @@ namespace Web.Tra.Services return testHistory.ToList(); } - public async Task> GetTestHistoryMerged(List request, IDataModel row) + public async Task> GetTestHistoryMerged(List request, IOverviewModel row) { var testHistory = request .Where(x => x.Summary.TestDT.Date == row.TestDate.Value.Date && @@ -179,6 +179,37 @@ namespace Web.Tra.Services return testHistory.ToList(); } + public async Task GetTestResult(IDataModel row) + { + TestResult result = new TestResult(); + + var selectRow = row as TestHistory; + if(selectRow is not null) + { + int year = selectRow.TestDate.Value.Year; + + using (var scope = _scopeFactory.CreateScope()) + { + var provider = scope.ServiceProvider.GetRequiredService(); + using (var context = GetDBContext(provider, year)) + { + if (context is not null) + { + var testResult = context.HIST_TestResults.Where(x => x.No == selectRow.No)?.First(); + var decompressTestResult = testResult.ToTestResult(); + + result.DecompressTestResult = decompressTestResult; + } + } + } + + result.No = selectRow.No; + } + + await Task.CompletedTask; + return result; + } + //Get DBContext private T? GetDBContext(DbContextProvider provider, int dbID) where T : DbContext { diff --git a/Projects/WebClient/Web.Tra/wwwroot/app.css b/Projects/WebClient/Web.Tra/wwwroot/app.css index f682f54..e918493 100644 --- a/Projects/WebClient/Web.Tra/wwwroot/app.css +++ b/Projects/WebClient/Web.Tra/wwwroot/app.css @@ -101,6 +101,7 @@ h1:focus { font-size: 1.5rem !important; } +/*common*/ span{ font-size: 1.5rem; } \ No newline at end of file