Browse Source

Create CouponOrderDiscountProvider

pull/103/head
gdlcf88 6 years ago
parent
commit
c9fad64744
  1. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs
  2. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderDiscountProvider.cs
  3. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs
  4. 12
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/Order.cs
  5. 12
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderLine.cs
  6. 4
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs
  7. 9
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/Authorization/CouponOrderCreationAuthorizationHandler.cs
  8. 3
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/EShopOrdersPluginsCouponsModule.cs
  9. 12
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/ObjectExtending/EShopOrdersPluginsCouponsObjectExtensions.cs
  10. 43
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/EasyAbp/EShop/Orders/Plugins/Coupons/OrderDiscount/CouponOrderDiscountProvider.cs
  11. 3
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml
  12. 30
      plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xsd
  13. 5
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateDto.cs
  14. 2
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/Dtos/CouponTemplateScopeDto.cs
  15. 2
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CouponDto.cs
  16. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application.Contracts/EasyAbp/EShop/Plugins/Coupons/Coupons/Dtos/CreateUpdateCouponDto.cs
  17. 25
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/CouponTemplates/CouponTemplateAppService.cs
  18. 88
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateAppService.cs
  19. 25
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponAppService.cs
  20. 4
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/CouponsApplicationAutoMapperProfile.cs
  21. 34
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateData.cs
  22. 15
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScopeData.cs
  23. 4
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplate.cs
  24. 2
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/ICouponTemplateLookupService.cs
  25. 11
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/IHasCouponTemplateScopes.cs
  26. 21
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponData.cs
  27. 2
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain.Shared/EasyAbp/EShop/Plugins/Coupons/CouponsConsts.cs
  28. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp.EShop.Plugins.Coupons.Domain.csproj
  29. 27
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplate.cs
  30. 17
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/CouponTemplateScope.cs
  31. 29
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/RepositoryCouponTemplateLookupService.cs
  32. 5
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/Coupon.cs
  33. 23
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/Coupons/RepositoryCouponLookupService.cs
  34. 20
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/CouponsDomainAutoMapperProfile.cs
  35. 14
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Domain/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsDomainModule.cs
  36. 1
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client.csproj
  37. 30
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponTemplates/HttpClientCouponTemplateLookupService.cs
  38. 24
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/Coupons/HttpClientCouponLookupService.cs
  39. 22
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/CouponsHttpApiClientAutoMapperProfile.cs
  40. 11
      plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsHttpApiClientModule.cs
  41. 1
      samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSample.Application.csproj
  42. 2
      samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSampleApplicationModule.cs

2
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); 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); await Repository.InsertAsync(order, autoSave: true);

2
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 public interface IOrderDiscountProvider
{ {
Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties); Task<Order> DiscountAsync(Order order);
} }
} }

2
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 public interface IOrderManager : IDomainService
{ {
Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties); Task<Order> DiscountAsync(Order order);
Task<Order> CompleteAsync(Order order); Task<Order> CompleteAsync(Order order);

12
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); 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;
}
} }
} }

12
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; RefundedQuantity += quantity;
RefundAmount += amount; RefundAmount += amount;
} }
internal decimal AddDiscountGetRealDiscountedAmount(decimal expectedDiscountAmount)
{
var realDiscountedAmount = ActualTotalPrice - expectedDiscountAmount >= decimal.Zero
? ActualTotalPrice - expectedDiscountAmount
: ActualTotalPrice;
TotalDiscount += realDiscountedAmount;
ActualTotalPrice -= realDiscountedAmount;
return realDiscountedAmount;
}
} }
} }

