コード例 #1
0
        public void ProcessSalesOrderEvents()
        {
            int  noErrors    = 0;
            int  idleDelay   = Convert.ToInt32(ConfigurationManager.AppSettings["idleDelay"] ?? "60");
            int  errorsDelay = Convert.ToInt32(ConfigurationManager.AppSettings["errorsDelay"] ?? "300");
            int  maxErrors   = Convert.ToInt32(ConfigurationManager.AppSettings["errorsCount"] ?? "10");
            bool idle        = false;

            while (true)
            {
                try
                {
                    using (TrackerEntitiesContainer tec = TrackerEntitiesManager.GetNewTrackerObjectContext())
                    {
                        //Open connection before any operation on context in order to ensure that all operations will run under same local transaction!!
                        tec.Connection.Open();
                        GetCurrentSalesOrdersQueue(tec);
                        if (SalesOrderId.HasValue && SalesOrderId != Guid.Empty)
                        {
                            SalesOrderSnapshot newSnapshot
                                = TrackerEntitiesManager.Instance.CreateNewSalesOrderSnapshot(SalesOrderId.Value);
                            if (newSnapshot == null)
                            {
                                throw new ApplicationException("Nie odnaleziono obiektu o id = " + SalesOrderId);
                            }
                            SalesOrderSnapshot oldSnapshot
                                = TrackerEntitiesManager.Instance.GetSalesOrderSnapshot(SalesOrderId.Value, tec);

                            var previousEvents = TrackerEntitiesManager.Instance.CreateEventsList(oldSnapshot);
                            var currentEvents  = TrackerEntitiesManager.Instance.CreateEventsList(newSnapshot);
                            var newEvents      = GetNewEvents(previousEvents, currentEvents);
                            newEvents = newEvents.Where(ev => ev.EventDate >= TemplatesCache.StartDate).ToList();
                            List <Message> newMessages = GenerateMessages(newSnapshot, newEvents);
                            MarkSalesOrdersQueueAsCompleted();
                            SaveEntities(newSnapshot, oldSnapshot, newMessages, tec);
                        }
                        else
                        {
                            idle = true;
                        }
                    }
                    if (idle == true)
                    {
                        Thread.Sleep(TimeSpan.FromSeconds(idleDelay));
                        idle = false;
                    }
                }
                catch (Exception ex)
                {
                    noErrors++;
                    Utils.LogException(ex, typeof(MessagingLogic), ConfigurationManager.AppSettings["LogFolder"]);
                    if (noErrors == maxErrors)
                    {
                        Thread.Sleep(TimeSpan.FromSeconds(errorsDelay));
                        noErrors = 0;
                    }
                }
            }
        }
コード例 #2
0
        private void SaveEntities(SalesOrderSnapshot salesOrderSnapshot, SalesOrderSnapshot oldSnapshot
                                  , List <Message> messages, TrackerEntitiesContainer tec)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                TrackerEntitiesManager.Instance.InsertMessages(messages, tec);

                TrackerEntitiesManager.Instance.PersistSalesOrderSnapshot(salesOrderSnapshot, oldSnapshot, messages, tec);

                TrackerEntitiesManager.Instance.UpdateSOTQEntries(SalesOrdersCurrentFullQueue, tec);

                ts.Complete();
            }
        }
コード例 #3
0
        private List <Message> GenerateMessages(SalesOrderSnapshot salesOrderSnapshot, List <Event> events)
        {
            Contractor contractor = salesOrderSnapshot.Contractor;

            events = events.OrderBy(ev => ev.EventDate).ThenBy(ev => ev.Name).ToList();
            List <Message> result = new List <Message>();

            bool emailEnabled = contractor.HasEmailAddress;
            bool smsEnabled   = !contractor.HasEmailAddress && contractor.HasPhoneNumber && !contractor.IsAps;

            if (emailEnabled || smsEnabled)
            {
                MessageType defaultMessageType = smsEnabled ? MessageType.Sms : MessageType.Email;
                foreach (Event newEvent in events)
                {
                    //Nie generujemy powiadomienia o wystawieniu FSR dla zamówień towarowych
                    if (newEvent.Name == EventName.DocumentSettled && salesOrderSnapshot.SalesTypeName == SalesTypeName.Items)
                    {
                        continue;
                    }

                    MessageType usedType
                        = newEvent.Name == EventName.MarkedAsPlanned && emailEnabled ? MessageType.Email : defaultMessageType;
                    string     recipient = usedType == MessageType.Email ? contractor.Email : contractor.Phone;
                    string     sender    = usedType == MessageType.Email ? TemplatesCache.EmailSender : TemplatesCache.SmsSender;
                    SOTMessage message   = new SOTMessage(newEvent.Name, usedType, sender, recipient, newEvent.Parameters);

                    if (message != null && message.InnerMessage != null)
                    {
                        result.Add(message.InnerMessage);
                    }
                }
            }

            return(result);
        }