Browse Source

Merge pull request #241 from EasyAbp/refactor-interfaces

Make entity interfaces include sub-entities
pull/242/head
Super 3 years ago
committed by GitHub
parent
commit
6b0ffa1989
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Directory.Build.props
  2. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/OrderDto.cs
  3. 10
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/OrderExtraFeeDto.cs
  4. 43
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/IOrder.cs
  5. 20
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/IOrderExtraFee.cs
  6. 9
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/IOrderLine.cs
  7. 6
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/OrderEto.cs
  8. 18
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/OrderExtraFeeEto.cs
  9. 11
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs
  10. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderExtraFee.cs
  11. 8
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs
  12. 1
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/OrdersDomainAutoMapperProfile.cs
  13. 13
      modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application.Contracts/EasyAbp/EShop/Payments/Payments/Dtos/PaymentDto.cs
  14. 11
      modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application.Contracts/EasyAbp/EShop/Payments/Refunds/Dtos/RefundDto.cs
  15. 5
      modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain.Shared/EasyAbp/EShop/Payments/Payments/EShopPaymentEto.cs
  16. 21
      modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain.Shared/EasyAbp/EShop/Payments/Refunds/EShopRefundEto.cs
  17. 28
      modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain/EasyAbp/EShop/Payments/Payments/Payment.cs
  18. 24
      modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain/EasyAbp/EShop/Payments/Refunds/Refund.cs
  19. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductAttributeDto.cs
  20. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductAttributeOptionDto.cs
  21. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductDto.cs
  22. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductSkuDto.cs
  23. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductViewDto.cs
  24. 24
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs
  25. 8
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs
  26. 9
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IHasAttributeOptionIds.cs
  27. 31
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProduct.cs
  28. 12
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductAttribute.cs
  29. 9
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductAttributeOption.cs
  30. 35
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductBase.cs
  31. 20
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductSku.cs
  32. 7
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductAttributeEto.cs
  33. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductEto.cs
  34. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductSkuEto.cs
  35. 39
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/AttributeOptionIdsSerializer.cs
  36. 15
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IAttributeOptionIdsSerializer.cs
  37. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/Product.cs
  38. 13
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductAttribute.cs
  39. 10
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductAttributeOption.cs
  40. 26
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs
  41. 23
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductSku.cs
  42. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductView.cs
  43. 17
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/AttributeOptionIds/AttributeOptionIdsValueComparer.cs
  44. 15
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/AttributeOptionIds/AttributeOptionIdsValueConverter.cs
  45. 20
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/EShopProductsEntityTypeBuilderExtensions.cs
  46. 1
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/ProductsDbContextModelCreatingExtensions.cs
  47. 20
      modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.Domain.Tests/Products/ProductDomainTests.cs
  48. 18
      modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.TestBase/ProductsTestDataBuilder.cs
  49. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs
  50. 7
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs
  51. 20
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs
  52. 50
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs
  53. 22
      samples/EShopSample/aspnet-core/src/EShopSample.Domain/Data/SampleDataSeedContributor.cs
  54. 6361
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230328174008_RenamedToAttributeOptionIds.Designer.cs
  55. 28
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230328174008_RenamedToAttributeOptionIds.cs
  56. 18
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/EShopSampleDbContextModelSnapshot.cs

2
Directory.Build.props

@ -3,7 +3,7 @@
<AbpVersion>7.1.0</AbpVersion>
<EasyAbpAbpTreesModuleVersion>2.10.0</EasyAbpAbpTreesModuleVersion>
<EasyAbpPaymentServiceModuleVersion>2.4.0</EasyAbpPaymentServiceModuleVersion>
<EasyAbpPaymentServiceModuleVersion>2.5.0</EasyAbpPaymentServiceModuleVersion>
<EasyAbpAbpTagHelperPlusModuleVersion>1.4.0</EasyAbpAbpTagHelperPlusModuleVersion>
<EasyAbpBookingServiceModuleVersion>0.5.0</EasyAbpBookingServiceModuleVersion>
<DaprSdkVersion>1.9.0</DaprSdkVersion>

2
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/OrderDto.cs

@ -47,8 +47,10 @@ namespace EasyAbp.EShop.Orders.Orders.Dtos
public DateTime? PaymentExpiration { get; set; }
IEnumerable<IOrderLine> IOrder.OrderLines => OrderLines;
public List<OrderLineDto> OrderLines { get; set; }
IEnumerable<IOrderExtraFee> IOrder.OrderExtraFees => OrderExtraFees;
public List<OrderExtraFeeDto> OrderExtraFees { get; set; }
}
}

10
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/OrderExtraFeeDto.cs

@ -2,12 +2,16 @@
namespace EasyAbp.EShop.Orders.Orders.Dtos
{
public class OrderExtraFeeDto
public class OrderExtraFeeDto : IOrderExtraFee
{
public Guid OrderId { get; }
public string Name { get; set; }
public string Key { get; set; }
public decimal Fee { get; set; }
public decimal RefundAmount { get; }
}
}

43
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/IOrder.cs

@ -1,50 +1,61 @@
using System;
using System.Collections.Generic;
using EasyAbp.EShop.Stores.Stores;
using JetBrains.Annotations;
using Volo.Abp.Data;
namespace EasyAbp.EShop.Orders.Orders
{
public interface IOrder : IMultiStore, IHasExtraProperties
{
[NotNull]
string OrderNumber { get; }
Guid CustomerUserId { get; }
OrderStatus OrderStatus { get; }
[NotNull]
string Currency { get; }
decimal ProductTotalPrice { get; }
decimal TotalDiscount { get; }
decimal TotalPrice { get; }
/// <summary>
/// ActualTotalPrice = TotalPrice - TotalDiscount
/// </summary>
decimal ActualTotalPrice { get; }
decimal RefundAmount { get; }
[CanBeNull]
string CustomerRemark { get; }
[CanBeNull]
string StaffRemark { get; }
Guid? PaymentId { get; }
DateTime? PaidTime { get; }
DateTime? CompletionTime { get; }
DateTime? CanceledTime { get; }
[CanBeNull]
string CancellationReason { get; }
DateTime? ReducedInventoryAfterPlacingTime { get; }
DateTime? ReducedInventoryAfterPaymentTime { get; }
DateTime? PaymentExpiration { get; }
IEnumerable<IOrderLine> OrderLines { get; }
IEnumerable<IOrderExtraFee> OrderExtraFees { get; }
}
}

20
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/IOrderExtraFee.cs

@ -0,0 +1,20 @@
using System;
using JetBrains.Annotations;
namespace EasyAbp.EShop.Orders.Orders
{
public interface IOrderExtraFee
{
Guid OrderId { get; }
[NotNull]
string Name { get; }
[CanBeNull]
string Key { get; }
decimal Fee { get; }
decimal RefundAmount { get; }
}
}

9
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/IOrderLine.cs

@ -1,5 +1,6 @@
using System;
using EasyAbp.EShop.Products.Products;
using JetBrains.Annotations;
using Volo.Abp.Data;
namespace EasyAbp.EShop.Orders.Orders
@ -16,12 +17,16 @@ namespace EasyAbp.EShop.Orders.Orders
DateTime? ProductDetailModificationTime { get; }
[NotNull]
string ProductGroupName { get; }
[NotNull]
string ProductGroupDisplayName { get; }
[CanBeNull]
string ProductUniqueName { get; }
[NotNull]
string ProductDisplayName { get; }
/// <summary>
@ -30,12 +35,16 @@ namespace EasyAbp.EShop.Orders.Orders
/// </summary>
InventoryStrategy? ProductInventoryStrategy { get; }
[CanBeNull]
string SkuName { get; }
[CanBeNull]
string SkuDescription { get; }
[CanBeNull]
string MediaResources { get; }
[NotNull]
string Currency { get; }
decimal UnitPrice { get; }

