Beispiel #1
0
        private void UpdateSingleProduct(Product product, JobClient updateProductJobClient, JobClient downloadImageProductJobClient)
        {
            #region Check Price

            //if (_isPriceBySku)
            //{
            //    if (_priceWithSku.ContainsKey(product.MerchantSku))
            //    {
            //        product.Price = _priceWithSku[product.MerchantSku];
            //    }
            //}
            #endregion
            #region Check Promotion
            switch (_isPromotion)
            {
            //Không có Promotion
            case 0:
                product.PromotionInfo = "";
                break;

            //Promotion theo Category
            case 1:
                try
                {
                    product.PromotionInfo = _promotionLazadaWithCategory.ContainsKey(product.Categories[1]) ? _promotionLazadaWithCategory[product.Categories[1]] : _promotionLazadaWithCategory["Default"];
                }
                catch (Exception exception)
                {
                    Log.Error("Error check contain key " + exception.Message);
                }
                break;

            //Promotion theo SKU
            case 2:
                try
                {
                    if (_promotionLazadaWithSku.ContainsKey(product.MerchantSku))
                    {
                        product.PromotionInfo = _promotionLazadaWithSku[product.MerchantSku];
                        Log.Info("Promotion: " + product.ID + " --- " + _promotionLazadaWithSku[product.MerchantSku]);
                    }
                    else
                    {
                        product.PromotionInfo = "";
                    }
                }
                catch (Exception exception)
                {
                    Log.Error("Error check contain key " + exception.Message);
                }
                break;
            }
            #endregion
            var productAdapter = new DBProductsTableAdapters.ProductTableAdapter();
            productAdapter.Connection.ConnectionString = _connectionString;
            var productTable = new DBProducts.ProductDataTable();
            while (_isRunning)
            {
                try
                {
                    productAdapter.FillBy_ID(productTable, product.ID);
                    break;
                }
                catch (Exception ex)
                {
                    Log.Error(string.Format("ProductId {0} : Fill by ID error.", product.ID), ex);
                    Thread.Sleep(60000);
                }
            }
            //InsertProduct
            if (productTable.Rows.Count == 0)
            {
                CheckClassificationInSql(product);
                InsertProductToSql(product, productAdapter);

                //Insert Price Log
                InsertPriceLog(product.ID, DateTime.Now, product.Price, 0);
                //Insert LogAddsProduct
                InsertLogAddProduct(product.IDCongTy, product.ID, product.Name, product.DetailUrl);

                SendMessageDownloadImageProduct(product, downloadImageProductJobClient, true);
                Log.Info(string.Format("CompanyId = {0} :Insert ProductId = {1} . Name = {2} . DetailUrl = {3}", product.IDCongTy, product.ID, product.Name, product.DetailUrl));
            }
            else //UpdateProduct
            {
                var oldPrice = Common.Obj2Int(productTable.Rows[0]["Price"].ToString());
                if (product.Price != oldPrice)
                {
                    UpdateProductPriceChangeAndValid(product, productAdapter, oldPrice);
                    //Insert Price Log
                    InsertPriceLog(product.ID, DateTime.Now, product.Price, oldPrice);
                }
                else
                {
                    UpdateProductLastUpdateAndValid(product, productAdapter);
                }
                if (productTable.Rows[0]["ImageId"] == DBNull.Value || string.IsNullOrEmpty(productTable.Rows[0]["ImageId"].ToString()))
                {
                    SendMessageDownloadImageProduct(product, downloadImageProductJobClient, false);
                }
                Log.Info(string.Format("CompanyId = {0} :Update ProductId = {1} . Name = {2} . DetailUrl = {3}", product.IDCongTy, product.ID, product.Name, product.DetailUrl));
            }
            productAdapter.Connection.Close();
            var hashProductInfo = ProductEntity.GetHashChangeInfo((int)product.Instock, true, product.Price, product.Name, product.ImageUrl,
                                                                  product.IDCategories, product.ShortDescription, product.OriginPrice);
            if (RedisCacheProductDatafeed.CheckChangeInfoProduct(product.ID, hashProductInfo))
            {
                SendMessageUpdateProductSolrAndRedisService(product, updateProductJobClient);
            }
        }
Beispiel #2
0
        public void Run(System.Threading.CancellationToken token)
        {
            ProductAdapter productAdapter = new ProductAdapter(new SqlDb("Data Source=42.112.28.93;Initial Catalog=QT_2;Persist Security Info=True;User ID=wss_price;Password=HzlRt4$$axzG-*UlpuL2gYDu;connection timeout=200"));

            log.InfoFormat("Start run at {0}", DateTime.Now.ToString(CultureInfo.InvariantCulture));
            CacheProductHash       cashProductHash        = CacheProductHash.Instance();
            RedisLastUpdateProduct cacheLastUpdateProduct = RedisLastUpdateProduct.Instance();
            int countProduct = 0;

            try
            {
                var lstFn = productAdapter.GetAllCompanyIdCrawlerFindNew();
                var lstRl = productAdapter.GetAllCompanyIdCrawlerReload();
                RedisCompanyWaitCrawler redisCache = RedisCompanyWaitCrawler.Instance();
                redisCache.SyncCompanyFindNew(lstFn);
                redisCache.SyncCompanyReload(lstRl);
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }

            var lst           = new List <QT.Entities.CrawlerProduct.Cache.ProductHash>();
            var lstLastUpdate = new List <long>();
            var lstCompany    = productAdapter.GetAllCompanyIdCrawler();

            foreach (var companyID in lstCompany)
            {
                Company cmp = new Company(companyID);
                productAdapter.DeleteProductUnvalidOfCOmpany(companyID);
                DataTable tbl = productAdapter.GetProductResetColumnDuplicateAndChange(companyID);
                foreach (DataRow rowProduct in tbl.Rows)
                {
                    long   productId        = QT.Entities.Common.Obj2Int64(rowProduct["ID"]);
                    long   originPrice      = QT.Entities.Common.Obj2Int64(rowProduct["OriginPrice"]);
                    string name             = rowProduct["Name"].ToString();
                    long   price            = QT.Entities.Common.Obj2Int64(rowProduct["Price"]);
                    string imageUrl         = Convert.ToString(rowProduct["ImageUrls"]);
                    string detailUrl        = Convert.ToString(rowProduct["DetailUrl"]);
                    int    inStock          = QT.Entities.Common.Obj2Int(rowProduct["InStock"]);
                    bool   valid            = QT.Entities.Common.Obj2Bool(rowProduct["Valid"]);
                    string shortDescription = QT.Entities.Common.CellToString(rowProduct["ShortDescription"], "");
                    long   categoryId       = rowProduct["ClassificationID"] == DBNull.Value ? 0 : QT.Entities.Common.Obj2Int64(rowProduct["ClassificationID"]);
                    long   hashChange       = ProductEntity.GetHashChangeInfo(inStock, valid, price, name, imageUrl, categoryId, shortDescription, originPrice);
                    long   hashDuplicate    = Product.GetHashDuplicate(cmp.Domain, price, name, imageUrl);
                    long   hashImage        = Product.GetHashImageInfo(imageUrl);
                    lst.Add(new QT.Entities.CrawlerProduct.Cache.ProductHash()
                    {
                        HashChange    = hashChange,
                        HashDuplicate = hashDuplicate,
                        HashImage     = hashImage,
                        Id            = productId,
                        Price         = price,
                        url           = detailUrl
                    });
                    lstLastUpdate.Add(productId);
                }
                cashProductHash.SetCacheProductHash(companyID, lst, 100); cacheLastUpdateProduct.RemoveAllLstProduct(companyID);
                cacheLastUpdateProduct.UpdateBathLastUpdateProduct(companyID, lstLastUpdate, DateTime.Now.AddDays(-1));
                productAdapter.UpdateCountProductForCompany(companyID, lstLastUpdate.Count, lstLastUpdate.Count);
                lst.Clear();
                lstLastUpdate.Clear();
                log.Info(string.Format("Complete Company: {0} {1}/{2}", companyID, countProduct++, lstCompany.Count));
            }
            log.Info("Complete all company");
            NextRun = DateTime.Now.AddHours(MAX_HOUR_LOOP);
            log.InfoFormat("End at {0}", DateTime.Now.ToString());
        }