Browse Source

Implement multi IProductInventoryProvider

pull/87/head
gdlcf88 6 years ago
parent
commit
9fb63638ea
  1. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/CreateUpdateProductDto.cs
  2. 6
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/CreateUpdateProductSkuDto.cs
  3. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductDto.cs
  4. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductSkuDto.cs
  5. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/cs.json
  6. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/en.json
  7. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pl.json
  8. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pt-BR.json
  9. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/sl.json
  10. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/tr.json
  11. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/vi.json
  12. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hans.json
  13. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hant.json
  14. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductInventoryProvider.cs
  15. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductInventoryProvider.cs
  16. 5
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/Product.cs
  17. 31
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs
  18. 5
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductSku.cs
  19. 6
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductViewModel.cs
  20. 5
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/ViewModels/EditProductSkuViewModel.cs
  21. 3837
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200706060054_AddedSpecifiedInventoryProviderName.Designer.cs
  22. 31
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200706060054_AddedSpecifiedInventoryProviderName.cs
  23. 6
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/EShopSampleMigrationsDbContextModelSnapshot.cs

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/CreateUpdateProductDto.cs

@ -41,6 +41,9 @@ namespace EasyAbp.EShop.Products.Products.Dtos
[DisplayName("ProductMediaResources")]
public string MediaResources { get; set; }
[DisplayName("ProductSpecifiedInventoryProviderName")]
public string SpecifiedInventoryProviderName { get; set; }
[DisplayName("ProductIsPublished")]
public bool IsPublished { get; set; }

6
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/CreateUpdateProductSkuDto.cs

@ -27,6 +27,12 @@ namespace EasyAbp.EShop.Products.Products.Dtos
[DefaultValue(99)]
[DisplayName("ProductSkuOrderMaxQuantity")]
public int OrderMaxQuantity { get; set; }
[DisplayName("ProductSkuMediaResources")]
public string MediaResources { get; set; }
[DisplayName("ProductSkuSpecifiedInventoryProviderName")]
public string SpecifiedInventoryProviderName { get; set; }
[DisplayName("ProductSkuProductDetailId")]
public Guid? ProductDetailId { get; set; }

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductDto.cs

@ -20,6 +20,8 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public string MediaResources { get; set; }
public string SpecifiedInventoryProviderName { get; set; }
public int DisplayOrder { get; set; }
public bool IsPublished { get; set; }

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductSkuDto.cs

@ -31,6 +31,8 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public string MediaResources { get; set; }
public string SpecifiedInventoryProviderName { get; set; }
public Guid? ProductDetailId { get; set; }
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/cs.json