4
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; _orderRepository = orderRepository;
} }
public virtual async Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties) public virtual async Task<Order> DiscountAsync(Order order)
{ {
foreach (var provider in ServiceProvider.GetServices<IOrderDiscountProvider>()) foreach (var provider in ServiceProvider.GetServices<IOrderDiscountProvider>())
{ {
await provider.DiscountAsync(order, inputExtraProperties); await provider.DiscountAsync(order);
} }
return order; return order;

9
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, protected override async Task HandleOrderCreationAsync(AuthorizationHandlerContext context,
OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource) OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource)
{ {
var couponId = resource.Input.GetProperty<Guid?>(CouponsConsts.OrderCouponIdPropertyName); if (!Guid.TryParse(resource.Input.GetProperty<string>(CouponsConsts.OrderCouponIdPropertyName),
out var couponId))
if (!couponId.HasValue)
{ {
return; return;
} }
var now = _clock.Now; var now = _clock.Now;
var coupon = await _couponLookupService.FindByIdAsync(couponId.Value); var coupon = await _couponLookupService.FindByIdAsync(couponId);
if (coupon == null || coupon.ExpirationTime < now) 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) if (couponTemplate.IsUnscoped)
{ {

3
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.Authorization;
using EasyAbp.EShop.Orders.Plugins.Coupons.ObjectExtending;
using EasyAbp.EShop.Plugins.Coupons; using EasyAbp.EShop.Plugins.Coupons;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -14,6 +15,8 @@ namespace EasyAbp.EShop.Orders.Plugins.Coupons
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) public override void PreConfigureServices(ServiceConfigurationContext context)
{ {
EShopOrdersPluginsCouponsObjectExtensions.Configure();
context.Services.AddSingleton<IAuthorizationHandler, CouponOrderCreationAuthorizationHandler>(); context.Services.AddSingleton<IAuthorizationHandler, CouponOrderCreationAuthorizationHandler>();
} }
} }

12
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<Guid?>(CouponsConsts.OrderCouponIdPropertyName); config.AddOrUpdateProperty<Guid?>(CouponsConsts.OrderCouponIdPropertyName);
} }
); );
ObjectExtensionManager.Instance
.AddOrUpdate(
new[]
{
typeof(Order)
},
config =>
{
config.AddOrUpdateProperty<decimal>(CouponsConsts.OrderCouponDiscountAmountPropertyName);
}
);
}); });
} }
} }

43
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 System.Threading.Tasks;
using EasyAbp.EShop.Orders.Orders; 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; using Volo.Abp.DependencyInjection;
namespace EasyAbp.EShop.Orders.Plugins.Coupons.OrderDiscount namespace EasyAbp.EShop.Orders.Plugins.Coupons.OrderDiscount
{ {
public class CouponOrderDiscountProvider : IOrderDiscountProvider, ITransientDependency public class CouponOrderDiscountProvider : IOrderDiscountProvider, ITransientDependency
{ {
public async Task<Order> DiscountAsync(Order order, Dictionary<string, object> 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<Order> DiscountAsync(Order order)
{ {
throw new System.NotImplementedException(); if (!Guid.TryParse(order.GetProperty<string>(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;
} }
} }
} }

3
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait />
</Weavers>

30
plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

5
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;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos
{ {
[Serializable] [Serializable]
public class CouponTemplateDto : FullAuditedEntityDto<Guid> public class CouponTemplateDto : FullAuditedEntityDto<Guid>, ICouponTemplate, IHasCouponTemplateScopes<CouponTemplateScopeDto>
{ {
public Guid? StoreId { get; set; } public Guid? StoreId { get; set; }
@ -29,5 +30,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos
public bool IsCrossProductAllowed { get; set; } public bool IsCrossProductAllowed { get; set; }
public bool IsUnscoped { get; set; } public bool IsUnscoped { get; set; }
public List<CouponTemplateScopeDto> Scopes { get; set; }
} }
} }

2
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 namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos
{ {
[Serializable] [Serializable]
public class CouponTemplateScopeDto : FullAuditedEntityDto<Guid> public class CouponTemplateScopeDto : FullAuditedEntityDto<Guid>, ICouponTemplateScope
{ {
public Guid StoreId { get; set; } public Guid StoreId { get; set; }

2
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 namespace EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos
{ {
[Serializable] [Serializable]
public class CouponDto : FullAuditedEntityDto<Guid> public class CouponDto : FullAuditedEntityDto<Guid>, ICoupon
{ {
public Guid CouponTemplateId { get; set; } public Guid CouponTemplateId { get; set; }

1
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;
using System.ComponentModel;
namespace EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos namespace EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos
{ {
[Serializable] [Serializable]

25
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/CouponTemplates/CouponTemplateAppService.cs

@ -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<CouponTemplate, CouponTemplateDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateCouponTemplateDto, CreateUpdateCouponTemplateDto>,
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;
}
}
}

88
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<CouponTemplate, CouponTemplateDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateCouponTemplateDto, CreateUpdateCouponTemplateDto>,
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<CouponTemplateDto> 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<CouponTemplateDto> 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<CreateUpdateCouponTemplateScopeDto> 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<ICouponTemplateScope> scopes, CreateUpdateCouponTemplateScopeDto dto)
{
return scopes.Any(x => x.StoreId == dto.StoreId &&
x.ProductGroupName == dto.ProductGroupName &&
x.ProductId == dto.ProductId &&
x.ProductSkuId == dto.ProductSkuId);
}
}
}

25
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/Coupons/CouponAppService.cs → plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.Application/EasyAbp/EShop/Plugins/Coupons/Coupons/CouponAppService.cs

@ -1,6 +1,8 @@
using System; using System;
using System.Threading.Tasks;
using EasyAbp.EShop.Plugins.Coupons.Permissions; using EasyAbp.EShop.Plugins.Coupons.Permissions;
using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos; using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos;
using EasyAbp.EShop.Plugins.Coupons.CouponTemplates;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; 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 UpdatePolicyName { get; set; } = CouponsPermissions.Coupon.Update;
protected override string DeletePolicyName { get; set; } = CouponsPermissions.Coupon.Delete; protected override string DeletePolicyName { get; set; } = CouponsPermissions.Coupon.Delete;
private readonly ICouponTemplateRepository _couponTemplateRepository;
private readonly ICouponRepository _repository; private readonly ICouponRepository _repository;
public CouponAppService(ICouponRepository repository) : base(repository) public CouponAppService(
ICouponTemplateRepository couponTemplateRepository,
ICouponRepository repository) : base(repository)
{ {
_couponTemplateRepository = couponTemplateRepository;
_repository = repository; _repository = repository;
} }
public override async Task<CouponDto> 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);
}
} }
} }

4
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;
using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos; using EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos;
using AutoMapper; using AutoMapper;
using Volo.Abp.AutoMapper;
namespace EasyAbp.EShop.Plugins.Coupons namespace EasyAbp.EShop.Plugins.Coupons
{ {
@ -14,7 +15,8 @@ namespace EasyAbp.EShop.Plugins.Coupons
* Alternatively, you can split your mapping configurations * Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */ * into multiple profile classes for a better organization. */
CreateMap<CouponTemplate, CouponTemplateDto>(); CreateMap<CouponTemplate, CouponTemplateDto>();
CreateMap<CreateUpdateCouponTemplateDto, CouponTemplate>(MemberList.Source); CreateMap<CreateUpdateCouponTemplateDto, CouponTemplate>(MemberList.Source)
.Ignore(x => x.Scopes);
CreateMap<CouponTemplateScope, CouponTemplateScopeDto>(); CreateMap<CouponTemplateScope, CouponTemplateScopeDto>();
CreateMap<CreateUpdateCouponTemplateScopeDto, CouponTemplateScope>(MemberList.Source); CreateMap<CreateUpdateCouponTemplateScopeDto, CouponTemplateScope>(MemberList.Source);

34
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<CouponTemplateScopeData>
{
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<CouponTemplateScopeData> Scopes { get; set; }
}
}

15
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; }
}
}

