using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using SystemX.Product.ALIS.Interface; using SystemX.Product.CP.TRA; using SystemX.Product.TRA.UIControl; using static SystemX.Product.TRA.DataManager.DMOverview; using static SystemX.Product.CP.TRA.Commons; namespace SystemX.Product.TRA.DataManager { public class DMTestSummary { public enum eColHideListLog { No, AccessKey, //TestID } public enum eColTestLog { No, AccessKey, //TestID, StepID, MeasVal, MeasValStr, Message, GlobalMin, GlobalMax, Result //Duration } public enum eColHideListTL { No, TestlistNo, StepVersion, Enable, IsGlobal, UpdateDT } public enum eColTestlist { No, TestlistNo, StepID, Variant, Gate, Activate, StepVersion, Enable, Position, StepDesc, UseFunction, SpecMin, SpecMax, Dim, IsGlobal, UpdateDT } public enum eColTestSummary { StepID, Average, Total, OK, NG //NOK } public SqlConnection DBConn { get; private set; } public SqlConnection ShortTermDBConn { get; private set; } public SqlConnection LongTermDBConn { get; private set; } private SqlCommand SQLCmd { get; set; } public DataTable dtHistVersionTL; public int nCurrentTLMaxStepVersion { get; set; } //public DataTable this[int i] => dtEachVersionTL[i]; public DMTestSummary(eSelectDataView SelectView, IDataBaseController getDBController) { DBConn = getDBController.GetMainConn(); if (SelectView == eSelectDataView.DataDocumentViewC1) { ShortTermDBConn = getDBController.GetShortTermConn1(); LongTermDBConn = getDBController.GetLongTermConn1(); } else if (SelectView == eSelectDataView.DataDocumentViewC2) { ShortTermDBConn = getDBController.GetShortTermConn2(); LongTermDBConn = getDBController.GetLongTermConn2(); } } public DataTable SearchTestlist(SelectedDataCollection data, int nHistChkStepVer = int.MinValue, bool bOnlyNewStepVersion = true) { DataTable dtResult = new DataTable(); DataTable dtResultChk = new DataTable(); string strQuery = string.Empty; if (data == null) return dtResult; strQuery = $"SELECT A.ProdNo_C, B.ProdNo_P, B.UpdateDT, D.TestCode, D.Gate1, D.Gate2, E.FileName, A.RegUserComment, B.Description, C.GroupName, C.ModelName, A.VariantNo AS 'TestListNo', A.Config, E.TestType, E.Version, E.ProdCode, B.UseTLPosition, B.TestListFileNo, E.UpdateDT AS 'TestListFileUpdateDT', A.VariantNo FROM [PROD_Release] AS A WITH(NOLOCK) " + $"INNER JOIN(SELECT * FROM [PROD_Variant] WITH(NOLOCK)) AS B ON A.VariantNo = B.No " + $"INNER JOIN(SELECT * FROM [PROD_Group] WITH(NOLOCK)) AS C ON B.GroupNo = C.No " + $"INNER JOIN(SELECT * FROM [STAT_TestCode] WITH(NOLOCK)) AS D ON A.TestCodeNo = D.No " + $"INNER JOIN(SELECT * FROM [STOR_TestListFile] WITH(NOLOCK)) AS E ON B.TestListFileNo = E.No " + $"WHERE A.ProdNo_C = '{data.ProductNo}' AND D.TestCode = '{data.TestCode}' AND E.TestType = '{data.TestType}' AND E.Version = '{data.FileVersion}' AND E.ProdCode = '{data.ProductionCode}';"; SQLCmd = new SqlCommand(strQuery, DBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtCompReader = SQLCmd.ExecuteReader(); DataTable dtCompResult = new DataTable(); dtCompResult.Load(dtCompReader); if (Commons.isHasRow(dtCompResult) == false) return dtResult; string strCompVariNo = dtCompResult.Rows[0]["VariantNo"].ToString(); string strCompFileNo = dtCompResult.Rows[0]["TestListFileNo"].ToString(); dtCompReader.Close(); string strGetTestListFileNo = string.Empty; if (strCompVariNo.CompareTo(data.TestListVariantNo) == 0 && strCompFileNo.CompareTo(data.TestListFileNo) == 0) strGetTestListFileNo = data.TestListFileNo; else strGetTestListFileNo = strCompFileNo; strQuery = $"SELECT LatestStepVersion FROM [HIST_TestListFileLatestStepVersion] WITH(NOLOCK) WHERE TestListFileNo = {strGetTestListFileNo};"; SQLCmd = new SqlCommand(strQuery, DBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtReaderChk = SQLCmd.ExecuteReader(); dtResultChk.Clear(); dtResultChk.Load(dtReaderChk); int nMaxStepVersion = Convert.ToInt32(dtResultChk.Rows[0]["LatestStepVersion"].ToString()); nCurrentTLMaxStepVersion = nMaxStepVersion; dtReaderChk.Close(); //항상 최신 스텝 버전을 체크 strQuery = $"SELECT * FROM ( " + $"SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + $"AS RN FROM VRFY_TestListFileRelease WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = {strGetTestListFileNo}) AS X " + $"WHERE X.RN = 1 ORDER BY X.StepID ASC;"; SQLCmd = new SqlCommand(strQuery, DBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtReader = SQLCmd.ExecuteReader(); dtResult.Clear(); dtResult.Load(dtReader); dtReader.Close(); if (bOnlyNewStepVersion) { dtHistVersionTL = null; } else { //Hist 목록 검색 스텝 버전 리스트만 검색하여 사용 dtHistVersionTL = new DataTable(); strQuery = $"SELECT * FROM ( " + $"SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + $"AS RN FROM VRFY_TestListFileRelease WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = {strGetTestListFileNo} AND StepVersion <= {nHistChkStepVer}) AS X " + $"WHERE X.RN = 1 ORDER BY X.StepID ASC, StepVersion DESC;"; SQLCmd = new SqlCommand(strQuery, DBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtHistReader = SQLCmd.ExecuteReader(); dtHistVersionTL.Clear(); dtHistVersionTL.Load(dtHistReader); dtHistReader.Close(); //PK 키 지정 > //TODO : Primary Key Access Error > 업데이트 된 동일 스텝이 존재시 PK 지정 실패 DataColumn[] keysHistStepVer = new DataColumn[1]; keysHistStepVer[0] = new DataColumn(); keysHistStepVer[0] = dtHistVersionTL.Columns["StepID"]; dtHistVersionTL.PrimaryKey = keysHistStepVer; /* dtEachVersionTL = new DataTable[nMaxStepVersion + 1]; int nStartStepVer = nMaxStepVersion - 5; if (nStartStepVer < 0) nStartStepVer = 0; for (int i = nStartStepVer; i <= nMaxStepVersion; i++) { dtEachVersionTL[i] = new DataTable(); strQuery = $"SELECT * FROM ( " + $"SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + $"AS RN FROM VRFY_TestListFileRelease WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = {strGetTestListFileNo} AND StepVersion <= {i}) AS X " + $"WHERE X.RN = 1 ORDER BY X.StepID ASC, StepVersion DESC;"; SQLCmd = new SqlCommand(strQuery, DBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtReader = SQLCmd.ExecuteReader(); dtEachVersionTL[i].Clear(); dtEachVersionTL[i].Load(dtReader); dtReader.Close(); //PK 키 지정 > //TODO : Primary Key Access Error > 업데이트 된 동일 스텝이 존재시 PK 지정 실패 DataColumn[] keysEachStepVer = new DataColumn[1]; keysEachStepVer[0] = new DataColumn(); keysEachStepVer[0] = dtEachVersionTL[i].Columns["StepID"]; dtEachVersionTL[i].PrimaryKey = keysEachStepVer; } */ } //PK 키 지정 DataColumn[] keys1 = new DataColumn[1]; keys1[0] = new DataColumn(); keys1[0] = dtResult.Columns["StepID"]; dtResult.PrimaryKey = keys1; return dtResult; } public DataTable RefineStepVersion(DataTable dtTestlist, SelectedDataCollection data) { var DuplicatedSteps = dtTestlist.AsEnumerable().GroupBy(x => x[eColTestlist.StepID.ToString()]). Select(x => new { StepID = x.Key, Count = x.Count() }).Where(x => x.Count > 1); foreach(var value in DuplicatedSteps) { List vdtRow = dtTestlist.AsEnumerable().Where(x => x[eColTestlist.StepID.ToString()].ToString() == value.StepID.ToString()).ToList(); DataRow vExcRow = vdtRow.Where(x => x[eColTestlist.StepVersion.ToString()].ToString() == data.StepVersion).FirstOrDefault(); if(vExcRow == null) { int nMaxVer = vdtRow.Max(x => Convert.ToInt32(x[eColTestlist.StepVersion.ToString()])); vExcRow = vdtRow.Where(x => Convert.ToInt32(x[eColTestlist.StepVersion.ToString()]) == nMaxVer).FirstOrDefault(); } vdtRow.Remove(vExcRow); foreach (DataRow dtRow in vdtRow) dtTestlist.Rows.Remove(dtRow); } return dtTestlist; } public DataTable SearchTestSummary(DateTime dtTestTime, List> vnpAccKeys, List vnpSummaryNo) { DataTable dtResult = new DataTable(); string strQuery = string.Empty; string strLongTerm = "HIST_TestResult"; string strShortTerm = "HIST_TestResult"; DateTime dtNow = DateTime.Now; int nDiffMonth = 12 * (dtNow.Year - dtTestTime.Year) + (dtNow.Month - dtTestTime.Month); string strTableTerm = nDiffMonth > 3 ? strLongTerm : strShortTerm; bool bLongTermTableUse = nDiffMonth > 3 ? true : false; if (vnpAccKeys == null || vnpAccKeys.Count <= 0) return dtResult; /* strQuery += $"SELECT "; strQuery += $"StepID, "; strQuery += $"AVG(CASE WHEN (X.[MeasValStr] = null OR X.[MeasValStr] = '') AND (X.[Message] = null OR X.[Message] = '') AND (X.[MeasVal] != 0.00000 AND X.[Result] != 'NONE') THEN X.[MeasVal] ELSE null END) AS Average, "; strQuery += $"COUNT(X.[Result]) AS Total, "; strQuery += $"COUNT(CASE WHEN X.[Result] = 'OK' THEN 1 END) AS OK, "; strQuery += $"COUNT(CASE WHEN X.[Result] = 'NG' OR X.[Result] = 'ERROR' THEN 1 END) AS NG "; strQuery += " "; strQuery += $"FROM [{strTableTerm}] AS X "; strQuery += $"WITH(NOLOCK) INNER JOIN [{DMCommon.SummaryLogTable}] AS Y ON "; int nIdx = 0; strQuery += $"("; foreach (Int64 npKey in vnpSummaryNo) { strQuery += $"Y.[NO] = {npKey} "; if (vnpAccKeys.Count - 1 > nIdx) strQuery += " OR "; nIdx++; } strQuery += $") "; strQuery += $"WHERE "; nIdx = 0; foreach(Tuple npKey in vnpAccKeys) { strQuery += $"(X.[AccessKey] <= {npKey.Item2} AND X.[AccessKey] >= {npKey.Item1})"; if (vnpAccKeys.Count - 1 > nIdx) strQuery += " OR "; nIdx++; } strQuery += " "; strQuery += $"GROUP BY "; strQuery += $"X.[StepID]"; strQuery += " "; strQuery += $"ORDER BY "; strQuery += $"X.[StepID]"; strQuery += ";"; */ /* SELECT Y.StepID, CASE X.StepVersion WHEN 0 THEN 'O' ELSE 'X' END AS SV0, CASE X.StepVersion WHEN 1 THEN 'O' ELSE 'X' END AS SV1, CASE X.StepVersion WHEN 2 THEN 'O' ELSE 'X' END AS SV2, CASE X.StepVersion WHEN 3 THEN 'O' ELSE 'X' END AS SV3, CASE X.StepVersion WHEN 4 THEN 'O' ELSE 'X' END AS SV4, CASE X.StepVersion WHEN 5 THEN 'O' ELSE 'X' END AS SV5, AVG(CASE WHEN (Y.[MeasValStr] = null OR Y.[MeasValStr] = '') AND (Y.[Message] = null OR Y.[Message] = '') AND (Y.[MeasVal] != 0.00000 AND Y.[Result] != 'NONE') THEN Y.[MeasVal] ELSE null END) AS Average, COUNT(Y.[Result]) AS Total, COUNT(CASE WHEN Y.[Result] = 'OK' THEN 1 END) AS OK, COUNT(CASE WHEN Y.[Result] = 'NG' OR Y.[Result] = 'ERROR' THEN 1 END) AS NG FROM [{DMCommon.SummaryLogTable}] AS X WITH(NOLOCK) INNER JOIN [HIST_TestResultLongTerm] AS Y WITH(NOLOCK) ON (Y.AccessKey <= X.AccessEnd AND Y.AccessKey >= X.AccessStart) WHERE (X.[No] = 120202 OR X.[NO] = 120204 OR X.[NO] = 120206 OR X.[NO] = 120208 OR X.[NO] = 120211 OR X.[NO] = 120212 OR X.[NO] = 120214 OR X.[NO] = 120216 OR X.[NO] = 120218 OR X.[NO] = 120220 OR X.[NO] = 120222) GROUP BY Y.[StepID], X.[StepVersion] ORDER BY Y.[StepID]; */ strQuery += $"SELECT "; strQuery += $"Y.[StepID], "; //for (int i = 0; i <= nCurrentTLMaxStepVersion; i++) // strQuery += $"CASE X.StepVersion WHEN " + i.ToString() + " THEN 'O' ELSE 'X' END AS SV" + i.ToString() + ", "; strQuery += $"AVG(CASE WHEN (Y.[MeasValStr] = NULL OR Y.[MeasValStr] = '') AND (Y.[Message] = NULL OR Y.[Message] = '') AND (Y.[MeasVal] != 0.00000 AND Y.[Result] != 'NONE') THEN Y.[MeasVal] ELSE NULL END) AS Average, "; strQuery += $"COUNT(Y.[Result]) AS Total, "; strQuery += $"COUNT(CASE WHEN Y.[Result] = 'OK' THEN 1 END) AS OK, "; strQuery += $"COUNT(CASE WHEN Y.[Result] = 'NG' OR X.[Result] = 'ERROR' THEN 1 END) AS NG "; strQuery += $" "; strQuery += $"FROM [{DMCommon.SummaryLogTable}] AS X WITH(NOLOCK) "; strQuery += $"INNER JOIN [{strTableTerm}] AS Y WITH(NOLOCK) ON (Y.AccessKey BETWEEN X.AccessStart AND X.AccessEnd) "; int nIdx = 0; /* strQuery += $"WHERE ("; foreach (Int64 npKey in vnpSummaryNo) { strQuery += $"X.[No] = {npKey} "; if (vnpAccKeys.Count - 1 > nIdx) strQuery += " OR "; nIdx++; } strQuery += $") "; */ strQuery += $"WHERE X.[No] IN ("; foreach (Int64 npKey in vnpSummaryNo) { strQuery += $"{npKey}"; if (vnpSummaryNo.Count - 1 > nIdx) strQuery += ", "; nIdx++; } strQuery += $") "; strQuery += $"GROUP BY Y.[StepID], X.[StepVersion] ORDER BY Y.[StepID];"; if (bLongTermTableUse) SQLCmd = new SqlCommand(strQuery, LongTermDBConn); else SQLCmd = new SqlCommand(strQuery, ShortTermDBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtReader = SQLCmd.ExecuteReader(); dtResult.Load(dtReader); dtReader.Close(); return dtResult; } DataTable GetRawResult(DetailTestDataCollection data) { DataTable dtResult = new DataTable(); string strQuery = string.Empty; if (data == null) return dtResult; SQLCmd = new SqlCommand(strQuery, ShortTermDBConn); SQLCmd.CommandTimeout = DMCommon.nDefaultScanTime; DbDataReader dtReader = SQLCmd.ExecuteReader(); dtResult.Load(dtReader); dtReader.Close(); return dtResult; } } }