コード例 #1
0
        /// <summary>
        /// Удалить непереведенные дубли переводов в ВК
        /// </summary>
        public static void DeleteUntranslatedProductsHavingTranslation(ProductVKExporter vke)
        {
            Comparator cb = new Comparator();

            // из БД получаем список всех артикулов, названий на англ, названий на рус
            foreach (Product prodDB in db.Products)
            {
                // в вкшном массиве ищем товары, включающие этот артикул, находим рус товар и англ товар по переводу этого товара в БД
                List <MarketEntity> goodsOfSameSKU = vke.ProductList.Where(p => p.Description.Contains(
                                                                               string.Format("(артикул {0})", prodDB.artikul))).ToList();
                MarketEntity rusProd = new MarketEntity();
                MarketEntity engProd = new MarketEntity();
                bool         rusFound = false, engFound = false;

                if (goodsOfSameSKU.Count > 1)
                {
                    foreach (MarketEntity sameSKUgood in goodsOfSameSKU)
                    {
                        Console.WriteLine("Artikul {0}, Title {1} ", prodDB.artikul, sameSKUgood.Title);
                        // ищем в бд переводы этого товара
                        List <Translation> transOfThisProd = db.GetTranslationsOfProduct(prodDB.title);
                        // среди переводов этого товара находим с таким же названием как товар в ВК
                        foreach (Translation tranOfThisProd in transOfThisProd)
                        {
                            //(t => t.title == sameSKUgood.Title);
                            if (tranOfThisProd.title == sameSKUgood.Title)
                            //if(transOfThisProd != null)
                            {
                                rusProd  = sameSKUgood;
                                rusFound = true;
                                Logger.Logger.Trace("Artikul {0}, Title Rus {1}", prodDB.artikul, rusProd.Title);
                            }
                            else
                            {
                                Logger.Logger.ErrorLog("{0} =/= {1}", tranOfThisProd.title, sameSKUgood.Title);
                            }
                        }
                        if (prodDB.title.Replace("&", "and") == sameSKUgood.Title.Replace("&", "and"))
                        {
                            engProd  = sameSKUgood;
                            engFound = true;
                            Logger.Logger.Trace("Artikul {0}, Title Eng {1}", prodDB.artikul, engProd.Title);
                        }
                        else
                        {
                            Logger.Logger.ErrorLog("{0} =/= {1}", prodDB.title, sameSKUgood.Title);
                        }
                        //if(transOfThisProd.Any(t => t.title == ))
                    }
                }
                if (rusFound && engFound)
                {
                    // если нашелся рус товар и англ товар, то удаляем англ товар
                    Logger.Logger.SuccessLog("Remove from VK {0}", engProd.Title);
                    vke.DeleteProduct(engProd.ID);
                }
            }
        }
