Files
2024-06-26 10:30:00 +09:00

608 lines
18 KiB
C#

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<DataTable>().Any(table => table.Rows.Count != 0) : false))
dtResult = dtSetResult.Tables[0];
return dtResult;
}
public Dictionary<string, string> GetNGCodeDictionary(DataRow dtNGRow)
{
Dictionary<string, string> dicNg = new Dictionary<string, string>();
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<DataRow> vdtNGCodeRow = GetNGCodeList(strProcNo, strTestID);
if (vdtNGCodeRow == null ? true : vdtNGCodeRow.Count <= 0)
{
dicNg.Add(strUnknwonCode, "-");
bDisplayMessage = false;
throw new Exception("-");
}
string strLogAccessKey = "";
List<DataRow> vdtDetailRow = null;
List<DataRow> 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<DataRow> 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<DataRow> 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<Exception> - 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<DataRow> vdtNGCodeRow = GetNGCodeList(strProcNo, strTestID);
if (vdtNGCodeRow == null ? true : vdtNGCodeRow.Count <= 0)
return strUnknwonCode;
string strLogAccessKey = "";
List<DataRow> vdtDetailRow = null;
List<DataRow> 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<DataRow> 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<DataRow> 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<Exception> - 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<DataRow> GetNGCodeList(string strProcNo, string strTestID)
{
List<DataRow> 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<Exception> - 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<DataRow> GetNGDetailRow(DataTable dtResult)
{
if(dtResult == null)
return null;
List<DataRow> vRows = null;
try
{
List<string> 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<Exception> - 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<DataRow> GetNGHistRow(DataTable dtResult)
{
if (dtResult == null)
return null;
string strNgResult = "0";
List<DataRow> 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<Exception> - NGCodeFinder - GetNGHistRow()\r\n" +
ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
finally { }
return vRows;
}
DataRow GeNGCodeRowLeakLog(List<DataRow> vdtRstRow, DataRow dtDetailNGRow)
{
List<DataRow> 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<DataRow> vdtRstRow, DataRow dtDetailNGRow)
{
List<DataRow> 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<DataRow> 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<Exception> - NGCodeFinder - GetReworkType()\r\n" +
ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
finally { }
if (!Enum.TryParse(strRType, out R_Type))
return R_Type;
return R_Type;
}
}
}