コード例 #1
0
        public void DoSearch(string Company, string Width, string Diameter, string Gab)
        {
            List<Disc> mQuery = null;

            using (CmsDataContext cms = new CmsDataContext())
            {
                try
                {
                    //Алгоритм фильтрации 1) сначала выбираем все

                    //IEnumerable<Disc> query = query = cms.Discs.Select(x => x);
                    IEnumerable<Disc> query = cms.Discs.ToArray();

                    // 2)Выбираем только те, которые соответствуют названию производителя
                    /*if (!String.IsNullOrEmpty(Company) && !Company.ToLower().Contains("все"))
                        //Проверяем нличие брэнда в метаданных и списке брендов он должен быть настроен видимым
                        query = query.Where(x => x.Manufacturer != null && x.Manufacturer.ToUpper().Contains(Company.ToUpper()) && cms.DiscBrands.Where(y => y.IsVisible).Select(y => y.Name.ToUpper()).Contains(Company.ToUpper()));
                    else
                        query = query.Where(x => x.Manufacturer != null && cms.DiscBrands.Where(y => y.IsVisible).Select(y => y.Name.ToUpper()).Contains(x.Manufacturer.ToUpper()));
                    */
                    if (!String.IsNullOrEmpty(Company) && !Company.ToLower().Contains("все"))
                        query = query.Where(x => x.Manufacturer.ToUpper() == Company.ToUpper());

                    // 3)Выбираем только те, которые соответствуют заданной высоте
                    if (!String.IsNullOrEmpty(Width) && !Width.ToLower().Contains("все"))
                        query = query.Where(x => x.Width == Convert.ToDecimal(Width.Replace('.', ',')));

                    // 4) и т.д.
                    if (!String.IsNullOrEmpty(Diameter) && !Diameter.ToLower().Contains("все"))
                        query = query.Where(x => x.Diameter != null && x.Diameter == Convert.ToDecimal(Diameter));

                    if (!String.IsNullOrEmpty(Gab) && !Gab.ToLower().Contains("все"))
                    {
                        Gab = Gab.Replace(" ", "");
                        if (Gab.StartsWith("<")) query = query.Where(x => x.Gab <= Convert.ToDecimal(Gab.Split('<')[1]));
                        else if (Gab.StartsWith(">")) query = query.Where(x => x.Gab >= Convert.ToDecimal(Gab.Split('>')[1]));
                        else query = query.Where(x => x.Gab >= Convert.ToDecimal(Gab.Split('-')[0]) && x.Gab <= Convert.ToDecimal(Gab.Split('-')[1]));
                    }

                    //Конец фильтрации

                    mQuery = query.ToList();
                }
                catch
                { }
                finally
                {
                   if (cms.Connection.State == System.Data.ConnectionState.Open)
                        cms.Connection.Close();
                }
            }

            using (var store = new StoreDataContext())
            {
                try
                {
                    List<Disc> BatteryPriceSearchResult = new List<Disc>();
                    ExceedMaxresult = false;

                    foreach (Disc item in mQuery)
                    {
                        List<SearchResultItem> list;
                        if (Cache.Get(item.Manufacturer + item.PartNumber) == null)
                        {
                            PartKey searchPartKey = new PartKey(item.Manufacturer, item.PartNumber);

                            SparePartItem[] parts = new SparePartItem[0];

                            if (item.Manufacturer != null)
                            {
                                //TODO: Рассмотреть применение последнего параметра -- поиска аналогов
                                parts = PricingSearch.SearchSpareParts(item.PartNumber, item.Manufacturer.ToUpper(), false);
                            }

                            //пересчитать цены, подгрузить дополнительную информацию о деталях
                            RmsAuto.Acctg.ClientGroup clientGroup = SiteContext.Current.CurrentClient.Profile.ClientGroup;
                            decimal personalMarkup = SiteContext.Current.CurrentClient.Profile.PersonalMarkup;
                            var additionalInfos = RmsAuto.TechDoc.Facade.GetAdditionalInfo(new[] { searchPartKey }.Union(parts.Select(p => new PartKey(p.SparePart.Manufacturer, p.SparePart.PartNumber))));
                            // dan 01.06.2011 task4253 Механизм отображения фотографий брака в результатах поиска.
                            var additionalInfosExt = RmsAuto.Store.Entities.Helpers.SearchHelper.GetAdditionalInfoExt( parts.Select(p => new SparePartKeyExt(p.SparePart.Manufacturer, p.SparePart.PartNumber, p.SparePart.SupplierID)));

                            //курс валюты
                            CurrencyRate currencyRate = GetCurrentCurrencyRate();

                            list = parts.Select(
                                p => new RmsAuto.Store.Web.Controls.SearchResultItem
                                {
                                    ItemType = p.ItemType,
                                    SparePart = p.SparePart,
                                    AdditionalInfo = additionalInfos.ContainsKey(new PartKey(p.SparePart.Manufacturer, p.SparePart.PartNumber)) ? additionalInfos[new PartKey(p.SparePart.Manufacturer, p.SparePart.PartNumber)] : null,
                                    // dan 01.06.2011 task4253 Механизм отображения фотографий брака в результатах поиска.
                                    AdditionalInfoExt = additionalInfosExt.ContainsKey(new SparePartKeyExt(p.SparePart.Manufacturer, p.SparePart.PartNumber, p.SparePart.SupplierID)) ?
                                        additionalInfosExt[new SparePartKeyExt(p.SparePart.Manufacturer, p.SparePart.PartNumber, p.SparePart.SupplierID)] : null,
                                    FinalSalePriceRUR = p.SparePart.GetFinalSalePrice(clientGroup, personalMarkup),
                                    FinalSalePrice = p.SparePart.GetFinalSalePrice(clientGroup, personalMarkup) / currencyRate.Rate,

                                    ShowPrices = true,
                                    ShowInfo = true
                                }).Where(p => p.FinalSalePriceRUR > 0).ToList(); //dan 19.09.2011 добавил условие чтобы убрать позиции с нулевой ценой из результатов поиска

                            Cache.Insert(item.Manufacturer + item.PartNumber, list, null, DateTime.UtcNow.AddMinutes(Convert.ToInt32(ConfigurationManager.AppSettings["CacheDuration"])), TimeSpan.Zero);
                        }
                        else
                        {
                            list = (List<SearchResultItem>)Cache.Get(item.Manufacturer + item.PartNumber);
                        }

                        if (BatteryPriceSearchResult.Count < MaxSearchCount)
                        {
                            foreach (var item2 in list)
                            {
                                Disc tmp = new Disc()
                                {
                                    Dia = item.Dia,
                                    PCD = item.PCD,
                                    Gab = item.Gab,
                                    Manufacturer = item.Manufacturer,
                                    ModelName = item.ModelName,
                                    Diameter = item.Diameter,
                                    Width = item.Width,
                                    PartNumber = item.PartNumber,
                                    ImageUrl = item.ImageUrl,
                                    Price = item2.FinalSalePriceRUR,
                                    SparePart = item2.SparePart,
                                    Ref = String.Format(@"/SearchSpareParts.aspx?mfr={0}&pn={1}&st=1", item.Manufacturer.ToUpper(), item.PartNumber)
                                };

                                BatteryPriceSearchResult.Add(tmp);

                                break; //Ищем только одно предложение
                                //TODO и зачем тут этот недостижимый участок кода???
                                if (BatteryPriceSearchResult.Count >= MaxSearchCount)
                                {
                                    ExceedMaxresult = true;
                                    break;
                                }
                            }

                        }
                        else
                        {
                            ExceedMaxresult = true;
                            break;
                        }
                    }

                    //отсортировать результаты поиска
                    CurrentSearchCount = BatteryPriceSearchResult.Count;
                    PagedDataSource = new PagedDataSource();
                    PagedDataSource.DataSource = BatteryPriceSearchResult.OrderBy(x => x.Price).ToList();
                    PagedDataSource.AllowPaging = true;

                    int count = 0;
                    if (!String.IsNullOrEmpty(Request.Params["PageSize"]) && int.TryParse(Request.Params["PageSize"], out count))
                    {
                        PagedDataSource.PageSize = Convert.ToInt32(Request.Params["PageSize"]);
                    }

                    if (PagedDataSource.PageSize == 0)
                    {
                        PagedDataSource.PageSize = 10;
                    }

                    TirePagerControl.Visible = BatteryPriceSearchResult.Count / PagedDataSource.PageSize + 1 > 1;

                    //Установка значения пейджера
                    if (BatteryPriceSearchResult.Count % PagedDataSource.PageSize > 0)
                        TirePagerControl.MaxIndex = BatteryPriceSearchResult.Count / PagedDataSource.PageSize + 1;
                    else
                        TirePagerControl.MaxIndex = BatteryPriceSearchResult.Count / PagedDataSource.PageSize + 0;

                    if (TirePagerControl.CurrentIndex > 0)
                    {
                        PagedDataSource.CurrentPageIndex = TirePagerControl.CurrentIndex - 1;
                        rptSearchResults.DataSource = PagedDataSource;
                        rptSearchResults.DataBind();
                    }

                    if (BatteryPriceSearchResult.Count > 0)
                        rptSearchResults.Visible = true;
                    else
                    {
                        var labelResult = new Label();
                        labelResult.Style.Add(HtmlTextWriterStyle.FontWeight, "Bold");
                        labelResult.Style.Add(HtmlTextWriterStyle.Color, "Green");
                        labelResult.Text = "Ничего не найдено, попробуйте изменить параметры поиска.";
                        _resultsPlaceHolder.Controls.Add(labelResult);
                        rptSearchResults.Visible = false;
                    }
                }

                catch (Exception ex)
                {
                    Logger.WriteError(ex.Message, EventLogerID.BLException, EventLogerCategory.BLError);
                }

                finally
                {
                    if (store.Connection.State == System.Data.ConnectionState.Open) { store.Connection.Close(); }
                }
            }
        }