4
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 public interface ICouponTemplate
{ {
Guid? TenantId { get; }
Guid? StoreId { get; } Guid? StoreId { get; }
CouponType CouponType { get; } CouponType CouponType { get; }
@ -34,7 +32,5 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
bool IsCrossProductAllowed { get; } bool IsCrossProductAllowed { get; }
bool IsUnscoped { get; } bool IsUnscoped { get; }
IEnumerable<ICouponTemplateScope> Scopes { get; }
} }
} }

2
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 public interface ICouponTemplateLookupService
{ {
Task<ICouponTemplate> FindByIdAsync(Guid id, CancellationToken cancellationToken = default); Task<CouponTemplateData> FindByIdAsync(Guid id, CancellationToken cancellationToken = default);
} }
} }

11
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<T> where T : ICouponTemplateScope
{
List<T> Scopes { get; }
}
}

21
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; }
}
}

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

@ -3,5 +3,7 @@
public static class CouponsConsts public static class CouponsConsts
{ {
public const string OrderCouponIdPropertyName = "CouponId"; public const string OrderCouponIdPropertyName = "CouponId";
public const string OrderCouponDiscountAmountPropertyName = "CouponDiscountAmount";
} }
} }

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

@ -8,6 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AutoMapper" Version="3.1.2" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="3.1.2" /> <PackageReference Include="Volo.Abp.Ddd.Domain" Version="3.1.2" />
<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>

