From d4feb8da354b3f4a9c481d1751318751802384f5 Mon Sep 17 00:00:00 2001 From: ulysseskao <ulysseskao@gmail.com> Date: Thu, 05 May 2016 10:20:39 +0800 Subject: [PATCH] use smartthreadpool --- CCSTrace/CCS/ProcessEvent.cs | 261 ++++++++++++++++++++++++++++++---------------------- CCSTrace/CCS/FinishEvent.cs | 5 CCSTrace/CCS/CCSMain.cs | 5 + CCSTrace/CCSTrace.csproj | 2 CCSTrace/CCS/Function/Leach.cs | 15 +- 5 files changed, 165 insertions(+), 123 deletions(-) diff --git a/CCSTrace/CCS/CCSMain.cs b/CCSTrace/CCS/CCSMain.cs index 783c7e1..81b520d 100644 --- a/CCSTrace/CCS/CCSMain.cs +++ b/CCSTrace/CCS/CCSMain.cs @@ -77,6 +77,7 @@ AddrContrast.Instance.Initialize(_mainConn); AlarmData.Instance.Initialize(_mainConn); + DeptContrast.Instance.Initialize(_mainConn); var stpStartInfo = new STPStartInfo { @@ -337,6 +338,10 @@ { Logger.Error(e, e.Message); } + finally + { + conn?.Close(); + } Logger.Debug("Leave ProcessCase"); } diff --git a/CCSTrace/CCS/FinishEvent.cs b/CCSTrace/CCS/FinishEvent.cs index 5fd6565..81eaef5 100644 --- a/CCSTrace/CCS/FinishEvent.cs +++ b/CCSTrace/CCS/FinishEvent.cs @@ -12,11 +12,8 @@ private int _originCaseStatus; - public bool Finish(OracleConnection conn1, OracleTransaction trx1, EOSEventRecord eosEventRecord, int mKind) + public bool Finish(OracleConnection conn, OracleTransaction trx, EOSEventRecord eosEventRecord, int mKind) { - var conn = conn1; - var trx = trx1; - Logger.Info("進行OMS資料更新程序..."); if (eosEventRecord.ParentId == 0) { diff --git a/CCSTrace/CCS/Function/Leach.cs b/CCSTrace/CCS/Function/Leach.cs index ce7ce16..fa54f4e 100644 --- a/CCSTrace/CCS/Function/Leach.cs +++ b/CCSTrace/CCS/Function/Leach.cs @@ -2,6 +2,7 @@ using System.Data.OracleClient; using CCSTrace.CCS.Domain; +using CCSTrace.CCS.Object; using NLog; namespace CCSTrace.CCS.Function @@ -22,7 +23,7 @@ _traceConnectionString = traceConnection; } - public int LeachCase(Object.EOSEventRecord mNewRec) + public int LeachCase(EOSEventRecord mNewRec) { switch (SameCase(mNewRec)) { @@ -51,7 +52,7 @@ return _mergeCase.GetOldEquipment(); } - private int SameCase(Object.EOSEventRecord mNewRec) + private int SameCase(EOSEventRecord mNewRec) { 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 "; @@ -264,7 +265,7 @@ return status; } - private int Judge(Object.EOSEventRecord mNewRec, bool changeCaseType) + private int Judge(EOSEventRecord mNewRec, bool changeCaseType) { int mResult = GlobalVariable.FailureByDb; @@ -367,7 +368,7 @@ return mResult; } - private int GetEquipment(Object.EOSEventRecord mNewRec) + private int GetEquipment(EOSEventRecord mNewRec) { string temp; string mOwnerTpclid; @@ -417,7 +418,7 @@ } } - private int GetSxfmr(string mTpclid, string mGroup, Object.EOSEventRecord mNewRec) + private int GetSxfmr(string mTpclid, string mGroup, EOSEventRecord mNewRec) { string sqlStmt; int mStatus = GlobalVariable.FailureByDb; @@ -460,7 +461,7 @@ return mStatus; } - private int GetHicustomer(string mTpclid, string mGroup, Object.EOSEventRecord mNewRec) + private int GetHicustomer(string mTpclid, string mGroup, EOSEventRecord mNewRec) { string sqlStmt; @@ -502,7 +503,7 @@ } } - private void GetLocateEquipment(Object.EOSEventRecord mNewRec) + private void GetLocateEquipment(EOSEventRecord mNewRec) { var sqlStmt = "SELECT OWNERFSC as FSC,OWNERUFID as UFID,OWNERTPCLID as TPCLID FROM "; switch (mNewRec.Fsc) diff --git a/CCSTrace/CCS/ProcessEvent.cs b/CCSTrace/CCS/ProcessEvent.cs index 66b1e63..8e2935d 100644 --- a/CCSTrace/CCS/ProcessEvent.cs +++ b/CCSTrace/CCS/ProcessEvent.cs @@ -24,7 +24,7 @@ try { - var fdrid = GetFdrid(conn, trx, ccsEventRecord.Meter); + var fdrid = GetFdrid(conn, ccsEventRecord.Meter); if (fdrid != 0) //有饋線代號資料的案件才需比對同饋線上有無案件正在處理 { @@ -36,29 +36,6 @@ else CcsMain.Instance.AddProcessingFdr(fdrid); //將要處理的案件的饋線別加入處理中饋線集合 } - - /* - int TraceCount = this.getTraceCount(m_CCSRecord.CcsId); - bool TraceError = false; //追蹤次數超過3次,改為非A類不追蹤合併 - - switch (TraceCount) - { - case 0: - UpdateTraceCount(m_CCSRecord.CcsId,true); - TraceError = false; - break; - - case 2: - UpdateTraceCount(m_CCSRecord.CcsId,false); - TraceError = true; - break; - - default: - UpdateTraceCount(m_CCSRecord.CcsId,false); - TraceError = false; - break; - } - */ eosEventRecord = InitialEventRecord(conn, trx, ccsEventRecord); if (eosEventRecord != null) @@ -144,82 +121,6 @@ sendMail = true; } break; - /* switch (TraceCount) - { - case 0: - if (_Trx.Connection.State == ConnectionState.Open) - _Trx.Rollback(); - - _Trx.Dispose(); - - if ( Return_Status == CCS.GlobalVariable.CaseTransfer ) - _PLog.Error("案件已移轉,此事故案件不被受理...."); - else if ( Return_Status == CCS.GlobalVariable.Failure_By_DB ) - _PLog.Error("資料庫錯誤,此事故案件不被受理...."); - else if ( Return_Status == CCS.GlobalVariable.FDRLocked ) - _PLog.Error("饋線被鎖定,此事故案件不被受理...."); - else - _PLog.Error("此事故案件不被受理...."); - - UpdateTraceCount(m_CCSRecord.CcsId, true); - break; - - case 1: - if (_Trx.Connection.State == ConnectionState.Open) - _Trx.Rollback(); - - _Trx.Dispose(); - - UpdateTraceCount(m_CCSRecord.CcsId, false); - - break; - - default://追蹤次數超過3次,改為非A類不追蹤合併 - UpdateTraceCount(m_CCSRecord.CcsId, false); - if (Return_Status == CCS.GlobalVariable.Trace_Counts_3) - m_EventRecord.setNote(m_EventRecord.getNote() + "(本案用戶供電資料追蹤失敗)"); - - _PLog.Error("追蹤次數3次,無法追蹤到故障設備,以一般無電號案件方式受理...."); - m_EventRecord.setTrace_Finish(CCS.GlobalVariable.Trace_Finish); - Process(CCS.GlobalVariable.NoMeter); - SendMail = true; - break; - } - - break; - - case CCS.GlobalVariable.CaseTransfer: - if (_Trx.Connection.State == ConnectionState.Open) - _Trx.Rollback(); - - _Trx.Dispose(); - _PLog.Error("案件已移轉,此事故案件不被受理...."); - break; - - case CCS.GlobalVariable.FDRLocked: - if (_Trx.Connection.State == ConnectionState.Open) - _Trx.Rollback(); - - _Trx.Dispose(); - _PLog.Error("饋線被鎖定,此事故案件不被受理...."); - break; - - case CCS.GlobalVariable.Failure_By_DB: - if (_Trx.Connection.State == ConnectionState.Open) - _Trx.Rollback(); - - _Trx.Dispose(); - _PLog.Error("資料庫錯誤,此事故案件不被受理...."); - break; - - default: - if (_Trx.Connection.State == ConnectionState.Open) - _Trx.Rollback(); - - _Trx.Dispose(); - _PLog.Error("此事故案件不被受理...."); - break; - */ } } @@ -239,6 +140,149 @@ } if (eosEventRecord != null && eosEventRecord.FdrId!= 0) + CcsMain.Instance.RemoveProcessingFdr(eosEventRecord.FdrId); //將處理完的案件的饋線別從處理中饋線集合中移除 + //throw e; + } + finally + { + CcsMain.Instance.RemoveProcessingCases(ccsEventRecord.CcsId); + // OnThreadFinish(new ThreadEndEvent(_connectionTpc)); + } + + if (sendMail) + { + var mailService = new MailService(); + mailService.InitialSmtpClient(conn); + mailService.SendMail(ccsEventRecord.CcsId); + } + } + + public void DoProcessEventRecord(CCSEventRecord ccsEventRecord, OracleConnection conn) + { + var sendMail = false; + EOSEventRecord eosEventRecord = null; + + // Being Transaction + OracleTransaction trx = conn.BeginTransaction(); + + try + { + var fdrid = GetFdrid(conn, ccsEventRecord.Meter); + + if (fdrid != 0) //有饋線代號資料的案件才需比對同饋線上有無案件正在處理 + { + if (CcsMain.Instance.ContainProcessingFdr(fdrid)) + { + CcsMain.Instance.AddWaitingCases(ccsEventRecord.CcsId, fdrid); + return; + } + else + CcsMain.Instance.AddProcessingFdr(fdrid); //將要處理的案件的饋線別加入處理中饋線集合 + } + + eosEventRecord = InitialEventRecord(conn, trx, ccsEventRecord); + if (eosEventRecord != null) + { + var mLeach = new Leach(conn, trx, GlobalVariable.TraceConnectionString); // 案件過濾與合併 + Logger.Info("過濾案件..."); + var returnStatus = mLeach.LeachCase(eosEventRecord); + + switch (returnStatus) + { + case GlobalVariable.Success: + Logger.Info("案件過濾完畢...."); + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.Success); + break; + + case GlobalVariable.NoMeter: + Logger.Info("案件過濾完畢,用戶無電號...."); + eosEventRecord.TraceFinish = GlobalVariable.TraceFinish; + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.NoMeter); + break; + + case GlobalVariable.SameCustomer: + Logger.Info("相同用戶重複來電...."); + ProcessSameCustomer(conn, trx, ccsEventRecord, eosEventRecord); + break; + + case GlobalVariable.NoSupplyElc: + Logger.Warn("該饋線未供電,無法作事故案件追蹤合併...."); + eosEventRecord.TraceFinish = GlobalVariable.TraceFinish; + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.NoMeter); + break; + + case GlobalVariable.NoSxfmr: + Logger.Warn("該案件無變壓器...."); + eosEventRecord.TraceFinish = GlobalVariable.TraceFinish; + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.NoMeter); + break; + + case GlobalVariable.CaseTypeChanged: + Logger.Info("變更案件狀態...."); + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.CaseTypeChanged); + break; + + case GlobalVariable.TraceFailure: + Logger.Error("故障追蹤錯誤,以一般無電號案件方式受理...."); + eosEventRecord.TraceFinish = GlobalVariable.TraceFinish; + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.NoMeter); + break; + + default: + var traceCount = GetTraceCount(conn, trx, ccsEventRecord.CcsId); + + if (traceCount < 2) + { + if (trx.Connection.State == ConnectionState.Open) + trx.Rollback(); + + trx.Dispose(); + + if (returnStatus == GlobalVariable.CaseTransfer) + Logger.Error("案件已移轉,此事故案件暫不被受理...."); + else if (returnStatus == GlobalVariable.FailureByDb) + Logger.Error("資料庫錯誤,此事故案件暫不被受理...."); + else if (returnStatus == GlobalVariable.FdrLocked) + Logger.Error("饋線被鎖定,此事故案件暫不被受理...."); + else + Logger.Error("發生非預期錯誤,此事故案件暫不被受理...."); + + if (traceCount == 0) + UpdateTraceCount(conn, trx, ccsEventRecord.CcsId, true); + else + UpdateTraceCount(conn, trx, ccsEventRecord.CcsId, false); + } + else + { + UpdateTraceCount(conn, trx, ccsEventRecord.CcsId, false); + if (returnStatus == GlobalVariable.TraceCounts3) + eosEventRecord.Note = eosEventRecord.Note + "(本案用戶供電資料追蹤失敗)"; + + Logger.Error("事故案件處理次數3次,仍無法正常處理,以一般無電號案件方式受理...."); + eosEventRecord.TraceFinish = GlobalVariable.TraceFinish; + Process(conn, trx, ccsEventRecord, eosEventRecord, GlobalVariable.NoMeter); + sendMail = true; + } + break; + } + } + + if (fdrid != 0) + CcsMain.Instance.RemoveProcessingFdr(fdrid); //將處理完的案件的饋線別從處理中饋線集合中移除 + } + catch (Exception e) + { + Logger.Error(e, e.Message + ". CCSID = " + ccsEventRecord.CcsId); + + if (trx != null) + { + if (trx.Connection.State == ConnectionState.Open) + trx.Rollback(); + + trx.Dispose(); + } + + if (eosEventRecord != null && eosEventRecord.FdrId != 0) CcsMain.Instance.RemoveProcessingFdr(eosEventRecord.FdrId); //將處理完的案件的饋線別從處理中饋線集合中移除 //throw e; } @@ -362,7 +406,6 @@ var initialData = new InitialEventData(conn); var mContrast = new NumberContrast(); - var deptContrast = new DeptContrast(conn, trx); EOSEventRecord eosEventRecord = new EOSEventRecord(initialData.GetNewCaseId(), conn, trx) { AcceptNum = initialData.GetNewAcceptNum() @@ -389,14 +432,11 @@ { // 需先找出部門代號,再找到該部門屬於哪一個巡修單位 eosEventRecord.Meter = ccsEventRecord.Meter; - var tmp = deptContrast.getDept_Code(ccsEventRecord.Meter); + var tmp = DeptContrast.Instance.getDept_Code(ccsEventRecord.Meter); - if (tmp == -1) - eosEventRecord.Dept = FindoutDeptByAddr(trx, ccsEventRecord); - else - eosEventRecord.Dept = tmp; + eosEventRecord.Dept = tmp == -1 ? FindoutDeptByAddr(trx, ccsEventRecord) : tmp; - eosEventRecord.FdrId = GetFdrid(conn, trx, ccsEventRecord.Meter); + eosEventRecord.FdrId = GetFdrid(conn, ccsEventRecord.Meter); } else { @@ -881,14 +921,13 @@ return maxLength; } - private int GetFdrid(OracleConnection conn, OracleTransaction trx, string meter) + private int GetFdrid(OracleConnection conn, string meter) { var sqlStmt = "SELECT TRAN_CORD FROM BASEDB.METER WHERE METR_NUMB = '" + meter + "'"; - var command = new OracleCommand(sqlStmt, conn, trx); + var command = new OracleCommand(sqlStmt, conn); var reader = command.ExecuteReader(); var tpclid = ""; var fdrid = 0; - var group = ""; try { if (reader.Read()) @@ -899,7 +938,7 @@ if (tpclid.Length > 11) { - group = tpclid.Substring(tpclid.Length - 3); + var group = tpclid.Substring(tpclid.Length - 3); tpclid = tpclid.Substring(0, 11).Trim(); sqlStmt = "SELECT FDR1 FROM BASEDB.CONNECTIVITY WHERE FSC = 115 AND UFID = " + diff --git a/CCSTrace/CCSTrace.csproj b/CCSTrace/CCSTrace.csproj index 34d5f6e..ef6b445 100644 --- a/CCSTrace/CCSTrace.csproj +++ b/CCSTrace/CCSTrace.csproj @@ -178,7 +178,7 @@ <Compile Include="CCS\Object\AlarmData.cs" /> <Compile Include="CCS\Object\CCSCodelist.cs" /> <Compile Include="CCS\Object\CCSEventRecord.cs" /> - <Compile Include="CCS\Object\Dept_Contrast.cs" /> + <Compile Include="CCS\Object\DeptContrast.cs" /> <Compile Include="CCS\Object\EOSCodelist.cs" /> <Compile Include="CCS\Object\CCSEventQuery.cs" /> <Compile Include="CCS\Object\EOSEventRecord.cs" /> -- Gitblit v0.0.0-SNAPSHOT