Browse Source

Implement order completion feature

Fix controllers
pull/87/head
gdlcf88 6 years ago
parent
commit
9f809aa85c
  1. 2
      common.props
  2. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Authorization/OrdersPermissionDefinitionProvider.cs
  3. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Authorization/OrdersPermissions.cs
  4. 9
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/CompleteOrderInput.cs
  5. 3
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/IOrderAppService.cs
  6. 31
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs
  7. 18
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/BasicCompletableCheckProvider.cs
  8. 9
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/ICompletableCheckProvider.cs
  9. 4
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs
  10. 20
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderDiscountManager.cs
  11. 51
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs
  12. 13
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.HttpApi/EasyAbp/EShop/Orders/Orders/OrderController.cs
  13. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.HttpApi/EasyAbp/EShop/Products/ProductCategories/ProductCategoryController.cs
  14. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.HttpApi/EasyAbp/EShop/Products/ProductDetails/ProductDetailController.cs
  15. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.HttpApi/EasyAbp/EShop/Products/Products/ProductController.cs

2
common.props

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>0.7.0</Version>
<Version>0.8.0</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors>

2
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Authorization/OrdersPermissionDefinitionProvider.cs

@ -14,7 +14,7 @@ namespace EasyAbp.EShop.Orders.Authorization
order.AddChild(OrdersPermissions.Orders.Manage, L("Permission:Manage"));
order.AddChild(OrdersPermissions.Orders.CrossStore, L("Permission:CrossStore"));
order.AddChild(OrdersPermissions.Orders.Create, L("Permission:Create"));
order.AddChild(OrdersPermissions.Orders.ConfirmReceipt, L("Permission:ConfirmReceipt"));
order.AddChild(OrdersPermissions.Orders.Complete, L("Permission:Complete"));
order.AddChild(OrdersPermissions.Orders.RequestCancellation, L("Permission:RequestCancellation"));
order.AddChild(OrdersPermissions.Orders.Cancel, L("Permission:Cancel"));
}

2
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Authorization/OrdersPermissions.cs

@ -12,7 +12,7 @@ namespace EasyAbp.EShop.Orders.Authorization
public const string Manage = Default + ".Manage";
public const string CrossStore = Default + ".CrossStore";
public const string Create = Default + ".Create";
public const string ConfirmReceipt = Default + ".ConfirmReceipt";
public const string Complete = Default + ".Complete";
public const string RequestCancellation = Default + ".RequestCancellation";
public const string Cancel = Default + ".Cancel";
}

9
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/Dtos/CompleteOrderInput.cs

@ -0,0 +1,9 @@
using System;
namespace EasyAbp.EShop.Orders.Orders.Dtos
{
public class CompleteOrderInput
{
public Guid OrderId { get; set; }
}
}

3
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application.Contracts/EasyAbp/EShop/Orders/Orders/IOrderAppService.cs

@ -1,7 +1,6 @@
using System;
using System.Threading.Tasks;
using EasyAbp.EShop.Orders.Orders.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Orders.Orders
@ -14,5 +13,7 @@ namespace EasyAbp.EShop.Orders.Orders
CreateOrderDto>
{
Task<OrderDto> GetByOrderNumberAsync(string orderNumber);
Task<OrderDto> CompleteAsync(CompleteOrderInput input);
}
}

31
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs

@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Authorization;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Timing;
using Volo.Abp.Users;
namespace EasyAbp.EShop.Orders.Orders
@ -21,24 +22,27 @@ namespace EasyAbp.EShop.Orders.Orders
protected override string CreatePolicyName { get; set; } = OrdersPermissions.Orders.Create;
protected override string GetPolicyName { get; set; } = OrdersPermissions.Orders.Default;
protected override string GetListPolicyName { get; set; } = OrdersPermissions.Orders.Default;
private readonly IClock _clock;
private readonly INewOrderGenerator _newOrderGenerator;
private readonly IProductAppService _productAppService;
private readonly IPurchasableChecker _purchasableChecker;
private readonly IOrderDiscountManager _orderDiscountManager;
private readonly IOrderManager _orderManager;
private readonly IOrderRepository _repository;
public OrderAppService(
IClock clock,
INewOrderGenerator newOrderGenerator,
IProductAppService productAppService,
IPurchasableChecker purchasableChecker,
IOrderDiscountManager orderDiscountManager,
IOrderManager orderManager,
IOrderRepository repository) : base(repository)
{
_clock = clock;
_newOrderGenerator = newOrderGenerator;
_productAppService = productAppService;
_purchasableChecker = purchasableChecker;
_orderDiscountManager = orderDiscountManager;
_orderManager = orderManager;
_repository = repository;
}
@ -109,7 +113,7 @@ namespace EasyAbp.EShop.Orders.Orders
var order = await _newOrderGenerator.GenerateAsync(input, productDict, orderExtraProperties);
await _orderDiscountManager.DiscountAsync(order, input.ExtraProperties);
await _orderManager.DiscountAsync(order, input.ExtraProperties);
await Repository.InsertAsync(order, autoSave: true);
@ -156,5 +160,22 @@ namespace EasyAbp.EShop.Orders.Orders
return MapToGetOutputDto(order);
}
[Authorize(OrdersPermissions.Orders.Complete)]
public virtual async Task<OrderDto> CompleteAsync(CompleteOrderInput input)
{
var order = await GetEntityByIdAsync(input.OrderId);
if (order.CustomerUserId != CurrentUser.GetId())
{
await AuthorizationService.CheckAsync(OrdersPermissions.Orders.Manage);
// Todo: Check if current user is an admin of the store.
}
order = await _orderManager.CompleteAsync(order);
return MapToGetOutputDto(order);
}
}
}