27
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 JetBrains.Annotations;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
{ {
public class CouponTemplate : FullAuditedAggregateRoot<Guid>, ICouponTemplate, IMultiTenant public class CouponTemplate : FullAuditedAggregateRoot<Guid>, ICouponTemplate, IHasCouponTemplateScopes<CouponTemplateScope>, IMultiTenant
{ {
public virtual Guid? TenantId { get; protected set; } public virtual Guid? TenantId { get; protected set; }
@ -54,10 +55,11 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
/// </summary> /// </summary>
public virtual bool IsUnscoped { get; protected set; } public virtual bool IsUnscoped { get; protected set; }
public virtual IEnumerable<ICouponTemplateScope> Scopes { get; protected set; } public virtual List<CouponTemplateScope> Scopes { get; protected set; }
protected CouponTemplate() protected CouponTemplate()
{ {
Scopes = new List<CouponTemplateScope>();
} }
public CouponTemplate( public CouponTemplate(
@ -75,7 +77,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
decimal discountAmount, decimal discountAmount,
bool isCrossProductAllowed, bool isCrossProductAllowed,
bool isUnscoped, bool isUnscoped,
IEnumerable<CouponTemplateScope> scopes List<CouponTemplateScope> scopes
) : base(id) ) : base(id)
{ {
TenantId = tenantId; TenantId = tenantId;
@ -91,7 +93,24 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
DiscountAmount = discountAmount; DiscountAmount = discountAmount;
IsCrossProductAllowed = isCrossProductAllowed; IsCrossProductAllowed = isCrossProductAllowed;
IsUnscoped = isUnscoped; IsUnscoped = isUnscoped;
Scopes = scopes; Scopes = scopes ?? new List<CouponTemplateScope>();
}
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;
} }
} }
} }

17
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. /// Specified product SKU can use the coupon if this property is set.
/// </summary> /// </summary>
public virtual Guid? ProductSkuId { get; protected 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;
}
} }
} }

29
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<CouponTemplateData> FindByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return _objectMapper.Map<CouponTemplate, CouponTemplateData>(
await _couponTemplateRepository.FindAsync(id, true, cancellationToken));
}
}
}

5
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; ExpirationTime = expirationTime;
} }
public void SetExpirationTime(DateTime? expirationTime)
{
ExpirationTime = expirationTime;
}
public void Use(DateTime? usedTime, decimal? discountedAmount) public void Use(DateTime? usedTime, decimal? discountedAmount)
{ {
UsedTime = usedTime; UsedTime = usedTime;

23
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<ICoupon> FindByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return await _couponRepository.FindAsync(id, true, cancellationToken);
}
}
}

20
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<Coupon, CouponData>(MemberList.Destination);
CreateMap<CouponTemplate, CouponTemplateData>(MemberList.Destination);
CreateMap<CouponTemplateScope, CouponTemplateScopeData>(MemberList.Destination);
}
}
}

14
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; using Volo.Abp.Modularity;
namespace EasyAbp.EShop.Plugins.Coupons namespace EasyAbp.EShop.Plugins.Coupons
{ {
[DependsOn( [DependsOn(
typeof(AbpAutoMapperModule),
typeof(AbpDddDomainModule), typeof(AbpDddDomainModule),
typeof(EShopPluginsCouponsDomainSharedModule) typeof(EShopPluginsCouponsDomainSharedModule)
)] )]
public class EShopPluginsCouponsDomainModule : AbpModule public class EShopPluginsCouponsDomainModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<EShopPluginsCouponsDomainModule>();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<EShopPluginsCouponsDomainModule>(validate: true);
});
}
} }
} }

1
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client.csproj

@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Http.Client" Version="3.1.2" /> <PackageReference Include="Volo.Abp.Http.Client" Version="3.1.2" />
<PackageReference Include="Volo.Abp.AutoMapper" Version="3.1.2" />
<ProjectReference Include="..\EasyAbp.EShop.Plugins.Coupons.Application.Contracts\EasyAbp.EShop.Plugins.Coupons.Application.Contracts.csproj" /> <ProjectReference Include="..\EasyAbp.EShop.Plugins.Coupons.Application.Contracts\EasyAbp.EShop.Plugins.Coupons.Application.Contracts.csproj" />
</ItemGroup> </ItemGroup>

30
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<CouponTemplateData> FindByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return _objectMapper.Map<CouponTemplateDto, CouponTemplateData>(
await _couponTemplateAppService.GetAsync(id));
}
}
}

24
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<ICoupon> FindByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return await _couponAppService.GetAsync(id);
}
}
}

22
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<CouponDto, CouponData>(MemberList.Destination);
CreateMap<CouponTemplateDto, CouponTemplateData>(MemberList.Destination);
CreateMap<CouponTemplateScopeDto, CouponTemplateScopeData>(MemberList.Destination);
}
}
}

