예제 #1
0
        public async Task <IActionResult> ProductList(GridCommand command, ProductListModel model)
        {
            var gridModel = new GridModel <ProductOverviewModel>();

            var fields = new List <string> {
                "name"
            };

            if (_searchSettings.SearchFields.Contains("sku"))
            {
                fields.Add("sku");
            }

            if (_searchSettings.SearchFields.Contains("shortdescription"))
            {
                fields.Add("shortdescription");
            }

            var searchQuery = new CatalogSearchQuery(fields.ToArray(), model.SearchProductName)
                              .HasStoreId(model.SearchStoreId)
                              .WithCurrency(_workContext.WorkingCurrency)
                              .WithLanguage(_workContext.WorkingLanguage);

            if (model.SearchIsPublished.HasValue)
            {
                searchQuery = searchQuery.PublishedOnly(model.SearchIsPublished.Value);
            }

            if (model.SearchHomePageProducts.HasValue)
            {
                searchQuery = searchQuery.HomePageProductsOnly(model.SearchHomePageProducts.Value);
            }

            if (model.SearchProductTypeId > 0)
            {
                searchQuery = searchQuery.IsProductType((ProductType)model.SearchProductTypeId);
            }

            if (model.SearchWithoutManufacturers.HasValue)
            {
                searchQuery = searchQuery.HasAnyManufacturer(!model.SearchWithoutManufacturers.Value);
            }
            else if (model.SearchManufacturerId != 0)
            {
                searchQuery = searchQuery.WithManufacturerIds(null, model.SearchManufacturerId);
            }


            if (model.SearchWithoutCategories.HasValue)
            {
                searchQuery = searchQuery.HasAnyCategory(!model.SearchWithoutCategories.Value);
            }
            else if (model.SearchCategoryId != 0)
            {
                searchQuery = searchQuery.WithCategoryIds(null, model.SearchCategoryId);
            }

            IPagedList <Product> products;

            if (_searchSettings.UseCatalogSearchInBackend)
            {
                searchQuery = searchQuery.Slice((command.Page - 1) * command.PageSize, command.PageSize);

                var sort = command.Sorting?.FirstOrDefault();
                if (sort != null)
                {
                    switch (sort.Member)
                    {
                    case nameof(ProductModel.Name):
                        searchQuery = searchQuery.SortBy(sort.Descending ? ProductSortingEnum.NameDesc : ProductSortingEnum.NameAsc);
                        break;

                    case nameof(ProductModel.Price):
                        searchQuery = searchQuery.SortBy(sort.Descending ? ProductSortingEnum.PriceDesc : ProductSortingEnum.PriceAsc);
                        break;

                    case nameof(ProductModel.CreatedOn):
                        searchQuery = searchQuery.SortBy(sort.Descending ? ProductSortingEnum.CreatedOn : ProductSortingEnum.CreatedOnAsc);
                        break;
                    }
                }

                if (!searchQuery.Sorting.Any())
                {
                    searchQuery = searchQuery.SortBy(ProductSortingEnum.NameAsc);
                }

                var searchResult = await _catalogSearchService.SearchAsync(searchQuery);

                products = await searchResult.GetHitsAsync();
            }
            else
            {
                var query = _catalogSearchService
                            .PrepareQuery(searchQuery)
                            .ApplyGridCommand(command, false);

                products = await new PagedList <Product>(query, command.Page - 1, command.PageSize).LoadAsync();
            }

            var fileIds = products.AsEnumerable()
                          .Select(x => x.MainPictureId ?? 0)
                          .Where(x => x != 0)
                          .Distinct()
                          .ToArray();

            var files = (await _mediaService.GetFilesByIdsAsync(fileIds)).ToDictionarySafe(x => x.Id);

            gridModel.Rows = products.AsEnumerable().Select(x =>
            {
                var productModel = new ProductOverviewModel
                {
                    Sku                  = x.Sku,
                    Published            = x.Published,
                    ProductTypeLabelHint = x.ProductTypeLabelHint,
                    Name                 = x.Name,
                    Id                        = x.Id,
                    StockQuantity             = x.StockQuantity,
                    Price                     = x.Price,
                    LimitedToStores           = x.LimitedToStores,
                    EditUrl                   = Url.Action("Edit", "Product", new { id = x.Id }),
                    ManufacturerPartNumber    = x.ManufacturerPartNumber,
                    Gtin                      = x.Gtin,
                    MinStockQuantity          = x.MinStockQuantity,
                    OldPrice                  = x.OldPrice,
                    AvailableStartDateTimeUtc = x.AvailableStartDateTimeUtc,
                    AvailableEndDateTimeUtc   = x.AvailableEndDateTimeUtc
                };

                //MiniMapper.Map(x, productModel);

                files.TryGetValue(x.MainPictureId ?? 0, out var file);

                // TODO: (core) Use IImageModel
                productModel.PictureThumbnailUrl = _mediaService.GetUrl(file, _mediaSettings.CartThumbPictureSize);
                productModel.NoThumb             = file == null;

                productModel.ProductTypeName = x.GetProductTypeLabel(_localizationService);
                productModel.UpdatedOn       = _dateTimeHelper.ConvertToUserTime(x.UpdatedOnUtc, DateTimeKind.Utc);
                productModel.CreatedOn       = _dateTimeHelper.ConvertToUserTime(x.CreatedOnUtc, DateTimeKind.Utc);

                return(productModel);
            });

            gridModel.Total = products.TotalCount;

            return(Json(gridModel));
        }
        private IQueryable <Product> GetProductQuery(
            int[] providerManus,
            int[] providerStores,
            int[] consumerManus,
            int categoryId        = 0,
            DateTime?updatedOnUtc = null)
        {
            Guard.NotNull(providerManus, nameof(providerManus));
            Guard.NotNull(providerStores, nameof(providerStores));
            Guard.NotNull(consumerManus, nameof(consumerManus));

            List <int> manuIds  = null;
            List <int> storeIds = null;

            if (providerStores.Any())
            {
                storeIds = providerStores.Where(x => x != 0).ToList();
            }

            if (providerManus.Any())
            {
                manuIds = new List <int>();

                foreach (var id in providerManus.Where(x => x != 0))
                {
                    if (!consumerManus.Any() || consumerManus.Contains(id))
                    {
                        manuIds.Add(id);
                    }
                }
            }
            else
            {
                manuIds = consumerManus.Where(x => x != 0).ToList();
            }

            var searchQuery = new CatalogSearchQuery();

            if (!_shopConnectorSettings.IncludeHiddenProducts)
            {
                searchQuery = searchQuery.PublishedOnly(true);
            }

            var query = _catalogSearchService.Value.PrepareQuery(searchQuery);

            if (updatedOnUtc.HasValue)
            {
                query = query.Where(x => x.UpdatedOnUtc > updatedOnUtc);
            }

            if (storeIds != null && storeIds.Any())
            {
                query =
                    from p in query
                    join sm in _storeMappingRepository.Value.TableUntracked on new { pid = p.Id, pname = "Product" } equals new { pid = sm.EntityId, pname = sm.EntityName } into psm
                from sm in psm.DefaultIfEmpty()
                where !p.LimitedToStores || storeIds.Contains(sm.StoreId)
                select p;
            }

            if (manuIds != null && manuIds.Any())
            {
                query =
                    from p in query
                    from pm in p.ProductManufacturers.Where(pm => manuIds.Contains(pm.ManufacturerId))
                    select p;

                //var distinctIds = (
                //	from p in query
                //	join pm in _productManufacturerRepository.Value.TableUntracked on p.Id equals pm.ProductId
                //	where manuIds.Contains(pm.ManufacturerId)
                //	select p.Id).Distinct();

                //query =
                //	from p in query
                //	join x in distinctIds on p.Id equals x
                //	select p;
            }

            if (categoryId != 0)
            {
                query =
                    from p in query
                    from pc in p.ProductCategories.Where(pc => pc.CategoryId == categoryId)
                    select p;

                //var distinctIds = (
                //	from p in query
                //	join pc in _productCategoryRepository.Value.TableUntracked on p.Id equals pc.ProductId
                //	where pc.CategoryId == categoryId
                //	select p.Id).Distinct();

                //query =
                //	from p in query
                //	join x in distinctIds on p.Id equals x
                //	select p;
            }

            return(query);
        }