private void UpdateDb(SendMessageQueue sendMessageQueue, SEND_SMS_RESULT sendMessageResult) { // 寫入對應的 SendMessageResult var every8d_SendMessageResult = new Every8d_SendMessageResult(); every8d_SendMessageResult.SourceTable = SourceTable.SendMessageQueue; every8d_SendMessageResult.SourceTableId = sendMessageQueue.Id; every8d_SendMessageResult.SendTime = sendMessageQueue.SendTime; every8d_SendMessageResult.Subject = sendMessageQueue.SendTitle; every8d_SendMessageResult.Content = sendMessageQueue.SendBody; every8d_SendMessageResult.CreatedTime = DateTime.UtcNow; every8d_SendMessageResult.CREDIT = sendMessageResult.CREDIT; every8d_SendMessageResult.SENDED = sendMessageResult.SENDED; every8d_SendMessageResult.COST = sendMessageResult.COST; every8d_SendMessageResult.UNSEND = sendMessageResult.UNSEND; every8d_SendMessageResult.BATCH_ID = sendMessageResult.BATCH_ID; every8d_SendMessageResult = this.unitOfWork.Repository <Every8d_SendMessageResult>().Insert(every8d_SendMessageResult); // Every8d 在此階段無法取得寫入 SendMessageHistory,無對應資料結構 // CreateSendMessageHistory(sendMessageQueue.Id); // 在 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 = sendMessageQueue.Id; deliveryReportQueue.SourceTable = SourceTable.SendMessageQueue; deliveryReportQueue.RequestId = every8d_SendMessageResult.BATCH_ID; deliveryReportQueue.ProviderName = this.Name; deliveryReportQueue.CreatedTime = DateTime.UtcNow; deliveryReportQueue.SendMessageResultItemCount = every8d_SendMessageResult.SENDED.HasValue ? every8d_SendMessageResult.SENDED.Value : 0; 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); var clientTimezoneOffset = sendMessageRule.ClientTimezoneOffset; var messageReceivers = this.unitOfWork.Repository <MessageReceiver>().GetMany(p => p.SendMessageRuleId == sendMessageQueue.SendMessageRuleId && p.SendBody == sendMessageQueue.SendBody).ToList(); Every8d_SendMessageResult sendMessageResult = this.unitOfWork.Repository <Every8d_SendMessageResult>().Get(p => p.SourceTable == SourceTable.SendMessageQueue && p.SourceTableId == sendMessageQueueId); // if (SendMessageResult == null) return; 不應該為 null 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.BATCH_ID; string ProviderName = this.Name; DateTime SendMessageResultCreatedTime = sendMessageResult.CreatedTime; List <Every8d_DeliveryReport> DeliveryReports = sendMessageResult.DeliveryReports.ToList(); //foreach (var DeliveryReport in DeliveryReports) for (var i = 0; i < DeliveryReports.Count; i++) { var DeliveryReport = DeliveryReports[i]; var messageReceiver = (0 <= i && i < messageReceivers.Count) ? messageReceivers[i] : null; string DestinationName = DeliveryReport.NAME; 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 = null; entity.MessageStatus = MessageStatus.Unknown; entity.MessageStatusString = entity.MessageStatus.ToString(); entity.SenderAddress = sendMessageRule.SenderAddress; //////////////////////////////////////// // 16 ~ 20 // 20151106 Norman, Infobip 給的手機門號是 E164格式,但是沒有加上 "+",使用 【MobileUtil.GetE164PhoneNumber】會導致誤判 var destinationAddress = DeliveryReport.MOBILE; if (!destinationAddress.StartsWith("+", StringComparison.OrdinalIgnoreCase)) { destinationAddress = "+" + destinationAddress; } entity.DestinationAddress = MobileUtil.GetE164PhoneNumber(destinationAddress); entity.SendMessageResultCreatedTime = SendMessageResultCreatedTime; // TODO: 驗證 Every8d 回傳發送時間轉成 UTC 時間是否正確 //entity.SentDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value; // 2010/03/23 12:05:29 //entity.DoneDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value; // 2010/03/23 12:05:29,簡訊供應商沒有提供此資訊,因此設定與SentDate一致 entity.SentDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value.ToUniversalTime(); // 2010/03/23 12:05:29 entity.DoneDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value.ToUniversalTime(); // 2010/03/23 12:05:29,簡訊供應商沒有提供此資訊,因此設定與SentDate一致 entity.DeliveryStatus = (DeliveryReportStatus)Convert.ToInt32(DeliveryReport.STATUS); //////////////////////////////////////// // 21 ~ 25 entity.DeliveryStatusString = entity.DeliveryStatus.ToString(); entity.Price = Convert.ToDecimal(DeliveryReport.COST); 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); entity.CreatedTime = DateTime.UtcNow; entity.RetryMaxTimes = systemParameters.RetryMaxTimes; entity.RetryTotalTimes = 0; entity.SendMessageRetryHistoryId = null; entity.Email = messageReceiver != null ? messageReceiver.Email : string.Empty; entity = sendMessageHistoryRepository.Insert(entity); // 如果發送失敗,就回補點數 // 20151123 Norman, Eric 要求發送失敗不回補點數 //this.tradeService.HandleSendMessageHistory(sendMessageRule, sendMessageQueue, entity); } // (6) 出統計表 this.sendMessageStatisticService.AddOrUpdateSendMessageStatistic(sendMessageQueueId); }
private void UpdateSendMessageRetryHistory(int sendMessageHistoryId) { var sendMessageHistoryRepository = this.unitOfWork.Repository <SendMessageHistory>(); var sendMessageRetryHistoryRepository = this.unitOfWork.Repository <SendMessageRetryHistory>(); var sendMessageHistory = sendMessageHistoryRepository.GetById(sendMessageHistoryId); Every8d_SendMessageResult sendMessageResult = this.unitOfWork.Repository <Every8d_SendMessageResult>().Get(p => p.SourceTable == SourceTable.SendMessageHistory && p.SourceTableId == sendMessageHistoryId); // if (SendMessageResult == null) return; 不應該為 null string RequestId = sendMessageResult.BATCH_ID; string ProviderName = this.Name; DateTime SendMessageResultCreatedTime = sendMessageResult.CreatedTime; List <Every8d_DeliveryReport> DeliveryReports = sendMessageResult.DeliveryReports.ToList(); foreach (var DeliveryReport in DeliveryReports) { string DestinationName = DeliveryReport.NAME; var entity = new SendMessageRetryHistory(); //////////////////////////////////////// // 01 ~ 05 entity.SendMessageHistoryId = sendMessageHistoryId; entity.RequestId = RequestId; //////////////////////////////////////// // 11 ~ 15 entity.ProviderName = ProviderName; entity.MessageId = null; entity.MessageStatus = MessageStatus.Unknown; entity.MessageStatusString = entity.MessageStatus.ToString(); entity.SenderAddress = sendMessageHistory.SenderAddress; //////////////////////////////////////// // 16 ~ 20 entity.DestinationAddress = sendMessageHistory.DestinationAddress; entity.SendMessageResultCreatedTime = SendMessageResultCreatedTime; // TODO: 驗證 Every8d 回傳發送時間轉成 UTC 時間是否正確 //entity.SentDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value; // 2010/03/23 12:05:29 //entity.DoneDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value; // 2010/03/23 12:05:29,簡訊供應商沒有提供此資訊,因此設定與SentDate一致 entity.SentDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value.ToUniversalTime(); // 2010/03/23 12:05:29 entity.DoneDate = Converter.ToDateTime(DeliveryReport.SENT_TIME, Converter.Every8d_SentTime).Value.ToUniversalTime(); // 2010/03/23 12:05:29,簡訊供應商沒有提供此資訊,因此設定與SentDate一致 entity.DeliveryStatus = (DeliveryReportStatus)Convert.ToInt32(DeliveryReport.STATUS); //////////////////////////////////////// // 21 ~ 25 entity.DeliveryStatusString = entity.DeliveryStatus.ToString(); entity.Price = Convert.ToDecimal(DeliveryReport.COST); entity.DeliveryReportCreatedTime = DeliveryReport.CreatedTime; entity.Delivered = IsDelivered(entity.DeliveryStatus); //////////////////////////////////////// // 26 entity.CreatedTime = DateTime.UtcNow; entity = sendMessageRetryHistoryRepository.Insert(entity); sendMessageHistory.RetryTotalTimes += 1; sendMessageHistory.SendMessageRetryHistory = entity; sendMessageHistoryRepository.Update(sendMessageHistory); } }
private void UpdateDb(string requestId, SMS_LOG SMS_LOG) { //連線狀態代碼,各代碼說明請參閱下表。 // 0: 取得連線成功 // -100: 取得連線失敗,無此帳號 // -101: 取得連線失敗,密碼錯誤 // -999: 帳號已封鎖,請洽服務窗口。認證錯誤超過 10 次將封鎖此服務。 if (SMS_LOG.CODE != 0) { return; } if (SMS_LOG.GET_DELIVERY_STATUS.SMS_LIST.Count == 0) { return; } // (3) 將 DeliveryReportList.DeliveryReports 塞入對應資料表 Infobip_DeliveryReport Every8d_SendMessageResult SendMessageResult = this.unitOfWork.Repository <Every8d_SendMessageResult>().Get(p => p.BATCH_ID == requestId); // if (SendMessageResult == null) return; 不應該為 null int CODE = SMS_LOG.CODE; string DESCRIPTION = SMS_LOG.DESCRIPTION; foreach (var SMS_CONTENT in SMS_LOG.GET_DELIVERY_STATUS.SMS_LIST) { var entity = new Every8d_DeliveryReport(); entity.RequestId = requestId; entity.CODE = CODE; entity.DESCRIPTION = DESCRIPTION; entity.NAME = SMS_CONTENT.NAME; entity.MOBILE = SMS_CONTENT.MOBILE; entity.SENT_TIME = SMS_CONTENT.SENT_TIME; entity.COST = SMS_CONTENT.COST; entity.STATUS = SMS_CONTENT.STATUS; entity.CreatedTime = DateTime.UtcNow; entity.SendMessageResult = SendMessageResult; entity = this.unitOfWork.Repository <Every8d_DeliveryReport>().Insert(entity); } Every8d_SendMessageResult every8d_SendMessageResult = this.unitOfWork.Repository <Every8d_SendMessageResult>().Get(p => p.BATCH_ID == requestId); if (every8d_SendMessageResult == null) { throw new Exception(string.Format("Every8dSmsProvider({0}),無法取得 Infobip_SendMessageResult(BATCH_ID:{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 = every8d_SendMessageResult.SENDED.HasValue ? every8d_SendMessageResult.SENDED.Value : 0; int DeliveryReportCount = this.unitOfWork.Repository <Every8d_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 = SendMessageResult.SourceTable; switch (sourceTable) { case SourceTable.SendMessageQueue: int sendMessageQueueId = SendMessageResult.SourceTableId; UpdateSendMessageHistory(sendMessageQueueId); break; case SourceTable.SendMessageHistory: int sendMessageHistoryId = SendMessageResult.SourceTableId; UpdateSendMessageRetryHistory(sendMessageHistoryId); break; } }