using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using SystemX.Net.XAdaptor.PC; using static SystemX.Net.XAdaptor.PC.O2Sensor.NgCode.DBSchemaMap; using static SystemX.Net.Platform.Common.Util.LogMessage; namespace SystemX.Net.XAdaptor.PC.O2Sensor.NgCode { public class NGCodeFinder { public enum eNGFlag { NG, ERROR } public enum eNGDataType { CP, LEAK, CHECK } public enum eJudgeType { MIN, MAX, CHECK } public string UnsortedNGTitle { get; set; } = "Unknown"; DataTable NGCodeTable { get; set; } XAdaptorPC refPCAdaptor; public NGCodeFinder(XAdaptorPC refAdaptor) { refPCAdaptor = refAdaptor; NGCodeTable = GetNGCodeTable(); } public void InitialNgCodeTable() { NGCodeTable = GetNGCodeTable(); } private DataTable GetNGCodeTable() { DataTable dtResult = null; string strQuery = $"SELECT * FROM {DBSchemaMap.TableName_NGCode};"; DataSet dtSetResult = refPCAdaptor.WaitSystemQuery(strQuery); if(((dtSetResult != null) ? dtSetResult.Tables.Cast().Any(table => table.Rows.Count != 0) : false)) dtResult = dtSetResult.Tables[0]; return dtResult; } public Dictionary GetNGCodeDictionary(DataRow dtNGRow) { Dictionary dicNg = new Dictionary(); bool bDisplayMessage = true; try { if (dtNGRow == null) { dicNg.Add("NTH", "-"); bDisplayMessage = false; throw new Exception("-"); } string strProcNo = dtNGRow[eHistTableCommonCols.ProcNo.ToString()].ToString().Trim(); string strTestID = dtNGRow[eHistTableCommonCols.TestID.ToString()].ToString().Trim(); string strResult = ""; try { strResult = dtNGRow[eHistTableCommonCols.Result.ToString()].ToString().Trim(); } catch (Exception ex) { strResult = "0"; } if (strResult == "1" || strResult == "True") { dicNg.Add("PASS", "-"); bDisplayMessage = false; throw new Exception("-"); } string strUnknwonCode = GetUnknownNGCode(strProcNo, strTestID); List vdtNGCodeRow = GetNGCodeList(strProcNo, strTestID); if (vdtNGCodeRow == null ? true : vdtNGCodeRow.Count <= 0) { dicNg.Add(strUnknwonCode, "-"); bDisplayMessage = false; throw new Exception("-"); } string strLogAccessKey = ""; List vdtDetailRow = null; List vdtHISTRow = null; //LogAccessKey Exist - PC/DEVICE //Not exist - PLC try { strLogAccessKey = dtNGRow[eHistTableCommonCols.LogAccessKey.ToString()]?.ToString().Trim(); vdtDetailRow = GetNGDetailRow(GetNGDetailData(strProcNo, strLogAccessKey)); } catch (Exception ex) { throw new Exception(ex.Message); } DataRow dtNGDetailRow = null; DataRow dtNGHISTRow = null; DataRow dtNGCodeRow = null; if (vdtDetailRow != null && vdtDetailRow.Count > 0) dtNGDetailRow = vdtDetailRow[0]; /* if (vdtNGCodeRow[0][eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.CP.ToString()) dtNGCodeRow = GetNGCodeRowCPLog(vdtNGCodeRow, dtNGDetailRow); else if (vdtNGCodeRow[0][eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.LEAK.ToString()) dtNGCodeRow = GeNGCodeRowLeakLog(vdtNGCodeRow, dtNGRow); else { List vdtFoundRow = vdtNGCodeRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vdtFoundRow.Count > 0) dtNGCodeRow = vdtFoundRow[0]; else { dicNg.Add(strUnknwonCode, "-"); bDisplayMessage = false; throw new Exception("-"); } } */ if (vdtNGCodeRow.Where(x => x[eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.CP.ToString()).ToList().Count > 0) dtNGCodeRow = GetNGCodeRowCPLog(vdtNGCodeRow, dtNGDetailRow); else if (vdtNGCodeRow.Where(x => x[eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.LEAK.ToString()).ToList().Count > 0) { vdtHISTRow = GetNGHistRow(GetNGHistData(eHistAllTableList.HIST_Leak, strLogAccessKey)); if (vdtHISTRow != null && vdtHISTRow.Count > 0) dtNGHISTRow = vdtHISTRow[0]; dtNGCodeRow = GeNGCodeRowLeakLog(vdtNGCodeRow, dtNGHISTRow); } if(dtNGCodeRow == null) { List vdtFoundRow = vdtNGCodeRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vdtFoundRow.Count > 0) dtNGCodeRow = vdtFoundRow[0]; else { dicNg.Add(strUnknwonCode, "-"); bDisplayMessage = false; throw new Exception("-"); } } if(dtNGCodeRow != null) dicNg.Add(dtNGCodeRow[eNGCodeTable.NGCode.ToString()].ToString().Trim(), dtNGCodeRow[eNGCodeTable.Status.ToString()].ToString().Trim()); } catch (Exception ex) { if (bDisplayMessage) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"NgCode - NGCodeFinder - GetNGCodeDictionary()\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } } finally { } return dicNg; } public string GetNGCode(DataRow dtNGRow) { if (dtNGRow == null) return "NTH"; string strProcNo = dtNGRow[eHistTableCommonCols.ProcNo.ToString()].ToString().Trim(); string strTestID = dtNGRow[eHistTableCommonCols.TestID.ToString()].ToString().Trim(); string strResult = ""; try { strResult = dtNGRow[eHistTableCommonCols.Result.ToString()].ToString().Trim(); } catch (Exception ex) { strResult = "0"; } if (strResult == "1" || strResult == "True") return "PASS"; string strUnknwonCode = GetUnknownNGCode(strProcNo, strTestID); List vdtNGCodeRow = GetNGCodeList(strProcNo, strTestID); if (vdtNGCodeRow == null ? true : vdtNGCodeRow.Count <= 0) return strUnknwonCode; string strLogAccessKey = ""; List vdtDetailRow = null; List vdtHISTRow = null; //LogAccessKey Exist - PC/DEVICE //Not exist - PLC try { strLogAccessKey = dtNGRow[eHistTableCommonCols.LogAccessKey.ToString()]?.ToString().Trim(); vdtDetailRow = GetNGDetailRow(GetNGDetailData(strProcNo, strLogAccessKey)); } catch (Exception ex) { } DataRow dtNGDetailRow = null; DataRow dtNGHISTRow = null; DataRow dtNGCodeRow = null; bool bUnknownState = false; try { if (vdtDetailRow != null && vdtDetailRow.Count > 0) dtNGDetailRow = vdtDetailRow[0]; /* if (vdtNGCodeRow[0][eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.CP.ToString()) dtNGCodeRow = GetNGCodeRowCPLog(vdtNGCodeRow, dtNGDetailRow); else if (vdtNGCodeRow[0][eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.LEAK.ToString()) dtNGCodeRow = GeNGCodeRowLeakLog(vdtNGCodeRow, dtNGRow); else { List vdtFoundRow = vdtNGCodeRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vdtFoundRow.Count > 0) dtNGCodeRow = vdtFoundRow[0]; else bUnknownState = true; } */ if (vdtNGCodeRow.Where(x => x[eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.CP.ToString()).ToList().Count > 0) dtNGCodeRow = GetNGCodeRowCPLog(vdtNGCodeRow, dtNGDetailRow); else if (vdtNGCodeRow.Where(x => x[eNGCodeTable.CustomCode.ToString()].ToString().Trim() == eNGDataType.LEAK.ToString()).ToList().Count > 0) { vdtHISTRow = GetNGHistRow(GetNGHistData (eHistAllTableList.HIST_Leak, strLogAccessKey)); if (vdtHISTRow != null && vdtHISTRow.Count > 0) dtNGHISTRow = vdtHISTRow[0]; dtNGCodeRow = GeNGCodeRowLeakLog(vdtNGCodeRow, dtNGHISTRow); } if(dtNGCodeRow == null) { List vdtFoundRow = vdtNGCodeRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vdtFoundRow.Count > 0) dtNGCodeRow = vdtFoundRow[0]; else bUnknownState = true; } } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"NgCode - NGCodeFinder - GetNGCode()\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } if (bUnknownState) return strUnknwonCode; else { if (dtNGCodeRow != null) return dtNGCodeRow[eNGCodeTable.NGCode.ToString()].ToString().Trim(); else return strUnknwonCode; //return dtNGCodeRow[eNGCodeTable.NGCode.ToString()].ToString().Trim(); } } public List GetNGCodeList(string strProcNo, string strTestID) { List vdtRows = null; try { if (!(NGCodeTable == null)) { /* vdtRows = (from dtRow in NGCodeTable.AsEnumerable() where dtRow[eNGCodeTable.ProcNo.ToString()].ToString().Trim() == strProcNo select dtRow).ToList(); */ vdtRows = (from dtRow in NGCodeTable.AsEnumerable() where dtRow[eNGCodeTable.ProcNo.ToString()].ToString().Trim() == strProcNo && dtRow[eNGCodeTable.TestID.ToString()].ToString().Trim() == strTestID select dtRow).ToList(); } } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"NgCode - NGCodeFinder - GetNGCodeList()\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } return vdtRows; } public DataTable GetNGDetailData(string strProcNum, string strKeyCode) { DataTable dtResult = null; string strQuery = $"SELECT * FROM {TableName_DetailData}" + "_" + strProcNum + " WHERE " + $"No IN(SELECT No FROM {TableName_DetailData}" + "_" + strProcNum + " WHERE LogAccessKey = '" + strKeyCode + $"') ORDER BY {eHistDetailTableCols.STEP.ToString()} ASC;"; DataSet dtSet = refPCAdaptor.WaitSystemQuery(strQuery); if (dtSet.Tables.Count > 0) dtResult = dtSet.Tables[0]; return dtResult; } public List GetNGDetailRow(DataTable dtResult) { if(dtResult == null) return null; List vRows = null; try { List vstrNGFlags = Enum.GetNames(typeof(eNGFlag)).ToList(); vRows = (from unitRow in dtResult.AsEnumerable() where vstrNGFlags.Contains(unitRow[eHistDetailTableCols.CHECK_RETURN.ToString()].ToString().Trim()) select unitRow).ToList(); vRows = vRows.OrderBy(x => Convert.ToInt32(x[eHistDetailTableCols.STEP.ToString()].ToString().Trim())).Reverse().ToList(); } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"NgCode - NGCodeFinder - GetNGDetailRow()\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } return vRows; } public DataTable GetNGHistData(eHistAllTableList setTable, string strKeyCode) { DataTable dtResult = null; string strQuery = $"SELECT * FROM {setTable.ToString()} WHERE " + $"No IN(SELECT No FROM {setTable.ToString()} WHERE LogAccessKey = '" + strKeyCode + $"') ORDER BY No DESC;"; DataSet dtSet = refPCAdaptor.WaitSystemQuery(strQuery); if (dtSet.Tables.Count > 0) dtResult = dtSet.Tables[0]; return dtResult; } public List GetNGHistRow(DataTable dtResult) { if (dtResult == null) return null; string strNgResult = "0"; List vRows = null; try { vRows = (from unitRow in dtResult.AsEnumerable() where strNgResult == (unitRow[eHistTableCommonCols.Result.ToString()].ToString().Trim()) select unitRow).ToList(); vRows = vRows.OrderBy(x => Convert.ToInt32(x[eHistDetailTableCols.STEP.ToString()].ToString().Trim())).Reverse().ToList(); } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"NgCode - NGCodeFinder - GetNGHistRow()\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } return vRows; } DataRow GeNGCodeRowLeakLog(List vdtRstRow, DataRow dtDetailNGRow) { List vFoundRow = null; double dMVal = double.NaN; double dMin = double.NaN; double dMax = double.NaN; if(dtDetailNGRow == null) { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; else return null; } double.TryParse(dtDetailNGRow[eHist_LeakTest.Val_Meas.ToString()].ToString().Trim(), out dMVal); double.TryParse(dtDetailNGRow[eHist_LeakTest.Val_Min.ToString()].ToString().Trim(), out dMin); double.TryParse(dtDetailNGRow[eHist_LeakTest.Val_Max.ToString()].ToString().Trim(), out dMax); if (double.IsNaN(dMVal) || double.IsNaN(dMin) || double.IsNaN(dMax)) { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; } if(dMVal < dMin) { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.MIN.ToString()).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; else { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; } } else if(dMVal > dMax) { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.MAX.ToString()).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; else { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; } } else { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; } return null; } DataRow GetNGCodeRowCPLog(List vdtRstRow, DataRow dtDetailNGRow) { List vFoundRow = null; double dMVal = double.NaN; double dMin = double.NaN; double dMax = double.NaN; if(dtDetailNGRow == null) { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; else return null; } double.TryParse(dtDetailNGRow[eHistDetailTableCols.MEASURE_VALUE.ToString()].ToString().Trim(), out dMVal); double.TryParse(dtDetailNGRow[eHistDetailTableCols.MIN_VALUE.ToString()].ToString().Trim(), out dMin); double.TryParse(dtDetailNGRow[eHistDetailTableCols.MAX_VALUE.ToString()].ToString().Trim(), out dMax); int iGetStep = 0; int.TryParse(dtDetailNGRow[eHistDetailTableCols.STEP.ToString()].ToString().Trim(), out iGetStep); if (double.IsNaN(dMVal) || double.IsNaN(dMin) || double.IsNaN(dMax)) { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; } else if(dMVal < dMin) { vFoundRow = vdtRstRow.Where(x => (x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.MIN.ToString()) && (x[eNGCodeTable.StepNo.ToString()].ToString().Trim() == iGetStep.ToString())).ToList(); if(vFoundRow.Count > 0) return vFoundRow[0]; else { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; } } else if(dMVal > dMax) { vFoundRow = vdtRstRow.Where(x => (x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.MAX.ToString()) && (x[eNGCodeTable.StepNo.ToString()].ToString().Trim() == iGetStep.ToString())).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; else { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; } } else { vFoundRow = vdtRstRow.Where(x => x[eNGCodeTable.Type.ToString()].ToString().Trim() == eJudgeType.CHECK.ToString()).ToList(); if (vFoundRow.Count > 0) return vFoundRow[0]; } return null; } string GetUnknownNGCode(string strProcNo, string strTestID) { string strNGCodeResult = UnsortedNGTitle + ":" + strProcNo + "-" + strTestID; return strNGCodeResult; } public eReworkType GetReworkType(string strNGCode) { List vdtRstRow = (from dtNGRow in NGCodeTable.AsEnumerable() where dtNGRow[eNGCodeTable.NGCode.ToString()].ToString().Trim() == strNGCode select dtNGRow).ToList(); eReworkType R_Type = eReworkType.Unknown; if(vdtRstRow.Count == 0) return R_Type; string strRType = ""; try { strRType = vdtRstRow[0][eNGCodeTable.ReworkType.ToString()].ToString().Trim(); } catch (Exception ex) { MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"NgCode - NGCodeFinder - GetReworkType()\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } finally { } if (!Enum.TryParse(strRType, out R_Type)) return R_Type; return R_Type; } } }