Browse Source

Complete CouponOrderCreationAuthorizationHandler

pull/103/head
gdlcf88 5 years ago
parent
commit
60ccd1ccbd
  1. 7
      EShop.sln
  2. 15
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp.EShop.Orders.Plugins.Coupons.csproj
  3. 101
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs
  4. 20
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs
  5. 48
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs
  6. 15
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs
  7. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp.EShop.Plugins.Coupons.Domain.Shared.csproj
  8. 40
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs
  9. 11
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs
  10. 16
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateScope.cs
  11. 19
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/ICoupon.cs
  12. 11
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/ICouponLookupService.cs
  13. 7
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponsConsts.cs
  14. 4
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainSharedModule.cs
  15. 3
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Localization/cs.json
  16. 3
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Localization/en.json
  17. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj
  18. 6
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs
  19. 3
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs
  20. 6
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs
  21. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore/EasyAbp/EShop/Plugins/Coupons/EntityFrameworkCore/CouponsDbContext.cs
  22. 8
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore/EasyAbp/EShop/Plugins/Coupons/EntityFrameworkCore/CouponsDbContextModelCreatingExtensions.cs
  23. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore/EasyAbp/EShop/Plugins/Coupons/EntityFrameworkCore/ICouponsDbContext.cs
  24. 4559
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200924101315_ConfiguredCouponTemplateScope.Designer.cs
  25. 89
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200924101315_ConfiguredCouponTemplateScope.cs
  26. 13
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/EShopSampleMigrationsDbContextModelSnapshot.cs

7
EShop.sln

@ -341,6 +341,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Coupo
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Coupons.TestBase", "plugins\Coupons\test\EasyAbp.EShop.Plugins.Coupons.TestBase\EasyAbp.EShop.Plugins.Coupons.TestBase.csproj", "{B076C103-DF0B-464B-A9CB-4BE5CAFEE067}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Coupons.TestBase", "plugins\Coupons\test\EasyAbp.EShop.Plugins.Coupons.TestBase\EasyAbp.EShop.Plugins.Coupons.TestBase.csproj", "{B076C103-DF0B-464B-A9CB-4BE5CAFEE067}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Orders.Plugins.Coupons", "plugins\Coupons\src\EasyAbp.EShop.Orders.Plugins.Coupons\EasyAbp.EShop.Orders.Plugins.Coupons.csproj", "{3C385657-8365-470F-9F4F-30F31F9FCA42}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -895,6 +897,10 @@ Global
{B076C103-DF0B-464B-A9CB-4BE5CAFEE067}.Debug|Any CPU.Build.0 = Debug|Any CPU {B076C103-DF0B-464B-A9CB-4BE5CAFEE067}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B076C103-DF0B-464B-A9CB-4BE5CAFEE067}.Release|Any CPU.ActiveCfg = Release|Any CPU {B076C103-DF0B-464B-A9CB-4BE5CAFEE067}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B076C103-DF0B-464B-A9CB-4BE5CAFEE067}.Release|Any CPU.Build.0 = Release|Any CPU {B076C103-DF0B-464B-A9CB-4BE5CAFEE067}.Release|Any CPU.Build.0 = Release|Any CPU
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -1065,6 +1071,7 @@ Global
{8B22E009-5ABA-4878-83E5-38154F2B8E2F} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B} {8B22E009-5ABA-4878-83E5-38154F2B8E2F} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B}
{86CAD303-A0E5-42C9-89A5-61D9AAA4AD8F} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B} {86CAD303-A0E5-42C9-89A5-61D9AAA4AD8F} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B}
{B076C103-DF0B-464B-A9CB-4BE5CAFEE067} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B} {B076C103-DF0B-464B-A9CB-4BE5CAFEE067} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B}
{3C385657-8365-470F-9F4F-30F31F9FCA42} = {72F34527-9295-4F29-923E-4B075A4F31A2}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}

15
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp.EShop.Orders.Plugins.Coupons.csproj

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Orders\src\EasyAbp.EShop.Orders.Application\EasyAbp.EShop.Orders.Application.csproj" />
<ProjectReference Include="..\EasyAbp.EShop.Plugins.Coupons.Domain.Shared\EasyAbp.EShop.Plugins.Coupons.Domain.Shared.csproj" />
</ItemGroup>
</Project>