11
plugins/Coupons/src/EasyAbp.EShop.Plugins.Coupons.HttpApi.Client/EasyAbp/EShop/Plugins/Coupons/EShopPluginsCouponsHttpApiClientModule.cs

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AutoMapper;
using Volo.Abp.Http.Client; using Volo.Abp.Http.Client;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -6,13 +7,21 @@ namespace EasyAbp.EShop.Plugins.Coupons
{ {
[DependsOn( [DependsOn(
typeof(EShopPluginsCouponsApplicationContractsModule), typeof(EShopPluginsCouponsApplicationContractsModule),
typeof(AbpHttpClientModule))] typeof(AbpHttpClientModule),
typeof(AbpAutoMapperModule)
)]
public class EShopPluginsCouponsHttpApiClientModule : AbpModule public class EShopPluginsCouponsHttpApiClientModule : AbpModule
{ {
public const string RemoteServiceName = "EasyAbpEShopPluginsCoupons"; public const string RemoteServiceName = "EasyAbpEShopPluginsCoupons";
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
context.Services.AddAutoMapperObjectMapper<EShopPluginsCouponsHttpApiClientModule>();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<EShopPluginsCouponsHttpApiClientModule>(validate: true);
});
context.Services.AddHttpClientProxies( context.Services.AddHttpClientProxies(
typeof(EShopPluginsCouponsApplicationContractsModule).Assembly, typeof(EShopPluginsCouponsApplicationContractsModule).Assembly,
RemoteServiceName RemoteServiceName

1
samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSample.Application.csproj

@ -11,6 +11,7 @@
<ProjectReference Include="..\..\..\..\..\integration\EasyAbp.EShop\src\EasyAbp.EShop.Application\EasyAbp.EShop.Application.csproj" /> <ProjectReference Include="..\..\..\..\..\integration\EasyAbp.EShop\src\EasyAbp.EShop.Application\EasyAbp.EShop.Application.csproj" />
<ProjectReference Include="..\..\..\..\..\plugins\Baskets\src\EasyAbp.EShop.Plugins.Baskets.Application\EasyAbp.EShop.Plugins.Baskets.Application.csproj" /> <ProjectReference Include="..\..\..\..\..\plugins\Baskets\src\EasyAbp.EShop.Plugins.Baskets.Application\EasyAbp.EShop.Plugins.Baskets.Application.csproj" />
<ProjectReference Include="..\..\..\..\..\plugins\Coupons\src\EasyAbp.EShop.Plugins.Coupons.Application\EasyAbp.EShop.Plugins.Coupons.Application.csproj" /> <ProjectReference Include="..\..\..\..\..\plugins\Coupons\src\EasyAbp.EShop.Plugins.Coupons.Application\EasyAbp.EShop.Plugins.Coupons.Application.csproj" />
<ProjectReference Include="..\..\..\..\..\plugins\Coupons\src\EasyAbp.EShop.Orders.Plugins.Coupons\EasyAbp.EShop.Orders.Plugins.Coupons.csproj" />
<ProjectReference Include="..\EShopSample.Domain\EShopSample.Domain.csproj" /> <ProjectReference Include="..\EShopSample.Domain\EShopSample.Domain.csproj" />
<ProjectReference Include="..\EShopSample.Application.Contracts\EShopSample.Application.Contracts.csproj" /> <ProjectReference Include="..\EShopSample.Application.Contracts\EShopSample.Application.Contracts.csproj" />
</ItemGroup> </ItemGroup>

2
samples/EShopSample/aspnet-core/src/EShopSample.Application/EShopSampleApplicationModule.cs

@ -1,4 +1,5 @@
using EasyAbp.EShop; using EasyAbp.EShop;
using EasyAbp.EShop.Orders.Plugins.Coupons;
using EasyAbp.EShop.Plugins.Baskets; using EasyAbp.EShop.Plugins.Baskets;
using EasyAbp.EShop.Plugins.Coupons; using EasyAbp.EShop.Plugins.Coupons;
using EasyAbp.PaymentService; using EasyAbp.PaymentService;
@ -25,6 +26,7 @@ namespace EShopSample
typeof(EShopApplicationModule), typeof(EShopApplicationModule),
typeof(EShopPluginsBasketsApplicationModule), typeof(EShopPluginsBasketsApplicationModule),
typeof(EShopPluginsCouponsApplicationModule), typeof(EShopPluginsCouponsApplicationModule),
typeof(EShopOrdersPluginsCouponsModule),
typeof(PaymentServiceApplicationModule), typeof(PaymentServiceApplicationModule),
typeof(PaymentServiceWeChatPayApplicationModule), typeof(PaymentServiceWeChatPayApplicationModule),
typeof(PaymentServicePrepaymentApplicationModule) typeof(PaymentServicePrepaymentApplicationModule)

Loading…
Cancel
Save