Пример #1
0
        private static AvitoAds createAds(RootParsingObject discont, FullCatalogRoot fullCatalog,
                                          DateTime startTime)
        {
            var Ads = new AvitoAds();

            Ads.StartTime = startTime;

            var menWomenOnlyListings = discont.listings.FindAll(x => x.category != "kids");
            //var listingsMoreThan2SizesAvailable = menWomenOnlyListings.FindAll(x => x.sizes.Count > 2);
            var listings = menWomenOnlyListings;

            listings = listings.OrderBy(x => x.sku).ToList();
            var listingCount = listings.Count;

            for (int i = 0; i < listingCount; i++)
            {
                var     sneaker   = listings[i];
                var     fcSneaker = fullCatalog.records.Find(x => x.sku == sneaker.sku);
                AvitoAd Ad        = GetAdFromSneaker(sneaker, fcSneaker, Ads.StartTime, Ads.AdList.Count + 1, listingCount);
                if (Ad != null)
                {
                    Ads.AdList.Add(Ad);
                }
            }
            _logger.Info("Кол-во листингов: " + listingCount);
            _logger.Info("Кол-во объявлений: " + Ads.AdList.Count);
            return(Ads);
        }
        private void WorkForStock(RootParsingObject rootParsingObject, bool isRewrite, int numberCatalog, string[] containsImage = null)
        {
            foreach (var listing in rootParsingObject.listings)
            {
                for (var i = 0; i < listing.images.Count; i++)
                {
                    var filename = listing.sku + "-" + (i + 1) + ".jpg";

                    if (isRewrite)
                    {
                        DownloadImageFile(numberCatalog, filename, listing.images[i]);
                    }
                    else
                    {
                        if (containsImage == null)
                        {
                            throw new NullReferenceException("нет данных по containsImage или numberCatalog");
                        }

                        if (!containsImage.Contains(filename))
                        {
                            DownloadImageFile(numberCatalog, filename, listing.images[i]);
                        }
                        else
                        {
                            Logger.Debug("Изображение " + filename + " актуально");
                        }
                    }
                }
            }
        }
Пример #3
0
        private void ValidateShop(RootParsingObject shopParser)
        {
            var shopCatalog   = ShopCatalog;
            var folder        = ValidateShopsLocalFolder;
            var validatedShop = new RootParsingObject();

            validatedShop.market_info = shopParser.market_info;
            //string br = "\n";
            log = DateTime.Now.ToString() + br;
            int i = 1;

            foreach (var listing in shopParser.listings)
            {
                string listingLog   = String.Empty;
                var    validListing = ValidateListing(listing);
                if (validListing != null)
                {
                    validListing.position = i;
                    i++;
                    validatedShop.listings.Add(validListing);
                }
            }
            var localPath = folder + shopParser.market_info.name;

            validatedShop.SaveLocalFile(localPath);
            SaveLogShopValidate(this.log, validatedShop.market_info.name, localPath);
            //return validatedShop;
        }
Пример #4
0
        protected new void SaveJson(RootParsingObject json, string filename, string folder, string name)
        {
            //подгружаем из конфига данные фтп
            var ftpHost = Config.GetConfig().FtpHostAllBrands;
            var ftpUser = Config.GetConfig().FtpUserAllBrands;
            var ftpPass = Config.GetConfig().FtpPassAllBrands;

            if (!Directory.Exists(folder))
            {
                System.IO.Directory.CreateDirectory(folder);
                Helper.CreateDirectoryFtp(name, ftpHost, ftpUser, ftpPass);
            }

            var localFileName = folder + filename;
            //сохраняем на яндекс.диск файл
            var textJson = JsonConvert.SerializeObject(json);

            System.IO.File.WriteAllText(localFileName, textJson);



            //загружаем на ftp файл

            var ftpFileName = name + "/" + filename;

            Helper.LoadFileToFtp(localFileName, ftpFileName, ftpHost, ftpUser, ftpPass);
        }
Пример #5
0
        public List <Listing> CreateExportLisings(RootParsingObject Json)
        {
            var listings   = new List <Listing>();
            int sizesCount = 0;

            foreach (var jsonListing in Json.listings)
            {
                //var price = ((jsonListing.price + DELIVERY_TO_USA + MARZHA) * 1.18);
                //if (price < jsonListing.old_price)
                //{
                var brand = jsonListing.brand.ToUpper();
                if (!brand.Contains("NIKE") && !brand.Contains("JORDAN"))
                {
                    listings.Add(jsonListing);
                    sizesCount += jsonListing.sizes.Count;
                }
                //}
            }

            Program.Logger.Info("Листингов для выгрузки: " + listings.Count);
            Program.Logger.Info("Размеров для выгрузки:" + sizesCount);

            //посчитаем кол-во размеров выгружаемых

            return(listings);
        }
Пример #6
0
        private void AddDbSneaker(DbRoot db, Listing listing, RootParsingObject shop, Shop shopCatalogItem)
        {
            log += "Add Sneaker. sku:" + listing.sku + " Title:" + listing.title + br;
            var sneaker = new DbSneaker();

            sneaker.Id    = db.Sneakers.Count + 1;
            sneaker.Brand = listing.brand;
            sneaker.Sku   = listing.sku;
            sneaker.Titles.Add(listing.title);
            sneaker.Color    = listing.colorbrand;
            sneaker.Category = listing.category;
            sneaker.Links.Add(listing.url);
            if (listing.images.Count > 0)
            {
                var imageCollection = new DbImageCollection();
                imageCollection.ShopName = shop.market_info.name;
                foreach (var image in listing.images)
                {
                    var dbimg = new DbImage();
                    dbimg.SiteUrl = image;
                    imageCollection.Images.Add(dbimg);
                }
                //imageCollection.Images = listing.images;
                //todo менять ссылки из магазины на ссылки с нашего сервака
                //todo качать фотки в момент парсинга
                sneaker.ImageCollectionList.Add(imageCollection);
            }
            foreach (var size in listing.sizes)
            {
                var dbSize = GetDbSize(sneaker, size, listing, shop, shopCatalogItem);
                sneaker.Sizes.Add(dbSize);
            }
            db.Sneakers.Add(sneaker);
        }
