public static ImportResult Execute(IShopRepository repository, StreamReader file, string categoryName, int currentLangId) { Log.DebugFormat("start importing products Execute"); var res = new ImportResult { ErrorCode = 0, ProductErrors = new Dictionary<string, string>() }; //var products = new List<ImportedProduct>(); try { bool justAdded = false; int productCount = 0; Log.DebugFormat("read products from file"); List<ImportedProduct> products = ReadProductsFromFile(file); var importedProductsCount = products.Count(); Log.DebugFormat("total products {0}", importedProductsCount); var productStockToDelete = new List<int>(); foreach (var importedProduct in products) { productCount++; if (string.IsNullOrEmpty(importedProduct.ExternalId)) { res.ReadProductFailedCount++; continue; } Log.DebugFormat("get product {0} of {1}", productCount, importedProductsCount); var siteProduct = repository.GetProductByExternalId(importedProduct.ExternalId); if (siteProduct == null) { try { // добавляем новый товар var category = repository.GetCategory(categoryName); var newProduct = new Product { Category = category }; newProduct.InjectFromImportProduct(importedProduct); if (importedProduct.ImportedProductStocks != null) { foreach (var importedProductStock in importedProduct.ImportedProductStocks) { newProduct.ProductStocks.Add(new ProductStock { StockNumber = importedProductStock.StockNumber, Color = importedProductStock.Color, Size = importedProductStock.Size, IsAvailable = importedProductStock.IsAvailable }); } } newProduct.SearchCriteriaAttributes = ""; repository.AddProduct(newProduct); justAdded = true; res.NewProductCount++; //Log.Debug("get site product again"); siteProduct = repository.GetProductByExternalId(importedProduct.ExternalId); } catch (Exception ex) { res.ProductErrors.Add("Не удалось добавить " + importedProduct.ExternalId, ex.Message); res.AddProductFailedCount++; //Log.ErrorFormat("cannot add new product externalId:{0} exception message:{1}", importedProduct.ExternalId, ex.Message); } } if (siteProduct != null) { try { siteProduct.InjectFromImportProduct(importedProduct); if (siteProduct.ProductStocks == null) { siteProduct.ProductStocks = new LinkedList<ProductStock>(); } //Log.DebugFormat("Updating product stocks started"); foreach (var productStock in siteProduct.ProductStocks) { var importedProductStock = importedProduct.ImportedProductStocks.FirstOrDefault( ips => ips.StockNumber == productStock.StockNumber && !ips.Imported); if (importedProductStock != null) { // update productStock in siteProduct.ProductStocks importedProductStock.Imported = true; productStock.Size = importedProductStock.Size; productStock.Color = importedProductStock.Color; productStock.IsAvailable = importedProductStock.IsAvailable; res.UpdatedArticles++; } else { // remove productStock from siteProduct.ProductStocks //repository.DeleteProductStock(productStock.Id); productStockToDelete.Add(productStock.Id); res.DeletedArticles++; } } foreach ( var importedProductStock in importedProduct.ImportedProductStocks.Where(ips => !ips.Imported)) { siteProduct.ProductStocks.Add(new ProductStock { StockNumber = importedProductStock.StockNumber, Color = importedProductStock.Color, Size = importedProductStock.Size, IsAvailable = importedProductStock.IsAvailable }); res.AddedArticles++; } //Log.DebugFormat("Updating product stocks finished"); //Log.DebugFormat("Updating product attributes started"); foreach (var attributeGroup in importedProduct.ImportedProductAttibutes) { var attrToDelete = new List<int>(); var exId = attributeGroup.ExternalId; //Log.DebugFormat("get site attr started"); var siteAttr = siteProduct.ProductAttributeValues.Where( pav => pav.ProductAttribute.ExternalId == exId).Select(a => a.Title).ToList(); //Log.DebugFormat("get site attr finished"); var xx = siteAttr.Except(attributeGroup.Values).ToList(); // items to delete var xy = attributeGroup.Values.Except(siteAttr).ToList(); // items to add List<string> addedAttr = new List<string>(); //Log.DebugFormat("get attr to delete started"); foreach ( var attr in siteProduct.ProductAttributeValues.Where( pav => pav.ProductAttribute.ExternalId == exId)) { if (xx.Contains(attr.Title)) { attrToDelete.Add(attr.Id); } } //Log.DebugFormat("get attr to delete finished"); //Log.DebugFormat("ProductAttributeValues.Remove started"); foreach (var id in attrToDelete) { var a = repository.GetProductAttributeValue(id); siteProduct.ProductAttributeValues.Remove(a); } //Log.DebugFormat("ProductAttributeValues.Remove finished"); //Log.DebugFormat("repository.GetProductAttributes(siteProduct.CategoryId) started"); var productAttributes = repository.GetProductAttributes(siteProduct.CategoryId); //Log.DebugFormat("repository.GetProductAttributes(siteProduct.CategoryId) finished"); //Log.DebugFormat("siteProduct.ProductAttributeValues.Add(attributeValue) started"); var productAttribute = productAttributes.FirstOrDefault(pa => pa.ExternalId == exId); if (productAttribute == null) { //Log.ErrorFormat("Атрибут с идентификатором {0} не найден", exId); throw new Exception("Атрибут с идентификатором " + exId + " не найден"); } foreach (var attributeValue in productAttribute.ProductAttributeValues) { if (xy.Contains(attributeValue.Title)) { siteProduct.ProductAttributeValues.Add(attributeValue); addedAttr.Add(attributeValue.Title); } } //Log.DebugFormat("siteProduct.ProductAttributeValues.Add(attributeValue) finished"); //Log.DebugFormat("add new attributes started"); var attrNotFoundOnSite = xy.Except(addedAttr); foreach (string s in attrNotFoundOnSite) { var newProductAttributeValue = new ProductAttributeValue { CurrentLang = currentLangId, Title = s, ProductAttribute = productAttribute, }; newProductAttributeValue.Products.Add(siteProduct); repository.AddProductAttributeValue(newProductAttributeValue); } //Log.DebugFormat("add new attributes finished"); } //Log.DebugFormat("Updating product attributes finished"); Log.DebugFormat("save product {0} of {1}", productCount, importedProductsCount); repository.SaveProduct(siteProduct); //Log.DebugFormat("product saved {0} of {1}", productCount, importedProductsCount); if (!justAdded) { res.UpdatedProductCount++; } else { justAdded = false; } } catch (OutOfMemoryException ex) { Log.ErrorFormat("cannot update product externalId:{0} exception message:{1} exception{2}", siteProduct.ExternalId, ex.Message, ex); throw new Exception(ex.Message); } catch (Exception ex) { res.ProductErrors.Add("Не удалось обновить " + siteProduct.ExternalId, ex.Message); res.UpdateProductFailedCount++; Log.ErrorFormat("cannot update product externalId:{0} exception message:{1}", siteProduct.ExternalId, ex.Message); } } } //Log.DebugFormat("deleting product stocks"); foreach (var id in productStockToDelete) { repository.DeleteProductStock(id); } //Log.DebugFormat("product stocks deleted"); res.ProductCount = products.Count; } catch (Exception ex) { Log.DebugFormat("error while importing products {1}", ex.Message); res.ErrorMessage = ex.Message; res.ErrorCode = 1; } //Log.DebugFormat("finish importing products Execute"); return res; }
public static string Execute(IShopRepository repository, int currentLangId, string categoryName) { var products = repository.GetProductsByCategory(categoryName).ToList(); var attributes = repository.GetProductAttributes(categoryName).ToList(); foreach (var productAttribute in attributes) { productAttribute.CurrentLang = currentLangId; } var sb = new StringBuilder(); // Генерация заголовков begin var productFields = TransferData.ProductFields; foreach (var field in productFields) { sb.Append(field.Key); sb.Append(";"); } int attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; sb.Append(productAttribute.ExternalId); if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); foreach (var field in productFields) { sb.Append(field.Value); sb.Append(";"); } attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; sb.Append(productAttribute.Title); if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); // Генерация заголовков end foreach (var product in products) { product.CurrentLang = currentLangId; sb.Append(product.ExternalId); sb.Append(";"); sb.Append(product.Name); sb.Append(";"); sb.Append(product.Title); sb.Append(";"); sb.Append(product.OldPrice); sb.Append(";"); sb.Append(product.Price); sb.Append(";"); sb.Append(product.IsNew); sb.Append(";"); sb.Append(product.IsDiscount); sb.Append(";"); sb.Append(product.IsTopSale); sb.Append(";"); sb.Append(product.IsActive); sb.Append(";"); sb.Append(product.SeoDescription); sb.Append(";"); sb.Append(product.SeoKeywords); sb.Append(";"); sb.Append(product.SeoText); sb.Append(";"); sb.Append(!string.IsNullOrEmpty(product.Description) ? product.Description.Replace("\n", " ").Replace(";","") : product.Description); sb.Append(";"); var firstProductStock = product.ProductStocks.OrderBy(ps => ps.StockNumber).FirstOrDefault(); if (firstProductStock != null) { sb.Append(firstProductStock.StockNumber); sb.Append(";"); sb.Append(firstProductStock.Size); sb.Append(";"); sb.Append(firstProductStock.Color); sb.Append(";"); } else { sb.Append(";"); sb.Append(";"); sb.Append(";"); } attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; var result = new List<string>(); foreach (var pav in product.ProductAttributeValues) { pav.CurrentLang = currentLangId; if (productAttribute.ProductAttributeValues.Contains(pav)) { result.Add(pav.Title); } } var res = DataSynchronizationHelper.ConvertToStringWithSeparators(result); if (res != null) { sb.Append(res); } if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); foreach (var ps in product.ProductStocks.OrderBy(ps => ps.StockNumber).Skip(1)) { sb.Append(product.ExternalId); sb.Append(";"); sb.Append(product.Name); sb.Append(";"); sb.Append(product.Title); sb.Append(";"); sb.Append(product.OldPrice); sb.Append(";"); sb.Append(product.Price); sb.Append(";"); sb.Append(product.IsNew); sb.Append(";"); sb.Append(product.IsDiscount); sb.Append(";"); sb.Append(product.IsTopSale); sb.Append(";"); sb.Append(product.IsActive); sb.Append(";"); sb.Append(product.SeoDescription); sb.Append(";"); sb.Append(product.SeoKeywords); sb.Append(";"); sb.Append(product.SeoText); sb.Append(";"); sb.Append(!string.IsNullOrEmpty(product.Description) ? product.Description.Replace("\n", " ").Replace(";", "") : product.Description); sb.Append(";"); sb.Append(ps.StockNumber); sb.Append(";"); sb.Append(ps.Size); sb.Append(";"); sb.Append(ps.Color); sb.Append(";"); attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; var result = new List<string>(); foreach (var pav in product.ProductAttributeValues) { pav.CurrentLang = currentLangId; if (productAttribute.ProductAttributeValues.Contains(pav)) { result.Add(pav.Title); } } var res = DataSynchronizationHelper.ConvertToStringWithSeparators(result); if (res != null) { sb.Append(res); } if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); } } return sb.ToString(); }
public CatalogueModel(IShopRepository repository, int langId, int? page, string categoryName = null, string filter = null, string sortOrder = null, bool showSpecialOffers = false) : base(repository, langId, "category", showSpecialOffers) { _repository = repository; //FilterArray = new string[0]; if (categoryName != null) { var category = Categories.First(c => c.Name == categoryName); ProductAttributes = _repository.GetProductAttributes(category.Id).Where(pa => pa.IsFilterable).ToList(); //CurrentFilter = filter ?? string.Empty; filter = filter ?? string.Empty; //var filterValueGroups = GroupFilterString(categoryName, filter); var filters = filter.Split(new[] {"-"}, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); Dictionary<int, List<int>> groupedAttributes = GroupProductAttributes(ProductAttributes, filters); IQueryable<Product> products = _repository.GetProductsByCategory(categoryName) .Where(p => p.ProductStocks.Any(ps => ps.IsAvailable)); if (filters.Any()) { products = products.Where(x => x.ProductAttributeValues.Any(pav => filters.Contains(pav.Id))); IsFiltered = true; } products = OrderProducts(products, sortOrder); var pageSize = int.Parse(SiteSettings.GetShopSetting("ProductsPageSize")); Products = products.Include(x => x.ProductAttributeValues) .Include(x => x.ProductImages) .ToList(); // полный пэ //if (filters.Any()) //{ // var filteredProducts = new List<Product>(); // foreach (var product in Products) // { // var matched = 0; // foreach (KeyValuePair<int, List<int>> groupedAttribute in groupedAttributes) // { // if (product.ProductAttributeValues.Any(pav => groupedAttribute.Value.Contains(pav.Id))) // { // matched++; // } // } // if (matched == groupedAttributes.Count) // { // filteredProducts.Add(product); // } // } // Products = filteredProducts; //} if (filters.Any()) { Products = Products.Where( product => groupedAttributes.Count( groupedAttribute => product.ProductAttributeValues.Any( pav => groupedAttribute.Value.Contains(pav.Id))) == groupedAttributes.Count) .ToList(); } ProductTotalCount = Products.Count(); if (page > Products.Count()/pageSize) { page = 0; } //foreach (var product in Products) //{ // product.IsSelectedByFilter = true; //} foreach (var productAttribute in ProductAttributes) { foreach (var productAttributeValue in productAttribute.ProductAttributeValues) { productAttributeValue.AvailableProductsCount = Products.Count(p => p.ProductAttributeValues.Any(pav => pav.Id == productAttributeValue.Id)); //productAttributeValue.AvailableProductsCountAfterApplyingFilter = AllProducts.Count(p => p.ProductAttributeValues.Any(pav => pav.Id == productAttributeValue.Id)); //foreach (var product in Products.Where(p => p.IsSelectedByFilter)) //{ // if (filters.Contains(productAttributeValue.Id)) // product.IsSelectedByFilter = product.ProductAttributeValues.Any(pav => pav.Id == productAttributeValue.Id); //} } } //Products = Products.Where(p => p.IsSelectedByFilter); // создание фильтров Filters = new List<FilterViewModel>(); //var filterValueGroups = GroupFilterString(categoryName, CurrentFilter); foreach (var productAttribute in ProductAttributes.OrderBy(p => p.SortOrder)) { if (groupedAttributes.ContainsKey(productAttribute.Id) || productAttribute.ProductAttributeValues.Any(pav => pav.AvailableProductsCount > 0)) { var fvm = new FilterViewModel { Title = productAttribute.Title, FilterItems = new List<FilterItem>() }; foreach (var categoryValue in productAttribute.ProductAttributeValues.OrderBy(a => a.Title)) { if (groupedAttributes.ContainsKey(productAttribute.Id) || categoryValue.AvailableProductsCount > 0) { var filterItem = new FilterItem { Title = categoryValue.Title, AvaibleProductsCount = categoryValue.AvailableProductsCount, AvaibleProductsCountAfterApplyingFilter = categoryValue.AvailableProductsCountAfterApplyingFilter, Selected = filters.Contains(categoryValue.Id), FilterAttributeString = CatalogueFilterHelper.GetFilterStringForCheckbox(filters, categoryValue.Id, filters.Contains(categoryValue.Id)), Id = "cb_" + categoryValue.Id }; fvm.FilterItems.Add(filterItem); } } Filters.Add(fvm); } } Products = ApplyPaging(Products.AsQueryable(), page, pageSize).ToList(); foreach (var product in Products) { product.CurrentLang = langId; if (product.ProductImages.Any()) { var pi = product.ProductImages.FirstOrDefault(c => c.IsDefault) ?? product.ProductImages.First(); product.ImageSource = pi.ImageSource; } } CurrentCategory = category; _sw.Stop(); Log.DebugFormat("SiteModel+CatalogueModel: {0}", _sw.Elapsed); } }