From c9fad64744b5dbb3b7f2a124dcb17569015f2d70 Mon Sep 17 00:00:00 2001 From: gdlcf88 Date: Fri, 25 Sep 2020 19:50:51 +0800 Subject: [PATCH] Create CouponOrderDiscountProvider --- .../EShop/Orders/Orders/OrderAppService.cs | 2 +- .../Orders/Orders/IOrderDiscountProvider.cs | 2 +- .../EShop/Orders/Orders/IOrderManager.cs | 2 +- .../EasyAbp/EShop/Orders/Orders/Order.cs | 12 +++ .../EasyAbp/EShop/Orders/Orders/OrderLine.cs | 12 +++ .../EShop/Orders/Orders/OrderManager.cs | 4 +- ...CouponOrderCreationAuthorizationHandler.cs | 9 +- .../EShopOrdersPluginsCouponsModule.cs | 3 + ...hopOrdersPluginsCouponsObjectExtensions.cs | 12 +++ .../CouponOrderDiscountProvider.cs | 43 ++++++++- .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++++ .../CouponTemplates/Dtos/CouponTemplateDto.cs | 5 +- .../Dtos/CouponTemplateScopeDto.cs | 2 +- .../Plugins/Coupons/Coupons/Dtos/CouponDto.cs | 2 +- .../Coupons/Dtos/CreateUpdateCouponDto.cs | 1 - .../CouponTemplateAppService.cs | 25 ------ .../CouponTemplateAppService.cs | 88 +++++++++++++++++++ .../Coupons}/Coupons/CouponAppService.cs | 25 +++++- .../CouponsApplicationAutoMapperProfile.cs | 4 +- .../CouponTemplates/CouponTemplateData.cs | 34 +++++++ .../CouponTemplateScopeData.cs | 15 ++++ .../CouponTemplates/ICouponTemplate.cs | 4 - .../ICouponTemplateLookupService.cs | 2 +- .../IHasCouponTemplateScopes.cs | 11 +++ .../Plugins/Coupons/Coupons/CouponData.cs | 21 +++++ .../EShop/Plugins/Coupons/CouponsConsts.cs | 2 + ...asyAbp.EShop.Plugins.Coupons.Domain.csproj | 1 + .../Coupons/CouponTemplates/CouponTemplate.cs | 27 +++++- .../CouponTemplates/CouponTemplateScope.cs | 17 ++++ .../RepositoryCouponTemplateLookupService.cs | 29 ++++++ .../EShop/Plugins/Coupons/Coupons/Coupon.cs | 5 ++ .../Coupons/RepositoryCouponLookupService.cs | 23 +++++ .../Coupons/CouponsDomainAutoMapperProfile.cs | 20 +++++ .../EShopPluginsCouponsDomainModule.cs | 14 ++- ...Shop.Plugins.Coupons.HttpApi.Client.csproj | 1 + .../HttpClientCouponTemplateLookupService.cs | 30 +++++++ .../Coupons/HttpClientCouponLookupService.cs | 24 +++++ .../CouponsHttpApiClientAutoMapperProfile.cs | 22 +++++ .../EShopPluginsCouponsHttpApiClientModule.cs | 11 ++- .../EShopSample.Application.csproj | 1 + .../EShopSampleApplicationModule.cs | 2 + 42 files changed, 546 insertions(+), 56 deletions(-) create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xsd delete mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/CouponTemplates/CouponTemplateAppService.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateAppService.cs rename plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/{ => EasyAbp/EShop/Plugins/Coupons}/Coupons/CouponAppService.cs (52%) create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScopeData.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/IHasCouponTemplateScopes.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponData.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/RepositoryCouponTemplateLookupService.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/RepositoryCouponLookupService.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponsDomainAutoMapperProfile.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/HttpClientCouponTemplateLookupService.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/Coupons/HttpClientCouponLookupService.cs create mode 100644 plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponsHttpApiClientAutoMapperProfile.cs diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs index cd9899f4..f29f5cd7 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs @@ -99,7 +99,7 @@ namespace EasyAbp.EShop.Orders.Orders var order = await _newOrderGenerator.GenerateAsync(CurrentUser.GetId(), input, productDict); - await _orderManager.DiscountAsync(order, input.ExtraProperties); + await _orderManager.DiscountAsync(order); await Repository.InsertAsync(order, autoSave: true); diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderDiscountProvider.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderDiscountProvider.cs index e3f85c61..2fd6dd4b 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderDiscountProvider.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderDiscountProvider.cs @@ -5,6 +5,6 @@ namespace EasyAbp.EShop.Orders.Orders { public interface IOrderDiscountProvider { - Task DiscountAsync(Order order, Dictionary inputExtraProperties); + Task DiscountAsync(Order order); } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs index ccbedfbf..c5c31a81 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs @@ -6,7 +6,7 @@ namespace EasyAbp.EShop.Orders.Orders { public interface IOrderManager : IDomainService { - Task DiscountAsync(Order order, Dictionary inputExtraProperties); + Task DiscountAsync(Order order); Task CompleteAsync(Order order); diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs index 4f3ff094..ee070791 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs @@ -164,5 +164,17 @@ namespace EasyAbp.EShop.Orders.Orders { return !(!PaymentId.HasValue || PaidTime.HasValue); } + + public decimal AddDiscountGetRealDiscountedAmount(Guid orderLineId, decimal expectedDiscountAmount) + { + var orderLine = OrderLines.Single(x => x.Id == orderLineId); + + var realDiscountedAmount = orderLine.AddDiscountGetRealDiscountedAmount(expectedDiscountAmount); + + TotalDiscount += realDiscountedAmount; + ActualTotalPrice -= realDiscountedAmount; + + return realDiscountedAmount; + } } } diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs index 1987a8f1..b1606bdc 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs @@ -112,5 +112,17 @@ namespace EasyAbp.EShop.Orders.Orders RefundedQuantity += quantity; RefundAmount += amount; } + + internal decimal AddDiscountGetRealDiscountedAmount(decimal expectedDiscountAmount) + { + var realDiscountedAmount = ActualTotalPrice - expectedDiscountAmount >= decimal.Zero + ? ActualTotalPrice - expectedDiscountAmount + : ActualTotalPrice; + + TotalDiscount += realDiscountedAmount; + ActualTotalPrice -= realDiscountedAmount; + + return realDiscountedAmount; + } } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs index 315aabbf..55f90f7d 100644 --- a/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs +++ b/modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs @@ -31,11 +31,11 @@ namespace EasyAbp.EShop.Orders.Orders _orderRepository = orderRepository; } - public virtual async Task DiscountAsync(Order order, Dictionary inputExtraProperties) + public virtual async Task DiscountAsync(Order order) { foreach (var provider in ServiceProvider.GetServices()) { - await provider.DiscountAsync(order, inputExtraProperties); + await provider.DiscountAsync(order); } return order; diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs index b3f96d8a..e013ee67 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs @@ -32,16 +32,15 @@ namespace EasyAbp.EShop.Orders.Plugins.Coupons.Authorization protected override async Task HandleOrderCreationAsync(AuthorizationHandlerContext context, OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource) { - var couponId = resource.Input.GetProperty(CouponsConsts.OrderCouponIdPropertyName); - - if (!couponId.HasValue) + if (!Guid.TryParse(resource.Input.GetProperty(CouponsConsts.OrderCouponIdPropertyName), + out var couponId)) { return; } var now = _clock.Now; - var coupon = await _couponLookupService.FindByIdAsync(couponId.Value); + var coupon = await _couponLookupService.FindByIdAsync(couponId); if (coupon == null || coupon.ExpirationTime < now) { @@ -60,7 +59,7 @@ namespace EasyAbp.EShop.Orders.Plugins.Coupons.Authorization } } - protected virtual bool IsOrderInScope(ICouponTemplate couponTemplate, OrderCreationResource resource) + protected virtual bool IsOrderInScope(CouponTemplateData couponTemplate, OrderCreationResource resource) { if (couponTemplate.IsUnscoped) { diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs index 487cbcd4..dd5e980e 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs @@ -1,4 +1,5 @@ using EasyAbp.EShop.Orders.Plugins.Coupons.Authorization; +using EasyAbp.EShop.Orders.Plugins.Coupons.ObjectExtending; using EasyAbp.EShop.Plugins.Coupons; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; @@ -14,6 +15,8 @@ namespace EasyAbp.EShop.Orders.Plugins.Coupons { public override void PreConfigureServices(ServiceConfigurationContext context) { + EShopOrdersPluginsCouponsObjectExtensions.Configure(); + context.Services.AddSingleton(); } } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs index 4c6d7b28..4075d70e 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs @@ -42,6 +42,18 @@ namespace EasyAbp.EShop.Orders.Plugins.Coupons.ObjectExtending config.AddOrUpdateProperty(CouponsConsts.OrderCouponIdPropertyName); } ); + + ObjectExtensionManager.Instance + .AddOrUpdate( + new[] + { + typeof(Order) + }, + config => + { + config.AddOrUpdateProperty(CouponsConsts.OrderCouponDiscountAmountPropertyName); + } + ); }); } } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs index caf756e5..7da1b357 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs @@ -1,15 +1,52 @@ -using System.Collections.Generic; +using System; using System.Threading.Tasks; using EasyAbp.EShop.Orders.Orders; +using EasyAbp.EShop.Plugins.Coupons; +using EasyAbp.EShop.Plugins.Coupons.Coupons; +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace EasyAbp.EShop.Orders.Plugins.Coupons.OrderDiscount { public class CouponOrderDiscountProvider : IOrderDiscountProvider, ITransientDependency { - public async Task DiscountAsync(Order order, Dictionary inputExtraProperties) + private readonly IOrderRepository _orderRepository; + private readonly ICouponLookupService _couponLookupService; + private readonly ICouponTemplateLookupService _couponTemplateLookupService; + + public CouponOrderDiscountProvider( + IOrderRepository orderRepository, + ICouponLookupService couponLookupService, + ICouponTemplateLookupService couponTemplateLookupService) + { + _orderRepository = orderRepository; + _couponLookupService = couponLookupService; + _couponTemplateLookupService = couponTemplateLookupService; + } + + public virtual async Task DiscountAsync(Order order) { - throw new System.NotImplementedException(); + if (!Guid.TryParse(order.GetProperty(CouponsConsts.OrderCouponIdPropertyName), + out var couponId)) + { + return order; + } + + var coupon = await _couponLookupService.FindByIdAsync(couponId); + + var couponTemplate = await _couponTemplateLookupService.FindByIdAsync(coupon.CouponTemplateId); + + // Todo: consume the coupon!!! + + // Todo: get discounted order lines + var discountedAmount = order.AddDiscountGetRealDiscountedAmount(couponTemplate.DiscountAmount); + + order.SetProperty(CouponsConsts.OrderCouponDiscountAmountPropertyName, discountedAmount); + + await _orderRepository.UpdateAsync(order, true); + + return order; } } } \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml new file mode 100644 index 00000000..00e1d9a1 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xsd b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xsd new file mode 100644 index 00000000..3f3946e2 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs index 555b2dae..fb03e486 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs @@ -1,10 +1,11 @@ using System; +using System.Collections.Generic; using Volo.Abp.Application.Dtos; namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos { [Serializable] - public class CouponTemplateDto : FullAuditedEntityDto + public class CouponTemplateDto : FullAuditedEntityDto, ICouponTemplate, IHasCouponTemplateScopes { public Guid? StoreId { get; set; } @@ -29,5 +30,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos public bool IsCrossProductAllowed { get; set; } public bool IsUnscoped { get; set; } + + public List Scopes { get; set; } } } \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateScopeDto.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateScopeDto.cs index 8cb9d7c5..d6602d92 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateScopeDto.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateScopeDto.cs @@ -4,7 +4,7 @@ using Volo.Abp.Application.Dtos; namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos { [Serializable] - public class CouponTemplateScopeDto : FullAuditedEntityDto + public class CouponTemplateScopeDto : FullAuditedEntityDto, ICouponTemplateScope { public Guid StoreId { get; set; } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CouponDto.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CouponDto.cs index 63e9c91a..7634d251 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CouponDto.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CouponDto.cs @@ -4,7 +4,7 @@ using Volo.Abp.Application.Dtos; namespace EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos { [Serializable] - public class CouponDto : FullAuditedEntityDto + public class CouponDto : FullAuditedEntityDto, ICoupon { public Guid CouponTemplateId { get; set; } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CreateUpdateCouponDto.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CreateUpdateCouponDto.cs index a3d2c6c2..57a61400 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CreateUpdateCouponDto.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CreateUpdateCouponDto.cs @@ -1,5 +1,4 @@ using System; -using System.ComponentModel; namespace EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos { [Serializable] diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/CouponTemplates/CouponTemplateAppService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/CouponTemplates/CouponTemplateAppService.cs deleted file mode 100644 index 1ddcaade..00000000 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/CouponTemplates/CouponTemplateAppService.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using EasyAbp.EShop.Plugins.Coupons.Permissions; -using EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; - -namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates -{ - public class CouponTemplateAppService : CrudAppService, - ICouponTemplateAppService - { - protected override string GetPolicyName { get; set; } = CouponsPermissions.CouponTemplate.Default; - protected override string GetListPolicyName { get; set; } = CouponsPermissions.CouponTemplate.Default; - protected override string CreatePolicyName { get; set; } = CouponsPermissions.CouponTemplate.Create; - protected override string UpdatePolicyName { get; set; } = CouponsPermissions.CouponTemplate.Update; - protected override string DeletePolicyName { get; set; } = CouponsPermissions.CouponTemplate.Delete; - - private readonly ICouponTemplateRepository _repository; - - public CouponTemplateAppService(ICouponTemplateRepository repository) : base(repository) - { - _repository = repository; - } - } -} diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateAppService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateAppService.cs new file mode 100644 index 00000000..5981d256 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateAppService.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using EasyAbp.EShop.Plugins.Coupons.Permissions; +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates +{ + public class CouponTemplateAppService : CrudAppService, + ICouponTemplateAppService + { + protected override string GetPolicyName { get; set; } = CouponsPermissions.CouponTemplate.Default; + protected override string GetListPolicyName { get; set; } = CouponsPermissions.CouponTemplate.Default; + protected override string CreatePolicyName { get; set; } = CouponsPermissions.CouponTemplate.Create; + protected override string UpdatePolicyName { get; set; } = CouponsPermissions.CouponTemplate.Update; + protected override string DeletePolicyName { get; set; } = CouponsPermissions.CouponTemplate.Delete; + + private readonly ICouponTemplateRepository _repository; + + public CouponTemplateAppService(ICouponTemplateRepository repository) : base(repository) + { + _repository = repository; + } + + public override async Task CreateAsync(CreateUpdateCouponTemplateDto input) + { + await CheckCreatePolicyAsync(); + + var entity = await MapToEntityAsync(input); + + TryToSetTenantId(entity); + + foreach (var inputScoreDto in input.Scopes) + { + entity.Scopes.Add(new CouponTemplateScope(GuidGenerator.Create(), inputScoreDto.StoreId, + inputScoreDto.ProductGroupName, inputScoreDto.ProductId, inputScoreDto.ProductSkuId)); + } + + await Repository.InsertAsync(entity, autoSave: true); + + return await MapToGetOutputDtoAsync(entity); + } + + public override async Task UpdateAsync(Guid id, CreateUpdateCouponTemplateDto input) + { + await CheckUpdatePolicyAsync(); + + var entity = await GetEntityByIdAsync(id); + + await MapToEntityAsync(input, entity); + + foreach (var inputScoreDto in input.Scopes.Where(dto => !ExistScope(entity.Scopes, dto))) + { + entity.Scopes.Add(new CouponTemplateScope(GuidGenerator.Create(), inputScoreDto.StoreId, + inputScoreDto.ProductGroupName, inputScoreDto.ProductId, inputScoreDto.ProductSkuId)); + } + + foreach (var scope in entity.Scopes.Where(scope => !ExistScope(input.Scopes, scope))) + { + entity.Scopes.Remove(scope); + } + + await Repository.UpdateAsync(entity, autoSave: true); + + return await MapToGetOutputDtoAsync(entity); + } + + protected virtual bool ExistScope(IEnumerable scopes, ICouponTemplateScope need) + { + return scopes.Any(x => x.StoreId == need.StoreId && + x.ProductGroupName == need.ProductGroupName && + x.ProductId == need.ProductId && + x.ProductSkuId == need.ProductSkuId); + } + + protected virtual bool ExistScope(IEnumerable scopes, CreateUpdateCouponTemplateScopeDto dto) + { + return scopes.Any(x => x.StoreId == dto.StoreId && + x.ProductGroupName == dto.ProductGroupName && + x.ProductId == dto.ProductId && + x.ProductSkuId == dto.ProductSkuId); + } + } +} diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/Coupons/CouponAppService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponAppService.cs similarity index 52% rename from plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/Coupons/CouponAppService.cs rename to plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponAppService.cs index 55ca4161..47661ce1 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/Coupons/CouponAppService.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponAppService.cs @@ -1,6 +1,8 @@ using System; +using System.Threading.Tasks; using EasyAbp.EShop.Plugins.Coupons.Permissions; using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos; +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; @@ -15,11 +17,32 @@ namespace EasyAbp.EShop.Plugins.Coupons.Coupons protected override string UpdatePolicyName { get; set; } = CouponsPermissions.Coupon.Update; protected override string DeletePolicyName { get; set; } = CouponsPermissions.Coupon.Delete; + private readonly ICouponTemplateRepository _couponTemplateRepository; private readonly ICouponRepository _repository; - public CouponAppService(ICouponRepository repository) : base(repository) + public CouponAppService( + ICouponTemplateRepository couponTemplateRepository, + ICouponRepository repository) : base(repository) { + _couponTemplateRepository = couponTemplateRepository; _repository = repository; } + + public override async Task CreateAsync(CreateUpdateCouponDto input) + { + await CheckCreatePolicyAsync(); + + var couponTemplate = await _couponTemplateRepository.GetAsync(input.CouponTemplateId); + + var entity = await MapToEntityAsync(input); + + TryToSetTenantId(entity); + + entity.SetExpirationTime(couponTemplate.GetCalculatedExpirationTime(Clock)); + + await Repository.InsertAsync(entity, autoSave: true); + + return await MapToGetOutputDtoAsync(entity); + } } } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponsApplicationAutoMapperProfile.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponsApplicationAutoMapperProfile.cs index b34841ff..9eb5f09e 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponsApplicationAutoMapperProfile.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponsApplicationAutoMapperProfile.cs @@ -3,6 +3,7 @@ using EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos; using EasyAbp.EShop.Plugins.Coupons.Coupons; using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos; using AutoMapper; +using Volo.Abp.AutoMapper; namespace EasyAbp.EShop.Plugins.Coupons { @@ -14,7 +15,8 @@ namespace EasyAbp.EShop.Plugins.Coupons * Alternatively, you can split your mapping configurations * into multiple profile classes for a better organization. */ CreateMap(); - CreateMap(MemberList.Source); + CreateMap(MemberList.Source) + .Ignore(x => x.Scopes); CreateMap(); CreateMap(MemberList.Source); diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs new file mode 100644 index 00000000..dbe70771 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates +{ + public class CouponTemplateData : ICouponTemplate, IHasCouponTemplateScopes + { + public Guid? StoreId { get; set; } + + public CouponType CouponType { get; set; } + + public string UniqueName { get; set; } + + public string DisplayName { get; set; } + + public string Description { get; set; } + + public TimeSpan? UsableDuration { get; set; } + + public DateTime? UsableBeginTime { get; set; } + + public DateTime? UsableEndTime { get; set; } + + public decimal ConditionAmount { get; set; } + + public decimal DiscountAmount { get; set; } + + public bool IsCrossProductAllowed { get; set; } + + public bool IsUnscoped { get; set; } + + public List Scopes { get; set; } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScopeData.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScopeData.cs new file mode 100644 index 00000000..0333cae1 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScopeData.cs @@ -0,0 +1,15 @@ +using System; + +namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates +{ + public class CouponTemplateScopeData : ICouponTemplateScope + { + public Guid StoreId { get; set; } + + public string ProductGroupName { get; set; } + + public Guid? ProductId { get; set; } + + public Guid? ProductSkuId { get; set; } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs index 79867912..ab640f21 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs @@ -6,8 +6,6 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates { public interface ICouponTemplate { - Guid? TenantId { get; } - Guid? StoreId { get; } CouponType CouponType { get; } @@ -34,7 +32,5 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates bool IsCrossProductAllowed { get; } bool IsUnscoped { get; } - - IEnumerable Scopes { get; } } } \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs index 53e618db..a876f41f 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs @@ -6,6 +6,6 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates { public interface ICouponTemplateLookupService { - Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default); + Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/IHasCouponTemplateScopes.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/IHasCouponTemplateScopes.cs new file mode 100644 index 00000000..709369f1 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/IHasCouponTemplateScopes.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates +{ + public interface IHasCouponTemplateScopes where T : ICouponTemplateScope + { + List Scopes { get; } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponData.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponData.cs new file mode 100644 index 00000000..73611f66 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponData.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates; + +namespace EasyAbp.EShop.Plugins.Coupons.Coupons +{ + public class CouponData : ICoupon + { + public Guid CouponTemplateId { get; set; } + + public Guid UserId { get; set; } + + public Guid? OrderId { get; set; } + + public DateTime? ExpirationTime { get; set; } + + public DateTime? UsedTime { get; set; } + + public decimal? DiscountedAmount { get; set; } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponsConsts.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponsConsts.cs index 3eeeb727..7812f526 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponsConsts.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponsConsts.cs @@ -3,5 +3,7 @@ public static class CouponsConsts { public const string OrderCouponIdPropertyName = "CouponId"; + + public const string OrderCouponDiscountAmountPropertyName = "CouponDiscountAmount"; } } \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj index 66970ceb..b6cf3cec 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj @@ -8,6 +8,7 @@ + diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs index bff692ea..1b14507b 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs @@ -3,10 +3,11 @@ using System.Collections.Generic; using JetBrains.Annotations; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; +using Volo.Abp.Timing; namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates { - public class CouponTemplate : FullAuditedAggregateRoot, ICouponTemplate, IMultiTenant + public class CouponTemplate : FullAuditedAggregateRoot, ICouponTemplate, IHasCouponTemplateScopes, IMultiTenant { public virtual Guid? TenantId { get; protected set; } @@ -54,10 +55,11 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates /// public virtual bool IsUnscoped { get; protected set; } - public virtual IEnumerable Scopes { get; protected set; } + public virtual List Scopes { get; protected set; } protected CouponTemplate() { + Scopes = new List(); } public CouponTemplate( @@ -75,7 +77,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates decimal discountAmount, bool isCrossProductAllowed, bool isUnscoped, - IEnumerable scopes + List scopes ) : base(id) { TenantId = tenantId; @@ -91,7 +93,24 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates DiscountAmount = discountAmount; IsCrossProductAllowed = isCrossProductAllowed; IsUnscoped = isUnscoped; - Scopes = scopes; + Scopes = scopes ?? new List(); + } + + public DateTime? GetCalculatedExpirationTime(IClock clock) + { + DateTime? expirationTime = null; + + if (UsableDuration.HasValue) + { + expirationTime = clock.Now + UsableDuration; + } + + if (UsableEndTime.HasValue && (expirationTime == null || UsableEndTime.Value < expirationTime)) + { + expirationTime = UsableEndTime; + } + + return expirationTime; } } } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs index 11bba60e..db67c040 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs @@ -23,5 +23,22 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates /// Specified product SKU can use the coupon if this property is set. /// public virtual Guid? ProductSkuId { get; protected set; } + + protected CouponTemplateScope() + { + } + + public CouponTemplateScope( + Guid id, + Guid storeId, + [CanBeNull] string productGroupName, + Guid? productId, + Guid? productSkuId) : base(id) + { + StoreId = storeId; + ProductGroupName = productGroupName; + ProductId = productId; + ProductSkuId = productSkuId; + } } } \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/RepositoryCouponTemplateLookupService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/RepositoryCouponTemplateLookupService.cs new file mode 100644 index 00000000..6c0bfab4 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/RepositoryCouponTemplateLookupService.cs @@ -0,0 +1,29 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.ObjectMapping; + +namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates +{ + public class RepositoryCouponTemplateLookupService : ICouponTemplateLookupService, ITransientDependency + { + private readonly IObjectMapper _objectMapper; + private readonly ICouponTemplateRepository _couponTemplateRepository; + + public RepositoryCouponTemplateLookupService( + IObjectMapper objectMapper, + ICouponTemplateRepository couponTemplateRepository) + { + // Todo: use ICouponTemplateStore + _objectMapper = objectMapper; + _couponTemplateRepository = couponTemplateRepository; + } + + public virtual async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return _objectMapper.Map( + await _couponTemplateRepository.FindAsync(id, true, cancellationToken)); + } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/Coupon.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/Coupon.cs index 177475d1..4b0ce7cd 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/Coupon.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/Coupon.cs @@ -39,6 +39,11 @@ namespace EasyAbp.EShop.Plugins.Coupons.Coupons ExpirationTime = expirationTime; } + public void SetExpirationTime(DateTime? expirationTime) + { + ExpirationTime = expirationTime; + } + public void Use(DateTime? usedTime, decimal? discountedAmount) { UsedTime = usedTime; diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/RepositoryCouponLookupService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/RepositoryCouponLookupService.cs new file mode 100644 index 00000000..0935df44 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/RepositoryCouponLookupService.cs @@ -0,0 +1,23 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace EasyAbp.EShop.Plugins.Coupons.Coupons +{ + public class RepositoryCouponLookupService : ICouponLookupService, ITransientDependency + { + private readonly ICouponRepository _couponRepository; + + public RepositoryCouponLookupService( + ICouponRepository couponRepository) + { + _couponRepository = couponRepository; + } + + public virtual async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return await _couponRepository.FindAsync(id, true, cancellationToken); + } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponsDomainAutoMapperProfile.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponsDomainAutoMapperProfile.cs new file mode 100644 index 00000000..2653460e --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponsDomainAutoMapperProfile.cs @@ -0,0 +1,20 @@ +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates; +using AutoMapper; +using EasyAbp.EShop.Plugins.Coupons.Coupons; + +namespace EasyAbp.EShop.Plugins.Coupons +{ + public class CouponsDomainAutoMapperProfile : Profile + { + public CouponsDomainAutoMapperProfile() + { + /* You can configure your AutoMapper mapping configuration here. + * Alternatively, you can split your mapping configurations + * into multiple profile classes for a better organization. */ + CreateMap(MemberList.Destination); + + CreateMap(MemberList.Destination); + CreateMap(MemberList.Destination); + } + } +} diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs index cfae6728..6197fa1a 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs @@ -1,14 +1,24 @@ -using Volo.Abp.Domain; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AutoMapper; +using Volo.Abp.Domain; using Volo.Abp.Modularity; namespace EasyAbp.EShop.Plugins.Coupons { [DependsOn( + typeof(AbpAutoMapperModule), typeof(AbpDddDomainModule), typeof(EShopPluginsCouponsDomainSharedModule) )] public class EShopPluginsCouponsDomainModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + Configure(options => + { + options.AddMaps(validate: true); + }); + } } } diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client.csproj b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client.csproj index 1d803e4c..e6d9f7c6 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client.csproj +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client.csproj @@ -9,6 +9,7 @@ + diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/HttpClientCouponTemplateLookupService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/HttpClientCouponTemplateLookupService.cs new file mode 100644 index 00000000..abe2ad63 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/HttpClientCouponTemplateLookupService.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos; +using Volo.Abp.DependencyInjection; +using Volo.Abp.ObjectMapping; + +namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates +{ + [Dependency(TryRegister = true)] + public class HttpClientCouponTemplateLookupService : ICouponTemplateLookupService, ITransientDependency + { + private readonly IObjectMapper _objectMapper; + private readonly ICouponTemplateAppService _couponTemplateAppService; + + public HttpClientCouponTemplateLookupService( + IObjectMapper objectMapper, + ICouponTemplateAppService couponTemplateAppService) + { + _objectMapper = objectMapper; + _couponTemplateAppService = couponTemplateAppService; + } + + public virtual async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return _objectMapper.Map( + await _couponTemplateAppService.GetAsync(id)); + } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/Coupons/HttpClientCouponLookupService.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/Coupons/HttpClientCouponLookupService.cs new file mode 100644 index 00000000..07489406 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/Coupons/HttpClientCouponLookupService.cs @@ -0,0 +1,24 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace EasyAbp.EShop.Plugins.Coupons.Coupons +{ + [Dependency(TryRegister = true)] + public class HttpClientCouponLookupService : ICouponLookupService, ITransientDependency + { + private readonly ICouponAppService _couponAppService; + + public HttpClientCouponLookupService( + ICouponAppService couponAppService) + { + _couponAppService = couponAppService; + } + + public virtual async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return await _couponAppService.GetAsync(id); + } + } +} \ No newline at end of file diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponsHttpApiClientAutoMapperProfile.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponsHttpApiClientAutoMapperProfile.cs new file mode 100644 index 00000000..cd2fcb25 --- /dev/null +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponsHttpApiClientAutoMapperProfile.cs @@ -0,0 +1,22 @@ +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates; +using EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos; +using AutoMapper; +using EasyAbp.EShop.Plugins.Coupons.Coupons; +using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos; + +namespace EasyAbp.EShop.Plugins.Coupons +{ + public class CouponsHttpApiClientAutoMapperProfile : Profile + { + public CouponsHttpApiClientAutoMapperProfile() + { + /* You can configure your AutoMapper mapping configuration here. + * Alternatively, you can split your mapping configurations + * into multiple profile classes for a better organization. */ + CreateMap(MemberList.Destination); + + CreateMap(MemberList.Destination); + CreateMap(MemberList.Destination); + } + } +} diff --git a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsHttpApiClientModule.cs b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsHttpApiClientModule.cs index 3064001a..9f6b1c66 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsHttpApiClientModule.cs +++ b/plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsHttpApiClientModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AutoMapper; using Volo.Abp.Http.Client; using Volo.Abp.Modularity; @@ -6,13 +7,21 @@ namespace EasyAbp.EShop.Plugins.Coupons { [DependsOn( typeof(EShopPluginsCouponsApplicationContractsModule), - typeof(AbpHttpClientModule))] + typeof(AbpHttpClientModule), + typeof(AbpAutoMapperModule) + )] public class EShopPluginsCouponsHttpApiClientModule : AbpModule { public const string RemoteServiceName = "EasyAbpEShopPluginsCoupons"; public override void ConfigureServices(ServiceConfigurationContext context) { + context.Services.AddAutoMapperObjectMapper(); + Configure(options => + { + options.AddMaps(validate: true); + }); + context.Services.AddHttpClientProxies( typeof(EShopPluginsCouponsApplicationContractsModule).Assembly, RemoteServiceName diff --git a/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSample.Application.csproj b/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSample.Application.csproj index 7f164cbe..33caa4e5 100644 --- a/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSample.Application.csproj +++ b/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSample.Application.csproj @@ -11,6 +11,7 @@ + diff --git a/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSampleApplicationModule.cs b/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSampleApplicationModule.cs index 96e4ea97..b6eb7520 100644 --- a/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSampleApplicationModule.cs +++ b/samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSampleApplicationModule.cs @@ -1,4 +1,5 @@ using EasyAbp.EShop; +using EasyAbp.EShop.Orders.Plugins.Coupons; using EasyAbp.EShop.Plugins.Baskets; using EasyAbp.EShop.Plugins.Coupons; using EasyAbp.PaymentService; @@ -25,6 +26,7 @@ namespace EShopSample typeof(EShopApplicationModule), typeof(EShopPluginsBasketsApplicationModule), typeof(EShopPluginsCouponsApplicationModule), + typeof(EShopOrdersPluginsCouponsModule), typeof(PaymentServiceApplicationModule), typeof(PaymentServiceWeChatPayApplicationModule), typeof(PaymentServicePrepaymentApplicationModule)