Exemple #1
0
        private void LoadDiscsFromReader(SpreadsheetReader reader, LoadResult result)
        {
            //проверка наличия в файле единственного листа с заказом
            reader.CurrentSheet = 0;
            int numOfFields = 9;

            List<RmsAuto.Store.Cms.Entities.Disc> t = new List<RmsAuto.Store.Cms.Entities.Disc>();
            for (int r = 1; r < reader.RecordCount; r++)
            {
                string[] rec = new string[numOfFields];
                for (int i = 0; i < numOfFields; i++)
                    rec[i] = reader[r, i];

                rec = rec.Each(s => s.Trim()).ToArray();

                if (rec.All(s => s == ""))
                    continue;

                if (rec.All(s => string.IsNullOrEmpty(s)))
                {
                    break;
                }

                var t1 = new RmsAuto.Store.Cms.Entities.Disc();

                for (int c = 0; c < numOfFields; c++)
                {
                    string value = rec[c];
                    try
                    {
                        switch (c)
                        {
                            case 0: t1.Manufacturer = value; break;
                            case 1: t1.ModelName = value; break;
                            case 2: t1.PartNumber = value; break;
                            case 3: t1.Width = Decimal.Parse(value); break;
                            case 4: t1.Diameter = Decimal.Parse(value); break;
                            case 5: t1.Gab = Decimal.Parse(value); break;
                            case 6: t1.PCD = value; break;
                            case 7: t1.Dia = Decimal.Parse(value); break;
                        }
                    }
                    catch
                    {
                        //TODO допилить обработку ошибок
                    }
                }
                t.Add(t1);
            }

            using (CmsDataContext cms = new CmsDataContext())
            {
                try
                {
                    cms.Connection.Open();
                    cms.Transaction = cms.Connection.BeginTransaction();
                    var current = cms.Discs.Select(x => x).ToList();
                    current.Sort(new DiscComparer());
                    t.Sort(new DiscComparer());

                    t = t.Select(x => x).Distinct(new DiscComparer()).ToList();

                    //Пробегаем по каждому объекту каталога и смотрим какая у него была картинка
                    foreach (var RefObj in t)
                    {
                        var tmp = current.Where(x => x.PartNumber == RefObj.PartNumber).FirstOrDefault();
                        RefObj.ImageUrl = tmp != null && tmp.ImageUrl.HasValue ? tmp.ImageUrl : (int)NoPhotoID.Disc;
                    }

                    // "мерджим" старое и новое
                    t = t.UnionAndDistinct<RmsAuto.Store.Cms.Entities.Disc>(current, new DiscComparer());

                    cms.Discs.DeleteAllOnSubmit(current);
                    cms.Discs.InsertAllOnSubmit(t);
                    cms.SubmitChanges(ConflictMode.ContinueOnConflict);
                    cms.Transaction.Commit();
                    Response.Redirect(Request.Url.ToString());
                }
                catch (ChangeConflictException)
                {
                    //TODO допилить обработку ошибок
                    //Если не удалось изменить какую-то одну запись это не значит что нужно делать откат всего
                }
                catch (Exception)
                {
                    cms.Transaction.Rollback();
                    //ShowMessage("Указано неиспользуемое имя бренда");
                    Logger.WriteError("Ошибка при сохранении результатов загрузки дисков", EventLogerID.BLException, EventLogerCategory.BLError);
                }
                finally
                {
                    if (cms.Connection.State == System.Data.ConnectionState.Open) { cms.Connection.Close(); }
                }
            }
        }
        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(); }
                }
            }
        }