コード例 #2
0
        static void Main(string[] args)
        {
            string[] modes = new string[] { "Полный импорт", "Импорт переводов",
                                            "Забрать переводы с ВК", "Удалить непереведенные дубли переводов в ВК" };
            int chosenMode = -1;

            while (chosenMode >= modes.Length || chosenMode < 0)
            {
                Console.WriteLine("Выберите режим импорта из списка:");
                for (int mi = 0; mi < modes.Length; mi++)
                {
                    Console.WriteLine("{0}:{1}", mi, modes[mi]);
                }
                string schosenMode = Console.ReadLine();
                if (!int.TryParse(schosenMode, out chosenMode))
                {
                    chosenMode = -1;
                }
            }

            ProductVKExporter vke = new ProductVKExporter();

            if (new[] { 0, 1 }.Contains(chosenMode))
            {
                /*
                 * // Удаляем продукты вошедшие в ВК, но не вошедшие в БД
                 * using (var db = new ProductContext())
                 * {
                 *  Logger.Logger.ErrorLog("Продукты вошедшие в ВК, но не вошедшие в БД: {0}",
                 *      vke.ProductList.Select(p => p.Title).
                 *      Where(title => !db.Products.Any(pl => pl.title == title)).Count());
                 *  foreach (var diff in vke.ProductList.Select(p => p.Title).
                 *      Where(title => !db.Products.Any(pl => pl.title == title)))
                 *  {
                 *      Logger.Logger.ErrorLog("{0}", diff);
                 *      foreach (var prod in vke.ProductList.Where(x => x.Title == diff))
                 *          vke.DeleteProduct(prod.ID);
                 *  }
                 * }*/
                foreach (var album in vke.AlbumList.Where(alb => alb.ID > 0))
                {
                    var goodsInAlbum = vke.GetAllGoods(album.ID);
                    if (goodsInAlbum.Count == 0)
                    {
                        Logger.Logger.ErrorLog("Удаляем пустую подборку: {0}",
                                               album.Title);
                        vke.RemoveAlbum(album.ID);
                    }
                }

                int exportedCount = 0;
                using (var db = new ProductContext())
                {
                    if (chosenMode == 0)
                    {
                        foreach (Product p in db.Products)
                        {
                            if (ExportProductToVK(p, vke, db))
                            {
                                exportedCount++;
                            }
                        }
                    }

                    foreach (Product p in db.Products)
                    {
                        if (db.Translations.Any(t => t.titleEng == p.title))
                        {
                            if (ExportProductToVK(p, vke, db))
                            {
                                exportedCount++;
                            }
                        }
                    }
                }
                Logger.Logger.SuccessLog("Экспортировано {0} товаров", exportedCount);
            }
            else if (chosenMode == 2)
            {
                // забор переводов с ВК
                using (var db = new ProductContext())
                {
                    List <string> newTitles = vke.ProductList.Select(p => p.Title).
                                              Where(title => !db.Products.Any(pl => pl.title.Replace("&", "") == title.Replace("and", "")) &&
                                                    !db.Translations.Any(tr => tr.title == title)
                                                    ).ToList();

                    Logger.Logger.ErrorLog("Продукты в ВК, но не вошедшие в БД, заносим в БД: {0}",
                                           newTitles.Count());
                    foreach (var diff in newTitles)
                    {
                        Logger.Logger.ErrorLog("{0}", diff);
                        foreach (var prod in vke.ProductList.Where(x => x.Title == diff))
                        {
                            if (!db.Translations.Any(t => prod.Title.Contains(t.title)) &&
                                !db.Products.Any(t => prod.Title.Contains(t.title)))
                            {
                                Translation t = new Translation();
                                t.title = prod.Title;
                                t.desc  = prod.Description;
                                Logger.Logger.SuccessLog("Добавляем перевод {0}", prod.Title);
                                var prodTied = db.Products.FirstOrDefault(p => prod.Description.Contains(p.artikul));
                                if (prodTied != null)
                                {
                                    t.titleEng = prodTied.title;
                                    Logger.Logger.SuccessLog("Найден SKU для товара {0}", prodTied.title);
                                }

                                //prod.PhotoID;

                                db.Translations.Add(t);
                                db.SaveChanges();
                            }
                        }
                    }
                }
            }
            else if (chosenMode == 3)
            {
                DeleteUntranslatedProductsHavingTranslation(vke);
            }
            Console.WriteLine("Press smth");
            Console.ReadLine();
        }
コード例 #3
0
        /// <summary>
        /// экспортировать товар из БД в ВК
        /// </summary>
        /// <param name="g"></param>
        /// <param name="vke"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static bool ExportProductToVK(Product g, ProductVKExporter vke, ProductContext db)
        {
            bool      result   = false;
            const int maxTries = 20;

            while (locker)
            {
                Console.Write(".");
                Thread.Sleep(sleepTime);
            }
            locker = true;
            long prodID  = 0;
            int  counter = 0;

            // делаем цикл на случай неудачных попыток
            while (prodID == 0 && counter < maxTries)
            {
                try
                {
                    // если есть перевод товара
                    Translation translation = db.Translations.FirstOrDefault(t => t.titleEng == g.title);
                    if (translation != null)
                    {
                        prodID = vke.ExportProduct(translation.title, translation.desc.Replace("&", " n "),
                                                   g.price, g.imageFileName, g.artikul);
                        vke.AddProductToAlbum(g.title, prodID, ProductVKExporter.mainAlbumTitle, g.imageFileName);
                    }
                    else
                    {
                        prodID = vke.ExportProduct(g.title, g.desc.Replace("&", " n "), g.price, g.imageFileName, g.artikul);
                    }

                    foreach (LinkProductWithCategory link in g.Links)
                    {
                        // если есть перевод подборки, меняем название на перевод
                        Translation translationAlbum = db.Translations.FirstOrDefault(t => t.titleEng == link.category.title);

                        // решил оставлять только наши сборные подборки и убрать заводские
                        if (link.category.isOurCategory || translationAlbum.isOurCategory)
                        {
                            vke.AddProductToAlbum(g.title, prodID,
                                                  (translationAlbum == null) ? (link.category.title) : (translationAlbum.title),
                                                  g.imageFileName);
                        }
                    }

                    result = true;
                }
                catch (Exception ex)
                {
                    Logger.Logger.Trace(ex.Message);
                    Logger.Logger.Trace("Неудачная попытка... ждемс {0}", counter++);
                    Thread.Sleep(sleepTime);
                    if (counter > 10)
                    {
                        Logger.Logger.ErrorLog("Внимание внимание, что то пошло не так!");
                        Logger.Logger.ErrorLog(ex.ToString());
                        //Console.ReadLine();
                    }
                }
            }

            // сохраняем картинку товара, т.к. это может быть из-за мелкой картинки
            if (counter >= maxTries)
            {
                try {
                    File.Copy(vke.GetImageFilePath(g.imageFileName), vke.GetTooSmallImageFilePath(g.imageFileName), true);
                }catch (Exception ex)
                {
                    Logger.Logger.ErrorLog(ex.ToString());
                }
            }
            locker = false;
            return(result);
        }