From d463bfa084fa3fd53ec942c053ec5115e11327a4 Mon Sep 17 00:00:00 2001 From: SHM Date: Wed, 26 Jun 2024 11:34:28 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=84=B1=ED=98=84=EB=AA=A8]=20MiddleWare.Log?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +- .../SystemX.Net.CP.Middleware.Log.sln | 32 + .../SystemX.Net.Middleware.UI/ALIS ICON.ico | Bin 0 -> 34775 bytes .../SystemX.Net.Middleware.UI/App.config | 70 + .../SystemX.Net.Middleware.UI/AppIcon.ico | Bin 0 -> 15086 bytes .../SystemX.Net.Middleware.UI/Commons.cs | 547 +++++++ .../SystemX.Net.Middleware.UI/DeleteProc.cs | 169 ++ .../MainForm.Designer.cs | 849 ++++++++++ .../SystemX.Net.Middleware.UI/MainForm.cs | 604 ++++++++ .../SystemX.Net.Middleware.UI/MainForm.resx | 973 ++++++++++++ .../SystemX.Net.Middleware.UI/Program.cs | 57 + .../Properties/AssemblyInfo.cs | 32 + .../Properties/Resources.Designer.cs | 193 +++ .../Properties/Resources.resx | 160 ++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 5 + .../Properties/licenses.licx | 1 + .../Resources/ALIS.PNG | Bin 0 -> 2689 bytes .../Resources/AppIcon.ico | Bin 0 -> 15086 bytes .../Resources/AppIcon1.ico | Bin 0 -> 15086 bytes .../Resources/Bubble_16x16.png | Bin 0 -> 259 bytes .../Resources/Bubble_32x32.png | Bin 0 -> 339 bytes .../Resources/CI.png | Bin 0 -> 9557 bytes .../Resources/Cancel_16x16.png | Bin 0 -> 289 bytes .../Resources/Cancel_32x32.png | Bin 0 -> 386 bytes .../Resources/Database_16x16.png | Bin 0 -> 265 bytes .../Resources/Database_32x32.png | Bin 0 -> 368 bytes .../Resources/Kefico CI.PNG | Bin 0 -> 3946 bytes .../Resources/Publish_16x16.png | Bin 0 -> 431 bytes .../Resources/Publish_32x32.png | Bin 0 -> 765 bytes .../Sub/CPXV2_CpLogProcess.cs | 1371 +++++++++++++++++ .../Sub/Command-LogScan.cs | 268 ++++ .../Sub/FileProcess.cs | 73 + .../SystemX.Net.Middleware.UI/Sub/Function.cs | 214 +++ .../SystemX.Net.Middleware.UI/Sub/Query.cs | 456 ++++++ .../Sub/Stream-LogProcess.cs | 701 +++++++++ .../SystemX.Net.Middleware.UI/Sub/UI.cs | 166 ++ .../SystemX.Net.CP.Middleware.Log.csproj | 343 +++++ .../SystemX.Net.Middleware.UI/packages.config | 44 + 39 files changed, 7357 insertions(+), 3 deletions(-) create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj create mode 100644 SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config diff --git a/.gitignore b/.gitignore index f32b7ed..a4c5101 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,6 @@ ## ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore -#======================Custom -.svn - # User-specific files *.rsuser *.suo @@ -401,3 +398,6 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml +#======================Custom +.svn +!SystemX.Net.CP.Middleware.Log \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln b/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln new file mode 100644 index 0000000..0ae386a --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30225.117 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemX.Net.CP.Middleware.Log", "SystemX.Net.Middleware.UI\SystemX.Net.CP.Middleware.Log.csproj", "{3658FBE5-9A84-4F76-8E19-867DB9F4484D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.ActiveCfg = Debug|x64 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.Build.0 = Debug|x64 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.Build.0 = Release|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.ActiveCfg = Release|x64 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {68CD108D-837F-47FF-A153-70C328D18A84} + VisualSVNWorkingCopyRoot = . + EndGlobalSection +EndGlobal diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico new file mode 100644 index 0000000000000000000000000000000000000000..14a4223d773bf1bf05e29a66cbb8213fab3505f2 GIT binary patch literal 34775 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 A#{d8T literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config new file mode 100644 index 0000000..369c5d6 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config @@ -0,0 +1,70 @@ + + + + +
+ + + + + + System + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cbb016c022c9e3902e9db5fa0f69ef5935903465 GIT binary patch literal 15086 zcmeHOX>3&28J(yVzw@8AA`RXKv#Bht6qWQ}{f-Z)C*}Iltx0@&WUGX3yeBps-!xY)Lp!$t$%(@dxC!fYX5YhoSuh>nl7%~zf$I=I$=f2=u` z`;8OdlDO}hF`bdNBe(~8PAPmV&{qRjapu?Gy6)rQMrkeFBV%d~?U)1CRl`fQ`O!y* zwd8NC`#@sdCnAl~R+KsiuCtDt(RRiuehpkDxz^=MDc`$0EyKN6#QW(R(oy-Gv{(K> z8jfWd;5F;m#y;$8PBY^{toz>N-bu`1FYZI)_i_aH!B?T@7XWu1+-dmVosNt5>Tjg! z;7O4leiD`NQkatxI?hXm)uUg8`& zEOX#kYTT5(67?E*PA}X)?%JQ=x03I^|D~HrB~B{)O*IyyYFCtzDuo_V-uhOLr08Z}W3t&NAy$#v}K0dZgp8{NKMfE4O|1 z68z%#;<@;exN4r4wvV<+XHmWc>t2+>`X5QW>1~+`)(iXU5`B?R1ibub@};NPDIIuT zn6u1!E8iIU>%eDay%K#XF5DBLs(k!rH4xio{%XsBxYviT3!>=YdWXSQc_`CY~K?}IqL z^P|-}v|Ma?UI2d$0+pHN-&?wHKMu7Ph#!6ixt1C(c5Nf*uR}1?{7k>*NgsR@>k(-xFs>uj z+%xI@>$tIPbPSR|2@7L99vi9QTXfw~m);i-Wrk^f8DzaF6m{tOhY~9>P0D-FKberMK+{{|$`V z-SK!W_-{;%gLmZy<<2#)9;@A*0}KPQ!9dPVofq zW#(}FKVPqPc$1E>?mVZp1$Y|Jozucul}*6kfb~41MPKwu--iHo?q|L8cP_rMIo5Fa ziFG|=#Ir*5N#EDsd*Y#;u^|T+w0U)AW4&|wUhcVu_2|#@7MVEPv6QnLc4r6N8PrBO zmYok(XQ!R7RNMc;e12m7>;!dcJ0Hn98;yRY+I;&-o`1-eSW803jyAt*jKb zW=(AvSgE$ob)!zM619NgMRapJ9e1VLvRS{sb2}idr}oIq*nk*%E9PbA%TB*cr>&}a zEtb#C+=lPHG8t`_PH09mw+AGhUYepg&TFQ2+9-X-eV>WD?pJcF>N#jBP6NDV9ox)_ z+GkJcKADO&OP7hm0=*NORnP*DMH`%*8kWxL7o_z>4$jj+KQ4ymT9N>-S;w}nnwN!h zSBctXPuczihtvBL>j15fI*0P9^fGg9)%JSpUPGK7dN6bdLkl+XrDn%Ewy}@r^3Rof zBPRz}d4fZC>3&0>GHZ28FEZy=ZL1slh98_`R}Vt-JS#J!T}dCjW*ytuhkeZ{0^N!n z+!f!3wh~M>v9F<**yvQ8i#d6ri^ba#8lJh{dd)uUYfkMS<;o!51NTh#B?_&~XJ{h% zh!reEze!uVe}B%<<*a&YxcTomJCGx-Cv&9(J~(gM^+6vqCpY#9L7z<2T&Rcf{u{n+ zbQY_&;=l5WL~p)p*qi?u={PQZm(07gLK-!MBr2L*S`*p z?}yTkShJyJU4B7EKL52$hZ5%lQYMeWV%mjW>^zgP@x@~IcCq73#sQVEfRmVivfmK5nE+kc3H7U zn;2slyjL0<4Pm`i3~(vAT|AC)LB>uSY;&pL+A|htH)h(p+TAg0oM{AczrmVa z62Vwu#B!I4*m=aO88cjZ%q@m^#i557TcPhwz#oA1jPcMHeQrW{;GrhQDezy+j9A4Y zaf)XUCs;|0f;P`w{qr}5T>Sqy%l!W=v`N?|{#Lzz@2>SH#FgUm z*eVKvhIfQ(e&6_pV$QNPjdvbR+NpCvw2!uYD8AYkWoD?wFk#LzzcsCCqVof2 zi1@~v|IVU)|JkQxZX%GxXsAfrgTEuGfjC*CCG0dXp3XlUXnX~ zWl39JsQxNfzXi%ZrL#>z^*80ie6RMD@chlfa}0=; + + public class HISTTesterSummary + { + public string StationName { set; get; } + public string TestType { set; get; } + public string Version { set; get; } + public string ProdCode { set; get; } + public int TestListFileNo { set; get; } + public int TestListVariantNo { set; get; } + public string TestListCntID { set; get; } + + public int StepVersion { set; get; } + public string Host { set; get; } + public string Section { set; get; } + public string ProdNoC { set; get; } + public string ProdNoP { set; get; } + public string TestCode { set; get; } + public string TestListFileName { set; get; } + public string ProductID { set; get; } + public string Result { set; get; } + public string Duration { set; get; } + public DateTime TestDT { set; get; } + } + + public class HISTLogSummary + { + public string StationName { set; get; } + public string TestType { set; get; } + public string Version { set; get; } + public string ProdCode { set; get; } + public int TestListFileNo { set; get; } + public int TestListVariantNo { set; get; } + public string TestListCntID { set; get; } + + public int StepVersion { set; get; } + public string Host { set; get; } + public string Section { set; get; } + public string ProdNoC { set; get; } + public string ProdNoP { set; get; } + public string TestCode { set; get; } + public string TestListFileName { set; get; } + public string ProductID { set; get; } + public string Result { set; get; } + public string Duration { set; get; } + public DateTime TestDT { set; get; } + } + + public static class ShortLogParamInfo + { + public static readonly int MessageLength = 4096; + public static readonly int MessageValLength = 2024; + + public static string STEP = ""; + public static string POSITION = ""; + public static string MO = ""; + public static string FNC_NAME = ""; + public static string MIN = ""; + public static string MEASURE = ""; + public static string MAX = ""; + public static string DIM = ""; + public static string CHECK = ""; + public static string SPENT_TIME = ""; + public static string INFO = ""; + + public static bool GLOBAL_SPEC = false; + public static string VRFY_MIN = ""; + public static string VRFY_MAX = ""; + } + + public static class LongLogParamInfo + { + public static readonly int MessageLength = 4096; + public static readonly int MessageValLength = 2024; + + public static string STEP = ""; + public static string POSITION = ""; + public static string MO = ""; + public static string FNC_NAME = ""; + public static string MIN = ""; + public static string MEASURE = ""; + public static string MAX = ""; + public static string DIM = ""; + public static string CHECK = ""; + public static string SPENT_TIME = ""; + public static string INFO = ""; + + public static bool GLOBAL_SPEC = false; + public static string VRFY_MIN = ""; + public static string VRFY_MAX = ""; + } + + public static class ParamSet + { + public static Dictionary fParam = new Dictionary(); + + public static void TestResultField() + { + fParam.Clear(); + fParam = new Dictionary(); + fParam.Add("No", new ParamElement(SqlDbType.BigInt, 0, 0, 0)); + fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0)); + fParam.Add("LogData", new ParamElement(SqlDbType.NVarChar, -1, 0, 0)); + } + + public static void TesterSummaryField() + { + fParam.Clear(); + fParam = new Dictionary(); + fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0)); + fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0)); + fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0)); + } + + public static void LogSummaryField() + { + fParam.Clear(); + fParam = new Dictionary(); + fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0)); + fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0)); + fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0)); + } + + public static SqlParameter GetMakeSqlParameterInfo(Dictionary refField, string strSetName, object objValue) + { + if (refField.ContainsKey(strSetName)) + { + SqlParameter param = null; + + if (refField[strSetName].Item2 != 0) + param = new SqlParameter("@" + strSetName, refField[strSetName].Item1, refField[strSetName].Item2); + else + param = new SqlParameter("@" + strSetName, refField[strSetName].Item1); + + if (refField[strSetName].Item1 == SqlDbType.Decimal) + { + param.Precision = refField[strSetName].Item3; + param.Scale = refField[strSetName].Item4; + } + + param.Value = objValue; + return param; + } + else + return null; + } + } + + public class CommonProtocol + { + public SqlCommand LogDataResultInsert(string strTableName, DataRow itemData) + { + string columns = string.Empty; + columns = "No,TestDT,LogData"; + + string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c))); + string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values); + + ParamSet.TestResultField(); + + SqlCommand cmd = new SqlCommand(sqlCommand); + + SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()]; + + setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "No", Convert.ToInt64(itemData["No"])); + setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", Convert.ToDateTime(itemData["TestDT"])); + setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "LogData", Convert.ToString(itemData["LogData"])); + + cmd.Parameters.AddRange(setParams); + + return cmd; + } + + public SqlCommand LogDataSummaryInsert(string strTableName, HISTLogSummary itemSummary) + { + string columns = string.Empty; + if (itemSummary.TestListCntID == string.Empty) + columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT"; + else + columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,TestListCntID,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT"; + + string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c))); + string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values); + + ParamSet.LogSummaryField(); + + SqlCommand cmd = new SqlCommand(sqlCommand); + + SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()]; + + if (itemSummary.TestListCntID == string.Empty) + { + setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName); + setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType); + setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version); + setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode); + setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo); + setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo); + setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion); + setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host); + setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section); + setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC); + setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP); + setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode); + setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName); + setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID); + setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result); + setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration); + setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT); + } + else + { + setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName); + setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType); + setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version); + setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode); + setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo); + setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo); + setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListCntID", itemSummary.TestListCntID); + setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion); + setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host); + setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section); + setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC); + setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP); + setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode); + setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName); + setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID); + setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result); + setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration); + setParams[17] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT); + } + + cmd.Parameters.AddRange(setParams); + + return cmd; + } + } + + public static class COMMON + { + [DllImport("winmm.dll")] + public static extern uint timeGetTime(); + + public const string Png = "PNG Portable Network Graphics (*.png)|" + "*.png"; + public const string Jpg = "JPEG File Interchange Format (*.jpg *.jpeg *jfif)|" + "*.jpg;*.jpeg;*.jfif"; + public const string Bmp = "BMP Windows Bitmap (*.bmp)|" + "*.bmp"; + public const string Tif = "TIF Tagged Imaged File Format (*.tif *.tiff)|" + "*.tif;*.tiff"; + public const string Gif = "GIF Graphics Interchange Format (*.gif)|" + "*.gif"; + public const string AllImages = "Image file|" + "*.png; *.jpg; *.jpeg; *.jfif; *.bmp;*.tif; *.tiff; *.gif"; + public const string AllFiles = "All files (*.*)" + "|*.*"; + + public static string[] mediaExtensions = { + ".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc + ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc + ".AVI", ".MP4", ".DIVX", ".WMV", //etc + }; + + public static DataTable ConvertCSVtoDataTable(string strFilePath, string strSetHeader) + { + DataTable dt = null; + try + { + using (StreamReader sr = new StreamReader(strFilePath)) + { + string[] headers = null; + + if (strSetHeader.Length > 0) + headers = strSetHeader.Split(','); + else + headers = sr.ReadLine().Split(','); + + dt = new DataTable(); + foreach (string header in headers) + { + dt.Columns.Add(header); + } + while (!sr.EndOfStream) + { + string strReadData = sr.ReadLine().Trim(); + if (strReadData.Length <= 0) + break; + + string[] rows = Regex.Split(strReadData, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); + DataRow dr = dt.NewRow(); + for (int i = 0; i < headers.Length; i++) + { + dr[i] = rows[i]; + } + dt.Rows.Add(dr); + } + } + } + catch (Exception e) + { + dt = null; + } + + return dt; + } + + public static T ConvertTextToTryValue(string strText, object objFailValue) + { + object obj; + obj = typeof(T); + + int iGetValue = 0; + uint uiGetValue = 0; + double dGetValue = 0; + + if (obj.ToString().IndexOf("Int") >= 0) + { + if (!int.TryParse(strText, out iGetValue)) + obj = objFailValue; + else + obj = iGetValue; + } + if (obj.ToString().IndexOf("UInt") >= 0) + { + if (!uint.TryParse(strText, out uiGetValue)) + obj = objFailValue; + else + obj = uiGetValue; + } + else if (obj.ToString().IndexOf("Double") >= 0) + { + if (!double.TryParse(strText, out dGetValue)) + obj = objFailValue; + else + obj = dGetValue; + } + + return (T)Convert.ChangeType(obj, typeof(T)); + } + + public static T FindByName(this object targetClass, string name) where T : class + { + System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + + return fi.GetValue(targetClass) as T; + } + + public static T FindByName(this string name, object targetClass) where T : class + { + System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + + return fi.GetValue(targetClass) as T; + } + + public class LogProcessInfo + { + public bool READ_INFO_STATE { set; get; } + + private string strInfoFilePos; + + public string TITLE; + + public string SERVER_SAVE_POS; + public string MES_SAVE_POS; + + //TODO : Server ALIS FTP + public bool FTP_Use; + + public string FTP_IPAddress; + public string FTP_Port; + public string FTP_Account; + public string FTP_Password; + + public long FTP_ScanTime_ms; + + public long BULK_ProcessTime_ms; + + public LogProcessInfo(string strGetInfoPath) + { + strInfoFilePos = strGetInfoPath; + } + public bool Load() + { + READ_INFO_STATE = true; + + try + { + XDocument xDoc = XDocument.Load(strInfoFilePos); + var xElement = xDoc.Element("ROOT"); + + if (xElement != null) + { + var xGetElement = xElement.Element("Configure"); + + TITLE = xGetElement.Element("Title").Value; + + SERVER_SAVE_POS = @xGetElement.Element("LogFileSavePos").Value; + MES_SAVE_POS = @xGetElement.Element("MESFileSavePos").Value; + + //TODO : Server ALIS FTP + XElement xEle = xGetElement.Element("UseFTP"); + + bool bValue; + long lValue; + //string strValue; + + if (xEle?.IsEmpty == false) + { + if (bool.TryParse(xEle.Value, out bValue)) + FTP_Use = bValue; + } + else + FTP_Use = false; + + xEle = xGetElement.Element("IPAddressFTP"); + + if (xEle?.IsEmpty == false) + FTP_IPAddress = xEle.Value; + else + FTP_IPAddress = "0.0.0.0"; + + xEle = xGetElement.Element("PortFTP"); + + if (xEle?.IsEmpty == false) + FTP_Port = xEle.Value; + else + FTP_Port = "21"; + + xEle = xGetElement.Element("AccountFTP"); + + if (xEle?.IsEmpty == false) + FTP_Account = xEle.Value; + else + FTP_Account = ""; + + xEle = xGetElement.Element("PasswordFTP"); + + if (xEle?.IsEmpty == false) + FTP_Password = xEle.Value; + else + FTP_Password = ""; + + xEle = xGetElement.Element("ScanTimeFTPms"); + + if (xEle?.IsEmpty == false) + { + if (long.TryParse(xEle.Value, out lValue)) + FTP_ScanTime_ms = lValue; + } + else + FTP_ScanTime_ms = 30000; + + xEle = xGetElement.Element("ScanTimeBULKms"); + + if (xEle?.IsEmpty == false) + { + if (long.TryParse(xEle.Value, out lValue)) + BULK_ProcessTime_ms = lValue; + } + else + BULK_ProcessTime_ms = 30000; + + if (Base.CheckPath(SERVER_SAVE_POS)) + { + if (Directory.Exists(SERVER_SAVE_POS) == false) + Directory.CreateDirectory(SERVER_SAVE_POS); + } + else + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(SERVER SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception(); + } + + if (Base.CheckPath(MES_SAVE_POS)) + { + if (Directory.Exists(MES_SAVE_POS) == false) + Directory.CreateDirectory(MES_SAVE_POS); + } + else + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(MES SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception(); + } + + } + } + catch (Exception e) + { + READ_INFO_STATE = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"LogProcessInfo read failed. [LogProcessInfo : SystemX.Net.Middleware.Commons]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + return READ_INFO_STATE; + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs new file mode 100644 index 0000000..0cd3610 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using System.IO; +using System.Security.Cryptography; +using System.Data; +using System.Text.RegularExpressions; +using System.Net.Sockets; +using System.Globalization; +using System.Threading; +using System.Diagnostics; +using System.Net; + +using SystemX.Net.BaseProtocol; +using System.Xml.Linq; +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Data.SqlClient; + +namespace SystemX.Net.Middleware.Log.DeleteProc +{ + public class DeleteProcSystem + { + public Stopwatch stDeleteLogScanTimer; + + public DeleteProcSystem() + { + stDeleteLogScanTimer = new Stopwatch(); + } + + protected void ScanTimerStart() + { + stDeleteLogScanTimer.Start(); + } + + protected void ScanTimerRestart() + { + stDeleteLogScanTimer.Restart(); + } + + protected long GetTimerTime() + { + return stDeleteLogScanTimer.ElapsedMilliseconds; + } + + protected bool GetTimeOverState(long lLimitTime) + { + return (stDeleteLogScanTimer.ElapsedMilliseconds >= lLimitTime) ? true : false; + } + } + + public class DeleteProcOption + { + public enum eLogCheckItem + { + Summary = 0, + ShortTerm = 1, + LongTerm = 2 + } + + //Option + public eLogCheckItem ProcChkItem; + + public long lLogScanTimeVal; + + public int nSummaryScanItemCnt; + public int nShortLogScanItemCnt; + public int nLongLogScanItemCnt; + + public int nSummaryDeleteNum; + + public DeleteProcOption() + { + ProcChkItem = eLogCheckItem.Summary; + + //3 Minute + //Test 10000 + lLogScanTimeVal = 10000; //180000; + + nSummaryScanItemCnt = 100; + nShortLogScanItemCnt = 100; + nLongLogScanItemCnt = 100; + + nSummaryDeleteNum = 5; + } + } + + public class DeleteProcInfo : DeleteProcSystem + { + public int[] nHistSummaryDeleteList; + public int nHistSummaryDeleteSize; + public int nHistSummaryDeletePos; + // + public int[] nShortLogSummaryDeleteListNo; + public int[] nShortLogSummaryDeleteListAccessSt; + public int[] nShortLogSummaryDeleteListAccessEn; + + public int nShortLogSummaryDeleteSize; + public int nShortLogSummaryDeletePos; + + public bool bShortLogDataCheckResult; + public int nShortLogDeleteProcPos; + public bool bShortLogDataDeleteResult; + // + public int[] nLongLogSummaryDeleteListNo; + public int[] nLongLogSummaryDeleteListAccessSt; + public int[] nLongLogSummaryDeleteListAccessEn; + + public int nLongLogSummaryDeleteSize; + public int nLongLogSummaryDeletePos; + + public bool bLongLogDataCheckResult; + public int nLongLogDeleteProcPos; + public bool bLongLogDataDeleteResult; + // + //Option + public DeleteProcOption DeleteProcOp; + + public DeleteProcInfo() + { + ScanTimerStart(); + + InitMember(); + } + + private void InitMember() + { + nHistSummaryDeleteList = new int[1]; + nHistSummaryDeleteSize = 0; + nHistSummaryDeletePos = 0; + + nShortLogSummaryDeleteListNo = new int[1]; + nShortLogSummaryDeleteListAccessSt = new int[1]; + nShortLogSummaryDeleteListAccessEn = new int[1]; + + nShortLogSummaryDeleteSize = 0; + nShortLogSummaryDeletePos = 0; + + bShortLogDataCheckResult = false; + nShortLogDeleteProcPos = 0; + bShortLogDataDeleteResult = false; + + nLongLogSummaryDeleteListNo = new int[1]; + nLongLogSummaryDeleteListAccessSt = new int[1]; + nLongLogSummaryDeleteListAccessEn = new int[1]; + + nLongLogSummaryDeleteSize = 0; + nLongLogSummaryDeletePos = 0; + + bLongLogDataCheckResult = false; + nLongLogDeleteProcPos = 0; + bLongLogDataDeleteResult = false; + + DeleteProcOp = new DeleteProcOption(); + } + + public bool GetScanTimeState() + { + return GetTimeOverState(DeleteProcOp.lLogScanTimeVal); + } + + public void ResetScanTimeState() + { + ScanTimerRestart(); + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs new file mode 100644 index 0000000..60b1fa2 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs @@ -0,0 +1,849 @@ +using DevExpress.XtraBars; +using DevExpress.XtraBars.Ribbon; + +namespace SystemX.Net.MiddlewareUI +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.fluentDesignFormContainer1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panelMain = new System.Windows.Forms.Panel(); + this.panelProcess = new System.Windows.Forms.Panel(); + this.richTextBoxProcess = new System.Windows.Forms.RichTextBox(); + this.panelRecv = new System.Windows.Forms.Panel(); + this.richTextBoxRecv = new System.Windows.Forms.RichTextBox(); + this.paneldDBConn = new System.Windows.Forms.Panel(); + this.panelDBPath = new System.Windows.Forms.Panel(); + this.labelDBPath = new System.Windows.Forms.Label(); + this.panelFTP = new System.Windows.Forms.Panel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.labelFTP = new System.Windows.Forms.Label(); + this.panelDBLongTerm2 = new System.Windows.Forms.Panel(); + this.panelDBLongTerm1 = new System.Windows.Forms.Panel(); + this.labelDBLongTerm = new System.Windows.Forms.Label(); + this.panel7 = new System.Windows.Forms.Panel(); + this.panel8 = new System.Windows.Forms.Panel(); + this.labelShortTermLogTableName = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.panel6 = new System.Windows.Forms.Panel(); + this.labelShortTermSummaryTableName = new System.Windows.Forms.Label(); + this.panelDBShortTerm2 = new System.Windows.Forms.Panel(); + this.panelDBShortTerm1 = new System.Windows.Forms.Panel(); + this.labelDBShortTerm = new System.Windows.Forms.Label(); + this.panelDBMain2 = new System.Windows.Forms.Panel(); + this.panelDBMain1 = new System.Windows.Forms.Panel(); + this.labelDBMain = new System.Windows.Forms.Label(); + this.progressBarProgram = new System.Windows.Forms.ProgressBar(); + this.panelSubFunc = new System.Windows.Forms.Panel(); + this.buttonDbConnect = new System.Windows.Forms.Button(); + this.panel3 = new System.Windows.Forms.Panel(); + this.labelFTPTime = new System.Windows.Forms.Label(); + this.labelBulkTime = new System.Windows.Forms.Label(); + this.labelBulkCntInfo1 = new System.Windows.Forms.Label(); + this.labelBulkCntInfo2 = new System.Windows.Forms.Label(); + this.labelBulkCntInfo3 = new System.Windows.Forms.Label(); + this.buttonBulkInsertStart = new System.Windows.Forms.Button(); + this.panelSub1 = new System.Windows.Forms.Panel(); + this.panelSub2 = new System.Windows.Forms.Panel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.Title_label = new System.Windows.Forms.Label(); + this.AlisPictureBox = new System.Windows.Forms.PictureBox(); + this.fluentDesignFormControl1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl(); + this.barCheckItemShowCpLogTime = new DevExpress.XtraBars.BarCheckItem(); + this.Chktimer = new System.Windows.Forms.Timer(this.components); + this.UItimer = new System.Windows.Forms.Timer(this.components); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.contextMenuSubStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemExit = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripComboBox1 = new System.Windows.Forms.ToolStripComboBox(); + this.fluentDesignFormContainer1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.panelMain.SuspendLayout(); + this.panelProcess.SuspendLayout(); + this.panelRecv.SuspendLayout(); + this.paneldDBConn.SuspendLayout(); + this.panelDBPath.SuspendLayout(); + this.panelFTP.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panelDBLongTerm2.SuspendLayout(); + this.panelDBLongTerm1.SuspendLayout(); + this.panel7.SuspendLayout(); + this.panel8.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel6.SuspendLayout(); + this.panelDBShortTerm2.SuspendLayout(); + this.panelDBShortTerm1.SuspendLayout(); + this.panelDBMain2.SuspendLayout(); + this.panelDBMain1.SuspendLayout(); + this.panelSubFunc.SuspendLayout(); + this.panel3.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).BeginInit(); + this.contextMenuSubStrip.SuspendLayout(); + this.SuspendLayout(); + // + // fluentDesignFormContainer1 + // + this.fluentDesignFormContainer1.Controls.Add(this.panel2); + this.fluentDesignFormContainer1.Controls.Add(this.panel1); + this.fluentDesignFormContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.fluentDesignFormContainer1.Location = new System.Drawing.Point(0, 46); + this.fluentDesignFormContainer1.Name = "fluentDesignFormContainer1"; + this.fluentDesignFormContainer1.Size = new System.Drawing.Size(1979, 958); + this.fluentDesignFormContainer1.TabIndex = 0; + // + // panel2 + // + this.panel2.Controls.Add(this.panelMain); + this.panel2.Controls.Add(this.panelSubFunc); + this.panel2.Controls.Add(this.panelSub1); + this.panel2.Controls.Add(this.panelSub2); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 74); + this.panel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1979, 884); + this.panel2.TabIndex = 3; + // + // panelMain + // + this.panelMain.Controls.Add(this.panelProcess); + this.panelMain.Controls.Add(this.panelRecv); + this.panelMain.Controls.Add(this.paneldDBConn); + this.panelMain.Controls.Add(this.progressBarProgram); + this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelMain.Location = new System.Drawing.Point(0, 0); + this.panelMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelMain.Name = "panelMain"; + this.panelMain.Size = new System.Drawing.Size(1979, 592); + this.panelMain.TabIndex = 18; + // + // panelProcess + // + this.panelProcess.Controls.Add(this.richTextBoxProcess); + this.panelProcess.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelProcess.Location = new System.Drawing.Point(433, 306); + this.panelProcess.Margin = new System.Windows.Forms.Padding(20); + this.panelProcess.Name = "panelProcess"; + this.panelProcess.Padding = new System.Windows.Forms.Padding(20); + this.panelProcess.Size = new System.Drawing.Size(1546, 286); + this.panelProcess.TabIndex = 23; + // + // richTextBoxProcess + // + this.richTextBoxProcess.BackColor = System.Drawing.Color.White; + this.richTextBoxProcess.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxProcess.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBoxProcess.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBoxProcess.Location = new System.Drawing.Point(20, 20); + this.richTextBoxProcess.Margin = new System.Windows.Forms.Padding(10); + this.richTextBoxProcess.Name = "richTextBoxProcess"; + this.richTextBoxProcess.ReadOnly = true; + this.richTextBoxProcess.Size = new System.Drawing.Size(1506, 246); + this.richTextBoxProcess.TabIndex = 1; + this.richTextBoxProcess.Text = ""; + // + // panelRecv + // + this.panelRecv.Controls.Add(this.richTextBoxRecv); + this.panelRecv.Dock = System.Windows.Forms.DockStyle.Top; + this.panelRecv.Location = new System.Drawing.Point(433, 60); + this.panelRecv.Margin = new System.Windows.Forms.Padding(20); + this.panelRecv.Name = "panelRecv"; + this.panelRecv.Padding = new System.Windows.Forms.Padding(20); + this.panelRecv.Size = new System.Drawing.Size(1546, 233); + this.panelRecv.TabIndex = 22; + // + // richTextBoxRecv + // + this.richTextBoxRecv.BackColor = System.Drawing.Color.White; + this.richTextBoxRecv.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxRecv.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBoxRecv.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBoxRecv.Location = new System.Drawing.Point(20, 20); + this.richTextBoxRecv.Margin = new System.Windows.Forms.Padding(10); + this.richTextBoxRecv.Name = "richTextBoxRecv"; + this.richTextBoxRecv.ReadOnly = true; + this.richTextBoxRecv.Size = new System.Drawing.Size(1506, 193); + this.richTextBoxRecv.TabIndex = 0; + this.richTextBoxRecv.Text = ""; + // + // paneldDBConn + // + this.paneldDBConn.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.paneldDBConn.Controls.Add(this.panelDBPath); + this.paneldDBConn.Controls.Add(this.panelFTP); + this.paneldDBConn.Controls.Add(this.panelDBLongTerm2); + this.paneldDBConn.Controls.Add(this.panel7); + this.paneldDBConn.Controls.Add(this.panel5); + this.paneldDBConn.Controls.Add(this.panelDBShortTerm2); + this.paneldDBConn.Controls.Add(this.panelDBMain2); + this.paneldDBConn.Dock = System.Windows.Forms.DockStyle.Left; + this.paneldDBConn.Location = new System.Drawing.Point(0, 60); + this.paneldDBConn.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.paneldDBConn.Name = "paneldDBConn"; + this.paneldDBConn.Size = new System.Drawing.Size(433, 532); + this.paneldDBConn.TabIndex = 21; + // + // panelDBPath + // + this.panelDBPath.Controls.Add(this.labelDBPath); + this.panelDBPath.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBPath.Location = new System.Drawing.Point(0, 228); + this.panelDBPath.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBPath.Name = "panelDBPath"; + this.panelDBPath.Size = new System.Drawing.Size(433, 39); + this.panelDBPath.TabIndex = 33; + // + // labelDBPath + // + this.labelDBPath.BackColor = System.Drawing.Color.White; + this.labelDBPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBPath.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBPath.Location = new System.Drawing.Point(0, 0); + this.labelDBPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBPath.Name = "labelDBPath"; + this.labelDBPath.Size = new System.Drawing.Size(433, 39); + this.labelDBPath.TabIndex = 23; + this.labelDBPath.Text = "Path"; + this.labelDBPath.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panelFTP + // + this.panelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelFTP.Controls.Add(this.panel4); + this.panelFTP.Dock = System.Windows.Forms.DockStyle.Top; + this.panelFTP.Location = new System.Drawing.Point(0, 190); + this.panelFTP.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelFTP.Name = "panelFTP"; + this.panelFTP.Size = new System.Drawing.Size(433, 38); + this.panelFTP.TabIndex = 32; + this.panelFTP.Visible = false; + // + // panel4 + // + this.panel4.Controls.Add(this.labelFTP); + this.panel4.Dock = System.Windows.Forms.DockStyle.Left; + this.panel4.Location = new System.Drawing.Point(0, 0); + this.panel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(408, 36); + this.panel4.TabIndex = 26; + // + // labelFTP + // + this.labelFTP.BackColor = System.Drawing.Color.White; + this.labelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelFTP.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelFTP.Location = new System.Drawing.Point(0, 0); + this.labelFTP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelFTP.Name = "labelFTP"; + this.labelFTP.Size = new System.Drawing.Size(408, 36); + this.labelFTP.TabIndex = 23; + this.labelFTP.Text = "FTP"; + this.labelFTP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelDBLongTerm2 + // + this.panelDBLongTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelDBLongTerm2.Controls.Add(this.panelDBLongTerm1); + this.panelDBLongTerm2.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBLongTerm2.Location = new System.Drawing.Point(0, 152); + this.panelDBLongTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBLongTerm2.Name = "panelDBLongTerm2"; + this.panelDBLongTerm2.Size = new System.Drawing.Size(433, 38); + this.panelDBLongTerm2.TabIndex = 31; + // + // panelDBLongTerm1 + // + this.panelDBLongTerm1.Controls.Add(this.labelDBLongTerm); + this.panelDBLongTerm1.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDBLongTerm1.Location = new System.Drawing.Point(0, 0); + this.panelDBLongTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBLongTerm1.Name = "panelDBLongTerm1"; + this.panelDBLongTerm1.Size = new System.Drawing.Size(408, 36); + this.panelDBLongTerm1.TabIndex = 26; + // + // labelDBLongTerm + // + this.labelDBLongTerm.BackColor = System.Drawing.Color.White; + this.labelDBLongTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBLongTerm.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBLongTerm.Location = new System.Drawing.Point(0, 0); + this.labelDBLongTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBLongTerm.Name = "labelDBLongTerm"; + this.labelDBLongTerm.Size = new System.Drawing.Size(408, 36); + this.labelDBLongTerm.TabIndex = 23; + this.labelDBLongTerm.Text = "LongTerm"; + this.labelDBLongTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel7 + // + this.panel7.BackColor = System.Drawing.Color.WhiteSmoke; + this.panel7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel7.Controls.Add(this.panel8); + this.panel7.Dock = System.Windows.Forms.DockStyle.Top; + this.panel7.Location = new System.Drawing.Point(0, 114); + this.panel7.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(433, 38); + this.panel7.TabIndex = 29; + // + // panel8 + // + this.panel8.Controls.Add(this.labelShortTermLogTableName); + this.panel8.Dock = System.Windows.Forms.DockStyle.Left; + this.panel8.Location = new System.Drawing.Point(0, 0); + this.panel8.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(408, 36); + this.panel8.TabIndex = 26; + // + // labelShortTermLogTableName + // + this.labelShortTermLogTableName.BackColor = System.Drawing.Color.White; + this.labelShortTermLogTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelShortTermLogTableName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelShortTermLogTableName.Location = new System.Drawing.Point(0, 0); + this.labelShortTermLogTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelShortTermLogTableName.Name = "labelShortTermLogTableName"; + this.labelShortTermLogTableName.Size = new System.Drawing.Size(408, 36); + this.labelShortTermLogTableName.TabIndex = 23; + this.labelShortTermLogTableName.Text = "ShortTermLogTableName"; + this.labelShortTermLogTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel5 + // + this.panel5.BackColor = System.Drawing.Color.WhiteSmoke; + this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel5.Controls.Add(this.panel6); + this.panel5.Dock = System.Windows.Forms.DockStyle.Top; + this.panel5.Location = new System.Drawing.Point(0, 76); + this.panel5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(433, 38); + this.panel5.TabIndex = 28; + // + // panel6 + // + this.panel6.Controls.Add(this.labelShortTermSummaryTableName); + this.panel6.Dock = System.Windows.Forms.DockStyle.Left; + this.panel6.Location = new System.Drawing.Point(0, 0); + this.panel6.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(408, 36); + this.panel6.TabIndex = 26; + // + // labelShortTermSummaryTableName + // + this.labelShortTermSummaryTableName.BackColor = System.Drawing.Color.White; + this.labelShortTermSummaryTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelShortTermSummaryTableName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelShortTermSummaryTableName.Location = new System.Drawing.Point(0, 0); + this.labelShortTermSummaryTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelShortTermSummaryTableName.Name = "labelShortTermSummaryTableName"; + this.labelShortTermSummaryTableName.Size = new System.Drawing.Size(408, 36); + this.labelShortTermSummaryTableName.TabIndex = 23; + this.labelShortTermSummaryTableName.Text = "ShortTermSummaryTableName"; + this.labelShortTermSummaryTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelDBShortTerm2 + // + this.panelDBShortTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelDBShortTerm2.Controls.Add(this.panelDBShortTerm1); + this.panelDBShortTerm2.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBShortTerm2.Location = new System.Drawing.Point(0, 38); + this.panelDBShortTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBShortTerm2.Name = "panelDBShortTerm2"; + this.panelDBShortTerm2.Size = new System.Drawing.Size(433, 38); + this.panelDBShortTerm2.TabIndex = 23; + // + // panelDBShortTerm1 + // + this.panelDBShortTerm1.Controls.Add(this.labelDBShortTerm); + this.panelDBShortTerm1.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDBShortTerm1.Location = new System.Drawing.Point(0, 0); + this.panelDBShortTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBShortTerm1.Name = "panelDBShortTerm1"; + this.panelDBShortTerm1.Size = new System.Drawing.Size(408, 36); + this.panelDBShortTerm1.TabIndex = 26; + // + // labelDBShortTerm + // + this.labelDBShortTerm.BackColor = System.Drawing.Color.White; + this.labelDBShortTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBShortTerm.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBShortTerm.Location = new System.Drawing.Point(0, 0); + this.labelDBShortTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBShortTerm.Name = "labelDBShortTerm"; + this.labelDBShortTerm.Size = new System.Drawing.Size(408, 36); + this.labelDBShortTerm.TabIndex = 23; + this.labelDBShortTerm.Text = "ShortTerm"; + this.labelDBShortTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelDBMain2 + // + this.panelDBMain2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelDBMain2.Controls.Add(this.panelDBMain1); + this.panelDBMain2.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBMain2.Location = new System.Drawing.Point(0, 0); + this.panelDBMain2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBMain2.Name = "panelDBMain2"; + this.panelDBMain2.Size = new System.Drawing.Size(433, 38); + this.panelDBMain2.TabIndex = 22; + // + // panelDBMain1 + // + this.panelDBMain1.Controls.Add(this.labelDBMain); + this.panelDBMain1.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDBMain1.Location = new System.Drawing.Point(0, 0); + this.panelDBMain1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBMain1.Name = "panelDBMain1"; + this.panelDBMain1.Size = new System.Drawing.Size(408, 36); + this.panelDBMain1.TabIndex = 25; + // + // labelDBMain + // + this.labelDBMain.BackColor = System.Drawing.Color.White; + this.labelDBMain.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBMain.Location = new System.Drawing.Point(0, 0); + this.labelDBMain.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBMain.Name = "labelDBMain"; + this.labelDBMain.Size = new System.Drawing.Size(408, 36); + this.labelDBMain.TabIndex = 22; + this.labelDBMain.Text = "Information"; + this.labelDBMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // progressBarProgram + // + this.progressBarProgram.Dock = System.Windows.Forms.DockStyle.Top; + this.progressBarProgram.ForeColor = System.Drawing.SystemColors.HotTrack; + this.progressBarProgram.Location = new System.Drawing.Point(0, 0); + this.progressBarProgram.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.progressBarProgram.Name = "progressBarProgram"; + this.progressBarProgram.Size = new System.Drawing.Size(1979, 60); + this.progressBarProgram.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + this.progressBarProgram.TabIndex = 20; + // + // panelSubFunc + // + this.panelSubFunc.BackColor = System.Drawing.Color.MidnightBlue; + this.panelSubFunc.Controls.Add(this.buttonDbConnect); + this.panelSubFunc.Controls.Add(this.panel3); + this.panelSubFunc.Controls.Add(this.buttonBulkInsertStart); + this.panelSubFunc.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelSubFunc.Location = new System.Drawing.Point(0, 592); + this.panelSubFunc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelSubFunc.Name = "panelSubFunc"; + this.panelSubFunc.Size = new System.Drawing.Size(1979, 58); + this.panelSubFunc.TabIndex = 17; + // + // buttonDbConnect + // + this.buttonDbConnect.BackColor = System.Drawing.SystemColors.Control; + this.buttonDbConnect.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonDbConnect.Location = new System.Drawing.Point(683, 0); + this.buttonDbConnect.Name = "buttonDbConnect"; + this.buttonDbConnect.Size = new System.Drawing.Size(229, 58); + this.buttonDbConnect.TabIndex = 2; + this.buttonDbConnect.Text = "Database Connect Try"; + this.buttonDbConnect.UseVisualStyleBackColor = false; + this.buttonDbConnect.Visible = false; + this.buttonDbConnect.Click += new System.EventHandler(this.buttonDbConnect_Click); + // + // panel3 + // + this.panel3.Controls.Add(this.labelFTPTime); + this.panel3.Controls.Add(this.labelBulkTime); + this.panel3.Controls.Add(this.labelBulkCntInfo1); + this.panel3.Controls.Add(this.labelBulkCntInfo2); + this.panel3.Controls.Add(this.labelBulkCntInfo3); + this.panel3.Dock = System.Windows.Forms.DockStyle.Right; + this.panel3.Location = new System.Drawing.Point(912, 0); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(851, 58); + this.panel3.TabIndex = 1; + // + // labelFTPTime + // + this.labelFTPTime.BackColor = System.Drawing.Color.WhiteSmoke; + this.labelFTPTime.Dock = System.Windows.Forms.DockStyle.Right; + this.labelFTPTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelFTPTime.Location = new System.Drawing.Point(121, 0); + this.labelFTPTime.Name = "labelFTPTime"; + this.labelFTPTime.Size = new System.Drawing.Size(146, 58); + this.labelFTPTime.TabIndex = 4; + this.labelFTPTime.Text = "-"; + this.labelFTPTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.labelFTPTime.Visible = false; + // + // labelBulkTime + // + this.labelBulkTime.BackColor = System.Drawing.Color.Snow; + this.labelBulkTime.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkTime.Location = new System.Drawing.Point(267, 0); + this.labelBulkTime.Name = "labelBulkTime"; + this.labelBulkTime.Size = new System.Drawing.Size(146, 58); + this.labelBulkTime.TabIndex = 3; + this.labelBulkTime.Text = "-"; + this.labelBulkTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // labelBulkCntInfo1 + // + this.labelBulkCntInfo1.BackColor = System.Drawing.Color.Silver; + this.labelBulkCntInfo1.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkCntInfo1.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkCntInfo1.Location = new System.Drawing.Point(413, 0); + this.labelBulkCntInfo1.Name = "labelBulkCntInfo1"; + this.labelBulkCntInfo1.Size = new System.Drawing.Size(146, 58); + this.labelBulkCntInfo1.TabIndex = 2; + this.labelBulkCntInfo1.Text = "-"; + this.labelBulkCntInfo1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // labelBulkCntInfo2 + // + this.labelBulkCntInfo2.BackColor = System.Drawing.Color.Silver; + this.labelBulkCntInfo2.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkCntInfo2.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkCntInfo2.Location = new System.Drawing.Point(559, 0); + this.labelBulkCntInfo2.Name = "labelBulkCntInfo2"; + this.labelBulkCntInfo2.Size = new System.Drawing.Size(146, 58); + this.labelBulkCntInfo2.TabIndex = 1; + this.labelBulkCntInfo2.Text = "-"; + this.labelBulkCntInfo2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // labelBulkCntInfo3 + // + this.labelBulkCntInfo3.BackColor = System.Drawing.Color.Silver; + this.labelBulkCntInfo3.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkCntInfo3.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkCntInfo3.Location = new System.Drawing.Point(705, 0); + this.labelBulkCntInfo3.Name = "labelBulkCntInfo3"; + this.labelBulkCntInfo3.Size = new System.Drawing.Size(146, 58); + this.labelBulkCntInfo3.TabIndex = 0; + this.labelBulkCntInfo3.Text = "-"; + this.labelBulkCntInfo3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // buttonBulkInsertStart + // + this.buttonBulkInsertStart.BackColor = System.Drawing.SystemColors.Control; + this.buttonBulkInsertStart.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonBulkInsertStart.Location = new System.Drawing.Point(1763, 0); + this.buttonBulkInsertStart.Name = "buttonBulkInsertStart"; + this.buttonBulkInsertStart.Size = new System.Drawing.Size(216, 58); + this.buttonBulkInsertStart.TabIndex = 0; + this.buttonBulkInsertStart.Text = "Direct Bulk Insert Try"; + this.buttonBulkInsertStart.UseVisualStyleBackColor = false; + this.buttonBulkInsertStart.Click += new System.EventHandler(this.buttonBulkInsertStart_Click); + // + // panelSub1 + // + this.panelSub1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelSub1.Location = new System.Drawing.Point(0, 650); + this.panelSub1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelSub1.Name = "panelSub1"; + this.panelSub1.Size = new System.Drawing.Size(1979, 94); + this.panelSub1.TabIndex = 14; + // + // panelSub2 + // + this.panelSub2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelSub2.Location = new System.Drawing.Point(0, 744); + this.panelSub2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelSub2.Name = "panelSub2"; + this.panelSub2.Size = new System.Drawing.Size(1979, 140); + this.panelSub2.TabIndex = 2; + // + // panel1 + // + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Controls.Add(this.pictureBox3); + this.panel1.Controls.Add(this.pictureBox2); + this.panel1.Controls.Add(this.Title_label); + this.panel1.Controls.Add(this.AlisPictureBox); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1979, 74); + this.panel1.TabIndex = 2; + // + // pictureBox1 + // + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox1.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon; + this.pictureBox1.Location = new System.Drawing.Point(353, 0); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(60, 72); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 5; + this.pictureBox1.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox3.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.ALIS; + this.pictureBox3.Location = new System.Drawing.Point(220, 0); + this.pictureBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(133, 72); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox3.TabIndex = 4; + this.pictureBox3.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Right; + this.pictureBox2.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.CI; + this.pictureBox2.Location = new System.Drawing.Point(1770, 0); + this.pictureBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(207, 72); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox2.TabIndex = 3; + this.pictureBox2.TabStop = false; + // + // Title_label + // + this.Title_label.BackColor = System.Drawing.Color.White; + this.Title_label.Dock = System.Windows.Forms.DockStyle.Fill; + this.Title_label.Font = new System.Drawing.Font("Times New Roman", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Title_label.Location = new System.Drawing.Point(220, 0); + this.Title_label.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.Title_label.Name = "Title_label"; + this.Title_label.Size = new System.Drawing.Size(1757, 72); + this.Title_label.TabIndex = 2; + this.Title_label.Text = "CP ALIS"; + this.Title_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.Title_label.DoubleClick += new System.EventHandler(this.label1_DoubleClick); + // + // AlisPictureBox + // + this.AlisPictureBox.Dock = System.Windows.Forms.DockStyle.Left; + this.AlisPictureBox.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.Kefico_CI; + this.AlisPictureBox.Location = new System.Drawing.Point(0, 0); + this.AlisPictureBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.AlisPictureBox.Name = "AlisPictureBox"; + this.AlisPictureBox.Size = new System.Drawing.Size(220, 72); + this.AlisPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.AlisPictureBox.TabIndex = 1; + this.AlisPictureBox.TabStop = false; + // + // fluentDesignFormControl1 + // + this.fluentDesignFormControl1.FluentDesignForm = this; + this.fluentDesignFormControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { + this.barCheckItemShowCpLogTime}); + this.fluentDesignFormControl1.Location = new System.Drawing.Point(0, 0); + this.fluentDesignFormControl1.Name = "fluentDesignFormControl1"; + this.fluentDesignFormControl1.Size = new System.Drawing.Size(1979, 46); + this.fluentDesignFormControl1.TabIndex = 2; + this.fluentDesignFormControl1.TabStop = false; + this.fluentDesignFormControl1.TitleItemLinks.Add(this.barCheckItemShowCpLogTime); + // + // barCheckItemShowCpLogTime + // + this.barCheckItemShowCpLogTime.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText; + this.barCheckItemShowCpLogTime.Id = 0; + this.barCheckItemShowCpLogTime.Name = "barCheckItemShowCpLogTime"; + this.barCheckItemShowCpLogTime.CheckedChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.barCheckItemShowCpLogTime_CheckedChanged); + // + // Chktimer + // + this.Chktimer.Interval = 1000; + this.Chktimer.Tick += new System.EventHandler(this.Chktimer_Tick); + // + // UItimer + // + this.UItimer.Interval = 500; + this.UItimer.Tick += new System.EventHandler(this.UItimer_Tick); + // + // notifyIcon + // + this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.notifyIcon.BalloonTipText = "v20230510 Middleware Log Process"; + this.notifyIcon.BalloonTipTitle = "For [ALIS] Middleware Program."; + this.notifyIcon.ContextMenuStrip = this.contextMenuSubStrip; + this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); + this.notifyIcon.Text = "Middleware Log"; + this.notifyIcon.Visible = true; + this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick); + // + // contextMenuSubStrip + // + this.contextMenuSubStrip.Font = new System.Drawing.Font("Times New Roman", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.contextMenuSubStrip.ImageScalingSize = new System.Drawing.Size(24, 24); + this.contextMenuSubStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripSeparator1, + this.toolStripMenuItemExit}); + this.contextMenuSubStrip.Name = "contextMenuSubStrip"; + this.contextMenuSubStrip.Size = new System.Drawing.Size(207, 42); + this.contextMenuSubStrip.Text = "Menu"; + this.contextMenuSubStrip.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuSubStrip_ItemClicked); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(203, 6); + // + // toolStripMenuItemExit + // + this.toolStripMenuItemExit.BackColor = System.Drawing.Color.Khaki; + this.toolStripMenuItemExit.Name = "toolStripMenuItemExit"; + this.toolStripMenuItemExit.Size = new System.Drawing.Size(206, 32); + this.toolStripMenuItemExit.Text = "Program Exit"; + // + // toolStripComboBox1 + // + this.toolStripComboBox1.Margin = new System.Windows.Forms.Padding(1, 0, 1, 0); + this.toolStripComboBox1.Name = "toolStripComboBox1"; + this.toolStripComboBox1.Size = new System.Drawing.Size(121, 23); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1979, 1004); + this.ControlContainer = this.fluentDesignFormContainer1; + this.Controls.Add(this.fluentDesignFormContainer1); + this.Controls.Add(this.fluentDesignFormControl1); + this.FluentDesignFormControl = this.fluentDesignFormControl1; + this.IconOptions.Icon = ((System.Drawing.Icon)(resources.GetObject("MainForm.IconOptions.Icon"))); + this.IconOptions.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon1; + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "SystemX.Net.Middleware.UI - Log CPX v240529"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed); + this.fluentDesignFormContainer1.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.panelMain.ResumeLayout(false); + this.panelProcess.ResumeLayout(false); + this.panelRecv.ResumeLayout(false); + this.paneldDBConn.ResumeLayout(false); + this.panelDBPath.ResumeLayout(false); + this.panelFTP.ResumeLayout(false); + this.panel4.ResumeLayout(false); + this.panelDBLongTerm2.ResumeLayout(false); + this.panelDBLongTerm1.ResumeLayout(false); + this.panel7.ResumeLayout(false); + this.panel8.ResumeLayout(false); + this.panel5.ResumeLayout(false); + this.panel6.ResumeLayout(false); + this.panelDBShortTerm2.ResumeLayout(false); + this.panelDBShortTerm1.ResumeLayout(false); + this.panelDBMain2.ResumeLayout(false); + this.panelDBMain1.ResumeLayout(false); + this.panelSubFunc.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).EndInit(); + this.contextMenuSubStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer fluentDesignFormContainer1; + private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl fluentDesignFormControl1; + private System.Windows.Forms.PictureBox AlisPictureBox; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label Title_label; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Timer Chktimer; + private System.Windows.Forms.Timer UItimer; + private System.Windows.Forms.Panel panelSub2; + private System.Windows.Forms.NotifyIcon notifyIcon; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.ContextMenuStrip contextMenuSubStrip; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExit; + private System.Windows.Forms.ToolStripComboBox toolStripComboBox1; + private System.Windows.Forms.Panel panelSub1; + private System.Windows.Forms.Panel panelSubFunc; + private BarCheckItem barCheckItemShowCpLogTime; + private System.Windows.Forms.Panel panelMain; + private System.Windows.Forms.ProgressBar progressBarProgram; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel paneldDBConn; + private System.Windows.Forms.Panel panelDBShortTerm2; + private System.Windows.Forms.Panel panelDBShortTerm1; + private System.Windows.Forms.Label labelDBShortTerm; + private System.Windows.Forms.Panel panelDBMain2; + private System.Windows.Forms.Panel panelDBMain1; + private System.Windows.Forms.Label labelDBMain; + private System.Windows.Forms.Panel panelProcess; + private System.Windows.Forms.RichTextBox richTextBoxProcess; + private System.Windows.Forms.Panel panelRecv; + private System.Windows.Forms.RichTextBox richTextBoxRecv; + private System.Windows.Forms.Button buttonBulkInsertStart; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label labelBulkCntInfo1; + private System.Windows.Forms.Label labelBulkCntInfo2; + private System.Windows.Forms.Label labelBulkCntInfo3; + private System.Windows.Forms.Label labelBulkTime; + private System.Windows.Forms.Panel panelDBPath; + private System.Windows.Forms.Label labelDBPath; + private System.Windows.Forms.Panel panelFTP; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Label labelFTP; + private System.Windows.Forms.Panel panelDBLongTerm2; + private System.Windows.Forms.Panel panelDBLongTerm1; + private System.Windows.Forms.Label labelDBLongTerm; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Label labelShortTermLogTableName; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Label labelShortTermSummaryTableName; + private System.Windows.Forms.Button buttonDbConnect; + private System.Windows.Forms.Label labelFTPTime; + } +} + diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs new file mode 100644 index 0000000..9195322 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs @@ -0,0 +1,604 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using System.Data.SqlTypes; + +using DevExpress.Utils.DPI; +using DevExpress.Utils.Helpers; +using DevExpress.Data; +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using SystemX.Net.Platform.Common.Util; +using SystemX.Net.Platform.Common.ExtensionMethods; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; + +using SystemX.Net.Middleware.Log.Commons; +using SystemX.Net.Platform.SystemX.Common; +using System.Collections.Concurrent; +using SystemX.Net.Comm.IIS_FTP; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; +using SystemX.Net.Platform.SystemX.Net.XEFCore; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + internal class ConnectInfoStore : ICloneable + { + /// + /// Last Query Info + /// + public int nLastQueryTLStepVersion; + public int nLastQueryTLFileNumber; + public int nLastQueryTLVariantNumber; + + public bool bQueryVRFYLoaded; + + public DataSet getLatestStepVer; + public DataSet geyLatestTestListInfo; + + public DataSet dsLatestVRFYRel; + public DataSet dsLongTermLatestVRFYRel; + + public object Clone() + { + return this; + } + + public void Initialize() + { + nLastQueryTLStepVersion = int.MinValue; + nLastQueryTLFileNumber = int.MinValue; + nLastQueryTLVariantNumber = int.MinValue; + + bQueryVRFYLoaded = false; + + getLatestStepVer = null; + geyLatestTestListInfo = null; + + dsLatestVRFYRel = null; + dsLongTermLatestVRFYRel = null; + } + + public void InitVRFYStatus() + { + nLastQueryTLStepVersion = int.MinValue; + nLastQueryTLFileNumber = int.MinValue; + nLastQueryTLVariantNumber = int.MinValue; + + bQueryVRFYLoaded = false; + + getLatestStepVer = null; + geyLatestTestListInfo = null; + + dsLatestVRFYRel = null; + dsLongTermLatestVRFYRel = null; + } + + public ConnectInfoStore() + { + nLastQueryTLStepVersion = int.MinValue; + nLastQueryTLFileNumber = int.MinValue; + nLastQueryTLVariantNumber = int.MinValue; + + bQueryVRFYLoaded = false; + + getLatestStepVer = null; + geyLatestTestListInfo = null; + + dsLatestVRFYRel = null; + dsLongTermLatestVRFYRel = null; + } + } + + private const int SC_CLOSE = 0xF060; + private const int MF_ENABLED = 0x0; + private const int MF_GRAYED = 0x1; + private const int MF_DISABLED = 0x2; + + [DllImport("user32.dll")] + private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); + + [DllImport("user32.dll")] + private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable); + + private const int MF_BYCOMMAND = 0x00000000; + + [DllImport("user32.dll")] + public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags); + + [DllImport("kernel32.dll", ExactSpelling = true)] + private static extern IntPtr GetConsoleWindow(); + + /// + /// Base Variable + /// + private const int ALL_MANAGE_NUM = 110; + + private const int PORT_DISTRIBUTION_NUM = 10; + + private COMMON.LogProcessInfo LoadInfo; + + private bool MiddlewareLogStartState { set; get; } + + private bool bShowCpLogProcessTime { set; get; } = false; + + //RecvCommandQueue Task + private Stopwatch stCheckReleaseTime; + + private Task taskRecvCommandProcess; + private bool m_bTaskCommandBlock; + + //RecvStreamQueue Task + private Task taskRecvStreamProcess; + private bool m_bTaskStreamBlock; + // + CancellationTokenSource CTS; + CancellationToken CT; + // + private static bool bTaskCommandWaitLock = false; + private static bool bTaskStreamWaitLock = false; + // + //DataBase + private XLogDBConnManager MngDBLogConn; + + private ConnectInfoStore[] thisConnInfo; + + public ConcurrentQueue[] LogDataQueue; + + public ConcurrentQueue LogDataRecvText; + public ConcurrentQueue LogDataProcessText; + + private MapLogOption OptionMapLog; + + private CMapParameter ParamterMapLog; + private CMapParameter ParamterMapInfoLog; + + Int64 nEnqueueCount; + Int64 nDequeueCount; + + private static object objMappedLogDataInOutLock = new object(); + + private static object objMappedLogTextInOutLock = new object(); + private static object objMappedProcessTextInOutLock = new object(); + + private bool[] bBeforeLogReadyState; + private bool[] bCompareLogReadyState; + + // TODO : for Bulk Insert Log + private Stopwatch stCheckTermBulkWaitTime; + + private List lstBulkTermLogInfo; + private List lstBulkShortTermLog; + private List lstBulkLongTermLog; + + private bool bTryBulkInsertBuffer { set; get; } = false; + private int nBulkLogCount { set; get; } = 0; + private int nBulkShortTermCount { set; get; } = 0; + private int nBulkLongTermCount { set; get; } = 0; + private long nBulkTimeValue { set; get; } = 0; + private long nFTPTimeValue { set; get; } = 0; + private bool bDatabaseConnResult { set; get; } = false; + + public object GetConnectInfo(int iPos) + { + return thisConnInfo[iPos]; + } + + public XLogDBConnManager GetDBConn() + { + return MngDBLogConn; + } + + /// + /// TimerLock + /// + private enum TIMER_LOCK + { + CHK_TIMER = 0, + UI_TIMER = 1, + } + + private bool[] m_bTimerLock; + // + private static object objMainCommandWait = new object(); + private static object objShortTermCommandWait = new object(); + private static object objLongTermCommandWait = new object(); + + private static object objMainStreamWait = new object(); + private static object objShortTermStreamWait = new object(); + private static object objLongTermStreamWait = new object(); + + private static object objExcuteMainCommandWait = new object(); + private static object objExcuteShortTermCommandWait = new object(); + private static object objExcuteLongTermCommandWait = new object(); + + private static object objExcuteMainStreamWait = new object(); + private static object objExcuteShortTermStreamWait = new object(); + private static object objExcuteLongTermStreamWait = new object(); + // + //private static object objSingleTransactionDataAccessWait = new object(); + + private static object objClearServerInstanceWait = new object(); + + // TODO : FTP ALIS + public eFTPServiceStatus StateFTP { set; get; } = eFTPServiceStatus.None; + + private CtrlFTP ControlFTP; + + private Stopwatch stProcessCheckFTPTime; + + // TODO : SHM JSON + //private XEFCore CpxShorTermLogJson; + public MainForm()//(XEFCore cpxShorTermLogJson) + { + //CpxShorTermLogJson = cpxShorTermLogJson; + + InitializeComponent(); + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + + @"Use CP-Server[X] Middleware [LOG] Version for [CPXV2][v240529] " + + "[SystemX.Net.Middleware.Log : MainForm]", ConsoleColor.Green, LogMessageLevel.FATAL); + // + EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_GRAYED); + + IntPtr hMenu = GetSystemMenu(GetConsoleWindow(), false); + //EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND); + + ConsoleUtil.ConsoleHide(); + + MessageOutput.PrintLogLevel = LogMessageLevel.INFO; + + nEnqueueCount = 0; + nDequeueCount = 0; + + bBeforeLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize]; + bCompareLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize]; + + CTS = new CancellationTokenSource(); + CT = CTS.Token; + // + string strExcutePos = Environment.CurrentDirectory; + string strServerInfoPos = strExcutePos + @"\Configure\LogInformation.xml"; + string strDBInfoPos = strExcutePos + @"\Configure\DBConnInfo.xml"; + string strMapLogOptionPos = strExcutePos + @"\Configure\MapLogOption.xml"; + + LoadInfo = new COMMON.LogProcessInfo(strServerInfoPos); + + MiddlewareLogStartState = true; + + OptionMapLog = new MapLogOption(strMapLogOptionPos); + + if (OptionMapLog.Load() == false) + { + MiddlewareLogStartState = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load map-log option information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return; + } + else + { + ParamterMapLog = new CMapParameter(); + ParamterMapInfoLog = new CMapParameter(); + + ParamterMapLog.strSetEnterMutexName = OptionMapLog.strMapLogEnterMutexName; + ParamterMapLog.strSetAccessMutexName = OptionMapLog.strMapLogAccessMutexName; + ParamterMapLog.strSetPath = OptionMapLog.strMapLogPath; + ParamterMapLog.strSetFileName = OptionMapLog.strMapLogFileName; + ParamterMapLog.strSetMapName = OptionMapLog.strMapLogName; + + ParamterMapInfoLog.strSetEnterMutexName = OptionMapLog.strMapInfoLogEnterMutexName; + ParamterMapInfoLog.strSetAccessMutexName = OptionMapLog.strMapInfoLogAccessMutexName; + ParamterMapInfoLog.strSetPath = OptionMapLog.strMapInfoLogPath; + ParamterMapInfoLog.strSetFileName = OptionMapLog.strMapInfoLogFileName; + ParamterMapInfoLog.strSetMapName = OptionMapLog.strMapInfoLogName; + } + + if (LoadInfo.Load() == false) + { + MiddlewareLogStartState = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load server information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return; + } + else + { + string strGetTitle = this.Text; + + //this.Text = strGetTitle + " " + (LoadInfo.LOOP_BACK ? " [LocalHost]" : " [" + LoadInfo.SERVER_IP + "]"); + + Title_label.Text = "CP ALIS" + ((LoadInfo.TITLE.Length > 0) ? " [" + LoadInfo.TITLE + "]" : ""); + } + + thisConnInfo = new ConnectInfoStore[ALL_MANAGE_NUM]; + LogDataQueue = new ConcurrentQueue[ALL_MANAGE_NUM]; + + LogDataRecvText = new ConcurrentQueue(); + LogDataProcessText = new ConcurrentQueue(); + + for (int i = 0; i < ALL_MANAGE_NUM; i++) + { + thisConnInfo[i] = new ConnectInfoStore(); + LogDataQueue[i] = new ConcurrentQueue(); + } + + MngDBLogConn = new XLogDBConnManager(); + MngDBLogConn.SetConfigFilePath(strDBInfoPos, true); + + string strGetFileName = Path.GetFileName(MngDBLogConn.GetConfigFilePath()); + string strGetFilePath = Path.GetDirectoryName(MngDBLogConn.GetConfigFilePath()).Split('\\').Last(); + + labelDBPath.Text = @"\" + strGetFilePath + @"\" + strGetFileName; + + bDatabaseConnResult = MngDBLogConn.OpenConnection(); + + if (bDatabaseConnResult) + { + labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]"; + labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]"; + labelShortTermSummaryTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]"; + labelShortTermLogTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]"; + labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]"; + + panelDBMain2.BackColor = Color.LimeGreen; + panelDBShortTerm2.BackColor = Color.LimeGreen; + panelDBLongTerm2.BackColor = Color.LimeGreen; + + //옵션 확인 및 ON + //DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT; + string strGetQuery1 = "DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;"; + string strGetQuery2 = "DECLARE @ARITHIGNORE VARCHAR(3) = 'OFF'; IF ( (128 & @@OPTIONS) = 128 ) SET @ARITHIGNORE = 'ON'; SELECT @ARITHIGNORE AS ARITHIGNORE;"; + /* + SET ARITHIGNORE ON + + - 쿼리 실행 중 오버플로 또는 0으로 나누기 오류에서 오류 메시지를 반환할지 여부를 제어 + +  오류 메시지가 반환될지 여부만 제어하며 이 설정에 상관 없이 오버플로 또는 0으로 나누기 오류를 +  발생시킨 계산에 NULL을 반환한다. 없는 값 처리를 해야하므고 오류를 발생시킨 것에서 null 반환을 받아야 한다! + + SET ARITHABORT ON이면 오버플로 또는 0으로 나누기 오류 발생 시 쿼리나 일괄 처리가 종료 +  트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백시킨다. 그러나 이 설정이 INSERT, UPDATE, DELETE 문 실행 중에 +  발생한 오류에는 영향을 주지 않는다. + */ + DataSet ds1 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery1); + DataSet ds2 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery2); + + if (XCommons.isHasRow(ds1)) + { + bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHABORT ON"); + } + if (XCommons.isHasRow(ds2)) + { + bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHIGNORE ON"); + } + // + ds1 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery1); + ds2 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery2); + + if (XCommons.isHasRow(ds1)) + { + bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHABORT ON"); + } + if (XCommons.isHasRow(ds2)) + { + bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHIGNORE ON"); + } + // + ds1 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery1); + ds2 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery2); + + if (XCommons.isHasRow(ds1)) + { + bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHABORT ON"); + } + if (XCommons.isHasRow(ds2)) + { + bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHIGNORE ON"); + } + + if (MiddlewareLogStartState == false) + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"The table registered in the configuration file does not exist in the actual database. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + else + { + panelDBMain2.BackColor = Color.Red; + panelDBShortTerm2.BackColor = Color.Red; + panelDBLongTerm2.BackColor = Color.Red; + + MiddlewareLogStartState = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to connect to DB and to get table information. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return; + } + + m_bTimerLock = new bool[10]; + Array.Clear(m_bTimerLock, 0, 10); + + if (LoadInfo.FTP_Use) + { + panelFTP.Visible = true; + labelFTP.Text = "FTP " + IPAddress.Parse(LoadInfo.FTP_IPAddress).ToString() + "@" + LoadInfo.FTP_Port + "@" + LoadInfo.FTP_Account; + labelFTPTime.Visible = true; + + StateFTP = StartFTPService(); + + if (StateFTP == eFTPServiceStatus.Connected) + { + stProcessCheckFTPTime = new Stopwatch(); + stProcessCheckFTPTime.Start(); + + panelFTP.BackColor = Color.LimeGreen; + } + else + { + if (MessageBox.Show("FTP server connection is not confirmed. Do you still want to proceed with running the middleware log handler?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + MiddlewareLogStartState = false; + + panelFTP.BackColor = Color.Red; + } + } + else + StateFTP = eFTPServiceStatus.Unused; + + if (MiddlewareLogStartState) + { + stCheckTermBulkWaitTime = new Stopwatch(); + + lstBulkTermLogInfo = new List(); + lstBulkShortTermLog = new List(); + lstBulkLongTermLog = new List(); + + stCheckReleaseTime = new Stopwatch(); + stCheckReleaseTime.Start(); + + taskRecvCommandProcess = null; + m_bTaskCommandBlock = false; + + taskRecvCommandProcess = new Task(new Action(WatchRecvCommandQueue), CT); + taskRecvCommandProcess.Start(); + // + taskRecvStreamProcess = null; + m_bTaskStreamBlock = false; + + taskRecvStreamProcess = new Task(new Action(WatchRecvStreamQueue), CT); + taskRecvStreamProcess.Start(); + // + UItimer.Enabled = true; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"MiddlewareUI start success. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.White, LogMessageLevel.INFO); + } + + Chktimer.Enabled = true; + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (MiddlewareLogStartState == true) + { + if (MessageBox.Show("You want to program exit?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + e.Cancel = true; + else + e.Cancel = false; + } + else + e.Cancel = false; + } + + private void MainForm_FormClosed(object sender, FormClosedEventArgs e) + { + CTS.Cancel(); + + if (taskRecvCommandProcess != null) + { + m_bTaskCommandBlock = true; + + taskRecvCommandProcess.Wait(); + taskRecvCommandProcess.ContinueWith(t => { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + + @"taskRecvCommandProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]", + ConsoleColor.White, + LogMessageLevel.DEBUG); + }); + } + + if (taskRecvStreamProcess != null) + { + m_bTaskStreamBlock = true; + + taskRecvStreamProcess.Wait(); + taskRecvStreamProcess.ContinueWith(t => { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + + @"taskRecvStreamProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]", + ConsoleColor.White, + LogMessageLevel.DEBUG); + }); + } + } + + private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (this.Visible) + this.Visible = false; + else + this.Visible = true; + } + + private void label1_DoubleClick(object sender, EventArgs e) + { + ConsoleUtil.ConsoleVisibleControl(); + } + + private void contextMenuSubStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + ToolStripItem tsi = e.ClickedItem; + + this.Close(); + } + + private void barCheckItemShowCpLogTime_CheckedChanged(object sender, ItemClickEventArgs e) + { + bShowCpLogProcessTime = barCheckItemShowCpLogTime.Checked; + } + + private void buttonBulkInsertStart_Click(object sender, EventArgs e) + { + if (bTryBulkInsertBuffer == false) + bTryBulkInsertBuffer = true; + } + + private void buttonDbConnect_Click(object sender, EventArgs e) + { + bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection(); + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx new file mode 100644 index 0000000..61edbda --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx @@ -0,0 +1,973 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA + IACoJQAA7h4AAAAAAAABACAAQUMAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAA + AAQAAAAEAAAABAAAAAQAAAACAAAAAQAAABIAAAAmAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAA + AC0AAAAtAAAALQAAAC0AAAAqAAAAGwAAAAfQz8+MsK+uo6urq6urq6urrKysq6ysrKusrKyrrKysq6ys + rKusrKyrrKysq6usrKusrKysoKCgoC4uLk0AAAAS+vj4/76onf/p4t7//Pr6//Pv7v/28/H/9fLw//Pu + 7P/z7+3/8+7s//Lu7P/39PP//////+/v7+9NTU1mAAAAF//////BrKL/tp6S/9bIwv+RbVv/rpOG/5t6 + av+ggXL/nXxs/6GBcv+lhnj/o4V2/9fJw//w8PDvTExMZwAAABf/////7+rn/5x7bP/bz8n/m3lp/8i2 + rf+beWn/6eLf/6qOgP/Vx8H/4dfT/6qOgP+vlIb/7/Dw701NTWcAAAAX//////////+8pZv/jmhW/6uP + gf/o4d3/nXxs//Tx7/+1nZH/x7Wr/5t5af+0m4//6ODc//Dw8O9MTExnAAAAF///////////6+Th/4lh + Tv/Zzcb/7ujl/6KCc//18vH/uLTg/8m/yv+cemn/uKGW/7ylmv/Uy8buUlNUYwAAABX///////////38 + /P/e087/+fj3//v5+P/o4Nz//Pz8/+Hg9v/z8vr/5dzX/9HCuv/Sw7z/493Z6WxtbkoAAAAN////Y/// + /2P///9j////Y////2P///9j////Y////2P///9j////Y////2P///9j////ZPr6+lmbm5sUAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD//wAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAADDDgAAww4AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAQAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAFAAAABAAAAAIAAAAAAAAACwAAABYAAAAeAAAAIQAAACEAAAAhAAAAIQAA + ACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAeAAAAFgAA + AAoAAAADDg4OHwcHBzsFBgZQBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUF + BVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVQAQEBOgAAABsAAAAH6+vrstnZ2cDPz8/KzMzMzcvL + y83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzczM + zM6/v7+/NDQ0ZAAAACkAAAAL/////+Tb1v+4n5P/8u3r//////////////////////////////////// + ///////////////////////////////////////////////////v7+/vRkZGdQAAAC8AAAAN/////+zm + 4/+EW0f/wKug///////g1dD/xrOq/8i1rP/azcj/0MC4/8azqv/Gs6r/xrOq/8ezq//Gs6r/xrOq/8az + qv/Zzcb/+ff2///////u7u7vREREdwAAADAAAAAO//////////+5oZb/imNQ/+/q5/+2npL/gVdD/3BB + Kv+8ppv/gFZB/4NZRv+Qa1r/i2VS/4piUP+Qaln/kGpa/5BrWf+DWkb/spiL//38/P/v7+/vREREdwAA + ADAAAAAO///////////r5OH/glhF/8Swp//6+fj/poh6/5FsW//j2tX/gVVB/8y6sv/8+vr/u6Sa/6WI + ef/28/H/+fj3//by8f+3n5P/g1lF//Pv7P/v8PDvREREdwAAADAAAAAO////////////////r5WI/49p + V//c0Mr/gVdD/8u6sv/u6Ob/gFVB/9DAuf//////rZOG/5FuXP/08O//vqid/5ZzY/9/Uz//pYd4//z7 + +v/v7+/vREREdwAAADAAAAAO////////////////5NvX/39UP/+EW0b/jWZU//Xx8P/t5+T/gFVB/9DA + uf//////wayg/62Rgf/SxLz/e1A6/7Sajv/Sw7v/9fHw///////u7u7vREREdwAAADAAAAAO//////// + /////////v39/6uOgf9nNRz/wq2k///////s5uP/f1M//9C/uP//////y8jm/7+64v/UxsD/f1VA/8e0 + q//XysP/1Ma//9rNx//o5uXuRkZGdQAAAC4AAAAN/////////////////////93SzP+Vc2H/8Ovo//// + ///y7ev/o4R1/93SzP//////s7Hm/5mX3v/18vL/tZyQ/41nVP+LZFL/imRR/5p4Z//f2dbsT1BRaQAA + ACgAAAAL//////////////////////r5+P/q5OD//v7+///////+/v7/+/n4//39/P//////+/v+//r6 + /f///////v39//bz8f/08O7/9PDu//bz8f/19PToampqTQAAABgAAAAH////jv///47///+O////jv// + /47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv// + /4/7+/t+lpaWHgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8AKAAAACAA + AABAAAAAAQAgAAAAAAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAFAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAHAAAABwAAAAcAAAAHAAAABgAAAAUAAAADAAAAAQAAAAAAAAAIAAAADwAAABUAAAAZAAAAGwAA + ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAA + ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABoAAAAYAAAAEwAAAAwAAAAFAAAAAgAAABIAAAAiAAAAMwAA + ADwAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA + AD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPgAAADoAAAAvAAAAHQAAAA0AAAAEZmZmLkND + Q0cxMTFgKysrbikpKXIpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykp + KXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMqKipxJycnaQgICE8AAAAwAAAAFQAA + AAf39/fU8PDw2urr6+Dn6Ojk5eXl5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk + 5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5ebm5ubX19fVOzs7cAAA + AD0AAAAbAAAACf/////8+vr/zr61/8e0qv/39PP///////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+/v + 7+5DQ0N8AAAAQwAAAB4AAAAK//////7+/v+0m4//bz8n/86+tv////////////v6+f/49fT/+PX0//j1 + 9P/6+Pf/+ff2//j29P/49vT/+Pb0//j19P/49fT/+Pb0//j29P/49fT/+PX0//j29f/+/f3///////// + ////////7u7u7kFBQX4AAABEAAAAHgAAAAr//////////+ff3P99UT3/lHFf//f08//59/b/rpOF/45o + Vv+Ra1r/lHBf/8e0q/+ihHT/j2tY/49pWP+PaVf/j2lY/5BqWP+Qaln/kGlY/49pWP+PaVj/kWxa/7KX + iv/o4N3////////////u7u7vQUFBfgAAAEQAAAAeAAAACv///////////v7+/7KYjf9wQCn/08S9//Ht + 6/+jhXb/jGZU/2k3H/+AV0L/18rD/3xQO/90RjD/k29f/5RwYP+SbVz/jWhV/5JtXP+UcWD/lHBg/5Vw + YP+SbVz/dUcw/49pV//v6uf//////+7u7u9BQUF+AAAARAAAAB4AAAAK////////////////5dzY/3lN + OP+YdmX/+PX0//38+//EsKf/bTwl/7efk//s5uP/e086/5p3Z//49vT//Pv7/9HCu/+Palj/1Ma///z7 + +//7+vr//fz8//z7+v+zmY3/bTwk/9TGvv//////7u7u70FBQX4AAABEAAAAHgAAAAr///////////// + ///9/Pz/qIt9/3FBKv/ZzMb/9vPx/49qWP9/VED/6uPg/+3o5f97Tjr/nHlq//z7+///////xbOq/2o5 + If/KubD///////Hs6v/Yy8X/vqmf/41mVP91Ri//4NXQ///////u7u7vQUFBfgAAAEQAAAAeAAAACv// + ///////////////////e087/dEUv/55+bv/Jt67/bz8o/7WckP//////7Obj/3tPOv+beWr//Pv7//// + ///Fs6n/ajkg/8q6sf/s5uP/kW1b/3FBKv9xQSr/fFA7/7efk//6+fj//////+7u7u9BQUF+AAAARAAA + AB4AAAAK//////////////////////r5+P+ff3D/bz8n/3tPN/95TDb/49rV///////s5uP/e086/5t5 + av/8+/v//////9TGvv+Ra1X/2c3F/8e2rf9tPCT/sJWI/9zQyv/r5OH//fz8////////////7u7u70FB + QX4AAABEAAAAHgAAAAr//////////////////////////9nMxv9zRC7/ZDEY/6mMfv/9/Pv//////+zm + 4/97Tzr/m3lq//z7+///////6ujz/8C63v/y8fn/yLWs/29AKP/Esaf/8Ovp/+/q5//u6OX/7ejk//Tx + 7//u7u7uQkJCfAAAAEMAAAAeAAAACv//////////////////////////+vj3/5p5aP91SDL/4NbR//// + ////////7ebk/31RPP+ce2v//Pv7//////+6uOj/QTzA/8bE7f/s5N//jGZT/3JELf98UT3/fVI9/31S + Pf98UDr/qY19/+zr6u1GRkZ2AAAAPwAAABwAAAAJ////////////////////////////////zb20/6+V + h//8+/r////////////49fT/zLuz/9jMxf/+/v3//////+bm9/+tq+T/6ur4///////r5eL/wq6k/7GY + iv+xl4v/sZiL/7CWif/NvbT/8PDv61FRUWYAAAAzAAAAFwAAAAf///////////////////////////// + ///6+Pf/9vPx//////////////////////////////////////////////////////////////////// + ///////////////////////////////////39/fnbGxsTQAAAB8AAAAOAAAABf///7b///+2////tv// + /7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv// + /7b///+2////tv///7b///+2////tv///7b///+2////t/v7+6KUlJQoAAAACwAAAAYAAAAC////Bv// + /wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv// + /wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G/v7+BdPT0wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + ////////////////////////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////////////////////////ygA + AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA + AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA + AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA + AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAABAAA + AAUAAAAHAAAACAAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAgAAAAHAAAABQAAAAQAAAACAAAAAQAA + AAAAAAAFAAAACQAAAA0AAAARAAAAEwAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABMAAAARAAAADQAA + AAkAAAAFAAAAAwAAAAEAAAAKAAAAEQAAABoAAAAhAAAAJgAAACkAAAAqAAAAKwAAACsAAAArAAAAKwAA + ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAA + ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAAqAAAAKQAA + ACYAAAAhAAAAGgAAABEAAAAKAAAABQAAAAIAAAARAAAAHAAAACsAAAA3AAAAPwAAAEQAAABGAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA + AEcAAABGAAAARAAAAD8AAAA3AAAAKwAAAB0AAAAQAAAACAAAAAMAAAAVAAAAJQAAADkAAABLAAAAVwAA + AF4AAABhAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA + AGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA + AGIAAABiAAAAYgAAAGIAAABhAAAAXgAAAFgAAABNAAAAPAAAACkAAAAXAAAACwAAAATW1tZswMDAeaur + q4ibm5uVkpKSn42OjqSMjIymi4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL + i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL + i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eMjIymjo6OpIWFhZgfHx9mAAAASgAAADIAAAAdAAAADQAA + AAb+/v78/v7+/P7+/vz+///9/////f7+//39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/v7+/u3t7etFRUV9AAAAUwAA + ADkAAAAgAAAADwAAAAb///////////z7+//j2tX/2MvE/+Xc2P/9/Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+7u + 7u1DQ0OCAAAAWAAAADwAAAAiAAAAEAAAAAf///////////v6+v+1nJD/dUcw/4ZeSf/f1M////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf////////////////bz8n/eEo1/2Y0 + G/+zmYz//fz8//////////////7+//v5+f/6+Pf/+vj3//r49//6+Pf/+vj3//z7+//7+fn/+vj3//r4 + 9//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf//Pv7//// + /////////////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////// + ///59/b/pod5/2czG/+BVkL/5NvW////////////7ejl/6uPgf+efW7/n35w/59+cP+efW//p4p9/9jL + xf+wl4n/nn9u/5+AcP+ff2//nn5v/59+b/+ffm//n35v/59+b/+ff3D/oH9w/6B/cP+ffnD/n35w/59+ + cP+efm7/r5SH/9fJw//28/H//////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA + AAf/////////////////////2s7I/3hLNv9oNh3/s5mM//38+///////wa6j/2s6Iv9lMRn/ZTMa/2Yz + G/9lMhn/lHFf/9zRy/+AVkH/ZTEY/2YyGv9lMhr/ZTEZ/2UxGf9lMhr/ZjIa/2YyGv9mMhr/ZjIa/2Uy + Gv9lMhr/ZjEa/2YxGv9lMhn/aDUc/3RFL/+ninz/8Ozp/////////////////+3t7e5BQUGFAAAAWgAA + AD4AAAAjAAAAEQAAAAf/////////////////////+ff2/6WHef9mMxv/hFtI/+nh3v/+/v7/zLyz/6aJ + ev+ninz/hl5L/2c0G/9uPyf/yLat/+vl4v+BVkL/ZjIa/4ZeSv+niXz/p4l8/6eKe/+miXv/o4R1/6KD + dP+khnn/p4p8/6eKfP+ninz/p4l8/6eKfP+ninz/lXFg/207JP9qOSD/tp6R//38+////////////+3t + 7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf//////////////////////////9fJxP90RjD/aTcf/7ig + lf/+/f3//v79//7+/f/r5eL/jmZV/2UxGP+Qa1n/8Ozq/+zl4v+BVkL/ZjIZ/7CVif/8/Pv//f38//79 + /f/u6OX/qY1//5t7av/Ov7f//f39//39/P/9/fz//fz8//39/P/+/v3/8ezq/5l2Zv9kMRf/jmhV//Lu + 7P///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////////////////////bz + 8v+ce2z/ZTAY/4ZcSf/r5eH////////////Fsaj/bTwk/209Jv/Fsqn//////+vk4f+AVUL/ZjEZ/7GW + iv/+/v7////////////m39v/e1A7/2UzGv+2n5P////////////////////////////8+/v/9PDu/59+ + bv9kMBf/imRQ//Ht6v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////// + ///////////////////Mu7P/cUAo/2w6Iv/DrqX//////+/q5/+Palj/ZTIZ/49qWP/v6uj//////+vk + 4f+AVkL/ZjIa/7GWiv/+/v7////////////m39v/fFE7/2Y1G/+2n5T////////////28/H/28/J/8e1 + rP+qjoH/lXJh/3NDLf9mMxr/qo1///v6+v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA + AAf////////////////////////////////z7+3/lHFf/2UwF/+MZVL/7Obk/86+t/9vPyj/bz4m/8Wy + qP///////////+vk4f+AVkL/ZjIa/7GWi//+/v7////////////m39v/fFE7/2Y1G/+2oJT///////Lu + 7P+qjX7/dkkx/2o5Iv9lMRj/ZTEY/2k2Hv+JYU3/3tTO/////////////////+3t7e5BQUGFAAAAWgAA + AD4AAAAjAAAAEQAAAAf/////////////////////////////////////xbGo/207JP9sOiL/sZaJ/5d1 + Y/9lMRj/iWFP/+3n5f///////////+vk4f+AVkL/ZjIZ/7GWiv/+/v7////////////m3tr/ek85/2Qy + GP+2npL//////8Kvpf9tPCT/ZzUc/35TP/+Tblz/oYBw/7qjmP/n4Nz//v79/////////////////+3t + 7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////////////////////////////7ujl/4xl + U/9lMxn/c0Mq/2s6If9pNx7/tJuP//38+////////////+vk4f+BVkL/ZjIZ/7GWiv/+/v7///////// + ///u6eb/pYZ1/5ZyXv/NvLP//f39/6yShf9lMhj/imJP/9/V0P/18vD/+vj4///+/v////////////// + /////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////////////////////// + /////////////8OupP9uOyT/ZjIa/2UyGv+BV0P/5dzY/////////////////+vk4f+BVkL/ZjIa/7GW + iv/+/v7////////////9/f3/6+jv/+Xh6//6+Pj//v39/62Thv9kMRj/lnNj//Pv7f////////////// + /////////////////////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf///////////// + /////////////////////////////+7n5f+MZFP/ZTIa/2g3H/+zmY3//Pz7/////////////////+vk + 4f+BVkP/ZjIZ/7GWiv/+/v7////////////t7fn/f3vU/2ZhzP/Qz/D//////8Owpv9rOyL/bj4m/55+ + bv+6o5j/uqSZ/7qkmf+6pJj/u6SZ/7qkmP/Dr6X/9PDu/+7u7+1DQ0OBAAAAVwAAADsAAAAiAAAAEAAA + AAf////////////////////////////////////////////+/v+6o5f/aDYe/39WQf/k3Nf///////// + /////////////+vk4f+BVkL/ZjIZ/7GXiv/+/v7////////////g3/T/SUTC/ygit/+in+D///////Dq + 6P+ignT/bT0l/2YzGv9lMxr/ZTIa/2YyGv9mMxr/ZjMa/2UxGP94SzP/49rU//Dx8exHR0d7AAAAUQAA + ADgAAAAgAAAADwAAAAb////////////////////////////////////////////////i2dP/f1ZA/66U + h//8+/v///////////////////////Tx7/+7pJn/rJGD/9THv////v7////////////39/z/pKLh/4aC + 1//f3vT////////////y7uz/yLas/6SGdf+Vc2D/lXNh/5ZzYv+Vc2H/lXNh/5RyYP+kh3b/7ujl//Hy + 8upOTk5wAAAARwAAADEAAAAcAAAADQAAAAX///////////////////////////////////////////// + ///7+fj/ybiu/+be2f/////////////////////////////////+/v7//v7+///+/v////////////// + /////////Pv+//r6/f////////////////////////////r5+P/29PL/9vTy//b08v/29PL/9vTy//b0 + 8v/49vX////+//T09OdbW1tfAAAANwAAACYAAAAWAAAACgAAAAT///////////////////////////// + /////////////////////////f39//7+/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////f39+Rzc3NMAAAAJQAAABoAAAAPAAAABwAAAAP////v////7/// + /+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7/// + /+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7/// + /+/////v////7////+/////v////7////+/////v////8fr6+tOVlZU3AAAAFAAAAA8AAAAJAAAABAAA + AAL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv// + /zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv// + /zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mvv7+yyrq6sKAAAAAwAA + AAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AAP///////wAA////////AAD///////8AAIAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAQAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA + AQAIBgAAAFxyqGYAAEMISURBVHja7b3ZdhtJmuf5N9+xryS4SJQUERmZVVk1PefMe9SD1HNNv0df1Nz1 + nJrpqsrMyAiFJO7Yd9/NrC/MHXA4HRtJkRRlPx0IgNPhMHe4ffbZtxkgkUgkEolEIpFIJBKJRCKRSCQS + iUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKR + SCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJ + RCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFI + JBLJU0I45/y5GyGRfG9wzn3Hcf7Hx48f//u//uu//o9/+7d/GwHQAZB4l9SDZWyLH1jzOvl+5evjF9pz + XwiJ5DuGMMbAGCMQHT9+pOFrtif/jmifvQZ0KQAkkmeCc44wDJUgCBQAavSIO3Fy5FdS79ceMvGaZGy7 + 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 + + + + 17, 17 + + + 123, 21 + + + 220, 24 + + + 329, 28 + + + + AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA + AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyexsbsnsbq7J7G+eyexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb57J7G6uyexsbAAAAALJ7Gyqyexvtsnsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexvtsnsbKrJ7 + G66yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsbrrJ7G/C3fxz/z5Yi/9mgJf/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/2aAl/8+WIv+3fxz/snsb87mCHf/boSX/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k + Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k + Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k + Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/boSX/uYId/9CYI//epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/0Jgj/9ujJv/epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3KMm/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/3aUn//Xl + wv////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////15cL/3aUn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+Cm + J//gpif/26Im//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////26Im/+Cm + J//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CnKP/gpyj/4Kco/+Cn + KP/gpyj/4Kco/+CnKP/gpyj/2KEn//////////////////////////////////////////////////// + ////////////////////////////////////////////////////////xpQj/8mWJP/JliT/yZYk/8iV + JP/my5H/2aIn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn + KP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/2KEn//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////0pwl/9ih + J//YoSf/2KEn/9agJv/WoCb/3KQn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn + KP/gpyj/4Kco/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hpyj/2aEn//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2aEn/+CmKP/u0pT////////////t0pT/36Yo/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+Gn + KP/hpyj/4aco/+GnKP/hpyj/4aco/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/2aIn//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////2KEm/+3SlP//////////////////////7dKU/+CnKP/hqCj/4ago/+Go + KP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+Ko + Kf/iqCn/2qIn//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6s+U/////////////////8ucM//w4sH//////+7S + lf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KpKf/iqSn/4qkp/+Kp + Kf/iqSn/4qkp/+KpKf/iqSn/2qMn//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////Pn + zP/RoTT/8eLB///////u05X/4agp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+Op + Kf/jqSn/46kp/+OpKf/jqSn/46kp/+OpKf/jqSn/2qMn//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///LnDP/8OHB///////06Mz/0qI0//Hiwf//////7tOV/+KoKf/jqSn/46kp/+OpKf/jqSn/46kp/+Op + Kf/jqSn/46kp/+OqKv/jqir/46oq/+OqKv/jqir/46oq/+OqKv/jqir/2qQo//////////////////// + ///////////////////9+/f/7d26/97AfP/Uq1H/06tO/8qYJf/KmCX/06tO/9SrUf/ewHz/7d26//37 + 9//////////////////58+X/0aE1//Diwf//////9OjM/9KiNf/x4sL//////+7Tlf/iqSr/46oq/+Oq + Kv/jqir/46oq/+OqKv/jqir/46oq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+SqKv/kqir/26Qo//// + ////////////////////////+/fw/96/ev/OnTD/0Jsm/9WfJ//YoSj/2qIo/9ukKP/bpCj/2qIo/9ih + KP/Vnyf/0Jsm/86dMP/ev3r/+/fw////////////+vPm/9KiNf/w4sH///////XozP/TojX/8eLC//// + ///v05X/46kq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+WqKv/lqir/5aoq/+WqKv/lqir/5aoq/+Wq + Kv/lqir/3KQo///////////////////////38OD/06RA/9afJ//coyj/36Yp/+KnKf/jqSr/5Kkq/+Wq + Kv/lqir/5Kkq/+OpKv/ipyn/36Yp/9yjKP/Wnyf/06RA//fw4P////////////rz5v/TojX/8eLB//// + ///16Mz/1KI1//Hiwv//////79OV/+SpKv/lqir/5aoq/+WqKv/lqir/5aoq/+WrKv/lqyr/5asq/+Wr + Kv/lqyr/5asq/+WrKv/lqyr/3KUo///////////////////////btWH/2aIo/+GoKf/kqir/5asq/+Wr + Kv/lqyr/5asq/+WrKv/lqyr/5asq/+WrKv/lqyr/5asq/+SqKv/hqCn/2aIo/9u0Xv////////////// + ///69Ob/06M1//Hiwf//////9ejM/9SjNf/x4sL//////+/Ulf/kqir/5asq/+WrKv/lqyr/5asq/+ar + K//mqyv/5qsr/+arK//mqyv/5qsr/+arK//mqyv/3aUp///////////////////////YoSj/46gq/+ar + K//mrjX/7MRu//Ter//57dT/+vDc////////////+vDc//nt1P/03q//7MRu/+auNf/mqyv/46gq/9ih + KP//////////////////////9ejM/9SjNv/x4sL///////XozP/Uozb////////////w1Jb/5aor/+ar + K//mqyv/5qsr/+asK//mrCv/5qwr/+asK//mrCv/5qwr/+asK//mrCv/3aYp//////////////////// + ///dpSn/5Ksr/+/Oh//9+/X///////////////////////////////////////////////////////37 + 9f/vzof/5Ksr/92lKf////////////////////////////XozP/UpDb/8eLC//////////////////// + ////////8NSW/+WrK//mrCv/5qwr/+esK//nrCv/56wr/+esK//nrCv/56wr/+esK//nrCv/3qYp//// + ///////////////////dpSn/892s//////////////////////////////////////////////////// + ////////////////////////892s/92lKf//////////////////////5cuR///////16Mz/1KM2//// + /////////////////////////////+OpKv/nrCv/56wr/+etLP/nrSz/560s/+etLP/nrSz/560s/+et + LP/nrSz/3qcq///////////////////////cpzT//Pjw////////////////////////////5cyU/82a + J//Pmyf/z5sn/8+bJ//Pmyf/z5sn/9CcKP/Vnyn/3aUq/92nL///////////////////////0Jwo/+fN + kv//////////////////////////////////////6M6S/+GoK//nrSz/560s/+itLP/orSz/6K0s/+it + LP/orSz/6K0s/+itLP/orSz/36cq///////////////////////iumP/7tms//////////////////// + /////////////+zRlf/epir/36cq/9+nKv/fpyr/36cq/9+nKv/gpyv/46kr/+a9ZP////////////// + ////////2aIp/9ihKf/nzJL////////////////////////////my5L/2KEp/+SqK//orSz/6K0s/+iu + LP/oriz/6K4s/+iuLP/oriz/6K4s/+iuLP/oriz/36gq///////////////////////68+P/3LFQ/+LF + gv/8+vX////////////////////////////x1Zb/560s/+iuLP/oriz/6K4s/+iuLP/oriz/6rtT//rz + 4///////////////////////3qcq/+KpK//Xoin/5syS/////////////////+bMkv/Xoin/4qkr/+et + LP/oriz/6K4s/+muLf/pri3/6a4t/+muLf/pri3/6a4t/+muLf/pri3/4Kgr//////////////////// + /////////vz3/+jKif/Wpj7/3blq/+rWqf/06tT/9evW////////////78yD/+itLf/pri3/6a4t/+my + Of/w0Ir//vz3////////////////////////////4Kgr/+itLf/jqSz/2KIq/+bMkv//////5syS/9ii + Kv/jqSz/6K0t/+muLf/pri3/6a4t/+mvLf/pry3/6a8t/+mvLf/pry3/6a8t/+mvLf/pry3/4Kgr//// + ///////////////////////////////////+/fr/8uK+/+XHgf/cs1b/2rFT/9KeK//Woiz/5blV/+u+ + Wf/wzoP/9uW+//79+v//////////////////////////////////////4Kgr/+mvLf/ori3/46os/9mj + Kv/Unyn/2aMq/+OqLP/ori3/6a8t/+mvLf/pry3/6a8t/+qvLf/qry3/6q8t/+qvLf/qry3/6q8t/+qv + Lf/qry3/4agr//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4agr/+qv + Lf/qry3/6a4t/+asLP/kqiz/5qws/+muLf/qry3/6q8t/+qvLf/qry3/6q8t/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+uwLv/rsC7/4qks//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/4qks//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////46os/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yx + Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////btFz/0p4p/9OfKf/Tnyn/058p/9OfKf/Zoyr/5qwt/+yxLv/ssS7/7LEu/+yx + Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2x + L//tsS//5Kot//////////////////////////////////////////////////////////////////// + ///////////////////////////////////aoyv////////////////////////////w05X/6a4u/+2x + L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2yL//tsi//7bIv/+2y + L//tsi//7bIv/+2yL//tsi//5Kst//////////////////////////////////////////////////// + ///////////////////////////////////////////////////dpiz//////////////////////+zR + lP/jqy3/67Ev/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6y + L//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//5ast//////////////////////////////////// + ///////////////////////////////////////////////////////////////////dpSz///////// + ////////6M2T/92lLP/orS7/7bEv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6y + L//usi//7rIv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//5awt//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///dpiz////////////ozpP/3aYs/+iuLv/tsi//7rMv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6z + L//usy//7rMv/+6zL//usy//7rMv/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/5awu//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////dpi3//////+jOlP/dpi3/6K4v/+2yMP/uszD/7rMw/+6zMP/uszD/7rMw/+6z + MP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++z + MP/vszD/560u//XnyP////////////////////////////////////////////////////////////// + ///////////////////////////////////fpy3/7dGU/96mLf/pri//7rIw/++zMP/vszD/77Mw/++z + MP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++0MP/vtDD/77Qw/++0 + MP/vtDD/77Qw/++0MP/vtDD/6rAv/96nLf/Xoiv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ah + K//WoSv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ymLP/krC7/5a0u/+mvL//uszD/77Qw/++0 + MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0 + MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/7rMw/+uwL//ori7/560u/+etLv/nrS7/560u/+et + Lv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+qvL//ssS//7rMw/++z + MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0 + MP/wtDD/8LQw//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0 + Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0 + Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0 + Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C1MfDwtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx8/C1MavwtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUxrvG1MSfxtTHt8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTHt8bUxKgAA + AADxtTEb8bUxqPG1MeTxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1 + MajxtTEbAAAAAIAAAAAAAaiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA + AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA + qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA + AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA + qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA + AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA + qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIyAAAAAAAGojCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACyexsGsnsbjbJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G+eyexuNsnsbBrJ7G4eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexuKs3wb6sqSIf/ZoCX/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/ZoCX/ypIh/7N8G+rJkSH/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/ypIh/9qiJv/epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//aoib/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/92lJ//15cL///////////////////////////////////////// + //////////////////////////////////////////////Xlwv/dpSf/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/+CnKP/gpyj/4Kco/+CnKP/gpyj/26Mn//////////////////////////////////// + /////////////////////////////////////////////////////////////9ujJ//gpyj/4Kco/+Cn + KP/gpyj/4Kco/+CnKP/gpyj/4aco/+GnKP/hpyj/4aco/+GnKP/ZoSf///////////////////////// + /////////////////////////////////////////////8eUI//JliT/yZYk/8mVJP/my5H/2qIn/+Gn + KP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hqCj/4ago/+GoKP/hqCj/4ago/9miJ/////////////// + ////////////////////////////////////////////////////////050l/9ihJv/q0JT//////+nP + k//cpCf/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/2qIn//// + ///////////////////////////////////////////////////////////////////ZoSf/7tKV//// + /////////Pjw/+3Slf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/46kp/+OpKf/jqSn/46kp/+Op + Kf/aoyf//////////////////////////////////////////////////////////////////////+rP + lP////////////jy5P/RoDT/+fHh/+7Tlf/iqCn/46kp/+OpKf/jqSn/46kp/+OpKf/kqir/5Koq/+Sq + Kv/kqir/5Koq/9ukKP////////////////////////////////////////////////////////////// + ///////////////////8+fL/0aA1//Xpz//WpDb/+fLh/+/Tlf/jqSr/5Koq/+SqKv/kqir/5Koq/+Wq + Kv/lqir/5aoq/+WqKv/lqir/3KQo////////////////////////////8OLE/9u5bf/VrFH/zZoq/82a + Kv/VrFH/27lt//DixP/////////////////68+b/2aY2//bqz//XpDb/+fLh/+/Tlf/kqSr/5aoq/+Wq + Kv/lqir/5asr/+WrK//lqyv/5asr/+WrK//cpSn/////////////////+vbt/9auVP/RnCf/1qAo/9qj + Kf/cpCn/3KQp/9qjKf/WoCj/0Zwn/9exXP/8+fL////////////69Ob/2ac3//bqz//XpTf/+fLh/+/U + lv/kqiv/5asr/+WrK//mrCv/5qwr/+asK//mrCv/5qwr/92mKf/////////////////duWj/2KIo/9+n + Kv/jqSr/5Ksr/+WrK//lqyv/5Ksr/+OpKv/fpyr/2KIo/9y4Zv/////////////////69Ob/2qg3//bq + z//Ypjf//Pjw//DUlv/lqyv/5qwr/+etLP/nrSz/560s/+etLP/nrSz/3qcq/////////////////9ii + Kf/jqiv/6r9e//Terf/579f////////////579f/9N6t/+q/Xv/jqiv/2KIp/////////////////+jN + kv/69Ob/26k4//rz5f///////////+OqK//nrSz/6K0s/+itLP/orSz/6K0s/+itLP/fpyr///////// + ////////3qUq//DSkf////////////////////////////////////////////DSkf/epSr///////// + ////////054o/+vPk//9+fL////////////pzpL/4qgr/+itLP/priz/6a4s/+muLP/priz/6a4s/+Co + Kv////////////7+/P/dpSr//fv1/////////////////+fPmf/Qmyf/0Z0o/9SeKP/Yoin/4Kgq/9+m + Kv/////////////////bpCn/26Qp/+nOkv//////5syS/9miKf/lqyv/6a4s/+mvLf/pry3/6a8t/+mv + Lf/pry3/4Kgr/////////////////+O6X//pzZD//////////////////////+7Um//fqCv/4Kgr/+Kq + LP/lrCz/6MFp/////////////////9+oK//jqiz/2qQq/9SfKf/Zoyr/46os/+iuLf/pry3/6q8t/+qv + Lf/qry3/6q8t/+qvLf/hqCv//////////////////Pjw/+K4Xv/cs1v/69er//Xq1P/+/fr//v36/+/O + hf/pri3/6a4t/+zBYP/8+fD/////////////////4agr/+muLf/mrCz/5Kos/+asLP/pri3/6q8t/+qv + Lf/rsC7/67Au/+uwLv/rsC7/67Au/+KpLP////////////////////////////TkwP/jvm7/3LFS/9Oe + Kf/Yoir/5rhU/+7GcP/35sH////////////////////////////iqSz/67Au/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os//////////////////////////////////// + /////////////////////////////////////////////////////////////+OqLP/ssS7/7LEu/+yx + Lv/ssS7/7LEu/+yxLv/ssS7/7bEv/+2xL//tsS//7bEv/+2xL//kqi3///////////////////////// + ////////////////////////////////////////////////////////////////////////5Kot/+2x + L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsi//7bIv/+2yL//tsi//7bIv/+SrLf////////////// + /////////////////////////////////////////////////////////////9y0XP/Tnyr/1J8q/9qk + K//nrS7/7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6zL//usy//7rMv/+6zL//usy//5awt//// + ////////////////////////////////////////////////////////////////////////3aYs/+Ss + Lf/lrC3/6K4u/+yyL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//77Mw/++zMP/vszD/77Mw/++z + MP/mrC7///////////////////////////////////////////////////////////////////////// + ///lrC7/7rIw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vtDD/77Qw/++0 + MP/vtDD/77Qw/+euLv/158j///////////////////////////////////////////////////////// + /////////////+atLv/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0 + MP/wtDD/8LQw//C0MP/wtDD/67Av/9+nLf/Yoiv/16Er/9ehK//XoSv/16Er/9ehK//XoSv/16Er/9eh + K//XoSv/16Er/9ehK//dpiz/6q8v//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0 + MP/wtDD/8LUx6vC1Mf/wtTH/8LUx//C1Mf/utDH/67Ew/+ivL//nri//564v/+euL//nri//564v/+eu + L//nri//564v/+euL//nri//564v/+qwMP/utDH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1MerxtTGH8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUxh/G1MQbxtTGE8bUx5PG1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1MYTxtTEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABACAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAsnsbSLJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexvnsnsbSL+IHuzaoSX/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/2qEl/7+IHuzaoSb/36Yn//79+/////////////////////////////// + ///////////////////fpif/36Yn/9+mJ//aoSb/4Kco/+CnKP/+/fv///////////////////////// + ///KlyT/ypck/8qXJP/kypD/4Kco/+CnKP/gpyj/4Kco/+GoKP/hqCj//v37//////////////////// + ////////4ago/+GoKP/pvl//1qAm/+GoKP/hqCj/4ago/+GoKP/jqSn/46kp//79+/////////////// + /////////////+OpKf/x1ZX///////HVlf/jqSn/46kp/+OpKf/jqSn/5aoq/+WqKv/+/fv///////// + ////////////////////////////////////////8tWW/+WqKv/lqir/5aoq/+asK//mrCv//v37//// + ///r06H/2K1N/9CbJ//YrU3/69Oh///////////////////////z1pb/5qwr/+asK//orSz/6K0s//79 + +//p0Jr/4rVV//ns0P//////+ezQ/+K1Vf/ozZL///////////////////////TWl//orSz/6a8t/+mv + Lf/+/fv/4K08//z05P/////////////////89OT/4a48////////////////////////////6a8t/+uw + Lv/rsC7//v37/+u2P//68+P//////9SfKv/Unyr/16Eq/+u2P////////////+nOk///////6c6T/+uw + Lv/tsS//7bEv//79+//23KL/4LJQ//Hguf/tsS//7bEv/+2xL//12Jj////////////hqC3/1qAr/+Go + Lf/tsS//7rMv/+6zL//+/fv///////bepv/luFT/7rMv//HBVv/436f/////////////////7rMv/+6z + L//usy//7rMv/++0MP/vtDD//v37/////////////////////////////////////////////////++0 + MP/vtDD/77Qw/++0MP/vtDDt8LUx/9mkLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mj + LP/wtTH/8LUx//C1Mf/vtDDt8bUxP/G1McnxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTHJ8bUxPwAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA + rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEE= + + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs new file mode 100644 index 0000000..f39e6f9 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using SystemX.Net.Platform.SystemX.Net.XEFCore; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; + +namespace SystemX.Net.MiddlewareUI +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + bool bCreateProgram = false; + + Mutex SetMutex = new Mutex(true, "SystemX.Net.Middleware.UI.Log CPXV2", out bCreateProgram); + + if (bCreateProgram) + { + //종속성 주입 + /* + ServiceCollection collection = new ServiceCollection(); + collection.AddSingleton>(); + collection.AddSingleton(); + + ServiceProvider provider = collection.BuildServiceProvider(); + var shortTermJson = provider.GetService>(); + shortTermJson.SetConnectionString("Server=127.0.0.1;Database=CPXV2ShortTermLogJson;User Id=Alis;Password=Kefico!@34;"); + + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(provider.GetService()); + */ + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + + SetMutex.ReleaseMutex(); + } + else + { + MessageBox.Show("[SystemX.Net.Middleware.UI.Log CPXV2] Already this program excute now. Check the process.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Information); + + return; + } + } + } +} \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5f9d5c0 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SystemX.Net.MiddlewareUI")] +[assembly: AssemblyDescription("SystemX")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("SystemX")] +[assembly: AssemblyProduct("SystemX.Net.MiddlewareUI")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("CP-ServerX")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("83f9d8f8-1fc1-4c57-bef0-9b0f33d4ff9e")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("20.22.11.29")] +[assembly: AssemblyFileVersion("20.22.11.29")] diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d5fe1d7 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs @@ -0,0 +1,193 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace SystemX.Net.MiddlewareUI.Log.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemX.Net.MiddlewareUI.Log.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap ALIS { + get { + object obj = ResourceManager.GetObject("ALIS", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap AppIcon { + get { + object obj = ResourceManager.GetObject("AppIcon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap AppIcon1 { + get { + object obj = ResourceManager.GetObject("AppIcon1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Bubble_16x16 { + get { + object obj = ResourceManager.GetObject("Bubble_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Bubble_32x32 { + get { + object obj = ResourceManager.GetObject("Bubble_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Cancel_16x16 { + get { + object obj = ResourceManager.GetObject("Cancel_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Cancel_32x32 { + get { + object obj = ResourceManager.GetObject("Cancel_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap CI { + get { + object obj = ResourceManager.GetObject("CI", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Database_16x16 { + get { + object obj = ResourceManager.GetObject("Database_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Database_32x32 { + get { + object obj = ResourceManager.GetObject("Database_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Kefico_CI { + get { + object obj = ResourceManager.GetObject("Kefico_CI", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Publish_16x16 { + get { + object obj = ResourceManager.GetObject("Publish_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Publish_32x32 { + get { + object obj = ResourceManager.GetObject("Publish_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx new file mode 100644 index 0000000..f60e153 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Bubble_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Database_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ALIS.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Cancel_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AppIcon.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Cancel_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Publish_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Kefico CI.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Publish_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Bubble_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Database_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AppIcon1.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs new file mode 100644 index 0000000..ea38265 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace SystemX.Net.MiddlewareUI.Log.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings new file mode 100644 index 0000000..8e615f2 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx new file mode 100644 index 0000000..2ee4d98 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx @@ -0,0 +1 @@ +DevExpress.XtraEditors.ProgressBarControl, DevExpress.XtraEditors.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG new file mode 100644 index 0000000000000000000000000000000000000000..cd68b9685be3aa6e6176c81d401071a037d869cd GIT binary patch literal 2689 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 literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png new file mode 100644 index 0000000000000000000000000000000000000000..c993fbfd0f571881c3541a49c9bbc9f7275e6e34 GIT binary patch literal 9557 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 literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bb131172fbf92454f690e6862c8b9e1a86f99722 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XltGF@GD~t&8JrXIl2dc6gG=%YtX(TIORSv|i;As-GLw?> z^Q?WQP1^)iKE>0;F{C1H>SRZ*W(NV5+871(&z$xGJ}HSu&zgT0I(j)p>QaTku8#o* zXCg`kwsm*Bv%d3dNs`%z-;#W3r>ccc3dQ|X`B*L&;WL3#*-cHE|Eb8wPttmQN{dq2 zLY8RGWRwgvVg_;^{Qu@C%&0iKV{*J_prGdGWlCXXf+sdlh+UFY>3?nV8)fMj9m&eL eigUs;XY4OI%sHcD7A698AA_f>pUXO@geCwXy=J-q literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..95e1e9511abf73799fc2036da77f1f87bc20cef7 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G${>1g)%|6RRnW=lNw|31G#^n=yAnZD<_;tqtBO}Z-Aa7_AUSHxpcH zjN)5&cCY9ieKqyX;m5{W0!@BtmhPPwSh>Gx!tcm^ d|BRy;^D|p{lk5DiuLTAGgQu&X%Q~loCICJwlC1y$ literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..25372a509e510378d7a3d603a125e52e920a469d GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XWI>8TGD~t&8C()e5|a{(Q>|T`tb_AQi;`2VgG=&@)@*!L z1XS4M>Eakt5%>1;M&1Sm0oDMv4F!VITxAKYTwd%2GR~*fuAMu;BBEDNcV?nQ5@X|~ zN1_Kl3ir)XP!jCdoq6y8pL&eG`g`eh-rwac9h%rzJ#d`H$hV?Vn>i`j;SHa}KbEUE zTteB_EYRK`c=*@V<^!%`Vl#~5qV4#Tt3P~SP(NeW@tnI$=?3@%RA!TF^{$*I=CCHY0xDTyVC#Sp#=keQTN zoXUKuQVXc(o~MgrNJZS+>xx{54MdK8?E2{#n{N=f(YWW_w(B!=f{jIYJKa4OWNaAi zbw}^wOffaK+TY#kYHZ4}3L;8%YEKTbznwn8!)4E}T@p+-dB^>;-vm5rVk`eru`=$u z)ZO5u<(nsN;+wF@iF@Ws*VZd$4vfr&M;2`0Oi<{PoXx;|WaB}#1HzAPT&`w#KmWjQ z{~ar&=1s7+=_s0$lYQf1&zt_m7KbJ8+MCK0y7n@EyP*%g+*KN0+>*-$mkfksu zDumY=2oL8zopr E02*zQEC2ui literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ed53c82b87e851ebca7d27da65adfa28123602f1 GIT binary patch literal 3946 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 Z@(Z}TJ;G_P$I1Wz002ovPDHLkV1hTKw`c$W literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c5c031f0782edf5e2109d840327c0ba005bb90 GIT binary patch literal 765 zcmVdbW~|{Y-IpYbz*F3b7(tNaBOd3 zWIMeYKEVJ00)9zEK~#8N#n&-t6Hy$;@wB+KC|%O6&>;#6og@dQ1ShvlrF0N+=wb)0 z1mYA2115twIMq^d$Pjf1s4W(YmXfJZiXn@lqLZCUI&^3!)8{wx8;;kzgONZ}ziP(TK+a3knccH33YsQ-qJPyI=NES9l=3Dt^ttmJ{Zb@fZ=xCM=qjT0b? zRSh(t+BvLavQL0XtgC-Q#}_qTHcEh$5*I1@Yx7uATTk77>hEtWYTQ)60B`Xg7py^7 zFdZ?#G*+y(0X)ZxUIB9WjMw;p7V3D4AGn4~IEzsXVNixJs@fHN$9+6NU1NR14su}u zswgPTDNJAr&+r8=v5BwP#UVO!h+Wk-6?hGIG{%I+ET9?`z{3{C15RlLchwe2w?8TY z?c#Qr}4yB zUsBtM6~M_;vHcfh@D0XSH)_klNW8U$ literal 0 HcmV?d00001 diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs new file mode 100644 index 0000000..b26ee76 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs @@ -0,0 +1,1371 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Reflection; +using System.Threading.Tasks; + +using SystemX.Net.Platform.Common.ExtensionMethods; +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using SystemX.Net.Platform.SystemX.Common; +using SystemX.Net.Middleware.Log.Commons; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; + +using CPXV2Log = SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log; +using CPXV2LogJson = SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; +using Newtonsoft.Json; +using SystemX.Common.Util; +using CpTesterPlatform.CpLogUtil; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + static internal class CPXV2_CpLogProcessInfo + { + static public string strProcessDebugInfo = string.Empty; + static public string strGetFileName = string.Empty; + + //Summary 삽입 정보 생성 + static public string strHostID = string.Empty; + static public string strSection = string.Empty; + static public string strStationID = string.Empty; + static public Int64 nShortTermIdent = int.MaxValue; + static public Int64 nLongTermIdent = int.MaxValue; + static public string strStationName = string.Empty; + static public string strProdNo_P = string.Empty; + static public string strProdNo_C = string.Empty; + static public string strTestType = string.Empty; + static public string strTestCode = string.Empty; + static public string strVersion = string.Empty; + static public string strProdCode = string.Empty; + static public string strTestListCntID = string.Empty; + + static public int nTestListFileNo = int.MaxValue; + static public int nTestListVariantNo = int.MaxValue; + static public int nTestListReleaseNo = int.MaxValue; + + static public string strCpLogFileComment = string.Empty; + + static public Dictionary dicCpLogHeader = new Dictionary(); + + static public int nGetReadStepVersion = int.MaxValue; + + /* + * CpLog Header 상 검사 시작 시간 획득 및 맨앞 공백 제거 + */ + static public string strStTime = string.Empty; + + static public long lMainMeasTime = 0; + static public long lLongTermMeasTime = 0; + } + + private DataTable CPXV2_MakeCpLogTable() + { + // Create a new DataTable titled 'Names.' + DataTable logTable = new DataTable("CpLogProcTestResult"); + + // Add three column objects to the table. + DataColumn Column0 = new DataColumn(); + Column0.DataType = System.Type.GetType("System.Int64"); + Column0.ColumnName = "No"; + Column0.AutoIncrement = true; + Column0.AllowDBNull = false; + logTable.Columns.Add(Column0); + + DataColumn Column3 = new DataColumn(); + Column3.DataType = System.Type.GetType("System.Int64"); + Column3.ColumnName = "StepID"; + Column3.AllowDBNull = false; + logTable.Columns.Add(Column3); + + DataColumn Column4 = new DataColumn(); + Column4.DataType = System.Type.GetType("System.Decimal"); + Column4.ColumnName = "MeasVal"; + Column4.AllowDBNull = true; + logTable.Columns.Add(Column4); + + DataColumn Column5 = new DataColumn(); + Column5.DataType = System.Type.GetType("System.String"); + Column5.ColumnName = "MeasValStr"; + Column5.AllowDBNull = true; + logTable.Columns.Add(Column5); + + DataColumn Column6 = new DataColumn(); + Column6.DataType = System.Type.GetType("System.String"); + Column6.ColumnName = "Message"; + Column6.AllowDBNull = true; + logTable.Columns.Add(Column6); + + DataColumn Column7 = new DataColumn(); + Column7.DataType = System.Type.GetType("System.String"); + Column7.ColumnName = "GlobalMin"; + Column7.AllowDBNull = true; + logTable.Columns.Add(Column7); + + DataColumn Column8 = new DataColumn(); + Column8.DataType = System.Type.GetType("System.String"); + Column8.ColumnName = "GlobalMax"; + Column8.AllowDBNull = true; + logTable.Columns.Add(Column8); + + DataColumn Column9 = new DataColumn(); + Column9.DataType = System.Type.GetType("System.String"); + Column9.ColumnName = "Result"; + Column9.AllowDBNull = false; + logTable.Columns.Add(Column9); + + DataColumn Column10 = new DataColumn(); + Column10.DataType = System.Type.GetType("System.String"); + Column10.ColumnName = "SpentTime"; + Column10.AllowDBNull = true; + logTable.Columns.Add(Column10); + + // Create an array for DataColumn objects. + DataColumn[] keys = new DataColumn[1]; + keys[0] = Column0; + logTable.PrimaryKey = keys; + + // Return the new DataTable. + return logTable; + } + + private DataTable CPXV2_MakeProcLogTable() + { + // Create a new DataTable titled 'Names.' + DataTable logTable = new DataTable("TestResult"); + + // Add three column objects to the table. + DataColumn Column0 = new DataColumn(); + Column0.DataType = System.Type.GetType("System.Int64"); + Column0.ColumnName = "No"; + Column0.AllowDBNull = false; + logTable.Columns.Add(Column0); + + DataColumn Column1 = new DataColumn(); + Column1.DataType = System.Type.GetType("System.DateTime"); + Column1.ColumnName = "TestDT"; + Column1.AllowDBNull = true; + logTable.Columns.Add(Column1); + + DataColumn Column2 = new DataColumn(); + Column2.DataType = System.Type.GetType("System.String"); + Column2.ColumnName = "LogData"; + Column2.AllowDBNull = false; + logTable.Columns.Add(Column2); + + // Create an array for DataColumn objects. + DataColumn[] keys = new DataColumn[1]; + keys[0] = Column0; + logTable.PrimaryKey = keys; + + // Return the new DataTable. + return logTable; + } + + private enum eCPXV2_CreateFileInfo + { + SuccessSavePos = 0, + FailedSavePos, + MesSavePos, + CheckLogSavePos + } + + private string CPXV2_GetFileName(LogMappedPacket GetMappedInfo, string strCreateName) + { + Random randNumber = new Random(); + + string strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == true) + { + while (true) + { + strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == false) + break; + } + } + + return strFileName; + } + + private string CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo fileInfo, + LogMappedPacket GetMappedInfo, + int iPos, + string strMakeDate, + bool bGetOnlyFilePath = false) + { + string strMakeInfo = string.Empty; + string strMakeName = string.Empty; + + switch (fileInfo) + { + case eCPXV2_CreateFileInfo.SuccessSavePos: + strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate; + strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\"; + break; + case eCPXV2_CreateFileInfo.FailedSavePos: + strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate; + strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\ProcessingFailed\"; + break; + case eCPXV2_CreateFileInfo.MesSavePos: + strMakeInfo = LoadInfo.MES_SAVE_POS + @"\MESLogSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\"; + strMakeInfo += strMakeDate; + break; + case eCPXV2_CreateFileInfo.CheckLogSavePos: + strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate; + strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\LogCheck\"; + break; + } + + if (Directory.Exists(strMakeInfo) == false) + Directory.CreateDirectory(strMakeInfo); + + if (bGetOnlyFilePath == false) + strMakeName = CPXV2_GetFileName(GetMappedInfo, strMakeInfo); + else + strMakeName = strMakeInfo; + + return strMakeName; + } + + private bool CPXV2_SummaryLastNoCheck(eConnCategory eConnType, ref Int64 nLastNo, ref Int64 nRowCnt) + { + nLastNo = 0; + nRowCnt = 0; + + bool bResult = true; + + string strGetTableName = string.Empty; + + if (eConnType == eConnCategory.ShortTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE; + else if (eConnType == eConnCategory.LongTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE; + else + { + bResult = false; + + return bResult; + } + + try + { + //Summary 테이블 현재 마지막 인덱스 번호 획득 + DataSet ds = QueryStreamProcess(eConnType, "SELECT IDENT_CURRENT('" + strGetTableName + "') AS LastNo"); + bool hasRows = XCommons.isHasRow(ds); + + //인덱스 번호 획득 실패시 예외 + if (hasRows == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Summary Table LogProcess/LastNo Query failed. [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception("[" + CPXV2_CpLogProcessInfo.strGetFileName + "] When the file is in progress."); + } + + //인덱스 번호 변환 실패 예외 + if (Int64.TryParse(ds.Tables[0].Rows[0].ItemArray[0].ToString(), out nLastNo) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess [" + strGetTableName + "] index number conversion failed failed. [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + if (nLastNo == 0) + { + ds = QueryStreamProcess(eConnType, "SELECT ROWS FROM SYS.SYSINDEXES WHERE ID = OBJECT_ID ('" + strGetTableName + "') AND INDID < 2"); + + hasRows = XCommons.isHasRow(ds); + + //인덱스 번호 획득 실패시 예외 + if (hasRows == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Summary Table LogProcess/LastNo Query failed(SYS.SYSINDEXES). [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception("[" + CPXV2_CpLogProcessInfo.strGetFileName + "] When the file is in progress(SYS.SYSINDEXES)."); + } + + nRowCnt = Convert.ToInt64(ds.Tables[0].Rows[0]["ROWS"]); + } + } + catch + { + bResult = false; + } + + return bResult; + } + + private void RegisterCpLogComment(ref int nProcPos, DataRow[] SetMakeLogRows) + { + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + SetMakeLogRows[nProcPos]["StepID"] = "1"; + + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + SetMakeLogRows[nProcPos]["MeasValStr"] = ""; + SetMakeLogRows[nProcPos]["Message"] = CPXV2_CpLogProcessInfo.strCpLogFileComment; + + SetMakeLogRows[nProcPos]["GlobalMin"] = ""; + SetMakeLogRows[nProcPos]["GlobalMax"] = ""; + + SetMakeLogRows[nProcPos]["Result"] = "NONE"; + SetMakeLogRows[nProcPos]["SpentTime"] = "0"; + + nProcPos += 1; + } + + private void RegisterCpLogData(ref int nProcPos, DataTable SetCpLogTable, DataSet dsVRFYInfo, DataRow dr, DataRow[] SetMakeLogRows) + { + string strGetMeasure = string.Empty; + + //CpLog 한행의 정보 획득 + LongLogParamInfo.STEP = dr["STEP"].ToString().Trim(); + LongLogParamInfo.POSITION = dr["POSITION"].ToString().Trim(); + LongLogParamInfo.MO = dr["MO"].ToString().Trim(); + LongLogParamInfo.FNC_NAME = dr["FNC_NAME"].ToString().Trim(); + LongLogParamInfo.MIN = dr["MIN"].ToString().Trim(); + LongLogParamInfo.MEASURE = dr["MEASURE"].ToString().Trim(); + LongLogParamInfo.MAX = dr["MAX"].ToString().Trim(); + LongLogParamInfo.DIM = dr["DIM"].ToString().Trim(); + LongLogParamInfo.CHECK = dr["CHECK"].ToString().Trim(); + LongLogParamInfo.SPENT_TIME = dr["SPENT_TIME"].ToString().Trim(); + LongLogParamInfo.INFO = dr["INFO"].ToString().Trim(); + + LongLogParamInfo.GLOBAL_SPEC = false; + LongLogParamInfo.VRFY_MIN = ""; + LongLogParamInfo.VRFY_MAX = ""; + + //VRFY 키 지정 검색 > 현재의 STEP 이 VRFY 에 존재하면 해당 STEP 의 정보 VRFY 에서 가져옴 + DataRow getDr = dsVRFYInfo.Tables[0].Rows.Find(LongLogParamInfo.STEP); + if (getDr != null) + { + LongLogParamInfo.GLOBAL_SPEC = Convert.ToBoolean(getDr["IsGlobal"]); + + LongLogParamInfo.VRFY_MIN = getDr["SpecMin"].ToString().Trim(); + LongLogParamInfo.VRFY_MAX = getDr["SpecMax"].ToString().Trim(); + } + + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow(); + + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + SetMakeLogRows[nProcPos]["StepID"] = LongLogParamInfo.STEP; + + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + SetMakeLogRows[nProcPos]["MeasValStr"] = ""; + SetMakeLogRows[nProcPos]["Message"] = ""; + + if (LongLogParamInfo.FNC_NAME.IndexOf("PRINTOUT") >= 0) + { + if (LongLogParamInfo.MEASURE.Length > LongLogParamInfo.MessageLength) + { + strGetMeasure = LongLogParamInfo.MEASURE; + strGetMeasure = strGetMeasure.Substring(0, LongLogParamInfo.MessageLength); + + SetMakeLogRows[nProcPos]["Message"] = strGetMeasure; + } + else SetMakeLogRows[nProcPos]["Message"] = LongLogParamInfo.MEASURE; + } + else if (LongLogParamInfo.DIM.IndexOf("STR") >= 0 || + LongLogParamInfo.DIM.IndexOf("STRING") >= 0 || + LongLogParamInfo.DIM.IndexOf("HEX") >= 0 || + LongLogParamInfo.DIM.IndexOf("NONE") >= 0 || + LongLogParamInfo.DIM.IndexOf("BIN") >= 0 || + LongLogParamInfo.DIM == string.Empty) + { + if (LongLogParamInfo.MEASURE.Length > LongLogParamInfo.MessageValLength) + { + strGetMeasure = LongLogParamInfo.MEASURE; + strGetMeasure = strGetMeasure.Substring(0, LongLogParamInfo.MessageValLength); + + SetMakeLogRows[nProcPos]["MeasValStr"] = strGetMeasure; + } + else SetMakeLogRows[nProcPos]["MeasValStr"] = LongLogParamInfo.MEASURE; + } + else + { + //상기 케이스에 다 해당 안될때 Decimal 삽입 아무값이 없을 때 0 삽입 + if (LongLogParamInfo.MEASURE.Length <= 0) + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + else + { + //Measure 존재에 대한 값변환 시도 및 실패시 String 항목으로 삽입 + decimal getMeasValue = decimal.Zero; + if (Decimal.TryParse(LongLogParamInfo.MEASURE, out getMeasValue)) + SetMakeLogRows[nProcPos]["MeasVal"] = getMeasValue; + else + { + //0 삽입 및 Str 에 >> 표시 및 Message 에 데이터 표시 + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + SetMakeLogRows[nProcPos]["MeasValStr"] = ">>"; + SetMakeLogRows[nProcPos]["Message"] = LongLogParamInfo.MEASURE; + } + } + } + + //IS GLOBAL 이면 CpLog 에서 읽은 정보 삽입 아니면 VRFY 에서 읽은 정보 삽입 + if (LongLogParamInfo.GLOBAL_SPEC) + { + SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.MIN; + SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.MAX; + } + else + { + SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.VRFY_MIN; + SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.VRFY_MAX; + + if (LongLogParamInfo.VRFY_MIN.Length <= 0 && + LongLogParamInfo.VRFY_MAX.Length <= 0) + { + if (LongLogParamInfo.MIN.Length > 0 || + LongLogParamInfo.MAX.Length > 0) + { + SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.MIN; + SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.MAX; + } + } + } + + SetMakeLogRows[nProcPos]["Result"] = LongLogParamInfo.CHECK; + SetMakeLogRows[nProcPos]["SpentTime"] = LongLogParamInfo.SPENT_TIME; + + nProcPos += 1; + } + + private DataRow[] CPXV2_ShortProcessMakeLogRows(int nLogCnt, DataSet dsVRFYInfo, DataTable dtLogData) + { + bool bMakeProcResult = true; + + DataRow[] SetMakeLogRows = new DataRow[nLogCnt]; + + int nProcPos = 0; + + //CpLog 삽입할 DataTable 생성 + DataTable SetCpLogTable; + SetCpLogTable = CPXV2_MakeCpLogTable(); + + //읽은 Cplog DataTable DataRow 정보로 DataRow 업데이트 및 Datatable에 삽입 + //현재 VRFY 최근 Step 별 정보로 IsGlobal 일때 Spec 을 가져오거나 측정되어 생성된 Spec 구분하여 처리 + string strGetMeasure = string.Empty; + + string strGetMin = string.Empty; + string strGetMax = string.Empty; + + string strGetVRFYMin = string.Empty; + string strGetVRFYMax = string.Empty; + + //Make Comment Step + try + { + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow(); + + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + RegisterCpLogComment(ref nProcPos, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + "1 Insert log data(CpLog Comment) make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + goto MAKE_ROW_RPCOESS_FAILED; + } + // + foreach (DataRow dr in dtLogData.Rows) + { + try + { + RegisterCpLogData(ref nProcPos, SetCpLogTable, dsVRFYInfo, dr, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + ShortLogParamInfo.STEP + @" Insert log data make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + break; + } + } + + MAKE_ROW_RPCOESS_FAILED: + + if (bMakeProcResult == false) + SetMakeLogRows = null; + + return SetMakeLogRows; + } + + private DataRow[] CPXV2_LongProcessMakeLogRows(int nLogCnt, DataSet dsVRFYInfo, DataTable dtLogData) + { + bool bMakeProcResult = true; + + DataRow[] SetMakeLogRows = new DataRow[nLogCnt]; + + int nProcPos = 0; + + //CpLog 삽입할 DataTable 생성 + DataTable SetCpLogTable; + SetCpLogTable = CPXV2_MakeCpLogTable(); + + //읽은 Cplog DataTable DataRow 정보로 DataRow 업데이트 및 Datatable에 삽입 + //현재 VRFY 최근 Step 별 정보로 IsGlobal 일때 Spec 을 가져오거나 측정되어 생성된 Spec 구분하여 처리 + string strGetMeasure = string.Empty; + + string strGetMin = string.Empty; + string strGetMax = string.Empty; + + string strGetVRFYMin = string.Empty; + string strGetVRFYMax = string.Empty; + + //Make Comment Step + try + { + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow(); + + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + RegisterCpLogComment(ref nProcPos, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + "1 Insert log data(CpLog Comment) make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + goto MAKE_ROW_RPCOESS_FAILED; + } + // + foreach (DataRow dr in dtLogData.Rows) + { + try + { + RegisterCpLogData(ref nProcPos, SetCpLogTable, dsVRFYInfo, dr, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + LongLogParamInfo.STEP + @" Insert log data make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + break; + } + } + + MAKE_ROW_RPCOESS_FAILED: + + if (bMakeProcResult == false) + SetMakeLogRows = null; + + return SetMakeLogRows; + } + + private void CPXV2_MakeSummaryData(int iPos, string strStationName, string strTestListID, string strHostID, string strSection, + ref HISTLogSummary[] summaryItem) + { + summaryItem[0].StationName = strStationName; + summaryItem[0].TestType = CPXV2_CpLogProcessInfo.strTestType; + summaryItem[0].Version = CPXV2_CpLogProcessInfo.strVersion; + summaryItem[0].ProdCode = CPXV2_CpLogProcessInfo.strProdCode; + summaryItem[0].TestListFileNo = CPXV2_CpLogProcessInfo.nTestListFileNo; + summaryItem[0].TestListVariantNo = CPXV2_CpLogProcessInfo.nTestListVariantNo; + summaryItem[0].TestListCntID = strTestListID; + summaryItem[0].StepVersion = CPXV2_CpLogProcessInfo.nGetReadStepVersion; + summaryItem[0].Host = strHostID; + summaryItem[0].Section = strSection; + summaryItem[0].ProdNoC = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString(); + summaryItem[0].ProdNoP = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString(); + summaryItem[0].TestCode = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString(); + summaryItem[0].TestListFileName = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString(); + summaryItem[0].ProductID = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"]; + summaryItem[0].Result = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"]; + summaryItem[0].Duration = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"]; + summaryItem[0].TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + // + summaryItem[1].StationName = strStationName; + summaryItem[1].TestType = CPXV2_CpLogProcessInfo.strTestType; + summaryItem[1].Version = CPXV2_CpLogProcessInfo.strVersion; + summaryItem[1].ProdCode = CPXV2_CpLogProcessInfo.strProdCode; + summaryItem[1].TestListFileNo = CPXV2_CpLogProcessInfo.nTestListFileNo; + summaryItem[1].TestListVariantNo = CPXV2_CpLogProcessInfo.nTestListVariantNo; + summaryItem[1].TestListCntID = strTestListID; + summaryItem[1].StepVersion = CPXV2_CpLogProcessInfo.nGetReadStepVersion; + summaryItem[1].Host = strHostID; + summaryItem[1].Section = strSection; + summaryItem[1].ProdNoC = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString(); + summaryItem[1].ProdNoP = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString(); + summaryItem[1].TestCode = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString(); + summaryItem[1].TestListFileName = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString(); + summaryItem[1].ProductID = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"]; + summaryItem[1].Result = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"]; + summaryItem[1].Duration = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"]; + summaryItem[1].TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + } + + private async Task CPXV2_CheckDuplicateData(eConnCategory eConnType, int iPos, string strStationName, string strHostID, string strSection, Int64 nPreNo) + { + DataSet dsLastSummaryInfo = null; + DataSet dsDateTimeInfo = null; + + string strGetTableName = string.Empty; + + if(nPreNo < 0) + return false; + + if (eConnType == eConnCategory.ShortTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE; + else if (eConnType == eConnCategory.LongTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE; + else + return true; + + string strSummaryQueryText = "SELECT " + + "StationName, " + + "TestType, " + + "Version, " + + "ProdCode, " + + "TestListFileNo, " + + "TestListVariantNo, " + + "TestListCntID," + + "StepVersion, " + + "HostID, " + + "Section, " + + "ProdNo_C, " + + "ProdNo_P, " + + "Testcode, " + + "TestListFileName, " + + "ProductID, " + + "Result, " + + "Duration, " + + "TestDT " + + "FROM [" + strGetTableName + "] " + + "WHERE No = " + nPreNo.ToString() + ";"; + + //직전 Summary Information 획득 + dsLastSummaryInfo = QueryStreamProcess(eConnType, strSummaryQueryText); + + if (XCommons.isHasRow(dsLastSummaryInfo) == false) + return false; + + //직전정보와 이전정보를 비교를 위한 선언 > 검사기측 중복으로 동일 로그를 전송해도 무시 하도록 + string[] strSummaryInsertInfo = new string[18]; + string[] strSummaryBeforeInfo = new string[18]; + + bool bCompareResult = false; + + try + { + //현재 정보중 비교할 정보 삽입 + strSummaryInsertInfo[0] = strStationName; + strSummaryInsertInfo[1] = CPXV2_CpLogProcessInfo.strTestType; + strSummaryInsertInfo[2] = CPXV2_CpLogProcessInfo.strVersion; + strSummaryInsertInfo[3] = CPXV2_CpLogProcessInfo.strProdCode; + strSummaryInsertInfo[4] = CPXV2_CpLogProcessInfo.nTestListFileNo.ToString(); + strSummaryInsertInfo[5] = CPXV2_CpLogProcessInfo.nTestListVariantNo.ToString(); + strSummaryInsertInfo[6] = CPXV2_CpLogProcessInfo.strTestListCntID.ToString(); + strSummaryInsertInfo[7] = CPXV2_CpLogProcessInfo.nGetReadStepVersion.ToString(); + strSummaryInsertInfo[8] = strHostID; + strSummaryInsertInfo[9] = strSection; + strSummaryInsertInfo[10] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString(); + strSummaryInsertInfo[11] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString(); + strSummaryInsertInfo[12] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString(); + strSummaryInsertInfo[13] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString(); + strSummaryInsertInfo[14] = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"]; + strSummaryInsertInfo[15] = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"]; + strSummaryInsertInfo[16] = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"]; + strSummaryInsertInfo[17] = CPXV2_CpLogProcessInfo.strStTime; + + //이전 정보중 비교할 정보 삽입 + strSummaryBeforeInfo[0] = dsLastSummaryInfo.Tables[0].Rows[0][0].ToString(); + strSummaryBeforeInfo[1] = dsLastSummaryInfo.Tables[0].Rows[0][1].ToString(); + strSummaryBeforeInfo[2] = dsLastSummaryInfo.Tables[0].Rows[0][2].ToString(); + strSummaryBeforeInfo[3] = dsLastSummaryInfo.Tables[0].Rows[0][3].ToString(); + strSummaryBeforeInfo[4] = dsLastSummaryInfo.Tables[0].Rows[0][4].ToString(); + strSummaryBeforeInfo[5] = dsLastSummaryInfo.Tables[0].Rows[0][5].ToString(); + strSummaryBeforeInfo[6] = dsLastSummaryInfo.Tables[0].Rows[0][6].ToString(); + strSummaryBeforeInfo[7] = dsLastSummaryInfo.Tables[0].Rows[0][7].ToString(); + strSummaryBeforeInfo[8] = dsLastSummaryInfo.Tables[0].Rows[0][8].ToString(); + strSummaryBeforeInfo[9] = dsLastSummaryInfo.Tables[0].Rows[0][9].ToString(); + strSummaryBeforeInfo[10] = dsLastSummaryInfo.Tables[0].Rows[0][10].ToString(); + strSummaryBeforeInfo[11] = dsLastSummaryInfo.Tables[0].Rows[0][11].ToString(); + strSummaryBeforeInfo[12] = dsLastSummaryInfo.Tables[0].Rows[0][12].ToString(); + strSummaryBeforeInfo[13] = dsLastSummaryInfo.Tables[0].Rows[0][13].ToString(); + strSummaryBeforeInfo[14] = dsLastSummaryInfo.Tables[0].Rows[0][14].ToString(); + strSummaryBeforeInfo[15] = dsLastSummaryInfo.Tables[0].Rows[0][15].ToString(); + strSummaryBeforeInfo[16] = dsLastSummaryInfo.Tables[0].Rows[0][16].ToString(); + strSummaryBeforeInfo[17] = dsLastSummaryInfo.Tables[0].Rows[0][17].ToString(); + + int nDateTimePos = 17; + if (strSummaryBeforeInfo[nDateTimePos].IndexOf("AM") >= 0 || strSummaryBeforeInfo[nDateTimePos].IndexOf("PM") >= 0) + { + string strQueryDateTime = "SELECT DBO.XConvertDateE('" + strSummaryBeforeInfo[nDateTimePos] + "') AS 'DATETIME';"; + + dsDateTimeInfo = QueryStreamProcess(eConnType, strQueryDateTime); + + if (XCommons.isHasRow(dsDateTimeInfo)) + { + strSummaryBeforeInfo[nDateTimePos] = dsDateTimeInfo.Tables[0].Rows[0][0].ToString(); + + strSummaryBeforeInfo[nDateTimePos] = strSummaryBeforeInfo[nDateTimePos].Remove(strSummaryBeforeInfo[nDateTimePos].Length - 8, 8); + } + } + else if (strSummaryBeforeInfo[nDateTimePos].IndexOf("오전") >= 0 || strSummaryBeforeInfo[nDateTimePos].IndexOf("오후") >= 0) + { + string strQueryDateTime = "SELECT DBO.XConvertDateK('" + strSummaryBeforeInfo[nDateTimePos] + "') AS 'DATETIME';"; + + dsDateTimeInfo = QueryStreamProcess(eConnType, strQueryDateTime); + + if (XCommons.isHasRow(dsDateTimeInfo)) + { + strSummaryBeforeInfo[nDateTimePos] = dsDateTimeInfo.Tables[0].Rows[0][0].ToString(); + + strSummaryBeforeInfo[nDateTimePos] = strSummaryBeforeInfo[nDateTimePos].Remove(strSummaryBeforeInfo[nDateTimePos].Length - 8, 8); + } + } + + //동일 한지 비교 + bCompareResult = strSummaryInsertInfo.SequenceEqual(strSummaryBeforeInfo); + } + catch + { + bCompareResult = true; + } + + await Task.Delay(0); + + //True : 같다 / False : 다르다 + return bCompareResult; + } + + private bool CPXV2_CpLogProcess(LogMappedPacket GetMappedInfo, Dictionary dicSetLogFileInfo = null, string strSetLogFilePos = "") + { + int iPos = int.MinValue; + + bool bRequiredProcLogFile = false; + + if (strSetLogFilePos.Length > 0) + bRequiredProcLogFile = true; + + if (bRequiredProcLogFile == false) + iPos = GetMappedInfo.nNumber; + else + iPos = 0; + + bool bProcessResult = true; + bool bDupLogSkipState = false; + + string strProcessDebugInfo = string.Empty; + + if (bRequiredProcLogFile == false) + { + strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" + + "[" + GetMappedInfo.nStreamPort + "]" + + "[" + GetMappedInfo.objHost[0].Data + "]" + + "[" + GetMappedInfo.objSection[0].Data + "]"; + } + else + { + strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" + + "[FTP]" + + "[" + dicSetLogFileInfo["HOST"] + "]" + + "[" + dicSetLogFileInfo["SECTION"] + "]"; + } + + CPXV2_CpLogProcessInfo.strProcessDebugInfo = strProcessDebugInfo; + + string strMakeDate = string.Empty; + + string strSuccessFileName = string.Empty; + string strFailedFileName = string.Empty; + string strGetFileName = string.Empty; + + CpLogHeader getCpLogHeader = null; + + DataTable dtShortLogData = null; + DataTable dtLongLogData = null; + + try + { + //파일생성 위치 및 파일명 생성 + if (bRequiredProcLogFile == false) + { + strMakeDate = DateTime.Now.ToString(@"yyyy\\MM\\dd\\"); + + strSuccessFileName = CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo.SuccessSavePos, GetMappedInfo, iPos, strMakeDate); + strFailedFileName = CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo.FailedSavePos, GetMappedInfo, iPos, strMakeDate); + + strGetFileName = Path.GetFileName(strSuccessFileName); + + byte[] ucGetFileData = new byte[GetMappedInfo.nLogDataSize]; + Array.Copy(GetMappedInfo.ucLogData, 0, ucGetFileData, 0, GetMappedInfo.nLogDataSize); + + byte[] ucSetFileData = null; + + if (GetMappedInfo.objLogType[0].Data == "RAW_SIZE") + ucSetFileData = XDataArchive.DecompressGZipByteToByte(ucGetFileData); + else if (GetMappedInfo.objLogType[0].Data == "FILE_TRANSFER") + ucSetFileData = XDataArchive.DecompressDeflateByteToByte(ucGetFileData); + else + throw new Exception(); + + try + { + File.WriteAllBytes(strSuccessFileName, ucSetFileData); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess [Log File] Create failed. - Need Hard Disk Space Check. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + } + else + strSuccessFileName = strSetLogFilePos; + + //해당 CpLog 파일 읽기 및 헤더 정보 획득 + dtShortLogData = CpLogFileIO.GetLogData(strSuccessFileName, out getCpLogHeader); + + dtLongLogData = dtShortLogData.Copy(); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Log make information failed. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + try + { + //CpLog 파일 읽은 여부 확인 + if (dtShortLogData == null || getCpLogHeader == null) + { + throw new Exception("[" + strGetFileName + "] Reading to CpLog file failed."); + } + + CPXV2_CpLogProcessInfo.strGetFileName = strGetFileName; + + //해당 프로젝트 사용 객체 생성(Summary 생성 관련) + CommonProtocol cp = new CommonProtocol(); + + //Summary 테이블 다중 접근 방지(인덱스) + Stopwatch stMeasTime = new Stopwatch(); + stMeasTime.Start(); + + DataSet ds = null; + + bool hasRows = false; + + Int64 nSummaryRowsCount = 0; + + Int64 nShortTermLastNo = 0; + Int64 nLongTermLastNo = 0; + + Int64 nShortTermPreNo = 0; + Int64 nLongTermPreNo = 0; + + int nLogItemCnt = dtShortLogData.Rows.Count; + //int iNPos = 0; + + if (CPXV2_SummaryLastNoCheck(eConnCategory.ShortTerm, ref nShortTermLastNo, ref nSummaryRowsCount) == false) + throw new Exception(); + else + { + if (nShortTermLastNo == 0) + nShortTermLastNo = nSummaryRowsCount; + else + nShortTermLastNo += 1; + + nShortTermPreNo = nShortTermLastNo - 1; + } + + if (CPXV2_SummaryLastNoCheck(eConnCategory.LongTerm, ref nLongTermLastNo, ref nSummaryRowsCount) == false) + throw new Exception(); + else + { + if (nLongTermLastNo == 0) + nLongTermLastNo = nSummaryRowsCount; + else + nLongTermLastNo += 1; + + nLongTermPreNo = nLongTermLastNo - 1; + } + + //Summary 삽입 정보 생성 + if (bRequiredProcLogFile == false) + { + CPXV2_CpLogProcessInfo.strHostID = GetMappedInfo.objHost[0].Data.Trim(); + CPXV2_CpLogProcessInfo.strSection = GetMappedInfo.objSection[0].Data.Trim(); + CPXV2_CpLogProcessInfo.strStationID = getCpLogHeader.CHANNEL.Trim(); + CPXV2_CpLogProcessInfo.nShortTermIdent = nShortTermLastNo; + CPXV2_CpLogProcessInfo.nLongTermIdent = nLongTermLastNo; + CPXV2_CpLogProcessInfo.strStationName = GetMappedInfo.objStationName[0].Data; + CPXV2_CpLogProcessInfo.strProdNo_P = GetMappedInfo.objProdPNo[0].Data; + CPXV2_CpLogProcessInfo.strProdNo_C = GetMappedInfo.objProdCNo[0].Data; + CPXV2_CpLogProcessInfo.strTestType = GetMappedInfo.objTestType[0].Data; + CPXV2_CpLogProcessInfo.strTestCode = GetMappedInfo.objTestCode[0].Data; + CPXV2_CpLogProcessInfo.strVersion = GetMappedInfo.objVersion[0].Data; + CPXV2_CpLogProcessInfo.strProdCode = GetMappedInfo.objProdCode[0].Data; + CPXV2_CpLogProcessInfo.nTestListVariantNo = (int)GetMappedInfo.nTestListVariantNo; + CPXV2_CpLogProcessInfo.strTestListCntID = GetMappedInfo.objResultTestListCntID[0].Data; + } + else + { + CPXV2_CpLogProcessInfo.strHostID = dicSetLogFileInfo["HOST"]; + CPXV2_CpLogProcessInfo.strSection = dicSetLogFileInfo["SECTION"]; + CPXV2_CpLogProcessInfo.strStationID = getCpLogHeader.CHANNEL.Trim(); + CPXV2_CpLogProcessInfo.nShortTermIdent = nShortTermLastNo; + CPXV2_CpLogProcessInfo.nLongTermIdent = nLongTermLastNo; + CPXV2_CpLogProcessInfo.strStationName = dicSetLogFileInfo["STATION_NAME"]; + CPXV2_CpLogProcessInfo.strProdNo_P = dicSetLogFileInfo["P_TTNR"]; + CPXV2_CpLogProcessInfo.strProdNo_C = dicSetLogFileInfo["TTNR"]; + CPXV2_CpLogProcessInfo.strTestType = dicSetLogFileInfo["TEST_TYPE"]; + CPXV2_CpLogProcessInfo.strTestCode = dicSetLogFileInfo["TEST_CODE"]; + CPXV2_CpLogProcessInfo.strVersion = dicSetLogFileInfo["VERSION"]; + CPXV2_CpLogProcessInfo.strProdCode = dicSetLogFileInfo["PROD_CODE"]; + CPXV2_CpLogProcessInfo.nTestListVariantNo = Convert.ToInt32(dicSetLogFileInfo["VARIANT_NO"]); + CPXV2_CpLogProcessInfo.strTestListCntID = dicSetLogFileInfo["TESTLIST_ID"]; + } + + CPXV2_CpLogProcessInfo.dicCpLogHeader.Clear(); + CPXV2_CpLogProcessInfo.nGetReadStepVersion = int.MaxValue; + + /* + * CpLog Header 상 검사 시작 시간 획득 및 맨앞 공백 제거 + */ + CPXV2_CpLogProcessInfo.strStTime = getCpLogHeader.ST_TIME.Replace("_", " "); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 11, "-"); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 9, "-"); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 4, ":"); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 2, ":"); + + if (CPXV2_CpLogProcessInfo.strStTime[0] == ' ') + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Remove(0, 1); + + try + { + //CpLog 헤더에 대한 항목 Dictionary 생성 > Summary 정보 삽입 위함 + Type type = typeof(CpLogHeader); + FieldInfo[] f = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + + foreach (FieldInfo item in f) + { + CPXV2_CpLogProcessInfo.dicCpLogHeader.Add(item.Name.Substring(item.Name.IndexOf("<") + 1, item.Name.IndexOf(">") - item.Name.IndexOf("<") - 1) + , item.GetValue(getCpLogHeader).ToString().Trim()); + } + // + CPXV2_CpLogProcessInfo.strCpLogFileComment = getCpLogHeader.COMMENT; + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CPXV2 CpLogProcess - CpLogHeader failed to create per-item for header. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + /* + string strQueryTestListInformation = "SELECT A.ProdNo_C, " + + "B.ProdNo_P, " + + "D.TestCode, " + + "B.FileName, " + + "B.UseTLPosition " + + "FROM [PROD_Release] AS A " + + "INNER JOIN(SELECT X.No, X.ProdNo_P, X.TestType, X.Version, X.ProdCode, X.FileName, X.UseTLPosition, X.GroupNo " + + "FROM [PROD_TestList] AS X WITH(NOLOCK) WHERE X.No = " + CpLogProcessInfo.nTestListVariantNo + " " + + "AND TestType = '" + CpLogProcessInfo.strTestType + "' " + + "AND Version = '" + CpLogProcessInfo.strVersion + "' " + + "AND ProdCode = '" + CpLogProcessInfo.strProdCode + "') AS B " + + "ON B.No = " + CpLogProcessInfo.nTestListVariantNo + " " + + "INNER JOIN(SELECT * FROM [PROD_Group] AS Y WITH(NOLOCK)) AS C " + + "ON C.No = B.GroupNo " + + "INNER JOIN(SELECT * FROM [STAT_TestCode] AS Z WITH(NOLOCK)) AS D " + + "ON A.ProdNo_C = '" + CpLogProcessInfo.strProdNo_C + "' " + + "AND D.TestCode = '" + CpLogProcessInfo.strTestCode + "' " + + "AND B.No = A.TestListNo AND D.No = A.TestCodeNo;"; + */ + + string strQueryTestListInformation = $"SELECT X.ProdNo_C, Z.ProdNo_P, Y.TestCode, J.FileName, Z.UseTLPosition, J.No AS 'TestListFileNo', Z.No AS 'VariantNo', J.TestType, J.Version, J.ProdCode " + + $"FROM [PROD_Release] AS X WITH(NOLOCK) " + + $"INNER JOIN [STAT_TestCode] AS Y WITH(NOLOCK) ON X.TestCodeNo = Y.No " + + $"INNER JOIN [PROD_Variant] AS Z WITH(NOLOCK) ON X.VariantNo = Z.No " + + $"INNER JOIN [PROD_Group] AS K WITH(NOLOCK) ON Z.GroupNo = K.No " + + $"INNER JOIN [STOR_TestListFile] AS J WITH(NOLOCK) ON Z.TestListFileNo = J.No " + + $"WHERE X.VariantNo = " + CPXV2_CpLogProcessInfo.nTestListVariantNo + " " + + $"AND X.ProdNo_C = '" + CPXV2_CpLogProcessInfo.strProdNo_C + "' " + + $"AND Y.TestCode = '" + CPXV2_CpLogProcessInfo.strTestCode + "' " + + $"AND J.TestType = '" + CPXV2_CpLogProcessInfo.strTestType + "' " + + $"AND J.Version = '" + CPXV2_CpLogProcessInfo.strVersion + "' " + + $"AND J.ProdCode = '" + CPXV2_CpLogProcessInfo.strProdCode + "' " + + $"ORDER BY X.No ASC;"; + + //Release 테스트리스트 정보 확인 [TestListNo] + strTestType + strTestCode + strVersion + strProdCode + thisConnInfo[iPos].geyLatestTestListInfo = QueryStreamProcess(eConnCategory.Main, strQueryTestListInformation); + + int nLoadPosition = 0; + + if (XCommons.isHasRow(thisConnInfo[iPos].geyLatestTestListInfo)) + nLoadPosition = Convert.ToInt32(thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["UseTLPosition"]); + else + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess fail. Test-list cannot be searched with client information.(TestList Information) [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + int nGetTestListFileNo = int.MaxValue; + int nGetTestListVariantNo = int.MaxValue; + + string strGetTestListFileNo = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestListFileNo"].ToString(); + string strGetTestListVariantNo = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["VariantNo"].ToString(); + + if (int.TryParse(strGetTestListFileNo, out nGetTestListFileNo) == false || + int.TryParse(strGetTestListVariantNo, out nGetTestListVariantNo) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess fail. Test-list cannot be searched with client information.(TestListFileNo or TestListVariantNo) [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + CPXV2_CpLogProcessInfo.nTestListFileNo = nGetTestListFileNo; + CPXV2_CpLogProcessInfo.nTestListVariantNo = nGetTestListVariantNo; + + if (CPXV2_ReadVRFYList(iPos, CPXV2_CpLogProcessInfo.nTestListFileNo, CPXV2_CpLogProcessInfo.nTestListVariantNo, strProcessDebugInfo, out CPXV2_CpLogProcessInfo.nGetReadStepVersion, nLoadPosition, false) == false) + throw new Exception(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + " " + CPXV2_CpLogProcessInfo.nTestListVariantNo + " Failed ReadVRFYList()"); + + //동일 할시 로그 미처리 및 리턴 + var chkDataTsk = CPXV2_CheckDuplicateData(eConnCategory.ShortTerm, iPos, + CPXV2_CpLogProcessInfo.strStationName, + CPXV2_CpLogProcessInfo.strHostID, + CPXV2_CpLogProcessInfo.strSection, + nShortTermPreNo); + + //DB 에 전송한 Summary 객체 생성 + HISTLogSummary[] summaryItem = new HISTLogSummary[2]; + summaryItem[0] = new HISTLogSummary(); + summaryItem[1] = new HISTLogSummary(); + + CPXV2_MakeSummaryData(iPos, + CPXV2_CpLogProcessInfo.strStationName, + CPXV2_CpLogProcessInfo.strTestListCntID, + CPXV2_CpLogProcessInfo.strHostID, + CPXV2_CpLogProcessInfo.strSection, + ref summaryItem); + + Task tskLongTerm = null; + //if (MngDBConn.InfoConnection.UTSI_STATE == false) + + //tskLongTerm = Task.Run(async () => await CpLogProcessLongTerm(iPos, GetMappedInfo, getCpLogHeader, dtLogData, summaryItem[1])); + //var result = task.WaitAndUnwrapException(); + tskLongTerm = Task.Run(() => CPXV2_CpLogProcessLongTerm(iPos, nLongTermLastNo, nLongTermPreNo, getCpLogHeader, dtLongLogData, summaryItem[1])); + //tskLongTerm = CPXV2_CpLogProcessLongTerm(iPos, GetMappedInfo, getCpLogHeader, dtLongLogData, summaryItem[1]); + //tskLongTerm.Start(); + + if (chkDataTsk.Result) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 ShortTerm-CpLogProcess fail. Reason : ShortTerm Duplicated Before CpLog-File. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + bDupLogSkipState = true; + + if (tskLongTerm != null) + lstBulkLongTermLog.Add(tskLongTerm.Result); + + return false; + } + + //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성 + SqlCommand cmd = cp.LogDataSummaryInsert(MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE, summaryItem[0]); + + //Summary 삽입 > 실패시 처리 + bProcessResult = ExcuteNonQueryStreamProcess(eConnCategory.ShortTerm, cmd); + + // TODO : SHM JSON + /* + try + { + CpxShorTermLogJson.Instance.HIST_LogSummary.Add(new CPXV2LogJson.Tables.HIST_LogSummary + { + LogNo = nCurrentLogAccessKey, + LogCount = nLogItemCnt + 1, + StationName = summaryItem[0].StationName, + TestType = summaryItem[0].TestType, + Version = summaryItem[0].Version, + ProdCode = summaryItem[0].ProdCode, + TestListFileNo = summaryItem[0].TestListFileNo, + TestListVariantNo = summaryItem[0].TestListVariantNo, + TestListCntID = summaryItem[0].TestListCntID, + StepVersion = summaryItem[0].StepVersion, + HostID = summaryItem[0].Host, + Section = summaryItem[0].Section, + ProdNo_C = summaryItem[0].ProdNoC, + ProdNo_P = summaryItem[0].ProdNoP, + Testcode = summaryItem[0].TestCode, + TestListFileName = summaryItem[0].TestListFileName, + ProductID = summaryItem[0].ProductID, + Result = summaryItem[0].Result, + Duration = summaryItem[0].Duration, + TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime) + }); + CpxShorTermLogJson.Instance.SaveChanges(); + + } + catch (Exception e) + { + bProcessResult = false; + } + */ + + if (bProcessResult == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CPXV2 CpLogProcess HIST_LogSummary insert failed. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL); + + //throw new Exception(); + } + else + { + //CpLog 삽입할 DataRow 생성 + DataRow[] SetMakeLogRows = CPXV2_ShortProcessMakeLogRows(nLogItemCnt + 1, thisConnInfo[iPos].dsLatestVRFYRel, dtShortLogData); + + if (SetMakeLogRows == null) + throw new Exception(""); + + StringBuilder ShortLogJsonSb = new StringBuilder(); + ShortLogJsonSb.Append(JsonConvert.SerializeObject(SetMakeLogRows.Select(x => new CPXV2Log.Tables.HIST_TestResult + { + StepID = (long)x.ItemArray[1], + MeasVal = (decimal)x.ItemArray[2], + MeasValStr = x.ItemArray[3].ToString(), + Message = x.ItemArray[4].ToString(), + GlobalMin = x.ItemArray[5].ToString(), + GlobalMAx = x.ItemArray[6].ToString(), + Result = x.ItemArray[7].ToString(), + SpentTime = x.ItemArray[8].ToString(), + })).GzipCompress()); + + DataTable SetProcLogTable; + SetProcLogTable = CPXV2_MakeProcLogTable(); + + DataRow SetProcLogDr = SetProcLogTable.NewRow(); + + //Make Comment Step + try + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetProcLogDr["No"] = CPXV2_CpLogProcessInfo.nShortTermIdent; + SetProcLogDr["TestDT"] = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + + if (ShortLogJsonSb.ToString().Length > 0) + SetProcLogDr["LogData"] = ShortLogJsonSb.ToString(); + else + SetProcLogDr["LogData"] = '-'; + } + catch + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + //throw new Exception(""); + } + + lstBulkShortTermLog.Add(SetProcLogDr); + } + + if (tskLongTerm != null) + lstBulkLongTermLog.Add(tskLongTerm.Result); + + //처리 시간 확인 + CPXV2_CpLogProcessInfo.lMainMeasTime = stMeasTime.ElapsedMilliseconds; + + if (GetMappedInfo.bShowCpLogProcessTime) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" MainTime : " + CPXV2_CpLogProcessInfo.lMainMeasTime.ToString() + ", SubTime(LongTerm) : " + CPXV2_CpLogProcessInfo.lLongTermMeasTime + " [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Green, LogMessageLevel.DEBUG); + } + + LogDataProcessText.Enqueue(new StringBuilder(">>[MainTime(ShortTerm)-MakeLogData][" + CPXV2_CpLogProcessInfo.lMainMeasTime + "][Include SubTime(LongTerm)-MakeLogData][" + CPXV2_CpLogProcessInfo.lLongTermMeasTime + "]\r\n")); + } + catch (Exception e) + { + bProcessResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" CPXV2 Make CpLogProcess fail.[SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + finally + { + if (bDupLogSkipState == false) + { + if (bProcessResult) + { + if (File.Exists(strSuccessFileName)) + File.Delete(strSuccessFileName); + } + else + { + if (bRequiredProcLogFile == false) + { + if (File.Exists(strSuccessFileName)) + File.Copy(strSuccessFileName, strFailedFileName); + } + } + } + } + + return bProcessResult; + } + + private async Task CPXV2_CpLogProcessLongTerm(int iPos, Int64 nLongTermNo, Int64 nLongTermPreNo, CpLogHeader getCpLogHeader, DataTable dtLogData, HISTLogSummary summaryItem) + { + Stopwatch stMeasTime = new Stopwatch(); + stMeasTime.Start(); + + bool bProcessResult = true; + + int nLogItemCnt = dtLogData.Rows.Count; + + DataTable SetProcLogTable; + SetProcLogTable = CPXV2_MakeProcLogTable(); + + DataRow SetProcLogDr = SetProcLogTable.NewRow(); + + try + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + //동일 할시 로그 미처리 및 리턴 + var chkDataTsk = CPXV2_CheckDuplicateData(eConnCategory.LongTerm, iPos, + CPXV2_CpLogProcessInfo.strStationName, + CPXV2_CpLogProcessInfo.strHostID, + CPXV2_CpLogProcessInfo.strSection, + nLongTermPreNo); + + CommonProtocol cp = new CommonProtocol(); + + //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성 + SqlCommand cmd = cp.LogDataSummaryInsert(MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE, summaryItem); + + if (chkDataTsk.Result) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 LongTerm-CpLogProcess fail. Reason : LongTerm Duplicated Before CpLog-File. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return SetProcLogDr; + } + + //Summary 삽입 > 실패시 처리 + bProcessResult = ExcuteNonQueryStreamProcess(eConnCategory.LongTerm, cmd); + + if (bProcessResult == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess HIST_LogSummary insert failed. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessLongTerm]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + //CpLog 삽입할 DataRow 생성 + DataRow[] SetMakeLogRows = CPXV2_LongProcessMakeLogRows(nLogItemCnt + 1, thisConnInfo[iPos].dsLongTermLatestVRFYRel, dtLogData); + + if (SetMakeLogRows == null) + throw new Exception(""); + + StringBuilder LongLogJsonSb = new StringBuilder(); + LongLogJsonSb.Append(JsonConvert.SerializeObject(SetMakeLogRows.Select(x => new CPXV2Log.Tables.HIST_TestResult + { + StepID = (long)x.ItemArray[1], + MeasVal = (decimal)x.ItemArray[2], + MeasValStr = x.ItemArray[3].ToString(), + Message = x.ItemArray[4].ToString(), + GlobalMin = x.ItemArray[5].ToString(), + GlobalMAx = x.ItemArray[6].ToString(), + Result = x.ItemArray[7].ToString(), + SpentTime = x.ItemArray[8].ToString(), + })).GzipCompress()); + + //Make Comment Step + try + { + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetProcLogDr["No"] = CPXV2_CpLogProcessInfo.nLongTermIdent; + SetProcLogDr["TestDT"] = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + + if (LongLogJsonSb.ToString().Length > 0) + SetProcLogDr["LogData"] = LongLogJsonSb.ToString(); + else + SetProcLogDr["LogData"] = '-'; + } + catch + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + throw new Exception(""); + } + + //처리 시간 확인 + CPXV2_CpLogProcessInfo.lLongTermMeasTime = stMeasTime.ElapsedMilliseconds; + } + catch (Exception e) + { + bProcessResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 LongTerm Make CpLogProcess fail.[SystemX.Net.MiddlewareUI : MainForm.CpLogProcessLongTerm]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + finally + { + ;// + } + + await Task.Delay(0); + + return SetProcLogDr; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs new file mode 100644 index 0000000..96d7027 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs @@ -0,0 +1,268 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; + +//using SystemX.Common.Protocol.SIA; + +using DevExpress.Utils.Extensions; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using SystemX.Net.Platform.SystemX.Common; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private async void WatchRecvCommandQueue() + { + await Task.Delay(250); + + while (!m_bTaskCommandBlock) + { + try + { + CT.ThrowIfCancellationRequested(); + } + catch (OperationCanceledException CancelEx) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + break; + } + // + try + { + if (bTaskCommandWaitLock == false) + QueryRecvCommandQueue(); + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[1] [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + await Task.Delay(500); + } + } + + private bool LogMemoryPushProcess(int nPos, int nStPos) + { + int nSetSize = int.MaxValue; + byte[] ucSetLogArray = null; + + bool bProcResult = false; + + using (LogSharedMemory memLog = new LogSharedMemory(ParamterMapLog)) + { + if (memLog.CheckFile(nPos)) + { + LogMappedPacket LogMapFile = new LogMappedPacket(); + nSetSize = Marshal.SizeOf(LogMapFile); + ucSetLogArray = new byte[nSetSize]; + LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType()); + + bool bFindLogResult = false; + + LogMapFile = memLog.Get(nPos, nStPos, out bFindLogResult, nSetSize).Value; + + if (bFindLogResult == false) + return false; + + if (LogMapFile.bLogFileReadComplete == false) + { + LogMapFile.bLogFileReadComplete = true; + + memLog.Set(nPos, LogMapFile); + + StringBuilder sb = new StringBuilder(); + sb.Append("[" + (++nEnqueueCount).ToString() + "][Enqueue]"); + sb.Append("["); + sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + sb.Append("], "); + sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], "); + sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], "); + sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], "); + sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], "); + sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], "); + sb.Append("Host [" + LogMapFile.objHost[0].Data + "], "); + sb.Append("Section [" + LogMapFile.objSection[0].Data + "], "); + sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], "); + sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], "); + sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], "); + sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] "); + + /* + sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], "); + sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], "); + sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], "); + sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], "); + sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], "); + sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], "); + sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], "); + sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "] "); + */ + + sb.AppendLine(); + + if (nEnqueueCount >= Int64.MaxValue) + nEnqueueCount = 0; + + LogDataRecvText.Enqueue(sb); + + LogDataQueue[nPos].Enqueue(LogMapFile); + + bProcResult = true; + } + } + } + + return bProcResult; + } + + private bool QueryRecvCommandQueue() + { + bool bState = true; + + string strProcessDebugInfo = string.Empty; + + long l1 = long.MinValue; + long l2 = long.MinValue; + + try + { + bTaskCommandWaitLock = true; + + Stopwatch stProcessTimeChk = new Stopwatch(); + stProcessTimeChk.Start(); + + using (InfoLogSharedMemory memInfoLog = new InfoLogSharedMemory(ParamterMapInfoLog)) + { + InfoLogMappedPacket InfoLogMapFile = new InfoLogMappedPacket(); + int nSetSize = Marshal.SizeOf(InfoLogMapFile); + byte[] ucSetLogArray = new byte[nSetSize]; + InfoLogMapFile = (InfoLogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, InfoLogMapFile.GetType()); + + if (memInfoLog.CheckFile()) + { + bool bFindInfoLogResult = false; + + //로그 처리가 필요한 위치 조회 + bool[] bGetStationReadyLog = memInfoLog.Get(out bFindInfoLogResult, nSetSize); + + if (bFindInfoLogResult == false) + return bState; + + //Array.Copy(bGetStationReadyLog, 0, InfoLogMapFile.bLogDataReady, 0, SharedMemory.nMaxInfoFullAccessSize); + + Array.Clear(bCompareLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize); + for (int i = 0; i < SharedMemory.nMaxInfoFullAccessSize; i++) + { + if (bGetStationReadyLog[i] != bBeforeLogReadyState[i]) + bCompareLogReadyState[i] = true; + } + + //존재할 경우 + if (bCompareLogReadyState.Any(x => x == true)) + { + //존재하는 개수 파악 + bool[] arrCheckNum = Array.FindAll(bCompareLogReadyState, x => x == true); + + //개수 확인 + int nFindCount = arrCheckNum.Count(); + + //개수 만큼 Index 확인 + for (int i = 0; i < nFindCount; i++) + { + Stopwatch stItemTimeChk = new Stopwatch(); + stItemTimeChk.Start(); + + int nIdx = Array.FindIndex(bCompareLogReadyState, x => x == true); + + //Index 포트 변환 및 Station(최대 8) 확인 + int nPos = (nIdx / SharedMemory.nMaxStationSize) + PORT_DISTRIBUTION_NUM; + + int nAccessPart = nIdx / SharedMemory.nMaxStationSize; + int nSubPos = nIdx % SharedMemory.nMaxStationSize; + + if (bCompareLogReadyState[nIdx]) + { + LogMemoryPushProcess(nPos, nSubPos); + + bCompareLogReadyState[nIdx] = false; + } + + l2 = stItemTimeChk.ElapsedMilliseconds; + } + + /*for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskStreamBlock; i++) + { + for (int j = (i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize; + j < ((i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize) + SharedMemory.nMaxStationSize; j++) + { + if (bGetStationReadyLog[j]) + { + LogMemoryProcess(i, j); + + bGetStationReadyLog[j] = false; + } + } + + Thread.Sleep(10); + }*/ + + //memInfoLog.Set(bGetStationReadyLog); + Array.Copy(bGetStationReadyLog, 0, bBeforeLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize); + } + } + + } + + l1 = stProcessTimeChk.ElapsedMilliseconds; + + if (l1 != long.MinValue && l2 != long.MinValue) + { + LogDataRecvText.Enqueue(new StringBuilder(">>[Enqueue-Process][" + l1.ToString() + "][Enqueue-Item][" + l2.ToString() + "]\r\n")); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + bState = false; + } + finally + { + bTaskCommandWaitLock = false; + } + + return bState; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs new file mode 100644 index 0000000..62dff1a --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs @@ -0,0 +1,73 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using SystemX.Net.Platform.Common.ExtensionMethods; +using SystemX.Net.Platform.SystemX.Common; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + /* + private string GetFileName(int iPos, LogMappedPacket GetMappedInfo, string strCreateName, string strSubName) + { + Random randNumber = new Random(); + + string strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == true) + { + while (true) + { + strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == false) + break; + } + } + + return strFileName; + } + */ + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs new file mode 100644 index 0000000..f2ae1ea --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs @@ -0,0 +1,214 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using SystemX.Net.Platform.Common.ExtensionMethods; + +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using System.Net.NetworkInformation; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + public bool CPX_ReadVRFYList(int nConnId, int nTestListNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true) + { + nReadStepVersion = int.MaxValue; + + try + { + string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE; + string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE; + + try + { + //해당 테스트리스 정보 마지막 업데이트 번호 가져오기 + thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WHERE TestlistNo = " + nTestListNo + ";"); + + nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + //이전 버전 사용 일시 + if (nLoadPosition > 0) + nReadStepVersion -= nLoadPosition; + + /* Changed + * 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리) + * > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경 + * > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP + * > INDEX 사용 + */ + if (bForceRead || + (thisConnInfo[nConnId].bQueryVRFYLoaded == false || + thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListNo || + thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion)) + { + try + { + thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, "SELECT * FROM ( " + + "SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + + "AS RN FROM [" + strGetVRFYTableName + "] WITH (INDEX=[CSK_VRFY_Release_1]) WHERE TestlistNo = " + nTestListNo + " " + + "AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;"); + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy(); + + DataColumn[] keys1 = new DataColumn[1]; + keys1[0] = new DataColumn(); + keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1; + + DataColumn[] keys2 = new DataColumn[1]; + keys2[0] = new DataColumn(); + keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2; + + thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListNo; + thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion; + + thisConnInfo[nConnId].bQueryVRFYLoaded = true; + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + } + } + catch + { + return false; + } + + return true; + } + + public bool CPXV2_ReadVRFYList(int nConnId, int nTestListFileNo, int nTestListVariantNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true) + { + nReadStepVersion = int.MaxValue; + + try + { + //HIST_TestListFileLatestStepVersion + //VRFY_TestListFileRelease + + string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE; + string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE; + + try + { + //해당 테스트리스 정보 마지막 업데이트 번호 가져오기 + thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WITH(NOLOCK) WHERE TestListFileNo = " + nTestListFileNo + ";"); + + nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + //이전 버전 사용 일시 + if (nLoadPosition > 0) + nReadStepVersion -= nLoadPosition; + + /* Changed + * 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리) + * > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경 + * > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP + * > INDEX 사용 + */ + if (bForceRead || + (thisConnInfo[nConnId].bQueryVRFYLoaded == false || + thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListFileNo || + thisConnInfo[nConnId].nLastQueryTLVariantNumber != nTestListVariantNo || + thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion)) + { + try + { + string strQueryVRFY = "SELECT * FROM ( " + + "SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + + "AS RN FROM [" + strGetVRFYTableName + "] WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = " + nTestListFileNo + " " + + "AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;"; + + thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, strQueryVRFY); + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy(); + + DataColumn[] keys1 = new DataColumn[1]; + keys1[0] = new DataColumn(); + keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1; + + DataColumn[] keys2 = new DataColumn[1]; + keys2[0] = new DataColumn(); + keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2; + + thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListFileNo; + thisConnInfo[nConnId].nLastQueryTLVariantNumber = nTestListVariantNo; + thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion; + + thisConnInfo[nConnId].bQueryVRFYLoaded = true; + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + } + } + catch + { + return false; + } + + return true; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs new file mode 100644 index 0000000..706d07b --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs @@ -0,0 +1,456 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using SystemX.Net.Middleware.Log.Commons; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private bool IsImageExtension(string strFileNameInfo, bool bOnlyExtension = true) + { + if (bOnlyExtension) + return -1 != Array.IndexOf(COMMON.mediaExtensions, strFileNameInfo.ToUpperInvariant()); + else + return -1 != Array.IndexOf(COMMON.mediaExtensions, Path.GetExtension(strFileNameInfo).ToUpperInvariant()); + } + + public List QueryStreamProcess(string strGetQuery, out byte[] ucQueryByteArray, out DataSet setResultDataSet) + { + SqlDataReader xSqlReader = null; + + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + ucQueryByteArray = null; + + setResultDataSet = null; + + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + DataSet getDS = Task.Run(() => + { + try + { + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + + return ds; + }).Result; + + if(XCommons.isHasRow(ds)) + setResultDataSet = ds.Copy(); + + List getStreamList = XCommons.ObjectToByteStreamList(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.RAW_SIZE), getDS); + + return getStreamList; + } + + public void QueryResultRemake(DataSet dsResult, int iSetFieldCnt, int iSetRecordsAffectedCnt, bool bSetHasRow, out byte[] ucQueryByteArray, params string[] strParameters) + { + int iFieldCnt = iSetFieldCnt; + int iRecordsAffectedCnt = iSetRecordsAffectedCnt; + bool bHasRow = bSetHasRow; + + ucQueryByteArray = null; + + ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER), + dsResult, + null, + 0, + iRecordsAffectedCnt, + bHasRow, + iFieldCnt, + strParameters); + } + + public Tuple QueryProcess(string strGetQuery, out byte[] ucQueryByteArray, params string[] strParameters) + { + SqlDataReader xSqlReader = null; + + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + ucQueryByteArray = null; + + DataSet getDS = Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + + return ds; + }).Result; + + ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER), + getDS, + null, + 0, + iRecordsAffectedCnt, + bHasRow, + iFieldCnt, + strParameters); + + return new Tuple(getDS, iRecordsAffectedCnt, iFieldCnt, bHasRow); + } + + private bool ExcuteNonQueryCommandProcess(SqlCommand cmd) + { + return Task.Run(() => + { + bool bExcuteResult = true; + + try + { + try + { + bExcuteResult = MngDBLogConn.CurrentConnection(eConnCategory.Main).ExecuteNonCommandQuery(cmd); + } + catch (Exception e) + { + bExcuteResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + ; + } + + return bExcuteResult; + }).Result; + } + + private bool ExcuteNonQueryStreamProcess(eConnCategory eConnType, SqlCommand cmd) + { + return Task.Run(() => + { + bool bExcuteResult = true; + + try + { + try + { + bExcuteResult = MngDBLogConn.CurrentConnection(eConnType).ExecuteNonStreamQuery(cmd); + } + catch (Exception e) + { + bExcuteResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + ; + } + + return bExcuteResult; + }).Result; + } + + private DataSet QueryCommandProcess(eConnCategory eConnType, string strGetQuery, bool bUseTransaction = false) + { + return Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + SqlDataReader xSqlReader = null; + + try + { + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryCommandDatabase(strGetQuery, bUseTransaction); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + } + finally + { + ; + } + + return ds; + }).Result; + } + + private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery) + { + return Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + SqlDataReader xSqlReader = null; + + try + { + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + } + finally + { + ; + } + + return ds; + }).Result; + } + + private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery, ref int nRecAffectedCnt) + { + nRecAffectedCnt = -2; + + int iFieldCnt = 0; + int iRecordsAffectedCnt = -2; + bool bHasRow = false; + + DataSet dsResult = null; + + dsResult = Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + SqlDataReader xSqlReader = null; + + try + { + + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + //Default -2 Fail 0 Select -1 + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + } + finally + { + ; + } + + return ds; + }).Result; + + nRecAffectedCnt = iRecordsAffectedCnt; + + return dsResult; + } + + private DataSet QueryProcess(string strGetQuery) + { + return Task.Run(() => + { + SqlDataReader xSqlReader = null; + + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + try + { + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabaseSub(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + + return ds; + }).Result; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs new file mode 100644 index 0000000..8a544a2 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs @@ -0,0 +1,701 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.IO.Compression; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using SystemX.Net.Middleware.Log.Commons; +using SystemX.Net.Platform.SystemX.Common; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using SystemX.Net.Middleware.Log.DeleteProc; +using SystemX.Net.Comm.IIS_FTP; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private async void WatchRecvStreamQueue() + { + await Task.Delay(250); + + stCheckTermBulkWaitTime.Start(); + while (!m_bTaskStreamBlock) + { + try + { + CT.ThrowIfCancellationRequested(); + } + catch (OperationCanceledException CancelEx) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + break; + } + // + try + { + if (bDatabaseConnResult == false) + continue; + + if (MngDBLogConn.GetMainDBAccessTime() >= 120000) + QueryStreamProcess(eConnCategory.Main, "SELECT GETDATE() AS 'CHECK PING';"); + if (MngDBLogConn.GetShortTermDBAccessTime() >= 120000) + QueryStreamProcess(eConnCategory.ShortTerm, "SELECT GETDATE() AS 'CHECK PING';"); + if (MngDBLogConn.GetLongTermDBAccessTime() >= 120000) + QueryStreamProcess(eConnCategory.LongTerm, "SELECT GETDATE() AS 'CHECK PING';"); + + nBulkLogCount = lstBulkTermLogInfo.Count; + nBulkLongTermCount = lstBulkShortTermLog.Count; + nBulkShortTermCount = lstBulkLongTermLog.Count; + nBulkTimeValue = stCheckTermBulkWaitTime.ElapsedMilliseconds; + + if (stCheckTermBulkWaitTime.ElapsedMilliseconds >= LoadInfo.BULK_ProcessTime_ms || bTryBulkInsertBuffer) + { + Stopwatch stMeasProcTime = new Stopwatch(); + + if (lstBulkTermLogInfo.Count > 0) + { + stMeasProcTime.Start(); + + foreach (string str in lstBulkTermLogInfo.ToArray()) + { + LogDataRecvText.Enqueue(new StringBuilder(str)); + LogDataRecvText.Enqueue(new StringBuilder("\r\n")); + } + + lstBulkTermLogInfo.Clear(); + } + // + if(lstBulkShortTermLog.Count > 0) + SetLogDataInsertProc(eConnCategory.ShortTerm); + if (lstBulkLongTermLog.Count > 0) + SetLogDataInsertProc(eConnCategory.LongTerm); + + BULK_INSERT_EXIT: + + if (stMeasProcTime.IsRunning) + { + LogDataRecvText.Enqueue(new StringBuilder(">>[BulkInsert-Process][" + stMeasProcTime.ElapsedMilliseconds.ToString() + "]\r\n")); + + //Check Server Time And Db Change + bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection(); + } + + bTryBulkInsertBuffer = false; + + stCheckTermBulkWaitTime.Restart(); + } + + //Map Log File Check + if (bTaskStreamWaitLock == false) + QueryRecvStreamQueue(); + + // TODO : FTP ALIS + if (StateFTP != eFTPServiceStatus.Connected) + goto ROUTINE_END; + + //FTP Server Check + nFTPTimeValue = stProcessCheckFTPTime.ElapsedMilliseconds; + + if (stProcessCheckFTPTime.ElapsedMilliseconds >= LoadInfo.FTP_ScanTime_ms) + { + List lstFile = ControlFTP.PositionRootCheckList(); + + List lstDownlaodFile = new List(); + List lstDeleteFailedFile = new List(); + + if (lstFile.Count == 0) + goto BRANCH_EXIT; + + string strGetDownloadPath = GetFTPDownloadPath(); + + foreach (string f in lstFile) + lstDownlaodFile.Add(await ControlFTP.FileDownload(f, strGetDownloadPath)); + + foreach (string f in lstDownlaodFile) + { + string strGetFileName = Path.GetFileName(f); + + if (ControlFTP.DeleteFile(strGetFileName) == false) + lstDeleteFailedFile.Add(strGetFileName); + } + + BRANCH_EXIT: + + ProcFTPCheckLogFiles(); + + foreach (string f in lstDeleteFailedFile) + { + string strGetFileName = Path.GetFileName(f); + + if (ControlFTP.DeleteFile(strGetFileName) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"FTP > file delete process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + + stProcessCheckFTPTime.Restart(); + } + + ROUTINE_END:; + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + await Task.Delay(100); + } + } + + private void SetLogDataInsertProc(eConnCategory SetCategory) + { + bool bBulkCopyResult = true; + + string strSetLogTable = string.Empty; + string strAddText = string.Empty; + + if (SetCategory == eConnCategory.ShortTerm) + { + strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE; + strAddText = "ShortTerm"; + } + else if (SetCategory == eConnCategory.LongTerm) + { + strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.LOG_TABLE; + strAddText = "LongTerm"; + } + + try + { + //LogData Set Bulk + using (SqlTransaction sqlTran = MngDBLogConn.CurrentConnection(SetCategory).getConnection().BeginTransaction()) + { + //Sql Bulk Insert 준비 - Short Log + //Make Result Command + SqlBulkCopy sbc = new SqlBulkCopy(sqlTran.Connection, + SqlBulkCopyOptions.CheckConstraints | + SqlBulkCopyOptions.FireTriggers | + SqlBulkCopyOptions.KeepNulls, sqlTran); + sbc.BatchSize = 5000; + sbc.DestinationTableName = "dbo." + strSetLogTable; + sbc.BulkCopyTimeout = 120; + + try + { + // Write from the source to the destination. + //생성된 DataRow 들을 Bulk Copy 실시 + if (SetCategory == eConnCategory.ShortTerm) + sbc.WriteToServer(lstBulkShortTermLog.ToArray()); + else if (SetCategory == eConnCategory.LongTerm) + sbc.WriteToServer(lstBulkLongTermLog.ToArray()); + + //if (MngDBConn.InfoConnection.UTSI_STATE) + //{ + // //Long Log + // SqlBulkCopy sbcL = new SqlBulkCopy(sqlTran.Connection, + // SqlBulkCopyOptions.CheckConstraints | + // SqlBulkCopyOptions.FireTriggers | + // SqlBulkCopyOptions.KeepNulls, sqlTran); + // sbcL.BatchSize = 5000; + // sbcL.DestinationTableName = "dbo.HIST_TestResultLongTerm"; + // sbcL.BulkCopyTimeout = 120; + // + // sbcL.WriteToServer(SetMakeLogRows); + //} + } + catch (Exception ex) + { + Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + $@" CPXV2 CpLogProcess fail.({strAddText} - Bulk Upload) [SystemX.Net.MiddlewareUI : MainForm.SetLogDataInsertProc]\r\n" + ex.Message, ConsoleColor.Red, LogMessageLevel.FATAL); + + bBulkCopyResult = false; + } + finally + { + // Close the SqlDataReader. The SqlBulkCopy + // object is automatically closed at the end + // of the using block. + if (bBulkCopyResult) + { + sqlTran.Commit(); + + if (SetCategory == eConnCategory.ShortTerm) + lstBulkShortTermLog.Clear(); + else if (SetCategory == eConnCategory.LongTerm) + lstBulkLongTermLog.Clear(); + + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [OK]>\r\n")); + } + else + { + sqlTran.Rollback(); + + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [NOK]>\r\n")); + + //throw new Exception(); + } + } + } + } + catch + { + ;// + } + finally + { + ;// + } + + if (bBulkCopyResult == false) + { + CommonProtocol cp = new CommonProtocol(); + + List lstRefRow = null; + + if (SetCategory == eConnCategory.ShortTerm) + lstRefRow = lstBulkShortTermLog; + else if (SetCategory == eConnCategory.LongTerm) + lstRefRow = lstBulkLongTermLog; + + foreach (DataRow dr in lstRefRow) + { + if (Convert.ToInt64(dr["No"]) == Int64.MinValue) + continue; + + //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성 + SqlCommand cmd = cp.LogDataResultInsert(strSetLogTable, dr); + + //Summary 삽입 > 실패시 처리 + bool bProcessResult = ExcuteNonQueryStreamProcess(SetCategory, cmd); + + if (bProcessResult == false) + { + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [NOK]>\r\n")); + + continue; + } + else + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [OK]>\r\n")); + } + + if (SetCategory == eConnCategory.ShortTerm) + lstBulkShortTermLog.Clear(); + else if (SetCategory == eConnCategory.LongTerm) + lstBulkLongTermLog.Clear(); + } + } + + private bool QueryRecvStreamQueue() + { + //StackTrace st = new StackTrace(true); + + bool bState = true; + + string strProcessDebugInfo = string.Empty; + + long l1 = long.MinValue; + long l2 = long.MinValue; + + try + { + bTaskStreamWaitLock = true; + + //Log Process + Stopwatch stProcessTimeChk = new Stopwatch(); + stProcessTimeChk.Start(); + + for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskCommandBlock; i++) + { + Stopwatch stItemTimeChk = new Stopwatch(); + stItemTimeChk.Start(); + + if (LogDataQueue[i].Count <= 0) + continue; + + LogMappedPacket LogMapFile = new LogMappedPacket(); + int nSetSize = Marshal.SizeOf(LogMapFile); + byte[] ucSetLogArray = new byte[nSetSize]; + LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType()); + + int iPos = LogMapFile.nNumber; + strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" + + "[" + LogMapFile.nCommandPort + "]" + + "[" + LogMapFile.objHost[0].Data + "]" + + "[" + LogMapFile.objSection[0].Data + "]"; + // + if (LogDataQueue[i].TryPeek(out LogMapFile)) //LogDataQueue[i].TryDequeue(out LogMapFile)) + { + if (bShowCpLogProcessTime) + LogMapFile.bShowCpLogProcessTime = true; + + StringBuilder sb = new StringBuilder(); + sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]"); + sb.Append("["); + sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + sb.Append("], "); + sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], "); + sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], "); + sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], "); + sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], "); + sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], "); + sb.Append("Host [" + LogMapFile.objHost[0].Data + "], "); + sb.Append("Section [" + LogMapFile.objSection[0].Data + "], "); + sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], "); + sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], "); + sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], "); + sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] "); + sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], "); + sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], "); + sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], "); + sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], "); + sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], "); + sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], "); + sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], "); + sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "], "); + + if (nDequeueCount >= Int64.MaxValue) + nDequeueCount = 0; + + bool bProcResult = false; + + if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPX) + { + sb.Append("!Use Log Process Version [CPX] - No longer supported."); + + //bProcResult = CPX_CpLogProcess(LogMapFile); + + bProcResult = false; + } + else if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPXV2) + { + bProcResult = CPXV2_CpLogProcess(LogMapFile); + + if(bProcResult == true) + lstBulkTermLogInfo.Add(sb.ToString()); + + sb.Append("!Use Log Process Version [CPXV2] "); + } + + if (bProcResult) + sb.Append(""); + else + sb.Append(""); + + sb.AppendLine(); + + LogDataProcessText.Enqueue(sb); + + if (LogDataQueue[i].TryDequeue(out LogMapFile) == false) + { + if (LogDataQueue[i].TryDequeue(out LogMapFile) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue try-dequeue failed. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + } + + l2 = stItemTimeChk.ElapsedMilliseconds; + } + + l1 = stProcessTimeChk.ElapsedMilliseconds; + + if (l1 != long.MinValue && l2 != long.MinValue) + { + LogDataProcessText.Enqueue(new StringBuilder(">>[TryDequeue-Process][" + l1.ToString() + "][TryDequeue-Item][" + l2.ToString() + "]\r\n")); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue stream process unknown fail. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + bState = false; + } + finally + { + bTaskStreamWaitLock = false; + } + + return bState; + } + + // TODO : FTP ALIS + internal eFTPServiceStatus StartFTPService() + { + ControlFTP = new CtrlFTP(LoadInfo.FTP_Use, + IPAddress.Parse(LoadInfo.FTP_IPAddress), Convert.ToInt32(LoadInfo.FTP_Port), + LoadInfo.FTP_Account, LoadInfo.FTP_Password); + + if (ControlFTP.FTPConnState) + return eFTPServiceStatus.Connected; + else + return eFTPServiceStatus.Disconnected; + } + + private string GetFTPDownloadPath() + { + string strYYYY = DateTime.Today.ToString("yyyy"); + string strMM = DateTime.Today.ToString("MM"); + string strdd = DateTime.Today.ToString("dd"); + + string strHHmmssfff = DateTime.Now.ToString("HHmmssfff"); + string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory); + string DirPath = @strGetRoot + $@"\XProc\FTP\CpLog\{strYYYY}\{strMM}\{strdd}\"; + + //string CpLogDirPath = @strGetRoot + $@"XProcCpLog\Temp\{strYYYY}\{strMM}\{strdd}\{strHHmmssfff}\"; + + DirectoryInfo di1 = new DirectoryInfo(@DirPath); + if (!di1.Exists) Directory.CreateDirectory(@DirPath); + + //DirectoryInfo di2 = new DirectoryInfo(@CpLogDirPath); + //if (!di2.Exists) Directory.CreateDirectory(@CpLogDirPath); + + return DirPath; + } + + private void ProcFTPCheckLogFiles() + { + //Scan And Send File + string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory); + + //오늘 포함 -6일전까지 검색 + string[] strScanYYYY = new string[7]; + string[] strScanMM = new string[7]; + string[] strScandd = new string[7]; + + for (int n = 6; n >= 0; n--) + { + DateTime dtSet = DateTime.Today.AddDays(-n); + strScanYYYY[n] = dtSet.ToString("yyyy"); + strScanMM[n] = dtSet.ToString("MM"); + strScandd[n] = dtSet.ToString("dd"); + } + // + // 7일치 위치 확인 + // + for (int n = 0; n < 7; n++) + { + string DirPath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\"; + string DirMovePath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\History\"; + + //생성 폴더가 없을경우 SKIP + if (Directory.Exists(DirPath) == false) + continue; + + if (Directory.Exists(DirMovePath) == false) + Directory.CreateDirectory(DirMovePath); + + string fileExtension = "zip"; + + string[] dirs = Directory.GetDirectories(DirPath); + string[] files = Directory.GetFiles(DirPath, $"*.{fileExtension}", SearchOption.TopDirectoryOnly); + + if (files.Length <= 0) + continue; + + ProcFTPLogFiles(files, DirPath, DirMovePath); + } + } + + private void ProcFTPLogFiles(string[] strArrFiles, string strReadDirPath, string strMoveDirPath) + { + string strExtractFilePos = string.Empty; + string strOrgRemoveFilePos = string.Empty; + + string strHeaderInfo = string.Empty; + string strLogFileNameInfo = string.Empty; + + long l1 = long.MinValue; + + //Log Process + Stopwatch stProcessTimeChk = new Stopwatch(); + stProcessTimeChk.Start(); + + foreach (string f in strArrFiles) + { + strOrgRemoveFilePos = f; + + strHeaderInfo = string.Empty; + strLogFileNameInfo = string.Empty; + + string[] strInfos = f.Split(';'); + + //파일정보 확인(로그 저장관련 정보) + /* + string strSetDateTime = strInfos[1]; + string strSetStationName = strInfos[2]; + int nSetTestListVariantNo = int.Parse(strInfos[3]); + string strSetProcNoP = strInfos[4]; + string strSetProcNoC = strInfos[5]; + string strSetTestType = strInfos[6]; + string strSetTestCode = strInfos[7]; + string strSetVersion = strInfos[8]; + string strSetProdCode = strInfos[9]; + string strSetTestListCntID = strInfos[10]; + string strHost = strInfos[11]; + string strSection = strInfos[12]; + */ + int nSetTryNo = int.Parse(strInfos[13]); + + Dictionary dicSetLogInfo = new Dictionary(); + dicSetLogInfo.Add("DATE_TIME", strInfos[1]); + dicSetLogInfo.Add("STATION_NAME", strInfos[2]); + dicSetLogInfo.Add("VARIANT_NO", strInfos[3]); + dicSetLogInfo.Add("P_TTNR", strInfos[4]); + dicSetLogInfo.Add("TTNR", strInfos[5]); + dicSetLogInfo.Add("TEST_TYPE", strInfos[6]); + dicSetLogInfo.Add("TEST_CODE", strInfos[7]); + dicSetLogInfo.Add("VERSION", strInfos[8]); + dicSetLogInfo.Add("PROD_CODE", strInfos[9]); + dicSetLogInfo.Add("TESTLIST_ID", strInfos[10]); + dicSetLogInfo.Add("HOST", strInfos[11]); + dicSetLogInfo.Add("SECTION", strInfos[12]); + + for (int m = 1; m < 12; m++) + strHeaderInfo += (strInfos[m + 1] + ";"); + + strHeaderInfo = strHeaderInfo.Remove(strHeaderInfo.Length - 1, 1); + + //압축해제 하여 로그 파일 추출 + using (FileStream fs = new FileStream(f, FileMode.Open)) + using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Update, false)) + { + foreach (ZipArchiveEntry zae in zip.Entries) + { + strLogFileNameInfo = zae.FullName; + + if (strLogFileNameInfo.IndexOf(".txt") >= 0) + continue; + + strExtractFilePos = strReadDirPath + strLogFileNameInfo; + + //ZipFileExtensions + zae.ExtractToFile(strExtractFilePos, true); + } + } + + //Sometihing Procee + LogMappedPacket EmptyLogMapFile = new LogMappedPacket(); + + StringBuilder sb = new StringBuilder(); + sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]"); + sb.Append("["); + sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + sb.Append("], "); + sb.Append("Type [FTP], "); + sb.Append("Host [" + dicSetLogInfo["HOST"] + "], "); + sb.Append("Section [" + dicSetLogInfo["SECTION"] + "], "); + sb.Append("St Name [" + dicSetLogInfo["STATION_NAME"] + "], "); + sb.Append("File Name [" + Path.GetFileName(strExtractFilePos) + "], "); + sb.Append("File Extension [" + Path.GetExtension(strExtractFilePos) + "] "); + sb.Append("TL ID[" + dicSetLogInfo["TESTLIST_ID"] + "], "); + sb.Append("V[" + dicSetLogInfo["P_TTNR"] + "], "); + sb.Append("PN[" + dicSetLogInfo["TTNR"] + "], "); + sb.Append("TT[" + dicSetLogInfo["TEST_TYPE"] + "], "); + sb.Append("TC[" + dicSetLogInfo["TEST_CODE"] + "], "); + sb.Append("Ver[" + dicSetLogInfo["VERSION"] + "], "); + sb.Append("PC[" + dicSetLogInfo["PROD_CODE"] + "], "); + sb.Append("DB V No[" + dicSetLogInfo["VARIANT_NO"] + "], "); + + if (nDequeueCount >= Int64.MaxValue) + nDequeueCount = 0; + + bool bGetLogProcResult = CPXV2_CpLogProcess(EmptyLogMapFile, dicSetLogInfo, strExtractFilePos); + + if (bGetLogProcResult == true) + lstBulkTermLogInfo.Add(sb.ToString()); + + sb.Append("!Use Log Process Version [FTP-CPXV2] "); + + if (bGetLogProcResult) + sb.Append(""); + else + sb.Append(""); + + sb.AppendLine(); + + LogDataProcessText.Enqueue(sb); + + l1 = stProcessTimeChk.ElapsedMilliseconds; + + if (l1 != long.MinValue) + { + LogDataProcessText.Enqueue(new StringBuilder(">>[FTP-Process][" + l1.ToString() + "]\r\n")); + } + + //Failed + if (bGetLogProcResult == false) + { + //실패시 + nSetTryNo++; + + string strTryNo = string.Empty; + + string strCopyPos = string.Empty; + + //재시도 3회 초과 일시 히스토리로 이동 + if (nSetTryNo > 3) + { + strCopyPos = strMoveDirPath; + + strTryNo = "X"; + } + else + { + strCopyPos = strReadDirPath; + + strTryNo = nSetTryNo.ToString(); + } + + for (int m = 0; m < 12; m++) + strCopyPos += (";" + strInfos[m + 1]); + + strCopyPos += (";" + strTryNo + ";.zip"); + + File.Copy(f, strCopyPos, true); + } + + //압축해제 파일 삭제 + if (File.Exists(strExtractFilePos)) + File.Delete(strExtractFilePos); + + //성공시나 실패시 새로운 파일생성 되기 때문에 기존 파일 삭제 + if (strOrgRemoveFilePos != string.Empty) + { + if (File.Exists(strOrgRemoveFilePos)) + File.Delete(strOrgRemoveFilePos); + } + + stProcessTimeChk.Restart(); + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs new file mode 100644 index 0000000..83c85f0 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs @@ -0,0 +1,166 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using SystemX.Net.Platform.Common.Util; +using SystemX.Net.Platform.Common.ExtensionMethods; +using SystemX.Net.Middleware.Log.Commons; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private void Chktimer_Tick(object sender, EventArgs e) + { + Chktimer.Enabled = false; + + if (MiddlewareLogStartState == false) + { + ConsoleUtil.ConsoleVisibleControl(); + + //The program is automatically terminated. + MessageBox.Show("Server information could not be retrieved. Check the console error text.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Error); + + // TODO : FTP ALIS + this.Close(); + } + } + + private void UItimer_Tick(object sender, EventArgs e) + { + if (m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] == false) + { + m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = true; + + if (bTryBulkInsertBuffer) + { + if (buttonBulkInsertStart.BackColor != Color.Yellow) + buttonBulkInsertStart.BackColor = Color.Yellow; + } + else + { + if (buttonBulkInsertStart.BackColor != Color.Silver) + buttonBulkInsertStart.BackColor = Color.Silver; + } + + labelBulkCntInfo1.Text = nBulkLogCount.ToString(); + labelBulkCntInfo2.Text = nBulkShortTermCount.ToString(); + labelBulkCntInfo3.Text = nBulkLongTermCount.ToString(); + + labelBulkTime.Text = nBulkTimeValue.ToString(); + labelFTPTime.Text = nFTPTimeValue.ToString(); + + labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]"; + labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]"; + labelShortTermSummaryTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]"; + labelShortTermLogTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]"; + labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]"; + + if (bDatabaseConnResult) + { + if (panelDBMain2.BackColor != Color.LimeGreen) panelDBMain2.BackColor = Color.LimeGreen; + if (panelDBShortTerm2.BackColor != Color.LimeGreen) panelDBShortTerm2.BackColor = Color.LimeGreen; + if (panelDBLongTerm2.BackColor != Color.LimeGreen) panelDBLongTerm2.BackColor = Color.LimeGreen; + + if (buttonDbConnect.Visible) buttonDbConnect.Visible = false; + } + else + { + if (panelDBMain2.BackColor != Color.Red) panelDBMain2.BackColor = Color.Red; + if (panelDBShortTerm2.BackColor != Color.Red) panelDBShortTerm2.BackColor = Color.Red; + if (panelDBLongTerm2.BackColor != Color.Red) panelDBLongTerm2.BackColor = Color.Red; + + if (buttonDbConnect.Visible == false) buttonDbConnect.Visible = true; + } + + if (progressBarProgram.Value + 20 <= 100) + progressBarProgram.Value += 20; + else + progressBarProgram.Value = 0; + + int nPanelHeight = panelMain.Height / 2; + + panelRecv.Height = nPanelHeight - 20; + panelProcess.Height = nPanelHeight - 20; + + int n1 = richTextBoxRecv.Lines.Count(); + int n2 = richTextBoxProcess.Lines.Count(); + + if (richTextBoxRecv.Lines.Count() > 8192) + richTextBoxRecv.Clear(); + if (richTextBoxProcess.Lines.Count() > 8192) + richTextBoxProcess.Clear(); + + if (LogDataRecvText.Count > 0) + { + StringBuilder sb = null; + + if (LogDataRecvText.TryDequeue(out sb)) + { + //richTextBoxRecv.SuspendLayout(); + richTextBoxRecv.AppendText(sb.ToString()); + + richTextBoxRecv.ScrollToCaret(); + //richTextBoxRecv.ResumeLayout(); + } + } + + if (LogDataProcessText.Count > 0) + { + StringBuilder sb = null; + + if (LogDataProcessText.TryDequeue(out sb)) + { + //richTextBoxProcess.SuspendLayout(); + richTextBoxProcess.AppendText(sb.ToString()); + + richTextBoxProcess.ScrollToCaret(); + //richTextBoxProcess.ResumeLayout(); + } + } + + m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = false; + } + } + + private string MakeInfoConnectProcessText(int nPos, int nCommandPort, int nStreamPort) + { + string strSetProcessInfo = nPos.ToString("D2") + ":" + + nCommandPort.ToString("D4") + ":" + + nStreamPort.ToString("D4"); + + return strSetProcessInfo; + } + } +} \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj new file mode 100644 index 0000000..32c0a9c --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj @@ -0,0 +1,343 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D} + Exe + Properties + SystemX.Net.MiddlewareUI.Log + SystemX.Net.MiddlewareUI.Log + v4.8 + 512 + + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + AppIcon.ico + + + + + + true + bin\x64\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + true + + + bin\x64\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + true + + + + ..\packages\Common.Logging.3.4.1\lib\net40\Common.Logging.dll + + + ..\packages\Common.Logging.Core.3.4.1\lib\net40\Common.Logging.Core.dll + + + ..\..\Output.SystemX\CpApplciationIntrf.dll + + + ..\..\Output.SystemX\CpApplication.dll + + + ..\..\Output.SystemX\CpCommon.dll + + + + + + + + ..\..\Output.SystemX\log4net.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.1\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + + ..\packages\Microsoft.Data.SqlClient.1.1.3\lib\net46\Microsoft.Data.SqlClient.dll + + + ..\packages\Microsoft.EntityFrameworkCore.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll + + + ..\packages\Microsoft.EntityFrameworkCore.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Abstractions.dll + + + ..\packages\Microsoft.EntityFrameworkCore.Relational.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Relational.dll + + + ..\packages\Microsoft.EntityFrameworkCore.SqlServer.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.SqlServer.dll + + + ..\packages\Microsoft.Extensions.Caching.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Caching.Memory.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Memory.dll + + + ..\packages\Microsoft.Extensions.Configuration.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll + + + ..\packages\Microsoft.Extensions.Configuration.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Configuration.Binder.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.3.1.32\lib\net461\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Logging.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.dll + + + ..\packages\Microsoft.Extensions.Logging.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Options.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Options.dll + + + ..\packages\Microsoft.Extensions.Primitives.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll + + + ..\packages\Microsoft.Identity.Client.3.0.8\lib\net45\Microsoft.Identity.Client.dll + + + ..\packages\Microsoft.IdentityModel.JsonWebTokens.5.5.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll + + + ..\packages\Microsoft.IdentityModel.Logging.5.5.0\lib\net461\Microsoft.IdentityModel.Logging.dll + + + ..\packages\Microsoft.IdentityModel.Protocols.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.dll + + + ..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll + + + ..\packages\Microsoft.IdentityModel.Tokens.5.5.0\lib\net461\Microsoft.IdentityModel.Tokens.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.Collections.Immutable.1.7.1\lib\net461\System.Collections.Immutable.dll + + + ..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + ..\packages\System.Data.Common.4.3.0\lib\net451\System.Data.Common.dll + True + True + + + ..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + + ..\packages\System.IdentityModel.Tokens.Jwt.5.5.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll + + + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + False + ..\..\Output.SystemX\SystemX.Net.Platform.dll + + + ..\..\Output.SystemX\SystemX.XEFCore.dll + + + + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + + Form + + + MainForm.cs + + + + + + + + + + + MainForm.cs + Designer + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다. + + + + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config new file mode 100644 index 0000000..88b057a --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file