ulysseskao
2016-05-05 d4feb8da354b3f4a9c481d1751318751802384f5
use smartthreadpool
5 files modified
288 ■■■■■ changed files
CCSTrace/CCS/CCSMain.cs 5 ●●●●● patch | view | raw | blame | history
CCSTrace/CCS/FinishEvent.cs 5 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Function/Leach.cs 15 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/ProcessEvent.cs 261 ●●●●● patch | view | raw | blame | history
CCSTrace/CCSTrace.csproj 2 ●●● patch | view | raw | blame | history
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");
        }
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)
            {
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)
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 = " +
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" />