18
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/BasicCompletableCheckProvider.cs

@ -0,0 +1,18 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace EasyAbp.EShop.Orders.Orders
{
public class BasicCompletableCheckProvider : ICompletableCheckProvider, ITransientDependency
{
public virtual Task CheckAsync(Order order)
{
if (!order.PaidTime.HasValue || !order.ReducedInventoryAfterPaymentTime.HasValue)
{
throw new OrderIsInWrongStageException(order.Id);
}
return Task.CompletedTask;
}
}
}

9
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/ICompletableCheckProvider.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace EasyAbp.EShop.Orders.Orders
{
public interface ICompletableCheckProvider
{
Task CheckAsync(Order order);
}
}

4
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderDiscountManager.cs → modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/IOrderManager.cs

@ -4,8 +4,10 @@ using Volo.Abp.Domain.Services;
namespace EasyAbp.EShop.Orders.Orders
{
public interface IOrderDiscountManager : IDomainService
public interface IOrderManager : IDomainService
{
Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties);
Task<Order> CompleteAsync(Order order);
}
}

20
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderDiscountManager.cs

@ -1,20 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Domain.Services;
namespace EasyAbp.EShop.Orders.Orders
{
public class OrderDiscountManager : DomainService, IOrderDiscountManager
{
public async Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties)
{
foreach (var provider in ServiceProvider.GetServices<IOrderDiscountProvider>())
{
await provider.DiscountAsync(order, inputExtraProperties);
}
return order;
}
}
}

51
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Domain/EasyAbp/EShop/Orders/Orders/OrderManager.cs

@ -0,0 +1,51 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Domain.Services;
using Volo.Abp.Timing;
namespace EasyAbp.EShop.Orders.Orders
{
public class OrderManager : DomainService, IOrderManager
{
private readonly IClock _clock;
private readonly IOrderRepository _orderRepository;
public OrderManager(
IClock clock,
IOrderRepository orderRepository)
{
_clock = clock;
_orderRepository = orderRepository;
}
public virtual async Task<Order> DiscountAsync(Order order, Dictionary<string, object> inputExtraProperties)
{
foreach (var provider in ServiceProvider.GetServices<IOrderDiscountProvider>())
{
await provider.DiscountAsync(order, inputExtraProperties);
}
return order;
}
public virtual async Task<Order> CompleteAsync(Order order)
{
if (order.CompletionTime.HasValue)
{
throw new OrderIsInWrongStageException(order.Id);
}
var providers = ServiceProvider.GetServices<ICompletableCheckProvider>();
foreach (var provider in providers)
{
await provider.CheckAsync(order);
}
order.SetCompletionTime(_clock.Now);
return await _orderRepository.UpdateAsync(order, true);
}
}
}

13
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.HttpApi/EasyAbp/EShop/Orders/Orders/OrderController.cs

@ -38,7 +38,7 @@ namespace EasyAbp.EShop.Orders.Orders
}
[HttpPut]
[Route("{id}")]
[Route("{id}/abandoned")]
[RemoteService(false)]
public Task<OrderDto> UpdateAsync(Guid id, CreateOrderDto input)
{
@ -46,7 +46,7 @@ namespace EasyAbp.EShop.Orders.Orders
}
[HttpDelete]
[Route("{id}")]
[Route("{id}/abandoned")]
[RemoteService(false)]
public Task DeleteAsync(Guid id)
{
@ -59,5 +59,12 @@ namespace EasyAbp.EShop.Orders.Orders
{
return _service.GetByOrderNumberAsync(orderNumber);
}
[HttpPost]
[Route("complete")]
public Task<OrderDto> CompleteAsync(CompleteOrderInput input)
{
return _service.CompleteAsync(input);
}
}
}
}

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.HttpApi/EasyAbp/EShop/Products/ProductCategories/ProductCategoryController.cs

@ -19,7 +19,7 @@ namespace EasyAbp.EShop.Products.ProductCategories
}
[HttpGet]
[Route("{id}")]
[Route("{id}/abandoned")]
[RemoteService(false)]
public Task<ProductCategoryDto> GetAsync(Guid id)
{

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.HttpApi/EasyAbp/EShop/Products/ProductDetails/ProductDetailController.cs

@ -52,7 +52,7 @@ namespace EasyAbp.EShop.Products.ProductDetails
}
[HttpDelete]
[Route("{id}")]
[Route("{id}/abandoned")]
[RemoteService(false)]
public Task DeleteAsync(Guid id, Guid storeId)
{

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.HttpApi/EasyAbp/EShop/Products/Products/ProductController.cs

@ -19,7 +19,7 @@ namespace EasyAbp.EShop.Products.Products
}
[HttpGet]
[Route("{id}")]
[Route("{id}/abandoned")]
[RemoteService(false)]
public Task<ProductDto> GetAsync(Guid id)
{
@ -46,7 +46,7 @@ namespace EasyAbp.EShop.Products.Products
}
[HttpDelete]
[Route("{id}")]
[Route("{id}/abandoned")]
[RemoteService(false)]
public Task DeleteAsync(Guid id)
{

Loading…
Cancel
Save