Пример #7
0
        public void ValidateShop(string name)
        {
            var shop = ShopCatalog.markets.Find(x => x.name == name);
            RootParsingObject market = RootParsingObject.ReadAllBrandsShopFromFtp(shop);

            ValidateShop(market);
        }
Пример #8
0
        protected void SaveNikeJson(RootParsingObject json, string filename, string folder, string name)
        {
            var nikeJson = new RootParsingObject();

            nikeJson.market_info = json.market_info;
            nikeJson.listings    = json.listings.FindAll(x => x.brand.ToLower() == "nike" ||
                                                         x.brand.ToLower() == "jordan");
            base.SaveJson(nikeJson, filename, folder, name);
        }
        public void Initialize()
        {
            var    appSettings = ConfigurationManager.AppSettings;
            string ftpHost     = appSettings["ftpHostParsing"];
            string ftpUser     = appSettings["ftpUserParsing"];
            string ftpPass     = appSettings["ftpPassParsing"];

            Helper.GetFileFromFtp(FOLDER + JSON_FILENAME, FTP_FILENAME, ftpHost, ftpUser, ftpPass);
            Json = DeserializeJson(FOLDER + JSON_FILENAME);
        }
Пример #10
0
        private void WriteCountListingAndSizesInFile(RootParsingObject Json)
        {
            int i = 0;

            foreach (var item in Json.listings)
            {
                i += item.sizes.Count;
            }
            Program.Logger.Info("В исходном файле листингов:" + Json.listings.Count);
            Program.Logger.Info("В исходном файле размеров:" + i);
        }
 public void DeserializeJson(string filename)
 {
     if (File.Exists(filename))
     {
         var textJson = System.IO.File.ReadAllText(filename);
         _json = JsonConvert.DeserializeObject <RootParsingObject>(textJson);
     }
     else
     {
         throw new Exception("file not exist");
     }
 }
        private List <ShopifyRecord> CreateShopifyRecords(RootParsingObject discontSamara)
        {
            var shopifyRecords = new List <ShopifyRecord>();

            foreach (var listing in discontSamara.listings)
            {
                var shopifyRecordsListing = CreateShopifyListingRecords(listing);
                if (shopifyRecordsListing != null)
                {
                    shopifyRecords.AddRange(shopifyRecordsListing);
                }
            }
            return(shopifyRecords);
        }
Пример #13
0
        private static AllStockRoot CreateAllStock(FullCatalog fullCatalog, ShopCatalogRoot jsonCatalog)
        {
            AllStockRoot allstock = new AllStockRoot();

            foreach (var jsonMarket in jsonCatalog.markets)
            {
                RootParsingObject market = Parsing.Model.RootParsingObject.ReadJsonMarketFromFtp(jsonMarket);
                if (market != null)
                {
                    AddMarketToAllStock(market, fullCatalog, allstock, jsonMarket);
                }
            }
            allstock.update_time = DateTime.Now;
            return(allstock);
        }
Пример #14
0
        private static AllStockOffer CreateOffer(Listing listing, RootParsingObject market, Shop jsonMarket)
        {
            if (listing.sku == "852628-001")
            {
                bool test = true;
            }

            var offer = new AllStockOffer();

            offer.url       = listing.url;
            offer.price     = listing.price;
            offer.old_price = listing.old_price;
            offer.currency  = jsonMarket.currency;
            //offer.currency = market.market_info.currency;
            offer.stock_name = market.market_info.name;
            offer.price_usd_with_delivery_to_usa_and_minus_vat = AllStockExporter.GetAllStockPrice(offer.price, offer.currency, jsonMarket.delivery_to_usa, jsonMarket.vat_value);
            return(offer);
        }
Пример #15
0
        protected void SaveJson(RootParsingObject json, string filename, string folder, string name)
        {
            var localFileName = folder + filename;
            //сохраняем на яндекс.диск файл
            var textJson = JsonConvert.SerializeObject(json);

            System.IO.File.WriteAllText(localFileName, textJson);

            //подгружаем из конфига данные фтп
            var appSettings = ConfigurationManager.AppSettings;
            var ftpHost     = appSettings["ftpHostParsing"];
            var ftpUser     = appSettings["ftpUserParsing"];
            var ftpPass     = appSettings["ftpPassParsing"];

            //загружаем на ftp файл
            var ftpFileName = name + "/" + filename;

            Helper.LoadFileToFtp(localFileName, ftpFileName, ftpHost, ftpUser, ftpPass);
        }
Пример #16
0
        public new void ValidateAllShops()
        {
            //загружаем каталог магазинов
            var shopCatalog = ShopCatalog;

            foreach (var shop in shopCatalog.markets)
            {
                RootParsingObject market = RootParsingObject.ReadAllBrandsShopFromFtp(shop);
                if (market != null)
                {
                    var shopValidator = new ShopValidator();
                    ValidateShop(market);
                }
                else
                {
                    bool test = true;
                }
            }
        }
