using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using MECF.Framework.Common.DBCore; using Aitex.Core.RT.DBCore; using Aitex.Core.RT.Log; namespace MECF.Framework.RT.Core.DBProviderEx { public class tray_thickness_data { public string wafer_guid; public string tray_number; public double tray_coating; public double tray_max; public string tray_inner_number; public double tray_inner_coating; public double tray_inner_max; public string ring_inner_number; public double ring_inner_coating; public double ring_inner_max; public string ring_outer_number; public double ring_outer_coating; public double ring_outer_max; // public tray_thickness_data() { } public tray_thickness_data(string s) { this.StringTo(s); } public override string ToString() { string s = ""; s += (this.wafer_guid + "\t"); s += (this.tray_number + "\t"); s += (this.tray_coating.ToString() + "\t"); s += (this.tray_max.ToString() + "\t"); s += (this.tray_inner_number + "\t"); s += (this.tray_inner_coating.ToString() + "\t"); s += (this.tray_inner_max.ToString() + "\t"); s += (this.ring_inner_number + "\t"); s += (this.ring_inner_coating.ToString() + "\t"); s += (this.ring_inner_max.ToString() + "\t"); s += (this.ring_outer_number + "\t"); s += (this.ring_outer_coating.ToString() + "\t"); s += (this.ring_outer_max.ToString() + ""); // return s; } public void StringTo(string s) { string[] sTI = s.Split('\t'); this.wafer_guid = sTI[0].ToString(); this.tray_number = sTI[1].ToString(); this.tray_coating = Convert.ToDouble(sTI[2]); this.tray_max = Convert.ToDouble(sTI[3]); this.tray_inner_number = sTI[4].ToString(); this.tray_inner_coating = Convert.ToDouble(sTI[5]); this.tray_inner_max = Convert.ToDouble(sTI[6]); this.ring_inner_number = sTI[7].ToString(); this.ring_inner_coating = Convert.ToDouble(sTI[8]); this.ring_inner_max = Convert.ToDouble(sTI[9]); this.ring_outer_number = sTI[10].ToString(); this.ring_outer_coating = Convert.ToDouble(sTI[11]); this.ring_outer_max = Convert.ToDouble(sTI[12]); } } public class tray_thickness_main { public string tray_number; public double tray_coating_thickness; public double tray_max_thickness; public string last_time; // public tray_thickness_main() { } public tray_thickness_main(string s) { this.StringTo(s); } public override string ToString() { string s = ""; s += (this.tray_number + "\t"); s += (this.tray_coating_thickness.ToString() + "\t"); s += (this.tray_max_thickness.ToString() + "\t"); s += (this.last_time + ""); // return s; } public void StringTo(string s) { string[] sTI = s.Split('\t'); this.tray_number = sTI[0].ToString(); this.tray_coating_thickness = Convert.ToDouble(sTI[1]); this.tray_max_thickness = Convert.ToDouble(sTI[2]); this.last_time = sTI[3].ToString(); } } public class pm_thickness_data { public string pm_number; public double coating1, max1, coating2, max2; // public pm_thickness_data() { } public pm_thickness_data(string s) { this.StringTo(s); } public override string ToString() { string s = ""; s += (this.pm_number + "\t"); s += (this.coating1.ToString() + "\t"); s += (this.max1.ToString() + "\t"); s += (this.coating2.ToString() + "\t"); s += (this.max2.ToString() + "\t"); // return s; } public void StringTo(string s) { string[] sTI = s.Split('\t'); this.pm_number = sTI[0].ToString(); this.coating1 = Convert.ToDouble(sTI[1]); this.max1 = Convert.ToDouble(sTI[2]); this.coating2 = Convert.ToDouble(sTI[3]); this.max2 = Convert.ToDouble(sTI[4]); } } public class WaferDataRecorderEx : WaferDataRecorder { public static string SF = "{0:F}"; public static tray_thickness_data GetTrayInfoByWaferguid(string wafer_guid) { if (wafer_guid.Trim().Length == 0) { return null; } tray_thickness_data t = new tray_thickness_data(); // try { //string cmdText = $"SELECT * FROM \"tray_thickness_data\" where \"wafer_guid\" = '{wafer_guid}' ;"; string cmdText = "select A.wafer_guid, A.tray_number,A.tray_inner_number,A.ring_inner_number,A.ring_outer_number,B.tray_number as tray_number_b, B.tray_coating_thickness,B.tray_max_thickness " + " from tray_thickness_data as A " + " inner join tray_thickness_main as B " + " on A.tray_number = B.tray_number " + " or A.tray_inner_number = B.tray_number " + " or A.ring_inner_number = B.tray_number " + " or A.ring_outer_number = B.tray_number " + " where A.wafer_guid like '"+wafer_guid+"'"; DataSet dataSet = DB.ExecuteDataset(cmdText); if (dataSet == null) { return null; } if (dataSet.Tables.Count == 0 || dataSet.Tables[0].Rows.Count == 0) { return null; } t.wafer_guid = dataSet.Tables[0].Rows[0]["wafer_guid"].ToString(); t.tray_number = dataSet.Tables[0].Rows[0]["tray_number"].ToString(); t.tray_inner_number = dataSet.Tables[0].Rows[0]["tray_inner_number"].ToString(); t.ring_inner_number = dataSet.Tables[0].Rows[0]["ring_inner_number"].ToString(); t.ring_outer_number = dataSet.Tables[0].Rows[0]["ring_outer_number"].ToString(); for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++) { string sTrayNumberB = dataSet.Tables[0].Rows[i]["tray_number_b"].ToString(); if (sTrayNumberB == t.tray_number) { t.tray_coating = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_coating_thickness"]); t.tray_max = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_max_thickness"]); } else if (sTrayNumberB == t.tray_inner_number) { t.tray_inner_coating = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_coating_thickness"]); t.tray_inner_max = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_max_thickness"]); } else if (sTrayNumberB == t.ring_inner_number) { t.ring_inner_coating = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_coating_thickness"]); t.ring_inner_max = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_max_thickness"]); } else if(sTrayNumberB == t.ring_outer_number) { t.ring_outer_coating = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_coating_thickness"]); t.ring_outer_max = Convert.ToDouble(dataSet.Tables[0].Rows[i]["tray_max_thickness"]); } else { // } } } catch (Exception ex) { t = null; LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "GetTrayInfoByWaferguid"); } // return t; } public static tray_thickness_main GetTrayInfoByTrayNumber(string sTrayNumber) { tray_thickness_main t = new tray_thickness_main(); // try { string cmdText = $"SELECT * FROM \"tray_thickness_main\" where \"tray_number\" = '{sTrayNumber}' ;"; DataSet dataSet = DB.ExecuteDataset(cmdText); if (dataSet == null) { return null; } if (dataSet.Tables.Count == 0 || dataSet.Tables[0].Rows.Count == 0) { return null; } t.tray_number = dataSet.Tables[0].Rows[0]["tray_number"].ToString(); t.tray_coating_thickness = Convert.ToDouble(dataSet.Tables[0].Rows[0]["tray_coating"]); t.tray_max_thickness = Convert.ToDouble(dataSet.Tables[0].Rows[0]["tray_max"]); t.last_time = dataSet.Tables[0].Rows[0]["last_time"].ToString(); } catch (Exception ex) { t = null; LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "GetTrayInfoByWaferguid"); } // return t; } public static void UpdateTrayInfoByWaferguid(tray_thickness_data t) { if (t == null) { return; } // try { string cmdText = string.Format("update tray_thickness_data set " + "tray_number='{1}',tray_coating={2}, tray_max={3}," + "tray_inner_number='{4}',tray_inner_coating={5}, tray_inner_max={6}," + "ring_inner_number='{7}',ring_inner_coating={8}, ring_inner_max={9}," + "ring_outer_number='{10}',ring_outer_coating={11}, ring_outer_max={12} " + "where wafer_guid = '{0}' ;", t.wafer_guid, t.tray_number, t.tray_coating, t.tray_max, t.tray_inner_number, t.tray_inner_coating, t.tray_inner_max, t.ring_inner_number, t.ring_inner_coating, t.ring_inner_max, t.ring_outer_number, t.ring_outer_coating, t.ring_outer_max ); DB.Insert(cmdText); } catch (Exception ex) { t = null; LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdateTrayInfoByWaferguid"); } } public static bool UpdateTrayInfoByTrayNumbersTrans(tray_thickness_data t) { if (t == null) { return false; } // try { string sDateTime = DateTime.Now.ToString(); string[] cmd = { string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_time='{2}' where tray_number='{3}',;", t.tray_coating, t.tray_max, t.tray_number, sDateTime ), string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_time='{2}' where tray_number='{3}',;", t.tray_inner_coating, t.tray_inner_max, t.tray_inner_number, sDateTime ), string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_time='{2}' where tray_number='{3}',;", t.ring_inner_coating, t.ring_inner_max, t.ring_inner_number, sDateTime ), string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_time='{2}' where tray_number='{3}',;", t.ring_outer_coating, t.ring_outer_max, t.ring_outer_number, sDateTime ) }; return DB.ExcuteTransAction(cmd.ToList()); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdateTrayInfoByWaferguid"); return false; } } public static bool UpdateTrayInfoByWaferguidTrans(tray_thickness_data t) { if (t == null) { return false ; } // try { string sDate = DateTime.Now.ToLongDateString(); string sTime = DateTime.Now.ToLongTimeString(); string[] cmd = { string.Format("update tray_thickness_data set " + "tray_number='{1}',tray_inner_number='{2}',ring_inner_number='{3}',ring_outer_number='{4}' where wafer_guid = '{0}' ;", t.wafer_guid, t.tray_number, t.tray_inner_number, t.ring_inner_number, t.ring_outer_number ), string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_date='{3}', last_time='{4}' where tray_number='{2}';", t.tray_coating, t.tray_max, t.tray_number, sDate, sTime ), string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_date='{3}', last_time='{4}' where tray_number='{2}';", t.tray_inner_coating, t.tray_inner_max, t.tray_inner_number, sDate, sTime ), string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_date='{3}', last_time='{4}' where tray_number='{2}';", t.ring_inner_coating, t.ring_inner_max, t.ring_inner_number, sDate, sTime ) , string.Format("update tray_thickness_main set " + "tray_coating_thickness={0}, tray_max_thickness={1}," + "last_date='{3}', last_time='{4}' where tray_number='{2}';", t.ring_outer_coating, t.ring_outer_max, t.ring_outer_number, sDate, sTime ) }; return DB.ExcuteTransAction(cmd.ToList()); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdateTrayInfoByWaferguid"); return false; } } public static void InsertTrayInfo(tray_thickness_data t) { if (t == null) { return; } // try { string cmdText = string.Format("insert into tray_thickness_data (" + "wafer_guid," + "tray_number,tray_coating, tray_max," + "tray_inner_number,tray_inner_coating, tray_inner_max," + "ring_inner_number,ring_inner_coating, ring_inner_max," + "ring_outer_number,ring_outer_coating, ring_outer_max)" + "values('{0}','{1}',{2},{3},'{4}',{5},{6},'{7}',{8},{9},'{10}',{11},{12} );", t.wafer_guid, t.tray_number, t.tray_coating, t.tray_max, t.tray_inner_number, t.tray_inner_coating, t.tray_inner_max, t.ring_inner_number, t.ring_inner_coating, t.ring_inner_max, t.ring_outer_number, t.ring_outer_coating, t.ring_outer_max ); DB.Insert(cmdText); } catch (Exception ex) { t = null; LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdateTrayInfoByWaferguid"); } } public static bool InsertTrayInfoTrans(tray_thickness_data t) { if (t == null) { return false; } // try { string sDate = DateTime.Now.ToLongDateString(); string sTime = DateTime.Now.ToLongTimeString(); List liCmd = new List(); //tray_thickness_data string cmd = ""; cmd = string.Format("insert into tray_thickness_data (" + "wafer_guid," + "tray_number,tray_inner_number,ring_inner_number,ring_outer_number)" + "values('{0}','{1}','{2}','{3}','{4}');", t.wafer_guid, t.tray_number, t.tray_inner_number, t.ring_inner_number, t.ring_outer_number ); liCmd.Add(cmd); //tray_thickness_main //tray cmd = string.Format("update tray_thickness_main set " + "tray_coating_thickness={1}, tray_max_thickness={2}," + "last_date='{3}', last_time='{4}' where tray_number='{0}' " + " and EXISTS(select * from tray_thickness_main where tray_number like '{0}') " , t.tray_number, t.tray_coating, t.tray_max, sDate, sTime ); liCmd.Add(cmd); cmd = string.Format("insert into tray_thickness_main(tray_number,tray_coating_thickness,tray_max_thickness,last_date,last_time)" + " select '{0}',{1},{2},'{3}','{4}' " + " from (select 1) tmp WHERE NOT EXISTS(select * from tray_thickness_main where tray_number like '{0}')" , t.tray_number, t.tray_coating, t.tray_max, sDate, sTime ); liCmd.Add(cmd); //tray_inner cmd = string.Format("update tray_thickness_main set " + "tray_coating_thickness={1}, tray_max_thickness={2}," + "last_date='{3}', last_time='{4}' where tray_number='{0}' " + " and EXISTS(select * from tray_thickness_main where tray_number like '{0}') ", t.tray_inner_number, t.tray_inner_coating, t.tray_inner_max, sDate, sTime ); liCmd.Add(cmd); cmd = string.Format("insert into tray_thickness_main(tray_number,tray_coating_thickness,tray_max_thickness,last_date,last_time)" + " select '{0}',{1},{2},'{3}','{4}' " + " from (select 1) tmp WHERE NOT EXISTS(select * from tray_thickness_main where tray_number like '{0}')" , t.tray_inner_number, t.tray_inner_coating, t.tray_inner_max, sDate, sTime ); liCmd.Add(cmd); //ring_inner cmd = string.Format("update tray_thickness_main set " + "tray_coating_thickness={1}, tray_max_thickness={2}," + "last_date='{3}', last_time='{4}' where tray_number='{0}' " + " and EXISTS(select * from tray_thickness_main where tray_number like '{0}') ", t.ring_inner_number, t.ring_inner_coating, t.ring_inner_max, sDate, sTime ); liCmd.Add(cmd); cmd = string.Format("insert into tray_thickness_main(tray_number,tray_coating_thickness,tray_max_thickness,last_date,last_time)" + " select '{0}',{1},{2},'{3}','{4}' " + " from (select 1) tmp WHERE NOT EXISTS(select * from tray_thickness_main where tray_number like '{0}')" , t.ring_inner_number, t.ring_inner_coating, t.ring_inner_max, sDate, sTime ); liCmd.Add(cmd); //ring_outer cmd = string.Format("update tray_thickness_main set " + "tray_coating_thickness={1}, tray_max_thickness={2}," + "last_date='{3}', last_time='{4}' where tray_number='{0}' " + " and EXISTS(select * from tray_thickness_main where tray_number like '{0}') ", t.ring_outer_number, t.ring_outer_coating, t.ring_outer_max, sDate, sTime ); liCmd.Add(cmd); cmd = string.Format("insert into tray_thickness_main(tray_number,tray_coating_thickness,tray_max_thickness,last_date,last_time)" + " select '{0}',{1},{2},'{3}','{4}' " + " from (select 1) tmp WHERE NOT EXISTS(select * from tray_thickness_main where tray_number like '{0}')" , t.ring_outer_number, t.ring_outer_coating, t.ring_outer_max, sDate, sTime ); liCmd.Add(cmd); // return DB.ExcuteTransAction(liCmd); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdateTrayInfoByWaferguid"); return false; } } public static void DeleteTrayInfoByWaferguid(string wafer_guid) { if (wafer_guid.Trim().Length == 0) { return; } // try { string cmdText = string.Format("delete from tray_thickness_data where wafer_guid like '{0}'",wafer_guid); DB.Insert(cmdText); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "DeleteTrayInfoByWaferguid"); } } public static void ClearTrayInfoByTrayNumber(string sNumber, string sCoating, string sMax) { if (sNumber == "") { return ; } // try { string sDate = DateTime.Now.ToLongDateString(); string sTime = DateTime.Now.ToLongTimeString(); string cmd = string.Format("update tray_thickness_main set " + "tray_coating_thickness={1}, tray_max_thickness={2}," + "last_date='{3}', last_time='{4}' where tray_number='{0}' ", sNumber, sCoating, sMax, sDate, sTime ); DB.Insert(cmd); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "ClearTrayInfoByTrayNumber"); } } public static List GetPMInfoByPNNumbers(List sPMNumbers) { List liPMData = new List(); // try { string pns = ""; foreach(string pn in sPMNumbers) { if (pn.Trim().Length > 0) { pns += ("'" + pn.Trim() + "',"); } } if(pns.Length >0) { pns = pns.Substring(0, pns.Length - 1); } // string cmdText = $"SELECT * FROM pm_thickness_data where pm_number in ("+pns+") ;"; DataSet dataSet = DB.ExecuteDataset(cmdText); if (dataSet == null) { return null; } if (dataSet.Tables.Count == 0 || dataSet.Tables[0].Rows.Count == 0) { return null; } for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++) { pm_thickness_data p = new pm_thickness_data(); p.pm_number = dataSet.Tables[0].Rows[i]["pm_number"].ToString(); p.coating1 = dataSet.Tables[0].Rows[i]["coating1"] is DBNull ? 0 : Convert.ToDouble(dataSet.Tables[0].Rows[i]["coating1"]); p.max1 = dataSet.Tables[0].Rows[i]["max1"] is DBNull ? 0 : Convert.ToDouble(dataSet.Tables[0].Rows[i]["max1"]); p.coating2 = dataSet.Tables[0].Rows[i]["coating2"] is DBNull ? 0 : Convert.ToDouble(dataSet.Tables[0].Rows[i]["coating2"]); p.max2 = dataSet.Tables[0].Rows[i]["max2"] is DBNull ? 0 : Convert.ToDouble(dataSet.Tables[0].Rows[i]["max2"]); // liPMData.Add(p); } } catch (Exception ex) { liPMData = null; LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "GetPMInfoByPNNumbers"); } // return liPMData; } public static void ClearPMInfoByPMNumber(string sNumber, string daxiao, string sCoating, string sMax) { if (sNumber == "") { return; } // try { string cmd = ""; if (daxiao == "xiao") { cmd = string.Format("update pm_thickness_data set " + "coating1={1}, max1={2}" + " where pm_number='{0}' ", sNumber, sCoating, sMax); } else if(daxiao == "da") { cmd = string.Format("update pm_thickness_data set " + "coating2={1}, max2={2}" + " where pm_number='{0}' ", sNumber, sCoating, sMax); } // if (cmd != "") { DB.Insert(cmd); } } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "ClearTrayInfoByTrayNumber"); } } public static bool UpdatePMInfoByPMNumberTrans(string sPMNumber, string sCol, string sValue) { if (sPMNumber.Trim() == "") { return false; } // try { string sTime = DateTime.Now.ToLongTimeString(); List liCmd = new List(); string cmd = ""; cmd = string.Format("update pm_thickness_data set " + sCol+"={1}" + " where pm_number='{0}' " + " and EXISTS(select * from pm_thickness_data where pm_number like '{0}') ", sPMNumber, Convert.ToDouble(sValue) ); liCmd.Add(cmd); cmd = string.Format("insert into pm_thickness_data(pm_number,"+sCol+")" + " select '{0}',{1}" + " from (select 1) tmp WHERE NOT EXISTS(select * from pm_thickness_data where pm_number like '{0}') ", sPMNumber, Convert.ToDouble(sValue) ); liCmd.Add(cmd); // return DB.ExcuteTransAction(liCmd); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdatePMInfoByPMNumberTrans"); return false; } } /// /// calculate the GrowthValue and record it /// /// μm/hour /// second /// public static bool Grow(string wafer_guid, double GrowthRate,double Seconds) { if (GrowthRate <= 0.0 || Seconds <=0) { return false; } // try { string tray_numbers = ""; string sSql = "select * from tray_thickness_data where wafer_guid like '"+wafer_guid.Trim()+"'"; DataSet ds = DB.ExecuteDataset(sSql); if (ds == null) { return false; } if(ds.Tables[0].Rows.Count == 0) { return false; } tray_numbers = "'" + ds.Tables[0].Rows[0]["tray_number"].ToString() + "','" + ds.Tables[0].Rows[0]["tray_inner_number"].ToString() + "','" + ds.Tables[0].Rows[0]["ring_inner_number"].ToString() + "','" + ds.Tables[0].Rows[0]["ring_outer_number"].ToString() + "'"; // double GrowthValue = GrowthRate * Seconds / 3600; //μm string sGrowthValue = string.Format("{0:N2}", GrowthValue); string sDate = DateTime.Now.ToLongDateString(); string sTime = DateTime.Now.ToLongTimeString(); string[] gCmd = { string.Format("update pm_thickness_data set coating1 = coating1 + {0}, coating2=coating2+{0} where pm_number='PM1' ",sGrowthValue), string.Format("update tray_thickness_main set tray_coating_thickness = tray_coating_thickness + {0} where tray_number in ({1}) ",sGrowthValue,tray_numbers) }; // return DB.ExcuteTransAction(gCmd.ToList()); } catch (Exception ex) { LOG.Write(ex, 2, "WaferDataRecorderEx.cs", "UpdatePMInfoByPMNumberTrans"); return false; } } } }