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