6
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/OrderEto.cs

@ -54,8 +54,12 @@ namespace EasyAbp.EShop.Orders.Orders
public DateTime? PaymentExpiration { get; set; }
IEnumerable<IOrderLine> IOrder.OrderLines => OrderLines;
public List<OrderLineEto> OrderLines { get; set; }
IEnumerable<IOrderExtraFee> IOrder.OrderExtraFees => OrderExtraFees;
public List<OrderExtraFeeEto> OrderExtraFees { get; set; }
public DateTime CreationTime { get; set; }
public Guid? CreatorId { get; set; }

18
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain.Shared/EasyAbp/EShop/Orders/Orders/OrderExtraFeeEto.cs

@ -0,0 +1,18 @@
using System;
namespace EasyAbp.EShop.Orders.Orders
{
[Serializable]
public class OrderExtraFeeEto : IOrderExtraFee
{
public Guid OrderId { get; set; }
public string Name { get; set; }
public string Key { get; set; }
public decimal Fee { get; set; }
public decimal RefundAmount { get; set; }
}
}

11
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs

@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using EasyAbp.EShop.Stores.Stores;
using System.Linq;
using JetBrains.Annotations;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
@ -15,14 +13,12 @@ namespace EasyAbp.EShop.Orders.Orders
public virtual Guid StoreId { get; protected set; }
[NotNull]
public virtual string OrderNumber { get; protected set; }
public virtual Guid CustomerUserId { get; protected set; }
public virtual OrderStatus OrderStatus { get; protected set; }
[NotNull]
public virtual string Currency { get; protected set; }
public virtual decimal ProductTotalPrice { get; protected set; }
@ -35,10 +31,8 @@ namespace EasyAbp.EShop.Orders.Orders
public virtual decimal RefundAmount { get; protected set; }
[CanBeNull]
public virtual string CustomerRemark { get; protected set; }
[CanBeNull]
public virtual string StaffRemark { get; protected set; }
public virtual Guid? PaymentId { get; protected set; }
@ -49,7 +43,6 @@ namespace EasyAbp.EShop.Orders.Orders
public virtual DateTime? CanceledTime { get; protected set; }
[CanBeNull]
public virtual string CancellationReason { get; protected set; }
public virtual DateTime? ReducedInventoryAfterPlacingTime { get; protected set; }
@ -57,9 +50,11 @@ namespace EasyAbp.EShop.Orders.Orders
public virtual DateTime? ReducedInventoryAfterPaymentTime { get; protected set; }
public virtual DateTime? PaymentExpiration { get; protected set; }
IEnumerable<IOrderLine> IOrder.OrderLines => OrderLines;
public virtual List<OrderLine> OrderLines { get; protected set; }
IEnumerable<IOrderExtraFee> IOrder.OrderExtraFees => OrderExtraFees;
public virtual List<OrderExtraFee> OrderExtraFees { get; protected set; }
protected Order()

2
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderExtraFee.cs

@ -4,7 +4,7 @@ using Volo.Abp.Domain.Entities;
namespace EasyAbp.EShop.Orders.Orders
{
public class OrderExtraFee : Entity
public class OrderExtraFee : Entity, IOrderExtraFee
{
public virtual Guid OrderId { get; protected set; }

8
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs

@ -19,30 +19,22 @@ namespace EasyAbp.EShop.Orders.Orders
public virtual DateTime? ProductDetailModificationTime { get; protected set; }
[NotNull]
public virtual string ProductGroupName { get; protected set; }
[NotNull]
public virtual string ProductGroupDisplayName { get; protected set; }
[CanBeNull]
public virtual string ProductUniqueName { get; protected set; }
[NotNull]
public virtual string ProductDisplayName { get; protected set; }
public virtual InventoryStrategy? ProductInventoryStrategy { get; protected set; }
[CanBeNull]
public virtual string SkuName { get; protected set; }
[CanBeNull]
public virtual string SkuDescription { get; protected set; }
[CanBeNull]
public virtual string MediaResources { get; protected set; }
[NotNull]
public virtual string Currency { get; protected set; }
public virtual decimal UnitPrice { get; protected set; }

1
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/OrdersDomainAutoMapperProfile.cs

@ -12,6 +12,7 @@ namespace EasyAbp.EShop.Orders
* into multiple profile classes for a better organization. */
CreateMap<Order, OrderEto>();
CreateMap<OrderLine, OrderLineEto>();
CreateMap<OrderExtraFee, OrderExtraFeeEto>();
}
}
}

13
modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application.Contracts/EasyAbp/EShop/Payments/Payments/Dtos/PaymentDto.cs

@ -11,9 +11,9 @@ namespace EasyAbp.EShop.Payments.Payments.Dtos
#region Base properties
public Guid UserId { get; set; }
public string PaymentMethod { get; set; }
public string PayeeAccount { get; set; }
public string ExternalTradingCode { get; set; }
@ -27,15 +27,16 @@ namespace EasyAbp.EShop.Payments.Payments.Dtos
public decimal ActualPaymentAmount { get; set; }
public decimal RefundAmount { get; set; }
public decimal PendingRefundAmount { get; set; }
public DateTime? CompletionTime { get; set; }
public DateTime? CanceledTime { get; set; }
#endregion
IEnumerable<IPaymentItem> IPayment.PaymentItems => PaymentItems;
public List<PaymentItemDto> PaymentItems { get; set; }
}
}

11
modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Application.Contracts/EasyAbp/EShop/Payments/Refunds/Dtos/RefundDto.cs

@ -19,19 +19,20 @@ namespace EasyAbp.EShop.Payments.Refunds.Dtos
public string Currency { get; set; }
public decimal RefundAmount { get; set; }
public string DisplayReason { get; set; }
public string CustomerRemark { get; set; }
public string StaffRemark { get; set; }
public DateTime? CompletedTime { get; set; }
public DateTime? CanceledTime { get; set; }
#endregion
IEnumerable<IRefundItem> IRefund.RefundItems => RefundItems;
public List<RefundItemDto> RefundItems { get; set; }
}
}

5
modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain.Shared/EasyAbp/EShop/Payments/Payments/EShopPaymentEto.cs

@ -14,7 +14,7 @@ namespace EasyAbp.EShop.Payments.Payments
public Guid Id { get; set; }
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public string PaymentMethod { get; set; }
@ -41,6 +41,7 @@ namespace EasyAbp.EShop.Payments.Payments
#endregion
public List<EShopPaymentItemEto> PaymentItems { get; set; } = new List<EShopPaymentItemEto>();
IEnumerable<IPaymentItem> IPayment.PaymentItems => PaymentItems;
public List<EShopPaymentItemEto> PaymentItems { get; set; } = new();
}
}

21
modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain.Shared/EasyAbp/EShop/Payments/Refunds/EShopRefundEto.cs

