94527026b113a1ca05fdee94879fdc32c4471ab8..d4feb8da354b3f4a9c481d1751318751802384f5
2016-05-05 ulysseskao
use smartthreadpool
d4feb8 diff | tree
2016-05-05 ulysseskao
rename file
d7d23f diff | tree
1 files deleted
5 files modified
1 files added
558 ■■■■ 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/Object/DeptContrast.cs 137 ●●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/Dept_Contrast.cs 133 ●●●●● 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/Object/DeptContrast.cs
New file
@@ -0,0 +1,137 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.OracleClient;
using CCSTrace.TPower.DMMS.Model.CCS;
using NLog;
namespace CCSTrace.CCS.Object
{
    public class DeptContrast
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        public const string DefaultDept = "市區巡修課";
        public static DeptContrast Instance { get; } = new DeptContrast();
        private List<DEPTCONTRAST> _mTotalData;
        private DeptContrast()
        {
        }
        public int getDept_Code(string mMeter)
        {
            //int Result = CCS.CCSMain.EOSCodelist.getKeyID(CCS.GlobalVariable.Dept, DefaultDept);
            var result = -1;
            try
            {
                for (var i = 0; i < _mTotalData.Count; i++)
                {
                    var tmpData = _mTotalData[i];
                    if (tmpData.MAXMETER == null)
                    {
                        result = Convert.ToInt32(tmpData.DEPTCODE);
                        break;
                    }
                    else
                    {// 一對多(需作比對)
                        var minMeter = Convert.ToInt64(tmpData.MINMETER);
                        var maxMeter = Convert.ToInt64(tmpData.MAXMETER);
                        var custMeter = Convert.ToInt64(mMeter);
                        if ((custMeter > minMeter) && (custMeter < maxMeter))
                        {
                            result = Convert.ToInt32(tmpData.DEPTCODE);
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, ex.Message);
            }
            return result;
        }
        public int getDept_Code(int scCode, string meter)
        {
            var result = GlobalVariable.EosCodelist.GetKeyId(GlobalVariable.Dept, DefaultDept);
            try
            {
                for (var i = 0; i < _mTotalData.Count; i++)
                {
                    var tmpData = _mTotalData[i];
                    var tmpDept = Convert.ToInt32(tmpData.SCCODE);
                    if (tmpDept == scCode)
                    {
                        // 一對一(無最大最小電號限制)
                        if (tmpData.MAXMETER == null)
                        {
                            result = Convert.ToInt32(tmpData.DEPTCODE);
                            break;
                        }
                        else
                        {// 一對多(需作比對)
                            var minMeter = Convert.ToInt64(tmpData.MINMETER);
                            var maxMeter = Convert.ToInt64(tmpData.MAXMETER);
                            var custMeter = Convert.ToInt64(meter);
                            if ((custMeter > minMeter) && (custMeter < maxMeter))
                            {
                                result = Convert.ToInt32(tmpData.DEPTCODE);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, ex.Message);
            }
            return result;
        }
        public void Initialize(OracleConnection conn)
        {
            _mTotalData = new List<DEPTCONTRAST>();
            var sqlStmt = "SELECT SC_CODE,DEPT_CODE,MAX_METER,MIN_METER FROM CCS.DEPT_CONTRAST";
            var command = new OracleCommand(sqlStmt, conn);
            var reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    var deptcontrast = new DEPTCONTRAST
                    {
                        SCCODE = reader["SC_CODE"].ToString(),
                        DEPTCODE = reader["Dept_Code"].ToString(),
                        MAXMETER = reader["Max_Meter"].ToString(),
                        MINMETER = reader["Min_Meter"].ToString()
                    };
                    _mTotalData.Add(deptcontrast);
                }
            }
            catch (Exception e)
            {
                Logger.Warn(e, e.Message);
            }
            finally
            {
                reader?.Close();
                command?.Dispose();
            }
        }
    }
}
CCSTrace/CCS/Object/Dept_Contrast.cs
File was deleted
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" />