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