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; } }