Пример #17
0
        private void AddShopInfo(DbRoot db, RootParsingObject shop, Shop shopCatalogItem)
        {
            foreach (var listing in shop.listings)
            {
                var sneaker = db.Sneakers.Find(x => x.Sku == listing.sku);
                if (sneaker == null)
                {
                    AddDbSneaker(db, listing, shop, shopCatalogItem);
                }
                else
                {
                    //db.Sneakers.RemoveAll(x => x.Sku == listing.sku);
                    //AddDbSneaker(db, listing, shop, shopCatalogItem);

                    UpdateDbSneaker(db, sneaker, listing, shop, shopCatalogItem);
                    //todo запилить этот метод
                }
            }
        }
Пример #18
0
        public static void ValidateAllShops()
        {
            //загружаем каталог магазинов
            var shopCatalog = ShopCatalogRoot.ReadFromFtp();

            foreach (var shop in shopCatalog.markets)
            {
                RootParsingObject market = SneakerIcon.Classes.Parsing.Model.RootParsingObject.ReadJsonMarketFromFtp(shop);
                if (market != null)
                {
                    var shopValidator = new ShopValidator();
                    shopValidator.ValidateShop(market, shopCatalog);
                }
                else
                {
                    bool test = true;
                }
            }
        }
Пример #19
0
        private void ValidateShop(RootParsingObject shopParser, ShopCatalogRoot shopCatalog, string folder = _folder)
        {
            var validatedShop = new RootParsingObject();

            validatedShop.market_info = shopParser.market_info;
            //string br = "\n";
            log = DateTime.Now.ToString() + br;
            foreach (var listing in shopParser.listings)
            {
                string listingLog   = String.Empty;
                var    ValidListing = ValidateListing(listing);
                if (ValidListing != null)
                {
                    validatedShop.listings.Add(ValidListing);
                }
            }
            validatedShop.SaveLocalFile(folder);
            SaveLogShopValidate(this.log, validatedShop.market_info.name);
            //return validatedShop;
        }
Пример #20
0
        //public RootObjectSaleSivas Json { get; set; }
        //public List<ListingSaleSivas> ExportListings { get; set; }

        public void Run()
        {
            var    appSettings = ConfigurationManager.AppSettings;
            string ftpHost     = appSettings["ftpHostParsing"];
            string ftpUser     = appSettings["ftpUserParsing"];
            string ftpPass     = appSettings["ftpPassParsing"];

            Helper.GetFileFromFtp(FOLDER + JSON_FILENAME, FTP_FILENAME, ftpHost, ftpUser, ftpPass);

            RootParsingObject Json = DeserializeJson(JSON_FILENAME);

            WriteCountListingAndSizesInFile(Json); //пишем на экран сколько в исходном файле листингов и размеров
            List <Listing> ExportListings = CreateExportLisings(Json);

            //DownloadImages(ExportListings, IMAGE_PATH);
            ExportListings = ReplaceImageNames(ExportListings, HTTP_IMAGE_PATH);
            List <SivasSaleBonanzaRecord> BonanzaRecords = CreateBonanzaRecords(ExportListings);

            ExportToCSV(FOLDER + CSV_FILENAME, BonanzaRecords);

            Helper.LoadFileToFtp(FOLDER + CSV_FILENAME, FTP_FOLDER + "/" + CSV_FILENAME, ftpHost, ftpUser, ftpPass);
            Helper.LoadFileToFtp(FOLDER + CSV_FILENAME2, FTP_FOLDER + "/" + CSV_FILENAME, ftpHost, ftpUser, ftpPass);
        }
        private static List <string> ChangeImageLinksFromShopToImagesFromOurServer(List <string> images, RootParsingObject shop, ShopCatalogRoot shopCatalog, Listing shopRecord)
        {
            var imagesFromOurServer = new List <string>();


            string host       = "http://img.sneaker-icon.ru";
            int    shopNumber = shopCatalog.markets.Find(x => x.name == shop.market_info.name).number;

            for (int i = 1; i < images.Count + 1; i++)
            {
                string url = host + "/shops/" + shopNumber + "/images/" + shopRecord.sku + "-" + i + ".jpg";

                if (NetworkUtils.UrlExists(url))
                {
                    imagesFromOurServer.Add(url);
                }
            }


            //ver2.0
            var imagesFromOurServer2 = new List <string>();

            var ftphost      = "ftp://" + Config.GetConfig().FtpHostContabo;
            var user         = Config.GetConfig().FtpUserContabo;
            var pass         = Config.GetConfig().FtpPassContabo;
            var folder       = "shops/" + shopNumber + "/images";
            var folderImages = Helper.GetFileListFromDirectory(folder, ftphost, user, pass).ToList();
            var skuImages    = folderImages.FindAll(x => x.Contains(shopRecord.sku));

            foreach (var image in skuImages)
            {
                var imageUrl = host + "/" + folder + "/" + image;
                imagesFromOurServer2.Add(imageUrl);
            }

            if (imagesFromOurServer.Count != imagesFromOurServer2.Count)
            {
                bool test = true;
            }

            return(imagesFromOurServer);
        }
Пример #22
0
        private static DbSize GetDbSize(DbSneaker sneaker, ListingSize size, Listing listing, RootParsingObject shop, Shop shopCatalogItem)
        {
            var dbSize = new DbSize();

            dbSize.Us  = size.us;
            dbSize.Eu  = size.eu;
            dbSize.Uk  = size.uk;
            dbSize.Cm  = size.cm;
            dbSize.Ru  = size.ru;
            dbSize.Upc = size.upc;

            var offer = CreateDbOffer(sneaker, size, listing, shop, shopCatalogItem);

            dbSize.Offers.Add(offer);

            return(dbSize);
        }