@ -1,6 +1,7 @@
{
"culture": "cs",
"texts": {
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -29,6 +30,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -37,6 +39,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -84,7 +87,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/en.json

@ -2,6 +2,7 @@
"culture": "en",
"texts": {
"ManageYourProfile": "Manage your profile",
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -30,6 +31,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -38,6 +40,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -85,7 +88,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pl.json

@ -1,6 +1,7 @@
{
"culture": "pl",
"texts": {
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -29,6 +30,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -37,6 +39,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -84,7 +87,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/pt-BR.json

@ -1,6 +1,7 @@
{
"culture": "pt-BR",
"texts": {
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -29,6 +30,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -37,6 +39,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -84,7 +87,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/sl.json

@ -2,6 +2,7 @@
"culture": "sl",
"texts": {
"ManageYourProfile": "Upravljajte svojim profilom",
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -30,6 +31,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -38,6 +40,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -85,7 +88,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/tr.json

@ -2,6 +2,7 @@
"culture": "tr",
"texts": {
"ManageYourProfile": "Profil y�netimi",
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -30,6 +31,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -38,6 +40,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -85,7 +88,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/vi.json

@ -1,6 +1,7 @@
{
"culture": "vi",
"texts": {
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -29,6 +30,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -37,6 +39,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -84,7 +87,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hans.json

@ -2,6 +2,7 @@
"culture": "zh-Hans",
"texts": {
"ManageYourProfile": "管理个人资料",
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -30,6 +31,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -38,6 +40,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -85,7 +88,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hant.json

@ -2,6 +2,7 @@
"culture": "zh-Hant",
"texts": {
"ManageYourProfile": "管理個人資料",
"KeepEmptyIfDoNotKnow": "KeepEmptyIfDoNotKnow",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductStore": "ProductStore",
@ -30,6 +31,7 @@
"ProductSkuOrderMinQuantity": "ProductSkuOrderMinQuantity",
"ProductSkuOrderMaxQuantity": "ProductSkuOrderMaxQuantity",
"ProductSkuMediaResources": "ProductSkuMediaResources",
"ProductSkuSpecifiedInventoryProviderName": "ProductSkuSpecifiedInventoryProviderName",
"ProductSkuProductDetailId": "ProductSkuProductDetailId",
"ProductSkuContentDescription": "ProductSkuContentDescription",
"CreateProductSku": "CreateProductSku",
@ -38,6 +40,7 @@
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"ProductSpecifiedInventoryProviderName": "ProductSpecifiedInventoryProviderName",
"ProductAttributeDisplayName": "ProductAttributeDisplayName",
"ProductAttributeDescription": "ProductAttributeDescription",
"ProductAttributeDisplayOrder": "ProductAttributeDisplayOrder",
@ -85,7 +88,6 @@
"IncreaseInventory": "Increase",
"DecreaseInventory": "Decrease",
"ProductInventoryInventory": "ProductInventoryInventory",
"ProductInventoryChangeType": "ProductInventoryChangeType",
"ChangeProductInventory": "ChangeProductInventory"
}
}

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductInventoryProvider.cs

@ -11,6 +11,8 @@ namespace EasyAbp.EShop.Products.Products
{
public class DefaultProductInventoryProvider : IProductInventoryProvider, ITransientDependency
{
public string ProviderName { get; } = "Default";
// Todo: should use IProductInventoryStore.
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IDistributedEventBus _distributedEventBus;

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductInventoryProvider.cs

@ -6,6 +6,8 @@ namespace EasyAbp.EShop.Products.Products
{
public interface IProductInventoryProvider
{
string ProviderName { get; }
Task<int> GetInventoryAsync(Product product, ProductSku productSku, Guid storeId);
Task<Dictionary<Guid, int>> GetInventoryDictionaryAsync(Product product, Guid storeId);

5
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/Product.cs

@ -23,6 +23,9 @@ namespace EasyAbp.EShop.Products.Products
[CanBeNull]
public virtual string MediaResources { get; protected set; }
[CanBeNull]
public virtual string SpecifiedInventoryProviderName { get; protected set; }
public virtual int DisplayOrder { get; protected set; }
public virtual bool IsPublished { get; protected set; }
@ -50,6 +53,7 @@ namespace EasyAbp.EShop.Products.Products
bool isStatic,
bool isHidden,
[CanBeNull] string mediaResources,
[CanBeNull] string specifiedInventoryProviderName,
int displayOrder
) : base(id)
{
@ -62,6 +66,7 @@ namespace EasyAbp.EShop.Products.Products
IsStatic = isStatic;
IsHidden = isHidden;
MediaResources = mediaResources;
SpecifiedInventoryProviderName = specifiedInventoryProviderName;
DisplayOrder = displayOrder;
ProductAttributes = new List<ProductAttribute>();

31
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs

@ -11,23 +11,22 @@ namespace EasyAbp.EShop.Products.Products
{
public class ProductManager : DomainService, IProductManager
{
protected Dictionary<string, IProductInventoryProvider> InventoryProviders;
private readonly IProductRepository _productRepository;
private readonly IProductStoreRepository _productStoreRepository;
private readonly IProductCategoryRepository _productCategoryRepository;
private readonly IProductInventoryProvider _productInventoryProvider;
private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer;
public ProductManager(
IProductRepository productRepository,
IProductStoreRepository productStoreRepository,
IProductCategoryRepository productCategoryRepository,
IProductInventoryProvider productInventoryProvider,
IAttributeOptionIdsSerializer attributeOptionIdsSerializer)
{
_productRepository = productRepository;
_productStoreRepository = productStoreRepository;
_productCategoryRepository = productCategoryRepository;
_productInventoryProvider = productInventoryProvider;
_attributeOptionIdsSerializer = attributeOptionIdsSerializer;
}
@ -185,24 +184,42 @@ namespace EasyAbp.EShop.Products.Products
public virtual async Task<bool> IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity)
{
var inventory = await _productInventoryProvider.GetInventoryAsync(product, productSku, storeId);
var inventory = await GetInventoryProviderOrDefault(product, productSku)
.GetInventoryAsync(product, productSku, storeId);
return product.InventoryStrategy == InventoryStrategy.NoNeed || inventory - quantity >= 0;
}
public virtual async Task<int> GetInventoryAsync(Product product, ProductSku productSku, Guid storeId)
{
return await _productInventoryProvider.GetInventoryAsync(product, productSku, storeId);
return await GetInventoryProviderOrDefault(product, productSku)
.GetInventoryAsync(product, productSku, storeId);
}
public virtual async Task<bool> TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity)
{
return await _productInventoryProvider.TryIncreaseInventoryAsync(product, productSku, storeId, quantity);
return await GetInventoryProviderOrDefault(product, productSku)
.TryIncreaseInventoryAsync(product, productSku, storeId, quantity);
}
public virtual async Task<bool> TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity)
{
return await _productInventoryProvider.TryReduceInventoryAsync(product, productSku, storeId, quantity);
return await GetInventoryProviderOrDefault(product, productSku)
.TryReduceInventoryAsync(product, productSku, storeId, quantity);
}
protected virtual IProductInventoryProvider GetInventoryProviderOrDefault(Product product, ProductSku productSku)
{
var providerName = productSku.SpecifiedInventoryProviderName.IsNullOrWhiteSpace()
? productSku.SpecifiedInventoryProviderName
: product.SpecifiedInventoryProviderName.IsNullOrWhiteSpace()
? product.SpecifiedInventoryProviderName
: "Default";
InventoryProviders ??= ServiceProvider.GetServices<IProductInventoryProvider>()
.ToDictionary(p => p.ProviderName, p => p);
return InventoryProviders.GetOrDefault(providerName) ?? InventoryProviders["Default"];
}
public virtual async Task<decimal> GetDiscountedPriceAsync(Product product, ProductSku productSku, Guid storeId)

5
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductSku.cs

@ -26,6 +26,9 @@ namespace EasyAbp.EShop.Products.Products
[CanBeNull]
public virtual string MediaResources { get; protected set; }
[CanBeNull]
public virtual string SpecifiedInventoryProviderName { get; protected set; }
public Guid? ProductDetailId { get; set; }
protected ProductSku() {}
@ -40,6 +43,7 @@ namespace EasyAbp.EShop.Products.Products
int orderMinQuantity,
int orderMaxQuantity,
[CanBeNull] string mediaResources,
[CanBeNull] string specifiedInventoryProviderName,
Guid? productDetailId) : base(id)
{
SerializedAttributeOptionIds = serializedAttributeOptionIds;
@ -50,6 +54,7 @@ namespace EasyAbp.EShop.Products.Products
OrderMinQuantity = orderMinQuantity;
OrderMaxQuantity = orderMaxQuantity;
MediaResources = mediaResources;
SpecifiedInventoryProviderName = specifiedInventoryProviderName;
ProductDetailId = productDetailId;
}

6
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductViewModel.cs

@ -48,11 +48,15 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
public InventoryStrategy InventoryStrategy { get; set; }
[Display(Name = "ProductDisplayOrder")]
public int DisplayOrder { get; set; } = 0;
public int DisplayOrder { get; set; }
[Display(Name = "ProductMediaResources")]
public string MediaResources { get; set; }
[Placeholder("KeepEmptyIfDoNotKnow")]
[Display(Name = "ProductSpecifiedInventoryProviderName")]
public string SpecifiedInventoryProviderName { get; set; }
[Display(Name = "ProductIsPublished")]
public bool IsPublished { get; set; }
}

5
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/ProductSku/ViewModels/EditProductSkuViewModel.cs

@ -2,6 +2,7 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku.ViewModels
{
@ -34,6 +35,10 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.ProductSku.Vi
[Display(Name = "ProductSkuMediaResources")]
public string MediaResources { get; set; }
[Placeholder("KeepEmptyIfDoNotKnow")]
[Display(Name = "ProductSkuSpecifiedInventoryProviderName")]
public string SpecifiedInventoryProviderName { get; set; }
[HiddenInput]
[Display(Name = "ProductSkuProductDetailId")]
public Guid? ProductDetailId { get; set; }

3837
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200706060054_AddedSpecifiedInventoryProviderName.Designer.cs

File diff suppressed because it is too large

31
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200706060054_AddedSpecifiedInventoryProviderName.cs

@ -0,0 +1,31 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace EShopSample.Migrations
{
public partial class AddedSpecifiedInventoryProviderName : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "SpecifiedInventoryProviderName",
table: "EShopProductsProductSkus",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "SpecifiedInventoryProviderName",
table: "EShopProductsProducts",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "SpecifiedInventoryProviderName",
table: "EShopProductsProductSkus");
migrationBuilder.DropColumn(
name: "SpecifiedInventoryProviderName",
table: "EShopProductsProducts");
}
}
}

6
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/EShopSampleMigrationsDbContextModelSnapshot.cs

@ -1129,6 +1129,9 @@ namespace EShopSample.Migrations
b.Property<Guid>("ProductTypeId")
.HasColumnType("uniqueidentifier");
b.Property<string>("SpecifiedInventoryProviderName")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("EShopProductsProducts");
@ -1310,6 +1313,9 @@ namespace EShopSample.Migrations
b.Property<string>("SerializedAttributeOptionIds")
.HasColumnType("nvarchar(max)");
b.Property<string>("SpecifiedInventoryProviderName")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.HasIndex("ProductId");

Loading…
Cancel
Save