using System; using System.Data; using System.IO; using Microsoft.VisualBasic; using Microsoft.VisualBasic.CompilerServices; using static iMESCore.DataBase.iMESSql; namespace AutoLoaderLib_C { public class ParsePR : EPIParseTemplate { // 呼叫父類別的建構子 public ParsePR(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath) : base(paramSourcePath, paramDestinationPath, paramQueuePath, paramFailPath) { } /// /// 設定暫存資料表的欄位 /// /// /// /// internal override bool AddColumns(DataTable dt) { bool blnResult = false; try { dt.Columns.Add("WaferID", Type.GetType("System.String")); dt.Columns.Add("RawData", Type.GetType("System.String")); dt.Columns.Add("Average", Type.GetType("System.Decimal")); dt.Columns.Add("Diff1", Type.GetType("System.Decimal")); dt.Columns.Add("Diff2", Type.GetType("System.Decimal")); dt.Columns.Add("PR_GRADE", Type.GetType("System.String")); dt.Columns.Add("PR_RESULT", Type.GetType("System.String")); blnResult = true; } catch (Exception ex) { throw; } return blnResult; } /// /// 將暫存資料表寫入資料庫 /// /// /// /// internal override bool InsertTable(DataTable dt) { bool blnResult = false; string strSQL; string strSQL2; string strSQL3; const string PR_GRADE = "PR Grade"; // 新增 PR 資料 strSQL = " INSERT INTO TBL_LEDLD_PR " + " (WaferID, CreateDate, RawData, Average, Diff1, Diff2, PR_GRADE, PR_RESULT) " + " VALUES ('{0}', SYSDATE, '{1}', {2}, {3}, {4}, '{5}', '{6}') "; // 刪除 ComponentProperty PR_GRADE 的資料 strSQL2 = " DELETE TBLWIPCOMPONENTPROPERTY " + " WHERE LOTNO = '{0}' " + " AND COMPONENTNO = '{1}' " + " AND PROPERTYNO = '{2}' "; // 新增 ComponentProperty PR_GRADE 的資料 strSQL3 = " INSERT INTO TBLWIPCOMPONENTPROPERTY " + " (LOTNO, COMPONENTNO, PROPERTYNO, PROPERTYVALUE) " + " VALUES ('{0}', '{1}', '{2}', '{3}') "; try { using (var oTran = objConnection.BeginTransaction()) { try { using (var cmd = CreateCommand()) { cmd.Connection = objConnection; cmd.Transaction = oTran; for (int i = 0, loopTo = dt.Rows.Count - 1; i <= loopTo; i++) { cmd.CommandText = string.Format(strSQL, Operators.ConcatenateObject(dt.Rows[i]["WaferID"], ""), Operators.ConcatenateObject(dt.Rows[i]["RawData"], ""), dt.Rows[i]["Average"], dt.Rows[i]["Diff1"], dt.Rows[i]["Diff2"], Operators.ConcatenateObject(dt.Rows[i]["PR_GRADE"], ""), Operators.ConcatenateObject(dt.Rows[i]["PR_RESULT"], "")); cmd.ExecuteNonQuery(); cmd.CommandText = string.Format(strSQL2, Strings.Mid(Conversions.ToString(Operators.ConcatenateObject(dt.Rows[i]["WaferID"], "")), 1, 10), Operators.ConcatenateObject(dt.Rows[i]["WaferID"], ""), PR_GRADE); cmd.ExecuteNonQuery(); cmd.CommandText = string.Format(strSQL3, Strings.Mid(Conversions.ToString(Operators.ConcatenateObject(dt.Rows[i]["WaferID"], "")), 1, 10), Operators.ConcatenateObject(dt.Rows[i]["WaferID"], ""), PR_GRADE, Operators.ConcatenateObject(dt.Rows[i]["PR_GRADE"], "")); cmd.ExecuteNonQuery(); } } oTran.Commit(); blnResult = true; } catch (Exception ex) { oTran.Rollback(); throw; } } } catch (Exception ex) { throw; } return blnResult; } /// /// 解析資料, 並寫入暫存資料表 /// /// /// /// /// internal override bool ParsingFile(DataTable dt, string file) { bool blnResult = false; DataRow dr = null; string line; string[] tmpData; string WaferID; string RawData = ""; decimal Average = 0m; decimal Diff1 = 0m; decimal Diff2 = 0m; string PR_Grade; string PR_Result; try { // 檔名即為 WaferID var fi = new FileInfo(file); WaferID = fi.Name.Replace(fi.Extension, ""); fi = null; using (var sr = new StreamReader(file)) { do { line = sr.ReadLine(); if (!string.IsNullOrEmpty(line)) { tmpData = line.Split('\t'); if (tmpData != null && tmpData.Length == 2) { if (!Information.IsNumeric(tmpData[1])) { tmpData[1] = "0"; } switch (tmpData[0].ToUpper() ?? "") { case "AVERAGE": { Average = Convert.ToDecimal(tmpData[1]); break; } case "DIFF1": { Diff1 = Convert.ToDecimal(tmpData[1]); break; } case "DIFF2": { Diff2 = Convert.ToDecimal(tmpData[1]); break; } default: { RawData += tmpData[0] + "=" + tmpData[1] + ","; break; } } } } } while (!string.IsNullOrEmpty(line)); if (RawData.Length > 0) { RawData = RawData.Substring(0, RawData.Length - 1); // 依 Average 取出 Grade PR_Grade = PRGrade(Average); if (string.IsNullOrEmpty(PR_Grade)) { throw new Exception("PR_Grade fail。"); } // 依 Diff 取出 Grade switch (PRGrade(Diff1) ?? "") { case "": { throw new Exception("PR_Result fail。"); } case "N/A": { PR_Result = "NG"; break; } default: { PR_Result = "OK"; break; } } dr = dt.NewRow(); dr["WaferID"] = WaferID; dr["RawData"] = RawData; dr["Average"] = Average; dr["Diff1"] = Diff1; dr["Diff2"] = Diff2; dr["PR_GRADE"] = PR_Grade; dr["PR_RESULT"] = PR_Result; dt.Rows.Add(dr); blnResult = true; } } } catch (Exception ex) { throw; } finally { if (dr != null) { dr = null; } } return blnResult; } /// /// PR 等級編碼原則 /// /// /// /// private string PRGrade(decimal value) { string strGrade = "N/A"; string[] tmpData; var CollectionGrade = new Collection(); CollectionGrade.Add("0~1.5~A1"); CollectionGrade.Add("1.5~2~A2"); CollectionGrade.Add("2~3~A3"); CollectionGrade.Add("3~6~A4"); CollectionGrade.Add("6~9~A5"); CollectionGrade.Add("9~12~A6"); CollectionGrade.Add("12~15~A7"); CollectionGrade.Add("15~18~A8"); CollectionGrade.Add("18~24~A9"); CollectionGrade.Add("24~30~AA"); CollectionGrade.Add("30~36~AB"); CollectionGrade.Add("36~9999~AC"); try { foreach (string str in CollectionGrade) { tmpData = Strings.Split(str, "~"); if (tmpData.Length != 3) { break; } if (!Information.IsNumeric(tmpData[0]) || !Information.IsNumeric(tmpData[1])) { break; } if ((double)value >= Conversions.ToDouble(tmpData[0]) && (double)value < Conversions.ToDouble(tmpData[1])) { strGrade = tmpData[2]; break; } } } catch (Exception ex) { strGrade = ""; } return strGrade; } } }