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 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 150 insertions(+), 111 deletions(-)

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 = " +

--
Gitblit v0.0.0-SNAPSHOT