From a57734308f833249870ff98c0debf97137bd1540 Mon Sep 17 00:00:00 2001 From: SHM Date: Tue, 16 Sep 2025 09:11:54 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=84=B1=ED=98=84=EB=AA=A8]=20DataModel?= =?UTF-8?q?=EB=B6=84=EB=A6=AC,=20TestResult=20=ED=8E=98=EC=9D=B4=EC=A7=80/?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=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 3502 -> 3503 bytes .../sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac | Bin 5806 -> 5807 bytes .../dacpac/SystemX.DB.CPXV2Log.dacpac | Bin 5138 -> 5137 bytes .../dacpac/SystemX.DB.UniqueKeyDB.dacpac | Bin 2612 -> 2613 bytes .../dacpac/SystemX.DB.VPKI_DataDB.dacpac | Bin 3092 -> 3092 bytes Projects/DLL/SystemX.Core.dll | Bin 53760 -> 54784 bytes .../SystemX.Core/SystemX.Core/Utils/Gzip.cs | 53 ++++++ .../Web.Tra/Components/Module/TraGrid.razor | 62 +----- .../Web.Tra/Components/Pages/TRA.razor | 178 +++++++++++++----- .../Web.Tra/Extended/ObjectExtended.cs | 23 ++- .../WebClient/Web.Tra/Model/Enum/EnumTabs.cs | 1 + .../WebClient/Web.Tra/Model/IDataModel.cs | 17 +- .../WebClient/Web.Tra/Model/IOverviewModel.cs | 20 ++ .../Web.Tra/Model/ITestResultModel.cs | 7 + Projects/WebClient/Web.Tra/Model/OrderdTab.cs | 2 + Projects/WebClient/Web.Tra/Model/Overview.cs | 2 +- .../WebClient/Web.Tra/Model/TestHistory.cs | 2 +- .../WebClient/Web.Tra/Model/TestResult.cs | 45 +++++ .../Web.Tra/Services/CPXV2LogService.cs | 39 +++- Projects/WebClient/Web.Tra/wwwroot/app.css | 1 + 20 files changed, 329 insertions(+), 123 deletions(-) create mode 100644 Projects/SystemX.Core/SystemX.Core/Utils/Gzip.cs create mode 100644 Projects/WebClient/Web.Tra/Model/IOverviewModel.cs create mode 100644 Projects/WebClient/Web.Tra/Model/ITestResultModel.cs create mode 100644 Projects/WebClient/Web.Tra/Model/TestResult.cs diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac index da184b715aa4513dfba2ca77437ad0487e01e6ec..891c031d20849407cf06fc74772480a2db5ca3e4 100644 GIT binary patch delta 695 zcmZ1{yIPZJco5U6NoX{jN?5gkd9uZwW>{XvL2^> z{Rd_a0mj9gib0{i>Oq&@^%@$7F{I}N`~J#~{WAF%w<+fZzp0U-aX;@>zq7Qv{%yUy z{p8!zw{6^KxN^sfAnBbKwnezR9^HNX%Dd9HF5hy${fphC_Qmm&`@KlE3oEbGUHY|y z#o?m*HKC{5=6Ef1SsSYrwP2p~(IuJOT22T1JpH8V|IN*CW-@S*aLAdxZraowPTL9Y z+onD`vE-T0+{0=gzb?}J9AmMD#i!A5ez%|Sy_JuiYAi{+IxAz+)gvF&9%SVmdAlWL ziR^6OocbSYy#E<4WRdCTYt79B1SbiDtc;jwB<^NEE8E~2reqQVPrINz9U;C!>g;Q5NGRqXAXe*av? z^KDnPqSVuO=dPc)D_m+Y`}wnDQoNoQlfL{vcIvm=_eo1-UvE`emR5gzI`8uNH!}74 z)_8lrxauf-jU$v%Mb6Od-_hSur%YNG);{2qDgJ8DEVWp?_2&P$-!oI+luLepy;JR{ z@M89>+dn7IV7exLGFW=cqNLtzxkYn-mfyQ|zIgwK?%e{pX7{S5K9_6SaN|ffgIKps z*Wa4ZH3<(FN~~+X6D_(T;&-{kah-109J$jss;7LKWxZ2=gUd1R^j02AF#VCo3MpBc@aoHh5}ExYPp{d)wD=f^g@G6WIwm*q Ks<9RDfJ6YI1vj1m delta 694 zcmZ24y-u1pz?+#xgn@y9gP}ZFaU*XJD>IPZJco5U6NoX{jN?5gkdBU3{OqhTS&!4c ze#2Q~mjfD#E~{3(bn&{iH`ynNwcwc9)g}9{x!SMXA269AS1T>F@@e(^ozH*7+}>aJ zr$;{i^{F3jttopveNvn+FW`O1n$6dFbJe9;Gy7luF8|0iIsG8t8bgx>6FVzIUfHla zOj2IEaZ9!v%k(`VW)Dp#=uchZw4IezEy0`hu;}mlzNu=Ad@g(qeJgiMx$Qalq=mmk z`NvGIqbv5bl|Fjy8~p0lhG;_xrdqqly@%FJ{P}t&w`;d(n1$}fXT1kg)*a8Cx?sn< z*}OURKYF778L!JsDzh*yT_(Dxb>Z`__^ewi{8|%!hZQQG71>+JXP~ITc6r;8^Ht@g zg%0&PCW67!uhesYdpJ+zik9cgNIBga?N1-hXa&AtpYkJ5Fe~}kr;9u~A+H>cZ%;^Z z+~QpDuBBLi%U**|b2WZ2EVgW!dt%)N_ou#wogZaI&NLMqC`q+-n!h-s^OcO({A05( z-OPS(v3|+ky>ZIb?N2@P<5saRHdk?UeE+|B;?}8ItiDpWv>Hp#)-Sso-cz$^x~%<0 zwVTe{zntFSvf_hc*~V=j_3u?{9v0d4ZQtF(o~!?PR`lN!S@ysBt^2fn_jB)jFYeu} ztg3$V+T&yireop+YzuncWI!t_MCiY;z)Q z;&k25s%K(F4o;oF^R&!U?fi!?K5DZ~tkbD|A9u>O{LhuZyIc77S!{FjJ@Qqb@mRjn zU)1C@c`EmFa4M?jF#*%tcr3y6Cmt)LRAtJmFAqv%_K!ThW&@MrV;~j=VgzWP+{~-S Jmd^tc0RTiPIeh>C diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac index 3d506107a7b1f11a18842517f67af2375f5050f5..838829296dfdb1edc25620f34e5a3bbfbff9aa64 100644 GIT binary patch delta 705 zcmZ3dyIz+!z?+#xgn@y9gCRXxYa_1#KQoZt?7;t>5yY5mCHR&TNJqOqIa#hg*+9s+ z{&e4L1ChJouk01J&3z!wBEz`Y#$nZ}mo8qn_OhSp5j`MzJ7n^|DDl5b{yF(FZ3#{d z6V<+7ectx?^SIBikDveXZRyIn`7xP_w~x5WmB`)`+a&Tf`BB-jS+4JLfBlQylX!Hm zQ2(M*ods7rf2W)&WNgrzS8;gD^$sUbUG2xBn;3u9@4OasbK8Ox)*FSY5xV<~lRX*Q zIG8(PZ(l8Zq^r&MW@7$So1#>f>(4j%*6hvj>SX_|&z78UVts1%jEvH6MN>|FC_2pJ zt({hxTwrScpvTEyfvGlIU z-a`HY*8rY%x9f%O-@bhFsNmm?TU-v!33}D8suF0ix@o8VXHLh>9aD4K6qc&2@Dkam z!4~{8g)La^r~tdMNA6p>hpc?!8XqRux0m?YJM3!MAbwMvZ^atj^+^RDg%XbhFHh&? zsP5mS?ejjM$~@OAfBp99o37n^x5w??yqC?kHrLJ1C3rMFYyNLue{R=m-{lpTKAqD@ z%iea^S+~po&z9-z_tf|&ggAE&bz=5ykzLgFTyo@`B*Uo?B&i!9DezeP`Hx$V5$l(UsD zab9~RTcVg#SF>tlo81?4!INejou4MKuq;+MZ`Sf7?EH=D37=+J?|Z#cFUmcBgL`s; zYTkdLgkQc(_A{cStjSYEo`Vxqou~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}*5s)o&%x=bUep9kZxgiy)1O4GkkXf_n7%wHwb?)N^qLJ!l#hW} S7>E&|eR8vy8e6_7NCW_XqcL;< diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac index 43c8247e69b729fb7b5fe9ce2123eaaa50098019..0cd8447399ec6b6bbdf04b3239c43d5bbe3814bf 100644 GIT binary patch delta 669 zcmbQFF;Rmzz?+#xgn@y9gCQkZYa_2H4>OS7tjbf!1Y%5{$@hU1NJl>~<(RKNc@n>4 zy`3!M>Xv|&tF}pNX1?c}afIu^n%q@)|7P2MQU9ucMa5xumu=`A8{_h*#6^iGz95 z{FMPcr@SN7_r;nnUB~-dpDj7zMEai4maRthcEt-bcB*wP5xuy_aK>5Q9czWAm^g2q z_?CZu;n{jcUf(lv>B}%tyF6swdVyY&dnhh^;yIJntU?-x>RI99~pUiCtLLeyKe(xT^ZC z?DMT#wofHJ72_i_B5?Lo&hzr3y8{d~r%|B@F3_GiTeUqwMMulf~w7tvTIXk5viWV(8b5ySDfzgTUH=-*oqLb{KBu@p(>4h(R z{*1#tW9OGx_Js*^fByTF+_6Pt-p20=Pp4Vey;!*}$~}HUZ?b{#^?FW&ziOB6qok$D uKLnqHlh7j}6EH0)Yzd}Ag{_d1)C^&Lu;?jaX~tKRp9!n6T@nH&M+N{61S`A% delta 670 zcmbQJF-e0rz?+#xgn@y9gP|-~aU-uN4>OS7tjbf!1Y%5{$@hU1NJroQ%&DO4 z{XXRcSB|NxvUX3L^eyjzN*F_WZt&Z8@vj%!udH9F#&|2_&B{klW>$WlcfaT7*T?B4 z|L>UHDnG=U8oMT1?TYE8scRP9RlHUmDcx8%e^0%5Zo$tJFB{8dF_kD?>kpb2&d~A6 zBTDDYv}toV!@M`A=nDAvD#UDM71cY~SI{N>t7~b!5+g?xhr^Q9>t>1N7FHf&-}Lm2 z&yFQ7F^9B1zFnoc(bu9za0XMdUGm%`TZDgpo>}O*ig%jD%8ieD4!l&tHZ#e%A|GS-fTXZ;;;71Qj5b|PyS!`_l(iE-F?5y)&-WS zJoWtY_K(D}hHq0ZN3iRz_DEjUzG9m3_U3}#H42-Z*;x&~e)4^>X0Cy^vw4H$sla#3 zv+r*#7GcxyjlJ!3;&#fq*>ztgYF;w_D!24bkvl*0)zH^ZxQz~T=p4Bk&va&g=M!_3 x#5DQ4;B#;qdMIQ9rX_?e!E}hQ6;hg-F02n0Jt-{B_mPz?+#xgn@y9gCQ+hYa{Ph7G@wlnU(b;Cy;7rGlhH&dh;p{ zZ@J&$!8K;=!zr`~hJ1`;sEiBR zj$ab0=PW*D!RPIz^~zN-IqpQl(~A;k_Y{a7Q&iv55IUt{WsOm@=H$eVPWF}U59A(N z_C445;MsDRqg7sEuJeuVH{9%3mg%lfP7@K7>YuSM$Kgixl-R_o_D#DpgR83l?wzvr zTlsU-Pv3py-#py8uaM0-NQC#_eT&uW%;rAIJZ-&r#@hOuW&B$;>^@$OldG6*cVK~1 zXpCZr&I++s%CmFtd<_v_yIB9ma?Tw>+v_YFP3L-e?lw;l(rz%`wo>iyR=r=Ie_LmDZb@PE5pL_eeuc_3Fy*VJ|%q%52+kNS|VuqBuC8iU@ z&K4b1)t@@`v($;{UO@|QH#I#;aA#Gn7ya!wMU9c;7KcO1t95OHxt?`O?7Kw&__QX4 z#2vQ!_;s1)L9sXcICvWE_CM-XS~GF>bz|`^vFt@2K|*Jx8&Agc-_~^WylXCftN!e7uSz>}uI@$pRKuj#FM2HHmQf$E1{8wy#DeY(h_6w;(nlx{G`u{!^-<)`O< z8IJeMWLoSG6!0agZ_<7fID6TQV=eP|HyS7G+9bE|d*GIxuVlRD9rJwoX6v^(;g@d3 z9zStQxbjl>^j8O8@OI{||Nj4A#MY@Z#$)^9tjHLZTpbX)t2YUdR6?q1T* z-Cdw~(B<|I@%MYDJQUgWZQa$vo~!?50_68<`ur<@<34TQ{kJ>bpEr$?&8(Z0Ya7?5 zm{23AW9E34J1X**(yNW1uC1J`C$=)%`m{j)AAxmD`4bqzS&N1miN8g zxjOa6+J(FQK3@80qiHMb{66lKZTXigfp@p??NiY1Ip7krUnrqQZPI;|G&DJx<2E=A kIdYnS=?YFOq_nh~Qy(n)mQ$KBbTTKG8k->}F!?b60H2B}eE)P_CJnzdf9r6+fF zTWy@ko!fnNr$$As#~Zizb36ae*jF#EpZQPcXXEv0j90Wa_D9WM&amRo39VIkx}FDV zY`mVQr?nu?>*$h9ZmwC)yp!il`(u5zzKtcJ!=T}YS*)&h+~q$m{5iTuXL_EUxvS0h z(QDt}S35Vv8opqTty9eMtz5h5`sN9vK?poev&bD|b-}Z}>F0RVHw)yYF&3Ql1 zZ%OLB`{<2Gzjg)p;d4uOgsi!?mg{7BuUODc&8o*T2`&LV$8tO8pMCc#ssCSugwi^F zO-IFgy#NU-xo;Dk7reI)WT{m@Ah^&@Nh86Pr|r{09<9Nrj5^5*f zY;;uR3fuKe@z%?xAB+e0xhv^M>us|9lzw_@ delta 636 zcmbOtF-3wmz?+#xgn@y9gP|%|aU<_VHfA6_`61h94j>)9DC|k_>Z zebs|5y^~E&Tf=bf#7RLf=BeGK?>~Kie@Qfz-^-@!+Qx>k^mmgDk4rMlvi;bWwO`Q3 zQ&;=3@lA%mG1=>Kq6321w#9Hpb-%w-A0gDBc!(kCdRgh566c$ZcAt7Dxv%Sa@JnV} z=X!D9$_Iz*mL~A<{9KyDE4o%Mt}jS3ZrzH7m9Dz^TAFh2Fs(aqD!-2$UGzx=i}p??04Om+S}XTKS&IHa{sK+D;K zIV<;1_xG(+3b|^3UwCi1>{UIRiHknh=l^@Z37@|3-ss)+V&Cchb7V`d`}8OBSj0~` z5p&_hr0e@?JM#9aB)SwxOic=x0`LxZnh)$*cz%`yM51^vk<`F-dMg)0xQ? zqG~Ly-Ai-ui_7iD_;KH_Nwda7u??_i^O!^j%V_@@A6L?B>_!#;<^n^KnmO@ UU^<-J3XzazavOjJ&v1JH0OEQns{jB1 diff --git a/Projects/DLL/SystemX.Core.dll b/Projects/DLL/SystemX.Core.dll index 582c3313d5e2f73a3a1e6a095e68c96526022d1c..f2cf4880b9d5be6accd03175fe389462b06765b4 100644 GIT binary patch literal 54784 zcmb?^34GM$(f|B@dvC5yvN;JPA%~l65>7QJA|VM7<&p%&lPt*s(Iktz34&oU2vYH? zDBfB@)YfY2-4=^2C|XgpTCIvz3Q9d%d)vdeHvGRc&$CAe_I>;L{Q0=^%*->-JoC)+ zJo8+;aqf9Hl7)z@_#8b-^dqGFZ@R$$3`0}^hd^=S4-PgbVW*5hC|E4 zfu53%KyPoTuViVkB;4Oy($!niG{3c^C)63NOG|T?Yt;*yiRKs<$~bc78?o9B(b$p{ zV?5Do;Mf&6_j9Brj2jF*f}6^2X0ZM8Z#we9=YJMzzlufqzeK7@X5rs+zayG2m_fI* zBaZ!7Vo)l0um6^)?by8kM3)dblk%OQXD88heZkdzpo{hcAWzz=?FJ?PN{HI)!jW(X zC}kVk#tnU4vg2Snx~nc6><&SYZ6(+&K6ooGBFJ>28N)e5e@FZIAKPY*MaF<0M0>2cgEqjtK?gU_J7hwq{yuZ1u$uOSjq5t)U9!r}!!Xvu#B7OY|sQZlgJp6$qV)J!K=mNP%k z2b0`cP7(L{fm4>#SA*0C`~4u4idaq^=ZphLqfytdfCDOWUH4VwN%8wC^6hK6A-?ed z_f-^xr=a%xDheI<`CtvKgi32@BGAasVMc{3grRJw3S}8o+wDX4Nt`_yAOzdp6}8q% zuixf7!t%BD%JAt>8G4P2g-$|#rSdn_^Dxhh`~o>{yYFOVMc065&xx+)WGxd}!X}@W4XWnx|5w!EWZh)?rb3t7?)AY)zYiQc`7na*-XTkhW6F0SsOS)z z&b9kfCEo|#S~P?XwqsKC(7NkUaYb!*C8i&yt(txngUpplSXo?=7eNEv+14y;xPb?v z8bwyo8A6s_4>D_bLvl6`vXb{uy)T#RC4Ux$zX^eoAEm^3l;_Kk%!BFKHp;a5@)SkB zbRgMwKV@RJ@%-f3|Ly@whk!9e>!1i$=T)w|0mzX3JxE6|sN5BUoa37gbP&~A*D(n1 z;o%0`-GeA@t#|g3e69Lw-Q5Ch8N`FPkrx@Dy0k$PR zPa-p5xamXZ`+ZG7sownW3N=fiS5f7EQPWH*bo+l-XciapFZ(a5nJpzI{}&}%q=bn< z==UWxXq31v{B!hlvcp80sQNrIGmN2JOnftR1~m9`;Aft=9Op~XO1I4W(3!wWtQc?Z zEE*|ZiOGjSgMy5qM?{6_;Mjw4of-K6+*s_o3H^xJwS|+lOdyb;JYo+MD)!7H8Kctw z_Rt)*1YuzSbJ2=$VTlR?1{PDr5CjaYs)`{97^7nhLBPODsU!pe152x72m(e)j3EdZ zaD|c(1dOpUh9F>Ity2<$NZXg7?flQo6Kj#MjY!xsBy0~7w!)N^F3RTlALu`QkD-9O54qA1xK0; zwp*Ny9m#bVnWOT2=R(R&2a8e=h*4U`xeCsXc;L0C`pJoTp<=FsGV`ej@yTGl;nH1a)A~1?FrOQPrUdmxzyjEiVK@t8ledta64alo z>UTvtMPH^h6a?Zvn1)@S6O_#5_lFrY+!Cx0Fv3=C_}GTAU( z9@}GJSHONd8N)&L7{~B2MHIhq-7*-&n+!?eQ-h{KKYX7_d2X`EP9nv@i>=?c9J27= zm{bb?n#a}(rkxTI6`qTJ#;(CnuK4({P+lR8iS;SQ0%5&He|51Vc>5FI@E~$vPpBe? zAdnq}Irbn@l*gW_){^UYSwa`1Xzq~dwokbMS=eBQE&(US-{S~%14%{0r=x++&~1RB z9+5V%mB~rwJ43z5Apgn5`ANGMiy5DuR#iT>bCC&DvJI0)Z&n(NigMDX>(h-G@eF%Z3{Km9O*M@kNl4cRl74 zcHhoWAE^6${eTZ}Zkj(W%c>?>rd3=%&y1`>Zj_xDi->S4_9M!vf`D;ijG+;AUg9O? zq*#t1U|;~LvVwqtk)s%bfH5V;5CjZ_79}AF7^lVe-pY2c`PDcg$BXKXmW(s14+$I^PlT< z-I;Ag;0s*|PG|!_e4oji)zC(862mie6-zNMvOgWO6>=vpKQUf~llnPtzXXY9eU6vT?_I5&Jg=kYG?*wxLVX7aFg$wK8PP+6X= zOR6tMb6@-k^A&w@JrqV?K!>3(UgX3Q{TU}Y(Y>6k17;z4#m56IrB32ip*!OE=+K>UJTr7x9Jk3nS-OMUvJ85P zll7!lW*I{{7`CGv{)t*&GH*=iZqb#@bBFE$FY+w_9>Dh^t+jalslc}Z_iYEz8vw3z z{PAobon(8au0w7YLie#+UUaxDk1c7pC43c!{c*9(I^PbU%9WU=XT#01&lUth_CfSj zl!@33g%Ad!5)uTA#W98;V4NFc2m;1=F@_*uoF8Kd0>%X~hDH)G?!s7(AP~JM#t;OI zB{7B|V6?{=f`Ac-F$4i)X^bHV7#%T&MiTXR#&QIKXfVbQ1PqJ@i4_3MyvK1_AT0*-al~)wmgCx2fiV-fb!LwR@&w7_*kjB@45_SPT(@|0X%~(A>Z+igH3E^2)=~VoODUDthPY?L zIxfJe*JFojm4td zW^P4lluJ6JTsQg8AZ^gs*mhjQ?Y>{Yd@^%IiD?&&*jRI$F-G(_QI+#4pvIb;;?Kfp zU|1ihBIq##}d)UqKm$biq2DFL23^vxMmngU8K6 z!tVCH36QGgoI_T***E=jaH*6m=9HcYJp(()k+(R-?pzEF$H**>sX5oj1BddmZS`x8 z9z7bn?!-uYnH5xz$sc5k)V}Ui*j%H=)Jia6xIN3zuN>yUrC^2LVr}L?nDJjSj?*Si zFLwRXp~kcce#N-h*~LQBp;!K4H_?NV=0G3AAv@;gu=za@QGCqyVSFEEw4Sq9Ls2c; zXbHWI`qh**{g;^oZ1S*&8Hl_Cku-lEZcg6?mW`UZ71){{VB5h)ICa+^I+&4V8OlW% z8>LTSx`nz1-nG^^Oy7%ag*slxo_4C$+1^j(^Z7c2&(#Igu~xO6_m?f;VXp8z{TiQI zlrh7rOvUq2qQYSwMm+FvJ#LzGTFl3)9#iUB+lwaV`LHUu^CX~|{)rgd?D&ubuHD=W z#mEm~k>L)NT&y&}eTd)c&XLc~SV8zshV2)V;vU za}I&PNgILsO;h!*8as!z5Z9|RLLY*a=88ROrJG*G_witW*Qem}KFeP0)$dUD@U@AP zwq4!o;}XoSPT7flIj$3`)w!UJ>aL_I9A~*-;0fOQ9k*Ysp^wj!4CM`r?2e>Yh$C$Chd3)dJ12 z9j7_uccGK8M#3w{&OS7*h;5uev)8D$@;Le7p4fP_5&|y2VI}n^=C7^(TVR_5AvXU9 z%5uS<299Nerz^G_ucIAE-cZTUk%W!_a7opVEEoC>SgB6*Bibvy$Xp*!b?HSbS{3g_ zTlhEs*Jf9%agP^$s#zWDM+`;-rOtv_3u2>WxRJV(tE{<1~naTpZkUNq$~Jj&t6jC_pViSnp4 zBcCwJk=&FWS5$(pLb=P5&L;gJ6^_#8SW%AOUf@SKr z+#2jgt)`bRG^}K*N95mukF8nGSd1TM=<{LJ@43ucRVKDH9F0U3ltI#`h

m0j6aT=1I*EH0oL&8i6Nw4k}Kig<7S&{#hNczHP#8lmf^*9 z{@=bXUjk9|O15W!q3`dItb{v+CCbB%Yz{Wm?(n&cjbmN^0ElkjV&(uRMfnAhe}c#7 z9{&Eu{~#ghFbJ@T(uagjl(u_Sm0nSy9?KEnz9k5AVG2u%MQ*M^*M)(rwO|mLH!1dr=+U+v{5JA(koo1#pdKD}J6?ecZ?0^-h zfx=gC5hblWHikXs%5>GN(qm3nz-2;s=yiuI0NL&=x6cZsb|$vrZuvHZndy#xgI$uH zVyZ7jxU*9Djo(in?1KBv0nW|Fse#j>oH8`Q%+ZCR&Mr1{Z*ni`xq}xhcXnDrLxH7|zqUrbnBEmos;^C(GkYWh5gj!l*D4VTV2mMwVe;mYR_)VAL$Hh!X^g2$^)7K)+GVrANdu3I zL6Ho+gZXLPe$gZfT-q((;p~_{)IQNcm#w3G)uy@#4hr_c8=y3?Hm$;=mKU~HS|VvY z>v9Co^W}1y5PK$RwToYXoASL2S@Gh$W0yYo4-QA4oGAX=g385zw)(Z)E%lEvRNss# zNBxL+*uvSVejE5BRuIHF4!xYH;C9 z4JkevG=(=y5agn2CE@s&{OZdAg>#W`DcH%DG0>(Wth9D2>9U6;klm#`)A|v)~JRUPK9#4|-SOVwqUW_L+UP|SqJX#7S zc1*&|MSn0YFY1x8z@lYI*+s}^+E)$`sQ}20R02j%0ElnBc#n5>{Z6#h9N-Ld0AKEO zzL(h0iN>PAFq^P|Qa3&Y!1*8ZPsQg9@UA+B&qMo4@V=GA2TR5} z2e}{OgH7ad*OynYZk#ORaRSV6+w*1Up@7Ct#>m7j8*kYF=Ic zUDXV*LX80YWnffr%gD)sbAJ)Fw}nA4#goU_$FOA15ZOt7P~ zSOeao8K2F#S6F;dGyS&u1~{z#pKu)|^@6Vjf)8+~L@_YnKYYmmsk|Xa&txUJ(K$%! zv3=uAVGS_n&M2m^6yQ`IkK+qzbRJlc7Appr@XZH^E@1Wm%bNpS-E~~CIl%1DSpcZQ ztIB$ntXC?5Caw|73MYzCreIlFu9g*Ln2a$|9a^aLt>t=#a#TfZPpFka8$h-r%i&uD z1UkYmU12W|U9>6MUurVAQ#3&UUR0fY}&frvs6Lr)$7YqvTkTscyeE5afnI!4`8_$!- zia&CAQ?Sy>=2V&|qZqr=^H|lv91brDzQcDuv#}r5apX=6nJxJEF%y&H$XRH_UokG5 zlK5cZ@&~s<;9ZE%DZulR_NiOJy9=Mhni;>2kbUZN&{r>U1ZxfUS$XY%6!lAEU%Nf(Vrq2wq%`Ej~wo=A0sERT3vt!hAsr))#@UowQ90+omj2* zaKe-Q87{@ERhe`>pVZ9(&c$lQ$xsf~VAb`Ki2RN5!J*P?GMQV&KTY2Jwk>8NW#!8cEkN$)!$P@qYVT=95 zza_}4v({bLTWL?8E5bT=@_3~$2HcoUrXnSpKsPZ!k$=P^xi#+&ekxL=y!Jbn|L zYUMrl8yw~U8=^-r0s>QhjttTkF)x(DKILG zZ*kxx1X+0}Or8(8HK&{K`MUYA7iFi&d;k_Zx3!^rUIZx%raAC4pz*=x3!?VWG5{Xi z%aPWq%`}(C*xttpkL?$@6pw8j4B(A`Ilx&M*qjXIU=pf=7G# zMDj%&Zv8KYkoHJ|@9y})+kfH@e%C>17kac#D{TikE{e1y%YdZf;Y_Q z5k_qF*ciw(U{O3GZ~+{d?a_$PTp~9Y?+Hld$P(%UhF;(dbD$qEzUoC*feKxw@>e5? z-Gkv=Rjo>d)_@&;QzAG^B+6b6Dl`B<#hLkX;f3u;_%H`}KW`kfEO_@pHec)E&d?G* zIxLF~(btU@^;GegHTI1tbuk*nnH3f%?9Q^OEj&8U2c4mH$midE_^tq=ub$Y=W~Mbd z$SDHK+Vw!Pta#n2VlzHC3(muBA(%X{I33EF8XG@S82UDV9o-0k4&fxqy@k6rK-Fi( z1?q~ATkNoYZHrGx%F>5gZj+p6Wi7voDNH}{&$uLM)lpyPACeUkS9zOI9?jt-zJAid z0<|i$<9Jo(H1;^@l@WzU7w}RJR;qPYnw>l%#c5b`zX2&aSjto9_%aUP)hv>@51NUg znSwEYR#Kb*N~hs70SNC63xLP|@kaSZ@NUBgllwUPb$rj-LL8Schu*{Fi=7{R;Yd_052(A%p5q#g=H>%Bs7=ixy014 zxx^Xf!25uS`H(!9K0wa!xx^)s=MqaK%Kl&G61Vef<`Nt7bz?=(r6UkA2NHINHuI>s z20&)ewLtU?Vkh$q`ixUv%YOv~Gswo%8Z+qUaG5#4xjch79m+X9HiM)vX3+J}7yXzu zm;;Ch! zhjJQ*TVeOz1bxv@Sc5shi5etcVSW7+9_HxdOksBA|7i;Ur*7fh0lOhKlRpKH25~ZS zCUdv(OqM~UHr^<%I`c5{QexM+;x#=Nq~9=!Z-x`_s|udPBeEU7t(=>fzm1pmLGnfYojX>*AZede{Vr$vGX=Bg13U!Cml7H zZvz8;bvu%zNqh%LtbM$?=AD~&5 z7hqxnCQsgbkTZPpa*5>0%MyvQiOGv?JuW2N_4)7yemi(C7vsJ3G3Ru41J3E&IN>?8 z9f+LMYh`FJLTPh=b8$}RBxxhfMPui5c%zQPS-w0rVhT__7FB!?HcP+y@pl7GPb?}n zTyLVdjv=<>^%z;~4;@2nz8y(~IdDIy>rTPsiv3Ww4tB<6LAXmstlbZw46bkmvTCKp zo8{0;xP#yL{3-zP)Yk!s?-#^9I0)d>l;j^fqRM#j558Ir|8Oo(eNK}CkQ9bK2|(Xr z4dwtR(T5oKMuj!Ngan`@dnT|w4k2Cr`))4P6J~rT10|60Dg*}{$ z<#a8lLpjZ{P^9c}`o0f#^ikGe4sa6Xv2U(rRLy|m!cpqgkb7;(*Y{ddK(gsQ1^ZeB zBtBLo?I~>Gq&>xd?qfDbE;nL*JPB?4x;{QQ1MhZt-+K&&&~#2z&_d&Q0^r_*6TC5M zdI*nSnJL)4y6}Cn)cQksREuv@c#LpxlSvj2ZffMPRlH4cbMz8dCdUk!IGJwW<5HJw zQ;sj=@IApI)i~#%0{(Xv`fLE>Xg}r}_LA{9Hw`#8yZ8~o$T&9%yi@Q=>{Ezlw4Q-` zGM;tn!f(~&y76_B#!s5S0TaKg?FO7W9p9;4NAw+}pJKL@wf2R(dY4C#MK^|sHbQ6F zqE_F~c z+mWW@gLdg5rg^nYO)twh181=#;KGqLdtg`P$zmgfDt`Y#JX{|pvigvD!0=f zfi?MzpPqX~c{V}<=UVc9TVSW`{Jvs4U6aRfmcUMdhXoGiGXEjb@IL}ub6HP$wQIDS zJY!#lhAXpNqtof<#x<38S~DtA>88G-R}0*9f}3-nD|U^x(;O?qRoM*Zjb#lNdKrI3 zw0#V#pi}Uta~KZ_=e=x}>>d3i^z4^Xi%jM`Z$wbn&x8|1jdr@Wl=(-;9>t$~*kooo zv*@L=6@_;E%9pG0yp>d7-iE*W zkd^zJ6YR7>YCI3x>gbOpZx`25tLJU__Ue+p;!3J2J~gwBZY}!IF_Efs{^~l3CX~8H zpF*FMZ7Z?U?J10pD`fmOcxf6vp8M@F_`2EXqxKmT8v6|R@4&+|Xnp20B{S&(%f5=4 z^yKJ$6=%@Qs;BDkS0&K)8Fab-nUWdQ1DSbrS@oM$XVBaJld9)YbLE>=3+b0;SIQam ztFkw%?DUA~8l6i&h9AzL-$CZ*)L71A^KsubmFe`1z-dL-RGv-2a_*h83)!C!`gtVW zU}2dRCXa_lrPa@89koxRon`4I(`cVBz2rQKNG}|&W&huB!m9-r(U~o!A@OZ?<~!bt>9fi+i%+3NwcAQgq4tt(C1=p3RVP)SLj5)D)$OqV463SovuYmA z^fH_PXs5e!SkEMQ!%k=9Gd!WpHTrB?>3*_c9*rw`vnrkbBqRTBu`0EUM_^GM&zfHq zGJazn!^=w;evDCMr?Hs~msK%b>OG1-1d&yB{z*3 zL+i)10d@oSk{hkAquYyl6jgXXbkx!Q9ER;DeCU`#r^lM2-8g993!5$G2~dtF{5HEVy&h;)KSWm6JI4XkomzVqMe}931@TK#8DY> zCmqrrx*nU$2JAeGkmsRy5NaFndx8l<{ZvyEh5DhUCJFVbrY1`bKeTsyccR?Ml6OnV z{gn;)rr*g@L&Vry&eW+wttn+{5=|HC`O$wYY`}L9nuVH~!_-N1hEQ+TFm)Q8D^yVO zrs4OuZ1vbqr3b<#GWUMLwo zrh%5zw^iO)MSV}GKbJDqMUO+PhkiGD^q8x$UhNd>&!8Hphn~fX zKsVB_gbHBvG@u0^NPVwoGj$golDt!-zHiYdLbXYK572Lg`li&klYTE$sZe|APn4+d zW&CXtuJ0VtvY-Ag)CAG;9(^g)YN38dU*QaMPWDcWw^NG#o;HC(qmBa39Cf-oldeu# z1Nd-(B|Ve6iyY~8`+JT$^X$R994YB%4_;r$@PLhBnQ(jpw+fs+hWYQzUckAjT;msMmUN7@H89oa~>e$!e>UzKeI{FUcnYbITv zdX3efU#8E3ZO=;W&q|BFDPFD1I1~I!1a}FZA-Qj6u(!V}Ej^sV_-7)M?30DUQIciS zYxAmGp>1j1VnFBErGUToaoJA+Pom%A_0ynrB6Gye_*bPDL*{IZLxbk$hk$RZSqpe- z1}I1gJ{+v`@=@3Gwj z&I}vN4BEKY9u??DG(hXKxOT#MDZU#w!Nta6GClLV?7)u^tO-gy+GE}^XmE&b9_ zfwp`>e{n*awDb$h7}&{W6OtcWusf~&0`O;8BXE0fTm_lW%`Jc*TkZ#3V;wD?VOVJ6 zZv>uas{!0%V_)5Gn+Uu>EWd}?hp(FKlOI^vKQYf7g`Q^X5_h8B*Wm$G@9D+wqKyuN zOU<;fhH26Zo2*L12gsdkVGj@Y?Qh~59w_=FWV{CJ8D)GSejb9K17yia)HvUU9gg^X za5Ves>GDc&x+=%oFgJvaB* zSld6$(v0Kj{L=bqDtnUQ78}dlt@XbQ&Rk1nlH~<)%h%U@ik>~5{oF4j?cXb&{6t!@ zK-a}J?vj2qD7lZg-ezld+JX`+MYJXVqVlP*>Jgzfz<9T;7`}oy25!GR=N>89%!MvT%8#%dR?enX@yXpGS0h|HWYLruR&AoMWGBgogvi6 z#^pH%_D2gel|S|eMhdM+%1fnHLa}B1x4f

Q?78cYj7IZ4zpWbFO<0s2enOSHZfB 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 W=STFVWVzwipL4#y$nO6H2mTicwR(U6 literal 53760 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 E0gz+!_W%F@ 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