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