示例#1
0
        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());
        }
示例#2
0
 public CalculatedProductPrice CalculateProductPrice(GoodsListResult productThumbnail)
 {
     return(CalculateProductPrice(productThumbnail.Price, productThumbnail.OldPrice, productThumbnail.SpecialPrice, productThumbnail.SpecialPriceStart, productThumbnail.SpecialPriceEnd));
 }