Пример #23
0
        private static DbOffer CreateDbOffer(DbSneaker sneaker, ListingSize size, Listing listing, RootParsingObject shop, Shop shopCatalogItem)
        {
            var deliveryUs = shopCatalogItem.delivery.Find(x => x.location == "US");
            var offer      = new DbOffer();

            offer.url        = listing.url;
            offer.price      = listing.price;
            offer.old_price  = listing.old_price;
            offer.currency   = shopCatalogItem.currency;
            offer.stock_name = shop.market_info.name;
            offer.price_usd_with_delivery_to_usa_and_minus_vat = AllStockExporter.GetAllStockPrice(offer.price, offer.currency, deliveryUs.value, deliveryUs.vat);
            return(offer);
        }
Пример #24
0
        private static void AddMarketToAllStock(RootParsingObject market, FullCatalog fullCatalog, AllStockRoot allstock, Shop jsonMarket)
        {
            foreach (var listing in market.listings)
            {
                var sneaker = allstock.sneakers.Find(x => x.sku == listing.sku);
                //если такого кроссовка еще не существует
                if (sneaker == null)
                {
                    //добавляем новый кроссовок в оллсток
                    var fullCatalogSneaker = fullCatalog.sneakers.Find(x => x.sku == listing.sku);

                    if (fullCatalogSneaker == null)
                    {
                        Program.Logger.Warn("sku: " + listing.sku + " does not exist in fullcatalog");
                    }
                    else
                    {
                        sneaker          = new AllStockSneaker();
                        sneaker.sku      = listing.sku;
                        sneaker.brand    = fullCatalogSneaker.brand;
                        sneaker.category = Helper.ConvertCategoryRusToEng(fullCatalogSneaker.category);
                        sneaker.title    = fullCatalogSneaker.title;
                        if (sneaker.sku == "854261-106")
                        {
                            bool test = true;
                        }
                        foreach (var size in listing.sizes)
                        {
                            var sizeAllStock = CreateSize(size, sneaker, listing, market, jsonMarket);
                            if (sizeAllStock != null)
                            {
                                sneaker.sizes.Add(sizeAllStock);
                            }
                        }

                        if (sneaker.sizes.Count > 0)
                        {
                            allstock.sneakers.Add(sneaker);
                        }
                    }
                }
                else
                {
                    /* Если кроссовок не нул, значит он уже есть в оллстоке
                     * Это значит, что нужно брать каждый размер из листинга, проверять, есть ли этот размер уже в этом кроссовке
                     * Если нет, то создавать размер и оффер
                     * Если размер есть, то к этому размеру создавать еще один оффер. Возможно тут же надо отсортировать офферы, чтобы с меньшей ценой был первым
                     * Если размер уже есть, то смотреть есть ли юпс
                     * Если юпс нет, то добавлять его, если есть проверять, одинаковый ли он, если нет, кидать варнинг
                     */
                    if (sneaker.sku == "854261-106")
                    {
                        bool test = true;
                    }
                    foreach (var size in listing.sizes)
                    {
                        if (size.us == null)
                        {
                            size.us = SizeConverters.SizeConverter.GetSizeUs(sneaker.brand, sneaker.category, size.eu, size.uk, size.cm);
                        }
                        if (size.us == null)
                        {
                            //значит размер левый или его нет в таблице размеров
                        }
                        else
                        {
                            var sizeAllStock = sneaker.sizes.Find(x => x.us == size.us);
                            if (sizeAllStock == null)
                            {
                                //если размера нет, создаем новый размер
                                sizeAllStock = CreateSize(size, sneaker, listing, market, jsonMarket);
                                if (sizeAllStock != null)
                                {
                                    sneaker.sizes.Add(sizeAllStock);
                                }
                            }
                            else
                            {
                                //если такой размер есть, то добавляем оффер и проверяем юпс
                                if (sizeAllStock.upc == null && size.upc != null)
                                {
                                    sizeAllStock.upc = size.upc;
                                }
                                var offer = CreateOffer(listing, market, jsonMarket);
                                sizeAllStock.offers.Add(offer);
                            }
                        }
                    }
                }
            }
            //throw new NotImplementedException();
        }
Пример #25
0
        private static AllStockSize CreateSize(ListingSize size, AllStockSneaker sneaker, Listing listing, RootParsingObject market, Shop jsonMarket)
        {
            var sizeAllStock = new AllStockSize();

            if (size.us == null)
            {
                size.us = SizeConverters.SizeConverter.GetSizeUs(sneaker.brand, sneaker.category, size.eu, size.uk, size.cm);
            }
            if (size.us == null)
            {
                //значит размер левый или его нет в таблице размеров
                return(null);
            }
            else
            {
                if (listing.category != sneaker.category)
                {
                    Program.Logger.Warn("wrong category. SKU:" + listing.sku + "\n"
                                        + "Listing Category: " + listing.category + ".\n"
                                        + "FullCatalog Category:" + sneaker.category + "\n"
                                        + "ListingTite: " + listing.title + "\n"
                                        + "Listing Link:" + listing.url);
                    return(null);
                }
                var schSize = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, size.eu, size.uk, size.cm, size.ru));
                if (schSize == null)
                {
                    Program.Logger.Warn("wrong size. SKU:" + listing.sku + "\n"
                                        + "Listing Category: " + listing.category + ".\n"
                                        + "FullCatalog Category:" + sneaker.category + "\n"
                                        + "ListingTite: " + listing.title + "\n"
                                        + "Listing Link:" + listing.url);
                    return(null);
                }
                sizeAllStock.us   = size.us;
                sizeAllStock.sku2 = sneaker.sku + "-" + size.us;
                sizeAllStock.upc  = size.upc;
                var offer = CreateOffer(listing, market, jsonMarket);
                sizeAllStock.offers.Add(offer);
                return(sizeAllStock);
            }
        }