@ -16,27 +16,28 @@ namespace EasyAbp.EShop.Payments.Refunds
public Guid? TenantId { get; set; }
public Guid PaymentId { get; set; }
public string RefundPaymentMethod { get; set; }
public string ExternalTradingCode { get; set; }
public string Currency { get; set; }
public decimal RefundAmount { get; set; }
public string DisplayReason { get; set; }
public string CustomerRemark { get; set; }
public string StaffRemark { get; set; }
public DateTime? CompletedTime { get; set; }
public DateTime? CanceledTime { get; set; }
#endregion
public List<EShopRefundItemEto> RefundItems { get; set; } = new List<EShopRefundItemEto>();
IEnumerable<IRefundItem> IRefund.RefundItems => RefundItems;
public List<EShopRefundItemEto> RefundItems { get; set; } = new();
}
}

28
modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain/EasyAbp/EShop/Payments/Payments/Payment.cs

@ -10,44 +10,44 @@ namespace EasyAbp.EShop.Payments.Payments
public class Payment : FullAuditedAggregateRoot<Guid>, IPayment, IMultiTenant
{
#region Base properties
public virtual Guid? TenantId { get; protected set; }
public virtual Guid UserId { get; protected set; }
[NotNull]
public virtual string PaymentMethod { get; protected set; }
[CanBeNull]
public virtual string PayeeAccount { get; protected set; }
[CanBeNull]
public virtual string ExternalTradingCode { get; protected set; }
[NotNull]
public virtual string Currency { get; protected set; }
public virtual decimal OriginalPaymentAmount { get; protected set; }
public virtual decimal PaymentDiscount { get; protected set; }
public virtual decimal ActualPaymentAmount { get; protected set; }
public virtual decimal RefundAmount { get; protected set; }
public virtual decimal PendingRefundAmount { get; protected set; }
public virtual DateTime? CompletionTime { get; protected set; }
public virtual DateTime? CanceledTime { get; protected set; }
IEnumerable<IPaymentItem> IPayment.PaymentItems => PaymentItems;
public virtual List<PaymentItem> PaymentItems { get; protected set; }
#endregion
protected Payment()
{
}
public void SetPaymentItems(List<PaymentItem> paymentItems)

24
modules/EasyAbp.EShop.Payments/src/EasyAbp.EShop.Payments.Domain/EasyAbp/EShop/Payments/Refunds/Refund.cs

@ -12,41 +12,41 @@ namespace EasyAbp.EShop.Payments.Refunds
#region Base properties
public virtual Guid? TenantId { get; protected set; }
public virtual Guid PaymentId { get; protected set; }
[NotNull]
public virtual string RefundPaymentMethod { get; protected set; }
[NotNull]
public virtual string ExternalTradingCode { get; protected set; }
[NotNull]
public virtual string Currency { get; protected set; }
public virtual decimal RefundAmount { get; protected set; }
public virtual string DisplayReason { get; protected set; }
[CanBeNull]
public virtual string CustomerRemark { get; protected set; }
[CanBeNull]
public virtual string StaffRemark { get; protected set; }
public virtual DateTime? CompletedTime { get; protected set; }
public virtual DateTime? CanceledTime { get; protected set; }
#endregion
IEnumerable<IRefundItem> IRefund.RefundItems => RefundItems;
public virtual List<RefundItem> RefundItems { get; protected set; }
protected Refund()
{
}
public void SetRefundItems(List<RefundItem> refundItems)
{
RefundItems = refundItems;

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

@ -6,7 +6,7 @@ using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
[Serializable]
public class ProductAttributeDto : ExtensibleFullAuditedEntityDto<Guid>
public class ProductAttributeDto : ExtensibleFullAuditedEntityDto<Guid>, IProductAttribute
{
[Required]
public string DisplayName { get; set; }
@ -15,6 +15,7 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public int DisplayOrder { get; set; }
IEnumerable<IProductAttributeOption> IProductAttribute.ProductAttributeOptions => ProductAttributeOptions;
public List<ProductAttributeOptionDto> ProductAttributeOptions { get; set; }
}
}

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

@ -5,7 +5,7 @@ using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
[Serializable]
public class ProductAttributeOptionDto : ExtensibleFullAuditedEntityDto<Guid>
public class ProductAttributeOptionDto : ExtensibleFullAuditedEntityDto<Guid>, IProductAttributeOption
{
[Required]
public string DisplayName { get; set; }

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

@ -6,7 +6,7 @@ using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
[Serializable]
public class ProductDto : ExtensibleFullAuditedEntityDto<Guid>
public class ProductDto : ExtensibleFullAuditedEntityDto<Guid>, IProduct
{
public Guid StoreId { get; set; }
@ -44,8 +44,10 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public decimal? MaximumPrice { get; set; }
IEnumerable<IProductAttribute> IProduct.ProductAttributes => ProductAttributes;
public List<ProductAttributeDto> ProductAttributes { get; set; }
IEnumerable<IProductSku> IProduct.ProductSkus => ProductSkus;
public List<ProductSkuDto> ProductSkus { get; set; }
public ProductSkuDto GetSkuById(Guid skuId)

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

@ -6,10 +6,9 @@ using Volo.Abp.Data;
namespace EasyAbp.EShop.Products.Products.Dtos
{
[Serializable]
public class ProductSkuDto : ExtensibleFullAuditedEntityDto<Guid>
public class ProductSkuDto : ExtensibleFullAuditedEntityDto<Guid>, IProductSku
{
public List<Guid> AttributeOptionIds { get; set; }
public string Name { get; set; }
public string Currency { get; set; }

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

@ -1,11 +1,10 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
[Serializable]
public class ProductViewDto : ExtensibleCreationAuditedEntityDto<Guid>
public class ProductViewDto : ExtensibleCreationAuditedEntityDto<Guid>, IProductBase
{
public Guid StoreId { get; set; }

24
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs

@ -32,7 +32,6 @@ namespace EasyAbp.EShop.Products.Products
private readonly EShopProductsOptions _options;
private readonly IProductInventoryProviderResolver _productInventoryProviderResolver;
private readonly IProductViewCacheKeyProvider _productViewCacheKeyProvider;
private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer;
private readonly IProductRepository _repository;
public ProductAppService(
@ -41,7 +40,6 @@ namespace EasyAbp.EShop.Products.Products
IDistributedCache<ProductViewCacheItem> cache,
IProductInventoryProviderResolver productInventoryProviderResolver,
IProductViewCacheKeyProvider productViewCacheKeyProvider,
IAttributeOptionIdsSerializer attributeOptionIdsSerializer,
IProductRepository repository) : base(repository)
{
_productManager = productManager;
@ -49,7 +47,6 @@ namespace EasyAbp.EShop.Products.Products
_options = options.Value;
_productInventoryProviderResolver = productInventoryProviderResolver;
_productViewCacheKeyProvider = productViewCacheKeyProvider;
_attributeOptionIdsSerializer = attributeOptionIdsSerializer;
_repository = repository;
}
@ -127,21 +124,11 @@ namespace EasyAbp.EShop.Products.Products
return dto;
}
protected virtual async Task UpdateProductAttributesAsync(Product product, CreateUpdateProductDto input)
protected virtual Task UpdateProductAttributesAsync(Product product, CreateUpdateProductDto input)
{
var isProductSkusEmpty = product.ProductSkus.IsNullOrEmpty();
var usedAttributeOptionIds = new HashSet<Guid>();
foreach (var serializedAttributeOptionIds in product.ProductSkus.Select(sku =>
sku.SerializedAttributeOptionIds))
{
foreach (var attributeOptionId in await _attributeOptionIdsSerializer.DeserializeAsync(
serializedAttributeOptionIds))
{
usedAttributeOptionIds.Add(attributeOptionId);
}
}
var usedAttributeOptionIds = new HashSet<Guid>(product.ProductSkus.SelectMany(x => x.AttributeOptionIds));
foreach (var attributeDto in input.ProductAttributes)
{
@ -198,6 +185,7 @@ namespace EasyAbp.EShop.Products.Products
}
product.ProductAttributes.RemoveAll(a => removedAttributeNames.Contains(a.DisplayName));
return Task.CompletedTask;
}
public override async Task<ProductDto> GetAsync(Guid id)
@ -528,11 +516,11 @@ namespace EasyAbp.EShop.Products.Products
return Task.CompletedTask;
}
protected virtual async Task<ProductSku> MapToProductSkuAsync(CreateProductSkuDto createInput)
protected virtual Task<ProductSku> MapToProductSkuAsync(CreateProductSkuDto createInput)
{
var entity = new ProductSku(
GuidGenerator.Create(),
await _attributeOptionIdsSerializer.SerializeAsync(createInput.AttributeOptionIds),
createInput.AttributeOptionIds,
createInput.Name,
createInput.Currency,
createInput.OriginalPrice,
@ -546,7 +534,7 @@ namespace EasyAbp.EShop.Products.Products
createInput.MapExtraPropertiesTo(entity);
return entity;
return Task.FromResult(entity);
}
protected virtual Task MapToProductSkuAsync(UpdateProductSkuDto updateInput, ProductSku entity)

8
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs

@ -19,7 +19,7 @@ namespace EasyAbp.EShop.Products
{
public class ProductsApplicationAutoMapperProfile : Profile, ISingletonDependency
{
public ProductsApplicationAutoMapperProfile(IAttributeOptionIdsSerializer attributeOptionIdsSerializer)
public ProductsApplicationAutoMapperProfile()
{
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
@ -33,14 +33,10 @@ namespace EasyAbp.EShop.Products
CreateMap<ProductAttribute, ProductAttributeDto>();
CreateMap<ProductAttributeOption, ProductAttributeOptionDto>();
CreateMap<ProductSku, ProductSkuDto>()
.ForSourceMember(entity => entity.SerializedAttributeOptionIds, opt => opt.DoNotValidate())
.Ignore(dto => dto.AttributeOptionIds)
.Ignore(dto => dto.Price)
.Ignore(dto => dto.DiscountedPrice)
.Ignore(dto => dto.Inventory)
.Ignore(dto => dto.Sold)
.AfterMap(async (src, dest) => dest.AttributeOptionIds =
(await attributeOptionIdsSerializer.DeserializeAsync(src.SerializedAttributeOptionIds)).ToList());
.Ignore(dto => dto.Sold);
CreateMap<CreateUpdateProductDetailDto, ProductDetail>(MemberList.Source)
.ForSourceMember(dto => dto.StoreId, opt => opt.DoNotValidate());
CreateMap<CreateUpdateProductAttributeDto, ProductAttribute>(MemberList.Source);

9
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IHasAttributeOptionIds.cs

@ -0,0 +1,9 @@
using System;
using System.Collections.Generic;
namespace EasyAbp.EShop.Products.Products;
public interface IHasAttributeOptionIds
{
List<Guid> AttributeOptionIds { get; }
}

31
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProduct.cs

@ -1,34 +1,11 @@
using System;
using EasyAbp.EShop.Stores.Stores;
using JetBrains.Annotations;
using Volo.Abp.Data;
using System.Collections.Generic;
namespace EasyAbp.EShop.Products.Products
{
public interface IProduct : IHasExtraProperties, IMultiStore
public interface IProduct : IProductBase
{
string ProductGroupName { get; }
IEnumerable<IProductAttribute> ProductAttributes { get; }
Guid? ProductDetailId { get; }
string UniqueName { get; }
string DisplayName { get; }
string Overview { get; }
InventoryStrategy InventoryStrategy { get; }
[CanBeNull] string InventoryProviderName { get; }
string MediaResources { get; }
int DisplayOrder { get; }
bool IsPublished { get; }
bool IsStatic { get; }
bool IsHidden { get; }
IEnumerable<IProductSku> ProductSkus { get; }
}
}

12
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductAttribute.cs

@ -1,13 +1,19 @@
using Volo.Abp.Data;
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Data;
namespace EasyAbp.EShop.Products.Products
{
public interface IProductAttribute : IHasExtraProperties
{
[NotNull]
string DisplayName { get; }
[CanBeNull]
string Description { get; }
int DisplayOrder { get; }
IEnumerable<IProductAttributeOption> ProductAttributeOptions { get; }
}
}

9
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductAttributeOption.cs

@ -1,13 +1,16 @@
using Volo.Abp.Data;
using JetBrains.Annotations;
using Volo.Abp.Data;
namespace EasyAbp.EShop.Products.Products
{
public interface IProductAttributeOption : IHasExtraProperties
{
[NotNull]
string DisplayName { get; }
[CanBeNull]
string Description { get; }
int DisplayOrder { get; }
}
}

35
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductBase.cs

@ -0,0 +1,35 @@
using System;
using EasyAbp.EShop.Stores.Stores;
using JetBrains.Annotations;
using Volo.Abp.Data;
namespace EasyAbp.EShop.Products.Products
{
public interface IProductBase : IHasExtraProperties, IMultiStore
{
string ProductGroupName { get; }
Guid? ProductDetailId { get; }
string UniqueName { get; }
string DisplayName { get; }
string Overview { get; }
InventoryStrategy InventoryStrategy { get; }
[CanBeNull]
string InventoryProviderName { get; }
string MediaResources { get; }
int DisplayOrder { get; }
bool IsPublished { get; }
bool IsStatic { get; }
bool IsHidden { get; }
}
}

20
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProductSku.cs

@ -1,26 +1,28 @@
using System;
using JetBrains.Annotations;
using Volo.Abp.Data;
namespace EasyAbp.EShop.Products.Products
{
public interface IProductSku : IHasExtraProperties
public interface IProductSku : IHasAttributeOptionIds, IHasExtraProperties
{
string SerializedAttributeOptionIds { get; }
[CanBeNull]
string Name { get; }
[NotNull]
string Currency { get; }
decimal? OriginalPrice { get; }
decimal Price { get; }
int OrderMinQuantity { get; }
int OrderMaxQuantity { get; }
[CanBeNull]
string MediaResources { get; }
Guid? ProductDetailId { get; }
}
}

7
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductAttributeEto.cs

@ -10,11 +10,12 @@ namespace EasyAbp.EShop.Products.Products
public Guid Id { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public int DisplayOrder { get; set; }
IEnumerable<IProductAttributeOption> IProductAttribute.ProductAttributeOptions => ProductAttributeOptions;
public List<ProductAttributeOptionEto> ProductAttributeOptions { get; set; }
}
}

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductEto.cs

@ -37,8 +37,10 @@ namespace EasyAbp.EShop.Products.Products
public bool IsHidden { get; set; }
IEnumerable<IProductAttribute> IProduct.ProductAttributes => ProductAttributes;
public List<ProductAttributeEto> ProductAttributes { get; set; }
IEnumerable<IProductSku> IProduct.ProductSkus => ProductSkus;
public List<ProductSkuEto> ProductSkus { get; set; }
}
}

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductSkuEto.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
@ -8,7 +9,7 @@ namespace EasyAbp.EShop.Products.Products
{
public Guid Id { get; set; }
public string SerializedAttributeOptionIds { get; set; }
public List<Guid> AttributeOptionIds { get; set; }
public string Name { get; set; }

39
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/AttributeOptionIdsSerializer.cs

@ -1,39 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
namespace EasyAbp.EShop.Products.Products
{
public class AttributeOptionIdsSerializer : IAttributeOptionIdsSerializer, ITransientDependency
{
private readonly IJsonSerializer _jsonSerializer;
public AttributeOptionIdsSerializer(IJsonSerializer jsonSerializer)
{
_jsonSerializer = jsonSerializer;
}
public async Task<string> FormatAsync(string serializedAttributeOptionIds)
{
return await SerializeAsync(await DeserializeAsync(serializedAttributeOptionIds));
}
public Task<string> SerializeAsync(IEnumerable<Guid> attributeOptionIds)
{
if (attributeOptionIds == null)
{
return Task.FromResult(string.Empty);
}
return Task.FromResult(_jsonSerializer.Serialize(attributeOptionIds.OrderBy(x => x)));
}
public Task<IEnumerable<Guid>> DeserializeAsync(string serializedAttributeOptionIds)
{
return Task.FromResult(_jsonSerializer.Deserialize<IEnumerable<Guid>>(serializedAttributeOptionIds));
}
}
}

15
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IAttributeOptionIdsSerializer.cs

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace EasyAbp.EShop.Products.Products
{
public interface IAttributeOptionIdsSerializer
{
Task<string> FormatAsync(string serializedAttributeOptionIds);
Task<string> SerializeAsync(IEnumerable<Guid> attributeOptionIds);
Task<IEnumerable<Guid>> DeserializeAsync(string serializedAttributeOptionIds);
}
}

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

@ -52,8 +52,10 @@ namespace EasyAbp.EShop.Products.Products
public virtual TimeSpan? PaymentExpireIn { get; protected set; }
IEnumerable<IProductAttribute> IProduct.ProductAttributes => ProductAttributes;
public virtual List<ProductAttribute> ProductAttributes { get; protected set; }
IEnumerable<IProductSku> IProduct.ProductSkus => ProductSkus;
public virtual List<ProductSku> ProductSkus { get; protected set; }
protected Product()

13
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductAttribute.cs

@ -9,16 +9,15 @@ namespace EasyAbp.EShop.Products.Products
{
public class ProductAttribute : FullAuditedEntity<Guid>, IProductAttribute
{
[NotNull]
public virtual string DisplayName { get; protected set; }
[CanBeNull]
public virtual string Description { get; protected set; }
public virtual int DisplayOrder { get; protected set; }
public ExtraPropertyDictionary ExtraProperties { get; protected set; }
IEnumerable<IProductAttributeOption> IProductAttribute.ProductAttributeOptions => ProductAttributeOptions;
public virtual List<ProductAttributeOption> ProductAttributeOptions { get; protected set; }
protected ProductAttribute()
@ -26,7 +25,7 @@ namespace EasyAbp.EShop.Products.Products
ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(ProxyHelper.UnProxy(this).GetType());
}
public ProductAttribute(
Guid id,
[NotNull] string displayName,
@ -38,7 +37,7 @@ namespace EasyAbp.EShop.Products.Products
DisplayOrder = displayOrder;
ProductAttributeOptions = new List<ProductAttributeOption>();
ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(ProxyHelper.UnProxy(this).GetType());
}

10
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductAttributeOption.cs

@ -8,12 +8,10 @@ namespace EasyAbp.EShop.Products.Products
{
public class ProductAttributeOption : FullAuditedEntity<Guid>, IProductAttributeOption
{
[NotNull]
public virtual string DisplayName { get; protected set; }
[CanBeNull]
public virtual string Description { get; protected set; }
public virtual int DisplayOrder { get; protected set; }
public ExtraPropertyDictionary ExtraProperties { get; protected set; }
@ -23,7 +21,7 @@ namespace EasyAbp.EShop.Products.Products
ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(ProxyHelper.UnProxy(this).GetType());
}
public ProductAttributeOption(
Guid id,
[NotNull] string displayName,
@ -33,7 +31,7 @@ namespace EasyAbp.EShop.Products.Products
DisplayName = displayName;
Description = description;
DisplayOrder = displayOrder;
ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(ProxyHelper.UnProxy(this).GetType());
}

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

@ -19,7 +19,6 @@ namespace EasyAbp.EShop.Products.Products
private readonly IProductDetailRepository _productDetailRepository;
private readonly IProductCategoryRepository _productCategoryRepository;
private readonly IProductInventoryProviderResolver _productInventoryProviderResolver;
private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer;
private readonly IProductGroupConfigurationProvider _productGroupConfigurationProvider;
public ProductManager(
@ -28,7 +27,6 @@ namespace EasyAbp.EShop.Products.Products
IProductDetailRepository productDetailRepository,
IProductCategoryRepository productCategoryRepository,
IProductInventoryProviderResolver productInventoryProviderResolver,
IAttributeOptionIdsSerializer attributeOptionIdsSerializer,
IProductGroupConfigurationProvider productGroupConfigurationProvider)
{
_productRepository = productRepository;
@ -36,7 +34,6 @@ namespace EasyAbp.EShop.Products.Products
_productDetailRepository = productDetailRepository;
_productCategoryRepository = productCategoryRepository;
_productInventoryProviderResolver = productInventoryProviderResolver;
_attributeOptionIdsSerializer = attributeOptionIdsSerializer;
_productGroupConfigurationProvider = productGroupConfigurationProvider;
}
@ -120,8 +117,6 @@ namespace EasyAbp.EShop.Products.Products
[UnitOfWork]
public virtual async Task<Product> CreateSkuAsync(Product product, ProductSku productSku)
{
// productSku.SetSerializedAttributeOptionIds(await _attributeOptionIdsSerializer.FormatAsync(productSku.SerializedAttributeOptionIds));
await CheckSkuAttributeOptionsAsync(product, productSku);
await CheckProductSkuNameUniqueAsync(product, productSku);
@ -151,25 +146,22 @@ namespace EasyAbp.EShop.Products.Products
return Task.CompletedTask;
}
protected virtual async Task CheckSkuAttributeOptionsAsync(Product product, ProductSku productSku)
protected virtual Task CheckSkuAttributeOptionsAsync(Product product, ProductSku productSku)
{
var attributeOptionIds =
(await _attributeOptionIdsSerializer.DeserializeAsync(productSku.SerializedAttributeOptionIds))
.ToList();
if (!product.ProductAttributes.TrueForAll(attribute =>
attribute.ProductAttributeOptions.Select(option => option.Id).Intersect(attributeOptionIds)
.Count() == 1))
if (!product.ProductAttributes.TrueForAll(attribute => attribute.ProductAttributeOptions
.Select(option => option.Id).Intersect(productSku.AttributeOptionIds).Count() == 1))
{
throw new ProductSkuIncorrectAttributeOptionsException(product.Id,
productSku.SerializedAttributeOptionIds);
productSku.AttributeOptionIds.JoinAsString(","));
}
if (product.ProductSkus.Where(sku => sku.Id != productSku.Id).FirstOrDefault(sku =>
sku.SerializedAttributeOptionIds.Equals(productSku.SerializedAttributeOptionIds)) != null)
if (product.ProductSkus.Where(sku => sku.Id != productSku.Id).Any(sku =>
sku.AttributeOptionIds.Order().SequenceEqual(productSku.AttributeOptionIds.Order())))
{
throw new ProductSkuDuplicatedException(product.Id, productSku.SerializedAttributeOptionIds);
throw new ProductSkuDuplicatedException(product.Id, productSku.AttributeOptionIds.JoinAsString(","));
}
return Task.CompletedTask;
}
[UnitOfWork]

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

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using NodaMoney;
using Volo.Abp;
@ -10,13 +11,20 @@ namespace EasyAbp.EShop.Products.Products
{
public class ProductSku : FullAuditedEntity<Guid>, IProductSku
{
[NotNull]
public virtual string SerializedAttributeOptionIds { get; protected set; }
private List<Guid> _attributeOptionIds;
public virtual List<Guid> AttributeOptionIds
{
get => _attributeOptionIds;
protected set
{
_attributeOptionIds = value;
_attributeOptionIds.Sort();
}
}
[CanBeNull]
public virtual string Name { get; protected set; }
[NotNull]
public virtual string Currency { get; protected set; }
public virtual decimal? OriginalPrice { get; protected set; }
@ -29,7 +37,6 @@ namespace EasyAbp.EShop.Products.Products
public virtual TimeSpan? PaymentExpireIn { get; protected set; }
[CanBeNull]
public virtual string MediaResources { get; protected set; }
public virtual Guid? ProductDetailId { get; protected set; }
@ -44,7 +51,7 @@ namespace EasyAbp.EShop.Products.Products
public ProductSku(
Guid id,
[NotNull] string serializedAttributeOptionIds,
List<Guid> attributeOptionIds,
[CanBeNull] string name,
[NotNull] string currency,
decimal? originalPrice,
@ -58,8 +65,8 @@ namespace EasyAbp.EShop.Products.Products
Check.NotNullOrWhiteSpace(currency, nameof(currency));
var nodaCurrency = NodaMoney.Currency.FromCode(currency);
SerializedAttributeOptionIds =
Check.NotNullOrWhiteSpace(serializedAttributeOptionIds, nameof(serializedAttributeOptionIds));
Check.NotNullOrEmpty(attributeOptionIds, nameof(attributeOptionIds));
AttributeOptionIds = attributeOptionIds;
Name = name?.Trim();
Currency = nodaCurrency.Code;
OriginalPrice = originalPrice.HasValue ? new Money(originalPrice.Value, nodaCurrency).Amount : null;

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

@ -4,7 +4,7 @@ using Volo.Abp.MultiTenancy;
namespace EasyAbp.EShop.Products.Products
{
public class ProductView : CreationAuditedAggregateRoot<Guid>, IProduct, IMultiTenant
public class ProductView : CreationAuditedAggregateRoot<Guid>, IProductBase, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }

17
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/AttributeOptionIds/AttributeOptionIdsValueComparer.cs

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore.ChangeTracking;
namespace EasyAbp.EShop.Products.EntityFrameworkCore.AttributeOptionIds;
public class AttributeOptionIdsValueComparer : ValueComparer<List<Guid>>
{
public AttributeOptionIdsValueComparer()
: base(
(d1, d2) => d1.SequenceEqual(d2),
d => d.Aggregate(0, (k, v) => HashCode.Combine(k, v.GetHashCode())),
d => new List<Guid>(d))
{
}
}

15
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/AttributeOptionIds/AttributeOptionIdsValueConverter.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace EasyAbp.EShop.Products.EntityFrameworkCore.AttributeOptionIds;
public class AttributeOptionIdsValueConverter : ValueConverter<List<Guid>, string>
{
public AttributeOptionIdsValueConverter() : base(
v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
v => JsonSerializer.Deserialize<List<Guid>>(v, (JsonSerializerOptions)null))
{
}
}

20
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/EShopProductsEntityTypeBuilderExtensions.cs

@ -0,0 +1,20 @@
using System;
using EasyAbp.EShop.Products.EntityFrameworkCore.AttributeOptionIds;
using EasyAbp.EShop.Products.Products;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace EasyAbp.EShop.Products.EntityFrameworkCore;
public static class EShopProductsEntityTypeBuilderExtensions
{
public static void TryConfigureAttributeOptionIds(this EntityTypeBuilder b)
{
if (b.Metadata.ClrType.IsAssignableTo<IHasAttributeOptionIds>())
{
b.Property(nameof(IHasAttributeOptionIds.AttributeOptionIds))
.HasConversion<AttributeOptionIdsValueConverter>()
.Metadata.SetValueComparer(new AttributeOptionIdsValueComparer());
}
}
}

1
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.EntityFrameworkCore/EasyAbp/EShop/Products/EntityFrameworkCore/ProductsDbContextModelCreatingExtensions.cs

@ -81,6 +81,7 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore
{
b.ToTable(options.TablePrefix + "ProductSkus", options.Schema);
b.ConfigureByConvention();
b.TryConfigureAttributeOptionIds();
/* Configure more properties here */
b.Property(x => x.Price).HasColumnType("decimal(20,8)");
b.Property(x => x.OriginalPrice).HasColumnType("decimal(20,8)");

20
modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.Domain.Tests/Products/ProductDomainTests.cs

@ -12,13 +12,11 @@ namespace EasyAbp.EShop.Products.Products
{
private IProductRepository ProductRepository { get; }
private IProductManager ProductManager { get; }
private IAttributeOptionIdsSerializer AttributeOptionIdsSerializer { get; }
public ProductDomainTests()
{
ProductRepository = ServiceProvider.GetRequiredService<IProductRepository>();
ProductManager = ServiceProvider.GetRequiredService<IProductManager>();
AttributeOptionIdsSerializer = ServiceProvider.GetRequiredService<IAttributeOptionIdsSerializer>();
}
[Fact]
@ -129,7 +127,7 @@ namespace EasyAbp.EShop.Products.Products
{
var product1 = await ProductRepository.GetAsync(ProductsTestData.Product1Id);
var attributeOptionIds = new[]
var attributeOptionIds = new List<Guid>
{
ProductsTestData.Product1Attribute1Option4Id,
ProductsTestData.Product1Attribute2Option2Id
@ -140,9 +138,8 @@ namespace EasyAbp.EShop.Products.Products
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(attributeOptionIds));
});
var serializedAttributeOptionIds = await AttributeOptionIdsSerializer.SerializeAsync(attributeOptionIds);
product1.ProductSkus.Count(x => x.SerializedAttributeOptionIds == serializedAttributeOptionIds).ShouldBe(1);
product1.ProductSkus.Count(x => x.AttributeOptionIds.SequenceEqual(attributeOptionIds)).ShouldBe(1);
}
[Fact]
@ -152,7 +149,7 @@ namespace EasyAbp.EShop.Products.Products
await Should.ThrowAsync<ProductSkuIncorrectAttributeOptionsException>(async () =>
{
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(new[]
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(new List<Guid>
{
ProductsTestData.Product1Attribute1Option1Id // need 2 options but input 1
}));
@ -160,7 +157,7 @@ namespace EasyAbp.EShop.Products.Products
await Should.ThrowAsync<ProductSkuIncorrectAttributeOptionsException>(async () =>
{
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(new[]
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(new List<Guid>
{
ProductsTestData.Product1Attribute1Option1Id,
Guid.NewGuid() // a nonexistent option
@ -169,7 +166,7 @@ namespace EasyAbp.EShop.Products.Products
await Should.ThrowAsync<ProductSkuIncorrectAttributeOptionsException>(async () =>
{
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(new[]
await ProductManager.CreateSkuAsync(product1, await CreateTestSkuAsync(new List<Guid>
{
ProductsTestData.Product1Attribute1Option1Id,
ProductsTestData.Product1Attribute1Option2Id // 2 options from attribute1
@ -186,7 +183,8 @@ namespace EasyAbp.EShop.Products.Products
await ProductManager.CreateAsync(product2);
var fakeSku = new ProductSku(Guid.NewGuid(), "[]", null, "USD", null, 0m, 1, 1, null, null, null);
var fakeSku = new ProductSku(Guid.NewGuid(), new List<Guid> { Guid.NewGuid() }, null, "USD", null, 0m, 1, 1,
null, null, null);
var inventoryDataModel = await ProductManager.GetInventoryDataAsync(product2, fakeSku);
@ -194,9 +192,9 @@ namespace EasyAbp.EShop.Products.Products
inventoryDataModel.Inventory.ShouldBe(9998);
}
private async Task<ProductSku> CreateTestSkuAsync(IEnumerable<Guid> attributeOptionIds)
private async Task<ProductSku> CreateTestSkuAsync(List<Guid> attributeOptionIds)
{
return new ProductSku(Guid.NewGuid(), await AttributeOptionIdsSerializer.SerializeAsync(attributeOptionIds),
return new ProductSku(Guid.NewGuid(), attributeOptionIds,
"test-sku", "USD", null, 0m, 1, 10, null, null, null);
}
}

18
modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.TestBase/ProductsTestDataBuilder.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.ProductDetails;
using EasyAbp.EShop.Products.Products;
@ -13,18 +14,15 @@ namespace EasyAbp.EShop.Products
private readonly IProductManager _productManager;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IProductDetailRepository _productDetailRepository;
private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer;
public ProductsTestDataBuilder(
IProductManager productManager,
IUnitOfWorkManager unitOfWorkManager,
IProductDetailRepository productDetailRepository,
IAttributeOptionIdsSerializer attributeOptionIdsSerializer)
IProductDetailRepository productDetailRepository)
{
_productManager = productManager;
_unitOfWorkManager = unitOfWorkManager;
_productDetailRepository = productDetailRepository;
_attributeOptionIdsSerializer = attributeOptionIdsSerializer;
}
public void Build()
@ -71,18 +69,18 @@ namespace EasyAbp.EShop.Products
await _productManager.CreateAsync(product);
var productSku1 = new ProductSku(ProductsTestData.Product1Sku1Id,
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ ProductsTestData.Product1Attribute1Option1Id, ProductsTestData.Product1Attribute2Option1Id }),
new List<Guid>
{ ProductsTestData.Product1Attribute1Option1Id, ProductsTestData.Product1Attribute2Option1Id },
null, "USD", null, 1m, 1, 10, null, null, null);
var productSku2 = new ProductSku(ProductsTestData.Product1Sku2Id,
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ ProductsTestData.Product1Attribute1Option2Id, ProductsTestData.Product1Attribute2Option1Id }),
new List<Guid>
{ ProductsTestData.Product1Attribute1Option2Id, ProductsTestData.Product1Attribute2Option1Id },
null, "USD", null, 2m, 1, 10, null, null, null);
var productSku3 = new ProductSku(ProductsTestData.Product1Sku3Id,
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ ProductsTestData.Product1Attribute1Option3Id, ProductsTestData.Product1Attribute2Option2Id }),
new List<Guid>
{ ProductsTestData.Product1Attribute1Option3Id, ProductsTestData.Product1Attribute2Option2Id },
null, "USD", null, 3m, 1, 10, null, null, null);
await _productManager.CreateSkuAsync(product, productSku1);

1
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs

@ -31,6 +31,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos
public bool IsUnscoped { get; set; }
IEnumerable<ICouponTemplateScope> ICouponTemplate.Scopes => Scopes;
public List<CouponTemplateScopeDto> Scopes { get; set; }
}
}

7
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs

@ -6,9 +6,9 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
public class CouponTemplateData : ICouponTemplate, IHasCouponTemplateScopes<CouponTemplateScopeData>
{
public Guid Id { get; set; }
public Guid? TenantId { get; set; }
public Guid? StoreId { get; set; }
public CouponType CouponType { get; set; }
@ -28,11 +28,12 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
public decimal ConditionAmount { get; set; }
public decimal DiscountAmount { get; set; }
public string Currency { get; set; }
public bool IsUnscoped { get; set; }
IEnumerable<ICouponTemplateScope> ICouponTemplate.Scopes => Scopes;
public List<CouponTemplateScopeData> Scopes { get; set; }
}
}

20
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs

@ -12,26 +12,28 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
[CanBeNull]
string UniqueName { get; }
[NotNull]
string DisplayName { get; }
[CanBeNull]
string Description { get; }
TimeSpan? UsableDuration { get; }
DateTime? UsableBeginTime { get; }
DateTime? UsableEndTime { get; }
decimal ConditionAmount { get; }
decimal DiscountAmount { get; }
[NotNull]
string Currency { get; }
bool IsUnscoped { get; }
IEnumerable<ICouponTemplateScope> Scopes { get; }
}
}

50
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs

@ -7,10 +7,11 @@ using Volo.Abp.Timing;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{
public class CouponTemplate : FullAuditedAggregateRoot<Guid>, ICouponTemplate, IHasCouponTemplateScopes<CouponTemplateScope>, IMultiTenant
public class CouponTemplate : FullAuditedAggregateRoot<Guid>, ICouponTemplate,
IHasCouponTemplateScopes<CouponTemplateScope>, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// If it is set to null, only cross-store admin users can manage this template.
/// It is not about the coupon usage scope, but the StoreId property of Scopes should be same as it if it not null.
@ -21,36 +22,37 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
[CanBeNull]
public virtual string UniqueName { get; protected set; }
[NotNull]
public virtual string DisplayName { get; protected set; }
[CanBeNull]
public virtual string Description { get; protected set; }
/// <summary>
/// If both the UsableDuration and the UsableEndTime have values, the earlier time is preferred.
/// </summary>
public virtual TimeSpan? UsableDuration { get; protected set; }
public virtual DateTime? UsableBeginTime { get; protected set; }
/// <summary>
/// If both the UsableDuration and the UsableEndTime have values, the earlier time is preferred.
/// </summary>
public virtual DateTime? UsableEndTime { get; protected set; }
public virtual decimal ConditionAmount { get; protected set; }
public virtual decimal DiscountAmount { get; protected set; }
public virtual string Currency { get; protected set; }
/// <summary>
/// The coupon can be used for any product of any store if this property is set to true.
/// </summary>
public virtual bool IsUnscoped { get; protected set; }
IEnumerable<ICouponTemplateScope> ICouponTemplate.Scopes => Scopes;
public virtual List<CouponTemplateScope> Scopes { get; protected set; }
protected CouponTemplate()
@ -59,20 +61,20 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
}
public CouponTemplate(
Guid id,
Guid? tenantId,
Guid? storeId,
CouponType couponType,
string uniqueName,
string displayName,
string description,
TimeSpan? usableDuration,
DateTime? usableBeginTime,
DateTime? usableEndTime,
decimal conditionAmount,
Guid id,
Guid? tenantId,
Guid? storeId,
CouponType couponType,
string uniqueName,
string displayName,
string description,
TimeSpan? usableDuration,
DateTime? usableBeginTime,
DateTime? usableEndTime,
decimal conditionAmount,
decimal discountAmount,
[NotNull] string currency,
bool isUnscoped,
bool isUnscoped,
List<CouponTemplateScope> scopes
) : base(id)
{
@ -109,4 +111,4 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
return expirationTime;
}
}
}
}

22
samples/EShopSample/aspnet-core/src/EShopSample.Domain/Data/SampleDataSeedContributor.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EasyAbp.EShop.Products;
using EasyAbp.EShop.Products.Categories;
@ -27,7 +28,6 @@ public class SampleDataSeedContributor : IDataSeedContributor, ITransientDepende
private readonly ICategoryRepository _categoryRepository;
private readonly IProductCategoryRepository _productCategoryRepository;
private readonly ISettingProvider _settingProvider;
private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer;
public SampleDataSeedContributor(
IGuidGenerator guidGenerator,
@ -38,8 +38,7 @@ public class SampleDataSeedContributor : IDataSeedContributor, ITransientDepende
ICategoryManager categoryManager,
ICategoryRepository categoryRepository,
IProductCategoryRepository productCategoryRepository,
ISettingProvider settingProvider,
IAttributeOptionIdsSerializer attributeOptionIdsSerializer)
ISettingProvider settingProvider)
{
_guidGenerator = guidGenerator;
_currentTenant = currentTenant;
@ -50,7 +49,6 @@ public class SampleDataSeedContributor : IDataSeedContributor, ITransientDepende
_categoryRepository = categoryRepository;
_productCategoryRepository = productCategoryRepository;
_settingProvider = settingProvider;
_attributeOptionIdsSerializer = attributeOptionIdsSerializer;
}
[UnitOfWork(true)]
@ -155,23 +153,23 @@ public class SampleDataSeedContributor : IDataSeedContributor, ITransientDepende
await _productManager.CreateAsync(product);
var productSku1 = new ProductSku(_guidGenerator.Create(),
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ attribute1.ProductAttributeOptions[0].Id, attribute2.ProductAttributeOptions[0].Id }),
new List<Guid>
{ attribute1.ProductAttributeOptions[0].Id, attribute2.ProductAttributeOptions[0].Id },
null, "USD", null, 1m, 1, 10, null, null, null);
var productSku2 = new ProductSku(_guidGenerator.Create(),
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ attribute1.ProductAttributeOptions[1].Id, attribute2.ProductAttributeOptions[0].Id }),
new List<Guid>
{ attribute1.ProductAttributeOptions[1].Id, attribute2.ProductAttributeOptions[0].Id },
null, "USD", null, 2m, 1, 10, null, null, null);
var productSku3 = new ProductSku(_guidGenerator.Create(),
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ attribute1.ProductAttributeOptions[1].Id, attribute2.ProductAttributeOptions[1].Id }),
new List<Guid>
{ attribute1.ProductAttributeOptions[1].Id, attribute2.ProductAttributeOptions[1].Id },
null, "USD", null, 3m, 1, 10, null, null, null);
var productSku4 = new ProductSku(_guidGenerator.Create(),
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ attribute1.ProductAttributeOptions[2].Id, attribute2.ProductAttributeOptions[1].Id }),
new List<Guid>
{ attribute1.ProductAttributeOptions[2].Id, attribute2.ProductAttributeOptions[1].Id },
null, "USD", null, 4m, 1, 10, null, null, null);
await _productManager.CreateSkuAsync(product, productSku1);

