ulysseskao
2016-05-03 410dc2d04dbecf019129cd8cd65a3be2c62b4d0c
refator code
25 files modified
1383 ■■■■ changed files
CCSTrace.Tests/App_Data/DBConfig.xml 11 ●●●● patch | view | raw | blame | history
CCSTrace.Tests/CCSTrace.Tests.csproj 8 ●●●●● patch | view | raw | blame | history
CCSTrace.Tests/CcsMainTest.cs patch | view | raw | blame | history
CCSTrace.Tests/Properties/AssemblyInfo.cs patch | view | raw | blame | history
CCSTrace.Tests/Properties/PexAssemblyInfo.cs patch | view | raw | blame | history
CCSTrace.Tests/Service1Test.cs patch | view | raw | blame | history
CCSTrace/CCS/CCSMain.cs 161 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Domain/CCSCaseState.cs 6 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/EventAI/JudgeCase.cs 39 ●●●●● patch | view | raw | blame | history
CCSTrace/CCS/EventAI/TraceSubject.cs 93 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/FinishEvent.cs 237 ●●●●● patch | view | raw | blame | history
CCSTrace/CCS/Function/InitialEventData.cs 56 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Function/Leach.cs 29 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Function/MailService.cs 3 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Function/MergeCase.cs 12 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/Addr_Contrast.cs 82 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/AlarmData.cs 1 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/Dept_Contrast.cs 19 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/EOSCodelist.cs 3 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/LocateEquipment.cs 91 ●●●●● patch | view | raw | blame | history
CCSTrace/CCS/Object/NumberContrast.cs 57 ●●●● patch | view | raw | blame | history
CCSTrace/CCS/ProcessEvent.cs 366 ●●●● patch | view | raw | blame | history
CCSTrace/CCSTrace.csproj 97 ●●●● patch | view | raw | blame | history
CCSTrace/Global.asax.cs 4 ●●●● patch | view | raw | blame | history
CCSTrace/Service1.asmx.cs 8 ●●●● patch | view | raw | blame | history
CCSTrace.Tests/App_Data/DBConfig.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="big5" ?>
  <CCS>
    <DBSetting DataSource = "NNTPC" UserId = "basedb" Password = "BASEDB000" ConnectionCount = "3" ShowError = "false" />
    <ThreadSetting maxThreadSize="5" minThreadSize="1" />
  </CCS>
<?xml version="1.0" encoding="big5"?>
<CCS>
  <DBSetting DataSource="NNTPC" UserId="basedb" Password="BASEDB000" ConnectionCount="3" ShowError="false" />
  <ThreadSetting maxThreadSize="5" minThreadSize="1" />
</CCS>
CCSTrace.Tests/CCSTrace.Tests.csproj
@@ -52,7 +52,12 @@
    <Reference Include="Microsoft.Pex.Framework">
      <HintPath>..\..\..\..\..\Dev\Microsoft\VisualStudio-14.0\Common7\IDE\Extensions\Microsoft\Pex\Microsoft.Pex.Framework.dll</HintPath>
    </Reference>
    <Reference Include="NHibernate, Version=3.4.0.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\CCSTrace\bin\NHibernate.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
    </Reference>
@@ -82,6 +87,9 @@
    <Content Include="App_Data\DBConfig.xml">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="DMMSNHibernate.cfg.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <Choose>
    <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
CCSTrace.Tests/CcsMainTest.cs
Binary files differ
CCSTrace.Tests/Properties/AssemblyInfo.cs
Binary files differ
CCSTrace.Tests/Properties/PexAssemblyInfo.cs
Binary files differ
CCSTrace.Tests/Service1Test.cs
Binary files differ
CCSTrace/CCS/CCSMain.cs
@@ -4,6 +4,7 @@
using System.Data;
using System.Data.OracleClient;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Web;
@@ -11,6 +12,7 @@
using Amib.Threading;
using CCSTrace.CCS.Domain;
using CCSTrace.CCS.Object;
using Iesi.Collections.Generic;
using NLog;
namespace CCSTrace.CCS
@@ -22,17 +24,15 @@
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private static CcsMain _instance;
        public static ArrayList ProcessCases = new ArrayList();
        public static Queue<int> ProcessCaseQueue = new Queue<int>();
        public static Hashtable ProcessFdr = new Hashtable();//Record the processing FDR
        public static ArrayList WaitingCases = new ArrayList();//Record the case when the case's FDR processed by another
        private int _connectionCount = 1;
        private readonly int _connectionCount = 1;
        private OracleConnection _mainConn = null;
        private SmartThreadPool _mainjobThreadPool = null;
        private readonly object _syncDbQueue = new object();
        private readonly Queue<OracleConnection> _dbQueue = new Queue<OracleConnection>();
        private readonly List<string> _processingCases = new List<string>();
        private readonly List<KeyValuePair<string, int>> _waitingCases = new List<KeyValuePair<string, int>>();//Record the case when the case's FDR processed by another
        public CcsMain()
        {
@@ -42,18 +42,13 @@
        public string AppDataPath { get; set; }
        public static CcsMain Instance()
        {
            // Uses lazy initialization.
        public SortedSet<int> ProcessingFdr { get; } = new SortedSet<int>();
            // Note: this is not thread safe.
        public static CcsMain Instance => _instance ?? (_instance = new CcsMain());
            if (_instance == null)
            {
                _instance = new CcsMain();
            }
            return _instance;
        }
        public List<string> ProcessingCases => _processingCases;
        public List<KeyValuePair<string, int>> WaitingCases => _waitingCases;
        public void Startup()
        {
@@ -66,13 +61,12 @@
                if (_mainConn == null)
                    _mainConn = CreateConnection();
                //MainConn = CreateMainConnection();
                Logger.Info("CCSMain has been connected database.");
                GlobalVariable.CcsCodelist = new CcsCodelist(_mainConn);
                GlobalVariable.EosCodelist = new EosCodelist(_mainConn);
                for (int i = 0; i < _connectionCount; i++)
                for (var i = 0; i < _connectionCount; i++)
                {
                    lock (_syncDbQueue) _dbQueue.Enqueue(CreateConnection());
                }
@@ -82,23 +76,25 @@
                Logger.Error(e, e.Message);
                throw;
            }
            finally
            {
            }
            CcsRecord mRecord = GetWaitRecord(_mainConn);
            var addrContrast = AddrContrast.Instance;
            addrContrast.initialize(_mainConn);
            if (mRecord != null)
            CCSEventRecord ccsEventRecord = GetWaitRecord(_mainConn);
            if (ccsEventRecord != null)
            {
                OracleConnection conn = null;
                OracleConnection conn;
                lock (_syncDbQueue) conn = _dbQueue.Dequeue();
                ProcessCase(mRecord, conn);
                ProcessCase(ccsEventRecord, conn);
            }
            STPStartInfo stpStartInfo = new STPStartInfo();
            stpStartInfo.IdleTimeout = GlobalVariable.IdleTimeout * 1000;
            stpStartInfo.MaxWorkerThreads = GlobalVariable.MaxThreadSize;
            stpStartInfo.MinWorkerThreads = GlobalVariable.MinThreadSize;
            STPStartInfo stpStartInfo = new STPStartInfo
            {
                IdleTimeout = GlobalVariable.IdleTimeout*1000,
                MaxWorkerThreads = GlobalVariable.MaxThreadSize,
                MinWorkerThreads = GlobalVariable.MinThreadSize
            };
            _mainjobThreadPool = new SmartThreadPool(stpStartInfo);
            Logger.Info("Create Thread Pool.");
        }