Пример #26
0
        private void UpdateDbSneaker(DbRoot db, DbSneaker sneaker, Listing listing, RootParsingObject shop, Shop shopCatalogItem)
        {
            log += "Update Sneaker. sku:" + sneaker.Sku + " title: " + sneaker.Titles[0] + br;

            /* логика:
             * проверяем заголовок, если длиннее, берем его
             * проверяем остальные элементы, если они не нул, а были нул то берем их
             * сравниваем категорию листинга и кроссовка, если не совпадают то отклоняем этот листинг (но по идее такого быть не должно
             */

            //title
            var title = sneaker.Titles.Find(x => x.ToLower() == listing.title.ToLower());

            if (title == null)
            {
                sneaker.Titles.Add(listing.title);
                sneaker.Titles = sneaker.Titles.OrderByDescending(x => x.Length).ToList();
            }

            //color
            if (!string.IsNullOrWhiteSpace(listing.colorbrand))
            {
                if (listing.colorbrand.Length > sneaker.Color.Length)
                {
                    sneaker.Color = listing.colorbrand;
                }
            }

            //category
            //если пустая то добавляем
            if (string.IsNullOrWhiteSpace(sneaker.Category) && !string.IsNullOrWhiteSpace(listing.category))
            {
                sneaker.Category = listing.category;
            }
            //если обе непустые сраванием
            else if (!string.IsNullOrWhiteSpace(sneaker.Category) && !string.IsNullOrWhiteSpace(listing.category))
            {
                if (sneaker.Category != listing.category)
                {
                    log += "Warn! Other categories. sku: " + sneaker.Sku + " sneaker.Category:" + sneaker.Category +
                           " listing.category:" + listing.category + " listing.url: " + listing.url + br;
                }
            }
            //если обе пустые то
            else if (string.IsNullOrWhiteSpace(sneaker.Category) && string.IsNullOrWhiteSpace(listing.category))
            {
                log += "Warn: category is empty" + br;
            }

            //links
            sneaker.Links.Add(listing.url);

            //images
            var imgCol = new DbImageCollection();

            imgCol.ShopName = shopCatalogItem.name;
            foreach (var lImage in listing.images)
            {
                var dbImg = new DbImage();
                dbImg.SiteUrl = lImage;
                imgCol.Images.Add(dbImg);
            }
            sneaker.ImageCollectionList.Add(imgCol);

            //sizes
            foreach (var lSize in listing.sizes)
            {
                //find size
                var snSize = new DbSize();
                if (!string.IsNullOrWhiteSpace(lSize.us))
                {
                    snSize = sneaker.Sizes.Find(x => x.Us == lSize.us);
                    //если размера нет, создаем
                    if (snSize == null)
                    {
                        var dbSize = GetDbSize(sneaker, lSize, listing, shop, shopCatalogItem);
                        sneaker.Sizes.Add(dbSize);
                    }
                    //если есть создаем только оффер
                    else
                    {
                        var offer = CreateDbOffer(sneaker, lSize, listing, shop, shopCatalogItem);
                        snSize.Offers.Add(offer);
                        snSize.Offers = snSize.Offers.OrderBy(x => x.price_usd_with_delivery_to_usa_and_minus_vat)
                                        .ToList();
                    }
                }
                else
                {
                    //если юс размера нет, то надо добисать будет код (например для асфальтгольда)
                    throw new Exception("size us is null. Cannot update db sneaker.");
                }
            }
        }