6361
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230328174008_RenamedToAttributeOptionIds.Designer.cs

File diff suppressed because it is too large

28
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230328174008_RenamedToAttributeOptionIds.cs

@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace EShopSample.Migrations
{
/// <inheritdoc />
public partial class RenamedToAttributeOptionIds : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "SerializedAttributeOptionIds",
table: "EasyAbpEShopProductsProductSkus",
newName: "AttributeOptionIds");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "AttributeOptionIds",
table: "EasyAbpEShopProductsProductSkus",
newName: "SerializedAttributeOptionIds");
}
}
}

18
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/EShopSampleDbContextModelSnapshot.cs

@ -2437,6 +2437,9 @@ namespace EShopSample.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("AttributeOptionIds")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
@ -2501,9 +2504,6 @@ namespace EShopSample.Migrations
b.Property<Guid?>("ProductId")
.HasColumnType("uniqueidentifier");
b.Property<string>("SerializedAttributeOptionIds")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.HasIndex("ProductId");
@ -5708,7 +5708,7 @@ namespace EShopSample.Migrations
.WithMany("Children")
.HasForeignKey("ParentId");
b.OwnsOne("EasyAbp.BookingService.TimeInAdvance", "TimeInAdvance", b1 =>
b.OwnsOne("EasyAbp.BookingService.AssetCategories.AssetCategory.TimeInAdvance#EasyAbp.BookingService.TimeInAdvance", "TimeInAdvance", b1 =>
{
b1.Property<Guid>("AssetCategoryId")
.HasColumnType("uniqueidentifier");
@ -5727,7 +5727,7 @@ namespace EShopSample.Migrations
b1.HasKey("AssetCategoryId");
b1.ToTable("EasyAbpBookingServiceAssetCategories");
b1.ToTable("EasyAbpBookingServiceAssetCategories", (string)null);
b1.WithOwner()
.HasForeignKey("AssetCategoryId");
@ -5740,7 +5740,7 @@ namespace EShopSample.Migrations
modelBuilder.Entity("EasyAbp.BookingService.AssetSchedules.AssetSchedule", b =>
{
b.OwnsOne("EasyAbp.BookingService.TimeInAdvance", "TimeInAdvance", b1 =>
b.OwnsOne("EasyAbp.BookingService.AssetSchedules.AssetSchedule.TimeInAdvance#EasyAbp.BookingService.TimeInAdvance", "TimeInAdvance", b1 =>
{
b1.Property<Guid>("AssetScheduleId")
.HasColumnType("uniqueidentifier");
@ -5759,7 +5759,7 @@ namespace EShopSample.Migrations
b1.HasKey("AssetScheduleId");
b1.ToTable("EasyAbpBookingServiceAssetSchedules");
b1.ToTable("EasyAbpBookingServiceAssetSchedules", (string)null);
b1.WithOwner()
.HasForeignKey("AssetScheduleId");
@ -5770,7 +5770,7 @@ namespace EShopSample.Migrations
modelBuilder.Entity("EasyAbp.BookingService.Assets.Asset", b =>
{
b.OwnsOne("EasyAbp.BookingService.TimeInAdvance", "TimeInAdvance", b1 =>
b.OwnsOne("EasyAbp.BookingService.Assets.Asset.TimeInAdvance#EasyAbp.BookingService.TimeInAdvance", "TimeInAdvance", b1 =>
{
b1.Property<Guid>("AssetId")
.HasColumnType("uniqueidentifier");
@ -5789,7 +5789,7 @@ namespace EShopSample.Migrations
b1.HasKey("AssetId");
b1.ToTable("EasyAbpBookingServiceAssets");
b1.ToTable("EasyAbpBookingServiceAssets", (string)null);
b1.WithOwner()
.HasForeignKey("AssetId");

Loading…
Cancel
Save