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.Data.OracleClient; namespace CCSTrace.CCS.Function { public class Leach { private CCS.Function.MergeCase MergeCase = new CCS.Function.MergeCase(); private RecordLog _PLog; private OracleConnection _ConnectionTPC; private OracleTransaction _Transaction; public Leach(OracleConnection _Conn, OracleTransaction _Trx, RecordLog _Log) { _ConnectionTPC = _Conn; _Transaction = _Trx; _PLog = _Log; } public int LeachCase(CCS.Object.EventRecord m_NewRec) { switch (SameCase(m_NewRec)) { case CCS.LocalVariable.Success: return this.Judge(m_NewRec, false); case CCS.LocalVariable.CaseTypeChanged: return this.Judge(m_NewRec, true); case CCS.LocalVariable.SameCustomer: return CCS.LocalVariable.SameCustomer; case CCS.LocalVariable.Failure_By_DB: return CCS.LocalVariable.Failure_By_DB; case CCS.LocalVariable.CaseTransfer: return CCS.LocalVariable.CaseTransfer; default: return CCS.LocalVariable.Failure_By_DB; } } public CCS.EventAI.Equipment getOldEquipment() { return this.MergeCase.getOldEquipment(); } private int SameCase(CCS.Object.EventRecord m_NewRec) { String SqlStmt = "SELECT R.ACCEPTNUM,R.CASEID as CASEID,R.IMPORTCASE as IMPORTCASE,E.CASETYPE as CASETYPE FROM EOS.EVENTRECORD R," + "EOS.EVENTS E WHERE "; int m_Result = -1; int ImportCase = -1; int TmpCaseID = 0; int CaseType = -1; _PLog.Info("利用電號或地址檢查是否有已成立之案件."); // 檢查資料庫中此電號或地址是否已成立案件 if (m_NewRec.getMeter().Trim().Length != 0) { SqlStmt = SqlStmt + "R.CUSTOMERMETER = '" + m_NewRec.getMeter() + "' AND E.CASEID = R.CASEID AND E.CASESTATUS <= " + CCS.LocalVariable.WaitForSponsor; } else if (m_NewRec.getAddr().Trim().Length != 0) { SqlStmt = SqlStmt + "R.CUSTOMERADDR = '" + m_NewRec.getAddr() + "' AND E.CASEID = R.CASEID AND E.CASESTATUS <= " + CCS.LocalVariable.WaitForSponsor; } OracleCommand Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); OracleDataReader reader = Command.ExecuteReader(); try { if (reader.Read()) { ImportCase = Convert.ToInt32(reader["IMPORTCASE"].ToString()); TmpCaseID = Convert.ToInt32(reader["CASEID"].ToString()); CaseType = Convert.ToInt32(reader["CASETYPE"].ToString()); m_NewRec.setTmpCaseID(TmpCaseID); _PLog.Info("案件已成立:" + reader["ACCEPTNUM"].ToString() + " " + TmpCaseID + " " + CaseType); } } catch (Exception e) { _PLog.Error(e.Message); Console.WriteLine(e.StackTrace); return CCS.LocalVariable.Failure_By_DB; } finally { reader.Close(); Command.Dispose(); } // 非同一用戶重複來電 if (TmpCaseID == 0) { return CCS.LocalVariable.Success; } switch (CaseType) { case CCS.LocalVariable.OriginalCase: case CCS.LocalVariable.ParentCase: SqlStmt = "SELECT TO_CHAR(CLOSETIME,'YYYY/MM/DD HH24:MI:SS') as CLOSETIME,COUNT(*) as COUNT FROM EOS.EVENTFACILITY " + "WHERE CASEID = " + TmpCaseID + " GROUP BY CLOSETIME ORDER BY CLOSETIME DESC"; break; case CCS.LocalVariable.ChildCase: SqlStmt = "SELECT TO_CHAR(CLOSETIME,'YYYY/MM/DD HH24:MI:SS') as CLOSETIME,COUNT(*) as COUNT FROM EOS.EVENTFACILITY " + "WHERE CASEID = (SELECT PARENTID FROM EOS.MERGECASE WHERE CASEID = " + TmpCaseID + ") GROUP BY CLOSETIME " + "ORDER BY CLOSETIME DESC"; break; default: _PLog.Error("無法辨別案件種類."); return CCS.LocalVariable.Failure_By_DB; } _PLog.Info("檢查該案件有無切開關紀錄."); try { Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); reader = Command.ExecuteReader(); if (reader.Read()) { // 有開關尚未恢復 if (reader["CLOSETIME"] == null) { _PLog.Info("有切開關且尚未恢復."); if ((m_NewRec.getImportCase() == ImportCase) || (ImportCase == CCS.LocalVariable.isImportCase)) { m_Result = this.AddCount(TmpCaseID); } else { m_Result = CCS.LocalVariable.CaseTypeChanged; } } else { // 開關都已恢復(同用戶須重新受理) _PLog.Info("有切開關且已經恢復."); int CaseID; // 找出案件編號需以母案件編號或該案件編號去找casestatus if (TmpCaseID == 0) { CaseID = m_NewRec.getCaseID(); } else { CaseID = TmpCaseID; } // 判斷該案件或母案件是否移轉作後續處理 if (this.getCastStatus(CaseID) == CCS.LocalVariable.EventTrasnfer) { return CCS.LocalVariable.CaseTransfer; } else { m_Result = CCS.LocalVariable.Success; } } } else { // 未切過開關 _PLog.Info("無切開關紀錄."); if ((m_NewRec.getImportCase() == ImportCase) || (ImportCase == CCS.LocalVariable.isImportCase)) { m_Result = this.AddCount(TmpCaseID); } else { int CaseID; // 找出案件編號需以母案件編號或該案件編號去找casestatus if (TmpCaseID == 0) { CaseID = m_NewRec.getCaseID(); } else { CaseID = TmpCaseID; // 判斷該案件或母案件是否移轉作後續處理 } if (this.getCastStatus(CaseID) == CCS.LocalVariable.EventTrasnfer) { return CCS.LocalVariable.CaseTransfer; } else { m_Result = CCS.LocalVariable.CaseTypeChanged; } } } } catch (Exception e) { _PLog.Error(e.Message); Console.WriteLine(e.StackTrace); return CCS.LocalVariable.Failure_By_DB; } finally { reader.Close(); Command.Dispose(); } return m_Result; } private int AddCount(int m_CaseID) { String sqlStmt = "UPDATE EOS.EVENTS SET COUNT = COUNT + 1 WHERE CASEID = " + m_CaseID; OracleCommand Command = new OracleCommand(sqlStmt, _ConnectionTPC, _Transaction); try { if (Command.ExecuteNonQuery() > 0) return CCS.LocalVariable.SameCustomer; else return CCS.LocalVariable.Failure_By_DB; } catch (Exception) { return CCS.LocalVariable.Failure_By_DB; } finally { Command.Dispose(); } } private int getCastStatus(int CaseID) { String SqlStmt; int Status = 0; SqlStmt = "SELECT CASESTATUS FROM CCS.EVENTQUERY WHERE CCSID IN (SELECT CCSID FROM CCS.NUM_CONTRAST " + "WHERE CASEID = " + CaseID + ")"; OracleCommand Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); OracleDataReader reader = null; try { reader = Command.ExecuteReader(); if (reader.Read()) Status = Convert.ToInt32(reader["CASESTATUS"].ToString()); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } finally { if ( reader != null ) reader.Close(); Command.Dispose(); } return Status; } private int Judge(CCS.Object.EventRecord m_NewRec, bool ChangeCaseType) { int m_Result = CCS.LocalVariable.Failure_By_DB; if ((m_NewRec.getMeter().Trim().Length == 0)) { return CCS.LocalVariable.NoMeter; } /* 已知損壞設備(ONLY FOR 饋線全停才知道損壞設備的FSC) */ try { if (m_NewRec.getFsc() != 0) { m_NewRec.getLocateEquipment().setFSC(CCS.LocalVariable.Breaker); m_NewRec.getLocateEquipment().setUFID(m_NewRec.getUfid()); _PLog.Info("饋線全停:" + m_NewRec.getFsc() + ", " + m_NewRec.getUfid()); MergeCase.Merge(m_NewRec, _ConnectionTPC, _Transaction, _PLog); return CCS.LocalVariable.Success; } } catch (CCS.EventAI.TraceLoopException) { return CCS.LocalVariable.Trace_Counts_3; } catch (TraceException) { return CCS.LocalVariable.Trace_Failure; } catch (Exception ex) { _PLog.Error(ex.Message); return CCS.LocalVariable.Failure_By_DB; } try { _PLog.Info("定位損壞設備!"); int result = getEquipment(m_NewRec); _PLog.Info("FSC:" + m_NewRec.getFsc() + ", Ufid:" + m_NewRec.getUfid() + ", Tpclid:" + m_NewRec.getTpclid() + ", FeederID:" + m_NewRec.getFdrID()); switch (result) { // get fsc,ufid,fdrid of sxfmr by meter case CCS.LocalVariable.Success: if (m_NewRec.getFdrID() == 0) { m_Result = CCS.LocalVariable.NoSupplyElc; } else { // 需在未併案前作土木設備設定 this.getLocateEquipment(m_NewRec); if (m_NewRec.getBrief().Length !=0 && m_NewRec.getBrief().Substring(0,1).Equals("A")) { // A類事故原因,做追蹤合併 _PLog.Info(""); MergeCase.Merge(m_NewRec,_ConnectionTPC,_Transaction,_PLog); } else { _PLog.Info("<非A類案件>"); } if (ChangeCaseType) { m_Result = CCS.LocalVariable.CaseTypeChanged; } else { m_Result = CCS.LocalVariable.Success; } } break; case CCS.LocalVariable.No_Sxfmr: m_Result = CCS.LocalVariable.No_Sxfmr; break; case CCS.LocalVariable.Failure_By_DB: m_Result = CCS.LocalVariable.Failure_By_DB; break; } } catch (CCS.EventAI.TraceLoopException) { return CCS.LocalVariable.Trace_Counts_3; } catch (TraceException) { m_Result = CCS.LocalVariable.Trace_Failure; } catch (Exception ex1) { _PLog.Error(ex1.Message); m_Result = CCS.LocalVariable.Failure_By_DB; } return m_Result; } private int getEquipment(CCS.Object.EventRecord m_NewRec) { String Temp; String m_OwnerTpclid; String m_Group; String SqlStmt = "select tran_cord from basedb.meter where metr_numb = '" + m_NewRec.getMeter() + "'"; OracleCommand Command = new OracleCommand(SqlStmt, _ConnectionTPC,_Transaction); OracleDataReader reader = Command.ExecuteReader(); try { if (reader.Read()) { Temp = reader["tran_cord"].ToString().Trim(); if ((Temp.Length == 9) || (Temp.Length == 11)) /* 架空變壓器 */ { m_OwnerTpclid = Temp; reader.Close(); Command.Dispose(); m_NewRec.setTpclid(m_OwnerTpclid); return getSxfmr(m_OwnerTpclid, null, m_NewRec); /* Find the Sxfmr */ } else { m_OwnerTpclid = Temp.Substring(0, 11).Trim(); /* 地下變壓器 */ m_Group = Temp.Substring(14); reader.Close(); Command.Dispose(); m_NewRec.setTpclid(m_OwnerTpclid + " " + m_Group); return getSxfmr(m_OwnerTpclid, m_Group, m_NewRec); /* Find the Sxfmr */ } } else { return CCS.LocalVariable.No_Sxfmr; } } catch (Exception e) { _PLog.Error(e.Message); Console.WriteLine(e.StackTrace); return CCS.LocalVariable.Failure_By_DB; } finally { reader.Close(); Command.Dispose(); } } private int getSxfmr(String m_Tpclid, String m_Group, CCS.Object.EventRecord m_NewRec) { String SqlStmt; int m_Status = CCS.LocalVariable.Failure_By_DB; if (m_Group == null) { SqlStmt = "SELECT UFID,FDR1 FROM BASEDB.CONNECTIVITY WHERE FSC = " + CCS.LocalVariable.Sxfmr + " AND UFID IN " + "(SELECT UFID FROM BASEDB.SXFMR WHERE OWNERTPCLID = '" + m_Tpclid + "')"; } else { SqlStmt = "SELECT UFID,FDR1 FROM BASEDB.CONNECTIVITY WHERE FSC = " + CCS.LocalVariable.Sxfmr + " AND UFID IN " + "(SELECT UFID FROM BASEDB.SXFMR WHERE OWNERTPCLID = '" + m_Tpclid + "' AND GROUP1 = '" + m_Group + "')"; } OracleCommand Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); OracleDataReader reader = Command.ExecuteReader(); try { if (reader.Read()) { m_NewRec.setFsc(CCS.LocalVariable.Sxfmr); m_NewRec.setUfid(Convert.ToInt32(reader["ufid"].ToString())); m_NewRec.setFdrID(Convert.ToInt32(reader["fdr1"].ToString())); m_Status = CCS.LocalVariable.Success; } else m_Status = getHicustomer(m_Tpclid, m_Group, m_NewRec); } catch (Exception ex) { _PLog.Error(ex.Message); } finally { reader.Close(); Command.Dispose(); } return m_Status; } private int getHicustomer(String m_Tpclid, String m_Group, CCS.Object.EventRecord m_NewRec) { String SqlStmt; if (m_Group == null) { SqlStmt = "SELECT UFID,FDR1 FROM BASEDB.CONNECTIVITY WHERE FSC = " + CCS.LocalVariable.Hicustomer + " AND UFID IN " + "(SELECT UFID FROM BASEDB.HICUSTOMER WHERE OWNERTPCLID = '" + m_Tpclid + "')"; } else { SqlStmt = "SELECT UFID,FDR1 FROM BASEDB.CONNECTIVITY WHERE FSC = " + CCS.LocalVariable.Hicustomer + " AND UFID IN " + "(SELECT UFID FROM BASEDB.HICUSTOMER WHERE OWNERTPCLID = '" + m_Tpclid + "' AND GROUP1 = '" + m_Group + "')"; } OracleCommand Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); OracleDataReader reader = Command.ExecuteReader(); try { if (reader.Read()) { m_NewRec.setFsc(CCS.LocalVariable.Hicustomer); m_NewRec.setUfid(Convert.ToInt32(reader["ufid"].ToString())); m_NewRec.setFdrID(Convert.ToInt32(reader["fdr1"].ToString())); return CCS.LocalVariable.Success; } else return CCS.LocalVariable.No_Sxfmr; } catch (Exception ex) { _PLog.Error(ex.Message); return CCS.LocalVariable.Failure_By_DB; } finally { reader.Close(); Command.Dispose(); } } private void getLocateEquipment(CCS.Object.EventRecord m_NewRec) { String SqlStmt; SqlStmt = "SELECT OWNERFSC as FSC,OWNERUFID as UFID,OWNERTPCLID as TPCLID FROM "; switch (m_NewRec.getFsc()) { case CCS.LocalVariable.Sxfmr: SqlStmt = SqlStmt + "BASEDB.SXFMR WHERE UFID = " + m_NewRec.getUfid(); break; case CCS.LocalVariable.Hicustomer: SqlStmt = SqlStmt + "BASEDB.HICUSTOMER WHERE UFID = " + m_NewRec.getUfid(); break; } OracleCommand Command = new OracleCommand(SqlStmt, _ConnectionTPC, _Transaction); OracleDataReader reader = Command.ExecuteReader(); try { if (reader.Read()) { m_NewRec.getLocateEquipment().setFSC(Convert.ToInt32(reader["FSC"].ToString())); m_NewRec.getLocateEquipment().setUFID(Convert.ToInt32(reader["UFID"].ToString())); m_NewRec.getLocateEquipment().setTPCLID(reader["TPCLID"].ToString()); } } catch (Exception e) { _PLog.Error(e.Message); Console.WriteLine(e.StackTrace); } finally { reader.Close(); Command.Dispose(); } } } }