public async Task <Result> Component(int id) { var model = await _widgetInstanceService.GetPublished().Where(c => c.Id == id).FirstOrDefaultAsync(); var enumInts = (int[])Enum.GetValues(typeof(WidgetWithId)); if (!enumInts.Contains(model.WidgetId)) { return(Result.Ok()); } switch ((WidgetWithId)model.WidgetId) { case WidgetWithId.CategoryWidget: { var result = new WidgetCategoryComponentResult() { Id = model.Id, WidgetId = model.WidgetId, WidgetZoneId = model.WidgetZoneId, WidgetName = model.Name, }; var settings = JsonConvert.DeserializeObject <WidgetCategorySetting>(model.Data); if (settings != null) { result.Categorys = await _categoriesRepository.Query() .Include(c => c.Media) .Where(c => settings.CategoryIds.Contains(c.Id)) .Select(c => new CategoryHomeResult() { Id = c.Id, ParentId = c.ParentId, Description = c.Description, Name = c.Name, Slug = c.Slug, ThumbnailUrl = c.Media == null ? null : c.Media.Url }).ToListAsync(); } return(Result.Ok(result)); } case WidgetWithId.ProductWidget: { var result = new WidgetProductComponentResult() { Id = model.Id, WidgetId = model.WidgetId, WidgetZoneId = model.WidgetZoneId, WidgetName = model.Name, Setting = JsonConvert.DeserializeObject <WidgetProductSetting>(model.Data) ?? new WidgetProductSetting() }; var query = _productRepository.Query() .Where(x => x.IsPublished && x.IsVisibleIndividually); if (result.Setting.CategoryId.HasValue && result.Setting.CategoryId.Value > 0) { var ids = new List <int>(); ids.Add(result.Setting.CategoryId.Value); var all = await _categoryService.GetAll(); ids.AddRange(_categoryService.GetChildrens(result.Setting.CategoryId.Value, all).Select(c => c.Id).Distinct()); //query = query.Where(x => x.Categories.Any(c => c.CategoryId == result.Setting.CategoryId.Value)); var subQuery = from c in query join b in _productCategoryRepository.Query() on c.Id equals b.ProductId where ids.Contains(b.CategoryId) select c.Id; query = query.Where(c => subQuery.Distinct().Contains(c.Id)); } if (result.Setting.FeaturedOnly) { query = query.Where(x => x.IsFeatured); } switch (result.Setting.OrderBy) { case WidgetProductOrderBy.Newest: query = query.OrderByDescending(c => c.CreatedOn); break; case WidgetProductOrderBy.BestSelling: // 暂无销量 query = query.OrderByDescending(c => c.CreatedOn); break; case WidgetProductOrderBy.Discount: // 暂无折扣 query = query.Where(c => c.SpecialPrice > 0).OrderByDescending(c => c.UpdatedOn); break; default: query = query.OrderByDescending(c => c.CreatedOn); break; } result.Products = query .Include(x => x.ThumbnailImage) //.OrderByDescending(x => x.CreatedOn) .Take(result.Setting.ItemCount) .Select(x => new GoodsListResult { Id = x.Id, Name = x.Name, Slug = x.Slug, Price = x.Price, OldPrice = x.OldPrice, SpecialPrice = x.SpecialPrice, SpecialPriceStart = x.SpecialPriceStart, SpecialPriceEnd = x.SpecialPriceEnd, IsAllowToOrder = x.IsAllowToOrder, ThumbnailUrl = x.ThumbnailImage.Url, ReviewsCount = x.ReviewsCount, RatingAverage = x.RatingAverage, ShortDescription = x.ShortDescription, IsPublished = x.IsPublished, IsFeatured = x.IsFeatured }) .ToList(); return(Result.Ok(result)); } case WidgetWithId.SimpleProductWidget: { var result = new WidgetSimpleProductComponentResult() { Id = model.Id, WidgetId = model.WidgetId, WidgetZoneId = model.WidgetZoneId, WidgetName = model.Name, Setting = JsonConvert.DeserializeObject <WidgetSimpleProductSetting>(model.Data) }; var productIds = result.Setting?.Products?.Select(c => c.Id); if (productIds.Count() > 0) { var products = await _productRepository .Query() .Include(c => c.ThumbnailImage) .Where(x => x.IsPublished && productIds.Contains(x.Id)).ToListAsync(); foreach (var item in products) { var product = result.Setting.Products.FirstOrDefault(c => c.Id == item.Id); if (product != null) { var productThumbnail = GoodsListResult.FromProduct(item); result.Products.Add(productThumbnail); } } } return(Result.Ok(result)); } case WidgetWithId.CarouselWidget: { var result = new WidgetCarouselComponentResult() { Id = model.Id, WidgetId = model.WidgetId, WidgetZoneId = model.WidgetZoneId, Items = JsonConvert.DeserializeObject <IList <WidgetCarouselItem> >(model.Data) }; if (result.Items.Count > 0) { var mediaIds = result.Items.Select(c => c.ImageId).Distinct(); //var medias = await _mediaRepository.Query().Where(c => mediaIds.Contains(c.Id)).ToListAsync(); foreach (var item in result.Items) { // medias.FirstOrDefault(c => c.Id == item.ImageId)?.Url; item.ImageUrl = await _mediaService.GetMediaUrl(Path.GetFileName(item.ImageUrl)); } } return(Result.Ok(result)); } //case WidgetWithId.SpaceBarWidget: // break; case WidgetWithId.RecentlyViewedWidget: break; case WidgetWithId.HtmlWidget: default: break; } return(Result.Ok()); }
public CalculatedProductPrice CalculateProductPrice(GoodsListResult productThumbnail) { return(CalculateProductPrice(productThumbnail.Price, productThumbnail.OldPrice, productThumbnail.SpecialPrice, productThumbnail.SpecialPriceStart, productThumbnail.SpecialPriceEnd)); }