Commit e266cf93 authored by gdlcf88's avatar gdlcf88

Add IsHidden property to Product and Category, close #8

Static products, close #6
Fix sku updating feature
parent ba5e397c
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Categories.Dtos
{
public class GetCategoryListDto : PagedAndSortedResultRequestDto
{
public bool ShowHidden { get; set; }
}
}
\ No newline at end of file
...@@ -9,7 +9,7 @@ namespace EasyAbp.EShop.Products.Categories ...@@ -9,7 +9,7 @@ namespace EasyAbp.EShop.Products.Categories
ICrudAppService< ICrudAppService<
CategoryDto, CategoryDto,
Guid, Guid,
PagedAndSortedResultRequestDto, GetCategoryListDto,
CreateUpdateCategoryDto, CreateUpdateCategoryDto,
CreateUpdateCategoryDto> CreateUpdateCategoryDto>
{ {
......
...@@ -8,5 +8,7 @@ namespace EasyAbp.EShop.Products.Products.Dtos ...@@ -8,5 +8,7 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public Guid StoreId { get; set; } public Guid StoreId { get; set; }
public Guid? CategoryId { get; set; } public Guid? CategoryId { get; set; }
public bool ShowHidden { get; set; }
} }
} }
\ No newline at end of file
...@@ -22,6 +22,10 @@ namespace EasyAbp.EShop.Products.Products.Dtos ...@@ -22,6 +22,10 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public bool IsPublished { get; set; } public bool IsPublished { get; set; }
public bool IsStatic { get; set; }
public bool IsHidden { get; set; }
public ICollection<ProductAttributeDto> ProductAttributes { get; set; } public ICollection<ProductAttributeDto> ProductAttributes { get; set; }
public ICollection<ProductSkuDto> ProductSkus { get; set; } public ICollection<ProductSkuDto> ProductSkus { get; set; }
......
using System; using System;
using System.Linq;
using EasyAbp.EShop.Products.Authorization; using EasyAbp.EShop.Products.Authorization;
using EasyAbp.EShop.Products.Categories.Dtos; using EasyAbp.EShop.Products.Categories.Dtos;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
...@@ -6,7 +7,7 @@ using Volo.Abp.Application.Services; ...@@ -6,7 +7,7 @@ using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.Categories namespace EasyAbp.EShop.Products.Categories
{ {
public class CategoryAppService : CrudAppService<Category, CategoryDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateCategoryDto, CreateUpdateCategoryDto>, public class CategoryAppService : CrudAppService<Category, CategoryDto, Guid, GetCategoryListDto, CreateUpdateCategoryDto, CreateUpdateCategoryDto>,
ICategoryAppService ICategoryAppService
{ {
protected override string CreatePolicyName { get; set; } = ProductsPermissions.Categories.Create; protected override string CreatePolicyName { get; set; } = ProductsPermissions.Categories.Create;
...@@ -21,5 +22,12 @@ namespace EasyAbp.EShop.Products.Categories ...@@ -21,5 +22,12 @@ namespace EasyAbp.EShop.Products.Categories
{ {
_repository = repository; _repository = repository;
} }
protected override IQueryable<Category> CreateFilteredQuery(GetCategoryListDto input)
{
var query = base.CreateFilteredQuery(input);
return input.ShowHidden ? query : query.Where(x => !x.IsHidden);
}
} }
} }
\ No newline at end of file
...@@ -41,9 +41,11 @@ namespace EasyAbp.EShop.Products.Products ...@@ -41,9 +41,11 @@ namespace EasyAbp.EShop.Products.Products
protected override IQueryable<Product> CreateFilteredQuery(GetProductListDto input) protected override IQueryable<Product> CreateFilteredQuery(GetProductListDto input)
{ {
return input.CategoryId.HasValue var query = input.CategoryId.HasValue
? _repository.GetQueryable(input.StoreId, input.CategoryId.Value) ? _repository.GetQueryable(input.StoreId, input.CategoryId.Value)
: _repository.GetQueryable(input.StoreId); : _repository.GetQueryable(input.StoreId);
return input.ShowHidden ? query : query.Where(x => !x.IsHidden);
} }
public override async Task<ProductDto> CreateAsync(CreateUpdateProductDto input) public override async Task<ProductDto> CreateAsync(CreateUpdateProductDto input)
...@@ -94,6 +96,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -94,6 +96,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(id); var product = await GetEntityByIdAsync(id);
CheckProductIsNotStatic(product);
MapToEntity(input, product); MapToEntity(input, product);
await UpdateProductAttributesAsync(product, input); await UpdateProductAttributesAsync(product, input);
...@@ -174,11 +178,25 @@ namespace EasyAbp.EShop.Products.Products ...@@ -174,11 +178,25 @@ namespace EasyAbp.EShop.Products.Products
public async Task DeleteAsync(Guid id, Guid storeId) public async Task DeleteAsync(Guid id, Guid storeId)
{ {
await CheckDeletePolicyAsync();
var product = await GetEntityByIdAsync(id);
CheckProductIsNotStatic(product);
await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(id)); await _productCategoryRepository.DeleteAsync(x => x.ProductId.Equals(id));
await CheckStoreIsProductOwnerAsync(id, storeId); await CheckStoreIsProductOwnerAsync(id, storeId);
await base.DeleteAsync(id); await _repository.DeleteAsync(product);
}
private static void CheckProductIsNotStatic(Product product)
{
if (product.IsStatic)
{
throw new StaticProductCannotBeModifiedException(product.Id);
}
} }
public async Task<ProductDto> CreateSkuAsync(Guid productId, Guid storeId, CreateProductSkuDto input) public async Task<ProductDto> CreateSkuAsync(Guid productId, Guid storeId, CreateProductSkuDto input)
...@@ -189,6 +207,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -189,6 +207,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(productId); var product = await GetEntityByIdAsync(productId);
CheckProductIsNotStatic(product);
input.SerializedAttributeOptionIds = input.SerializedAttributeOptionIds =
await _serializedAttributeOptionIdsFormatter.ParseAsync(input.SerializedAttributeOptionIds); await _serializedAttributeOptionIdsFormatter.ParseAsync(input.SerializedAttributeOptionIds);
...@@ -224,6 +244,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -224,6 +244,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(productId); var product = await GetEntityByIdAsync(productId);
CheckProductIsNotStatic(product);
var sku = product.ProductSkus.Single(x => x.Id == productSkuId); var sku = product.ProductSkus.Single(x => x.Id == productSkuId);
ObjectMapper.Map(input, sku); ObjectMapper.Map(input, sku);
...@@ -241,6 +263,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -241,6 +263,8 @@ namespace EasyAbp.EShop.Products.Products
var product = await GetEntityByIdAsync(productId); var product = await GetEntityByIdAsync(productId);
CheckProductIsNotStatic(product);
var sku = product.ProductSkus.Single(x => x.Id == productSkuId); var sku = product.ProductSkus.Single(x => x.Id == productSkuId);
product.ProductSkus.Remove(sku); product.ProductSkus.Remove(sku);
......
using System;
using Volo.Abp;
namespace EasyAbp.EShop.Products.Products
{
public class StaticProductCannotBeModifiedException : BusinessException
{
public StaticProductCannotBeModifiedException(Guid productId) : base(
message: $"Cannot modify the static product: {productId}")
{
}
}
}
\ No newline at end of file
...@@ -20,6 +20,8 @@ namespace EasyAbp.EShop.Products.Categories ...@@ -20,6 +20,8 @@ namespace EasyAbp.EShop.Products.Categories
[CanBeNull] [CanBeNull]
public virtual string MediaResources { get; protected set; } public virtual string MediaResources { get; protected set; }
public virtual bool IsHidden { get; protected set; }
protected Category() protected Category()
{ {
} }
...@@ -30,7 +32,8 @@ namespace EasyAbp.EShop.Products.Categories ...@@ -30,7 +32,8 @@ namespace EasyAbp.EShop.Products.Categories
Guid? parentCategoryId, Guid? parentCategoryId,
string displayName, string displayName,
string description, string description,
string mediaResources string mediaResources,
bool isHidden
) :base(id) ) :base(id)
{ {
TenantId = tenantId; TenantId = tenantId;
...@@ -38,6 +41,7 @@ namespace EasyAbp.EShop.Products.Categories ...@@ -38,6 +41,7 @@ namespace EasyAbp.EShop.Products.Categories
DisplayName = displayName; DisplayName = displayName;
Description = description; Description = description;
MediaResources = mediaResources; MediaResources = mediaResources;
IsHidden = isHidden;
} }
} }
} }
...@@ -24,6 +24,10 @@ namespace EasyAbp.EShop.Products.Products ...@@ -24,6 +24,10 @@ namespace EasyAbp.EShop.Products.Products
public virtual bool IsPublished { get; protected set; } public virtual bool IsPublished { get; protected set; }
public virtual bool IsStatic { get; protected set; }
public virtual bool IsHidden { get; protected set; }
public virtual ICollection<ProductAttribute> ProductAttributes { get; protected set; } public virtual ICollection<ProductAttribute> ProductAttributes { get; protected set; }
public virtual ICollection<ProductSku> ProductSkus { get; protected set; } public virtual ICollection<ProductSku> ProductSkus { get; protected set; }
...@@ -41,6 +45,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -41,6 +45,8 @@ namespace EasyAbp.EShop.Products.Products
string displayName, string displayName,
InventoryStrategy inventoryStrategy, InventoryStrategy inventoryStrategy,
bool isPublished, bool isPublished,
bool isStatic,
bool isHidden,
string mediaResources, string mediaResources,
int displayOrder int displayOrder
) :base(id) ) :base(id)
...@@ -50,6 +56,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -50,6 +56,8 @@ namespace EasyAbp.EShop.Products.Products
DisplayName = displayName; DisplayName = displayName;
InventoryStrategy = inventoryStrategy; InventoryStrategy = inventoryStrategy;
IsPublished = isPublished; IsPublished = isPublished;
IsStatic = isStatic;
IsHidden = isHidden;
MediaResources = mediaResources; MediaResources = mediaResources;
DisplayOrder = displayOrder; DisplayOrder = displayOrder;
ProductAttributes = new List<ProductAttribute>(); ProductAttributes = new List<ProductAttribute>();
......
...@@ -14,7 +14,9 @@ $(function () { ...@@ -14,7 +14,9 @@ $(function () {
autoWidth: false, autoWidth: false,
scrollCollapse: true, scrollCollapse: true,
order: [[1, "asc"]], order: [[1, "asc"]],
ajax: abp.libs.datatables.createAjax(service.getList), ajax: abp.libs.datatables.createAjax(service.getList, function () {
return { showHidden: true }
}),
columnDefs: [ columnDefs: [
{ {
rowAction: { rowAction: {
......
...@@ -53,7 +53,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product ...@@ -53,7 +53,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList(); .Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
Categories = Categories =
(await _categoryAppService.GetListAsync(new PagedAndSortedResultRequestDto (await _categoryAppService.GetListAsync(new GetCategoryListDto
{MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount}))?.Items {MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount}))?.Items
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList(); .Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
......
...@@ -3,6 +3,7 @@ using System.Collections.Generic; ...@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using EasyAbp.EShop.Products.Categories; using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.Categories.Dtos;
using EasyAbp.EShop.Products.ProductDetails; using EasyAbp.EShop.Products.ProductDetails;
using EasyAbp.EShop.Products.ProductDetails.Dtos; using EasyAbp.EShop.Products.ProductDetails.Dtos;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
...@@ -53,7 +54,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product ...@@ -53,7 +54,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList(); .Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
Categories = Categories =
(await _categoryAppService.GetListAsync(new PagedAndSortedResultRequestDto (await _categoryAppService.GetListAsync(new GetCategoryListDto
{MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount}))?.Items {MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount}))?.Items
.Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList(); .Select(dto => new SelectListItem(dto.DisplayName, dto.Id.ToString())).ToList();
......
...@@ -15,7 +15,7 @@ $(function () { ...@@ -15,7 +15,7 @@ $(function () {
scrollCollapse: true, scrollCollapse: true,
order: [[1, "asc"]], order: [[1, "asc"]],
ajax: abp.libs.datatables.createAjax(service.getList, function () { ajax: abp.libs.datatables.createAjax(service.getList, function () {
return { storeId: storeId, categoryId: categoryId } return { storeId: storeId, categoryId: categoryId, showHidden: true }
}), }),
columnDefs: [ columnDefs: [
{ {
......
...@@ -9,13 +9,13 @@ ...@@ -9,13 +9,13 @@
<abp-modal> <abp-modal>
<abp-modal-header title="@L["CreateProductSku"].Value"></abp-modal-header> <abp-modal-header title="@L["CreateProductSku"].Value"></abp-modal-header>
<abp-modal-body> <abp-modal-body>
<abp-input asp-for="StoreId" />
<abp-input asp-for="ProductId" />
<abp-form-content/> <abp-form-content/>
@foreach (var attr in Model.Attributes) @foreach (var attr in Model.Attributes)
{ {
<abp-select asp-for="@Model.SelectedAttributeOptionIdDict[attr.Key]" asp-items="@attr.Value" label="@L["ProductAttribute"].Value - @attr.Key" /> <abp-select asp-for="@Model.SelectedAttributeOptionIdDict[attr.Key]" asp-items="@attr.Value" label="@L["ProductAttribute"].Value - @attr.Key"/>
} }
<abp-input asp-for="StoreId" />
<abp-input asp-for="ProductId" />
</abp-modal-body> </abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> <abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal> </abp-modal>
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
<abp-modal-header title="@L["EditProductSku"].Value"></abp-modal-header> <abp-modal-header title="@L["EditProductSku"].Value"></abp-modal-header>
<abp-modal-body> <abp-modal-body>
<abp-input asp-for="Id" /> <abp-input asp-for="Id" />
<abp-input asp-for="StoreId" />
<abp-input asp-for="ProductId" />
<abp-form-content /> <abp-form-content />
</abp-modal-body> </abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> <abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
......
...@@ -16,9 +16,11 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku ...@@ -16,9 +16,11 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku
[BindProperty(SupportsGet = true)] [BindProperty(SupportsGet = true)]
public Guid Id { get; set; } public Guid Id { get; set; }
[HiddenInput]
[BindProperty(SupportsGet = true)] [BindProperty(SupportsGet = true)]
public Guid StoreId { get; set; } public Guid StoreId { get; set; }
[HiddenInput]
[BindProperty(SupportsGet = true)] [BindProperty(SupportsGet = true)]
public Guid ProductId { get; set; } public Guid ProductId { get; set; }
......
using Microsoft.EntityFrameworkCore.Migrations;
namespace EasyMall.Migrations
{
public partial class AddedIsHiddenAndIsStatic : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsHidden",
table: "ProductsProducts",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsStatic",
table: "ProductsProducts",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsHidden",
table: "ProductsCategories",
nullable: false,
defaultValue: false);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsHidden",
table: "ProductsProducts");
migrationBuilder.DropColumn(
name: "IsStatic",
table: "ProductsProducts");
migrationBuilder.DropColumn(
name: "IsHidden",
table: "ProductsCategories");
}
}
}
...@@ -62,6 +62,9 @@ namespace EasyMall.Migrations ...@@ -62,6 +62,9 @@ namespace EasyMall.Migrations
.HasColumnType("bit") .HasColumnType("bit")
.HasDefaultValue(false); .HasDefaultValue(false);
b.Property<bool>("IsHidden")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime") b.Property<DateTime?>("LastModificationTime")
.HasColumnName("LastModificationTime") .HasColumnName("LastModificationTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
...@@ -358,9 +361,15 @@ namespace EasyMall.Migrations ...@@ -358,9 +361,15 @@ namespace EasyMall.Migrations
.HasColumnType("bit") .HasColumnType("bit")
.HasDefaultValue(false); .HasDefaultValue(false);
b.Property<bool>("IsHidden")
.HasColumnType("bit");
b.Property<bool>("IsPublished") b.Property<bool>("IsPublished")
.HasColumnType("bit"); .HasColumnType("bit");
b.Property<bool>("IsStatic")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime") b.Property<DateTime?>("LastModificationTime")
.HasColumnName("LastModificationTime") .HasColumnName("LastModificationTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment