From 2cb56154e55742b8b687bb7e9dbe82dc6229cd4f Mon Sep 17 00:00:00 2001 From: SHM Date: Mon, 1 Sep 2025 16:07:32 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=84=B1=ED=98=84=EB=AA=A8]=20Tra=20Overview?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5,=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dacpac/SystemX.DB.AccountDB.dacpac | Bin 3501 -> 3502 bytes .../sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac | Bin 5808 -> 5806 bytes .../dacpac/SystemX.DB.CPXV2Log.dacpac | Bin 5135 -> 5138 bytes .../dacpac/SystemX.DB.UniqueKeyDB.dacpac | Bin 2613 -> 2612 bytes .../dacpac/SystemX.DB.VPKI_DataDB.dacpac | Bin 3092 -> 3092 bytes Projects/DLL/SystemX.Core.DB.dll | Bin 71680 -> 71680 bytes Projects/DLL/SystemX.Core.dll | Bin 53760 -> 53760 bytes .../Web.Tra/Components/Module/TraGrid.razor | 181 ++++++++++++++++++ .../Web.Tra/Components/Pages/TRA.razor | 124 +++++++++++- .../Web.Tra/Components/_Imports.razor | 5 +- .../Web.Tra/Extended/ObjectExtended.cs | 60 ++++++ .../WebClient/Web.Tra/Model/Enum/EnumTabs.cs | 11 ++ .../WebClient/Web.Tra/Model/IDataModel.cs | 6 + Projects/WebClient/Web.Tra/Model/Overview.cs | 27 +++ .../WebClient/Web.Tra/Model/SearchData.cs | 26 +++ .../WebClient/Web.Tra/Model/TestHistory.cs | 22 +++ .../Web.Tra/Services/CPXV2LogService.cs | 133 ++++++------- 17 files changed, 518 insertions(+), 77 deletions(-) create mode 100644 Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor create mode 100644 Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs create mode 100644 Projects/WebClient/Web.Tra/Model/Enum/EnumTabs.cs create mode 100644 Projects/WebClient/Web.Tra/Model/IDataModel.cs create mode 100644 Projects/WebClient/Web.Tra/Model/Overview.cs create mode 100644 Projects/WebClient/Web.Tra/Model/SearchData.cs create mode 100644 Projects/WebClient/Web.Tra/Model/TestHistory.cs diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac index 1fe1660680f4c6127bfeca9ac8a7657fafff257f..da184b715aa4513dfba2ca77437ad0487e01e6ec 100644 GIT binary patch delta 706 zcmZ20y-u1pz?+#xgn@y9gP}ZFaU*XJD>IPZJco5U6NoX{jN?5gkdBU3{OqhTS&!4W z{&e4L1ChJouk01J$!<7n>~cUu(Ph=Dmo8qn_9puzu@)RNySilmHCOwU`vWF3O4GDYrcbpS19oDF2wrb#%p^w$ewheS=@!+7N9h!BlJaxcAVSi9cV@{EW^31%f9 z`*e{;QrLtu=As=$eE^s10|`p zPV*OMbiR`DntyEerJLFBE!HpDyEjg`y8WqVe%vbd#pWuGj_?0B*H7F!HH+0(>Xuex z>Dgs>!+UBLO_#O5sCLtN`dfiYKb2fwZ`~c0 zHnUsd%=N$rhiy)zO`NX#S@le;i21>(^LL(>d8(cN@Wn^AiFG=)@8eF{mjAgDcy|lm zK8tN`zDK_5Gak!V`iq*hCQs&m4o*?EJSJdz3y&q3{=j2}l){X8_2oh7&Hj<6*KA<2 Vd_*-mR%Rf*c@FDzCJI_)1A)Eauj(CQc0bTp5MW&0BCvARHfhbw_k0$eq6Z>xhs^%BRqog1U*cIp3w)>A zhR(4u&cFA0w&DJ|KRxpCuTT9tw&c+w&zvVtx08Goz3#mc-hI_teT)3%@9!V6>dsTW z|M{3vgPZC%$Jdud7(!(te5Xc#cH&YkyQS;Gd&Rqc=?s%xM^EkzX_GE@)i1v_fq_Sm zP2l#j)u~6dqhwyrTf4-tKZ4EXSpOhDY`>JF~k>yDW<{a21~ZK)_$=52IT!hxNqR#QsyWKiM5~XK6jy@bXku z%TD*3V!MhpYNgDVZoYn(BT%!vHd49V`RYZPxK-?{%~c#7-~Vr}pSpEwo~pOhwJcBH zv#aig?fG%!oOEG|@21w2=kL|5TfF3hoO*lfKi>0_Ty|mW_q%<`YyPD>)P7lI@b~^! z`N&^&*9-5TGd;(*#$werIr+l^8}@n3yRkq_b#=^Vfwxy?Pi&o@8u#w$X3i+RlS%VZ zSsZ8RFFw#-IiYpp^s}EW&v15`Jvem!gpK>pL$ecQSQ~G4E-cr7I?cN7)rxgd?C~42 z1Iiyg(`P((-{qGyO3Io%h5I=;LDlh?fa$F~mSFlLj}=k^GvU>j2PHTAN1k4@fvNH_ U5DNn_0<=wT;#FhI;{k~P0G4t#C;$Ke diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac index 023540b12e9acedb1e8802b15f7e6842edb0d59b..3d506107a7b1f11a18842517f67af2375f5050f5 100644 GIT binary patch delta 704 zcmdm>yH1xkz?+#xgn@y9gP}55aU-t*KQoZt?7;t>5yY5mCHR&TNJn2*yX>Ym*+9s+ z-nW0YfxzDISM?4tyB{!qmSkL=!xR*nYaVpzo@{}TcEjdvE6aXguX^GCDt?7$gIVae zke^RxR(_s$|Hi+skJF3(U%GP4TubF~ZkCnV47ObFxQ%7=XU)A8Ik9s7-ume}o2FY?%? zJj>kCyqGy}EsN^e3ppvj52wd`n(yfxy!rUdnbpw;qa~_V{mgcbzPef<=eDNal9`tI zbC~Z6Oj&SyTfK^ZRe4#VOZ^%X!Ql0g3{xI7R84z)=-MZx`x`krJ4N$W-{@E3XtMCQ z5MnpevE@`uK`nO@_ncm4WAiyb6WHY#Tz)VgF>Z)UiMLqrY1^(&&bu5N*p-**OAGvx z2@PL$Z{eH5U7CCMerx+2b?fzK(@o|sa$leA+-J<@9HcJsXTNd1SnOIW$IH{oyaZx5 zzuIQ1ZGZ7Pul*&nyG-|f?k;$4F_oW1IQMbvBbpQXdM#pcwynR16E4EAwMo3-Mh=-S-B0%zYS*3EE^d62QMW3ke=Lw^zl zodR22`6jdr?EWWn-kE<-YD=+c&tjz`c4e~rPfVAnjyiv%dP33Jxi;TI#Mds?Uni^n z!Y$^%P{uE{P4`g}*5qj-&%x=bLDU3HZx^)$)1O7HkkXf#n7%wHwb?)N^qLJ!l#hW} S7>E&|eR7MK8e6_7NCW_byD@tJ delta 706 zcmZ3dyFr&Xz?+#xgn@y9gW+VZ>_%P#er6!O*@6E%BZx8CO7JZwkdD?!v7W0j*+9s+ z{&e4L1ChJouk01J%}q$2%^+xSih0SZS?4@Fcbg}qtzkHKW7(`P*LS^8|0CuJ4;$n;cYl@z}Q44!4tX6}|4+9V=VD+BM<6+WY&i)=_u7 z|DA|F%@8Ge+dpc47{iK3ou(m{y!uN57G3gFlv+?fFZ<|{Om45J2HVMVuKlsT+Qy>r zLWyBw?yjh?FAm+xwJH2Tb7owbv-0`|&zij%UK^Ny>oX-MoXB@wt(hPCt4JtlbCJ8L zuU1xtvcYWWf@)pK+_p63+wyj=C;j)47Q1bG&hNsWrtJoALb{6&N8MdL!RGyz38(z- zn15qTV{uKmS3m8=y)|*MG8g5&osWFA{8$+GB-B+*QSmgZ;)y>`6(gsJD&=(kxpe+8 zhtJc=k|D2H9G~bWY;bsZ@Tm5tn4JrS9UeKI|I2V#v}Ny!eFY9nb1nN7PZw~W?09*a zt>vcsP0?ND8arqEdF8J!7FZN^?%!7lOZHWLX&+H#L+%5B`e*ea8v1_eQKAKh< z6%_pW!c$XyyN#b6Wg?}Y3xvl#4PO^sH6bZ0=TG^*wkJ+#J>qX3 zEuS`X{!)Quc03ceAIqNau!-BepsR4g&l`tNeBD&iZfIC_>|XPf>~}BLE#H+PTkF_o z>1kZ}*{k8@OpiKdl%zFzipXn+a diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac index b979d21ac99988893c0e1bcf12629655f01507e4..43c8247e69b729fb7b5fe9ce2123eaaa50098019 100644 GIT binary patch delta 706 zcmeCzn54lQ;LXe;!oa}5!B7^gxRF4fcw*lex7*Q zST>8PMCn?8(7bSlj!zy@I%lR$o5LCAy*Wi!z`wU%A!aM9sNTW8f-dP_T}zc1Iiffm zmaJYkODwmr@(}x`r*C|AEOCiBr1kObD$R|)7Bzx1n3C<1=N{Q2{PXk7LeEva(=1kQ zeAIg&DeuTz74;pmvwd^we{9MA$DQZ7hTp>0@if=HLlcS*$3Bzd=RbNuPDrs*a z{{{sOrqkP8`s-hn6c#$wuM!cQs^1xI&G#`UB}8-`FS}@~;E#E!EZdTQZ;if^`oJ|o zZ~oZ>F=`x2*BcfxuHDNTej?toFVlM8`(F>)CDtj(xbU?qYrS8^+LP^czgh8%`k4ST zr7O0p_DyMaK6!YLX7k=>^ESH8*nL`RX0?vrs}EQ1WG+_R__X(5{r$|y`zPj2-l4qr zNyOEh--{MLP5-nhUH#Hg)-BoFzh$3Z71NQsCg)H0_pnnYtqb>N^T`x{wP%)E9Nv2J z|GK|tjK1ye`(3s!uuSEt=a;vCB$hRNn|e8dU3axd@~ZX~(~P$_7xb=C*zC;CYVh@w z?~65a4ZNMr8zfH!zFVGse`B$TIh%%W>}{tLw^P>5uKP0alJQr$rFV+l`I)bVzJ9`O zbeKcu$klkJGy6NAn4=`E$zKJZgHzOfArmkyCTt0&gM_V+QrJ{seR)uNvw!62H5-^L V9|N&45F^0r$&ZEA*e(l!L;zJ0I}HE; delta 681 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 diff --git a/Projects/DLL/SystemX.Core.DB.dll b/Projects/DLL/SystemX.Core.DB.dll index 74eb0675ee2d6fa13572b3e1c2ba628ef66a207f..942993d0db023e356f719637e93fab69a61e359d 100644 GIT binary patch delta 242 zcmZqJz|ydRWkLr_*|_U+!Qm#B63-}Vpuj5@6TDGbRB z1`L)Ai43L;CJd=So&|#;gEv$WECZmZ8BpE=D3StJmj>jg0bvqQ2Bb0-Os4|n MlDB7zGEQXz0JaHCe$itXyKE^`Uf`O`4uUoVUT8FXla?8 zn386YmS|~aU}TnTV3w9_W}awfVV<09Xlaz1l4P7}u|1ZTaXurg}Nesq7 M+G2aQDC1Nn0PuEE4gdfE diff --git a/Projects/DLL/SystemX.Core.dll b/Projects/DLL/SystemX.Core.dll index fc5c0055eee387e9262670d2969816e5753b5a71..045260dbc4a373d592b9d1a70badd61c6812bdc0 100644 GIT binary patch delta 238 zcmZoz!rZWgc|r%vXV%7j8+&9n3%n{#IyuWP!eQP0l*p2>O*Wf%Y-SeHNJ%!ZOf)q~ zO|~#JH?%acFgHjwOSG^|NinOU*b*pi0c05fMa_Wn7C?~{u(~uLKMe?zfHEMJsbD%4D3`oB I{QOEL0Q@sf)Bpeg delta 238 zcmZoz!rZWgc|r$^$fTVgH}=SE7AUcc?aW#i=CbzrBmV%gClfaB*vu@Xk!qG^kY<)* zYHpg6Y;107oMe%lmS$j(Y+z|@o|>Ejluj}-u}C%D{P^fpW|sY8pY~0zIT;|(z2{`O z-nrX;t5xG~Y5ZW2ntbPEmI6#r8!8A=J$25MMj7E5_m}0~{l7Ww)FKxDR0cDKGzJ48 zHe*O(Fl8_Y;uMBt24gVGm?4S50?11Pt1$qw3>YlIa;ZRe3IjxU5`z(g2~b@sgX!k* H^DCJEhQv{g diff --git a/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor b/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor new file mode 100644 index 0000000..b57b030 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Components/Module/TraGrid.razor @@ -0,0 +1,181 @@ +@typeparam TDataModel where TDataModel : IDataModel + +@inject ContextMenuService ContextMenuService + + + + + @if (VisibleRowNo == true) + { + + + + } + + @foreach (var col in typeof(TDataModel).GetProperties()) + { + if (col.Name.ToLower().Equals("rn") || col.Name.ToLower().Equals("stepversion")) + continue; + + if (col.Name.ToLower().Equals("testdate")) + { + + + + } + else if (col.Name.ToLower().Equals("ok")) + { + + + + } + else if (col.Name.ToLower().Equals("ng")) + { + + + + } + else + { + + + } + } + + + +@code { + [Parameter] + public IEnumerable DataList { get; set; } + + [Parameter] + public EventCallback OnSelectRow { get; set; } + + [Parameter] + public EventCallback OnClickContextMenu { get; set; } + + [Parameter] + public bool VisibleRowNo { get; set; } + + [Parameter] + public bool HostColumnMerge { get; set; } + + private IList SelectedRow; + + private void CellRender(DataGridCellRenderEventArgs args) + { + if (args.Column.Property == null) + return; + + //testdate 컬럼일때 날짜 병합 + if (args.Column.Property.ToLower().Equals("testdate")) + { + var properties = typeof(TDataModel).GetProperties().ToList(); + + var testDate = properties.Find(x => x.Name.ToLower() == "testdate"); + var host = properties.Find(x => x.Name.ToLower() == "host"); + var section = properties.Find(x => x.Name.ToLower() == "section"); + + if (testDate != null && host != null && section != null) + { + var rowTestDate = testDate.GetValue(args.Data); + var rowHost = host.GetValue(args.Data); + var rowSection = section.GetValue(args.Data); + + var data = DataList.First(x => (DateTime?)testDate.GetValue(x) == (DateTime?)rowTestDate); + if (data != null) + { + var dataTestDate = testDate.GetValue(data); + var dataHost = host.GetValue(data); + var dataSection = section.GetValue(data); + + if (rowHost == dataHost && rowSection == dataSection) + { + int rowCount = DataList.Count(x => (DateTime?)testDate.GetValue(x) == (DateTime?)rowTestDate); + + args.Attributes.Add("rowspan", rowCount); + } + } + } + } + + //host merge 옵션 + if (HostColumnMerge == true) + { + if (args.Column.Property.ToLower().Equals("host")) + { + var properties = typeof(TDataModel).GetProperties().ToList(); + + var testDate = properties.Find(x => x.Name.ToLower() == "testdate"); + var host = properties.Find(x => x.Name.ToLower() == "host"); + var section = properties.Find(x => x.Name.ToLower() == "section"); + + if (testDate != null && host != null && section != null) + { + var rowTestDate = testDate.GetValue(args.Data); + var rowHost = host.GetValue(args.Data); + var rowSection = section.GetValue(args.Data); + + var data = DataList.First(x => host.GetValue(x).ToString() == rowHost.ToString()); + if (data != null) + { + var dataTestDate = testDate.GetValue(data); + var dataHost = host.GetValue(data); + var dataSection = section.GetValue(data); + + if (rowHost == dataHost && rowSection == dataSection) + { + int rowCount = DataList.Count(x => host.GetValue(x).ToString() == rowHost.ToString()); + + 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); + StateHasChanged(); + } +} diff --git a/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor b/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor index 7f7877c..31aeabd 100644 --- a/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor +++ b/Projects/WebClient/Web.Tra/Components/Pages/TRA.razor @@ -9,11 +9,11 @@ - + - + @@ -25,13 +25,131 @@ + + + +@* + + @foreach (var tab in ListTabs) + { + + + + @if (tab.Key == EnumTabs.OverviewC1.ToString()) + { + + + } + + @if (tab.Key == EnumTabs.OverviewC1Detail.ToString()) + { + + + } + + @if (tab.Key.Contains(EnumTabs.TestHistoryC1.ToString())) + { + + + } + + + } + + + *@ @code { + private RequestSearch RequestSearch = new RequestSearch(); + + RadzenTabs tabs; + protected override async Task OnInitializedAsync() { } private async Task OnSearch() { - await CPXV2LogService.Test(); + //날짜 오류 + if(RequestSearch.SearchStart > RequestSearch.SearchEnd) + { + LogXnet.WriteLine("DateTime Set Error", LogXLabel.Error); + return; + } + + Overviews = await CPXV2LogService.GetOverview(RequestSearch); + } + + int SelectedTabIndex = 0; + Dictionary ListTabs = new Dictionary(); + List Overviews = new List(); + List DetailOverviews = new List(); + // List TestHistories = new List(); + + protected override void OnInitialized() + { + + } + + protected override void OnAfterRender(bool firstRender) + { + + } + + protected override void OnParametersSet() + { + + // var searchData = OverviewService.SearchOverview(); + //Overviews = searchData; + + // if (ListTabs.ContainsKey(EnumTabs.OverviewC1.ToString()) == false) + // ListTabs.Add($"{EnumTabs.OverviewC1}", EnumTabs.OverviewC1); + } + + private void OnSelectRowOverview(Overview overview) + { + // if (SelectedTabIndex < 0) + // SelectedTabIndex = 0; + + // SelectedDataService.SetSelectedOverview(overview); + } + + private void OnClickDetailOverviewContextMenu() + { + // DetailOverviews = OverviewService.SearchDetailOverview(SelectedDataService.SelectedOverview); + + // if (ListTabs.ContainsKey(EnumTabs.OverviewC1Detail.ToString()) == false) + // ListTabs.Add($"{EnumTabs.OverviewC1Detail.ToString()}", EnumTabs.OverviewC1Detail); + // tabs.Reload(); + + // SelectedTabIndex = ListTabs.Keys.ToList().IndexOf(EnumTabs.OverviewC1Detail.ToString()); + } + + private void OnClickHistoryContextMenu() + { + // TestHistories = OverviewService.SearchTestHistory(SelectedDataService.SelectedOverview); + + // int index = ListTabs.Count(x => x.Key.Contains(EnumTabs.TestHistoryC1.ToString())) + 1; + + // ListTabs.Add($"{EnumTabs.TestHistoryC1}({index})", EnumTabs.TestHistoryC1); + // tabs.Reload(); + + // SelectedTabIndex = ListTabs.Keys.ToList().IndexOf($"{EnumTabs.TestHistoryC1}({index})"); + } + + void OnClickClose(string tabKey) + { + if (ListTabs.ContainsKey(tabKey)) + { + ListTabs.Remove(tabKey); + if (SelectedTabIndex >= ListTabs.Count) + SelectedTabIndex = ListTabs.Count - 1; + } + tabs.Reload(); } } \ No newline at end of file diff --git a/Projects/WebClient/Web.Tra/Components/_Imports.razor b/Projects/WebClient/Web.Tra/Components/_Imports.razor index c569c68..8935bd4 100644 --- a/Projects/WebClient/Web.Tra/Components/_Imports.razor +++ b/Projects/WebClient/Web.Tra/Components/_Imports.razor @@ -8,6 +8,9 @@ @using Microsoft.JSInterop @using Web.Tra @using Web.Tra.Components +@using Web.Tra.Model +@using Web.Tra.Model.Enum +@using Web.Tra.Components.Module @using Radzen -@using Radzen.Blazor \ No newline at end of file +@using Radzen.Blazor diff --git a/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs b/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs new file mode 100644 index 0000000..ba19b90 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Extended/ObjectExtended.cs @@ -0,0 +1,60 @@ +using Web.Tra.Model; + +public static class ObjectExtend +{ + public static Overview ToOverview(this IEnumerable data) + { + return new Overview + { + TestDate = data.Max(x => x.Summary.TestDT.Date), + StationName = data.Last().Summary.StationName, + Host = data.Last().Summary.HostID, + Section = data.Last().Summary.Section, + ModelName = data.Last().TestInfo?.PROD_Group?.ModelName, + TestType = data.Last().Summary.TestType, + ProductNo = data.Last().Summary.ProdNo_C, + TestCode = data.Last().Summary.Testcode, + ParentNo = data.GroupBy(x => x.Summary.TestListCntID).Last().Last().Summary.ProdNo_P, + TestListFileNo = data.GroupBy(x => x.Summary.TestListCntID).Last().Last().Summary.TestListFileNo, + TestListVariantNo = data.GroupBy(x => x.Summary.TestListCntID).Last().Last().Summary.TestListVariantNo, + FileCode = data.Last().Summary.ProdCode, + FileVersion = data.Last().Summary.Version, + StepVersion = data.Last().Summary.StepVersion, + FirstTestTime = data.GroupBy(x => x.Summary.TestListCntID).Last().Min(y => y.Summary.TestDT).ToString("HH:mm:ss"), + FinalTestTime = data.GroupBy(x => x.Summary.TestListCntID).Last().Max(y => y.Summary.TestDT).ToString("HH:mm:ss"), + Total = data.GroupBy(x => (x.Summary.TestListCntID, x.Summary.TestDT.Date)).Last().Count(), + OK = data.GroupBy(x => (x.Summary.TestListCntID, x.Summary.TestDT.Date)).Last().Count(y => y.Summary.Result.ToLower().Equals("ok")), + NG = data.GroupBy(x => (x.Summary.TestListCntID, x.Summary.TestDT.Date)).Last().Count(y => !y.Summary.Result.ToLower().Equals("ok")), + RN = 0, + TestListCntID = data.Last().Summary.TestListCntID + }; + } + + public static Overview ToDetailOverview(this IEnumerable data) + { + return data.ToOverview(); + } + + public static TestHistory ToTestHistory(this IEnumerable data) + { + return new TestHistory + { + No = data.Last().Summary.No, + TestDateTime = data.Last().Summary.TestDT, + StationName = data.Last().Summary.StationName, + Host = data.Last().Summary.HostID, + Section = data.Last().Summary.Section, + ProductID = data.Last().Summary.ProductID, + TestType = data.Last().Summary.TestType, + ProductNo = data.Last().Summary.ProdNo_C, + TestCode = data.Last().Summary.Testcode, + ParentNo = data.Last().Summary.ProdNo_P, + FileCode = data.Last().Summary.ProdCode, + FileVersion = data.Last().Summary.Version, + StepVersion = data.Last().Summary.StepVersion, + Duration = data.Last().Summary.Duration, + TestResult = data.Last().Summary.Result, + TestlistReqID = data.Last().Summary.TestListCntID, + }; + } +} \ 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 new file mode 100644 index 0000000..36f02d2 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/Enum/EnumTabs.cs @@ -0,0 +1,11 @@ +namespace Web.Tra.Model.Enum +{ + public enum EnumTabs + { + None = 0, + OverviewC1 = 10, + OverviewC1Detail = 20, + TestHistoryC1 = 30, + End = 10000 + } +} diff --git a/Projects/WebClient/Web.Tra/Model/IDataModel.cs b/Projects/WebClient/Web.Tra/Model/IDataModel.cs new file mode 100644 index 0000000..941c3dd --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/IDataModel.cs @@ -0,0 +1,6 @@ +namespace Web.Tra.Model +{ + public interface IDataModel + { + } +} diff --git a/Projects/WebClient/Web.Tra/Model/Overview.cs b/Projects/WebClient/Web.Tra/Model/Overview.cs new file mode 100644 index 0000000..ff2ffeb --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/Overview.cs @@ -0,0 +1,27 @@ +namespace Web.Tra.Model +{ + public class Overview : 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 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 FileCode { get; set; } + public string FileVersion { get; set; } + public int? StepVersion { get; set; } + public string FirstTestTime { get; set; } + public string FinalTestTime { get; set; } + public int Total { get; set; } + public int OK { get; set; } + public int NG { get; set; } + public int RN { get; set; } + public string TestListCntID { get; set; } + } +} diff --git a/Projects/WebClient/Web.Tra/Model/SearchData.cs b/Projects/WebClient/Web.Tra/Model/SearchData.cs new file mode 100644 index 0000000..8399601 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/SearchData.cs @@ -0,0 +1,26 @@ +using SystemX.Core.DB; + +namespace Web.Tra.Model +{ + public class RequestSearch() + { + public DateOnly SearchStart { get; set; } = DateOnly.FromDateTime(DateTime.Now.AddDays(-7)); + public DateOnly SearchEnd { get; set; } = DateOnly.FromDateTime(DateTime.Now); + } + + public class SearchData + { + //CPXV2 + public TestInfo TestInfo { get; set; } + + //Log + public HIST_LogSummary Summary { get; set; } + public HIST_TestResult TestResult { get; set; } + } + + public class TestInfo + { + public PROD_Group PROD_Group { get; set; } + public PROD_Variant PROD_Variant { get; set; } + } +} diff --git a/Projects/WebClient/Web.Tra/Model/TestHistory.cs b/Projects/WebClient/Web.Tra/Model/TestHistory.cs new file mode 100644 index 0000000..c206e82 --- /dev/null +++ b/Projects/WebClient/Web.Tra/Model/TestHistory.cs @@ -0,0 +1,22 @@ +namespace Web.Tra.Model +{ + public class TestHistory : IDataModel + { + public long No { get; set; } + public DateTime TestDateTime { get; set; } + public string StationName { get; set; } + public string Host { get; set; } + public string Section { get; set; } + public string ProductID { get; set; } + public string TestType { 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 Duration { get; set; } + public string TestResult { get; set; } + public string TestlistReqID { get; set; } + } +} diff --git a/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs b/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs index d66f630..6c2a972 100644 --- a/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs +++ b/Projects/WebClient/Web.Tra/Services/CPXV2LogService.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using System.Data; using SystemX.Core.DB; using SystemX.Core.Services; +using Web.Tra.Model; using WebClient.Library.Config; namespace Web.Tra.Services @@ -17,8 +18,33 @@ namespace Web.Tra.Services _scopeFactory = scopeFactory; _configService = configService; } - public async Task Test() + + //Get Overview + public async Task> GetOverview(RequestSearch request) { + List overview = new List(); + + int startYear = request.SearchStart.Year; + int endYear = request.SearchEnd.Year; + + //search log + List SearchLogList = new List(); + for (int i = startYear; i <= endYear; i++) + { + using (var scope = _scopeFactory.CreateScope()) + { + var provider = scope.ServiceProvider.GetRequiredService(); + using (var context = GetDBContext(provider, i)) + { + if (context is not null) + { + SearchLogList.AddRange(await context.HIST_LogSummaries.Where(x => request.SearchStart <= DateOnly.FromDateTime(x.TestDT) && DateOnly.FromDateTime(x.TestDT) <= request.SearchEnd).ToListAsync()); + } + } + } + } + + //search testlist using (var scope = _scopeFactory.CreateScope()) { var provider = scope.ServiceProvider.GetRequiredService(); @@ -26,88 +52,49 @@ namespace Web.Tra.Services { if (context is not null) { + var varProdVariant = context.PROD_Variants.ToList(); + var varProudGroup = context.PROD_Groups.ToList(); + var TesetInfoList = varProdVariant.Select(x => new TestInfo + { + PROD_Variant = x, + PROD_Group = varProudGroup.Find(y => y.No == x.GroupNo) + }).ToList(); + + var search = SearchLogList.Select(x => new SearchData + { + Summary = x, + TestInfo = TesetInfoList.Find(y => y.PROD_Variant.No == x.TestListVariantNo) + }); + + var ListSearchData = search + .Where(x => x.Summary.TestListVariantNo > 0) + .OrderBy(x => x.Summary.TestDT).ToList(); + + var group = ListSearchData + .GroupBy(x => (x.Summary.HostID, x.Summary.Section)) + .Select(x => x.ToOverview()) + .OrderBy(x => x.Host); + + overview.AddRange(group); } } } - using (var scope = _scopeFactory.CreateScope()) - { - var provider = scope.ServiceProvider.GetRequiredService(); - using (var context = GetDBContext(provider, 2023)) - { - if (context is not null) - { - } - } - } - - using (var scope = _scopeFactory.CreateScope()) - { - var provider = scope.ServiceProvider.GetRequiredService(); - using (var context = GetDBContext(provider, 2024)) - { - if (context is not null) - { - } - } - } + return overview.OrderBy(x=>x.TestDate).ToList(); } - + + //Get DBContext private T? GetDBContext(DbContextProvider provider, int dbID) where T : DbContext { - var findDB = provider.DBDictionary.Keys.First(x => x.Contains(dbID.ToString())); - if(string.IsNullOrEmpty(findDB) == false) + var contextName = typeof(T).Name; + + var findDB = provider.DBDictionary.Values.First(x => x.DBID == dbID); + if(findDB is not null) { - if (provider.DBDictionary.TryGetValue(findDB, out var dbContext)) - { - return provider?.GetDBContext($"{dbContext.DBName}"); - } + return provider?.GetDBContext($"{findDB.DBName}"); } return null; - } - - //public async Task Request_SelectUniqueKey(Request_SelectUniqueKey request, string guid = "") - //{ - // Response_SelectUniqueKy response = new Response_SelectUniqueKy(); - - // if (request != null) - // { - // response.Identity = request.Identity; - // using (var scope = _scopeFactory.CreateScope()) - // { - // var provider = scope.ServiceProvider.GetRequiredService(); - // using (var context = GetUniqueKeyDBContext(provider, 1)) - // { - // if (context is not null) - // { - // try - // { - // using (var transaction = await context.CreateTransactionAsync(IsolationLevel.ReadUncommitted)) - // { - // var data = await context.tUniqueKeyStorages.AsNoTracking().FirstOrDefaultAsync(x => x.cIdentity == request.Identity); - // await context.CloseTransactionAsync(transaction); - // if (data != null) - // { - // response.Data1 = data.cData1; - // response.Data2 = data.cData2; - // response.Data3 = data.cData3; - // response.Data4 = data.cData4; - // response.Data5 = data.cData5; - // } - // } - // } - // catch (Exception e) - // { - // LogXnet.WriteLine($"Select Unique Key Transaction Error::{guid}", LogXLabel.Error); - // LogXnet.WriteLine(e); - // } - // } - // } - // } - // } - - // return response; - //} + } } }