101
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EasyAbp.EShop.Orders.Orders;
using EasyAbp.EShop.Orders.Orders.Dtos;
using EasyAbp.EShop.Plugins.Coupons;
using EasyAbp.EShop.Plugins.Coupons.Coupons;
using EasyAbp.EShop.Plugins.Coupons.CouponTemplates;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Data;
using Volo.Abp.Timing;
namespace EasyAbp.EShop.Orders.Plugins.Coupons.Authorization
{
public class CouponOrderCreationAuthorizationHandler : OrderCreationAuthorizationHandler
{
private readonly IClock _clock;
private readonly ICouponLookupService _couponLookupService;
private readonly ICouponTemplateLookupService _couponTemplateLookupService;
public CouponOrderCreationAuthorizationHandler(
IClock clock,
ICouponLookupService couponLookupService,
ICouponTemplateLookupService couponTemplateLookupService)
{
_clock = clock;
_couponLookupService = couponLookupService;
_couponTemplateLookupService = couponTemplateLookupService;
}
protected override async Task HandleOrderCreationAsync(AuthorizationHandlerContext context,
OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource)
{
var couponId = resource.Input.GetProperty<Guid?>(CouponsConsts.OrderCouponIdPropertyName);
if (!couponId.HasValue)
{
return;
}
var now = _clock.Now;
var coupon = await _couponLookupService.FindByIdAsync(couponId.Value);
if (coupon == null || coupon.ExpirationTime < now)
{
context.Fail();
return;
}
var couponTemplate = await _couponTemplateLookupService.FindByIdAsync(coupon.CouponTemplateId);
if (couponTemplate == null ||
!IsInUsableTime(couponTemplate, now) ||
!IsOrderInScope(couponTemplate, resource))
{
context.Fail();
return;
}
}
protected virtual bool IsOrderInScope(ICouponTemplate couponTemplate, OrderCreationResource resource)
{
if (couponTemplate.IsUnscoped)
{
return true;
}
var expectedOrderLines = new List<CreateOrderLineDto>();
foreach (var scope in couponTemplate.Scopes)
{
expectedOrderLines.AddRange(resource.Input.OrderLines
.WhereIf(scope.ProductGroupName != null,
x => resource.ProductDictionary[x.ProductId].ProductGroupName == scope.ProductGroupName)
.WhereIf(scope.ProductId.HasValue, x => x.ProductId == scope.ProductId)
.WhereIf(scope.ProductSkuId.HasValue, x => x.ProductSkuId == scope.ProductSkuId));
}
if (couponTemplate.IsCrossProductAllowed)
{
return expectedOrderLines.Sum(x => GetOrderLineProductPrice(x, resource) * x.Quantity) >=
couponTemplate.ConditionAmount;
}
return expectedOrderLines.Any(orderLine =>
GetOrderLineProductPrice(orderLine, resource) >= couponTemplate.ConditionAmount);
}
protected virtual decimal GetOrderLineProductPrice(CreateOrderLineDto createOrderLineDto, OrderCreationResource resource)
{
return resource.ProductDictionary[createOrderLineDto.ProductId].GetSkuById(createOrderLineDto.ProductSkuId).Price;
}
protected virtual bool IsInUsableTime(ICouponTemplate couponTemplate, DateTime now)
{
return couponTemplate.UsableBeginTime <= now && couponTemplate.UsableEndTime > now;
}
}
}

20
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs

@ -0,0 +1,20 @@
using EasyAbp.EShop.Orders.Plugins.Coupons.Authorization;
using EasyAbp.EShop.Plugins.Coupons;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace EasyAbp.EShop.Orders.Plugins.Coupons
{
[DependsOn(
typeof(EShopOrdersDomainModule),
typeof(EShopPluginsCouponsDomainSharedModule)
)]
public class EShopOrdersPluginsCouponsModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddSingleton<IAuthorizationHandler, CouponOrderCreationAuthorizationHandler>();
}
}
}

48
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs

@ -0,0 +1,48 @@
using System;
using EasyAbp.EShop.Orders.Orders;
using EasyAbp.EShop.Orders.Orders.Dtos;
using EasyAbp.EShop.Plugins.Coupons;
using Volo.Abp.ObjectExtending;
using Volo.Abp.Threading;
namespace EasyAbp.EShop.Orders.Plugins.Coupons.ObjectExtending
{
public static class EShopOrdersPluginsCouponsObjectExtensions
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
OneTimeRunner.Run(() =>
{
/* You can configure extension properties to entities or other object types
* defined in the depended modules.
*
* If you are using EF Core and want to map the entity extension properties to new
* table fields in the database, then configure them in the EShopSampleEfCoreEntityExtensionMappings
*
* Example:
*
* ObjectExtensionManager.Instance
* .AddOrUpdateProperty<IdentityRole, string>("Title");
*
* See the documentation for more:
* https://docs.abp.io/en/abp/latest/Object-Extensions
*/
ObjectExtensionManager.Instance
.AddOrUpdate(
new[]
{
typeof(Order),
typeof(CreateOrderDto)
},
config =>
{
config.AddOrUpdateProperty<Guid?>(CouponsConsts.OrderCouponIdPropertyName);
}
);
});
}
}
}

15
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs

@ -0,0 +1,15 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using EasyAbp.EShop.Orders.Orders;
using Volo.Abp.DependencyInjection;
namespace EasyAbp.EShop.Orders.Plugins.Coupons.OrderDiscount
{
public class CouponOrderDiscountProvider : IOrderDiscountProvider, ITransientDependency
{
public async Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties)
{
throw new System.NotImplementedException();
}
}
}

1
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp.EShop.Plugins.Coupons.Domain.Shared.csproj

@ -10,6 +10,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Validation" Version="3.1.2" /> <PackageReference Include="Volo.Abp.Validation" Version="3.1.2" />
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Domain.Shared\EasyAbp.EShop.Stores.Domain.Shared.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

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

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{
public interface ICouponTemplate
{
Guid? TenantId { get; }
Guid? StoreId { get; }
CouponType CouponType { get; }
[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; }
bool IsCrossProductAllowed { get; }
bool IsUnscoped { get; }
IEnumerable<ICouponTemplateScope> Scopes { get; }
}
}

11
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs

@ -0,0 +1,11 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{
public interface ICouponTemplateLookupService
{
Task<ICouponTemplate> FindByIdAsync(Guid id, CancellationToken cancellationToken = default);
}
}

16
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateScope.cs

@ -0,0 +1,16 @@
using System;
using EasyAbp.EShop.Stores.Stores;
using JetBrains.Annotations;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{
public interface ICouponTemplateScope : IMultiStore
{
[CanBeNull]
string ProductGroupName { get; }
Guid? ProductId { get; }
Guid? ProductSkuId { get; }
}
}

19
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/ICoupon.cs

@ -0,0 +1,19 @@
using System;
namespace EasyAbp.EShop.Plugins.Coupons.Coupons
{
public interface ICoupon
{
Guid CouponTemplateId { get; }
Guid UserId { get; }
Guid? OrderId { get; }
DateTime? ExpirationTime { get; }
DateTime? UsedTime { get; }
decimal? DiscountedAmount { get; }
}
}

11
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/ICouponLookupService.cs

@ -0,0 +1,11 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace EasyAbp.EShop.Plugins.Coupons.Coupons
{
public interface ICouponLookupService
{
Task<ICoupon> FindByIdAsync(Guid id, CancellationToken cancellationToken = default);
}
}

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

@ -0,0 +1,7 @@
namespace EasyAbp.EShop.Plugins.Coupons
{
public static class CouponsConsts
{
public const string OrderCouponIdPropertyName = "CouponId";
}
}

4
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainSharedModule.cs

