using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Collections; using System.Data.OracleClient; namespace CCSTrace.CCS.EventAI { public class JudgeCase { TraceSubject m_TraceSubject; System.Collections.ArrayList m_Case = new System.Collections.ArrayList(); int Damage_FdrID; int Damage_Fsc; // 新案件的損壞設備種類 int Damage_Ufid; // 新案件的損壞設備編號 int New_CaseID; String AcceptDate; System.Collections.ArrayList New_Case; System.Collections.Hashtable Old_Case; int Infer_Fsc; // 推測出可能受損的設備種類 int Infer_Ufid; // 推測出可能受損的設備編號 int Parent_CaseID = 0; CCS.EventAI.Equipment m_Equip; private OracleConnection _ConnectionTPC; private OracleTransaction _Transaction; private RecordLog _PLog; // int Range = 360; //比事故案件還早多久時間內的案件才作合併 單位:分 public JudgeCase(int m_FdrID, int m_fsc, int m_ufid, int m_CaseID, String m_AcceptDate, OracleConnection _Connection, OracleTransaction _Trx, RecordLog _Log) { this.Damage_FdrID = m_FdrID; this.Damage_Fsc = m_fsc; this.Damage_Ufid = m_ufid; this.New_CaseID = m_CaseID; this.AcceptDate = m_AcceptDate; _ConnectionTPC = _Connection; _Transaction = _Trx; _PLog = _Log; } public void AIBegin() { _PLog.Info("進行案件追蹤合併."); String SqlStmt; // String ToTime = AcceptDate; SqlStmt = "SELECT R.ACCEPTNUM,R.CASEID as CASEID,R.FDRID as FDRID,R.FSC as FSC,R.UFID as UFID,E.CASESTATUS as CASESTATUS,R.EVENTBRIEF as BRIEF " + "FROM EOS.EVENTRECORD R,EOS.EVENTS E WHERE E.CASEID = R.CASEID AND R.TRACE_FINISH = " + CCS.LocalVariable.Trace_Still + " AND E.CASETYPE <> " + CCS.LocalVariable.ChildCase + " AND R.FDRID = " + this.Damage_FdrID; OracleCommand Command = null; OracleDataReader reader = null; try { _PLog.Info("搜尋同一饋線上可供合併之母案件."); Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); reader = Command.ExecuteReader(); // 找出同一饋線上處理中的母案件(可作合併的) // 該饋線上有可能有二件或兩件以上的母案件 while (reader.Read()) { System.Collections.ArrayList Record = new System.Collections.ArrayList(); Record.Add(Convert.ToInt32(reader["CASEID"].ToString())); Record.Add(Convert.ToInt32(reader["FDRID"].ToString())); Record.Add(Convert.ToInt32(reader["FSC"].ToString())); Record.Add(Convert.ToInt32(reader["UFID"].ToString())); Record.Add(Convert.ToInt32(reader["CASESTATUS"].ToString())); CCS.EventAI.Equipment Tmp = new CCS.EventAI.Equipment(Convert.ToInt32(reader["FSC"].ToString()), Convert.ToInt32(reader["UFID"].ToString())); Record.Add(Tmp); Record.Add(reader["BRIEF"].ToString()); Record.Add(reader["ACCEPTNUM"].ToString()); m_Case.Add(Record); _PLog.Info(Record[7].ToString() + ", " + Record[0]); } reader.Close(); } catch (Exception e) { _PLog.Error(e.Message); Console.WriteLine(e.StackTrace); _PLog.Error("尋找母案件時發生錯誤."); throw e; } finally { if (Command != null) Command.Dispose(); if (reader != null) reader.Close(); } // 若事故案件為該饋線上的第一件事故案件時,無須再作追蹤比較 if (m_Case.Count == 0) { Infer_Fsc = this.Damage_Fsc; Infer_Ufid = this.Damage_Ufid; _PLog.Info("此案件為饋線上第一件案件"); _PLog.Info("追蹤合併結束."); return; } // 判斷是否為同一變壓器,如果是就不必作追蹤 try { for (int i = 0; i < m_Case.Count; i++) { if ( (Convert.ToInt32(((ArrayList) m_Case[i])[2].ToString()) == Damage_Fsc) && (Convert.ToInt32(((ArrayList) m_Case[i])[3].ToString()) == Damage_Ufid)) { if (((ArrayList) m_Case[i])[6].ToString().StartsWith("A")) // 若母案件事故原因為A類才做合併 { Parent_CaseID = Convert.ToInt32(((ArrayList) m_Case[i])[0].ToString()); Infer_Fsc = Convert.ToInt32(((ArrayList) m_Case[i])[2].ToString()); Infer_Ufid = Convert.ToInt32(((ArrayList) m_Case[i])[3].ToString()); _PLog.Info("相同變壓器"); _PLog.Info("與案件"+((ArrayList) m_Case[i])[7]+"合併,故障點Fsc: "+Infer_Fsc+" Ufid: "+Infer_Ufid); return; } } } } catch (Exception ex) { _PLog.Error(ex.Message); throw ex; } _PLog.Info("不同變壓器,開始追蹤(New Version)..."); this.TraceCase(); _PLog.Warn("追蹤合併結束"); } private void TraceCase() { int m_Key; try { this.m_TraceSubject = new CCS.EventAI.TraceSubject(_ConnectionTPC, _Transaction,_PLog); _PLog.Info("TraceSubject Initial...."); } catch (Exception ex) { _PLog.Error("TraceObject.dll無法初始化,請確認該元件是否存在或jre是否為 1.4 版,並確認是否註冊."); throw ex; } try { this.m_TraceSubject.startTrace(Damage_Fsc, Damage_Ufid, true); New_Case = this.m_TraceSubject.getNewResult(); // 新案件所建出來的linkedlist(往上追到breaker) _PLog.Info("追蹤新案件完成"); for (int i = 0; i < m_Case.Count; i++) { if (this.AlreadyFinishCase(Convert.ToInt32(((ArrayList) m_Case[i])[0].ToString()))) { continue; } ArrayList FacilitySet = this.RealDamageEquipment(Convert.ToInt32(((ArrayList)m_Case[i])[0].ToString())); // 切開的設備 if (FacilitySet.Count == 0) { this.m_TraceSubject.startTrace(Convert.ToInt32(((ArrayList)m_Case[i])[2].ToString()), Convert.ToInt32(((ArrayList)m_Case[i])[3].ToString()), false); Old_Case = this.m_TraceSubject.getOldResult(); // 母案件所建出來的TreeMap(往上追到breaker) _PLog.Info("追蹤母案件完成"); for (int j = 0; j < New_Case.Count; j++) { m_Key = ((Equipment) New_Case[j]).getUFID(); if (Old_Case.ContainsKey(m_Key)) { if (((ArrayList)m_Case[i])[6].ToString().StartsWith("A")) // 若母案件事故原因為A類才做合併 { this.Parent_CaseID = Convert.ToInt32(((ArrayList)m_Case[i])[0].ToString()); Infer_Fsc = ((Equipment) New_Case[j]).getFSC(); Infer_Ufid = ((Equipment) New_Case[j]).getUFID(); this.m_Equip = (CCS.EventAI.Equipment) ((ArrayList) m_Case[i])[5]; _PLog.Info("與案件"+((ArrayList) m_Case[i])[7]+"合併,故障點Fsc: "+Infer_Fsc+" Ufid: "+Infer_Ufid); return; } } } } else { for (int k = 0; k < FacilitySet.Count; k++) { bool Merge = false; // 損壞設備是否在所切開的設備下游 Equipment DamageEquipment = (Equipment) FacilitySet[k]; // 切開的設備 for (int z = 0; z < New_Case.Count; z++) { if ( (((Equipment) New_Case[z]).getFSC() == DamageEquipment.getFSC()) && (((Equipment) New_Case[z]).getUFID() == DamageEquipment.getUFID())) { Merge = true; break; } } // 當發現在所切開開關的下游,就將損壞設備指向切開的設備並return if (Merge) { if (((ArrayList)m_Case[i])[6].ToString().StartsWith("A")) // 若母案件事故原因為A類才做合併 { this.Parent_CaseID = Convert.ToInt32(((ArrayList)m_Case[i])[0].ToString()); Infer_Fsc = DamageEquipment.getFSC(); Infer_Ufid = DamageEquipment.getUFID(); this.m_Equip = (CCS.EventAI.Equipment) ((ArrayList) m_Case[i])[5]; _PLog.Info("與案件"+((ArrayList) m_Case[i])[7]+"合併,故障點Fsc: "+Infer_Fsc+" Ufid: "+Infer_Ufid); return; } } } // for loop(k) } // else } // for loop(i) } catch (Exception ex) { _PLog.Error(ex.Message); _PLog.Error("追蹤時發生錯誤."); throw ex; } finally { this.m_TraceSubject.discardEngine(); } Infer_Fsc = this.Damage_Fsc; Infer_Ufid = this.Damage_Ufid; this.m_TraceSubject.discardEngine(); return; } public Equipment getInferEquipment() { Equipment Equip = new Equipment(this.Infer_Fsc, this.Infer_Ufid); return Equip; } public Equipment getOldrEquipment() { return m_Equip; } public int getParentCaseID() { return Parent_CaseID; } private bool AlreadyFinishCase(int CaseID) { String SqlStmt; bool Result = false; SqlStmt = "SELECT TO_CHAR(CLOSETIME,'YYYY/MM/DD HH24:MI:SS') as CLOSETIME,COUNT(*) as COUNT FROM EOS.EVENTFACILITY " + "WHERE CASEID = " + CaseID + " GROUP BY CLOSETIME ORDER BY CLOSETIME DESC"; OracleCommand Command = null; OracleDataReader reader = null; try { Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); reader = Command.ExecuteReader(); if (reader.Read()) { if (Convert.ToString(reader["CLOSETIME"]).Equals("null") || Convert.ToString(reader["CLOSETIME"]).Length == 0 ) Result = false; // 有切開開關未恢復(Case in Process) else Result = true; // 有切開關但全都恢復(Case Finish) } else Result = false; // 未切過開關 reader.Close(); } catch (Exception e) { _PLog.Error("Problems occur: " + e.Message); Console.WriteLine(e.StackTrace); } finally { if (Command != null) Command.Dispose(); if (reader != null) reader.Close(); } return Result; } private System.Collections.ArrayList RealDamageEquipment(int CaseID) { System.Collections.ArrayList Result = new System.Collections.ArrayList(); String SqlStmt; SqlStmt = "SELECT FSC,UFID FROM EOS.EVENTFACILITY WHERE CASEID = " + CaseID + " AND CLOSETIME IS NULL"; OracleCommand Command = null; OracleDataReader reader = null; try { Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); reader = Command.ExecuteReader(); while (reader.Read()) { Equipment Tmp = new Equipment(Convert.ToInt32(reader["FSC"]), Convert.ToInt32(reader["UFID"])); Result.Add(Tmp); } } catch (Exception e) { // CCS.LocalVariable.ErrorLog.setErrorLog("Error in JudgeCase(RealDamageEquipment) :" + e.getMessage()); _PLog.Error("Problems occur: " + e.Message); Console.WriteLine(e.StackTrace); } finally { if (reader != null ) reader.Close(); if (Command != null ) Command.Dispose(); } return Result; } } }