Exemplo n.º 1
0
        /// <summary>
        /// Отправка оповещений об изменениях статусов заказов
        /// </summary>
        public static void SendOrderLineTrackingAlerts(ISendOrderLineTrackingAlertsLog log)
        {
            //список менеджеров для отправки копий оповещений
            IDictionary<string, EmployeeInfo> managers = null;

            try
            {
                managers = AcctgRefCatalog.RmsEmployees.Items.ToDictionary(item => item.EmployeeId);
            }
            catch
            {
                log.LogManagerListRequestFailed();
            }

            using (var dc = new DCFactory<StoreDataContext>())
            {
                // deas 23.05.2011 task4130 Ускорение работы со статусами
                //var stRejected = OrderLineStatusUtil.StatusByte(dc, "Rejected");
                var stRejected = OrderLineStatusUtil.StatusByte( "Rejected" );
                //подгрузить список клиентов, по которым будут отправляться оповещения
                var hourOfPeriod = DateTime.Now.Hour; //текущий час отправки оповещений (т.е. сервис сработал в этот час)

                //var clients = (from u in dc.Users.Where(user => user.Role == SecurityRole.Client)
                //               join alert in dc.ClientAlertInfos on u.AcctgID equals alert.ClientID
                //               join o in dc.Orders on u.AcctgID equals o.ClientID
                //               join l in dc.OrderLines on o.OrderID equals l.OrderID
                //               join ac in dc.ClientAlertConfigs on o.ClientID equals ac.ClientID //Для фильтрации по периоду отправки !!! тут явно косяк
                //               where l.CurrentStatusDate > alert.OrderTrackingLastAlertDate
                //                   && l.CurrentStatus != stRejected
                //                   && ac.HourOfPeriod == null || ac.HourOfPeriod == -1 || ac.HourOfPeriod == hourOfPeriod //Фильтрация по периоду отправки !!! тут явно косяк
                //               select u.AcctgID)
                //                .Distinct()
                //                .ToArray();

                //var clients = (from u in dc.Users.Where(user => user.Role == SecurityRole.Client)
                //               join alert in dc.ClientAlertInfos on u.AcctgID equals alert.ClientID
                //               join o in dc.Orders on u.AcctgID equals o.ClientID
                //               join l in dc.OrderLines on o.OrderID equals l.OrderID
                //               //join ac in dc.ClientAlertConfigs.DefaultIfEmpty() on o.ClientID equals ac.ClientID into list	//Для фильтрации по периоду отправки
                //               //from listItem in list.DefaultIfEmpty()										//left join
                //               where l.CurrentStatusDate > alert.OrderTrackingLastAlertDate
                //                   && l.CurrentStatus != stRejected
                //                   //&& (listItem != null && (listItem.HourOfPeriod == null || listItem.HourOfPeriod == -1 || listItem.HourOfPeriod == hourOfPeriod)) //Фильтрация по периоду отправки
                //               select u.AcctgID )
                //                .Distinct()
                //                .ToArray();
                //var clients_temp = from u in clients
                //              join ac in dc.ClientAlertConfigs.DefaultIfEmpty() on u equals ac.ClientID
                //              where (ac == null) || (ac.HourOfPeriod == -1)
                //              select u;

                //var clients = (from u in dc.Users.Where(user => user.Role == SecurityRole.Client)
                //               join alert in dc.ClientAlertInfos on u.AcctgID equals alert.ClientID
                //               join o in dc.Orders on u.AcctgID equals o.ClientID
                //               join l in dc.OrderLines on o.OrderID equals l.OrderID
                //               join ac in dc.ClientAlertConfigs.DefaultIfEmpty() on o.ClientID equals ac.ClientID into list	//Для фильтрации по периоду отправки
                //               from listItem in list.DefaultIfEmpty()										                //left join
                //               where l.CurrentStatusDate > alert.OrderTrackingLastAlertDate
                //                   && l.CurrentStatus != stRejected
                //               && (listItem == null || (listItem.HourOfPeriod == null || listItem.HourOfPeriod == -1 || listItem.HourOfPeriod == hourOfPeriod)) //Фильтрация по периоду отправки
                //               select u.AcctgID)
                //                .Distinct()
                //                .ToArray();

                // deas 23.05.2011 task4124 Новый вариант настроек фильтра оповещений по статусам
                var clients = (from u in dc.DataContext.Users.Where(user => user.Role == SecurityRole.Client)
                               join alert in dc.DataContext.ClientAlertInfos on u.AcctgID equals alert.ClientID
                               join o in dc.DataContext.Orders on u.AcctgID equals o.ClientID
                               join l in dc.DataContext.OrderLines on o.OrderID equals l.OrderID
                               join ac in dc.DataContext.UserSettings.DefaultIfEmpty() on u.UserID.ToString() equals ac.UserID into list	//Для фильтрации по периоду отправки
                                from listItem in list.DefaultIfEmpty()										                //left join
                                where l.CurrentStatusDate > alert.OrderTrackingLastAlertDate
                                    && l.CurrentStatus != stRejected
                                && ( listItem == null || ( listItem.AlertHourOfPeriod == null || listItem.AlertHourOfPeriod == -1 || listItem.AlertHourOfPeriod == hourOfPeriod ) ) //Фильтрация по периоду отправки
                                select u.AcctgID )
                                .Distinct()
                                .ToArray();

                foreach (var clientId in clients)
                {
                    try
                    {
                        SendOrderLineTrackingAlerts(clientId, managers, log);
                    }
                    catch (Exception ex)
                    {
                        log.LogError(clientId, ex);
                    }
                }
            }
        }