[성현모] Summary 추가, GridFilter 컨피그 분리

This commit is contained in:
SHM
2025-09-19 14:40:06 +09:00
parent ab9bfdfc18
commit 0ff010019d
17 changed files with 428 additions and 115 deletions

View File

@ -14,5 +14,50 @@
"UserID": "Alis", "UserID": "Alis",
"Password": "Kefico!@34" "Password": "Kefico!@34"
} }
],
"GridDisableFilter": [
{
"EnumTabs": 1,
"Filter": [
"Navigation",
"StepVersion",
"IsGlobal",
"UpdateDT",
"Enable",
"testlistfilenonavigation"
]
},
{
"EnumTabs": 11,
"Filter": [
"StationName",
"Host",
"Section",
"TestListCntID"
]
},
{
"EnumTabs": 21,
"Filter": [
"StationName",
"Host",
"Section",
"TestListCntID"
]
},
{
"EnumTabs": 30,
"Filter": [
"TestListFileName",
"TestListFileNo",
"TestListFVariantNo"
]
},
{
"EnumTabs": 1000,
"Filter": [
"TestListFileNo"
]
}
] ]
} }

View File

@ -1,9 +1,4 @@
@using SystemX.Core.Services @inherits LayoutComponentBase
@using WebClient.Library.Config
@inherits LayoutComponentBase
@inject ConfigService<WebClientConfig> configService
@inject NavigationManager NavigationManager
<RadzenLayout> <RadzenLayout>
<RadzenHeader Style="height: 5rem; font-size: 2rem;" class="rz-px-5"> <RadzenHeader Style="height: 5rem; font-size: 2rem;" class="rz-px-5">

View File