コード例 #2
0
        public void DoSearch(string Company, string Height, string Width, string Radius, string Season)
        {
            List<TireWithPrice> sourceList = null;

            using (CmsDataContext cms = new CmsDataContext())
            {
                try
                {
                    //Алгоритм фильтрации 1) сначала выбираем все
                    List<Tires> mQuery = null;
                    IEnumerable<Tires> query = query = cms.Tires.Select(x => x);
                    // 2)Выбираем только те, которые соответствуют названию производителя

                    // 3)Выбираем только те, которые соответствуют заданной высоте
                    if (!String.IsNullOrEmpty(Height) && !Height.ToLower().Contains("все"))
                        query = query.Where(x => x.Height == Convert.ToDouble(Height));

                    // 4) и т.д.
                    if (!String.IsNullOrEmpty(Width) && !Width.ToLower().Contains("все"))
                        query = query.Where(x => x.Profile != null && x.Profile.ToString() == Width);

                    if (!String.IsNullOrEmpty(Radius) && !Radius.ToLower().Contains("все"))
                        query = query.Where(x => x.Radius != null && x.Radius.Contains(Radius));

                    if (!String.IsNullOrEmpty(Season) && !Season.ToLower().Contains("все"))
                        query = query.Where(x => x.Season != null && x.Season.ToString().ToUpper() == Season.ToUpper());

                    if (!String.IsNullOrEmpty(Company) && !Company.ToLower().Contains("все"))
                        //Проверяем нличие брэнда в метаданных и списке брендов он должен быть настроен видимым
                        query = query.Where(x => x.Manufacturer != null && x.Manufacturer.ToUpper().Contains(Company.ToUpper()) && cms.TireBrands.Where(y => y.IsVisible).Select(y => y.Name.ToUpper()).Contains(Company.ToUpper()));
                    else
                        query = query.Where(x => x.Manufacturer != null && cms.TireBrands.Where(y => y.IsVisible).Select(y => y.Name.ToUpper()).Contains(x.Manufacturer.ToUpper()));

                    //Конец фильтрации

                    mQuery = query.ToList();

                    sourceList = (from n in mQuery

                                  select new TireWithPrice
                                  {
                                      Manufacturer = n.Manufacturer,
                                      ModelName = n.ModelName,
                                      Profile = n.Profile,
                                      Radius = n.Radius,
                                      Height = n.Height,
                                      Season = n.Season,
                                      TireIndex = n.TireIndex,
                                      Price = 0,
                                      Width = n.Profile,
                                      TireNumber = n.TireNumber,
                                      ImageUrl = n.ImageUrl,
                                      Ref = String.Format(UrlManager.GetSearchSparePartsUrl(n.Manufacturer.ToUpper(), n.TireNumber))
                                  }).ToList();

                }
                catch
                {
                }
                finally
                {
                    if (cms.Connection.State == System.Data.ConnectionState.Open)
                        cms.Connection.Close();
                }
            }

            using (StoreDataContext store = new StoreDataContext())
            {

                try
                {
                    List<TireWithPrice> TirePriceSearchResult = new List<TireWithPrice>();
                    ExceedMaxresult = false;
                    foreach (TireWithPrice item in sourceList)
                    {
                        List<SearchResultItem> list;
                        if (Cache.Get(item.Manufacturer + item.TireNumber) == null)
                        {
                            PartKey searchPartKey = new PartKey(item.Manufacturer, item.TireNumber);

                            SparePartItem[] parts = new SparePartItem[0];

                            if (item.Manufacturer != null)
                            {
                                //TODO: Рассмотреть применение последнего параметра -- поиска аналогов
                                // со слов Беляева если нет уточнения по параметрам, т.е. зима, размер и т.д., то "поиск аналогов" в отношении шин не имеет смысла,
                                // в связи с этим рассмотреть возможность передачи false в нижележащий метод:
                                parts = PricingSearch.SearchSpareParts(item.TireNumber, item.Manufacturer.ToUpper(), true);
                            }

                            //пересчитать цены, подгрузить дополнительную информацию о деталях
                            RmsAuto.Acctg.ClientGroup clientGroup = SiteContext.Current.CurrentClient.Profile.ClientGroup;
                            decimal personalMarkup = SiteContext.Current.CurrentClient.Profile.PersonalMarkup;
                            //var additionalInfos = RmsAuto.TechDoc.Facade.GetAdditionalInfo(new[] { searchPartKey }.Union(parts.Select(p => new PartKey(p.SparePart.Manufacturer, p.SparePart.PartNumber))));
                            //var additionalInfosExt = RmsAuto.Store.Entities.Helpers.SearchHelper.GetAdditionalInfoExt(parts.Select(p => new SparePartKeyExt(p.SparePart.Manufacturer, p.SparePart.PartNumber, p.SparePart.SupplierID)));

                            //курс валюты
                            CurrencyRate currencyRate = GetCurrentCurrencyRate();

                            list = parts.Select(
                                p => new RmsAuto.Store.Web.Controls.SearchResultItem
                                {
                                    ItemType = p.ItemType,
                                    SparePart = p.SparePart,
                                    AdditionalInfo = null,/*additionalInfos.ContainsKey(new PartKey(p.SparePart.Manufacturer, p.SparePart.PartNumber)) ? additionalInfos[new PartKey(p.SparePart.Manufacturer, p.SparePart.PartNumber)] : null,*/
                                    AdditionalInfoExt = null, /*additionalInfosExt.ContainsKey(new SparePartKeyExt(p.SparePart.Manufacturer, p.SparePart.PartNumber, p.SparePart.SupplierID)) ?
                                        additionalInfosExt[new SparePartKeyExt(p.SparePart.Manufacturer, p.SparePart.PartNumber, p.SparePart.SupplierID)] : null,*/
                                    FinalSalePriceRUR = p.SparePart.GetFinalSalePrice(clientGroup, personalMarkup),
                                    FinalSalePrice = p.SparePart.GetFinalSalePrice(clientGroup, personalMarkup) / currencyRate.Rate,
                                    ShowPrices = true,
                                    ShowInfo = true
                                }).Where(p => p.FinalSalePriceRUR > 0).ToList(); //чтобы убрать позиции с нулевой ценой из результатов поиска

                            Cache.Insert(item.Manufacturer + item.TireNumber, list, null, DateTime.UtcNow.AddMinutes(Convert.ToInt32(ConfigurationManager.AppSettings["CacheDuration"])), TimeSpan.Zero);
                        }
                        else
                        {
                            list = (List<SearchResultItem>)Cache.Get(item.Manufacturer + item.TireNumber);
                        }

                        if (TirePriceSearchResult.Count < MaxSearchCount)
                        {
                            foreach (var item2 in list)
                            {
                                TireWithPrice tmp = new TireWithPrice()
                                {
                                    Radius = item.Radius,
                                    Height = item.Height,
                                    Manufacturer = item.Manufacturer,
                                    ModelName = item.ModelName,
                                    Price = item2.FinalSalePriceRUR,
                                    Profile = item.Profile,
                                    Ref = item.Ref,
                                    Season = item.Season,
                                    TireIndex = item.TireIndex,
                                    TireNumber = item.TireNumber,
                                    Width = item.Width,
                                    SparePart = item2.SparePart,
                                    ImageUrl = item.ImageUrl,

                                };

                                TirePriceSearchResult.Add(tmp);
                                break;
                            }
                        }
                        else
                        {
                            ExceedMaxresult = true;
                            break;
                        }
                    }

                    //отсортировать результаты поиска
                    CurrentSearchCount = TirePriceSearchResult.Count;
                    PagedDataSource = new PagedDataSource();
                    PagedDataSource.DataSource = TirePriceSearchResult.OrderBy(x => x.Price).ToList();
                    PagedDataSource.AllowPaging = true;

                    int count = 0;
                    if (!String.IsNullOrEmpty(Request.Params["PageSize"]) && int.TryParse(Request.Params["PageSize"], out count))
                    {
                        PagedDataSource.PageSize = Convert.ToInt32(Request.Params["PageSize"]);
                    }
                    if (PagedDataSource.PageSize == 0)
                    {
                        PagedDataSource.PageSize = 10;
                    }

                    TirePagerControl.Visible = TirePriceSearchResult.Count / PagedDataSource.PageSize + 1 > 1;

                    //Установка значения пейджера
                    if (TirePriceSearchResult.Count % PagedDataSource.PageSize > 0)
                        TirePagerControl.MaxIndex = TirePriceSearchResult.Count / PagedDataSource.PageSize + 1;
                    else
                        TirePagerControl.MaxIndex = TirePriceSearchResult.Count / PagedDataSource.PageSize + 0;

                    if (TirePagerControl.CurrentIndex > 0)
                    {
                        PagedDataSource.CurrentPageIndex = TirePagerControl.CurrentIndex - 1;
                        rptSearchResults.DataSource = PagedDataSource;
                        rptSearchResults.DataBind();
                    }

                    if (TirePriceSearchResult.Count > 0)
                        rptSearchResults.Visible = true;
                    else
                    {
                        var labelResult = new Label();
                        labelResult.Style.Add(HtmlTextWriterStyle.FontWeight, "Bold");
                        labelResult.Style.Add(HtmlTextWriterStyle.Color, "Green");
                        labelResult.Text = "Ничего не найдено, попробуйте изменить параметры поиска.";
                        _resultsPlaceHolder.Controls.Add(labelResult);
                        rptSearchResults.Visible = false;
                    }
                }
                catch(Exception ex)
                {
                    Logger.WriteError("При поиске шин произошла ошибка.", EventLogerID.UnknownError, EventLogerCategory.UnknownCategory, ex);
                }
                finally
                {
                    if (store.Connection.State == System.Data.ConnectionState.Open) { store.Connection.Close(); }
                }
            }
        }