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);
await _orderManager.DiscountAsync(order, input.ExtraProperties);
await _orderManager.DiscountAsync(order);
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
{
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
{
Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties);
Task<Order> DiscountAsync(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);
}
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;
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;
}
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>())
{
await provider.DiscountAsync(order, inputExtraProperties);
await provider.DiscountAsync(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,
OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource)
{
var couponId = resource.Input.GetProperty<Guid?>(CouponsConsts.OrderCouponIdPropertyName);
if (!couponId.HasValue)
if (!Guid.TryParse(resource.Input.GetProperty<string>(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)
{

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.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<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);
}
);
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 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<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.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates.Dtos
{
[Serializable]
public class CouponTemplateDto : FullAuditedEntityDto<Guid>
public class CouponTemplateDto : FullAuditedEntityDto<Guid>, ICouponTemplate, IHasCouponTemplateScopes<CouponTemplateScopeDto>
{
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<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
{
[Serializable]
public class CouponTemplateScopeDto : FullAuditedEntityDto<Guid>
public class CouponTemplateScopeDto : FullAuditedEntityDto<Guid>, ICouponTemplateScope
{
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
{
[Serializable]
public class CouponDto : FullAuditedEntityDto<Guid>
public class CouponDto : FullAuditedEntityDto<Guid>, ICoupon
{
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.ComponentModel;
namespace EasyAbp.EShop.Plugins.Coupons.Coupons.Dtos
{
[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.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<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.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<CouponTemplate, CouponTemplateDto>();
CreateMap<CreateUpdateCouponTemplateDto, CouponTemplate>(MemberList.Source);
CreateMap<CreateUpdateCouponTemplateDto, CouponTemplate>(MemberList.Source)
.Ignore(x => x.Scopes);
CreateMap<CouponTemplateScope, CouponTemplateScopeDto>();
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
{
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<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
{
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 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>
<ItemGroup>
<PackageReference Include="Volo.Abp.AutoMapper" 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" />
</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 Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
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; }
@ -54,10 +55,11 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
/// </summary>
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()
{
Scopes = new List<CouponTemplateScope>();
}
public CouponTemplate(
@ -75,7 +77,7 @@ namespace EasyAbp.EShop.Plugins.Coupons.CouponTemplates
decimal discountAmount,
bool isCrossProductAllowed,
bool isUnscoped,
IEnumerable<CouponTemplateScope> scopes
List<CouponTemplateScope> 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<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.
/// </summary>
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;
}
public void SetExpirationTime(DateTime? expirationTime)
{
ExpirationTime = expirationTime;
}
public void Use(DateTime? usedTime, decimal? discountedAmount)
{
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;
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<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>
<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" />
</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 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<EShopPluginsCouponsHttpApiClientModule>();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<EShopPluginsCouponsHttpApiClientModule>(validate: true);
});
context.Services.AddHttpClientProxies(
typeof(EShopPluginsCouponsApplicationContractsModule).Assembly,
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="..\..\..\..\..\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.Orders.Plugins.Coupons\EasyAbp.EShop.Orders.Plugins.Coupons.csproj" />
<ProjectReference Include="..\EShopSample.Domain\EShopSample.Domain.csproj" />
<ProjectReference Include="..\EShopSample.Application.Contracts\EShopSample.Application.Contracts.csproj" />
</ItemGroup>

2
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)

Loading…
Cancel
Save