@ -1,4 +1,5 @@
@typeparam TDataModel @using WebClient.Library.Model
@typeparam TDataModel
<RadzenDataGrid class="rz-shadow-1" TItem="TDataModel" Data="@DataList" GridLines="DataGridGridLines.Both" <RadzenDataGrid class="rz-shadow-1" TItem="TDataModel" Data="@DataList" GridLines="DataGridGridLines.Both"
AllowFiltering FilterMode="FilterMode.Advanced" CellRender="@CellRender" AllowColumnResize AllowVirtualization AllowFiltering FilterMode="FilterMode.Advanced" CellRender="@CellRender" AllowColumnResize AllowVirtualization
@ -18,8 +19,11 @@
@foreach (var col in typeof(TDataModel).GetProperties()) @foreach (var col in typeof(TDataModel).GetProperties())
{ {
if (col.Name.ToLower().Contains("navigation") || col.Name.ToLower().Contains("stepversion") || col.Name.ToLower().Contains("isglobal") //disable filter
|| col.Name.ToLower().Contains("updatedt") || col.Name.ToLower().Contains("enable")) if (GlobalGridDisableFilter?.Filter?.Exists(x => x.ToLower() == col.Name.ToLower()) == true)
continue;
if (GridDisableFilter?.Filter?.Exists(x=>x.ToLower() == col.Name.ToLower()) == true)
continue; continue;
if (col.Name.ToLower().Equals("testdate")) if (col.Name.ToLower().Equals("testdate"))
@ -111,71 +115,82 @@
[Parameter] [Parameter]
public bool HostColumnMerge { get; set; } public bool HostColumnMerge { get; set; }
[Parameter]
public EnumTabs EnumTab { get; set; }
private GridDisableFilter GlobalGridDisableFilter = new();
private GridDisableFilter GridDisableFilter = new();
private IList<TDataModel> SelectedRow; private IList<TDataModel> SelectedRow;
private string SummaryTestResult = string.Empty; private string SummaryTestResult = string.Empty;
private string SummaryTestTime = string.Empty; private string SummaryTestTime = string.Empty;
protected override async Task OnParametersSetAsync()
{
GlobalGridDisableFilter = configService?.GetConfig()?.GridDisableFilter.Where(x => x.EnumTabs == 1)?.FirstOrDefault();
GridDisableFilter = configService?.GetConfig()?.GridDisableFilter.Where(x => x.EnumTabs == (int)EnumTab)?.FirstOrDefault();
}
private void CellRender(DataGridCellRenderEventArgs<TDataModel> args) private void CellRender(DataGridCellRenderEventArgs<TDataModel> args)
{ {
if (args.Column.Property == null) // if (args.Column.Property == null)
return; // return;
var cellData = args.Data as Overview; // var cellData = args.Data as Overview;
if (cellData is null) // if (cellData is null)
return; // return;
if ((args.Column.Property.ToLower().Equals("testdate") || args.Column.Property.ToLower().Equals("host")) == false) // if ((args.Column.Property.ToLower().Equals("testdate") || args.Column.Property.ToLower().Equals("host")) == false)
return; // return;
int index = DataList.ToList().FindIndex(x => x.Equals(args.Data)); // int index = DataList.ToList().FindIndex(x => x.Equals(args.Data));
//testdate 컬럼일때 날짜 병합 // //testdate 컬럼일때 날짜 병합
if (args.Column.Property.ToLower().Equals("testdate")) // if (args.Column.Property.ToLower().Equals("testdate"))
{ // {
int rowCount = 0; // int rowCount = 0;
var take = DataList.Skip(index).Cast<Overview>(); // var take = DataList.Skip(index).Cast<Overview>();
foreach (var r in take) // foreach (var r in take)
{ // {
if (r.TestDate.Value.Date == cellData.TestDate.Value.Date) // if (r.TestDate.Value.Date == cellData.TestDate.Value.Date)
{ // {
if (r.ModelName == cellData.ModelName) // if (r.ModelName == cellData.ModelName)
{ // {
rowCount += 1; // rowCount += 1;
} // }
} // }
else // else
{ // {
break; // break;
} // }
} // }
args.Attributes.Clear(); // args.Attributes.Clear();
if (rowCount > 0) // if (rowCount > 0)
args.Attributes.Add("rowspan", rowCount); // args.Attributes.Add("rowspan", rowCount);
} // }
if (args.Column.Property.ToLower().Equals("host")) // if (args.Column.Property.ToLower().Equals("host"))
{ // {
if (HostColumnMerge == false) // if (HostColumnMerge == false)
return; // return;
int rowCount = 0; // int rowCount = 0;
var take = DataList.Skip(index).Cast<Overview>(); // var take = DataList.Skip(index).Cast<Overview>();
foreach (var r in take) // foreach (var r in take)
{ // {
if (r.Host == cellData.Host) // if (r.Host == cellData.Host)
{ // {
rowCount += 1; // rowCount += 1;
} // }
else // else
{ // {
break; // break;
} // }
} // }
args.Attributes.Clear(); // args.Attributes.Clear();
if (rowCount > 0) // if (rowCount > 0)
args.Attributes.Add("rowspan", rowCount); // args.Attributes.Add("rowspan", rowCount);
} // }
} }
private async Task SelectRow(TDataModel data) private async Task SelectRow(TDataModel data)

View File

@ -65,6 +65,22 @@
</RadzenStack> </RadzenStack>
</RadzenStack> </RadzenStack>
<!--Function Block-->
<RadzenStack Style="height:10rem; width:fit-content;" class="rz-border-right rz-pr-5" Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Start">
<RadzenStack Style="font-size:1.5rem;" Orientation="Orientation.Vertical" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Center">
<RadzenStack Style="cursor: pointer;" class="" Orientation="Orientation.Vertical" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Start" @onclick="@OnSummary">
<RadzenIcon Style="font-size: 3.5rem; font-weight:400; color:var(--rz-info)" Icon="ssid_chart"></RadzenIcon>
<RadzenLabel Style="font-size: 1.5rem; cursor:pointer; color:var(--rz-info)" Text="Summary"></RadzenLabel>
</RadzenStack>
</RadzenStack>
<RadzenStack Style="font-size:1.5rem;" Orientation="Orientation.Vertical" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Center">
<RadzenStack Style="cursor: pointer;" class="" Orientation="Orientation.Vertical" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Start" @onclick="@OnExportExcel">
<RadzenIcon Style="font-size: 3.5rem; font-weight:400; color:var(--rz-success)" Icon="file_export"></RadzenIcon>
<RadzenLabel Style="font-size: 1.5rem; cursor:pointer; color:var(--rz-success)" Text="Export Excel"></RadzenLabel>
</RadzenStack>
</RadzenStack>
</RadzenStack>
<!--Option Block--> <!--Option Block-->
<RadzenStack Style="height:10rem; width:fit-content;" class="rz-border-right rz-pr-5" Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Start"> <RadzenStack Style="height:10rem; width:fit-content;" class="rz-border-right rz-pr-5" Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Start">
<RadzenStack Style="font-size:1.5rem;" Orientation="Orientation.Vertical" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Center"> <RadzenStack Style="font-size:1.5rem;" Orientation="Orientation.Vertical" AlignItems="AlignItems.Start" JustifyContent="JustifyContent.Center">
@ -98,23 +114,23 @@
</RadzenStack> </RadzenStack>
<RadzenStack Style="height:calc(100vh - 29rem);"> <RadzenStack Style="height:calc(100vh - 29rem);">
@if (tab.Key.EnumTab == EnumTabs.OverviewC1) @if (tab.Key.EnumTab == EnumTabs.OverviewC1 || tab.Key.EnumTab == EnumTabs.OverviewC1Merged)
{ {
<TraGrid TDataModel="Overview" DataList="@(tab.Value.Cast<Overview>())" <TraGrid TDataModel="Overview" DataList="@(tab.Value.Cast<Overview>())" EnumTab="@tab.Key.EnumTab"
OnSelectRow="@OnSelectRowOverview" OnDoubleClickRow="@OnDoubleClickRowOverview" HostColumnMerge> OnSelectRow="@OnSelectRowOverview" OnDoubleClickRow="@OnDoubleClickRowOverview" HostColumnMerge>
</TraGrid> </TraGrid>
} }
@if (tab.Key.EnumTab == EnumTabs.OverviewC1Detail) @if (tab.Key.EnumTab == EnumTabs.OverviewC1Detail || tab.Key.EnumTab == EnumTabs.OverviewC1DetailMerged)
{ {
<TraGrid TDataModel="Overview" DataList="@(tab.Value.Cast<Overview>())" <TraGrid TDataModel="Overview" DataList="@(tab.Value.Cast<Overview>())" EnumTab="@tab.Key.EnumTab"
OnSelectRow="@OnSelectRowOverview" OnDoubleClickRow="@OnDoubleClickRowDetailOverview" HostColumnMerge> OnSelectRow="@OnSelectRowOverview" OnDoubleClickRow="@OnDoubleClickRowDetailOverview" HostColumnMerge>
</TraGrid> </TraGrid>
} }
@if (tab.Key.EnumTab == EnumTabs.TestHistoryC1) @if (tab.Key.EnumTab == EnumTabs.TestHistoryC1)
{ {
<TraGrid TDataModel="TestHistory" DataList="@(tab.Value.Cast<TestHistory>())" <TraGrid TDataModel="TestHistory" DataList="@(tab.Value.Cast<TestHistory>())" EnumTab="@tab.Key.EnumTab"
OnSelectRow="@OnSelectRowOverview" OnDoubleClickRow="@OnDoubleClickRowHistory" VisibleRowNo HostColumnMerge="false"> OnSelectRow="@OnSelectRowOverview" OnDoubleClickRow="@OnDoubleClickRowHistory" VisibleRowNo HostColumnMerge="false">
</TraGrid> </TraGrid>
} }
@ -157,7 +173,40 @@
@if(tab.Value?.Count > 0) @if(tab.Value?.Count > 0)
{ {
<TraGrid TDataModel="ParseTestResult" DataList="@(tab.Value.Cast<ParseTestResult>())" <TraGrid TDataModel="ParseTestResult" DataList="@(tab.Value.Cast<ParseTestResult>())"
HostColumnMerge="false"> HostColumnMerge="false" EnumTab="@tab.Key.EnumTab">
</TraGrid>
}
</RadzenStack>
</RadzenStack>
}
@if (tab.Key.EnumTab == EnumTabs.TestSummaryC1)
{
<RadzenStack Style="height:inherit;" Orientation="Orientation.Horizontal">
<!--Test Info-->
<RadzenStack Style="width:35rem; font-size: 1.5rem; height: inherit;">
@{
var history = tab.Key.Parent as TestSummaryInformation;
<TitleCard HeaderText="Test Information" ContentsHeight="calc(100% - 5rem);" CardStyle="overflow:auto;">
<RadzenStack Style="padding:1rem; color: var(--rz-grid-hover-color); overflow-y:auto; align-items:flex-start;">
@foreach (var prop in history.GetType().GetProperties())
{
<RadzenStack Style="width:100%; background-color:transparent;" class="rz-border-bottom rz-p-1 rz-pb-2" Orientation="Orientation.Horizontal">
<span style="width:12rem; min-width:12rem; font-size: 1.3rem;">@prop.Name</span>
<BlockLabel Text="@prop.GetValue(history).ToString()" MaxWidth="20rem"></BlockLabel>
</RadzenStack>
}
</RadzenStack>
</TitleCard>
}
</RadzenStack>
<!--TestResult-->
<RadzenStack Style="height:inherit;">
@if (tab.Value?.Count > 0)
{
<TraGrid TDataModel="ParseTestSummary" DataList="@(tab.Value.Cast<ParseTestSummary>())"
HostColumnMerge="false" EnumTab="@tab.Key.EnumTab">
</TraGrid> </TraGrid>
} }
</RadzenStack> </RadzenStack>
@ -215,24 +264,26 @@
{ {
List<Overview> overviews = new(); List<Overview> overviews = new();
int tabId = 0;
if (Tabs.Count > 0)
{
tabId = Tabs.Max(x => x.Key.Id) + 1;
}
if (IsMergePartNumberOption == false) if (IsMergePartNumberOption == false)
{ {
overviews = await CPXV2LogService.GetOverviews(SearchDataOverviews); overviews = await CPXV2LogService.GetOverviews(SearchDataOverviews);
Tabs.AddOrUpdate(
new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1} ({tabId})", EnumTab = EnumTabs.OverviewC1, Parent = null },
key => overviews.Cast<IDataModel>().ToList(), (key, oldValue) => overviews.Cast<IDataModel>().ToList());
} }
else else
{ {
overviews = await CPXV2LogService.GetOverviewMerged(SearchDataOverviews); overviews = await CPXV2LogService.GetOverviewMerged(SearchDataOverviews);
}
int tabId = 0;
if(Tabs.Count > 0)
{
tabId = Tabs.Max(x=>x.Key.Id) + 1;
}
Tabs.AddOrUpdate( Tabs.AddOrUpdate(
new OrderdTab {Id = tabId, TabName = $"{EnumTabs.OverviewC1} ({tabId})" , EnumTab = EnumTabs.OverviewC1, Parent = null }, new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1} ({tabId})", EnumTab = EnumTabs.OverviewC1Merged, Parent = null },
key => overviews.Cast<IDataModel>().ToList(), (key, oldValue) => overviews.Cast<IDataModel>().ToList()); key => overviews.Cast<IDataModel>().ToList(), (key, oldValue) => overviews.Cast<IDataModel>().ToList());
}
SelectedTabIndex = Tabs.Count - 1; SelectedTabIndex = Tabs.Count - 1;
} }
@ -262,23 +313,28 @@
if (IsMergePartNumberOption == false) if (IsMergePartNumberOption == false)
{ {
detailOverviews = await CPXV2LogService.GetDetailOverview(SearchDataOverviews, selectRow); detailOverviews = await CPXV2LogService.GetDetailOverview(SearchDataOverviews, selectRow);
}
else
{
detailOverviews = await CPXV2LogService.GetDetailOverviewMerged(SearchDataOverviews, selectRow);
}
int tabId = Tabs.Max(x => x.Key.Id) + 1; int tabId = Tabs.Max(x => x.Key.Id) + 1;
Tabs.AddOrUpdate( Tabs.AddOrUpdate(
new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1Detail} ({tabId})", EnumTab = EnumTabs.OverviewC1Detail, Parent = row }, new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1Detail} ({tabId})", EnumTab = EnumTabs.OverviewC1Detail, Parent = row },
key => detailOverviews.Cast<IDataModel>().ToList(), (key, oldValue) => detailOverviews.Cast<IDataModel>().ToList()); key => detailOverviews.Cast<IDataModel>().ToList(), (key, oldValue) => detailOverviews.Cast<IDataModel>().ToList());
}
else
{
detailOverviews = await CPXV2LogService.GetDetailOverviewMerged(SearchDataOverviews, selectRow);
int tabId = Tabs.Max(x => x.Key.Id) + 1;
Tabs.AddOrUpdate(
new OrderdTab { Id = tabId, TabName = $"{EnumTabs.OverviewC1Detail} ({tabId})", EnumTab = EnumTabs.OverviewC1DetailMerged, Parent = row },
key => detailOverviews.Cast<IDataModel>().ToList(), (key, oldValue) => detailOverviews.Cast<IDataModel>().ToList());
}
tabs.Reload(); tabs.Reload();
SelectedTabIndex = Tabs.Count - 1; SelectedTabIndex = Tabs.Count - 1;
} }
} }
private async Task OnDoubleClickRowDetailOverview(IOverviewModel row) private async Task OnDoubleClickRowDetailOverview(IDataModel row)
{ {
List<TestHistory> histories = new(); List<TestHistory> histories = new();
if (IsMergePartNumberOption == false) if (IsMergePartNumberOption == false)
@ -319,12 +375,12 @@
SelectedTabIndex = Tabs.Count - 1; SelectedTabIndex = Tabs.Count - 1;
} }
void OnClickClose(int tabId) private void OnClickClose(int tabId)
{ {
CloseTab(tabId); CloseTab(tabId);
} }
void CloseTab(int tabId) private void CloseTab(int tabId)
{ {
var removeTab = Tabs.Where(x => x.Key.Id == tabId)?.First().Key; var removeTab = Tabs.Where(x => x.Key.Id == tabId)?.First().Key;
@ -347,7 +403,7 @@
tabs.Reload(); tabs.Reload();
} }
async Task OnChangeMergePartNumberOption() private async Task OnChangeMergePartNumberOption()
{ {
PopupService.OpenIndicator(""); PopupService.OpenIndicator("");
await GetOverviews(); await GetOverviews();
@ -356,8 +412,52 @@
PopupService.CloseIndicator(); PopupService.CloseIndicator();
} }
async Task OnClickDisplayTestList(TestHistory history) private async Task OnClickDisplayTestList(TestHistory history)
{ {
await JS.InvokeVoidAsync("open", $"/testlist/{history.ProductNo}/{history.TestCode}/{SelectionStepVersion}", "_blank"); await JS.InvokeVoidAsync("open", $"/testlist/{history.ProductNo}/{history.TestCode}/{SelectionStepVersion}", "_blank");
} }
private async Task OnSummary()
{
var selectedTab = Tabs.Select(x => x.Key)?.FirstOrDefault(x=>x.Id == SelectedTabIndex);
if(selectedTab is not null)
{
//history에서만 summary 사용
if(selectedTab.EnumTab == EnumTabs.TestHistoryC1)
{
if(Tabs.TryGetValue(selectedTab, out var data) == true)
{
if(Int32.TryParse(SelectionStepVersion, out int stepVersion) == true)
{
var testHistories = data.Cast<TestHistory>().ToList();
var summary = await CPXV2LogService.GetTestSummary(testHistories, stepVersion);
var summaryInformation = testHistories.GetTestSummaryInformation();
if(summary is not null && summaryInformation is not null)
{
summaryInformation.SearchRangeStart = (DateTime)new DateTime(RequestSearch.SearchStart, TimeOnly.MinValue);
summaryInformation.SearchRangeEnd = (DateTime)new DateTime(RequestSearch.SearchEnd, TimeOnly.MaxValue);
int tabId = Tabs.Max(x => x.Key.Id) + 1;
Tabs.AddOrUpdate(
new OrderdTab { Id = tabId, TabName = $"{EnumTabs.TestSummaryC1}({tabId})", EnumTab = EnumTabs.TestSummaryC1, Parent = summaryInformation },
key => summary?.ParseTestSummary?.Cast<IDataModel>()?.ToList(), (key, oldValue) => summary?.ParseTestSummary?.Cast<IDataModel>()?.ToList());
tabs.Reload();
SelectedTabIndex = Tabs.Count - 1;
}
}
}
}
else
{
LogXnet.WriteLine("Not history",LogXLabel.Warning);
}
}
}
private async Task OnExportExcel()
{
}
} }

