Example #1
0
        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);
                }
            });
        }
Example #2
0
        /// <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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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;
            }
        }