@ -1,6 +1,7 @@
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using EasyAbp.EShop.Plugins.Coupons.Localization; using EasyAbp.EShop.Plugins.Coupons.Localization;
using EasyAbp.EShop.Stores;
using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.Abp.Validation.Localization; using Volo.Abp.Validation.Localization;
@ -9,7 +10,8 @@ using Volo.Abp.VirtualFileSystem;
namespace EasyAbp.EShop.Plugins.Coupons namespace EasyAbp.EShop.Plugins.Coupons
{ {
[DependsOn( [DependsOn(
typeof(AbpValidationModule) typeof(AbpValidationModule),
typeof(EShopStoresDomainSharedModule)
)] )]
public class EShopPluginsCouponsDomainSharedModule : AbpModule public class EShopPluginsCouponsDomainSharedModule : AbpModule
{ {

3
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Localization/cs.json

@ -31,8 +31,7 @@
"CouponCouponTemplateId": "CouponCouponTemplateId", "CouponCouponTemplateId": "CouponCouponTemplateId",
"CouponUserId": "CouponUserId", "CouponUserId": "CouponUserId",
"CouponOrderId": "CouponOrderId", "CouponOrderId": "CouponOrderId",
"CouponUsableBeginTime": "CouponUsableBeginTime", "CouponExpirationTime": "CouponExpirationTime",
"CouponUsableEndTime": "CouponUsableEndTime",
"CouponUsedTime": "CouponUsedTime", "CouponUsedTime": "CouponUsedTime",
"CouponDiscountedAmount": "CouponDiscountedAmount", "CouponDiscountedAmount": "CouponDiscountedAmount",
"CreateCoupon": "CreateCoupon", "CreateCoupon": "CreateCoupon",

3
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Localization/en.json

@ -31,8 +31,7 @@
"CouponCouponTemplateId": "CouponCouponTemplateId", "CouponCouponTemplateId": "CouponCouponTemplateId",
"CouponUserId": "CouponUserId", "CouponUserId": "CouponUserId",
"CouponOrderId": "CouponOrderId", "CouponOrderId": "CouponOrderId",
"CouponUsableBeginTime": "CouponUsableBeginTime", "CouponExpirationTime": "CouponExpirationTime",
"CouponUsableEndTime": "CouponUsableEndTime",
"CouponUsedTime": "CouponUsedTime", "CouponUsedTime": "CouponUsedTime",
"CouponDiscountedAmount": "CouponDiscountedAmount", "CouponDiscountedAmount": "CouponDiscountedAmount",
"CreateCoupon": "CreateCoupon", "CreateCoupon": "CreateCoupon",

1
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj

@ -9,7 +9,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="3.1.2" /> <PackageReference Include="Volo.Abp.Ddd.Domain" Version="3.1.2" />
<ProjectReference Include="..\..\..\..\modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Domain.Shared\EasyAbp.EShop.Stores.Domain.Shared.csproj" />
<ProjectReference Include="..\EasyAbp.EShop.Plugins.Coupons.Domain.Shared\EasyAbp.EShop.Plugins.Coupons.Domain.Shared.csproj" /> <ProjectReference Include="..\EasyAbp.EShop.Plugins.Coupons.Domain.Shared\EasyAbp.EShop.Plugins.Coupons.Domain.Shared.csproj" />
</ItemGroup> </ItemGroup>

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

@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{ {
public class CouponTemplate : FullAuditedAggregateRoot<Guid>, IMultiTenant public class CouponTemplate : FullAuditedAggregateRoot<Guid>, ICouponTemplate, IMultiTenant
{ {
public virtual Guid? TenantId { get; protected set; } public virtual Guid? TenantId { get; protected set; }
@ -54,7 +54,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
/// </summary> /// </summary>
public virtual bool IsUnscoped { get; protected set; } public virtual bool IsUnscoped { get; protected set; }
public virtual List<CouponTemplateScope> Scopes { get; protected set; } public virtual IEnumerable<ICouponTemplateScope> Scopes { get; protected set; }
protected CouponTemplate() protected CouponTemplate()
{ {
@ -75,7 +75,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
decimal discountAmount, decimal discountAmount,
bool isCrossProductAllowed, bool isCrossProductAllowed,
bool isUnscoped, bool isUnscoped,
List<CouponTemplateScope> scopes IEnumerable<CouponTemplateScope> scopes
) : base(id) ) : base(id)
{ {
TenantId = tenantId; TenantId = tenantId;

3
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs

@ -1,11 +1,10 @@
using System; using System;
using EasyAbp.EShop.Stores.Stores;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{ {
public class CouponTemplateScope : FullAuditedEntity<Guid>, IMultiStore public class CouponTemplateScope : FullAuditedEntity<Guid>, ICouponTemplateScope
{ {
public virtual Guid StoreId { get; protected set; } public virtual Guid StoreId { get; protected set; }

6
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs

@ -1,13 +1,11 @@
using EasyAbp.EShop.Stores; using Volo.Abp.Domain;
using Volo.Abp.Domain;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace EasyAbp.EShop.Plugins.Coupons namespace EasyAbp.EShop.Plugins.Coupons
{ {
[DependsOn( [DependsOn(
typeof(AbpDddDomainModule), typeof(AbpDddDomainModule),
typeof(EShopPluginsCouponsDomainSharedModule), typeof(EShopPluginsCouponsDomainSharedModule)
typeof(EShopStoresDomainSharedModule)
)] )]
public class EShopPluginsCouponsDomainModule : AbpModule public class EShopPluginsCouponsDomainModule : AbpModule
{ {

1
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore/EasyAbp/EShop/Plugins/Coupons/EntityFrameworkCore/CouponsDbContext.cs

@ -13,6 +13,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore
* public DbSet<Question> Questions { get; set; } * public DbSet<Question> Questions { get; set; }
*/ */
public DbSet<CouponTemplate> CouponTemplates { get; set; } public DbSet<CouponTemplate> CouponTemplates { get; set; }
public DbSet<CouponTemplateScope> CouponTemplateScopes { get; set; }
public DbSet<Coupon> Coupons { get; set; } public DbSet<Coupon> Coupons { get; set; }
public CouponsDbContext(DbContextOptions<CouponsDbContext> options) public CouponsDbContext(DbContextOptions<CouponsDbContext> options)

8
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore/EasyAbp/EShop/Plugins/Coupons/EntityFrameworkCore/CouponsDbContextModelCreatingExtensions.cs

@ -51,8 +51,16 @@ namespace EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore
/* Configure more properties here */ /* Configure more properties here */
b.Property(x => x.ConditionAmount).HasColumnType("decimal(20,8)"); b.Property(x => x.ConditionAmount).HasColumnType("decimal(20,8)");
b.Property(x => x.DiscountAmount).HasColumnType("decimal(20,8)"); b.Property(x => x.DiscountAmount).HasColumnType("decimal(20,8)");
b.HasMany(typeof(CouponTemplateScope), nameof(CouponTemplate.Scopes));
}); });
builder.Entity<CouponTemplateScope>(b =>
{
b.ToTable(options.TablePrefix + "CouponTemplateScopes", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<Coupon>(b => builder.Entity<Coupon>(b =>
{ {

1
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore/EasyAbp/EShop/Plugins/Coupons/EntityFrameworkCore/ICouponsDbContext.cs

@ -13,6 +13,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.EntityFrameworkCore
* DbSet<Question> Questions { get; } * DbSet<Question> Questions { get; }
*/ */
DbSet<CouponTemplate> CouponTemplates { get; set; } DbSet<CouponTemplate> CouponTemplates { get; set; }
DbSet<CouponTemplateScope> CouponTemplateScopes { get; set; }
DbSet<Coupon> Coupons { get; set; } DbSet<Coupon> Coupons { get; set; }
} }
} }

4559
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200924101315_ConfiguredCouponTemplateScope.Designer.cs

File diff suppressed because it is too large

89
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200924101315_ConfiguredCouponTemplateScope.cs

@ -0,0 +1,89 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace EShopSample.Migrations
{
public partial class ConfiguredCouponTemplateScope : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_CouponTemplateScope_EasyAbpEShopPluginsCouponsCouponTemplates_CouponTemplateId",
table: "CouponTemplateScope");
migrationBuilder.DropPrimaryKey(
name: "PK_CouponTemplateScope",
table: "CouponTemplateScope");
migrationBuilder.RenameTable(
name: "CouponTemplateScope",
newName: "EasyAbpEShopPluginsCouponsCouponTemplateScopes");
migrationBuilder.RenameIndex(
name: "IX_CouponTemplateScope_CouponTemplateId",
table: "EasyAbpEShopPluginsCouponsCouponTemplateScopes",
newName: "IX_EasyAbpEShopPluginsCouponsCouponTemplateScopes_CouponTemplateId");
migrationBuilder.AlterColumn<bool>(
name: "IsDeleted",
table: "EasyAbpEShopPluginsCouponsCouponTemplateScopes",
nullable: false,
defaultValue: false,
oldClrType: typeof(bool),
oldType: "bit");
migrationBuilder.AddPrimaryKey(
name: "PK_EasyAbpEShopPluginsCouponsCouponTemplateScopes",
table: "EasyAbpEShopPluginsCouponsCouponTemplateScopes",
column: "Id");
migrationBuilder.AddForeignKey(
name: "FK_EasyAbpEShopPluginsCouponsCouponTemplateScopes_EasyAbpEShopPluginsCouponsCouponTemplates_CouponTemplateId",
table: "EasyAbpEShopPluginsCouponsCouponTemplateScopes",
column: "CouponTemplateId",
principalTable: "EasyAbpEShopPluginsCouponsCouponTemplates",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_EasyAbpEShopPluginsCouponsCouponTemplateScopes_EasyAbpEShopPluginsCouponsCouponTemplates_CouponTemplateId",
table: "EasyAbpEShopPluginsCouponsCouponTemplateScopes");
migrationBuilder.DropPrimaryKey(
name: "PK_EasyAbpEShopPluginsCouponsCouponTemplateScopes",
table: "EasyAbpEShopPluginsCouponsCouponTemplateScopes");
migrationBuilder.RenameTable(
name: "EasyAbpEShopPluginsCouponsCouponTemplateScopes",
newName: "CouponTemplateScope");
migrationBuilder.RenameIndex(
name: "IX_EasyAbpEShopPluginsCouponsCouponTemplateScopes_CouponTemplateId",
table: "CouponTemplateScope",
newName: "IX_CouponTemplateScope_CouponTemplateId");
migrationBuilder.AlterColumn<bool>(
name: "IsDeleted",
table: "CouponTemplateScope",
type: "bit",
nullable: false,
oldClrType: typeof(bool),
oldDefaultValue: false);
migrationBuilder.AddPrimaryKey(
name: "PK_CouponTemplateScope",
table: "CouponTemplateScope",
column: "Id");
migrationBuilder.AddForeignKey(
name: "FK_CouponTemplateScope_EasyAbpEShopPluginsCouponsCouponTemplates_CouponTemplateId",
table: "CouponTemplateScope",
column: "CouponTemplateId",
principalTable: "EasyAbpEShopPluginsCouponsCouponTemplates",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
}
}

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

@ -837,24 +837,33 @@ namespace EShopSample.Migrations
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime") b.Property<DateTime>("CreationTime")
.HasColumnName("CreationTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<Guid?>("CreatorId") b.Property<Guid?>("CreatorId")
.HasColumnName("CreatorId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<Guid?>("DeleterId") b.Property<Guid?>("DeleterId")
.HasColumnName("DeleterId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<DateTime?>("DeletionTime") b.Property<DateTime?>("DeletionTime")
.HasColumnName("DeletionTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<bool>("IsDeleted") b.Property<bool>("IsDeleted")
.HasColumnType("bit"); .ValueGeneratedOnAdd()
.HasColumnName("IsDeleted")
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<DateTime?>("LastModificationTime") b.Property<DateTime?>("LastModificationTime")
.HasColumnName("LastModificationTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
b.Property<Guid?>("LastModifierId") b.Property<Guid?>("LastModifierId")
.HasColumnName("LastModifierId")
.HasColumnType("uniqueidentifier"); .HasColumnType("uniqueidentifier");
b.Property<string>("ProductGroupName") b.Property<string>("ProductGroupName")
@ -873,7 +882,7 @@ namespace EShopSample.Migrations
b.HasIndex("CouponTemplateId"); b.HasIndex("CouponTemplateId");
b.ToTable("CouponTemplateScope"); b.ToTable("EasyAbpEShopPluginsCouponsCouponTemplateScopes");
}); });
modelBuilder.Entity("EasyAbp.EShop.Plugins.Coupons.Coupons.Coupon", b => modelBuilder.Entity("EasyAbp.EShop.Plugins.Coupons.Coupons.Coupon", b =>

Loading…
Cancel
Save