Пример #27
0
        public Catalog ParseCatalogFromJson(RootParsingObject json)
        {
            Catalog catalog = new Catalog();

            var items = json.listings;

            foreach (var item in items)
            {
                var sneaker = new Sneaker();
                sneaker.brand    = item.brand;
                sneaker.link     = item.url;
                sneaker.price    = item.price;
                sneaker.oldPrice = item.old_price;
                sneaker.sku      = item.sku;
                sneaker.images   = item.images;
                sneaker.color    = item.colorbrand;
                if (item.sizes != null)
                {
                    if (item.sizes.Count > 0)
                    {
                        //title
                        sneaker.title = item.title;
                        if (!sneaker.title.ToUpper().Contains(item.brand.ToUpper()))
                        {
                            sneaker.title = item.brand.ToUpper() + " " + sneaker.title;
                        }
                        sneaker.ParseTitle();

                        //categorySneakerFullCatalog
                        if (item.category == "men")
                        {
                            sneaker.category = Settings.CATEGORY_MEN;
                        }
                        else if (item.category == "women")
                        {
                            sneaker.category = Settings.CATEGORY_WOMEN;
                        }
                        else if (item.category == "kids")
                        {
                            sneaker.category = Settings.CATEGORY_KIDS;
                        }
                        //если категория нул, смотрим есть ли артикул в фулкаталоге и заполнена ли у него категория
                        if (String.IsNullOrWhiteSpace(item.category))
                        {
                            var fullCatalogSneaker = fullCatalog.GetSneakerFromSKU(item.sku);
                            if (fullCatalogSneaker != null)
                            {
                                if (!String.IsNullOrWhiteSpace(fullCatalogSneaker.category))
                                {
                                    sneaker.category = fullCatalogSneaker.category;
                                }
                            }
                            else
                            {
                                bool test = true;
                            }
                        }
                        //если категория нул, то пробуем ее определить по другим размерам
                        if (String.IsNullOrWhiteSpace(sneaker.category))
                        {
                            if (item.sizes != null)
                            {
                                if (item.sizes.Count > 0)
                                {
                                    var sizeitem = item.sizes[0];
                                    sneaker.category = SizeConverters.SizeConverter.GetCategory(sizeitem.us, sizeitem.eu, sizeitem.uk, sizeitem.cm);
                                }
                            }
                        }

                        //Если категория пустая, то дальше нет смысла продолжать
                        if (!String.IsNullOrWhiteSpace(sneaker.category))
                        {
                            //sizes
                            foreach (var sizeitem in item.sizes)
                            {
                                string sizeUS = String.Empty;
                                if (!String.IsNullOrWhiteSpace(sizeitem.us))
                                {
                                    sizeUS = sizeitem.us;
                                }
                                else if (!String.IsNullOrWhiteSpace(sizeitem.eu))
                                {
                                    var sizes       = sizeConverter.sizeChart.sizes.FindAll(x => x.eu == sizeitem.eu);
                                    var engCategory = Helper.ConvertCategoryRusToEng(sneaker.category);
                                    var size        = sizes.Find(x => x.category == engCategory);
                                    if (size != null)
                                    {
                                        sizeUS = size.us;
                                    }
                                }
                                else if (!String.IsNullOrWhiteSpace(sizeitem.uk))
                                {
                                    var sizes       = sizeConverter.sizeChart.sizes.FindAll(x => x.uk == sizeitem.uk);
                                    var engCategory = Helper.ConvertCategoryRusToEng(sneaker.category);
                                    var size        = sizes.Find(x => x.category == engCategory);
                                    if (size != null)
                                    {
                                        sizeUS = size.us;
                                    }
                                }
                                else if (!String.IsNullOrWhiteSpace(sizeitem.cm))
                                {
                                    var sizes       = sizeConverter.sizeChart.sizes.FindAll(x => x.cm == sizeitem.cm);
                                    var engCategory = Helper.ConvertCategoryRusToEng(sneaker.category);
                                    var size        = sizes.Find(x => x.category == engCategory);
                                    if (size != null)
                                    {
                                        sizeUS = size.us;
                                    }
                                }
                                else
                                {
                                    throw new Exception("wrong size");
                                }

                                if (!String.IsNullOrWhiteSpace(sizeUS))
                                {
                                    SneakerSize size = new SneakerSize(sizeUS);
                                    sneaker.sizes.Add(size);
                                }
                                else
                                {
                                    Program.Logger.Warn("Wrong size or category. SKU:" + item.sku + " category:" + sneaker.category + " Size: us:" + sizeitem.us + " eu:" + sizeitem.eu + " uk:" + sizeitem.uk + " cm:" + sizeitem.cm);
                                    //throw new Exception("Wrong sizeUS");
                                }
                            } //sizes

                            //sex
                            if (item.sex == "men")
                            {
                                sneaker.sex = Settings.GENDER_MAN;
                            }
                            else if (item.sex == "women")
                            {
                                sneaker.sex = Settings.GENDER_WOMAN;
                            }
                            else if (item.sex == null)
                            {
                                sneaker.sex = null;
                            }
                            else
                            {
                                Program.Logger.Warn("wrong sex: " + item.sku);
                                bool test = true;
                            }

                            //add to catalog
                            if (!catalog.isExistSneakerInCatalog(sneaker))
                            {
                                catalog.sneakers.Add(sneaker);
                            }
                        }
                        else //если категория нулл
                        {
                            Program.Logger.Warn("wrong category: " + item.sku);
                        }
                    }
                    else
                    {
                        bool test = true;
                    }
                }
                else
                {
                    bool test = true;
                }
            }

            return(catalog);
            //throw new NotImplementedException();
        }
        /// <summary>
        /// метод обновляет принудительно все фотки в фулкаталоге на фотки из магазинов. Эти фотки берутся с нашего сервака для фоток
        /// метод проходит по всем магазинам и ищет там фотки для артикула, если они есть то загружает их.
        /// магазины отсортированы в порядке приоритета фотографи.
        /// если в магазинах нет фоток, то фотки берутся из папки для фоток, загруженных вручную
        /// </summary>
        public static void UpdateFullCatalogImages()
        {
            /*
             * Алгоритм обновления изображений:
             * берем фулкаталог
             * берем список магазинов
             * берем только магазины без водяных знаков
             * желательно чтобы кроссовки были на белом фоне (или на сером, но не стайловые),
             * стайловые можно в конце добавить. потом опять пройтись по всем магазам и в конец добавить стайловых фоток.
             * чтобы у кросса например было 4 обычных фотки и потом стайловые дальше шли
             * также можно сделать приоритет по направлению первого кроссовка
             * например чтобы в первую очередь брать фотки кросс у которых влево смотрит)
             * Если нигде кросс не найден, то искать фотки в папке images
             * туда типа вручную фотки загружаем, например для кроссовок из дисконта
             */

            var fullCatalog = LoadFullCatalogFromFtp();
            var shopCatalog = ShopCatalogRoot.ReadFromFtp();
            var shops       = new List <RootParsingObject>();
            var startTime   = DateTime.Now;

            //очищаем левые фотки
            foreach (var record in fullCatalog.records)
            {
                if (record.images.Count == 1 && string.IsNullOrWhiteSpace(record.images[0]))
                {
                    record.images = new List <string>();
                }
            }

            Program.Logger.Info("Старт. Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count);

            //подгружаем json всех магазинов
            foreach (var market in shopCatalog.markets)
            {
                var shop = RootParsingObject.ReadJsonMarketFromFtp(market);
                if (shop != null)
                {
                    shops.Add(shop);
                }
            }

            //отсортировали список магазинов по убыванию количества листингов
            shops.Sort(delegate(RootParsingObject shop1, RootParsingObject shop2)
                       { return(shop2.listings.Count.CompareTo(shop1.listings.Count)); });

            //делаем первый эшелон магазинов с самыми классными фотками
            var titolo       = shops.Find(x => x.market_info.name == "titolo.ch");
            var chmielna     = shops.Find(x => x.market_info.name == "chmielna20.pl");
            var asfaltgold   = shops.Find(x => x.market_info.name == "asphaltgold.de");
            var hhv          = shops.Find(x => x.market_info.name == "hhv.de");
            var streetBeat   = shops.Find(x => x.market_info.name == "street-beat.ru");
            var firstEshelon = new List <RootParsingObject>()
            {
                titolo, chmielna, asfaltgold, hhv, streetBeat
            };

            //очищаем все артикулы от фоток
            //foreach (var fcRecord in fullCatalog.records)
            //{
            //    fcRecord.images = new List<string>();
            //}
            //Program.logger.Info("Очистили от фоток. Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count);

            /*Теперь делаем самое главное:
             * проходимся по всему списку артикулов
             * каждый артикул проверяем на наличие в магазине
             * если он в магазине есть, смотрим, есть ли для него фотки
             * если есть то заполняем
             */

            //первый проход делаем по первому эшелону магазинов
            int i             = 0;
            int addedPhotos   = 0;
            int updatedPhotos = 0;
            int status1       = 1;
            int status2       = 1;

            Program.Logger.Info("Start FirstEshelon. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count);
            foreach (var fcRecord in fullCatalog.records)
            {
                if (fcRecord.sku == "724821-100")
                {
                    bool test = true;
                }

                //пропускаем артикул, если для него уже были взяты фотки с одного из сайтов эшелонов
                List <string> images = new List <string>();
                if (fcRecord.images == null)
                {
                    images = GetImages(fcRecord, firstEshelon, shopCatalog);
                }
                else if (fcRecord.images.Count == 0)
                {
                    images = GetImages(fcRecord, firstEshelon, shopCatalog);
                }
                else if (!fcRecord.images[0].Contains("img.sneaker-icon.ru"))
                {
                    images = GetImages(fcRecord, firstEshelon, shopCatalog);
                }
                else
                {
                    //если уже с нашего сервака фотка, то проверяем, с сайта эшелона или нет
                    var  image           = fcRecord.images[0];
                    bool isEshelonPhotos = false;
                    foreach (var shop in firstEshelon)
                    {
                        int shopNumber = shopCatalog.markets.Find(x => x.name == shop.market_info.name).number;
                        if (image.Contains("/shops/" + shopNumber + "/images/"))
                        {
                            isEshelonPhotos = true;
                            break;
                        }
                    }
                    if (!isEshelonPhotos)
                    {
                        images = GetImages(fcRecord, firstEshelon, shopCatalog);
                    }
                }

                if (images.Count > 0)
                {
                    fcRecord.images = images;
                    if (fcRecord.images == null)
                    {
                        addedPhotos++;
                    }
                    else
                    if (fcRecord.images.Count == 0)
                    {
                        addedPhotos++;
                    }
                    else
                    {
                        updatedPhotos++;
                    }
                }
                i++;
                if (i > 100 * status1)
                {
                    status1++;
                }
                if (status1 > status2)
                {
                    var time = DateTime.Now - startTime;
                    Program.Logger.Debug("Пройдено:" + i + " Добавлено:" + addedPhotos + " Обновлено:" + updatedPhotos + " time:" + time.Minutes);
                    status2 = status1;
                }
            }
            Program.Logger.Info("Finish FirstEshelon. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count);
            Program.Logger.Info("Добавлено артикулов:" + addedPhotos + " Обновлено артикулов:" + updatedPhotos);


            //теперь проходимся по всем магазинам (можно конечно первый эшелон удалить, но чет лень, всё равно фотки с изображениями пропускаем)
            Program.Logger.Info("Start AllShops. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count);
            i       = 0;
            status1 = 1;
            status2 = 1;
            foreach (var fcRecord in fullCatalog.records)
            {
                //пропускаем фотки у которых в имени файла уже содержится img.sneaker-icon.ru, т.е. значит что они уже были добавлены из первого эшелона или про прошлом проходе UpdateFullCatalogImages. по сути нам нужно взять только те артикулы, у которых нет фоток или у которых фотки с сайта а не с нашего сервака
                List <string> images = new List <string>();
                if (fcRecord.images == null)
                {
                    images = GetImages(fcRecord, shops, shopCatalog);
                }
                else if (fcRecord.images.Count == 0)
                {
                    images = GetImages(fcRecord, shops, shopCatalog);
                }
                else if (!fcRecord.images[0].Contains("img.sneaker-icon.ru/shops/"))
                {
                    images = GetImages(fcRecord, shops, shopCatalog);
                }

                if (images.Count > 0)
                {
                    fcRecord.images = images;
                    if (fcRecord.images == null)
                    {
                        addedPhotos++;
                    }
                    else
                    if (fcRecord.images.Count == 0)
                    {
                        addedPhotos++;
                    }
                    else
                    {
                        updatedPhotos++;
                    }
                }
                i++;
                if (i > 100 * status1)
                {
                    status1++;
                }
                if (status1 > status2)
                {
                    var time = DateTime.Now - startTime;
                    Program.Logger.Debug("Пройдено:" + i + " Добавлено:" + addedPhotos + " Обновлено:" + updatedPhotos + " time:" + time.Minutes);
                    status2 = status1;
                }
            }
            Program.Logger.Info("Finish AllShops. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count);
            Program.Logger.Info("Добавлено артикулов:" + addedPhotos + " Обновлено артикулов:" + updatedPhotos);

            SaveFullCatalogToFtp(fullCatalog);
        }
        private static FullCatalogRecord CreateFullCatalogRecordFromListing(Listing listing, RootParsingObject jsonMarket, ShopCatalogRoot shopCatalog)
        {
            //если нет категории то посмотреть есть ли размеры разных сеток, если есть, то определить категорию по разным размерам.
            FullCatalogRecord fcRecord = new FullCatalogRecord();

            //brand
            if (Validator.ValidateBrand(listing.brand))
            {
                fcRecord.brand = listing.brand;
            }
            else
            {
                Program.Logger.Warn("wrong brand. sku: " + listing.sku + " market: " + jsonMarket.market_info.name);
                return(null);
            }

            //sku
            var sku = listing.sku.ToUpper(); //Aa1234-001 to AA1234-001 nike sku

            if (Validator.ValidateSku(sku, listing.brand))
            {
                fcRecord.sku = sku;
            }
            else
            {
                Program.Logger.Warn("wrong sku: " + listing.sku + " market: " + jsonMarket.market_info.name);
                return(null);
            }

            //category
            if (String.IsNullOrWhiteSpace(listing.category))
            {
                //пытаемся определить категорию по размерным сеткам
                listing.GetCategory();
            }
            if (!String.IsNullOrWhiteSpace(listing.category))
            {
                if (Validator.ValidateCategory(listing.category))
                {
                    fcRecord.category = listing.category;
                    fcRecord.sex      = Helper.GetEngSexFromEngCategory(fcRecord.category);
                }
                else
                {
                    Program.Logger.Warn("FullCatalog2.CreateFullCatalogRecordFromListing. Invalid listing.category:" + listing.category + " shop:" + jsonMarket.market_info.name + " sku:" + listing.sku);
                }
            }

            //добавить валидации на эти позиции
            fcRecord.title      = listing.title;
            fcRecord.color      = listing.colorbrand;
            fcRecord.collection = listing.collection;
            fcRecord.link       = listing.url;

            //дописать смену изображений на изображения с сервера
            //fcRecord.images = listing.images;
            fcRecord.images = ChangeImageLinksFromShopToImagesFromOurServer(listing.images, jsonMarket, shopCatalog, listing);


            if (fcRecord.images.Count < listing.images.Count)
            {
                fcRecord.images = listing.images;
                Program.Logger.Warn("Wrong our Server Images. shop:" + jsonMarket.market_info.name + " sku:" + listing.sku);
            }
            else
            {
                bool test = true;
            }

            fcRecord.add_time = DateTime.Now;

            return(fcRecord);
        }
Пример #30
0
        protected RootParsingObject CreateJson(MarketInfo market_info)
        {
            //var market_info = new MarketInfo();
            var root     = new RootParsingObject();
            var listings = new List <Listing>();

            //market_info.ftpFolder = AfewStoreParser.NAME;
            //market_info.website = AfewStoreParser.SITEURL;
            //market_info.currency = AfewStoreParser.CURRENCY;
            //market_info.start_parse_date = DateTime.Now;
            //market_info.end_parse_date = DateTime.Now;
            //market_info.delivery_to_usa = AfewStoreParser.DELIVERY_TO_USA;
            //market_info.photo_parameters.is_watermark_image = false;
            //market_info.photo_parameters.background_color = "white";
            //market_info.currently_language = "en";

            int i = 0;

            foreach (var sneaker in catalog.sneakers)
            {
                var listing = new Listing();

                //id murmurhash
                Encoding encoding = new UTF8Encoding();
                if (sneaker.link != null)
                {
                    byte[] input = encoding.GetBytes(sneaker.link);
                    using (MemoryStream stream = new MemoryStream(input))
                    {
                        listing.id = MurMurHash3.Hash(stream);
                        if (listing.id < 0)
                        {
                            listing.id = listing.id * -1;
                        }
                    }
                }
                else
                {
                    byte[] input = encoding.GetBytes(sneaker.title);
                    using (MemoryStream stream = new MemoryStream(input))
                    {
                        listing.id = MurMurHash3.Hash(stream);
                        if (listing.id < 0)
                        {
                            listing.id = listing.id * -1;
                        }
                    }
                }


                listing.url        = sneaker.link;
                listing.sku        = sneaker.sku;
                listing.title      = sneaker.title;
                listing.brand      = sneaker.brand;
                listing.colorbrand = sneaker.color;
                listing.category   = Helper.ConvertCategoryRusToEng(sneaker.category);
                //if (String.IsNullOrWhiteSpace(listing.category)) Program.Logger.Warn("Wrong category: " + sneaker.category + " sku: " +sneaker.sku);
                listing.sex       = Helper.ConvertSexRusToEng(sneaker.sex);
                listing.price     = sneaker.price;
                listing.old_price = sneaker.oldPrice;
                listing.images    = sneaker.images;
                listing.sizes     = Helper.GetSizeListUs(sneaker.sizes);
                i++;
                listing.position = i;

                listings.Add(listing);
            }

            root.market_info = market_info;
            root.listings    = listings;

            return(root);
            //throw new NotImplementedException();
        }