private void UpdateSendMessageRetryHistory(int sendMessageHistoryId)
        {
            var sendMessageRetryHistoryRepository = this.unitOfWork.Repository <SendMessageRetryHistory>();

            Infobip_SendMessageResult sendMessageResult = this.unitOfWork.Repository <Infobip_SendMessageResult>().Get(p => p.SourceTable == SourceTable.SendMessageHistory && p.SourceTableId == sendMessageHistoryId);

            if (sendMessageResult == null)
            {
                throw new Exception(string.Format("InfobipSmsProvider(smsProviderType = {0}),無法取得 Infobip_SendMessageResult(SendMessageHistoryId:{1})", smsProviderType.ToString(), sendMessageHistoryId));
            }

            List <Infobip_SendMessageResultItem> SendMessageResults = sendMessageResult.SendMessageResults.ToList();

            foreach (var SendMessageResult in SendMessageResults)
            {
                Infobip_DeliveryReport DeliveryReport = SendMessageResult.DeliveryReport;
                if (DeliveryReport == null)
                {
                    continue;                         // 如果尚未取得派送報表,就忽略
                }
                SendMessageRetryHistory entity = this.unitOfWork.Repository <SendMessageRetryHistory>().Get(p => p.MessageId == SendMessageResult.MessageId);
                if (entity == null)
                {
                    continue;                 // 如果找不到對應 MessageId,就忽略
                }
                entity.SentDate       = DeliveryReport.SentDate;
                entity.DoneDate       = DeliveryReport.DoneDate;
                entity.DeliveryStatus = DeliveryReport.Status;

                entity.DeliveryStatusString = entity.DeliveryStatus.ToString();
                entity.Price = DeliveryReport.Price ?? (decimal)0.0;
                entity.DeliveryReportCreatedTime = DeliveryReport.CreatedTime;
                entity.Delivered = IsDelivered(entity.DeliveryStatus);

                sendMessageRetryHistoryRepository.Update(entity);
            }
        }
        private void CreateSendMessageRetryHistory(SendMessageHistory sendMessageHistory)
        {
            int sendMessageHistoryId = sendMessageHistory.Id;

            var sendMessageRetryHistoryRepository = this.unitOfWork.Repository <SendMessageRetryHistory>();
            var sendMessageHistoryRepository      = this.unitOfWork.Repository <SendMessageHistory>();

            Infobip_SendMessageResult sendMessageResult = this.unitOfWork.Repository <Infobip_SendMessageResult>().Get(p => p.SourceTable == SourceTable.SendMessageHistory && p.SourceTableId == sendMessageHistoryId);

            if (sendMessageResult == null)
            {
                throw new Exception(string.Format("InfobipSmsProvider(smsProviderType = {0}),無法取得 Infobip_SendMessageResult(SendMessageHistoryId:{1})", smsProviderType.ToString(), sendMessageHistoryId));
            }

            string RequestId = sendMessageResult.ClientCorrelator;

            string ProviderName = this.Name;

            DateTime SendMessageResultCreatedTime = sendMessageResult.CreatedTime;

            List <Infobip_SendMessageResultItem> SendMessageResults = sendMessageResult.SendMessageResults.ToList();

            SendMessageRetryHistory entity = null;

            foreach (var SendMessageResult in SendMessageResults)
            {
                string DestinationName = SendMessageResult.DestinationName;

                entity = new SendMessageRetryHistory();

                ////////////////////////////////////////
                // 01 ~ 05

                entity.SendMessageHistoryId = sendMessageHistoryId;
                entity.RequestId            = RequestId;

                ////////////////////////////////////////
                // 11 ~ 15

                entity.ProviderName        = ProviderName;
                entity.MessageId           = SendMessageResult.MessageId;
                entity.MessageStatus       = (EFunTech.Sms.Schema.MessageStatus)((int)SendMessageResult.MessageStatus);
                entity.MessageStatusString = entity.MessageStatus.ToString();
                entity.SenderAddress       = SendMessageResult.SenderAddress;

                ////////////////////////////////////////
                // 16 ~ 20

                // 20151106 Norman, Infobip 給的手機門號是 E164格式,但是沒有加上 "+",使用 【MobileUtil.GetE164PhoneNumber】會導致誤判
                var destinationAddress = SendMessageResult.DestinationAddress;
                if (!destinationAddress.StartsWith("+", StringComparison.OrdinalIgnoreCase))
                {
                    destinationAddress = "+" + destinationAddress;
                }

                entity.DestinationAddress           = MobileUtil.GetE164PhoneNumber(destinationAddress);
                entity.SendMessageResultCreatedTime = SendMessageResultCreatedTime;
                entity.SentDate       = null;
                entity.DoneDate       = null;
                entity.DeliveryStatus = DeliveryReportStatus.MessageAccepted;

                ////////////////////////////////////////
                // 21 ~ 25

                entity.DeliveryStatusString = entity.DeliveryStatus.ToString();
                entity.Price = (decimal)0.0; // 尚未傳送完成
                entity.DeliveryReportCreatedTime = null;
                entity.Delivered = IsDelivered(entity.DeliveryStatus);

                ////////////////////////////////////////
                // 26
                entity.CreatedTime = DateTime.UtcNow;

                entity.Email = sendMessageHistory.Email;

                entity = sendMessageRetryHistoryRepository.Insert(entity);
            }

            // (6) 更新 SendMessageHistory
            if (entity != null)
            {
                sendMessageHistory.RetryTotalTimes        += 1;
                sendMessageHistory.SendMessageRetryHistory = entity;
                sendMessageHistoryRepository.Update(sendMessageHistory);
            }
        }
        private void UpdateDb_RetrySMS(SendMessageHistory sendMessageHistory, SendMessageResult sendMessageResult)
        {
            // 寫入對應的 SendMessageResult

            var infobip_SendMessageResult = new Infobip_SendMessageResult();

            infobip_SendMessageResult.SourceTable      = SourceTable.SendMessageHistory;
            infobip_SendMessageResult.SourceTableId    = sendMessageHistory.Id;
            infobip_SendMessageResult.ClientCorrelator = sendMessageResult.ClientCorrelator;
            infobip_SendMessageResult.CreatedTime      = DateTime.UtcNow; // 接收發送命令回傳值的時間
            infobip_SendMessageResult.Balance          = this.Balance;
            infobip_SendMessageResult = this.unitOfWork.Repository <Infobip_SendMessageResult>().Insert(infobip_SendMessageResult);

            var sendMessageResultItemRepository = this.unitOfWork.Repository <Infobip_SendMessageResultItem>();

            for (var i = 0; i < sendMessageResult.SendMessageResults.Length; i++)
            {
                // 一個 messageReceiver 對應一個 sendMessageResult
                //  尚未驗證,是否我傳送的 destinations 順序與 SendMessageResults 順序一致
                //  【目前假設是一致的】
                var sendMessageResultItem = sendMessageResult.SendMessageResults[i];

                // 20160715 Norman, 改成以下方式,用以解決以下問題
                // The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Infobip_DeliveryReport_dbo.Infobip_SendMessageResultItem_MessageId". The conflict occurred in database "EFunTechSms", table "dbo.Infobip_SendMessageResultItem", column 'MessageId'.

                var infobip_SendMessageResultItem = sendMessageResultItemRepository.Get(p => p.MessageId == sendMessageResultItem.MessageId);

                if (infobip_SendMessageResultItem == null)
                {
                    // insert

                    infobip_SendMessageResultItem = new Infobip_SendMessageResultItem();

                    infobip_SendMessageResultItem.MessageId           = sendMessageResultItem.MessageId;
                    infobip_SendMessageResultItem.MessageStatusString = sendMessageResultItem.MessageStatus;

                    EFunTech.Sms.Schema.MessageStatus MessageStatus = EFunTech.Sms.Schema.MessageStatus.Unknown;
                    Enum.TryParse <EFunTech.Sms.Schema.MessageStatus>(sendMessageResultItem.MessageStatus, out MessageStatus);
                    infobip_SendMessageResultItem.MessageStatus = MessageStatus;

                    infobip_SendMessageResultItem.SenderAddress      = sendMessageResultItem.SenderAddress;
                    infobip_SendMessageResultItem.DestinationAddress = sendMessageResultItem.DestinationAddress;
                    infobip_SendMessageResultItem.SendMessageResult  = infobip_SendMessageResult;
                    infobip_SendMessageResultItem.DestinationName    = sendMessageHistory.DestinationName;
                    infobip_SendMessageResultItem.Email = sendMessageHistory.Email;

                    infobip_SendMessageResultItem = sendMessageResultItemRepository.Insert(infobip_SendMessageResultItem);
                }
                else
                {
                    // update

                    //infobip_SendMessageResultItem.MessageId = sendMessageResultItem.MessageId; // update 不需要這個欄位
                    infobip_SendMessageResultItem.MessageStatusString = sendMessageResultItem.MessageStatus;

                    EFunTech.Sms.Schema.MessageStatus MessageStatus = EFunTech.Sms.Schema.MessageStatus.Unknown;
                    Enum.TryParse <EFunTech.Sms.Schema.MessageStatus>(sendMessageResultItem.MessageStatus, out MessageStatus);
                    infobip_SendMessageResultItem.MessageStatus = MessageStatus;

                    infobip_SendMessageResultItem.SenderAddress      = sendMessageResultItem.SenderAddress;
                    infobip_SendMessageResultItem.DestinationAddress = sendMessageResultItem.DestinationAddress;
                    infobip_SendMessageResultItem.SendMessageResult  = infobip_SendMessageResult;
                    infobip_SendMessageResultItem.DestinationName    = sendMessageHistory.DestinationName;
                    infobip_SendMessageResultItem.Email = sendMessageHistory.Email;

                    sendMessageResultItemRepository.Update(infobip_SendMessageResultItem);
                }
            }

            var infobip_ResourceReference = new Infobip_ResourceReference();

            infobip_ResourceReference.SendMessageResultId = infobip_SendMessageResult.Id;
            infobip_ResourceReference.ResourceURL         = sendMessageResult.ResourceRef.ResourceURL;
            infobip_ResourceReference = this.unitOfWork.Repository <Infobip_ResourceReference>().Insert(infobip_ResourceReference);

            CreateSendMessageRetryHistory(sendMessageHistory);

            // 在 Thread 中等待 30 秒,再寫入 DeliveryReportQueue
            var delayMilliseconds = (int)30 * 1000;

            FaFTaskFactory.StartNew(delayMilliseconds, () =>
            {
                using (var context = new ApplicationDbContext())
                {
                    var _unitOfWork = new UnitOfWork(context);
                    var _repository = _unitOfWork.Repository <DeliveryReportQueue>();

                    // 寫入簡訊派送結果等待取回序列
                    var deliveryReportQueue           = new DeliveryReportQueue();
                    deliveryReportQueue.SourceTableId = sendMessageHistory.Id;
                    deliveryReportQueue.SourceTable   = SourceTable.SendMessageHistory;
                    deliveryReportQueue.RequestId     = infobip_SendMessageResult.ClientCorrelator;
                    deliveryReportQueue.ProviderName  = this.Name;
                    deliveryReportQueue.CreatedTime   = DateTime.UtcNow;
                    deliveryReportQueue.SendMessageResultItemCount = infobip_SendMessageResult.SendMessageResults.Count;
                    deliveryReportQueue.DeliveryReportCount        = 0;
                    deliveryReportQueue = _repository.Insert(deliveryReportQueue);
                }
            });
        }
        /// <summary>
        /// 在 GetDeliveryReport 之後,更新大表 SendMessageHistory
        /// </summary>
        public void UpdateSendMessageHistory(int sendMessageQueueId)
        {
            var sendMessageRuleRepository    = this.unitOfWork.Repository <SendMessageRule>();
            var sendMessageQueueRepository   = this.unitOfWork.Repository <SendMessageQueue>();
            var sendMessageHistoryRepository = this.unitOfWork.Repository <SendMessageHistory>();

            SendMessageQueue sendMessageQueue = sendMessageQueueRepository.GetById(sendMessageQueueId);

            SendMessageRule sendMessageRule = sendMessageRuleRepository.GetById(sendMessageQueue.SendMessageRuleId);

            Infobip_SendMessageResult sendMessageResult = this.unitOfWork.Repository <Infobip_SendMessageResult>().Get(p => p.SourceTable == SourceTable.SendMessageQueue && p.SourceTableId == sendMessageQueueId);

            if (sendMessageResult == null)
            {
                throw new Exception(string.Format("InfobipSmsProvider(smsProviderType = {0}),無法取得 Infobip_SendMessageResult(SendMessageQueueId:{1})", smsProviderType.ToString(), sendMessageQueueId));
            }

            int?DepartmentId = null;

            if (sendMessageRule.CreatedUser.Department != null)
            {
                DepartmentId = sendMessageRule.CreatedUser.Department.Id;
            }
            string          CreatedUserId     = sendMessageRule.CreatedUser.Id;
            int             SendMessageRuleId = sendMessageQueue.SendMessageRuleId;
            SendMessageType SendMessageType   = sendMessageQueue.SendMessageType;

            DateTime     SendTime     = sendMessageQueue.SendTime;
            string       SendTitle    = sendMessageQueue.SendTitle;
            string       SendBody     = sendMessageQueue.SendBody;
            SendCustType SendCustType = sendMessageQueue.SendCustType;
            string       RequestId    = sendMessageResult.ClientCorrelator;

            string ProviderName = this.Name;

            DateTime SendMessageResultCreatedTime = sendMessageResult.CreatedTime;

            List <Infobip_SendMessageResultItem> SendMessageResults = sendMessageResult.SendMessageResults.ToList();

            foreach (var SendMessageResult in SendMessageResults)
            {
                Infobip_DeliveryReport DeliveryReport = SendMessageResult.DeliveryReport;
                if (DeliveryReport == null)
                {
                    continue;                         // 如果尚未取得派送報表,就忽略
                }
                SendMessageHistory entity = this.unitOfWork.Repository <SendMessageHistory>().Get(p => p.MessageId == SendMessageResult.MessageId);
                if (entity == null)
                {
                    continue;                 // 如果找不到對應 MessageId,就忽略
                }
                string DestinationName = SendMessageResult.DestinationName;

                ////////////////////////////////////////
                // 01 ~ 05

                entity.DepartmentId       = DepartmentId;
                entity.CreatedUserId      = CreatedUserId;
                entity.SendMessageRuleId  = SendMessageRuleId;
                entity.SendMessageQueueId = sendMessageQueueId;
                entity.SendMessageType    = SendMessageType;

                ////////////////////////////////////////
                // 06 ~ 10

                entity.SendTime     = SendTime;
                entity.SendTitle    = SendTitle;
                entity.SendBody     = SendBody;
                entity.SendCustType = SendCustType;
                entity.RequestId    = RequestId;

                ////////////////////////////////////////
                // 11 ~ 15

                entity.ProviderName        = ProviderName;
                entity.MessageId           = SendMessageResult.MessageId;
                entity.MessageStatus       = (EFunTech.Sms.Schema.MessageStatus)((int)SendMessageResult.MessageStatus);
                entity.MessageStatusString = entity.MessageStatus.ToString();
                entity.SenderAddress       = SendMessageResult.SenderAddress;

                ////////////////////////////////////////
                // 16 ~ 20

                // 20151106 Norman, Infobip 給的手機門號是 E164格式,但是沒有加上 "+",使用 【MobileUtil.GetE164PhoneNumber】會導致誤判
                var destinationAddress = SendMessageResult.DestinationAddress;
                if (!destinationAddress.StartsWith("+", StringComparison.OrdinalIgnoreCase))
                {
                    destinationAddress = "+" + destinationAddress;
                }

                entity.DestinationAddress           = MobileUtil.GetE164PhoneNumber(destinationAddress);
                entity.SendMessageResultCreatedTime = SendMessageResultCreatedTime;
                entity.SentDate       = DeliveryReport.SentDate;
                entity.DoneDate       = DeliveryReport.DoneDate;
                entity.DeliveryStatus = DeliveryReport.Status;

                ////////////////////////////////////////
                // 21 ~ 25

                entity.DeliveryStatusString = entity.DeliveryStatus.ToString();
                entity.Price = DeliveryReport.Price ?? (decimal)0.0;
                entity.DeliveryReportCreatedTime = DeliveryReport.CreatedTime;
                entity.MessageCost = (new MessageCostInfo(entity.SendBody, entity.DestinationAddress).MessageCost);
                entity.Delivered   = IsDelivered(entity.DeliveryStatus);

                ////////////////////////////////////////
                // 26
                entity.DestinationName = DestinationName;

                entity.Region = MobileUtil.GetRegionName(entity.DestinationAddress);

                sendMessageHistoryRepository.Update(entity);

                // 如果發送失敗,就回補點數
                // 20151123 Norman, Eric 要求發送失敗不回補點數
                //this.tradeService.HandleSendMessageHistory(sendMessageRule, sendMessageQueue, entity);
            }

            // (6) 出統計表
            this.sendMessageStatisticService.AddOrUpdateSendMessageStatistic(sendMessageQueueId);
        }
        /// <summary>
        /// 在 SendSMS 之後,建立大表 SendMessageHistory
        /// </summary>
        public void CreateSendMessageHistory(SendMessageQueue sendMessageQueue)
        {
            int sendMessageQueueId = sendMessageQueue.Id;

            var sendMessageRuleRepository    = this.unitOfWork.Repository <SendMessageRule>();
            var sendMessageQueueRepository   = this.unitOfWork.Repository <SendMessageQueue>();
            var sendMessageHistoryRepository = this.unitOfWork.Repository <SendMessageHistory>();

            SendMessageRule sendMessageRule = sendMessageRuleRepository.GetById(sendMessageQueue.SendMessageRuleId);

            Infobip_SendMessageResult sendMessageResult = this.unitOfWork.Repository <Infobip_SendMessageResult>().Get(p => p.SourceTable == SourceTable.SendMessageQueue && p.SourceTableId == sendMessageQueueId);

            if (sendMessageResult == null)
            {
                throw new Exception(string.Format("InfobipSmsProvider(smsProviderType = {0}),無法取得 Infobip_SendMessageResult(SendMessageQueueId:{1})", smsProviderType.ToString(), sendMessageQueueId));
            }

            int?DepartmentId = null;

            if (sendMessageRule.CreatedUser.Department != null)
            {
                DepartmentId = sendMessageRule.CreatedUser.Department.Id;
            }
            string          CreatedUserId     = sendMessageRule.CreatedUser.Id;
            int             SendMessageRuleId = sendMessageQueue.SendMessageRuleId;
            SendMessageType SendMessageType   = sendMessageQueue.SendMessageType;

            DateTime     SendTime     = sendMessageQueue.SendTime;
            string       SendTitle    = sendMessageQueue.SendTitle;
            string       SendBody     = sendMessageQueue.SendBody;
            SendCustType SendCustType = sendMessageQueue.SendCustType;
            string       RequestId    = sendMessageResult.ClientCorrelator;

            string ProviderName = this.Name;

            DateTime SendMessageResultCreatedTime = sendMessageResult.CreatedTime;

            List <Infobip_SendMessageResultItem> SendMessageResults = sendMessageResult.SendMessageResults.ToList();

            foreach (var SendMessageResult in SendMessageResults)
            {
                string DestinationName = SendMessageResult.DestinationName;

                var entity = new SendMessageHistory();

                ////////////////////////////////////////
                // 01 ~ 05

                entity.DepartmentId       = DepartmentId;
                entity.CreatedUserId      = CreatedUserId;
                entity.SendMessageRuleId  = SendMessageRuleId;
                entity.SendMessageQueueId = sendMessageQueueId;
                entity.SendMessageType    = SendMessageType;

                ////////////////////////////////////////
                // 06 ~ 10

                entity.SendTime     = SendTime;
                entity.SendTitle    = SendTitle;
                entity.SendBody     = SendBody;
                entity.SendCustType = SendCustType;
                entity.RequestId    = RequestId;

                ////////////////////////////////////////
                // 11 ~ 15

                entity.ProviderName        = ProviderName;
                entity.MessageId           = SendMessageResult.MessageId;
                entity.MessageStatus       = (EFunTech.Sms.Schema.MessageStatus)((int)SendMessageResult.MessageStatus);
                entity.MessageStatusString = entity.MessageStatus.ToString();
                entity.SenderAddress       = SendMessageResult.SenderAddress;

                ////////////////////////////////////////
                // 16 ~ 20

                // 20151106 Norman, Infobip 給的手機門號是 E164格式,但是沒有加上 "+",使用 【MobileUtil.GetE164PhoneNumber】會導致誤判
                var destinationAddress = SendMessageResult.DestinationAddress;
                if (!destinationAddress.StartsWith("+", StringComparison.OrdinalIgnoreCase))
                {
                    destinationAddress = "+" + destinationAddress;
                }

                entity.DestinationAddress           = MobileUtil.GetE164PhoneNumber(destinationAddress);
                entity.SendMessageResultCreatedTime = SendMessageResultCreatedTime;
                entity.SentDate       = null;
                entity.DoneDate       = null;
                entity.DeliveryStatus = DeliveryReportStatus.MessageAccepted;

                ////////////////////////////////////////
                // 21 ~ 25

                entity.DeliveryStatusString = entity.DeliveryStatus.ToString();
                entity.Price = (decimal)0.0; // 尚未傳送完成
                entity.DeliveryReportCreatedTime = null;
                entity.MessageCost = (new MessageCostInfo(entity.SendBody, entity.DestinationAddress).MessageCost);
                entity.Delivered   = IsDelivered(entity.DeliveryStatus);

                ////////////////////////////////////////
                // 26
                entity.DestinationName           = DestinationName;
                entity.Region                    = MobileUtil.GetRegionName(entity.DestinationAddress);
                entity.CreatedTime               = DateTime.UtcNow;
                entity.RetryMaxTimes             = systemParameters.RetryMaxTimes;
                entity.RetryTotalTimes           = 0;
                entity.SendMessageRetryHistoryId = null;
                entity.Email = SendMessageResult.Email;

                entity = sendMessageHistoryRepository.Insert(entity);
            }

            // (6) 出統計表
            this.sendMessageStatisticService.AddOrUpdateSendMessageStatistic(sendMessageQueueId);
        }
        private void UpdateDb_GetDeliveryReport(string requestId, DeliveryReportList deliveryReportList)
        {
            if (deliveryReportList.DeliveryReports.Length == 0)
            {
                return;
            }

            this.logService.Debug("InfobipSmsProvider(smsProviderType = {0}),接收簡訊發送結果(簡訊發送識別碼:{1},發送結果:{2})",
                                  smsProviderType.ToString(),
                                  requestId,
                                  deliveryReportList.ToString());

            // (3) 將 DeliveryReportList.DeliveryReports 塞入對應資料表 Infobip_DeliveryReport

            var sendMessageResultItemRepository = this.unitOfWork.Repository <Infobip_SendMessageResultItem>();

            foreach (var deliveryReport in deliveryReportList.DeliveryReports)
            {
                /*
                 *  System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Infobip_DeliveryReport_dbo.Infobip_SendMessageResultItem_MessageId". The conflict occurred in database "EFunTechSms", table "dbo.Infobip_SendMessageResultItem", column 'MessageId'.
                 *  The statement has been terminated.
                 */
                if (!sendMessageResultItemRepository.Any(p => p.MessageId == deliveryReport.MessageId))
                {
                    this.logService.Error("取消建立 Infobip_DeliveryReport,因為 MessageId = {0} 不存在 Infobip_SendMessageResultItem", deliveryReport.MessageId);
                    continue;
                }

                var entity = new Infobip_DeliveryReport();
                entity.RequestId    = requestId;
                entity.MessageId    = deliveryReport.MessageId;
                entity.SentDate     = deliveryReport.SentDate.ToUniversalTime(); // 已換轉換成UTC時間
                entity.DoneDate     = deliveryReport.DoneDate.ToUniversalTime(); // 已換轉換成UTC時間
                entity.StatusString = deliveryReport.Status;

                DeliveryReportStatus Status = DeliveryReportStatus.Unknown;
                Enum.TryParse <DeliveryReportStatus>(deliveryReport.Status, out Status);
                entity.Status = Status;

                entity.Price       = deliveryReport.Price;
                entity.CreatedTime = DateTime.UtcNow;
                entity             = this.unitOfWork.Repository <Infobip_DeliveryReport>().Insert(entity);
            }

            Infobip_SendMessageResult infobip_SendMessageResult = this.unitOfWork.Repository <Infobip_SendMessageResult>().Get(p => p.ClientCorrelator == requestId);

            if (infobip_SendMessageResult == null)
            {
                throw new Exception(string.Format("InfobipSmsProvider(smsProviderType = {0}),無法取得 Infobip_SendMessageResult(ClientCorrelator:{1})", smsProviderType.ToString(), requestId));
            }

            // (4) 如果所有派送結果都取回了,就在 DeliveryReportQueue (待查詢簡訊發送結果序列) 刪除對應資料
            var deliveryReportQueueRepository = this.unitOfWork.Repository <DeliveryReportQueue>();
            var deliveryReportQueue           = deliveryReportQueueRepository.Get(p => p.RequestId == requestId && p.ProviderName == this.Name);

            if (deliveryReportQueue != null)
            {
                int SendMessageResultItemCount = infobip_SendMessageResult.SendMessageResults.Count;
                int DeliveryReportCount        = this.unitOfWork.Repository <Infobip_DeliveryReport>().Count(p => p.RequestId == requestId);

                deliveryReportQueue.SendMessageResultItemCount = SendMessageResultItemCount;
                deliveryReportQueue.DeliveryReportCount        = DeliveryReportCount;
                deliveryReportQueueRepository.Update(deliveryReportQueue);

                // 20151111 Norman, 暫時不刪除,用以除錯
                //if (DeliveryReportCount >= SendMessageResultItemCount)
                //{
                //    deliveryReportQueueRepository.Delete(p => p.RequestId == requestId);
                //}
            }

            // (5) 出大表,SendMessageHistorys
            SourceTable sourceTable = infobip_SendMessageResult.SourceTable;

            switch (sourceTable)
            {
            case SourceTable.SendMessageQueue:
                int sendMessageQueueId = infobip_SendMessageResult.SourceTableId;
                UpdateSendMessageHistory(sendMessageQueueId);
                break;

            case SourceTable.SendMessageHistory:
                int sendMessageHistoryId = infobip_SendMessageResult.SourceTableId;
                UpdateSendMessageRetryHistory(sendMessageHistoryId);
                break;
            }
        }