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;
|
private String _traceConnectionString = String.Empty;
|
|
// int Range = 360; //比事故案件還早多久時間內的案件才作合併 單位:分
|
|
public JudgeCase(int m_FdrID, int m_fsc, int m_ufid, int m_CaseID, String m_AcceptDate, OracleConnection _Connection, OracleTransaction _Trx, String _traceConnection, 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;
|
_traceConnectionString = _traceConnection;
|
_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, _traceConnectionString, _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;
|
}
|
}
|
}
|