using BBWY.Common.Http; using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Dto; using Microsoft.Extensions.Options; using NLog; using System.Threading.Tasks; using Yitter.IdGenerator; using System.Linq; using BBWY.Server.Model.Db; using System; using System.Collections.Generic; using Newtonsoft.Json; using FreeSql; namespace BBWY.Server.Business.Sync { public class ProductSyncBusiness : BaseSyncBusiness, IDenpendency { private ProductBusiness productBusiness; public ProductSyncBusiness(RestApiService restApiService, IOptions options, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, ProductBusiness productBusiness) : base(restApiService, options, logger, fsql, idGenerator, taskSchedulerManager, venderBusiness) { this.productBusiness = productBusiness; } private void SyncProduct(ShopResponse shop, ProductListResponse productList) { var shopId = long.Parse(shop.ShopId); List insertProductList = new List(); List> updateProductList = new List>(); List inserSkuList = new List(); List> updateProductSkuList = new List>(); var productIds = productList.Items.Select(p => p.Id); var dbProducts = fsql.Select().Where(p => p.ShopId == shopId && productIds.Contains(p.Id)).ToList(); var dbProductSkus = fsql.Select().Where(s => s.ShopId == shopId && productIds.Contains(s.ProductId)).ToList(); foreach (var product in productList.Items) { var dbProduct = dbProducts.FirstOrDefault(dbp => dbp.Id == product.Id); if (dbProduct == null) { insertProductList.Add(new Product() { Id = product.Id, CreateTime = product.CreateTime ?? DateTime.Now, Platform = shop.PlatformId, ProductItemNum = product.ProductItemNum, ShopId = shopId, Title = product.Title, State = product.State }); } else if (dbProduct.State != product.State) { var update = fsql.Update(product.Id).Set(p => p.State, dbProduct.State); updateProductList.Add(update); } var skuList = productBusiness.GetProductSkuList(new SearchProductSkuRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, Platform = shop.PlatformId, Spu = product.Id }); foreach (var sku in skuList) { var dbSku = dbProductSkus.FirstOrDefault(s => s.Id == sku.Id); if (dbSku == null) { inserSkuList.Add(new ProductSku() { Id = sku.Id, CreateTime = sku.CreateTime ?? DateTime.Now, Logo = sku.Logo, Platform = shop.PlatformId, Price = sku.Price, ProductId = sku.ProductId, ShopId = shopId, Title = sku.Title, State = sku.State }); } else if (dbSku.State != sku.State || dbSku.Price != sku.Price) { var update = fsql.Update(dbSku.Id).Set(s => s.State, sku.State).Set(s => s.Price, sku.Price); updateProductSkuList.Add(update); } } } fsql.Transaction(() => { fsql.Insert(insertProductList).ExecuteAffrows(); fsql.Insert(inserSkuList).ExecuteAffrows(); if (updateProductList.Count > 0) foreach (var update in updateProductList) update.ExecuteAffrows(); if (updateProductSkuList.Count > 0) foreach (var update in updateProductSkuList) update.ExecuteAffrows(); }); } private void SyncProduct(ShopResponse shop, bool IsSyncAllProduct = false) { try { var request = new SearchProductRequest() { PageSize = 50, PageIndex = 1, AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, Platform = shop.PlatformId }; while (true) { var productList = productBusiness.GetProductList(request); if (productList == null || productList.Count == 0) return; SyncProduct(shop, productList); if (productList.Items.Count < 50 || !IsSyncAllProduct) break; request.PageIndex++; } } catch (Exception ex) { var shopData = JsonConvert.SerializeObject(shop); logger.Error(ex, $"SyncProduct ShopData:{shopData}"); } } /// /// 同步所有店铺的前50个产品 /// public void SyncAllShopProduct() { var shopList = venderBusiness.GetShopList(); //SyncProduct(shopList.FirstOrDefault(s => s.ShopId == "10388155"), true); //布莱特玩具专营店 foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncProduct(shop), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.ProductSyncTaskScheduler); } } /// /// 同步所有店铺的全部产品 /// public void SyncAllShopAllProduct() { var shopList = venderBusiness.GetShopList(); //SyncProduct(shopList.FirstOrDefault(s => s.ShopId == "10388155"), true); //布莱特玩具专营店 foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncProduct(shop, true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.ProductSyncTaskScheduler); } } } }