View File

@ -96,7 +96,7 @@
<RadzenStack Style="height:90vh;" class="rz-pb-3"> <RadzenStack Style="height:90vh;" class="rz-pb-3">
<TraGrid TDataModel="VRFY_TestListFileRelease" DataList="@GetTestList.TestListFile" <TraGrid TDataModel="VRFY_TestListFileRelease" DataList="@GetTestList.TestListFile"
HostColumnMerge="false"> HostColumnMerge="false" EnumTab="EnumTabs.TestListFile">
</TraGrid> </TraGrid>
</RadzenStack> </RadzenStack>

View File

@ -14,3 +14,9 @@
@using Radzen @using Radzen
@using Radzen.Blazor @using Radzen.Blazor
@using SystemX.Core.Services
@using WebClient.Library.Config
@inject ConfigService<WebClientConfig> configService
@inject NavigationManager NavigationManager

View File

@ -105,7 +105,7 @@ public static class ObjectExtend
return testResult; return testResult;
} }
public static ParseTestResult ParseTestResult(this DecompressTestResult logData, TestList testList = null) private static ParseTestResult ParseTestResult(this DecompressTestResult logData, TestList testList = null)
{ {
var selectData = testList.TestListFile.Where(x => x.StepID == logData.StepID)?.FirstOrDefault(); var selectData = testList.TestListFile.Where(x => x.StepID == logData.StepID)?.FirstOrDefault();
if (selectData is not null) if (selectData is not null)
@ -163,4 +163,72 @@ public static class ObjectExtend
return null; return null;
} }
public static TestSummary ToTestSummary(this List<TestResult> testResults)
{
TestSummary testSummary = new TestSummary();
testSummary.ParseTestSummary = new List<ParseTestSummary>();
if(testResults?.Count > 0)
{
var parseTestResults = testResults.SelectMany(x => x.ParseTestResult??=new()).ToList();
var rowGroup = parseTestResults.GroupBy(x => x.StepNo).ToList().OrderBy(x => x.Key);
foreach(var rows in rowGroup)
{
var summary = new ParseTestSummary
{
StepNo = rows.First().StepNo,
Variant = rows.First().Variant,
Gate = rows.First().Gate,
MO = rows.First().MO,
Function = rows.First().Function,
Min = rows.First().Min,
Average = rows.First().MeasuredValue,
Max = rows.First().Max,
Dimension = rows.First().Dimension,
Total = rows.Count(),
OK = rows.Count(x => x.Result.ToLower().Equals("ok") || x.Result.ToLower().Equals("none")),
NG = rows.Count(x => !(x.Result.ToLower().Equals("ok") || x.Result.ToLower().Equals("none"))),
};
//calculate dim
if (rows.FirstOrDefault().Dimension.ToLower() == "dez" || rows.FirstOrDefault().Dimension.ToLower() == "v" ||
rows.FirstOrDefault().Dimension.ToLower() == "float" || rows.FirstOrDefault().Dimension.ToLower() == "int")
{
summary.Average = rows.Average(x => Convert.ToDouble(x.MeasuredValue)).ToString();
}
else
{
if (summary.Average == "0.0")
summary.Average = string.Empty;
}
testSummary.ParseTestSummary.Add(summary);
}
}
return testSummary;
}
public static TestSummaryInformation GetTestSummaryInformation(this List<TestHistory> testHistories)
{
return new TestSummaryInformation
{
StartTime = (DateTime)testHistories.Min(x => x.TestDateTime),
EndTime = (DateTime)testHistories.Max(x => x.TestDateTime),
StationName = testHistories.GroupBy(x=>x.StationName)?.Count() > 1 ? string.Empty : testHistories.FirstOrDefault().StationName,
HostID = testHistories.GroupBy(x => x.Host)?.Count() > 1 ? string.Empty : testHistories.FirstOrDefault().Host,
SectionID = testHistories.GroupBy(x => x.Section)?.Count() > 1 ? string.Empty : testHistories.FirstOrDefault().Section,
TestType = testHistories.FirstOrDefault().TestType,
ProductNo = testHistories.FirstOrDefault().ProductNo,
TestCode = testHistories.FirstOrDefault().TestCode,
ParentNo = testHistories.FirstOrDefault().ParentNo,
TestListFileNo = Convert.ToInt32(testHistories.FirstOrDefault().TestListFileNo),
TestListVariantNo = Convert.ToInt32(testHistories.FirstOrDefault().TestListVariantNo),
ProductionCode = testHistories.FirstOrDefault().FileCode,
FileVersion = testHistories.FirstOrDefault().FileVersion,
StepVersion = testHistories.FirstOrDefault().StepVersion,
TestRequestsID = testHistories.FirstOrDefault().TestListReqID,
};
}
} }