@@ -112,11 +108,18 @@
            GC.WaitForPendingFinalizers();
        }
        public void AcceptEvent(CcsRecord record)
        public void AcceptEvent(CCSEventRecord ccsEventRecord)
        {
            /*
            WorkItemCallback workItemCallback = new WorkItemCallback(this.DoWork);
            _mainjobThreadPool.QueueWorkItem(workItemCallback, record);
            _mainjobThreadPool.QueueWorkItem(workItemCallback, ccsEventRecord);
            WIGStartInfo wigStartInfo = new WIGStartInfo()
            {
                FillStateWithArgs = true,
            };
            _wig1 = _smartThreadPool.CreateWorkItemsGroup((int)spinCon1.Value, wigStartInfo);
            _wig2 = _smartThreadPool.CreateWorkItemsGroup((int)spinCon2.Value, wigStartInfo);
            */
            int i = 0;
@@ -126,18 +129,18 @@
            {
                try
                {
                    if (InsertEventRecord(record, _mainConn))
                    if (InsertCCSEventRecord(ccsEventRecord, _mainConn))
                    {
                        if (_dbQueue.Count > 0)
                        {
                            //將EVETNQUERY的案件狀態改為開始處理
                            CcsRecord mRecord = GetWaitRecord(_mainConn);
                            CCSEventRecord waitCcsEventRecord = GetWaitRecord(_mainConn);
                            if (mRecord != null)
                            if (waitCcsEventRecord != null)
                            {
                                OracleConnection conn = null;
                                lock (_syncDbQueue) conn = _dbQueue.Dequeue();
                                ProcessCase(mRecord, conn);
                                ProcessCase(waitCcsEventRecord, conn);
                            }
                        }
@@ -226,7 +229,15 @@
        private OracleConnection CreateConnection()
        {
            OracleConnection dbConn = new OracleConnection(GlobalVariable.ConnectionString);
            OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder(GlobalVariable.ConnectionString)
            {
                MaxPoolSize = 20,
                MinPoolSize = 5,
                Pooling = true
            };
            string connectstring = builder.ToString();
            OracleConnection dbConn = new OracleConnection(connectstring);
            dbConn.Open();
@@ -234,7 +245,7 @@
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        private bool InsertEventRecord(CcsRecord record, OracleConnection conn)
        private bool InsertCCSEventRecord(CCSEventRecord ccsEventRecord, OracleConnection conn)
        {
            OracleTransaction transaction = null;
@@ -245,18 +256,18 @@
                transaction = conn.BeginTransaction();
                if (record.InsertDb(conn, transaction))
                if (ccsEventRecord.InsertDb(conn, transaction))
                {
                    var eventQuery = new EventQuery
                    var ccsEventQuery = new CCSEventQuery
                    {
                        CcsId = record.CcsId,
                        Meter = record.Meter,
                        CcsId = ccsEventRecord.CcsId,
                        Meter = ccsEventRecord.Meter,
                        CaseStatus = (int) CCSCaseState.EventInitial,
                        ChangeTime = record.AcceptTime
                        ChangeTime = ccsEventRecord.AcceptTime
                    };
                    if (eventQuery.Insert(conn, transaction))
                    if (ccsEventQuery.Insert(conn, transaction))
                        transaction.Commit();
                    else
                    {
@@ -298,14 +309,14 @@
        private delegate void WorkerThreadHandler();
        private void ProcessCase(CcsRecord record, OracleConnection conn)
        private void ProcessCase(CCSEventRecord ccsEventRecord, OracleConnection conn)
        {
            try
            {
                if (conn.State.ToString().Equals("Closed"))
                if (conn.State == ConnectionState.Closed)
                    conn.Open();
                ProcessEvent processEvent = new ProcessEvent(record, conn, GlobalVariable.TraceConnectionString);
                ProcessEvent processEvent = new ProcessEvent(ccsEventRecord, conn, GlobalVariable.TraceConnectionString);
                processEvent.ThreadFinish += ThreadEndEventProcess;
                ThreadStart threadStart = processEvent.Run;
@@ -321,12 +332,12 @@
        private void ThreadEndEventProcess(object sender, ThreadEndEvent e)
        {
            //將EVETNQUERY的案件狀態改為開始處理
            CcsRecord mRecord = GetWaitRecord(e.GetConnection());
            CCSEventRecord waitCcsEventRecord = GetWaitRecord(e.GetConnection());
            try
            {
                if (mRecord != null)
                    ProcessCase(mRecord, e.GetConnection());
                if (waitCcsEventRecord != null)
                    ProcessCase(waitCcsEventRecord, e.GetConnection());
            }
            finally 
            {
@@ -335,39 +346,39 @@
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        private CcsRecord GetWaitRecord(OracleConnection conn)
        private CCSEventRecord GetWaitRecord(OracleConnection conn)
        {
            string processCcsid = "";
            string ccsid = "";
            CcsRecord record = null;
            CCSEventRecord ccsEventRecord = null;
            foreach (string[] obj in WaitingCases)
            foreach (var obj in _waitingCases)
            {
                string ccsId = obj[0];
                string fdrid = obj[1];
                var ccsId = obj.Key;
                var fdrid = obj.Value;
                if (ProcessFdr.ContainsKey(fdrid)) //該條饋線仍有案件在處理中
                if (ProcessingFdr.Contains(fdrid)) //該條饋線仍有案件在處理中
                    processCcsid = processCcsid + "'" + ccsid + "',";
                else
                {
                    ccsid = ccsId;
                    WaitingCases.Remove(obj);
                    _waitingCases.Remove(obj);
                    break;
                }
            }
            if (ccsid.Length == 0)  //沒有因同饋線而在等候中的案件
            {
                string sqlStmt = "SELECT Q.CCSID AS CCSID FROM CCS.EVENTQUERY Q,CCS.EVENTRECORD R WHERE Q.CASESTATUS IN (" + (int) CCSCaseState.EventInitial + "," + (int) CCSCaseState.EventProcess + ")";
                IEnumerator Enum = ProcessCases.GetEnumerator();
                var sqlStmt = "SELECT Q.CCSID AS CCSID FROM CCS.EVENTQUERY Q,CCS.EVENTRECORD R WHERE Q.CASESTATUS IN (" +
                    (int) CCSCaseState.EventInitial + "," +
                    (int) CCSCaseState.EventProcess + ")";
                while (Enum.MoveNext())
                    if (Enum.Current != null) processCcsid = processCcsid + "'" + Enum.Current + "',";
                processCcsid = _processingCases.Aggregate(processCcsid, (current, item) => current + "'" + item + "',");
                if (processCcsid.Length != 0)
                    sqlStmt = sqlStmt + " AND Q.CCSID NOT IN (" + processCcsid.Substring(0, processCcsid.Length - 1) + ")";
                sqlStmt = sqlStmt + " AND Q.CCSID = R.CCSID AND ROWNUM < 2 ORDER BY Q.ChangeTime";
                sqlStmt = sqlStmt + " AND Q.CCSID = R.CCSID AND ROWNUM < 2 ORDER BY Q.CHANGETIME";
                OracleCommand command = new OracleCommand(sqlStmt, conn);
                OracleDataReader reader = command.ExecuteReader();
@@ -388,44 +399,46 @@
            }
            if (ccsid.Length != 0)
                record = new CcsRecord(ccsid, conn);
                ccsEventRecord = new CCSEventRecord(ccsid, conn);
            if (record != null)
            if (ccsEventRecord != null)
            {
                EventQuery eventQuery = new EventQuery();
                CCSEventQuery ccsEventQuery = new CCSEventQuery
                {
                    CcsId = ccsEventRecord.CcsId,
                    CaseStatus = (int) CCSCaseState.EventProcess
                };
                //先將EVETNQUERY的案件狀態改為開始處理
                eventQuery.CcsId = record.CcsId;
                eventQuery.CaseStatus = (int) CCSCaseState.EventProcess;
                OracleTransaction transaction = conn.BeginTransaction();
                try
                {
                    if (eventQuery.UpdateCaseStatus(conn, transaction))
                    if (ccsEventQuery.UpdateCaseStatus(conn, transaction))
                    {
                        Logger.Info("更新EVENTQUERY的案件狀態為處理中.(CCSID = " + record.CcsId + ")");
                        Logger.Info("更新EVENTQUERY的案件狀態為處理中.(CCSID = " + ccsEventRecord.CcsId + ")");
                        transaction.Commit();
                        ProcessCases.Add(record.CcsId);
                        _processingCases.Add(ccsEventRecord.CcsId);
                    }
                    else
                    {
                        Logger.Error("無法更新EVENTQUERY的案件狀態.(CCSID = " + record.CcsId + ")");
                        Logger.Error("無法更新EVENTQUERY的案件狀態.(CCSID = " + ccsEventRecord.CcsId + ")");
                        if (transaction.Connection.State.ToString().Equals("Open"))
                        if (transaction.Connection.State == ConnectionState.Open)
                            transaction.Rollback();
                    }
                }
                catch (Exception e)
                {
                    if (transaction.Connection.State.ToString().Equals("Open"))
                    if (transaction.Connection.State == ConnectionState.Open)
                        transaction.Rollback();
                    Logger.Error(e, e.Message);
                    record = null;
                    ccsEventRecord = null;
                }
            }
            return record;
            return ccsEventRecord;
        }
    }
}
CCSTrace/CCS/Domain/CCSCaseState.cs
@@ -12,8 +12,8 @@
        EventFinsh = 1007, // with no RepairRecord
        EventComplete = 1008, // with RepairRecord
        EventOver = 1009, // with RepairRecord but not upload
        EventReturn = 2001, // Return the EventRecord
        AlarmFailure = 2002, // EventRecord AlarmFailure
        EventTrasnfer = 2003 // EventRecord Transfer to Process
        EventReturn = 2001, // Return the EOSEventRecord
        AlarmFailure = 2002, // EOSEventRecord AlarmFailure
        EventTrasnfer = 2003 // EOSEventRecord Transfer to Process
    }
}
CCSTrace/CCS/EventAI/JudgeCase.cs
@@ -22,7 +22,7 @@
        private int _inferFsc; // 推測出可能受損的設備種類
        private int _inferUfid; // 推測出可能受損的設備編號
        private int _parentCaseId = 0;
        private Equipment _mEquip;
        private Equipment _equip;
        private readonly OracleConnection _connectionTpc;
        private readonly OracleTransaction _transaction;
@@ -30,13 +30,13 @@
        // int Range = 360; //比事故案件還早多久時間內的案件才作合併 單位:分
        public JudgeCase(int mFdrId, int mFsc, int mUfid, int mCaseId, string mAcceptDate, OracleConnection connection, OracleTransaction trx, string traceConnection)
        public JudgeCase(int fdrId, int fsc, int ufid, int caseId, string acceptDate, OracleConnection connection, OracleTransaction trx, string traceConnection)
        {
            _damageFdrId = mFdrId;
            _damageFsc = mFsc;
            _damageUfid = mUfid;
            _newCaseId = mCaseId;
            _acceptDate = mAcceptDate;
            _damageFdrId = fdrId;
            _damageFsc = fsc;
            _damageUfid = ufid;
            _newCaseId = caseId;
            _acceptDate = acceptDate;
            _connectionTpc = connection;
            _transaction = trx;
@@ -82,18 +82,15 @@
            }
            catch (Exception e)
            {
                Logger.Error(e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, e.Message);
                Logger.Error("尋找母案件時發生錯誤.");
                throw e;
                throw ;
            }
            finally
            {
                if (command != null)
                    command.Dispose();
                command?.Dispose();
                if (reader != null)
                    reader.Close();
                reader?.Close();
            }
            // 若事故案件為該饋線上的第一件事故案件時,無須再作追蹤比較
@@ -129,7 +126,7 @@
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                throw ex;
                throw;
            }
            Logger.Info("不同變壓器,開始追蹤(New Version)...");
@@ -185,7 +182,7 @@
                                    _parentCaseId = Convert.ToInt32(((ArrayList)_mCase[i])[0].ToString());
                                    _inferFsc = ((Equipment)_newCase[j]).Fsc;
                                    _inferUfid = ((Equipment)_newCase[j]).Ufid;
                                    _mEquip = (Equipment)((ArrayList)_mCase[i])[5];
                                    _equip = (Equipment)((ArrayList)_mCase[i])[5];
                                    Logger.Info("與案件" + ((ArrayList)_mCase[i])[7] + "合併,故障點Fsc: " + _inferFsc + " Ufid: " + _inferUfid);
                                    return;
                                }
@@ -217,7 +214,7 @@
                                    _parentCaseId = Convert.ToInt32(((ArrayList)_mCase[i])[0].ToString());
                                    _inferFsc = damageEquipment.Fsc;
                                    _inferUfid = damageEquipment.Ufid;
                                    _mEquip = (Equipment)((ArrayList)_mCase[i])[5];
                                    _equip = (Equipment)((ArrayList)_mCase[i])[5];
                                    Logger.Info("與案件" + ((ArrayList)_mCase[i])[7] + "合併,故障點Fsc: " + _inferFsc + " Ufid: " + _inferUfid);
                                    return;
                                }
@@ -250,7 +247,7 @@
        public Equipment GetOldrEquipment()
        {
            return _mEquip;
            return _equip;
        }
        public int GetParentCaseId()
@@ -287,8 +284,7 @@
            }
            catch (Exception e)
            {
                Logger.Error("Problems occur: " + e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, "Problems occur: " + e.Message);
            }
            finally
            {
@@ -322,8 +318,7 @@
            catch (Exception e)
            {
                // CCS.GlobalVariable.ErrorLog.setErrorLog("Error in JudgeCase(RealDamageEquipment) :" + e.getMessage());
                Logger.Error("Problems occur: " + e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, "Problems occur: " + e.Message);
            }
            finally
            {
CCSTrace/CCS/EventAI/TraceSubject.cs
@@ -10,15 +10,15 @@
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private string _mDbConnectionString;
        private string _dbConnectionString;
        private static bool _isNewCase;
        private static ArrayList _mLinkList;                                // store the switch of the new case path
        private static TraceEngine _mTEngine;
        private static Hashtable _mTreeMap;                             // store the switch of the old case path
        private static ArrayList _linkList;                                // store the switch of the new case path
        private static TraceEngine _traceEngine;
        private static Hashtable _treeMap;                             // store the switch of the old case path
        private static int _sFsc;
        private static int _sUfid;
        private readonly ArrayList _mTmp = new ArrayList();
        private NetworkContext _mPContext;
        private readonly ArrayList _tmp = new ArrayList();
        private NetworkContext _context;
        private readonly OracleConnection _connectionTpc;
        private readonly OracleTransaction _transaction;
@@ -27,35 +27,35 @@
        {
            _connectionTpc = conn;
            _transaction = trx;
            _mDbConnectionString = traceConnectionString;
            _dbConnectionString = traceConnectionString;
            try
            {
                if (_mTEngine == null)
                if (_traceEngine == null)
                {
                    _mTEngine = new TraceEngine();
                    _traceEngine = new TraceEngine();
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex, ex.Message);
                throw ex;
                throw;
            }
        }
        public void DiscardEngine()
        {
            _mTEngine = null;
            _traceEngine = null;
        }
        public ArrayList GetNewResult()
        {
            return _mLinkList;
            return _linkList;
        }
        public Hashtable GetOldResult()
        {
            return _mTreeMap;
            return _treeMap;
        }
        // for EOS(only get the reverse tree)
@@ -64,8 +64,8 @@
            _sFsc = startFsc;
            _sUfid = startUfid;
            _isNewCase = mIsNew;
            _mTreeMap = new Hashtable();
            _mLinkList = new ArrayList();
            _treeMap = new Hashtable();
            _linkList = new ArrayList();
            try
            {
@@ -173,11 +173,11 @@
                            Equipment equip = new Equipment(node.ClassID, node.ObjectID);
                            if (_isNewCase)
                                _mLinkList.Add(equip);
                                _linkList.Add(equip);
                            else
                            {
                                _mTreeMap.Add(node.ObjectID, equip);
                                _mTmp.Add(equip);
                                _treeMap.Add(node.ObjectID, equip);
                                _tmp.Add(equip);
                            }
                            i++;
@@ -188,7 +188,6 @@
                            */
                        }
                        Console.WriteLine(node.ClassID + "----->" + node.ObjectID);
                        Logger.Info(node.ClassID + "----->" + node.ObjectID);
                        iti.MoveDescent((short)0);
@@ -208,11 +207,11 @@
                        Equipment equip = new Equipment(node.ClassID, node.ObjectID);
                        if (_isNewCase)
                            _mLinkList.Add(equip);
                            _linkList.Add(equip);
                        else
                        {
                            _mTreeMap.Add(node.ObjectID, equip);
                            _mTmp.Add(equip);
                            _treeMap.Add(node.ObjectID, equip);
                            _tmp.Add(equip);
                        }
                        i++;    //後面直接就FINISH,所以就不用判斷tracecount
@@ -231,11 +230,11 @@
                        if (IsEndEquip(equip))
                        {
                            if (_isNewCase)
                                _mLinkList.Add(equip);
                                _linkList.Add(equip);
                            else
                            {
                                _mTreeMap.Add(node.ObjectID, equip);
                                _mTmp.Add(equip);
                                _treeMap.Add(node.ObjectID, equip);
                                _tmp.Add(equip);
                            }
                            i++;    //後面直接就FINISH,所以就不用判斷tracecount
@@ -294,11 +293,11 @@
                            {
                                case 108:
                                    if (_isNewCase)
                                        _mLinkList.Add(equip);
                                        _linkList.Add(equip);
                                    else
                                    {
                                        _mTreeMap.Add(node.ObjectID, equip);
                                        _mTmp.Add(equip);
                                        _treeMap.Add(node.ObjectID, equip);
                                        _tmp.Add(equip);
                                    }
                                    Logger.Info(node.ClassID + "----->" + node.ObjectID);
@@ -328,11 +327,11 @@
                                    if (!ostatus)
                                    {
                                        if (_isNewCase)
                                            _mLinkList.Add(equip);
                                            _linkList.Add(equip);
                                        else
                                        {
                                            _mTreeMap.Add(node.ObjectID, equip);
                                            _mTmp.Add(equip);
                                            _treeMap.Add(node.ObjectID, equip);
                                            _tmp.Add(equip);
                                        }
                                        Logger.Info(node.ClassID + "----->" + node.ObjectID);
@@ -380,9 +379,8 @@
            }
            catch (Exception e)
            {
                Logger.Error(e.Message);
                Console.WriteLine(e.StackTrace);
                return tree;
                Logger.Error(e, e.Message);
                return null;
            }
            try
@@ -391,8 +389,7 @@
            }
            catch (Exception e)
            {
                Logger.Error(e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, e.Message);
            }
            return tree;
@@ -400,17 +397,17 @@
        private void ConfigTrace()
        {
            if (_mDbConnectionString == null)
            if (_dbConnectionString == null)
            {
                _mDbConnectionString = "basedb/basedb000@nntpc";
                _dbConnectionString = "basedb/basedb000@nntpc";
            }
            try
            {
                if (_mPContext == null) _mPContext = _mTEngine.teoCreateContext();
                if (_context == null) _context = _traceEngine.teoCreateContext();
                if (_mPContext.IsConnected == 0)
                if (_context.IsConnected == 0)
                {
                    _mPContext.Connect("", _mDbConnectionString);
                    _context.Connect("", _dbConnectionString);
                }
            }
            catch (Exception ex)
@@ -445,10 +442,10 @@
            tContext.addCriterion(sCriterion);
            tContext.addCriterion(eCriterion);
            _mPContext.ResetContext();
            _context.ResetContext();
            Logger.Info("Set ModeTrace OK.");
            ResultTreeBuilder trBuilder = _mPContext.CreateTreeBuilder();
            ResultTreeBuilder trBuilder = _context.CreateTreeBuilder();
            if (!trBuilder.constructResultTree(tContext, TRAVELTHREADMODE.CONMODE_SYNCHRONOUS)) { return null; }
            Logger.Info("ConstructResultTree OK.");
            ResultTree result = trBuilder.ResultTree;
@@ -460,12 +457,11 @@
        //判斷是否為最終設備(逆向追到已經無child的設備時,檢查該設備是否為最終設備(查驗該設備的同層設備,是否仍有可繼續逆向追蹤的設備,若無,則該設備為最終設備
        private bool IsEndEquip(Equipment selfEquip)
        {
            string sqlStmt;
            OracleCommand command = null;
            OracleDataReader reader = null;
            long nValue = 0;
            sqlStmt = "SELECT DIR,OSTATUS,N1,N2 FROM BASEDB.CONNECTIVITY WHERE FSC = " + selfEquip.Fsc+ " AND UFID = " + selfEquip.Ufid;
            var sqlStmt = "SELECT DIR,OSTATUS,N1,N2 FROM BASEDB.CONNECTIVITY WHERE FSC = " + selfEquip.Fsc+ " AND UFID = " + selfEquip.Ufid;
            try
            {
@@ -539,11 +535,8 @@
            }
            finally
            {
                if (command != null)
                    command.Dispose();
                if (reader != null)
                    reader.Close();
                command?.Dispose();
                reader?.Close();
            }
            return true;
CCSTrace/CCS/FinishEvent.cs
@@ -1,5 +1,4 @@
using System;
using System.Data.OracleClient;
using CCSTrace.CCS.Domain;
using NLog;
@@ -12,7 +11,7 @@
        private bool _upLevel;
        private int _originCaseStatus = 0;
        private Object.EventRecord _mEventRec = null;
        private Object.EOSEventRecord _eosEventRecord = null;
        private OracleConnection _connectionTpc;
        private OracleTransaction _transaction;
@@ -20,24 +19,26 @@
        {
        }
        public bool Finish(int mKind, Object.EventRecord mRecord, OracleConnection conn, OracleTransaction trx)
        public bool Finish(int mKind, Object.EOSEventRecord eosEventRecord, OracleConnection conn, OracleTransaction trx)
        {
            _mEventRec = mRecord;
            _eosEventRecord = eosEventRecord;
            _connectionTpc = conn;
            _transaction = trx;
            Logger.Info("進行OMS資料更新程序...");
            if (mRecord.ParentId== 0)
            { // Original Case
                if (!(ProcessSingalCase(mRecord)))
            if (eosEventRecord.ParentId == 0)
            {
                // Original Case
                if (!(ProcessSingalCase(eosEventRecord)))
                {
                    return false;
                }
                Logger.Info("更新eos.events成功!");
            }
            else
            { // Child Case
                if (!(ProcessMergeCase(mRecord)))
            {
                // Child Case
                if (!(ProcessMergeCase(eosEventRecord)))
                {
                    return false;
                }
@@ -45,7 +46,7 @@
            }
            // inert into eos.eventrecord && eos.eventrecord_ex
            OracleCommand command = new OracleCommand(mRecord.GetSqlStmt(), _connectionTpc, _transaction);
            OracleCommand command = new OracleCommand(eosEventRecord.GetInsertSqlStmt(), _connectionTpc, _transaction);
            OracleCommand command1 = null;
            try
@@ -57,7 +58,7 @@
                    return false;
                }
                command.CommandText = mRecord.LocateEquipment.GetSqlStmt();
                command.CommandText = eosEventRecord.LocateEquipment.GetInsertSqlStmt();
                if (command.ExecuteNonQuery() <= 0)
                {
                    Logger.Error("儲存資料時發生錯誤: 無法更新eos.eventrecord_ex");
@@ -69,9 +70,9 @@
                if ((mKind == GlobalVariable.Success) || (mKind == GlobalVariable.CaseTypeChanged))
                {
                    /* 當饋線全停時不需注意影響虛擬用戶,影響用戶資料會由實際切開關產生 */
                    if (mRecord.Fsc!= GlobalVariable.Breaker)
                    if (eosEventRecord.Fsc != GlobalVariable.Breaker)
                    {
                        if (!SetVisualCustomer(mRecord))
                        if (!SetVisualCustomer(eosEventRecord))
                        {
                            Logger.Error("新增影響用戶資料錯誤.");
                            return false;
@@ -81,14 +82,14 @@
                    _upLevel = false; /* 判斷交辦案件是否升級為母案件 */
                    if (!(UpdateImportCase(mRecord)))
                    if (!(UpdateImportCase(eosEventRecord)))
                    {
                        Logger.Error("處理案件等級變更時發生錯誤.");
                        return false;
                    }
                    Logger.Info("處理案件等級變更成功!");
                    if (!(UpdateRecuseOrder(mRecord)))
                    if (!(UpdateRecuseOrder(eosEventRecord)))
                    {
                        Logger.Error("新增搶修順序資料時發生錯誤.");
                        return false;
@@ -97,7 +98,7 @@
                    if (mKind == GlobalVariable.CaseTypeChanged)
                    {
                        if (!DeleteOldCase(mRecord))
                        if (!DeleteOldCase(eosEventRecord))
                        {
                            Logger.Error("案件轉換發生錯誤");
                            return false;
@@ -105,7 +106,7 @@
                        Logger.Info("案件轉換成功!");
                    }
                    if (!SaveCustomerTel(mRecord))
                    if (!SaveCustomerTel(eosEventRecord))
                    {
                        Logger.Error("無法將用戶電話回存回資料庫.");
                        return false;
@@ -114,9 +115,9 @@
                }
                else if (mKind == GlobalVariable.NoMeter)
                {
                    var sqlStmt = "INSERT INTO EOS.RESCUE_ORDER SELECT " + mRecord.CaseId+ ",999,COUNT(*) + 1,'',"
                                     + mRecord.LocateEquipment.GetDsufid() + " FROM EOS.RESCUE_ORDER WHERE DSUFID = "
                                     + mRecord.LocateEquipment.GetDsufid();
                    var sqlStmt = "INSERT INTO EOS.RESCUE_ORDER SELECT " + eosEventRecord.CaseId + ",999,COUNT(*) + 1,'',"
                                  + eosEventRecord.LocateEquipment.DsUfid + " FROM EOS.RESCUE_ORDER WHERE DSUFID = "
                                  + eosEventRecord.LocateEquipment.DsUfid;
                    command1 = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
                    if (command1.ExecuteNonQuery() <= 0)
@@ -129,9 +130,9 @@
                    Logger.Info("新增搶修順序成功!");
                }
                if (mRecord.ParentId== 0)
                if (eosEventRecord.ParentId == 0)
                {
                    if (!InsertIntoSri(mRecord))
                    if (!InsertIntoSri(eosEventRecord))
                    {
                        Logger.Error("新增資料庫(OCSDB.SRI)錯誤.");
                        return false;
@@ -153,11 +154,11 @@
            return true;
        }
        private bool ProcessSingalCase(Object.EventRecord mRecord)
        private bool ProcessSingalCase(Object.EOSEventRecord eosEventRecord)
        {
            var result = false;
            var sqlStmt = "INSERT INTO EOS.EVENTS VALUES(" + mRecord.CaseId+ "," + CCSCaseState.WaitForDespatch + ",1,"
                             + GlobalVariable.OriginalCase + ",0)";
            var sqlStmt = "INSERT INTO EOS.EVENTS VALUES(" + eosEventRecord.CaseId + "," + CCSCaseState.WaitForDespatch + ",1,"
                          + GlobalVariable.OriginalCase + ",0)";
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
@@ -179,11 +180,11 @@
            return result;
        }
        private bool ProcessMergeCase(Object.EventRecord mRecord)
        private bool ProcessMergeCase(Object.EOSEventRecord eosEventRecord)
        {
            // insert eos.events
            var sqlStmt = "INSERT INTO EOS.EVENTS VALUES(" + mRecord.CaseId+ "," + CCSCaseState.WaitForDespatch + ",1,"
                             + GlobalVariable.ChildCase + ",0)";
            var sqlStmt = "INSERT INTO EOS.EVENTS VALUES(" + eosEventRecord.CaseId + "," + CCSCaseState.WaitForDespatch + ",1,"
                          + GlobalVariable.ChildCase + ",0)";
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
@@ -197,7 +198,8 @@
                }
                // insert into eos.mergecase
                sqlStmt = "INSERT INTO EOS.MERGECASE VALUES(" + mRecord.CaseId+ ",'" + mRecord.AcceptNum+ "'," + mRecord.ParentId+ ")";
                sqlStmt = "INSERT INTO EOS.MERGECASE VALUES(" + eosEventRecord.CaseId + ",'" + eosEventRecord.AcceptNum + "'," +
                          eosEventRecord.ParentId + ")";
                command.CommandText = sqlStmt;
                if (command.ExecuteNonQuery() <= 0)
@@ -208,8 +210,9 @@
                }
                // update parent case data(EOS.EVENTS)
                sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.ParentCase + ",MERGECASECOUNT = MERGECASECOUNT + 1 " + "WHERE CASEID = "
                        + mRecord.ParentId;
                sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.ParentCase +
                          ",MERGECASECOUNT = MERGECASECOUNT + 1 " + "WHERE CASEID = "
                          + eosEventRecord.ParentId;
                command.CommandText = sqlStmt;
                if (command.ExecuteNonQuery() <= 0)
@@ -220,8 +223,10 @@
                }
                // update parent case data(EOS.EVENTRECORD)
                sqlStmt = "UPDATE EOS.EVENTRECORD SET FSC = " + mRecord.Fsc+ ",UFID = " + mRecord.Ufid                        + " WHERE CASEID in (SELECT CASEID FROM EOS.MERGECASE WHERE PARENTID = " + mRecord.ParentId+ ") OR CASEID = "
                        + mRecord.ParentId;
                sqlStmt = "UPDATE EOS.EVENTRECORD SET FSC = " + eosEventRecord.Fsc + ",UFID = " + eosEventRecord.Ufid +
                          " WHERE CASEID in (SELECT CASEID FROM EOS.MERGECASE WHERE PARENTID = " + eosEventRecord.ParentId +
                          ") OR CASEID = "
                          + eosEventRecord.ParentId;
                command.CommandText = sqlStmt;
                if (command.ExecuteNonQuery() <= 0)
@@ -242,12 +247,12 @@
            return true;
        }
        private bool SetVisualCustomer(Object.EventRecord mRecord)
        private bool SetVisualCustomer(Object.EOSEventRecord eosEventRecord)
        {
            string sqlStmt = "";
            string customerKind = "C"; // 高壓用戶or一般用戶
            var sqlStmt = "";
            var customerKind = "C"; // 高壓用戶or一般用戶
            sqlStmt = "SELECT COUNT(*) as COUNT FROM BASEDB.HICUSTOMER WHERE METR_NUMB = '" + mRecord.Meter+ "'";
            sqlStmt = "SELECT COUNT(*) as COUNT FROM BASEDB.HICUSTOMER WHERE METR_NUMB = '" + eosEventRecord.Meter + "'";
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
            OracleDataReader reader = command.ExecuteReader();
@@ -272,11 +277,13 @@
                command.Dispose();
            }
            if (mRecord.ParentId== 0)
            if (eosEventRecord.ParentId == 0)
            {
                sqlStmt = "INSERT INTO EOS.TMPAFFECTCUSTMS SELECT " + mRecord.CaseId+ ",A.M_NAME,"
                        + "M.TELE_NUMB,M.METR_NUMB,A.M_ADDR,M.TRAN_CORD,M.CUST_TYPE,'" + customerKind + "' "
                        + "FROM BASEDB.METER M,BASEDB.MSTADDR A WHERE M.METR_NUMB = A.M_CUST_NO(+) AND M.METR_NUMB = '" + mRecord.Meter+ "'";
                sqlStmt = "INSERT INTO EOS.TMPAFFECTCUSTMS SELECT " + eosEventRecord.CaseId + ",A.M_NAME,"
                          + "M.TELE_NUMB,M.METR_NUMB,A.M_ADDR,M.TRAN_CORD,M.CUST_TYPE,'" + customerKind + "' "
                          +
                          "FROM BASEDB.METER M,BASEDB.MSTADDR A WHERE M.METR_NUMB = A.M_CUST_NO(+) AND M.METR_NUMB = '" +
                          eosEventRecord.Meter + "'";
                OracleCommand command1 = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
                if (command1.ExecuteNonQuery() >= 0)
@@ -289,18 +296,19 @@
            }
            else
            {
                return InsertMutilCustomer(customerKind, mRecord);
                return InsertMutilCustomer(customerKind, eosEventRecord);
            }
        }
        private bool InsertMutilCustomer(string customerKind, Object.EventRecord mRecord)
        private bool InsertMutilCustomer(string customerKind, Object.EOSEventRecord eosEventRecord)
        {
            string sqlStmt = "";
            bool updateCustomer = false;
            string mTpclidGroupId = "";
            string mCustomerKind = "C";
            sqlStmt = "SELECT COUNT(*) as COUNT FROM EOS.TMPAFFECTCUSTMS WHERE CASEID = " + mRecord.ParentId                    + " OR CASEID IN (SELECT CASEID FROM EOS.MERGECASE WHERE PARENTID = " + mRecord.ParentId+ ")";
            sqlStmt = "SELECT COUNT(*) as COUNT FROM EOS.TMPAFFECTCUSTMS WHERE CASEID = " + eosEventRecord.ParentId +
                      " OR CASEID IN (SELECT CASEID FROM EOS.MERGECASE WHERE PARENTID = " + eosEventRecord.ParentId + ")";
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
            OracleDataReader reader = command.ExecuteReader();
@@ -331,7 +339,8 @@
            if (updateCustomer)
            {
                /* 找出原始案件的影響用戶資料 */
                sqlStmt = "SELECT TPCLIDGROUPID,CUSTOMERKIND FROM EOS.TMPAFFECTCUSTMS WHERE CASEID = " + mRecord.ParentId;
                sqlStmt = "SELECT TPCLIDGROUPID,CUSTOMERKIND FROM EOS.TMPAFFECTCUSTMS WHERE CASEID = " +
                          eosEventRecord.ParentId;
                try
                {
@@ -349,7 +358,7 @@
                    if (mCustomerKind.Equals("C"))
                    {
                        /* 刪除原始案件的既有用戶資料 */
                        sqlStmt = "DELETE EOS.TMPAFFECTCUSTMS WHERE CASEID = " + mRecord.ParentId;
                        sqlStmt = "DELETE EOS.TMPAFFECTCUSTMS WHERE CASEID = " + eosEventRecord.ParentId;
                        command1.CommandText = sqlStmt;
                        if (command1.ExecuteNonQuery() < 0)
@@ -360,10 +369,13 @@
                        }
                        /* 將原始案件的影響用戶數改為變壓器的全部用戶 */
                        sqlStmt = "INSERT INTO EOS.TMPAFFECTCUSTMS SELECT " + mRecord.ParentId+ ",A.M_NAME,"
                                + "M.TELE_NUMB,M.METR_NUMB,A.M_ADDR,M.TPCLIDGROUPID,M.CUST_TYPE,'" + mCustomerKind + "' "
                                + "FROM (SELECT TELE_NUMB,METR_NUMB,TRAN_CORD as TPCLIDGROUPID,CUST_TYPE FROM BASEDB.METER " + "WHERE TRAN_CORD = '"
                                + mTpclidGroupId + "') M,BASEDB.MSTADDR A WHERE M.METR_NUMB = A.M_CUST_NO(+) ";
                        sqlStmt = "INSERT INTO EOS.TMPAFFECTCUSTMS SELECT " + eosEventRecord.ParentId + ",A.M_NAME,"
                                  + "M.TELE_NUMB,M.METR_NUMB,A.M_ADDR,M.TPCLIDGROUPID,M.CUST_TYPE,'" + mCustomerKind +
                                  "' "
                                  +
                                  "FROM (SELECT TELE_NUMB,METR_NUMB,TRAN_CORD as TPCLIDGROUPID,CUST_TYPE FROM BASEDB.METER " +
                                  "WHERE TRAN_CORD = '"
                                  + mTpclidGroupId + "') M,BASEDB.MSTADDR A WHERE M.METR_NUMB = A.M_CUST_NO(+) ";
                        command1.CommandText = sqlStmt;
                        if (command1.ExecuteNonQuery() <= 0)
@@ -384,10 +396,11 @@
            }
            /* 新受理案件的影響用戶資料 */
            sqlStmt = "INSERT INTO EOS.TMPAFFECTCUSTMS SELECT " + mRecord.CaseId+ ",A.M_NAME,"
                    + "M.TELE_NUMB,M.METR_NUMB,A.M_ADDR,M.TPCLIDGROUPID,M.CUST_TYPE,'" + customerKind + "' "
                    + "FROM (SELECT TELE_NUMB,METR_NUMB,TRAN_CORD as TPCLIDGROUPID,CUST_TYPE FROM BASEDB.METER "
                    + "WHERE TRAN_CORD = (SELECT TRAN_CORD FROM BASEDB.METER WHERE METR_NUMB = '" + mRecord.Meter                    + "')) M,BASEDB.MSTADDR A WHERE M.METR_NUMB = A.M_CUST_NO(+) ";
            sqlStmt = "INSERT INTO EOS.TMPAFFECTCUSTMS SELECT " + eosEventRecord.CaseId + ",A.M_NAME,"
                      + "M.TELE_NUMB,M.METR_NUMB,A.M_ADDR,M.TPCLIDGROUPID,M.CUST_TYPE,'" + customerKind + "' "
                      + "FROM (SELECT TELE_NUMB,METR_NUMB,TRAN_CORD as TPCLIDGROUPID,CUST_TYPE FROM BASEDB.METER "
                      + "WHERE TRAN_CORD = (SELECT TRAN_CORD FROM BASEDB.METER WHERE METR_NUMB = '" + eosEventRecord.Meter +
                      "')) M,BASEDB.MSTADDR A WHERE M.METR_NUMB = A.M_CUST_NO(+) ";
            OracleCommand command2 = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
            if (command2.ExecuteNonQuery() < 0)
@@ -400,22 +413,22 @@
            return true;
        }
        private bool UpdateImportCase(Object.EventRecord mRecord)
        private bool UpdateImportCase(Object.EOSEventRecord eosEventRecord)
        {
            /* 該案件不為交辦案件 */
            if (mRecord.ImportCase!= GlobalVariable.IsImportCase)
            if (eosEventRecord.ImportCase != GlobalVariable.IsImportCase)
            {
                return true;
            }
            /* 該交辦案件為原始案件 */
            if (mRecord.ParentId== 0)
            if (eosEventRecord.ParentId == 0)
            {
                return true;
            }
            /* 若母案件已為交辦案件,則不需再作任何更動 */
            var sqlStmt = "SELECT IMPORTCASE FROM EOS.EVENTRECORD WHERE CASEID = " + mRecord.ParentId;
            var sqlStmt = "SELECT IMPORTCASE FROM EOS.EVENTRECORD WHERE CASEID = " + eosEventRecord.ParentId;
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
            OracleDataReader reader = command.ExecuteReader();
@@ -443,7 +456,8 @@
            /* 將交辦案件改為母案件 */
            sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.ParentCase + ",MERGECASECOUNT = "
                    + "(SELECT MERGECASECOUNT FROM EOS.EVENTS WHERE CASEID = " + mRecord.ParentId+ ") WHERE CASEID = " + mRecord.CaseId;
                      + "(SELECT MERGECASECOUNT FROM EOS.EVENTS WHERE CASEID = " + eosEventRecord.ParentId +
                      ") WHERE CASEID = " + eosEventRecord.CaseId;
            OracleCommand command1 = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
            if (command1.ExecuteNonQuery() <= 0)
@@ -454,7 +468,8 @@
            }
            /* 將母案件改為子案件 */
            sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.ChildCase + ",MERGECASECOUNT = 0 WHERE CASEID = " + mRecord.ParentId;
            sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.ChildCase +
                      ",MERGECASECOUNT = 0 WHERE CASEID = " + eosEventRecord.ParentId;
            command1.CommandText = sqlStmt;
            if (command1.ExecuteNonQuery() <= 0)
@@ -465,7 +480,7 @@
            }
            // 將EOS.MERGECASE內的資料修正 1.將原先該母案件下的子案件都改掛在交辦案件下 2.將已INSERT入EOS.MERGECASE內的交辦案件資料改為原先母案件的資料(CaseID,AcceptNum)
            sqlStmt = "UPDATE EOS.MERGECASE SET PARENTID = " + mRecord.CaseId+ " WHERE PARENTID = " + mRecord.ParentId;
            sqlStmt = "UPDATE EOS.MERGECASE SET PARENTID = " + eosEventRecord.CaseId + " WHERE PARENTID = " + eosEventRecord.ParentId;
            command1.CommandText = sqlStmt;
            if (command1.ExecuteNonQuery() <= 0)
@@ -476,7 +491,7 @@
            }
            sqlStmt = "UPDATE EOS.MERGECASE SET (CASEID,ACCEPTNUM) = (SELECT CASEID,ACCEPTNUM FROM EOS.EVENTRECORD WHERE CASEID = "
                    + mRecord.ParentId+ ") WHERE CASEID = " + mRecord.CaseId;
                      + eosEventRecord.ParentId + ") WHERE CASEID = " + eosEventRecord.CaseId;
            command1.CommandText = sqlStmt;
            if (command1.ExecuteNonQuery() <= 0)
@@ -487,7 +502,7 @@
            }
            command1.Dispose();
            return UpdateOtherTable(mRecord.ParentId, mRecord.CaseId, mRecord.AcceptNum);
            return UpdateOtherTable(eosEventRecord.ParentId, eosEventRecord.CaseId, eosEventRecord.AcceptNum);
        }
        private bool UpdateOtherTable(int oldCaseId, int newCaseId, string newAcceptNum)
@@ -525,7 +540,8 @@
                            return false;
                        }
                        sqlStmt = "update eos.events set casestatus=" + CCSCaseState.WaitForSponsor + " where caseid=" + newCaseId;
                        sqlStmt = "update eos.events set casestatus=" + CCSCaseState.WaitForSponsor + " where caseid=" +
                                  newCaseId;
                        command.CommandText = sqlStmt;
                        if (command.ExecuteNonQuery() < 0)
                        {
@@ -534,11 +550,12 @@
                            return false;
                        }
                        _mEventRec.IsDespatched = true;
                        _eosEventRecord.IsDespatched = true;
                        break;
                }
                sqlStmt = "UPDATE EOS.EVENTS SET CASESTATUS = " + CCSCaseState.WaitForDespatch + " WHERE CASEID = " + oldCaseId;
                sqlStmt = "UPDATE EOS.EVENTS SET CASESTATUS = " + CCSCaseState.WaitForDespatch + " WHERE CASEID = " +
                          oldCaseId;
                command.CommandText = sqlStmt;
                if (command.ExecuteNonQuery() <= 0)
@@ -548,8 +565,9 @@
                    return false;
                }
                sqlStmt = "UPDATE OCSDB.SRI SET SCENENAME = '" + newAcceptNum + "' WHERE SCENENAME = (SELECT ACCEPTNUM FROM "
                        + "EOS.EVENTRECORD WHERE CASEID = " + oldCaseId + ")";
                sqlStmt = "UPDATE OCSDB.SRI SET SCENENAME = '" + newAcceptNum +
                          "' WHERE SCENENAME = (SELECT ACCEPTNUM FROM "
                          + "EOS.EVENTRECORD WHERE CASEID = " + oldCaseId + ")";
                command.CommandText = sqlStmt;
                if (command.ExecuteNonQuery() < 0)
@@ -611,8 +629,9 @@
                    //                    return false;
                    //                }
                    sqlStmt = "UPDATE OCSDB.LOCKFEATURE SET DESCRIPTION = '" + newAcceptNum + "' WHERE DESCRIPTION = (SELECT ACCEPTNUM FROM "
                            + "EOS.EVENTRECORD WHERE CASEID = " + oldCaseId + ")";
                    sqlStmt = "UPDATE OCSDB.LOCKFEATURE SET DESCRIPTION = '" + newAcceptNum +
                              "' WHERE DESCRIPTION = (SELECT ACCEPTNUM FROM "
                              + "EOS.EVENTRECORD WHERE CASEID = " + oldCaseId + ")";
                    command.CommandText = sqlStmt;
                    if (command.ExecuteNonQuery() < 0)
@@ -634,14 +653,14 @@
            return true;
        }
        private bool UpdateRecuseOrder(Object.EventRecord mRecord)
        private bool UpdateRecuseOrder(Object.EOSEventRecord eosEventRecord)
        {
            int rank = 999;
            int priority = 1;
            OracleCommand command = null;
            /* 單純的子案件或不需升級的交辦案件,不需要更新EOS.RESCUE_ORDER */
            if ((mRecord.ParentId!= 0) && !(_upLevel))
            if ((eosEventRecord.ParentId != 0) && !(_upLevel))
            {
                return true;
            }
@@ -658,7 +677,9 @@
                if (_upLevel)
                {
                    /* 將原先母案件的編號改為新的母案件編號 */
                    sqlStmt = "UPDATE EOS.RESCUE_ORDER SET CASEID = " + mRecord.CaseId+ " WHERE CASEID = " + mRecord.ParentId                            + " AND DSUFID = " + mRecord.LocateEquipment.GetDsufid();
                    sqlStmt = "UPDATE EOS.RESCUE_ORDER SET CASEID = " + eosEventRecord.CaseId + " WHERE CASEID = " +
                              eosEventRecord.ParentId +
                              " AND DSUFID = " + eosEventRecord.LocateEquipment.DsUfid;
                    command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
                    if (command.ExecuteNonQuery() <= 0)
@@ -671,7 +692,7 @@
                else
                {
                    /* 找出該饋線的等級 */
                    sqlStmt = "SELECT RANK FROM EOS.IMP_FEEDER WHERE FEEDERID = " + mRecord.FdrId;
                    sqlStmt = "SELECT RANK FROM EOS.IMP_FEEDER WHERE FEEDERID = " + eosEventRecord.FdrId;
                    command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
                    OracleDataReader reader = command.ExecuteReader();
@@ -683,8 +704,9 @@
                    reader.Close();
                    /* 找出同等級饋線中的最大搶修順序號碼 */
                    sqlStmt = "SELECT MAX(PRIORITY) as PRIORITY FROM EOS.RESCUE_ORDER WHERE RANK = " + rank + " AND DSUFID = "
                            + mRecord.LocateEquipment.GetDsufid();
                    sqlStmt = "SELECT MAX(PRIORITY) as PRIORITY FROM EOS.RESCUE_ORDER WHERE RANK = " + rank +
                              " AND DSUFID = "
                              + eosEventRecord.LocateEquipment.DsUfid;
                    command.CommandText = sqlStmt;
                    reader = command.ExecuteReader();
@@ -699,8 +721,8 @@
                    if (priority == 0 && rank > 0)
                    {
                        sqlStmt = "SELECT MAX(PRIORITY) as PRIORITY FROM EOS.RESCUE_ORDER WHERE RANK = "
                                + "(SELECT MAX(RANK) FROM EOS.RESCUE_ORDER WHERE RANK < " + rank + " AND DSUFID = "
                                + mRecord.LocateEquipment.GetDsufid() + ")";
                                  + "(SELECT MAX(RANK) FROM EOS.RESCUE_ORDER WHERE RANK < " + rank + " AND DSUFID = "
                                  + eosEventRecord.LocateEquipment.DsUfid + ")";
                        command.CommandText = sqlStmt;
                        reader = command.ExecuteReader();
@@ -715,13 +737,15 @@
                    /* 如果還是沒找到,就設Priority = 0 (只有當新增案件的Rank為最小時或第一筆案件才可能發生) */
                    if (priority == 0)
                    { // 若不寫清楚會看不懂
                    {
                        // 若不寫清楚會看不懂
                        priority = 0;
                        /* 將搶修順序號碼大於等於找出來號碼的都加1 */
                    }
                    sqlStmt = "UPDATE EOS.RESCUE_ORDER SET PRIORITY = PRIORITY + 1 WHERE PRIORITY > " + priority + " AND DSUFID = "
                            + mRecord.LocateEquipment.GetDsufid();
                    sqlStmt = "UPDATE EOS.RESCUE_ORDER SET PRIORITY = PRIORITY + 1 WHERE PRIORITY > " + priority +
                              " AND DSUFID = "
                              + eosEventRecord.LocateEquipment.DsUfid;
                    command.CommandText = sqlStmt;
                    if (command.ExecuteNonQuery() < 0)
@@ -732,8 +756,9 @@
                    }
                    /* 將本身資料存入資料庫內 */
                    sqlStmt = "INSERT INTO EOS.RESCUE_ORDER (CASEID,RANK,PRIORITY,DSUFID) VALUES (" + mRecord.CaseId+ "," + rank + ","
                            + (priority + 1) + "," + mRecord.LocateEquipment.GetDsufid() + ")";
                    sqlStmt = "INSERT INTO EOS.RESCUE_ORDER (CASEID,RANK,PRIORITY,DSUFID) VALUES (" + eosEventRecord.CaseId +
                              "," + rank + ","
                              + (priority + 1) + "," + eosEventRecord.LocateEquipment.DsUfid + ")";
                    command.CommandText = sqlStmt;
                    if (command.ExecuteNonQuery() <= 0)
@@ -759,7 +784,7 @@
        }
        // 當原先同一用戶在事故受理後又報案,不過從一般案件轉為交辦案件所需作的轉換工作
        private bool DeleteOldCase(Object.EventRecord mRecord)
        private bool DeleteOldCase(Object.EOSEventRecord eosEventRecord)
        {
            string sqlStmt;
            int caseId = 0; // 原先的事故號碼
@@ -769,8 +794,9 @@
            OracleCommand command = null;
            sqlStmt = "SELECT R.CASEID as CASEID,E.CASETYPE as CASETYPE,E.CASESTATUS as CASESTATUS,E.COUNT as COUNT FROM "
                    + "EOS.EVENTRECORD R,EOS.EVENTS E WHERE R.CASEID = E.CASEID AND R.CUSTOMERMETER = '" + mRecord.Meter+ "' AND R.CASEID <> "
                    + mRecord.CaseId+ " AND E.CASESTATUS <= " + CCSCaseState.WaitForSponsor;
                      + "EOS.EVENTRECORD R,EOS.EVENTS E WHERE R.CASEID = E.CASEID AND R.CUSTOMERMETER = '" +
                      eosEventRecord.Meter + "' AND R.CASEID <> "
                      + eosEventRecord.CaseId + " AND E.CASESTATUS <= " + CCSCaseState.WaitForSponsor;
            try
            {
@@ -833,9 +859,10 @@
                    return false;
                }
                if (mRecord.ParentId== caseId)
                { // 原本舊案件為母案件
                    sqlStmt = "SELECT COUNT(*) as COUNT FROM EOS.MERGECASE WHERE PARENTID = " + mRecord.CaseId;
                if (eosEventRecord.ParentId == caseId)
                {
                    // 原本舊案件為母案件
                    sqlStmt = "SELECT COUNT(*) as COUNT FROM EOS.MERGECASE WHERE PARENTID = " + eosEventRecord.CaseId;
                    command.CommandText = sqlStmt;
                    reader = command.ExecuteReader();
@@ -851,8 +878,9 @@
                                return false;
                            case 1: // 子案件為之前受理的同一事故案件
                                sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.OriginalCase + ",COUNT = " + (count + 1)
                                        + ",MERGECASECOUNT = 0 WHERE CASEID = " + mRecord.CaseId;
                                sqlStmt = "UPDATE EOS.EVENTS SET CASETYPE = " + GlobalVariable.OriginalCase +
                                          ",COUNT = " + (count + 1)
                                          + ",MERGECASECOUNT = 0 WHERE CASEID = " + eosEventRecord.CaseId;
                                command.CommandText = sqlStmt;
                                if (command.ExecuteNonQuery() <= 0)
@@ -863,8 +891,9 @@
                                    return false;
                                }
                                sqlStmt = "DELETE EOS.TMPAFFECTCUSTMS WHERE CUSTOMERMETER <> '" + mRecord.Meter+ "' AND CASEID = "
                                        + mRecord.CaseId;
                                sqlStmt = "DELETE EOS.TMPAFFECTCUSTMS WHERE CUSTOMERMETER <> '" + eosEventRecord.Meter +
                                          "' AND CASEID = "
                                          + eosEventRecord.CaseId;
                                command.CommandText = sqlStmt;
                                if (command.ExecuteNonQuery() < 0)
@@ -877,8 +906,9 @@
                                break;
                            default:
                                sqlStmt = "UPDATE EOS.EVENTS SET MERGECASECOUNT = MERGECASECOUNT - 1,COUNT = " + (count + 1) + " WHERE CASEID = "
                                        + mRecord.CaseId;
                                sqlStmt = "UPDATE EOS.EVENTS SET MERGECASECOUNT = MERGECASECOUNT - 1,COUNT = " +
                                          (count + 1) + " WHERE CASEID = "
                                          + eosEventRecord.CaseId;
                                command.CommandText = sqlStmt;
                                if (command.ExecuteNonQuery() < 0)
@@ -925,13 +955,13 @@
            return true;
        }
        private bool InsertIntoSri(Object.EventRecord mRecord)
        private bool InsertIntoSri(Object.EOSEventRecord eosEventRecord)
        {
            int count = 0;
            OracleCommand command = null;
            OracleDataReader reader = null;
            var sqlStmt = "SELECT COUNT(*) as COUNT FROM OCSDB.SRI WHERE SCENENAME = '" + mRecord.AcceptNum+ "'";
            var sqlStmt = "SELECT COUNT(*) AS COUNT FROM OCSDB.SRI WHERE SCENENAME = '" + eosEventRecord.AcceptNum + "'";
            try
            {
@@ -957,7 +987,7 @@
                return true;
            }
            sqlStmt = "INSERT INTO OCSDB.SRI VALUES('" + mRecord.AcceptNum+ "',2,-1)";
            sqlStmt = "INSERT INTO OCSDB.SRI VALUES('" + eosEventRecord.AcceptNum + "',2,-1)";
            try
            {
@@ -978,29 +1008,28 @@
            return true;
        }
        private bool SaveCustomerTel(Object.EventRecord mRecord)
        private bool SaveCustomerTel(Object.EOSEventRecord eosEventRecord)
        {
            string sqlStmt;
            // 無電號資料
            /*
             * if (m_Record.getisReCall() == CCS.GlobalVariable.NotReCall) { return true; }
             */
            // 沒有回覆電話可供回存
            if (mRecord.Tel== null || mRecord.Tel.Trim().Length == 0)
            if (eosEventRecord.Tel == null || eosEventRecord.Tel.Trim().Length == 0)
            {
                return true;
            }
            // 電話資料過長
            if (mRecord.Tel.Trim().Length > 24)
            if (eosEventRecord.Tel.Trim().Length > 24)
            {
                Logger.Warn("電話過長號碼,無法回存資料庫.");
                return true;
            }
            sqlStmt = "UPDATE BASEDB.METER SET TELE_NUMB = '" + mRecord.Tel.Trim() + "' WHERE METR_NUMB = '" + mRecord.Meter+ "'";
            var sqlStmt = "UPDATE BASEDB.METER SET TELE_NUMB = '" + eosEventRecord.Tel.Trim() + "' WHERE METR_NUMB = '" +
                          eosEventRecord.Meter + "'";
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
CCSTrace/CCS/Function/InitialEventData.cs
@@ -9,12 +9,12 @@
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private string _mAcceptNum = "";
        private int _mCaseId = 0;
        private string _acceptNum = "";
        private int _caseId = 0;
        private int _mYear = 0;
        private bool _mChangeYear = false;
        private string _mNowYear = string.Empty;
        private readonly string _mAcceptTime = "";
        private bool _isChangeYear = false;
        private string _nowYear = string.Empty;
        private readonly string _acceptTime = "";
        private readonly OracleConnection _connectionTpc;
        //New CaseID and New AcceptNum must be seen by others,so it need not controled by transaction
@@ -32,10 +32,10 @@
            {
                if (reader.Read())
                {
                    _mAcceptNum = reader["ACCEPTNUM"].ToString();
                    _mCaseId = Convert.ToInt32(reader["CASEID"].ToString());
                    _acceptNum = reader["ACCEPTNUM"].ToString();
                    _caseId = Convert.ToInt32(reader["CASEID"].ToString());
                    _mYear = Convert.ToInt32(reader["YEAR"].ToString());
                    _mAcceptTime = reader["ACCEPTTIME"].ToString();
                    _acceptTime = reader["ACCEPTTIME"].ToString();
                }
                else
                {
@@ -46,7 +46,6 @@
            catch (Exception e)
            {
                Logger.Error(e, "Problems occur when Initializing EventData: " + e.Message);
                Console.WriteLine(e.StackTrace);
                return;
            }
            finally
@@ -57,7 +56,7 @@
            CheckAcceptNum();
            while (!UpdateDataBase(_mChangeYear))
            while (!UpdateDataBase(_isChangeYear))
            {
                RegetNumber();
                CheckAcceptNum();
@@ -66,12 +65,12 @@
        public int GetNewCaseId()
        {
            return _mCaseId;
            return _caseId;
        }
        public string GetNewAcceptNum()
        {
            return _mAcceptNum;
            return _acceptNum;
        }
        private bool UpdateDataBase(bool mChangeYear)
@@ -80,11 +79,11 @@
            bool mResult = false;
            if (mChangeYear)
                sqlStmt = "UPDATE EOS.EVENTNUM SET ACCEPTNUM = '" + (Convert.ToInt32(_mAcceptNum) + 1).ToString() + "',CASEID = "
                        + (_mCaseId + 1) + ",YEAR = " + _mNowYear + " WHERE CASEID = " + _mCaseId;
                sqlStmt = "UPDATE EOS.EVENTNUM SET ACCEPTNUM = '" + (Convert.ToInt32(_acceptNum) + 1) + "',CASEID = "
                        + (_caseId + 1) + ",YEAR = " + _nowYear + " WHERE CASEID = " + _caseId;
            else
                sqlStmt = "UPDATE EOS.EVENTNUM SET ACCEPTNUM = '" + (Convert.ToInt32(_mAcceptNum) + 1).ToString() + "',CASEID = "
                        + (_mCaseId + 1) + " WHERE CASEID = " + _mCaseId + " AND ACCEPTNUM = '" + _mAcceptNum + "'";
                sqlStmt = "UPDATE EOS.EVENTNUM SET ACCEPTNUM = '" + (Convert.ToInt32(_acceptNum) + 1) + "',CASEID = "
                        + (_caseId + 1) + " WHERE CASEID = " + _caseId + " AND ACCEPTNUM = '" + _acceptNum + "'";
            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc);
@@ -108,9 +107,9 @@
        private void CheckAcceptNum()
        {
            int nowYear = Convert.ToInt32(_mAcceptTime.Substring(0, 4)) - 1911;
            int nowMonth = Convert.ToInt32(_mAcceptTime.Substring(5, 2));
            string tmp = _mAcceptNum;
            int nowYear = Convert.ToInt32(_acceptTime.Substring(0, 4)) - 1911;
            int nowMonth = Convert.ToInt32(_acceptTime.Substring(5, 2));
            string tmp = _acceptNum;
            if (Convert.ToInt32(tmp.Substring(0, 3)) == nowYear)
            {
@@ -118,19 +117,19 @@
                {
                    // 新月份
                    if (nowMonth < 10)
                        _mAcceptNum = nowYear.ToString() + "0" + nowMonth.ToString() + "0001";
                        _acceptNum = nowYear + "0" + nowMonth + "0001";
                    else
                        _mAcceptNum = nowYear.ToString() + nowMonth.ToString() + "0001";
                        _acceptNum = nowYear + nowMonth.ToString() + "0001";
                }
            }
            else
            {
                _mAcceptNum = nowYear.ToString() + "010001"; // 新年度
                _mNowYear = nowYear.ToString();
                _mChangeYear = true;
                _acceptNum = nowYear + "010001"; // 新年度
                _nowYear = nowYear.ToString();
                _isChangeYear = true;
            }
            if (!_mChangeYear)
            if (!_isChangeYear)
            {
            }
        }
@@ -145,15 +144,14 @@
            {
                if (reader.Read())
                {
                    _mAcceptNum = reader["ACCEPTNUM"].ToString();
                    _mCaseId = Convert.ToInt32(reader["CASEID"].ToString());
                    _acceptNum = reader["ACCEPTNUM"].ToString();
                    _caseId = Convert.ToInt32(reader["CASEID"].ToString());
                    _mYear = Convert.ToInt32(reader["YEAR"].ToString());
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, e.Message);
            }
            finally
            {
CCSTrace/CCS/Function/Leach.cs
@@ -22,7 +22,7 @@
            _traceConnectionString = traceConnection;
        }
        public int LeachCase(Object.EventRecord mNewRec)
        public int LeachCase(Object.EOSEventRecord mNewRec)
        {
            switch (SameCase(mNewRec))
            {
@@ -51,7 +51,7 @@
            return _mergeCase.GetOldEquipment();
        }
        private int SameCase(Object.EventRecord mNewRec)
        private int SameCase(Object.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 ";
@@ -89,7 +89,7 @@
            }
            catch (Exception e)
            {
                Logger.Error(e.Message);
                Logger.Error(e, e.Message);
                return GlobalVariable.FailureByDb;
            }
            finally
@@ -264,7 +264,7 @@
            return status;
        }
        private int Judge(Object.EventRecord mNewRec, bool changeCaseType)
        private int Judge(Object.EOSEventRecord mNewRec, bool changeCaseType)
        {
            int mResult = GlobalVariable.FailureByDb;
@@ -278,8 +278,8 @@
            {
                if (mNewRec.Fsc!= 0)
                {
                    mNewRec.LocateEquipment.SetFsc(GlobalVariable.Breaker);
                    mNewRec.LocateEquipment.SetUfid(mNewRec.Ufid);
                    mNewRec.LocateEquipment.Fsc = (GlobalVariable.Breaker);
                    mNewRec.LocateEquipment.Ufid = (mNewRec.Ufid);
                    Logger.Info("饋線全停:" + mNewRec.Fsc+ ", " + mNewRec.Ufid);
                    _mergeCase.Merge(mNewRec, _connectionTpc, _transaction, _traceConnectionString);
                    return GlobalVariable.Success;
@@ -367,7 +367,7 @@
            return mResult;
        }
        private int GetEquipment(Object.EventRecord mNewRec)
        private int GetEquipment(Object.EOSEventRecord mNewRec)
        {
            string temp;
            string mOwnerTpclid;
@@ -407,8 +407,7 @@
            }
            catch (Exception e)
            {
                Logger.Error(e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, e.Message);
                return GlobalVariable.FailureByDb;
            }
            finally
@@ -418,7 +417,7 @@
            }
        }
        private int GetSxfmr(string mTpclid, string mGroup, Object.EventRecord mNewRec)
        private int GetSxfmr(string mTpclid, string mGroup, Object.EOSEventRecord mNewRec)
        {
            string sqlStmt;
            int mStatus = GlobalVariable.FailureByDb;
@@ -461,7 +460,7 @@
            return mStatus;
        }
        private int GetHicustomer(string mTpclid, string mGroup, Object.EventRecord mNewRec)
        private int GetHicustomer(string mTpclid, string mGroup, Object.EOSEventRecord mNewRec)
        {
            string sqlStmt;
@@ -503,7 +502,7 @@
            }
        }
        private void GetLocateEquipment(Object.EventRecord mNewRec)
        private void GetLocateEquipment(Object.EOSEventRecord mNewRec)
        {
            var sqlStmt = "SELECT OWNERFSC as FSC,OWNERUFID as UFID,OWNERTPCLID as TPCLID FROM ";
            switch (mNewRec.Fsc)
@@ -524,9 +523,9 @@
            {
                if (reader.Read())
                {
                    mNewRec.LocateEquipment.SetFsc(Convert.ToInt32(reader["FSC"].ToString()));
                    mNewRec.LocateEquipment.SetUfid(Convert.ToInt32(reader["UFID"].ToString()));
                    mNewRec.LocateEquipment.SetTpclid(reader["TPCLID"].ToString());
                    mNewRec.LocateEquipment.Fsc = (Convert.ToInt32(reader["FSC"].ToString()));
                    mNewRec.LocateEquipment.Ufid = (Convert.ToInt32(reader["UFID"].ToString()));
                    mNewRec.LocateEquipment.Tpclid = (reader["TPCLID"].ToString());
                }
            }
            catch (Exception e)
CCSTrace/CCS/Function/MailService.cs
@@ -79,8 +79,7 @@
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Error(e, e.Message);
            }
            finally
            {
CCSTrace/CCS/Function/MergeCase.cs
@@ -10,20 +10,20 @@
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private EventRecord _lEventrecord;
        private EOSEventRecord _lEventrecord;
        private EventAI.JudgeCase _mJudgeCase;
        public MergeCase()
        {
        }
        public void Merge(EventRecord mEventrecord, OracleConnection conn, OracleTransaction trx, string traceConnection)
        public void Merge(EOSEventRecord eosEventRecord, OracleConnection conn, OracleTransaction trx, string traceConnection)
        {
            try
            {
                _mJudgeCase = new EventAI.JudgeCase(mEventrecord.FdrId, mEventrecord.Fsc, mEventrecord.Ufid,
                                                        mEventrecord.CaseId, mEventrecord.AcceptDate, conn, trx, traceConnection);
                _lEventrecord = mEventrecord;
                _mJudgeCase = new EventAI.JudgeCase(eosEventRecord.FdrId, eosEventRecord.Fsc, eosEventRecord.Ufid,
                                                        eosEventRecord.CaseId, eosEventRecord.AcceptDate, conn, trx, traceConnection);
                _lEventrecord = eosEventRecord;
                _mJudgeCase.AiBegin();
                _lEventrecord.ParentId = _mJudgeCase.GetParentCaseId();
                _lEventrecord.Fsc = _mJudgeCase.GetInferEquipment().Fsc;
@@ -36,7 +36,7 @@
            }
            catch (Exception e)
            {
                Logger.Error(e.Message);
                Logger.Error(e, e.Message);
                throw;
            }
        }
CCSTrace/CCS/Object/Addr_Contrast.cs
@@ -1,7 +1,9 @@
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
@@ -10,79 +12,85 @@
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        public static Hashtable MTotalData = null;
        public static string DefaultDept = "市區巡修課";
        private OracleConnection _connectionTpc;
        public const string DefaultDept = "市區巡修課";
        public AddrContrast(OracleConnection conn, OracleTransaction trx)
        public static AddrContrast Instance { get; } = new AddrContrast();
        private Dictionary<string, List<ADDRCONTRAST>> totalAddrData = null;
        private AddrContrast()
        {
            _connectionTpc = conn;
        }
            ArrayList mData = new ArrayList();
            string tmp = "";
        public void initialize(OracleConnection conn)
        {
            if (MTotalData != null)
            if (totalAddrData != null)
                return;
            MTotalData = new Hashtable();
            totalAddrData = new Dictionary<string, List<ADDRCONTRAST>>();
            var sqlStmt = "SELECT DEPTID,CITY,TOWN,ROAD FROM CCS.ADDR_CONTRAST ORDER BY CITY,TOWN,ROAD";
            OracleCommand command = null;
            OracleDataReader reader = null;
            try
            {
                command = new OracleCommand(sqlStmt, _connectionTpc, trx);
                command = new OracleCommand(sqlStmt, conn);
                reader = command.ExecuteReader();
                List<ADDRCONTRAST> addrcontrasts = new List<ADDRCONTRAST>();
                string tmp = "";
                while (reader.Read())
                {
                    ArrayList mRecord = new ArrayList();
                    var city = reader["CITY"].ToString();
                    mRecord.Add(city);
                    mRecord.Add(reader["TOWN"].ToString());
                    mRecord.Add(reader["ROAD"].ToString());
                    mRecord.Add(Convert.ToInt32(reader["DEPTID"].ToString()));
                    ADDRCONTRAST item = new ADDRCONTRAST
                    {
                        CITY = reader["CITY"].ToString(),
                        TOWN = reader["TOWN"].ToString(),
                        ROAD = reader["ROAD"].ToString(),
                        DEPTID = Convert.ToInt32(reader["DEPTID"].ToString())
                    };
                    if (tmp.Equals(city))
                        mData.Add(mRecord);
                    if (tmp.Equals(item.CITY))
                    {
                        addrcontrasts.Add(item);
                    }
                    else
                    {
                        MTotalData.Add(tmp, mData);
                        tmp = city;
                        mData = new ArrayList();
                        mData.Add(mRecord);
                        totalAddrData.Add(tmp, addrcontrasts);
                        tmp = item.CITY;
                        addrcontrasts = new List<ADDRCONTRAST> { item };
                    }
                }
                MTotalData.Add(tmp, mData);
                totalAddrData.Add(tmp, addrcontrasts);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
                MTotalData = null;
                Logger.Warn(e, e.Message);
                totalAddrData = null;
            }
            finally
            {
                reader.Close();
                command.Dispose();
                reader?.Close();
                command?.Dispose();
            }
        }
        public int FindDeptId(string city, string region, string road)
        {
            int dept = 0;
            ArrayList mData = (ArrayList)MTotalData[city];
            var addrcontrasts = totalAddrData[city];
            try
            {
                for (int i = 0; i < mData.Count; i++)
                foreach (ADDRCONTRAST tmp in addrcontrasts)
                {
                    ArrayList tmp = (ArrayList)mData[i];
                    string mRegion = tmp[1].ToString().Trim();
                    string mRoad = tmp[2].ToString().Trim();
                    int deptId = Convert.ToInt32(tmp[3].ToString());
                    if ((region.Trim().Equals(mRegion)) && (road.Trim().Equals(mRoad)))
                        return deptId;
                    if (region.Trim().Equals(tmp.TOWN) && road.Trim().Equals(tmp.ROAD))
                    {
                        return tmp.DEPTID;
                    }
                }
            }
            catch (Exception e)
@@ -91,7 +99,7 @@
                Logger.Warn("無法取得所屬巡修部門代號,預設案件所屬巡修部門為市區巡修課!");
            }
            // 當找不到部門別時,Default 設定為市巡
            dept = GlobalVariable.EosCodelist.GetKeyId(GlobalVariable.Dept, DefaultDept);
            var dept = GlobalVariable.EosCodelist.GetKeyId(GlobalVariable.Dept, DefaultDept);
            return dept;
        }
    }
CCSTrace/CCS/Object/AlarmData.cs
@@ -40,7 +40,6 @@
            catch (Exception e)
            {
                Logger.Error(e, "Problems occur when fetch alarm data: (" + e.Message + ")");
                Console.WriteLine(e.StackTrace);
            }
            finally
            {
CCSTrace/CCS/Object/Dept_Contrast.cs
@@ -37,9 +37,9 @@
                    }
                    else
                    {// 一對多(需作比對)
                        long minMeter = Convert.ToInt64(tmpData[3].ToString());
                        long maxMeter = Convert.ToInt64(tmpData[2].ToString());
                        long custMeter = Convert.ToInt64(mMeter);
                        var minMeter = Convert.ToInt64(tmpData[3].ToString());
                        var maxMeter = Convert.ToInt64(tmpData[2].ToString());
                        var custMeter = Convert.ToInt64(mMeter);
                        if ((custMeter > minMeter) && (custMeter < maxMeter))
                        {
@@ -51,7 +51,7 @@
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Logger.Warn(ex, ex.Message);
            }
            return result;
        }
@@ -91,7 +91,7 @@
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Logger.Warn(ex, ex.Message);
            }
            return result;
@@ -99,10 +99,9 @@
        private void Initial(OracleConnection connectionTpc, OracleTransaction trx)
        {
            string sqlStmt;
            _mTotalData = new ArrayList();
            sqlStmt = "SELECT SC_CODE,DEPT_CODE,MAX_METER,MIN_METER FROM CCS.DEPT_CONTRAST";
            var sqlStmt = "SELECT SC_CODE,DEPT_CODE,MAX_METER,MIN_METER FROM CCS.DEPT_CONTRAST";
            OracleCommand command = new OracleCommand(sqlStmt, connectionTpc, trx);
            OracleDataReader reader = command.ExecuteReader();
@@ -122,12 +121,12 @@
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
                Logger.Warn(e, e.Message);
            }
            finally
            {
                reader.Close();
                command.Dispose();
                reader?.Close();
                command?.Dispose();
            }
        }
    }
CCSTrace/CCS/Object/EOSCodelist.cs
@@ -44,8 +44,7 @@
            }
            catch (Exception e)
            {
                Console.WriteLine("Error on Startup EOSCodelist: " + e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Warn(e, "Error on Startup EOSCodelist: " + e.Message);
            }
            finally
            {
CCSTrace/CCS/Object/LocateEquipment.cs
@@ -18,14 +18,14 @@
        public LocateEquipment(int mCaseId, bool hasData, OracleConnection conn, OracleTransaction transaction)
        {
            string sqlStmt;
            OracleCommand command = null;
            OracleDataReader reader = null;
            SetCaseId(mCaseId);
            CaseId = mCaseId;
            try
            {
                string sqlStmt;
                if (hasData)
                {
                    sqlStmt = "SELECT DSUFID,FSC,UFID,FDR,TPCLID FROM EOS.EVENTRECORD_EX WHERE CASEID = " + mCaseId;
@@ -35,11 +35,11 @@
                    if (reader.Read())
                    {
                        SetDsufid(Convert.ToInt32(reader["DSUFID"].ToString()));
                        SetFsc(Convert.ToInt32(reader["FSC"].ToString()));
                        SetUfid(Convert.ToInt32(reader["UFID"].ToString()));
                        SetFdr(reader["FDR"].ToString());
                        SetTpclid(reader["TPCLID"].ToString());
                        DsUfid =Convert.ToInt32(reader["DSUFID"].ToString());
                        Fsc = Convert.ToInt32(reader["FSC"].ToString());
                        Ufid = Convert.ToInt32(reader["UFID"].ToString());
                        Fdr = reader["FDR"].ToString();
                        Tpclid = reader["TPCLID"].ToString();
                    }
                }
                else
@@ -50,87 +50,60 @@
                    reader = command.ExecuteReader();
                    if (reader.Read())
                        SetDsufid(Convert.ToInt32(reader["UFID"].ToString()));
                        DsUfid = Convert.ToInt32(reader["UFID"].ToString());
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                Logger.Warn(e, e.Message);
            }
            finally
            {
                reader.Close();
                command.Dispose();
                reader?.Close();
                command?.Dispose();
            }
        }
        public int GetCaseId()
        public int CaseId
        {
            return _caseId;
            get { return _caseId; }
            set { _caseId = value; }
        }
        public void SetCaseId(int mCaseId)
        public int DsUfid
        {
            _caseId = mCaseId;
            get { return _dsUfid; }
            set { _dsUfid = value; }
        }
        public int GetDsufid()
        public int Fsc
        {
            return _dsUfid;
            get { return _fsc; }
            set { _fsc = value; }
        }
        public void SetDsufid(int mDsUfid)
        public int Ufid
        {
            _dsUfid = mDsUfid;
            get { return _ufid; }
            set { _ufid = value; }
        }
        public int GetFsc()
        public string Fdr
        {
            return _fsc;
            get { return _fdr; }
            set { _fdr = value; }
        }
        public void SetFsc(int mFsc)
        public string Tpclid
        {
            _fsc = mFsc;
            get { return _tpclid; }
            set { _tpclid = value; }
        }
        public int GetUfid()
        public string GetInsertSqlStmt()
        {
            return _ufid;
        }
        public void SetUfid(int mUfid)
        {
            _ufid = mUfid;
        }
        public string GetFdr()
        {
            return _fdr;
        }
        public void SetFdr(string mFdr)
        {
            _fdr = mFdr;
        }
        public string GetTpclid()
        {
            return _tpclid;
        }
        public void SetTpclid(string mTpclid)
        {
            _tpclid = mTpclid;
        }
        public string GetSqlStmt()
        {
            string sqlStmt;
            sqlStmt = "INSERT INTO EOS.EVENTRECORD_EX (CASEID,DSUFID,FSC,UFID,TPCLID,FDR) VALUES(" + GetCaseId() + "," + GetDsufid() + "," + GetFsc()
                    + "," + GetUfid() + ",'" + GetTpclid() + "','" + GetFdr() + "')";
            var sqlStmt = "INSERT INTO EOS.EVENTRECORD_EX (CASEID,DSUFID,FSC,UFID,TPCLID,FDR) VALUES(" + CaseId + "," + DsUfid + "," + Fsc
                             + "," + Ufid + ",'" + Tpclid + "','" + Fdr + "')";
            return sqlStmt;
        }
CCSTrace/CCS/Object/NumberContrast.cs
@@ -17,6 +17,24 @@
        {
        }
        public string Ccsid
        {
            get { return _ccsid; }
            set { _ccsid = value; }
        }
        public string AcceptNum
        {
            get { return _acceptNum; }
            set { _acceptNum = value; }
        }
        public int CaseId
        {
            get { return _caseId; }
            set { _caseId = value; }
        }
        public void SetCcsid(string mCcsid)
        {
            _ccsid = mCcsid;
@@ -49,24 +67,31 @@
        public bool Insert(OracleConnection conn, OracleTransaction transaction)
        {
            string sqlStmt;
            if (!Check())
            {
                return false;
            }
            sqlStmt = "INSERT INTO CCS.NUM_CONTRAST (CCSID,ACCEPTNUM,CASEID) VALUES ('" + _ccsid + "','" + _acceptNum + "'," + _caseId + ")";
            var sqlStmt = "INSERT INTO CCS.NUM_CONTRAST (CCSID,ACCEPTNUM,CASEID) VALUES ('" + _ccsid + "','" + _acceptNum + "'," + _caseId + ")";
            OracleCommand command = new OracleCommand(sqlStmt, conn, transaction);
            if (command.ExecuteNonQuery() > 0)
            try
            {
                command.Dispose();
                return true;
                if (command.ExecuteNonQuery() > 0)
                {
                    return true;
                }
            }
            catch (Exception e)
            {
                Logger.Warn(e, e.Message);
            }
            finally
            {
                command?.Dispose();
            }
            command.Dispose();
            return false;
        }
@@ -76,17 +101,25 @@
            {
                return false;
            }
            string sqlStmt = "UPDATE CCS.NUM_CONTRAST SET ACCEPTNUM='" + _acceptNum + "',CASEID=" + _caseId + " WHERE CCSID='" + _ccsid + "'";
            var sqlStmt = "UPDATE CCS.NUM_CONTRAST SET ACCEPTNUM='" + _acceptNum + "',CASEID=" + _caseId + " WHERE CCSID='" + _ccsid + "'";
            OracleCommand command = new OracleCommand(sqlStmt, conn, transaction);
            if (command.ExecuteNonQuery() <= 0)
            try {
                if (command.ExecuteNonQuery() <= 0)
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                command.Dispose();
                return false;
                Logger.Warn(e, e.Message);
            }
            finally
            {
                command?.Dispose();
            }
            command.Dispose();
            return true;
        }
CCSTrace/CCS/ProcessEvent.cs
@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OracleClient;
using System.Text;
using CCSTrace.CCS.Domain;
@@ -15,15 +17,15 @@
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private readonly OracleConnection _connectionTpc;
        private readonly CcsRecord _mCcsRecord;
        private readonly CCSEventRecord _mCcsEventRecord;
        private EventRecord _mEventRecord;
        private readonly string _traceConnectionString = string.Empty;
        private EOSEventRecord _eosEventRecord;
        private readonly string _traceConnectionString;
        private OracleTransaction _trx;
        public ProcessEvent(CcsRecord record, OracleConnection conn, string traceConnection)
        public ProcessEvent(CCSEventRecord eventRecord, OracleConnection conn, string traceConnection)
        {
            _mCcsRecord = record;
            _mCcsEventRecord = eventRecord;
            _connectionTpc = conn;
            _traceConnectionString = traceConnection;
        }
@@ -36,45 +38,46 @@
            try
            {
                var fdrid = GetFdrid(_mCcsRecord.Meter);
                var fdrid = GetFdrid(_mCcsEventRecord.Meter);
                if (fdrid != 0) //有饋線代號資料的案件才需比對同饋線上有無案件正在處理
                {
                    if (CcsMain.ProcessFdr.ContainsKey(fdrid.ToString()))
                    if (CcsMain.Instance.ProcessingFdr.Contains(fdrid))
                    {
                        CcsMain.WaitingCases.Add(new[] {_mCcsRecord.CcsId, fdrid.ToString()});
                        CcsMain.Instance.WaitingCases.Add(new KeyValuePair<string, int>(_mCcsEventRecord.CcsId, fdrid));
                        return;
                    }
                    else
                        CcsMain.ProcessFdr.Add(fdrid.ToString(), null); //將要處理的案件的饋線別加入處理中饋線集合
                        CcsMain.Instance.ProcessingFdr.Add(fdrid); //將要處理的案件的饋線別加入處理中饋線集合
                }
                /*                int TraceCount = this.getTraceCount(m_CCSRecord.CcsId);
                                bool TraceError = false;    //追蹤次數超過3次,改為非A類不追蹤合併
                /*
                int TraceCount = this.getTraceCount(m_CCSRecord.CcsId);
                bool TraceError = false;    //追蹤次數超過3次,改為非A類不追蹤合併
                                switch (TraceCount)
                                {
                                    case 0:
                                        UpdateTraceCount(m_CCSRecord.CcsId,true);
                                        TraceError = false;
                                        break;
                switch (TraceCount)
                {
                    case 0:
                        UpdateTraceCount(m_CCSRecord.CcsId,true);
                        TraceError = false;
                        break;
                                    case 2:
                                        UpdateTraceCount(m_CCSRecord.CcsId,false);
                                        TraceError = true;
                                        break;
                    case 2:
                        UpdateTraceCount(m_CCSRecord.CcsId,false);
                        TraceError = true;
                        break;
                                    default:
                                        UpdateTraceCount(m_CCSRecord.CcsId,false);
                                        TraceError = false;
                                        break;
                                }
                    default:
                        UpdateTraceCount(m_CCSRecord.CcsId,false);
                        TraceError = false;
                        break;
                }
                */
                if (InitialEventRecord(_mCcsRecord.CcsId))
                if (InitialEventRecord(_mCcsEventRecord.CcsId))
                {
                    var mLeach = new Leach(_connectionTpc, _trx, _traceConnectionString); // 案件過濾與合併
                    Logger.Info("過濾案件...");
                    var returnStatus = mLeach.LeachCase(_mEventRecord);
                    var returnStatus = mLeach.LeachCase(_eosEventRecord);
                    switch (returnStatus)
                    {
@@ -85,24 +88,24 @@
                        case GlobalVariable.NoMeter:
                            Logger.Info("案件過濾完畢,用戶無電號....");
                            _mEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            _eosEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            Process(GlobalVariable.NoMeter);
                            break;
                        case GlobalVariable.SameCustomer:
                            Logger.Info("相同用戶重複來電....");
                            ProcessSameCustomer(_mCcsRecord, _mEventRecord);
                            ProcessSameCustomer(_mCcsEventRecord, _eosEventRecord);
                            break;
                        case GlobalVariable.NoSupplyElc:
                            Logger.Warn("該饋線未供電,無法作事故案件追蹤合併....");
                            _mEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            _eosEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            Process(GlobalVariable.NoMeter);
                            break;
                        case GlobalVariable.NoSxfmr:
                            Logger.Warn("該案件無變壓器....");
                            _mEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            _eosEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            Process(GlobalVariable.NoMeter);
                            break;
@@ -113,16 +116,16 @@
                        case GlobalVariable.TraceFailure:
                            Logger.Error("故障追蹤錯誤,以一般無電號案件方式受理....");
                            _mEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            _eosEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                            Process(GlobalVariable.NoMeter);
                            break;
                        default:
                            var traceCount = GetTraceCount(_mCcsRecord.CcsId);
                            var traceCount = GetTraceCount(_mCcsEventRecord.CcsId);
                            if (traceCount < 2)
                            {
                                if (_trx.Connection.State.ToString().Equals("Open"))
                                if (_trx.Connection.State == ConnectionState.Open)
                                    _trx.Rollback();
                                _trx.Dispose();
@@ -137,18 +140,18 @@
                                    Logger.Error("發生非預期錯誤,此事故案件暫不被受理....");
                                if (traceCount == 0)
                                    UpdateTraceCount(_mCcsRecord.CcsId, true);
                                    UpdateTraceCount(_mCcsEventRecord.CcsId, true);
                                else
                                    UpdateTraceCount(_mCcsRecord.CcsId, false);
                                    UpdateTraceCount(_mCcsEventRecord.CcsId, false);
                            }
                            else
                            {
                                UpdateTraceCount(_mCcsRecord.CcsId, false);
                                UpdateTraceCount(_mCcsEventRecord.CcsId, false);
                                if (returnStatus == GlobalVariable.TraceCounts3)
                                    _mEventRecord.Note = _mEventRecord.Note+ "(本案用戶供電資料追蹤失敗)";
                                    _eosEventRecord.Note = _eosEventRecord.Note+ "(本案用戶供電資料追蹤失敗)";
                                Logger.Error("事故案件處理次數3次,仍無法正常處理,以一般無電號案件方式受理....");
                                _mEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                                _eosEventRecord.TraceFinish = GlobalVariable.TraceFinish;
                                Process(GlobalVariable.NoMeter);
                                sendMail = true;
                            }
@@ -156,7 +159,7 @@
                        /*                        switch (TraceCount)
                                                        {
                                                            case 0:
                                                                if (_Trx.Connection.State.ToString().Equals("Open"))
                                                                if (_Trx.Connection.State == ConnectionState.Open)
                                                                    _Trx.Rollback();
                                                                _Trx.Dispose();
@@ -174,7 +177,7 @@
                                                                break;
                                                            case 1:
                                                                if (_Trx.Connection.State.ToString().Equals("Open"))
                                                                if (_Trx.Connection.State == ConnectionState.Open)
                                                                    _Trx.Rollback();
                                                                _Trx.Dispose();
@@ -198,7 +201,7 @@
                                                        break;
                                                    case CCS.GlobalVariable.CaseTransfer:
                                                        if (_Trx.Connection.State.ToString().Equals("Open"))
                                                        if (_Trx.Connection.State == ConnectionState.Open)
                                                            _Trx.Rollback();
                                                        _Trx.Dispose();
@@ -206,7 +209,7 @@
                                                        break;
                                                    case CCS.GlobalVariable.FDRLocked:
                                                        if (_Trx.Connection.State.ToString().Equals("Open"))
                                                        if (_Trx.Connection.State == ConnectionState.Open)
                                                            _Trx.Rollback();
                                                        _Trx.Dispose();
@@ -214,7 +217,7 @@
                                                        break;
                                                    case CCS.GlobalVariable.Failure_By_DB:
                                                        if (_Trx.Connection.State.ToString().Equals("Open"))
                                                        if (_Trx.Connection.State == ConnectionState.Open)
                                                            _Trx.Rollback();
                                                        _Trx.Dispose();
@@ -222,7 +225,7 @@
                                                        break;
                                                    default:
                                                        if (_Trx.Connection.State.ToString().Equals("Open"))
                                                        if (_Trx.Connection.State == ConnectionState.Open)
                                                            _Trx.Rollback();
                                                        _Trx.Dispose();
@@ -233,32 +236,32 @@
                }
                if (fdrid != 0)
                    CcsMain.ProcessFdr.Remove(fdrid.ToString()); //將處理完的案件的饋線別從處理中饋線集合中移除
                    CcsMain.Instance.ProcessingFdr.Remove(fdrid); //將處理完的案件的饋線別從處理中饋線集合中移除
            }
            catch (Exception e)
            {
                Logger.Error(e, e.Message + ". CCSID = " + _mCcsRecord.CcsId);
                Logger.Error(e, e.Message + ". CCSID = " + _mCcsEventRecord.CcsId);
                if (_trx != null)
                {
                    if (_trx.Connection.State.ToString().Equals("Open"))
                    if (_trx.Connection.State == ConnectionState.Open)
                        _trx.Rollback();
                    _trx.Dispose();
                }
                if (_mEventRecord != null && _mEventRecord.FdrId!= 0)
                    CcsMain.ProcessFdr.Remove(_mEventRecord.FdrId.ToString()); //將處理完的案件的饋線別從處理中饋線集合中移除
                if (_eosEventRecord != null && _eosEventRecord.FdrId!= 0)
                    CcsMain.Instance.ProcessingFdr.Remove(_eosEventRecord.FdrId); //將處理完的案件的饋線別從處理中饋線集合中移除
                //throw e;
            }
            finally
            {
                CcsMain.ProcessCases.Remove(_mCcsRecord.CcsId);
                CcsMain.Instance.ProcessingCases.Remove(_mCcsEventRecord.CcsId);
                OnThreadFinish(new ThreadEndEvent(_connectionTpc));
            }
            if (sendMail)
                new MailService(_connectionTpc).SendMail(_mCcsRecord.CcsId);
                new MailService(_connectionTpc).SendMail(_mCcsEventRecord.CcsId);
        }
        private void Process(int kind)
@@ -267,16 +270,16 @@
            try
            {
                if (finishEvent.Finish(kind, _mEventRecord, _connectionTpc, _trx))
                if (finishEvent.Finish(kind, _eosEventRecord, _connectionTpc, _trx))
                {
                    Logger.Info("OMS資料更新成功!");
                    if (UpdateCcsData(_mEventRecord, _mCcsRecord, (int) CCSCaseState.WaitForDespatch))
                    if (UpdateCcsData(_eosEventRecord, _mCcsEventRecord, (int) CCSCaseState.WaitForDespatch))
                    {
                        Logger.Info("CCS資料更新成功!");
                    }
                    else
                    {
                        if (_trx.Connection.State.ToString().Equals("Open"))
                        if (_trx.Connection.State == ConnectionState.Open)
                            _trx.Rollback();
                        _trx.Dispose();
@@ -287,14 +290,13 @@
                    // 須等全部動作都正確做完才可作commit的動作
                    _trx.Commit();
                    _trx.Dispose();
                    ;
                    var alarmClient = new AlarmData(_connectionTpc, _trx);
                    alarmClient.Alarm(_mEventRecord.AcceptNum, _mEventRecord.Dept);
                    alarmClient.Alarm(_eosEventRecord.AcceptNum, _eosEventRecord.Dept);
                }
                else
                {
                    // 有錯誤需要RollBack
                    if (_trx.Connection.State.ToString().Equals("Open"))
                    if (_trx.Connection.State == ConnectionState.Open)
                        _trx.Rollback();
                    _trx.Dispose();
@@ -305,62 +307,60 @@
            }
            catch (Exception e)
            {
                throw e;
                Logger.Warn(e, e.Message);
                throw;
            }
        }
        protected virtual void OnThreadFinish(ThreadEndEvent e)
        {
            if (ThreadFinish != null)
            {
                ThreadFinish(this, e);
            }
            ThreadFinish?.Invoke(this, e);
        }
        private bool UpdateCcsData(EventRecord mRecord, CcsRecord mCcsRecord, int caseStatus)
        private bool UpdateCcsData(EOSEventRecord eosEventRecord, CCSEventRecord ccsEventRecord, int caseStatus)
        {
            Logger.Info("進行CCS資料更新程序...");
            var eventQuery = new EventQuery();
            var ccsEventQuery = new CCSEventQuery();
            var status = caseStatus;
            // 設定CCSID
            eventQuery.CcsId = mCcsRecord.CcsId;
            ccsEventQuery.CcsId = ccsEventRecord.CcsId;
            // 設定受理時間
            eventQuery.ChangeTime = mCcsRecord.AcceptTime;
            ccsEventQuery.ChangeTime = ccsEventRecord.AcceptTime;
            // 設定用戶電號
            if (mCcsRecord.Meter != null)
            if (ccsEventRecord.Meter != null)
            {
                eventQuery.Meter = mCcsRecord.Meter;
                ccsEventQuery.Meter = ccsEventRecord.Meter;
            }
            // 如果該案件為子案件,需找出母案件的casestatus來insert eos.eventquery
            // 若母案件已派工,需一併紀錄預計復電時間等資訊
            if (mRecord.ParentId!= 0)
            if (eosEventRecord.ParentId!= 0)
            {
                status = GetRealCaseStatus(mRecord.ParentId) == (int) CCSCaseState.WaitForSponsor
                status = GetRealCaseStatus(eosEventRecord.ParentId) == (int) CCSCaseState.WaitForSponsor
                    ? (int) CCSCaseState.EventDespatched
                    : (int) CCSCaseState.WaitForDespatch;
                if (status == (int) CCSCaseState.EventDespatched)
                {
                    SetDespatchInfo(mRecord.ParentId, eventQuery);
                    SetDespatchInfo(eosEventRecord.ParentId, ccsEventQuery);
                }
            }
            // 若此案件為專案案件升級為母案件,則必須判斷原先案件是否已經派工
            if ((mCcsRecord.ImportCase == GlobalVariable.IsImportCase) && mRecord.IsDespatched)
            if ((ccsEventRecord.ImportCase == GlobalVariable.IsImportCase) && eosEventRecord.IsDespatched)
            {
                status = (int) CCSCaseState.EventDespatched;
                SetDespatchInfo(mRecord.CaseId, eventQuery);
                SetDespatchInfo(eosEventRecord.CaseId, ccsEventQuery);
            }
            eventQuery.CaseStatus = status;
            // 更新CCS.EventQuery
            if (!eventQuery.Update(_connectionTpc, _trx))
            ccsEventQuery.CaseStatus = status;
            // 更新CCS.CCSEventQuery
            if (!ccsEventQuery.Update(_connectionTpc, _trx))
            {
                Logger.Error("更新ccs.eventquery失敗!");
                return false;
            }
            Logger.Info("更新ccs.eventquery成功!");
            var numberContrast = new NumberContrast();
            numberContrast.SetAcceptNum(mRecord.AcceptNum);
            numberContrast.SetCaseId(mRecord.CaseId);
            numberContrast.SetCcsid(mCcsRecord.CcsId);
            numberContrast.SetAcceptNum(eosEventRecord.AcceptNum);
            numberContrast.SetCaseId(eosEventRecord.CaseId);
            numberContrast.SetCcsid(ccsEventRecord.CcsId);
            // 更新CCS.Num_Contrast
            if (!numberContrast.Update(_connectionTpc, _trx))
            {
@@ -381,71 +381,73 @@
            _trx = _connectionTpc.BeginTransaction();
            deptContrast = new DeptContrast(_connectionTpc, _trx);
            _mEventRecord = new EventRecord(initialData.GetNewCaseId(), _connectionTpc, _trx);
            _mEventRecord.AcceptNum = initialData.GetNewAcceptNum();
            _eosEventRecord = new EOSEventRecord(initialData.GetNewCaseId(), _connectionTpc, _trx)
            {
                AcceptNum = initialData.GetNewAcceptNum()
            };
            mContrast.SetAcceptNum(_mEventRecord.AcceptNum);
            mContrast.SetCaseId(_mEventRecord.CaseId);
            mContrast.SetCcsid(_mCcsRecord.CcsId);
            mContrast.SetAcceptNum(_eosEventRecord.AcceptNum);
            mContrast.SetCaseId(_eosEventRecord.CaseId);
            mContrast.SetCcsid(_mCcsEventRecord.CcsId);
            if (!mContrast.Insert(_connectionTpc, _trx))
            {
                Logger.Error("初始化寫入CCS.Num_Contrast時發生錯誤!");
                if (_trx.Connection.State.ToString().Equals("Open"))
                if (_trx.Connection.State == ConnectionState.Open)
                    _trx.Rollback();
                return false;
            }
            // 設定用戶姓名
            _mEventRecord.Name = _mCcsRecord.CustomerName;
            _eosEventRecord.Name = _mCcsEventRecord.CustomerName;
            if (_mCcsRecord.Meter != null && _mCcsRecord.Meter.Length != 0)
            if (_mCcsEventRecord.Meter != null && _mCcsEventRecord.Meter.Length != 0)
            {
                // 需先找出部門代號,再找到該部門屬於哪一個巡修單位
                _mEventRecord.Meter = _mCcsRecord.Meter;
                var tmp = deptContrast.getDept_Code(_mCcsRecord.Meter);
                _eosEventRecord.Meter = _mCcsEventRecord.Meter;
                var tmp = deptContrast.getDept_Code(_mCcsEventRecord.Meter);
                if (tmp == -1)
                    _mEventRecord.Dept = FindoutDeptByAddr(_mCcsRecord, _trx);
                    _eosEventRecord.Dept = FindoutDeptByAddr(_mCcsEventRecord, _trx);
                else
                    _mEventRecord.Dept = tmp;
                    _eosEventRecord.Dept = tmp;
                _mEventRecord.FdrId = GetFdrid(_mCcsRecord.Meter);
                _eosEventRecord.FdrId = GetFdrid(_mCcsEventRecord.Meter);
            }
            else
            {
                // 當無用戶電號時,所找出的部門別不需再去找出屬於哪一個巡修股(findoutDeptByAddr會直接找到相對應的巡修股)
                var dept = FindoutDeptByAddr(_mCcsRecord, _trx);
                _mEventRecord.Dept = dept;
                var dept = FindoutDeptByAddr(_mCcsEventRecord, _trx);
                _eosEventRecord.Dept = dept;
            }
            // 設定用戶電話號碼
            if (_mCcsRecord.CustomerTel != null)
            if (_mCcsEventRecord.CustomerTel != null)
            {
                _mEventRecord.Tel = _mCcsRecord.CustomerTel;
                _eosEventRecord.Tel = _mCcsEventRecord.CustomerTel;
            }
            // 檢查並設定用戶地址
            var mAddr = _mCcsRecord.AddressCity + _mCcsRecord.AddressTown + _mCcsRecord.AddressRoad +
                        _mCcsRecord.AddressOther;
            var mAddr = _mCcsEventRecord.AddressCity + _mCcsEventRecord.AddressTown + _mCcsEventRecord.AddressRoad +
                        _mCcsEventRecord.AddressOther;
            if (mAddr.Trim().Length == 0)
            {
                Logger.Error("CCS 案件受理程序初始化失敗...地址為空白");
                if (_trx.Connection.State.ToString().Equals("Open"))
                if (_trx.Connection.State == ConnectionState.Open)
                    _trx.Rollback();
                return false;
            }
            _mEventRecord.Addr = mAddr;
            _eosEventRecord.Addr = mAddr;
            // 設定事故原因
            _mEventRecord.Brief = TransferEventBrief(_mCcsRecord.EventBrief);
            _eosEventRecord.Brief = TransferEventBrief(_mCcsEventRecord.EventBrief);
            try
            {
                var encoding = new ASCIIEncoding();
                var source = encoding.GetBytes(_mEventRecord.Brief);
                var source = encoding.GetBytes(_eosEventRecord.Brief);
                if (source.Length > 24)
                {
@@ -456,57 +458,57 @@
                    }
                    var enc = Encoding.ASCII;
                    _mEventRecord.Brief = enc.GetString(dest);
                    _eosEventRecord.Brief = enc.GetString(dest);
                    source = dest = null;
                }
            }
            catch (Exception)
            {
                _mEventRecord.Brief = "其他";
                _eosEventRecord.Brief = "其他";
            }
            if (_mCcsRecord.CcsId.StartsWith("A"))
                _mEventRecord.Log = "APP";
            else if (_mCcsRecord.CcsId.StartsWith("W"))
                _mEventRecord.Log = "WEB";
            if (_mCcsEventRecord.CcsId.StartsWith("A"))
                _eosEventRecord.Log = "APP";
            else if (_mCcsEventRecord.CcsId.StartsWith("W"))
                _eosEventRecord.Log = "WEB";
            else
                _mEventRecord.Log = "CCS";
                _eosEventRecord.Log = "CCS";
            _mEventRecord.AcceptDate = _mCcsRecord.AcceptTime;
            _eosEventRecord.AcceptDate = _mCcsEventRecord.AcceptTime;
            // 設定用戶種類
            if (_mCcsRecord.ImportCase == GlobalVariable.IsImportCase)
            if (_mCcsEventRecord.ImportCase == GlobalVariable.IsImportCase)
            {
                _mEventRecord.ImportCase = GlobalVariable.IsImportCase;
                _mEventRecord.Level = GlobalVariable.ALevel; // default set A level
                _eosEventRecord.ImportCase = GlobalVariable.IsImportCase;
                _eosEventRecord.Level = GlobalVariable.ALevel; // default set A level
            }
            else
            {
                _mEventRecord.ImportCase = GlobalVariable.NotImportCase;
                _mEventRecord.Level = GlobalVariable.NoLevel;
                _eosEventRecord.ImportCase = GlobalVariable.NotImportCase;
                _eosEventRecord.Level = GlobalVariable.NoLevel;
            }
            // 檢查字串中有無特殊字元' ,若有則取代為"
            if (_mCcsRecord.Note != null)
                _mEventRecord.Note = _mCcsRecord.Note.Replace('\'', '\"');
            if (_mCcsEventRecord.Note != null)
                _eosEventRecord.Note = _mCcsEventRecord.Note.Replace('\'', '\"');
            // 設定回覆姓名及電話
            if (_mCcsRecord.RecallName != null)
            if (_mCcsEventRecord.RecallName != null)
            {
                _mEventRecord.IsReCall = GlobalVariable.IsReCall;
                _mEventRecord.ReCallName = _mCcsRecord.RecallName.Replace('\'', '\"');
                _mEventRecord.ReCallTel = _mCcsRecord.RecallTel;
                _eosEventRecord.IsReCall = GlobalVariable.IsReCall;
                _eosEventRecord.ReCallName = _mCcsEventRecord.RecallName.Replace('\'', '\"');
                _eosEventRecord.ReCallTel = _mCcsEventRecord.RecallTel;
            }
            else
            {
                _mEventRecord.IsReCall = GlobalVariable.NotReCall;
                _eosEventRecord.IsReCall = GlobalVariable.NotReCall;
            }
            Logger.Info("初始化EOS.EVENTRECORD成功!");
            return true;
        }
        //private bool initialCCSInfo(CCS.Object.EventQuery m_EventQuery, CCS.Object.NumberContrast m_Contrast)
        //private bool initialCCSInfo(CCS.Object.CCSEventQuery m_EventQuery, CCS.Object.NumberContrast m_Contrast)
        //{
        //    checkCaseAlreadyExits(m_EventQuery);
        //    if (!m_EventQuery.Insert(_PLog, _ConnectionTPC, _Trx))
@@ -522,9 +524,9 @@
        //    return true;
        //}
        private void CheckCaseAlreadyExits(EventQuery mEventQuery)
        private void CheckCaseAlreadyExits(CCSEventQuery ccsEventQuery)
        {
            var sqlStmt = "select ccsid from ccs.eventquery where ccsid='" + mEventQuery.CcsId + "'";
            var sqlStmt = "select ccsid from ccs.eventquery where ccsid='" + ccsEventQuery.CcsId + "'";
            var command = new OracleCommand(sqlStmt, _connectionTpc, _trx);
            var reader = command.ExecuteReader();
@@ -533,10 +535,10 @@
            {
                if (reader.Read())
                {
                    command.CommandText = "delete from ccs.eventquery where ccsid='" + mEventQuery.CcsId + "'";
                    command.CommandText = "delete from ccs.eventquery where ccsid='" + ccsEventQuery.CcsId + "'";
                    command.ExecuteNonQuery();
                    command.CommandText = "delete from ccs.num_contrast where ccsid='" + mEventQuery.CcsId + "'";
                    command.CommandText = "delete from ccs.num_contrast where ccsid='" + ccsEventQuery.CcsId + "'";
                    command.ExecuteNonQuery();
                }
            }
@@ -551,16 +553,14 @@
            }
        }
        private int FindoutDeptByAddr(CcsRecord ccsRecord, OracleTransaction trx)
        private int FindoutDeptByAddr(CCSEventRecord ccsEventRecord, OracleTransaction trx)
        {
            var addrContrast = new AddrContrast(_connectionTpc, trx);
            return addrContrast.FindDeptId(ccsRecord.AddressCity, ccsRecord.AddressTown, ccsRecord.AddressRoad);
            return AddrContrast.Instance.FindDeptId(ccsEventRecord.AddressCity, ccsEventRecord.AddressTown, ccsEventRecord.AddressRoad);
        }
        private string TransferEventBrief(int code)
        {
            var result = "";
            result = GlobalVariable.CcsCodelist.GetContent(GlobalVariable.CcsEventBrief, code);
            var result = GlobalVariable.CcsCodelist.GetContent(GlobalVariable.CcsEventBrief, code);
            //            int MaxLength = this.getFieldLength("EOS", "EVENTRECORD", "EVENTBRIEF");
@@ -578,10 +578,9 @@
        private int GetRealCaseStatus(int parentId)
        {
            string sqlStmt;
            var status = (int) CCSCaseState.WaitForDespatch;
            sqlStmt = "SELECT CASESTATUS FROM EOS.EVENTS WHERE CASEID = " + parentId;
            var sqlStmt = "SELECT CASESTATUS FROM EOS.EVENTS WHERE CASEID = " + parentId;
            var command = new OracleCommand(sqlStmt, _connectionTpc, _trx);
            var reader = command.ExecuteReader();
@@ -605,10 +604,10 @@
            return status;
        }
        private void SetDespatchInfo(int mCaseId, EventQuery mEventQry)
        private void SetDespatchInfo(int caseId, CCSEventQuery ccsEventQry)
        {
            var sqlStmt = "select despatchtime,assumefixtime,assumedtime_nth,delaytime,reason,eventlocation from eos.eventdespatch where caseid="
                          + mCaseId;
            var sqlStmt = "SELECT DESPATCHTIME,ASSUMEFIXTIME,ASSUMEDTIME_NTH,DELAYTIME,REASON,EVENTLOCATION FROM EOS.EVENTDESPATCH WHERE CASEID="
                          + caseId;
            OracleCommand command = null;
            OracleDataReader reader = null;
@@ -620,13 +619,13 @@
                if (reader.Read())
                {
                    mEventQry.ChangeTime = Convert.ToDateTime(reader["despatchtime"]).ToString("yyy/MM/dd HH:mm:ss");
                    mEventQry.AssumedTime = Convert.ToDateTime(reader["assumefixtime"]).ToString("yyy/MM/dd HH:mm:ss");
                    mEventQry.AssumedTimeNth =
                    ccsEventQry.ChangeTime = Convert.ToDateTime(reader["despatchtime"]).ToString("yyy/MM/dd HH:mm:ss");
                    ccsEventQry.AssumedTime = Convert.ToDateTime(reader["assumefixtime"]).ToString("yyy/MM/dd HH:mm:ss");
                    ccsEventQry.AssumedTimeNth =
                        Convert.ToDateTime(reader["assumedtime_nth"]).ToString("yyy/MM/dd HH:mm:ss");
                    mEventQry.DelayTimes = Convert.ToInt32(reader["delaytime"].ToString());
                    mEventQry.Reason = reader["reason"].ToString();
                    mEventQry.EventLocation = reader["eventlocation"].ToString();
                    ccsEventQry.DelayTimes = Convert.ToInt32(reader["delaytime"].ToString());
                    ccsEventQry.Reason = reader["reason"].ToString();
                    ccsEventQry.EventLocation = reader["eventlocation"].ToString();
                }
            }
            catch (Exception e)
@@ -636,27 +635,24 @@
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                if (command != null)
                    command.Dispose();
                reader?.Close();
                command?.Dispose();
            }
        }
        private void ProcessSameCustomer(CcsRecord mCcsRecord, EventRecord mEventRec)
        private void ProcessSameCustomer(CCSEventRecord ccsEventRecord, EOSEventRecord eosEventRec)
        {
            Logger.Info("處理相同用戶重複來電...");
            StringBuilder note = null;
            var sqlStmt = "select note from eos.eventrecord where caseid = " + mEventRec.TmpCaseId;
            var sqlStmt = "select note from eos.eventrecord where caseid = " + eosEventRec.TmpCaseId;
            var command = new OracleCommand(sqlStmt, _connectionTpc, _trx);
            var reader = command.ExecuteReader();
            try
            {
                if (reader.Read())
                    note = new StringBuilder(reader["note"] == null ? "" : reader["note"].ToString().Trim());
                    note = new StringBuilder(reader["note"]?.ToString().Trim() ?? "");
            }
            catch (Exception e)
            {
@@ -671,16 +667,16 @@
            if (!note.ToString().EndsWith("|") && !note.ToString().Trim().Equals(""))
                note.Append(" | ");
            if ((mEventRec.Note!= null) && (mEventRec.Note.Length != 0))
                note.Append(mEventRec.AcceptDate+ " " + mEventRec.Note);
            if (!string.IsNullOrEmpty(eosEventRec.Note))
                note.Append(eosEventRec.AcceptDate+ " " + eosEventRec.Note);
            else
                note.Append(mEventRec.AcceptDate+ " 用戶再次報案");
                note.Append(eosEventRec.AcceptDate+ " 用戶再次報案");
            // 判斷重複來電的用戶最初成立的案件是否是由CCS受理
            var acceptByCcs = false;
            var sqlStmt1 = "select count(*) as count from ccs.num_contrast c,ccs.eventquery q where c.ccsid=q.ccsid and caseid="
                           + mEventRec.TmpCaseId;
                           + eosEventRec.TmpCaseId;
            var command1 = new OracleCommand(sqlStmt1, _connectionTpc, _trx);
            var reader1 = command1.ExecuteReader();
@@ -694,8 +690,9 @@
                    }
                }
            }
            catch (Exception)
            catch (Exception e)
            {
                Logger.Warn(e, e.Message);
            }
            finally
            {
@@ -707,8 +704,8 @@
            // 若先前案件由CCS受理,則直接從ccs.eventquery取出先前的案件狀態資料寫入
            if (acceptByCcs)
            {
                updCcsEventQuery = "update ccs.eventquery set (casestatus,changetime,handlingsummary,assumedtime,assumedtime_nth,delaytimes,reason,eventlocation) = (select casestatus,changetime,handlingsummary,assumedtime,assumedtime_nth,delaytimes,reason,eventlocation from ccs.eventquery where ccsid=(select ccsid from ccs.num_contrast where caseid="
                                   + mEventRec.TmpCaseId+ " and rownum<2)) where CCSID='" + mCcsRecord.CcsId + "'";
                updCcsEventQuery = "UPDATE CCS.EVENTQUERY SET (CASESTATUS,CHANGETIME,HANDLINGSUMMARY,ASSUMEDTIME,ASSUMEDTIME_NTH,DELAYTIMES,REASON,EVENTLOCATION) = (select casestatus,changetime,handlingsummary,assumedtime,assumedtime_nth,delaytimes,reason,eventlocation from ccs.eventquery where ccsid=(select ccsid from ccs.num_contrast where caseid="
                                   + eosEventRec.TmpCaseId+ " AND ROWNUM<2)) WHERE CCSID='" + ccsEventRecord.CcsId + "'";
                // 若非由CCS受理(OMS,Web)則從EOS的table中尋找先前案件的狀態資料
            }
            else
@@ -729,11 +726,10 @@
                try
                {
                    var sqlStmt2 = "select  1,to_char(r.accepttime,'YYYY/MM/DD HH24:MI:SS') as ACCEPTTIME,to_char(d.despatchtime,'YYYY/MM/DD HH24:MI:SS') as DESPATCHTIME,to_char(s.reconditiontime,'YYYY/MM/DD HH24:MI:SS')SPONSORTIME,e.casestatus,s.handling,to_char(d.assumefixtime,'YYYY/MM/DD HH24:MI:SS') as assumefixtime,to_char(d.assumedtime_nth,'YYYY/MM/DD HH24:MI:SS') as assumedtime_nth,d.delaytime,d.reason,d.eventlocation from eos.eventrecord r,eos.events e,eos.eventdespatch d,eos.eventsponsor s where (r.caseid=e.caseid) and (r.caseid=d.caseid(+)) and (r.caseid=s.caseid(+)) and r.caseid="
                                   + mEventRec.TmpCaseId                                   + " union "
                                   +
                                   "select  2,to_char(r.accepttime,'YYYY/MM/DD HH24:MI:SS') as ACCEPTTIME,to_char(d.despatchtime,'YYYY/MM/DD HH24:MI:SS') as DESPATCHTIME,to_char(s.reconditiontime,'YYYY/MM/DD HH24:MI:SS')SPONSORTIME,e.casestatus,s.handling,to_char(d.assumefixtime,'YYYY/MM/DD HH24:MI:SS') as assumefixtime,to_char(d.assumedtime_nth,'YYYY/MM/DD HH24:MI:SS') as assumedtime_nth,d.delaytime,d.reason,d.eventlocation from eos.eventrecord r,eos.events e,eos.eventdespatch d,eos.eventsponsor s where (r.caseid=e.caseid) and (r.caseid=d.caseid(+)) and (r.caseid=s.caseid(+)) and r.caseid= (select parentid from eos.mergecase where caseid="
                                   + mEventRec.TmpCaseId+ ")";
                    var sqlStmt2 = "SELECT  1,TO_CHAR(R.ACCEPTTIME,'YYYY/MM/DD HH24:MI:SS') AS ACCEPTTIME,TO_CHAR(D.DESPATCHTIME,'YYYY/MM/DD HH24:MI:SS') AS DESPATCHTIME,to_char(s.reconditiontime,'YYYY/MM/DD HH24:MI:SS')SPONSORTIME,e.casestatus,s.handling,to_char(d.assumefixtime,'YYYY/MM/DD HH24:MI:SS') as assumefixtime,to_char(d.assumedtime_nth,'YYYY/MM/DD HH24:MI:SS') as assumedtime_nth,d.delaytime,d.reason,d.eventlocation from eos.eventrecord r,eos.events e,eos.eventdespatch d,eos.eventsponsor s where (r.caseid=e.caseid) and (r.caseid=d.caseid(+)) and (r.caseid=s.caseid(+)) and r.caseid="
                                   + eosEventRec.TmpCaseId                                   + " union "
                                   +"SELECT  2,TO_CHAR(R.ACCEPTTIME,'YYYY/MM/DD HH24:MI:SS') AS ACCEPTTIME,TO_CHAR(D.DESPATCHTIME,'YYYY/MM/DD HH24:MI:SS') AS DESPATCHTIME,to_char(s.reconditiontime,'YYYY/MM/DD HH24:MI:SS')SPONSORTIME,e.casestatus,s.handling,to_char(d.assumefixtime,'YYYY/MM/DD HH24:MI:SS') as assumefixtime,to_char(d.assumedtime_nth,'YYYY/MM/DD HH24:MI:SS') as assumedtime_nth,d.delaytime,d.reason,d.eventlocation from eos.eventrecord r,eos.events e,eos.eventdespatch d,eos.eventsponsor s where (r.caseid=e.caseid) and (r.caseid=d.caseid(+)) and (r.caseid=s.caseid(+)) and r.caseid= (select parentid from eos.mergecase where caseid="
                                   + eosEventRec.TmpCaseId+ ")";
                    command2 = new OracleCommand(sqlStmt2, _connectionTpc, _trx);
                    reader2 = command2.ExecuteReader();
@@ -743,15 +739,15 @@
                        accepttime = reader2["ACCEPTTIME"].ToString();
                        despatchtime = reader2["DESPATCHTIME"].ToString();
                        sponsortime = reader2["SPONSORTIME"].ToString();
                        assumefixtime = reader2["ASSUMEFIXTIME"] == null ? "" : reader2["ASSUMEFIXTIME"].ToString();
                        assumedtimeNth = reader2["ASSUMEDTIME_NTH"] == null ? "" : reader2["ASSUMEDTIME_NTH"].ToString();
                        handling = reader2["HANDLING"] == null ? "" : reader2["HANDLING"].ToString();
                        reason = reader2["REASON"] == null ? "" : reader2["REASON"].ToString();
                        assumefixtime = reader2["ASSUMEFIXTIME"]?.ToString() ?? "";
                        assumedtimeNth = reader2["ASSUMEDTIME_NTH"]?.ToString() ?? "";
                        handling = reader2["HANDLING"]?.ToString() ?? "";
                        reason = reader2["REASON"]?.ToString() ?? "";
                        casestatus = Convert.ToInt32(reader2["CASESTATUS"].ToString());
                        delaytime = reader2["DELAYTIME"].ToString().Length == 0
                            ? 0
                            : Convert.ToInt32(reader2["DELAYTIME"].ToString());
                        eventlocation = reader2["EVENTLOCATION"] == null ? "" : reader2["EVENTLOCATION"].ToString();
                        eventlocation = reader2["EVENTLOCATION"]?.ToString() ?? "";
                    }
                    if (accepttime != null)
@@ -766,14 +762,14 @@
                    {
                        changetime = sponsortime;
                    }
                    updCcsEventQuery = "update ccs.eventquery set casestatus=" + casestatus + ",changetime=to_date('" +
                    updCcsEventQuery = "UPDATE CCS.EVENTQUERY SET CASESTATUS=" + casestatus + ",changetime=to_date('" +
                                       changetime
                                       + "','YYYY/MM/DD HH24:MI:SS'),handlingsummary='" + handling +
                                       "',assumedtime=to_date('" + assumefixtime
                                       + "','YYYY/MM/DD HH24:MI:SS'),assumedtime_nth=to_date('" + assumedtimeNth +
                                       "','YYYY/MM/DD HH24:MI:SS'),delaytimes="
                                       + delaytime + ",reason='" + reason + "',eventlocation='" + eventlocation +
                                       "' where ccsid='" + mCcsRecord.CcsId + "'";
                                       + delaytime + ",REASON='" + reason + "',EVENTLOCATION='" + eventlocation +
                                       "' WHERE CCSID='" + ccsEventRecord.CcsId + "'";
                }
                catch (Exception e)
                {
@@ -781,27 +777,25 @@
                }
                finally
                {
                    if (reader2 != null)
                        reader2.Close();
                    if (command2 != null)
                        command2.Dispose();
                    reader2?.Close();
                    command2?.Dispose();
                }
            }
            var updEosEventRecord = "UPDATE EOS.EVENTRECORD SET NOTE = '" + TrimToLimit(note.ToString(), 127)
                                    + "' where caseid = " + _mEventRecord.TmpCaseId;
                                    + "' WHERE CASEID = " + _eosEventRecord.TmpCaseId;
            var updCcsNumContrast = "UPDATE CCS.NUM_CONTRAST SET(acceptnum,caseid) = (SELECT acceptnum," +
                                    mEventRec.TmpCaseId                                    + " FROM eos.eventrecord WHERE caseid = " + mEventRec.TmpCaseId+
                                    ") where ccsid='" + mCcsRecord.CcsId + "'";
                                    eosEventRec.TmpCaseId
                                    + " FROM EOS.EVENTRECORD WHERE CASEID = " + eosEventRec.TmpCaseId +
                                    ") where ccsid='" + ccsEventRecord.CcsId + "'";
            var exeCommand = new OracleCommand(updCcsEventQuery, _connectionTpc, _trx);
            // 將用戶重複來電案件資料寫回CCS.EventQuery
            // 將用戶重複來電案件資料寫回CCS.CCSEventQuery
            if (exeCommand.ExecuteNonQuery() <= 0)
            {
                exeCommand.Dispose();
                if (_trx.Connection.State.ToString().Equals("Open"))
                if (_trx.Connection.State == ConnectionState.Open)
                    _trx.Rollback();
                _trx.Dispose();
@@ -810,12 +804,12 @@
            }
            exeCommand.CommandText = updEosEventRecord;
            // 將CCS案件備註資料Append到EOS.EventRecord
            // 將CCS案件備註資料Append到EOS.EOSEventRecord
            if (exeCommand.ExecuteNonQuery() <= 0)
            {
                exeCommand.Dispose();
                if (_trx.Connection.State.ToString().Equals("Open"))
                if (_trx.Connection.State == ConnectionState.Open)
                    _trx.Rollback();
                _trx.Dispose();
@@ -828,7 +822,7 @@
            if (exeCommand.ExecuteNonQuery() <= 0)
            {
                exeCommand.Dispose();
                if (_trx.Connection.State.ToString().Equals("Open"))
                if (_trx.Connection.State == ConnectionState.Open)
                    _trx.Rollback();
                _trx.Dispose();
CCSTrace/CCSTrace.csproj
@@ -88,30 +88,75 @@
      <SubType>Designer</SubType>
    </Content>
    <Content Include="DBConfig.xml" />
    <Content Include="DMMSNHibernate.cfg.xml" />
    <Content Include="Global.asax" />
    <Content Include="Service1.asmx" />
    <Content Include="TPower\DMMS\Model\BaseDB\CONNECTIVITY.hbm.xml" />
    <Content Include="TPower\DMMS\Model\BaseDB\HICUSTOMER.hbm.xml" />
    <Content Include="TPower\DMMS\Model\BaseDB\METER.hbm.xml" />
    <Content Include="TPower\DMMS\Model\BaseDB\MSTADDR.hbm.xml" />
    <Content Include="TPower\DMMS\Model\BaseDB\SXFMR.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\ADDRCONTRAST.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\ALARMIP.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\CODELIST.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\DEPTCONTRAST.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\EVENTQUERY.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\EVENTRECORD.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\NUMCONTRAST.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\SCGROUP.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\SCGROUPTIME.hbm.xml" />
    <Content Include="TPower\DMMS\Model\CCS\TMP.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\CODELIST.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\CRTAPOLOGY.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\EVENT.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\EVENTFACILITY.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\EVENTRECORD.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\EVENTRECORDEX.hbm.xml" />
    <Content Include="TPower\DMMS\Model\EOS\TMPAFFECTCUSTM.hbm.xml" />
    <Content Include="TPower\DMMS\Model\BaseDB\CONNECTIVITY.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\BaseDB\HICUSTOMER.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\BaseDB\METER.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\BaseDB\MSTADDR.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\BaseDB\SXFMR.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\ADDRCONTRAST.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\ALARMIP.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\CODELIST.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\DEPTCONTRAST.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\EVENTQUERY.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\EVENTRECORD.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\NUMCONTRAST.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\SCGROUP.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\SCGROUPTIME.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\CCS\TMP.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\CODELIST.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\CRTAPOLOGY.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\EVENT.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\EVENTFACILITY.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\EVENTRECORD.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\EVENTRECORDEX.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="TPower\DMMS\Model\EOS\TMPAFFECTCUSTM.hbm.xml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Web.config">
      <SubType>Designer</SubType>
    </Content>
@@ -128,18 +173,18 @@
    <Compile Include="CCS\Function\InitialEventData.cs" />
    <Compile Include="CCS\Function\Leach.cs" />
    <Compile Include="CCS\Function\MergeCase.cs" />
    <Compile Include="CCS\NHibertnateSession.cs" />
    <Compile Include="CCS\Object\Addr_Contrast.cs" />
    <Compile Include="CCS\Object\AlarmData.cs" />
    <Compile Include="CCS\Object\CCSCodelist.cs" />
    <Compile Include="CCS\Object\CCSRecord.cs" />
    <Compile Include="CCS\Object\CCSEventRecord.cs" />
    <Compile Include="CCS\Object\Dept_Contrast.cs" />
    <Compile Include="CCS\Object\EOSCodelist.cs" />
    <Compile Include="CCS\Object\EventQuery.cs" />
    <Compile Include="CCS\Object\EventRecord.cs" />
    <Compile Include="CCS\Object\CCSEventQuery.cs" />
    <Compile Include="CCS\Object\EOSEventRecord.cs" />
    <Compile Include="CCS\Object\LocateEquipment.cs" />
    <Compile Include="CCS\Object\NumberContrast.cs" />
    <Compile Include="CCS\ProcessEvent.cs" />
    <Compile Include="CCS\RecordLog.cs" />
    <Compile Include="CCS\ThreadEndEvent.cs" />
    <Compile Include="Global.asax.cs">
      <DependentUpon>Global.asax</DependentUpon>
CCSTrace/Global.asax.cs
@@ -16,7 +16,7 @@
        protected void Application_Start(object sender, EventArgs e)
        {
            Logger.Info("CCSTrace WebService Application Startup.");
            CcsMain appMain = CcsMain.Instance();
            CcsMain appMain = CcsMain.Instance;
            string path = HttpContext.Current.Server.MapPath("~/App_Data");
            appMain.AppDataPath = path;
            appMain.Startup();
@@ -50,7 +50,7 @@
        protected void Application_End(object sender, EventArgs e)
        {
            Logger.Info("CCSTrace WebService Application Shutdown.");
            CcsMain appMain = CcsMain.Instance();
            CcsMain appMain = CcsMain.Instance;
            appMain.Shutdown();
        }
    }
CCSTrace/Service1.asmx.cs
@@ -27,11 +27,15 @@
                         string addrOther, string recallname, string recalltel, int eventbrief, string accepttime, int importcase, string dept,
                         int partHicustomer, string note)
        {
            CCS.Object.CcsRecord record = new CCS.Object.CcsRecord(ccsid, meter, customername, customertel, addrCity, addrTown, addrRoad,
            if (ccsid == null)
            {
                return;
            }
            CCS.Object.CCSEventRecord ccsEventRecord = new CCS.Object.CCSEventRecord(ccsid, meter, customername, customertel, addrCity, addrTown, addrRoad,
                                                                             addrOther, recallname, recalltel, eventbrief, accepttime, importcase, dept,
                                                                             partHicustomer, note);
            //_CCSMain.AcceptEvent(_Record);
            CCS.CcsMain.Instance()?.AcceptEvent(record);
            CCS.CcsMain.Instance?.AcceptEvent(ccsEventRecord);
        }