コード例 #1
0
ファイル: ImportFromFile.cs プロジェクト: fathurxzz/aleqx
        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;
        }
コード例 #2
0
ファイル: ExportToFile.cs プロジェクト: fathurxzz/aleqx
        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();
        }
コード例 #3
0
ファイル: CatalogueModel.cs プロジェクト: fathurxzz/aleqx
        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);
            }
        }