View File

@ -3,10 +3,21 @@
public enum EnumTabs public enum EnumTabs
{ {
None = 0, None = 0,
OverviewC1 = 10, OverviewC1 = 10,
OverviewC1Merged = 11,
OverviewC1Detail = 20, OverviewC1Detail = 20,
OverviewC1DetailMerged = 21,
TestHistoryC1 = 30, TestHistoryC1 = 30,
TestResultC1 = 40, TestResultC1 = 40,
TestSummaryC1 = 50,
TestListFile = 1000,
End = 10000 End = 10000
} }
} }

View File

@ -1,6 +0,0 @@
namespace Web.Tra.Model
{
public interface IOverviewModel : IDataModel
{
}
}

View File

@ -1,6 +0,0 @@
namespace Web.Tra.Model
{
public interface ITestResultModel : IDataModel
{
}
}

View File

@ -1,6 +1,6 @@
namespace Web.Tra.Model namespace Web.Tra.Model
{ {
public class Overview : IOverviewModel public class Overview : IDataModel
{ {
public DateTime? TestDate { get; set; } public DateTime? TestDate { get; set; }
public string StationName { get; set; } public string StationName { get; set; }

View File

@ -1,6 +1,6 @@
namespace Web.Tra.Model namespace Web.Tra.Model
{ {
public class TestHistory : IOverviewModel public class TestHistory : IDataModel
{ {
public long No { get; set; } public long No { get; set; }
public DateTime? TestDateTime { get; set; } public DateTime? TestDateTime { get; set; }

View File

@ -3,7 +3,7 @@ using SystemX.Core.DB;
namespace Web.Tra.Model namespace Web.Tra.Model
{ {
public class TestResult : ITestResultModel public class TestResult : IDataModel
{ {
//log data //log data
public List<DecompressTestResult> DecompressTestResult { get; set; } public List<DecompressTestResult> DecompressTestResult { get; set; }
@ -13,7 +13,7 @@ namespace Web.Tra.Model
public TestList? TestList { get; set; } public TestList? TestList { get; set; }
} }
public class DecompressTestResult : ITestResultModel public class DecompressTestResult : IDataModel
{ {
public int StepID { get; set; } public int StepID { get; set; }
public double MeasVal { get; set; } public double MeasVal { get; set; }
@ -26,7 +26,7 @@ namespace Web.Tra.Model
public string SpentTime { get; set; } public string SpentTime { get; set; }
} }
public class ParseTestResult : ITestResultModel public class ParseTestResult : IDataModel
{ {
public int StepNo { get; set; } public int StepNo { get; set; }
public long Position { get; set; } public long Position { get; set; }

View File

@ -0,0 +1,44 @@
namespace Web.Tra.Model
{
public class TestSummary : IDataModel
{
public List<ParseTestSummary> ParseTestSummary { get; set; }
}
public class ParseTestSummary : IDataModel
{
public int StepNo { get; set; }
public string Variant { get; set; }
public string Gate { get; set; }
public string MO { get; set; }
public string Function { get; set; }
public string Min { get; set; }
public string Average { get; set; }
public string Max { get; set; }
public string Dimension { get; set; }
public int Total { get; set; }
public int OK { get; set; }
public int NG { get; set; }
}
public class TestSummaryInformation : IDataModel
{
public DateTime SearchRangeStart { get; set; }
public DateTime SearchRangeEnd { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public string StationName { get; set; }
public string HostID { get; set; }
public string SectionID { get; set; }
public string TestType { get; set; }
public string ProductNo { get; set; }
public string TestCode { get; set; }
public string ParentNo { get; set; }
public int TestListFileNo { get; set; }
public int TestListVariantNo { get; set; }
public string ProductionCode { get; set; }
public string FileVersion { get; set; }
public int StepVersion { get; set; }
public string TestRequestsID { get; set; }
}
}

View File

@ -115,7 +115,7 @@ namespace Web.Tra.Services
return group.ToList(); return group.ToList();
} }
public async Task<List<Overview>> GetDetailOverview(List<SearchData> request, IOverviewModel row) public async Task<List<Overview>> GetDetailOverview(List<SearchData> request, IDataModel row)
{ {
var selectRow = row as Overview; var selectRow = row as Overview;
List<Overview> detailOverview = new List<Overview>(); List<Overview> detailOverview = new List<Overview>();
@ -142,7 +142,7 @@ namespace Web.Tra.Services
return detailOverview; return detailOverview;
} }
public async Task<List<Overview>> GetDetailOverviewMerged(List<SearchData> request, IOverviewModel row) public async Task<List<Overview>> GetDetailOverviewMerged(List<SearchData> request, IDataModel row)
{ {
var selectRow = row as Overview; var selectRow = row as Overview;
List<Overview> detailOverview = new List<Overview>(); List<Overview> detailOverview = new List<Overview>();
@ -166,7 +166,7 @@ namespace Web.Tra.Services
return detailOverview; return detailOverview;
} }
public async Task<List<TestHistory>> GetTestHistory(List<SearchData> request, IOverviewModel row) public async Task<List<TestHistory>> GetTestHistory(List<SearchData> request, IDataModel row)
{ {
var selectRow = row as Overview; var selectRow = row as Overview;
List<TestHistory> testHistory = new List<TestHistory>(); List<TestHistory> testHistory = new List<TestHistory>();
@ -189,7 +189,7 @@ namespace Web.Tra.Services
return testHistory; return testHistory;
} }
public async Task<List<TestHistory>> GetTestHistoryMerged(List<SearchData> request, IOverviewModel row) public async Task<List<TestHistory>> GetTestHistoryMerged(List<SearchData> request, IDataModel row)
{ {
var selectRow = row as Overview; var selectRow = row as Overview;
List<TestHistory> testHistory = new List<TestHistory>(); List<TestHistory> testHistory = new List<TestHistory>();
@ -200,7 +200,8 @@ namespace Web.Tra.Services
.Where(x => x.Summary.TestDT.Date == selectRow.TestDate.Value.Date && .Where(x => x.Summary.TestDT.Date == selectRow.TestDate.Value.Date &&
x.Summary.Testcode == selectRow.TestCode && x.Summary.Testcode == selectRow.TestCode &&
x.Summary.ProdNo_C == selectRow.ProductNo && x.Summary.ProdNo_C == selectRow.ProductNo &&
x.Summary.ProdNo_P == selectRow.ParentNo) x.Summary.ProdNo_P == selectRow.ParentNo &&
x.Summary.StepVersion == selectRow.StepVersion)
.Select(x => x.ToTestHistory()) .Select(x => x.ToTestHistory())
.OrderBy(x => (x.TestListReqID, x.No)) .OrderBy(x => (x.TestListReqID, x.No))
.ToList(); .ToList();
@ -306,6 +307,28 @@ namespace Web.Tra.Services
return result; return result;
} }
public async Task<TestSummary> GetTestSummary(List<TestHistory> histories, int stepVersion)
{
TestSummary result = new TestSummary();
if (histories?.Count() > 0)
{
List<TestResult> getTestResults = new List<TestResult>();
//test result parse
foreach (var hist in histories)
{
getTestResults.Add(await GetTestResult(hist, stepVersion));
}
result = getTestResults.ToTestSummary();
}
await Task.CompletedTask;
return result;
}
public bool TryParseTestCode(string testCode, out int outValue) public bool TryParseTestCode(string testCode, out int outValue)
{ {
bool result = false; bool result = false;

View File

@ -6,6 +6,7 @@ using System.Text.Json.Serialization;
using System.Threading.Tasks; using System.Threading.Tasks;
using SystemX.Core.Config; using SystemX.Core.Config;
using SystemX.Core.Config.Model; using SystemX.Core.Config.Model;
using WebClient.Library.Model;
namespace WebClient.Library.Config namespace WebClient.Library.Config
{ {
@ -16,5 +17,8 @@ namespace WebClient.Library.Config
[JsonPropertyName("ApplicationName")] [JsonPropertyName("ApplicationName")]
public string? ApplicationName { get; set; } public string? ApplicationName { get; set; }
[JsonPropertyName("GridDisableFilter")]
public List<GridDisableFilter>? GridDisableFilter { get; set; }
} }
} }

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebClient.Library.Model
{
public class GridDisableFilter
{
public int EnumTabs { get; set; }
public List<string> Filter { get; set; }
}
}