From 6c8e0424010f19ce859c8c58057afc77e72c54df Mon Sep 17 00:00:00 2001 From: gdlcf88 Date: Thu, 12 May 2022 03:20:19 +0800 Subject: [PATCH] Complete basic designs --- EShop.sln | 27 ++++++++ docs/README.md | 1 + docs/plugins/booking/README.md | 38 +++++++++++ plugins/Booking/README.md | 1 + ...asyAbp.EShop.Orders.Plugins.Booking.csproj | 16 +++++ ...ookingOrderCreationAuthorizationHandler.cs | 56 ++++++++++++++++ .../Plugins/Booking/BookingOrderConsts.cs | 6 ++ .../EShopOrdersPluginsBookingModule.cs | 17 +++++ .../BulkAssetOccupancyResultEventHandler.cs | 63 ++++++++++++++++++ ...hopOrdersPluginsBookingObjectExtensions.cs | 65 ++++++++++++++++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++++++ ...yAbp.EShop.Payments.Plugins.Booking.csproj | 16 +++++ ...kingPaymentCreationAuthorizationHandler.cs | 36 ++++++++++ .../EShopPaymentsPluginsBookingModule.cs | 13 ++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++++++++ ...ugins.Booking.Application.Contracts.csproj | 2 + .../BulkAssetOccupancyResultEtoExtensions.cs | 12 ++++ .../BulkAssetOccupancyResultEtoProperties.cs | 6 ++ .../BulkOccupyAssetEtoExtensions.cs | 17 +++++ .../BulkOccupyAssetEtoProperties.cs | 6 ++ .../EShop/Orders/BookingOrderProperties.cs | 16 +++++ .../Orders/CreateOrderLineDtoExtensions.cs | 33 ++++++++++ .../EShop/Orders/OrderLineExtensions.cs | 33 ++++++++++ .../Dtos/BookingProductGroupDefinitionDto.cs | 9 +++ ...BookingProductGroupDefinitionAppService.cs | 11 ++++ ...luginsBookingApplicationContractsModule.cs | 6 +- ...BookingProductGroupDefinitionAppService.cs | 31 +++++++++ .../BookingOrderPaidEventHandler.cs | 66 +++++++++++++++++++ .../Options/BookingProductGroupDefinition.cs | 14 ++++ .../Booking/Options/EShopBookingOptions.cs | 11 ++++ .../ProductAssetCategory.cs | 25 +++++++ .../Booking/ProductAssets/ProductAsset.cs | 25 +++++++ .../EntityFrameworkCore/BookingDbContext.cs | 2 +- ...BookingDbContextModelCreatingExtensions.cs | 2 +- .../FodyWeavers.xml | 2 +- 37 files changed, 746 insertions(+), 4 deletions(-) create mode 100644 docs/plugins/booking/README.md create mode 100644 plugins/Booking/README.md create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp.EShop.Orders.Plugins.Booking.csproj create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/Authorization/BookingOrderCreationAuthorizationHandler.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/BookingOrderConsts.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EShopOrdersPluginsBookingModule.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EventHandlers/BulkAssetOccupancyResultEventHandler.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/ObjectExtending/EShopOrdersPluginsBookingObjectExtensions.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xml create mode 100644 plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xsd create mode 100644 plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp.EShop.Payments.Plugins.Booking.csproj create mode 100644 plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/Authorization/BookingPaymentCreationAuthorizationHandler.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/EShopPaymentsPluginsBookingModule.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xml create mode 100644 plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xsd create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoExtensions.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoProperties.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoExtensions.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoProperties.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/BookingOrderProperties.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/CreateOrderLineDtoExtensions.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/OrderLineExtensions.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/Dtos/BookingProductGroupDefinitionDto.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/IBookingProductGroupDefinitionAppService.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/BookingProductGroupDefinitionAppService.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/EventHandlers/BookingOrderPaidEventHandler.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/BookingProductGroupDefinition.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/EShopBookingOptions.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssetCategories/ProductAssetCategory.cs create mode 100644 plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssets/ProductAsset.cs diff --git a/EShop.sln b/EShop.sln index 6ad35584..77d5b174 100644 --- a/EShop.sln +++ b/EShop.sln @@ -342,6 +342,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Orders.Plugins.Coupons", "plugins\Coupons\src\EasyAbp.EShop.Orders.Plugins.Coupons\EasyAbp.EShop.Orders.Plugins.Coupons.csproj", "{3C385657-8365-470F-9F4F-30F31F9FCA42}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Booking", "Booking", "{CE945F1D-6636-47D5-A619-C16C4E14CF8C}" + ProjectSection(SolutionItems) = preProject + plugins\Booking\README.md = plugins\Booking\README.md + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A8C4583C-034E-47AF-B7EC-1A34EE288E2F}" EndProject @@ -379,6 +382,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Booki EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Booking.TestBase", "plugins\Booking\test\EasyAbp.EShop.Plugins.Booking.TestBase\EasyAbp.EShop.Plugins.Booking.TestBase.csproj", "{739CAE6A-14E6-44FC-8863-DA905CBD289F}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev-temp", "dev-temp", "{D0774C59-2D28-499A-B432-8714CA123CF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.BookingService.Domain.Shared", "..\EasyAbp.BookingService\src\EasyAbp.BookingService.Domain.Shared\EasyAbp.BookingService.Domain.Shared.csproj", "{772637D4-25D2-406D-9A0F-6C0506F9D97A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Orders.Plugins.Booking", "plugins\Booking\src\EasyAbp.EShop.Orders.Plugins.Booking\EasyAbp.EShop.Orders.Plugins.Booking.csproj", "{C0399352-1278-4D91-8D4E-7491FD77C18B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Payments.Plugins.Booking", "plugins\Booking\src\EasyAbp.EShop.Payments.Plugins.Booking\EasyAbp.EShop.Payments.Plugins.Booking.csproj", "{4480BFAF-C981-4242-A509-EDA6F572E45C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -997,6 +1008,18 @@ Global {739CAE6A-14E6-44FC-8863-DA905CBD289F}.Debug|Any CPU.Build.0 = Debug|Any CPU {739CAE6A-14E6-44FC-8863-DA905CBD289F}.Release|Any CPU.ActiveCfg = Release|Any CPU {739CAE6A-14E6-44FC-8863-DA905CBD289F}.Release|Any CPU.Build.0 = Release|Any CPU + {772637D4-25D2-406D-9A0F-6C0506F9D97A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {772637D4-25D2-406D-9A0F-6C0506F9D97A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {772637D4-25D2-406D-9A0F-6C0506F9D97A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {772637D4-25D2-406D-9A0F-6C0506F9D97A}.Release|Any CPU.Build.0 = Release|Any CPU + {C0399352-1278-4D91-8D4E-7491FD77C18B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0399352-1278-4D91-8D4E-7491FD77C18B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0399352-1278-4D91-8D4E-7491FD77C18B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0399352-1278-4D91-8D4E-7491FD77C18B}.Release|Any CPU.Build.0 = Release|Any CPU + {4480BFAF-C981-4242-A509-EDA6F572E45C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4480BFAF-C981-4242-A509-EDA6F572E45C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4480BFAF-C981-4242-A509-EDA6F572E45C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4480BFAF-C981-4242-A509-EDA6F572E45C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1186,6 +1209,10 @@ Global {0F0A4F84-419F-4547-9001-0853C1E509F9} = {7087FDFF-196A-4C9F-8C66-EEBC2C49F2F8} {5AE1B9B6-BE5D-4919-9612-7E11D384A985} = {7087FDFF-196A-4C9F-8C66-EEBC2C49F2F8} {739CAE6A-14E6-44FC-8863-DA905CBD289F} = {7087FDFF-196A-4C9F-8C66-EEBC2C49F2F8} + {D0774C59-2D28-499A-B432-8714CA123CF3} = {CE945F1D-6636-47D5-A619-C16C4E14CF8C} + {772637D4-25D2-406D-9A0F-6C0506F9D97A} = {D0774C59-2D28-499A-B432-8714CA123CF3} + {C0399352-1278-4D91-8D4E-7491FD77C18B} = {A8C4583C-034E-47AF-B7EC-1A34EE288E2F} + {4480BFAF-C981-4242-A509-EDA6F572E45C} = {A8C4583C-034E-47AF-B7EC-1A34EE288E2F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} diff --git a/docs/README.md b/docs/README.md index 07f4d69e..ab7625d5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -100,6 +100,7 @@ We can customize some features to use EShop in complex application scenarios. * Plugin modules * Baskets * Coupons + * [Booking](/plugins/Booking) ## Roadmap diff --git a/docs/plugins/booking/README.md b/docs/plugins/booking/README.md new file mode 100644 index 00000000..c5991abd --- /dev/null +++ b/docs/plugins/booking/README.md @@ -0,0 +1,38 @@ +# EShop.Plugins.Booking + +[![ABP version](https://img.shields.io/badge/dynamic/xml?style=flat-square&color=yellow&label=abp&query=%2F%2FProject%2FPropertyGroup%2FAbpVersion&url=https%3A%2F%2Fraw.githubusercontent.com%2FEasyAbp%2FEShop%2Fmaster%2FDirectory.Build.props)](https://abp.io) +[![NuGet](https://img.shields.io/nuget/v/EasyAbp.EShop.Plugins.Booking.Domain.Shared.svg?style=flat-square)](https://www.nuget.org/packages/EasyAbp.EShop.Plugins.Booking.Domain.Shared) +[![NuGet Download](https://img.shields.io/nuget/dt/EasyAbp.EShop.Plugins.Booking.Domain.Shared.svg?style=flat-square)](https://www.nuget.org/packages/EasyAbp.EShop.Plugins.Booking.Domain.Shared) +[![Discord online](https://badgen.net/discord/online-members/S6QaezrCRq?label=Discord)](https://discord.gg/S6QaezrCRq) +[![GitHub stars](https://img.shields.io/github/stars/EasyAbp/EShop?style=social)](https://www.github.com/EasyAbp/EShop) + +A booking-business plugin for EShop. It extends EShop to use the [EasyAbp.BookingService](https://github.com/EasyAbp/BookingService) module to help end-users to book some assets online. + +## Installation + +1. Install the following NuGet packages. ([see how](https://github.com/EasyAbp/EasyAbpGuide/blob/master/docs/How-To.md#add-nuget-packages)) + + * EasyAbp.EShop.Orders.Plugins.Booking (install at EasyAbp.EShop.Orders.Application location) + * (Optional) EasyAbp.EShop.Payments.Plugins.Booking (install at EasyAbp.EShop.Payments.Application location) + * EasyAbp.EShop.Plugins.Booking.Application + * EasyAbp.EShop.Plugins.Booking.Application + * EasyAbp.EShop.Plugins.Booking.Application.Contracts + * EasyAbp.EShop.Plugins.Booking.Domain + * EasyAbp.EShop.Plugins.Booking.Domain.Shared + * EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore + * EasyAbp.EShop.Plugins.Booking.HttpApi + * EasyAbp.EShop.Plugins.Booking.HttpApi.Client + * (Optional) EasyAbp.EShop.Plugins.Booking.MongoDB + * (Optional) EasyAbp.EShop.Plugins.Booking.Web + + > Skip installing the `EasyAbp.EShop.Payments.Plugins.Booking` module if you don't want to check assets are bookable during payment. + +1. Add `DependsOn(typeof(EShopXxxModule))` attribute to configure the module dependencies. ([see how](https://github.com/EasyAbp/EasyAbpGuide/blob/master/docs/How-To.md#add-module-dependencies)) + +1. Add `builder.ConfigureEShopPluginsBooking();` to the `OnModelCreating()` method in **MyProjectMigrationsDbContext.cs**. + +1. Add EF Core migrations and update your database. See: [ABP document](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF#add-database-migration). + +## Usage + +[![](https://mermaid.ink/img/pako:eNqtlMtOwzAQRX_F8gaQQtlHqBItWVOo2GXj2pPWqmMHP5Ciqv_OJHbb0BcgkU0Sz9zjO_bYG8qNAJpTBx8BNIdnyZaW1aUm-Lw7sPfjcTFfmWb0YgVYl5OpBeaBMLIwZi31kpguEAXDzCPhaKbCUmo3mkRZTgrtggXiVwhzDvyDlzUQ6XowWyg4y-w85aT_Jby3Is6YnbG2Bu3R7twz69FtE0dIZWw_5YnrneS_fF_wMzV1o8BHfTJ1wUYsNQ0QnoTiF6bzGE7R3ZSi8ObKPp0U2sdnTB7rjhIRkL7mYD8lB1RyHpo2Lo97XNjx7SSodRx96gaReBeR36VXzHRipnlLLLig_J7a8_bRtz54wDPlB1IXOAfMT2t4uaCjlh_u2aBxQDkY0Csm1Z_RqAR1AHdlMS2wyCrga98kqUdAiytH8zWAbUndRtSNI84zH9yP56hBLJrLDj2WIYLw3hsImtEabI2NgBfFpqOVFI3VUNIcPwVUDNe8pKXeYmpoBB7KQkhvLM0rhmuUURa8mbea09zbALukdNmkrO0XWziVvA)](https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNqtlMtOwzAQRX_F8gaQQtlHqBItWVOo2GXj2pPWqmMHP5Ciqv_OJHbb0BcgkU0Sz9zjO_bYG8qNAJpTBx8BNIdnyZaW1aUm-Lw7sPfjcTFfmWb0YgVYl5OpBeaBMLIwZi31kpguEAXDzCPhaKbCUmo3mkRZTgrtggXiVwhzDvyDlzUQ6XowWyg4y-w85aT_Jby3Is6YnbG2Bu3R7twz69FtE0dIZWw_5YnrneS_fF_wMzV1o8BHfTJ1wUYsNQ0QnoTiF6bzGE7R3ZSi8ObKPp0U2sdnTB7rjhIRkL7mYD8lB1RyHpo2Lo97XNjx7SSodRx96gaReBeR36VXzHRipnlLLLig_J7a8_bRtz54wDPlB1IXOAfMT2t4uaCjlh_u2aBxQDkY0Csm1Z_RqAR1AHdlMS2wyCrga98kqUdAiytH8zWAbUndRtSNI84zH9yP56hBLJrLDj2WIYLw3hsImtEabI2NgBfFpqOVFI3VUNIcPwVUDNe8pKXeYmpoBB7KQkhvLM0rhmuUURa8mbea09zbALukdNmkrO0XWziVvA) \ No newline at end of file diff --git a/plugins/Booking/README.md b/plugins/Booking/README.md new file mode 100644 index 00000000..68473af2 --- /dev/null +++ b/plugins/Booking/README.md @@ -0,0 +1 @@ +/docs/plugins/booking/README.md \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp.EShop.Orders.Plugins.Booking.csproj b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp.EShop.Orders.Plugins.Booking.csproj new file mode 100644 index 00000000..327a3fad --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp.EShop.Orders.Plugins.Booking.csproj @@ -0,0 +1,16 @@ + + + + + + net6.0 + + + + + + + + + + diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/Authorization/BookingOrderCreationAuthorizationHandler.cs b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/Authorization/BookingOrderCreationAuthorizationHandler.cs new file mode 100644 index 00000000..8681b0c9 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/Authorization/BookingOrderCreationAuthorizationHandler.cs @@ -0,0 +1,56 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using EasyAbp.EShop.Orders.Orders; +using EasyAbp.EShop.Plugins.Booking.BookingProductGroupDefinitions; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Data; + +namespace EasyAbp.EShop.Orders.Plugins.Booking.Authorization +{ + public class BookingOrderCreationAuthorizationHandler : OrderCreationAuthorizationHandler + { + private readonly IBookingProductGroupDefinitionAppService _definitionAppService; + + public BookingOrderCreationAuthorizationHandler( + IBookingProductGroupDefinitionAppService definitionAppService) + { + _definitionAppService = definitionAppService; + } + + protected override async Task HandleOrderCreationAsync(AuthorizationHandlerContext context, + OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource) + { + var productGroupNames = (await _definitionAppService.GetListAsync()).Items.Select(x => x.ProductGroupName); + + var bookingOrderLines = resource.Input.OrderLines.Where(x => + productGroupNames.Contains(resource.ProductDictionary[x.ProductId].ProductGroupName)).ToList(); + + if (!bookingOrderLines.Any()) + { + return; + } + + foreach (var orderLine in bookingOrderLines) + { + var assetId = orderLine.FindBookingAssetId(); + if (assetId is not null) + { + // Todo: Invoke IProductAssetAppService to check the mapping. + } + else + { + var assetCategoryId = orderLine.FindBookingAssetCategoryId(); + if (assetCategoryId is null) + { + context.Fail(); + return; + } + // Todo: Invoke IProductAssetCategoryAppService to check the mapping. + } + + // Todo: Invoke IAssetOccupancyAppService to check the booking info. + } + } + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/BookingOrderConsts.cs b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/BookingOrderConsts.cs new file mode 100644 index 00000000..55b39aef --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/BookingOrderConsts.cs @@ -0,0 +1,6 @@ +namespace EasyAbp.EShop.Orders.Plugins.Booking; + +public class BookingOrderConsts +{ + public static string BookingOrderAutoCancellationResult = "Asset occupancy failed"; +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EShopOrdersPluginsBookingModule.cs b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EShopOrdersPluginsBookingModule.cs new file mode 100644 index 00000000..47a6be50 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EShopOrdersPluginsBookingModule.cs @@ -0,0 +1,17 @@ +using EasyAbp.EShop.Orders.Plugins.Booking.ObjectExtending; +using Volo.Abp.Modularity; + +namespace EasyAbp.EShop.Orders.Plugins.Booking +{ + [DependsOn( + typeof(EShopOrdersApplicationModule), + typeof(EShopOrdersApplicationContractsModule) + )] + public class EShopOrdersPluginsBookingModule : AbpModule + { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + EShopOrdersPluginsBookingObjectExtensions.Configure(); + } + } +} diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EventHandlers/BulkAssetOccupancyResultEventHandler.cs b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EventHandlers/BulkAssetOccupancyResultEventHandler.cs new file mode 100644 index 00000000..f65afe4e --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/EventHandlers/BulkAssetOccupancyResultEventHandler.cs @@ -0,0 +1,63 @@ +using System; +using System.Threading.Tasks; +using EasyAbp.BookingService.AssetOccupancies; +using EasyAbp.EShop.Orders.Orders; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Uow; + +namespace EasyAbp.EShop.Orders.Plugins.Booking.EventHandlers; + +public class BulkAssetOccupancyResultEventHandler : IDistributedEventHandler, ITransientDependency +{ + private readonly IOrderManager _orderManager; + private readonly IOrderRepository _orderRepository; + + public BulkAssetOccupancyResultEventHandler( + IOrderManager orderManager, + IOrderRepository orderRepository) + { + _orderManager = orderManager; + _orderRepository = orderRepository; + } + + [UnitOfWork(true)] + public virtual async Task HandleEventAsync(BulkAssetOccupancyResultEto eventData) + { + var orderId = eventData.FindBookingOrderId(); + + if (orderId is null) + { + return; + } + + var order = await _orderRepository.GetAsync(orderId.Value); + + if (eventData.Success) + { + if (order.CompletionTime.HasValue) + { + return; + } + + await _orderManager.CompleteAsync(order); + } + else + { + if (order.CanceledTime.HasValue) + { + return; + } + + await _orderManager.CancelAsync(order, BookingOrderConsts.BookingOrderAutoCancellationResult); + + await RefundOrderAsync(order); + } + } + + protected virtual async Task RefundOrderAsync(Order order) + { + // Todo: create a RefundOrderPaymentEto event to refund the order's payment. + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/ObjectExtending/EShopOrdersPluginsBookingObjectExtensions.cs b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/ObjectExtending/EShopOrdersPluginsBookingObjectExtensions.cs new file mode 100644 index 00000000..b30fe5b7 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/EasyAbp/EShop/Orders/Plugins/Booking/ObjectExtending/EShopOrdersPluginsBookingObjectExtensions.cs @@ -0,0 +1,65 @@ +using System; +using EasyAbp.EShop.Orders.Orders; +using EasyAbp.EShop.Orders.Orders.Dtos; +using EasyAbp.EShop.Plugins.Booking; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace EasyAbp.EShop.Orders.Plugins.Booking.ObjectExtending +{ + public static class EShopOrdersPluginsBookingObjectExtensions + { + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can configure extension properties to entities or other object types + * defined in the depended modules. + * + * If you are using EF Core and want to map the entity extension properties to new + * table fields in the database, then configure them in the EShopSampleEfCoreEntityExtensionMappings + * + * Example: + * + * ObjectExtensionManager.Instance + * .AddOrUpdateProperty("Title"); + * + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Object-Extensions + */ + + ObjectExtensionManager.Instance + .AddOrUpdate( + new[] + { + typeof(OrderLine), + typeof(OrderLineDto), + typeof(OrderLineEto), + typeof(CreateOrderLineDto) + }, + config => + { + config.AddOrUpdateProperty(BookingOrderProperties.OrderLineBookingAssetId); + config.AddOrUpdateProperty(BookingOrderProperties.OrderLineBookingAssetCategoryId); + config.AddOrUpdateProperty(BookingOrderProperties.OrderLineBookingDate); + config.AddOrUpdateProperty(BookingOrderProperties.OrderLineBookingStartingTime); + config.AddOrUpdateProperty(BookingOrderProperties.OrderLineBookingDuration); + } + ) + .AddOrUpdate( + new[] + { + typeof(OrderLine), + typeof(OrderLineDto), + typeof(OrderLineEto) + }, + config => + { + config.AddOrUpdateProperty(BookingOrderProperties.OrderLineBookingAssetOccupancyId); + }); + }); + } + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xml b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xml new file mode 100644 index 00000000..be0de3a9 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xsd b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xsd new file mode 100644 index 00000000..3f3946e2 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Orders.Plugins.Booking/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp.EShop.Payments.Plugins.Booking.csproj b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp.EShop.Payments.Plugins.Booking.csproj new file mode 100644 index 00000000..ccb70cd7 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp.EShop.Payments.Plugins.Booking.csproj @@ -0,0 +1,16 @@ + + + + + + net6.0 + + + + + + + + + + diff --git a/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/Authorization/BookingPaymentCreationAuthorizationHandler.cs b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/Authorization/BookingPaymentCreationAuthorizationHandler.cs new file mode 100644 index 00000000..5695e6c4 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/Authorization/BookingPaymentCreationAuthorizationHandler.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using EasyAbp.EShop.Orders; +using EasyAbp.EShop.Payments.Payments; +using Microsoft.AspNetCore.Authorization; + +namespace EasyAbp.EShop.Payments.Plugins.Booking.Authorization +{ + public class BookingPaymentCreationAuthorizationHandler : PaymentCreationAuthorizationHandler + { + public BookingPaymentCreationAuthorizationHandler() + { + } + + protected override async Task HandlePaymentCreationAsync(AuthorizationHandlerContext context, + PaymentOperationAuthorizationRequirement requirement, PaymentCreationResource resource) + { + foreach (var order in resource.Orders) + { + foreach (var orderLine in order.OrderLines) + { + var assetId = orderLine.FindBookingAssetId(); + if (assetId is null) + { + var assetCategoryId = orderLine.FindBookingAssetCategoryId(); + if (assetCategoryId is null) + { + continue; + } + } + + // Todo: Invoke IAssetOccupancyAppService to check the booking info. + } + } + } + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/EShopPaymentsPluginsBookingModule.cs b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/EShopPaymentsPluginsBookingModule.cs new file mode 100644 index 00000000..98eb5339 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/EasyAbp/EShop/Payments/Plugins/Booking/EShopPaymentsPluginsBookingModule.cs @@ -0,0 +1,13 @@ +using EasyAbp.EShop.Plugins.Booking; +using Volo.Abp.Modularity; + +namespace EasyAbp.EShop.Payments.Plugins.Booking +{ + [DependsOn( + typeof(EShopPaymentsApplicationModule), + typeof(EShopPluginsBookingApplicationContractsModule) + )] + public class EShopPaymentsPluginsBookingModule : AbpModule + { + } +} diff --git a/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xml b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xml new file mode 100644 index 00000000..be0de3a9 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xsd b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xsd new file mode 100644 index 00000000..3f3946e2 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Payments.Plugins.Booking/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp.EShop.Plugins.Booking.Application.Contracts.csproj b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp.EShop.Plugins.Booking.Application.Contracts.csproj index 9fa0cea5..510b1497 100644 --- a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp.EShop.Plugins.Booking.Application.Contracts.csproj +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp.EShop.Plugins.Booking.Application.Contracts.csproj @@ -10,6 +10,8 @@ + + diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoExtensions.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoExtensions.cs new file mode 100644 index 00000000..50d7084e --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoExtensions.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.Data; + +namespace EasyAbp.BookingService.AssetOccupancies; + +public static class BulkAssetOccupancyResultEtoExtensions +{ + public static Guid? FindBookingOrderId(this BulkAssetOccupancyResultEto eto) + { + return eto.GetProperty(BulkAssetOccupancyResultEtoProperties.BookingOrderId); + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoProperties.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoProperties.cs new file mode 100644 index 00000000..caf7643b --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkAssetOccupancyResultEtoProperties.cs @@ -0,0 +1,6 @@ +namespace EasyAbp.BookingService.AssetOccupancies; + +public class BulkAssetOccupancyResultEtoProperties +{ + public const string BookingOrderId = "BookingOrderId"; +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoExtensions.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoExtensions.cs new file mode 100644 index 00000000..e5187db3 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoExtensions.cs @@ -0,0 +1,17 @@ +using System; +using Volo.Abp.Data; + +namespace EasyAbp.BookingService.AssetOccupancies; + +public static class BulkOccupyAssetEtoExtensions +{ + public static Guid? FindBookingOrderId(this BulkOccupyAssetEto eto) + { + return eto.GetProperty(BulkOccupyAssetEtoProperties.BookingOrderId); + } + + public static void SetBookingOrderId(this BulkOccupyAssetEto eto, Guid? value) + { + eto.SetProperty(BulkOccupyAssetEtoProperties.BookingOrderId, value); + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoProperties.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoProperties.cs new file mode 100644 index 00000000..e32655b7 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/BookingService/AssetOccupancies/BulkOccupyAssetEtoProperties.cs @@ -0,0 +1,6 @@ +namespace EasyAbp.BookingService.AssetOccupancies; + +public class BulkOccupyAssetEtoProperties +{ + public const string BookingOrderId = "BookingOrderId"; +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/BookingOrderProperties.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/BookingOrderProperties.cs new file mode 100644 index 00000000..685ad92a --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/BookingOrderProperties.cs @@ -0,0 +1,16 @@ +namespace EasyAbp.EShop.Orders; + +public class BookingOrderProperties +{ + public const string OrderLineBookingAssetId = "BookingAssetId"; + + public const string OrderLineBookingAssetCategoryId = "BookingAssetCategoryId"; + + public const string OrderLineBookingDate = "BookingDate"; + + public const string OrderLineBookingStartingTime = "BookingStartingTime"; + + public const string OrderLineBookingDuration = "BookingDuration"; + + public const string OrderLineBookingAssetOccupancyId = "BookingAssetOccupancyId"; +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/CreateOrderLineDtoExtensions.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/CreateOrderLineDtoExtensions.cs new file mode 100644 index 00000000..c15e53af --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/CreateOrderLineDtoExtensions.cs @@ -0,0 +1,33 @@ +using System; +using EasyAbp.EShop.Orders.Orders.Dtos; +using Volo.Abp.Data; + +namespace EasyAbp.EShop.Orders; + +public static class CreateOrderLineDtoExtensions +{ + public static Guid? FindBookingAssetId(this CreateOrderLineDto orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingAssetId); + } + + public static Guid? FindBookingAssetCategoryId(this CreateOrderLineDto orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingAssetCategoryId); + } + + public static DateTime? FindBookingDate(this CreateOrderLineDto orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingDate); + } + + public static TimeSpan? FindBookingStartingTime(this CreateOrderLineDto orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingStartingTime); + } + + public static TimeSpan? FindBookingDuration(this CreateOrderLineDto orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingDuration); + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/OrderLineExtensions.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/OrderLineExtensions.cs new file mode 100644 index 00000000..9c4eb41f --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Orders/OrderLineExtensions.cs @@ -0,0 +1,33 @@ +using System; +using EasyAbp.EShop.Orders.Orders; +using Volo.Abp.Data; + +namespace EasyAbp.EShop.Orders; + +public static class OrderLineExtensions +{ + public static Guid? FindBookingAssetId(this IOrderLine orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingAssetId); + } + + public static Guid? FindBookingAssetCategoryId(this IOrderLine orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingAssetCategoryId); + } + + public static DateTime? FindBookingDate(this IOrderLine orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingDate); + } + + public static TimeSpan? FindBookingStartingTime(this IOrderLine orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingStartingTime); + } + + public static TimeSpan? FindBookingDuration(this IOrderLine orderLine) + { + return orderLine.GetProperty(BookingOrderProperties.OrderLineBookingDuration); + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/Dtos/BookingProductGroupDefinitionDto.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/Dtos/BookingProductGroupDefinitionDto.cs new file mode 100644 index 00000000..43f448bc --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/Dtos/BookingProductGroupDefinitionDto.cs @@ -0,0 +1,9 @@ +using System; + +namespace EasyAbp.EShop.Plugins.Booking.BookingProductGroupDefinitions.Dtos; + +[Serializable] +public class BookingProductGroupDefinitionDto +{ + public string ProductGroupName { get; set; } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/IBookingProductGroupDefinitionAppService.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/IBookingProductGroupDefinitionAppService.cs new file mode 100644 index 00000000..84409a17 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/IBookingProductGroupDefinitionAppService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using EasyAbp.EShop.Plugins.Booking.BookingProductGroupDefinitions.Dtos; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace EasyAbp.EShop.Plugins.Booking.BookingProductGroupDefinitions; + +public interface IBookingProductGroupDefinitionAppService : IApplicationService +{ + Task> GetListAsync(); +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/EShopPluginsBookingApplicationContractsModule.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/EShopPluginsBookingApplicationContractsModule.cs index b2b07e72..0926d4d8 100644 --- a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/EShopPluginsBookingApplicationContractsModule.cs +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application.Contracts/EasyAbp/EShop/Plugins/Booking/EShopPluginsBookingApplicationContractsModule.cs @@ -1,11 +1,15 @@ -using Volo.Abp.Application; +using EasyAbp.BookingService; +using EasyAbp.EShop.Orders; +using Volo.Abp.Application; using Volo.Abp.Modularity; using Volo.Abp.Authorization; namespace EasyAbp.EShop.Plugins.Booking; [DependsOn( + typeof(BookingServiceDomainSharedModule), typeof(EShopPluginsBookingDomainSharedModule), + typeof(EShopOrdersApplicationContractsModule), typeof(AbpDddApplicationContractsModule), typeof(AbpAuthorizationModule) )] diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/BookingProductGroupDefinitionAppService.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/BookingProductGroupDefinitionAppService.cs new file mode 100644 index 00000000..d97bf1ff --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/BookingProductGroupDefinitions/BookingProductGroupDefinitionAppService.cs @@ -0,0 +1,31 @@ +using System.Linq; +using System.Threading.Tasks; +using EasyAbp.EShop.Plugins.Booking.BookingProductGroupDefinitions.Dtos; +using EasyAbp.EShop.Plugins.Booking.Options; +using Microsoft.Extensions.Options; +using Volo.Abp.Application.Dtos; + +namespace EasyAbp.EShop.Plugins.Booking.BookingProductGroupDefinitions; + +public class BookingProductGroupDefinitionAppService : BookingAppService, IBookingProductGroupDefinitionAppService +{ + private readonly EShopBookingOptions _options; + + public BookingProductGroupDefinitionAppService(IOptions options) + { + _options = options.Value; + } + + public virtual Task> GetListAsync() + { + return Task.FromResult( + new ListResultDto( + _options.BookingProductGroups.Select(x => + new BookingProductGroupDefinitionDto + { + ProductGroupName = x.ProductGroupName + }).ToList() + ) + ); + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/EventHandlers/BookingOrderPaidEventHandler.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/EventHandlers/BookingOrderPaidEventHandler.cs new file mode 100644 index 00000000..2565a36e --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Application/EasyAbp/EShop/Plugins/Booking/EventHandlers/BookingOrderPaidEventHandler.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using EasyAbp.BookingService.AssetOccupancies; +using EasyAbp.EShop.Orders; +using EasyAbp.EShop.Orders.Orders; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace EasyAbp.EShop.Plugins.Booking.EventHandlers; + +public class BookingOrderPaidEventHandler : IDistributedEventHandler, ITransientDependency +{ + private readonly IDistributedEventBus _distributedEventBus; + + public BookingOrderPaidEventHandler(IDistributedEventBus distributedEventBus) + { + _distributedEventBus = distributedEventBus; + } + + public virtual async Task HandleEventAsync(OrderPaidEto eventData) + { + var occupyModels = new List(); + var occupyByCategoryModels = new List(); + + foreach (var orderLine in eventData.Order.OrderLines) + { + var assetId = orderLine.FindBookingAssetId(); + var assetCategoryId = orderLine.FindBookingAssetCategoryId(); + var date = orderLine.FindBookingDate(); + var startingTime = orderLine.FindBookingStartingTime(); + var duration = orderLine.FindBookingDuration(); + + if (date is null || startingTime is null || duration is null) + { + continue; + } + + if (assetId.HasValue) + { + occupyModels.Add(new OccupyAssetInfoModel( + assetId: assetId.Value, + date: date.Value, + startingTime: startingTime.Value, + duration: duration.Value, + occupierUserId: eventData.Order.CustomerUserId + )); + } + else if (assetCategoryId.HasValue) + { + occupyByCategoryModels.Add(new OccupyAssetByCategoryInfoModel( + assetCategoryId: assetCategoryId.Value, + date: date.Value, + startingTime: startingTime.Value, + duration: duration.Value, + occupierUserId: eventData.Order.CustomerUserId + )); + } + } + + var eto = new BulkOccupyAssetEto(eventData.TenantId, occupyModels, occupyByCategoryModels); + + eto.SetBookingOrderId(eventData.Order.Id); + + await _distributedEventBus.PublishAsync(eto); + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/BookingProductGroupDefinition.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/BookingProductGroupDefinition.cs new file mode 100644 index 00000000..600105a6 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/BookingProductGroupDefinition.cs @@ -0,0 +1,14 @@ +using JetBrains.Annotations; + +namespace EasyAbp.EShop.Plugins.Booking.Options; + +public class BookingProductGroupDefinition +{ + [NotNull] + public string ProductGroupName { get; set; } + + public BookingProductGroupDefinition([NotNull] string productGroupName) + { + ProductGroupName = productGroupName; + } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/EShopBookingOptions.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/EShopBookingOptions.cs new file mode 100644 index 00000000..cc93687e --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/Options/EShopBookingOptions.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace EasyAbp.EShop.Plugins.Booking.Options; + +public class EShopBookingOptions +{ + /// + /// Which product groups are for booking business. + /// + public List BookingProductGroups { get; } = new(); +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssetCategories/ProductAssetCategory.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssetCategories/ProductAssetCategory.cs new file mode 100644 index 00000000..b186acf6 --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssetCategories/ProductAssetCategory.cs @@ -0,0 +1,25 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace EasyAbp.EShop.Plugins.Booking.ProductAssetCategories; + +/// +/// Mapping of ProductSku to AssetCategory. +/// Set which SKU can use to book a specified asset category. +/// +public class ProductAssetCategory : AuditedAggregateRoot, IMultiTenant +{ + public virtual Guid? TenantId { get; protected set; } + + public virtual Guid ProductId { get; protected set; } + + public virtual Guid ProductSkuId { get; protected set; } + + public virtual Guid AssetCategoryId { get; protected set; } + + /// + /// Fall back to the price of ProductSku if null. + /// + public virtual decimal? Price { get; protected set; } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssets/ProductAsset.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssets/ProductAsset.cs new file mode 100644 index 00000000..ac0266ae --- /dev/null +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.Domain/EasyAbp/EShop/Plugins/Booking/ProductAssets/ProductAsset.cs @@ -0,0 +1,25 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace EasyAbp.EShop.Plugins.Booking.ProductAssets; + +/// +/// Mapping of ProductSku to Asset. +/// Set which SKU can use to book a specified asset. +/// +public class ProductAsset : AuditedAggregateRoot, IMultiTenant +{ + public virtual Guid? TenantId { get; protected set; } + + public virtual Guid ProductId { get; protected set; } + + public virtual Guid ProductSkuId { get; protected set; } + + public virtual Guid AssetId { get; protected set; } + + /// + /// Fall back to the price of ProductSku if null. + /// + public virtual decimal? Price { get; protected set; } +} \ No newline at end of file diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContext.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContext.cs index 8f364504..293cfced 100644 --- a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContext.cs +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContext.cs @@ -21,6 +21,6 @@ public class BookingDbContext : AbpDbContext, IBookingDbContex { base.OnModelCreating(builder); - builder.ConfigureBooking(); + builder.ConfigureEShopPluginsBooking(); } } diff --git a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContextModelCreatingExtensions.cs b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContextModelCreatingExtensions.cs index cd07a59b..9fbc0198 100644 --- a/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContextModelCreatingExtensions.cs +++ b/plugins/Booking/src/EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore/EasyAbp/EShop/Plugins/Booking/EntityFrameworkCore/BookingDbContextModelCreatingExtensions.cs @@ -5,7 +5,7 @@ namespace EasyAbp.EShop.Plugins.Booking.EntityFrameworkCore; public static class BookingDbContextModelCreatingExtensions { - public static void ConfigureBooking( + public static void ConfigureEShopPluginsBooking( this ModelBuilder builder) { Check.NotNull(builder, nameof(builder)); diff --git a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml index 00e1d9a1..be0de3a9 100644 --- a/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml +++ b/plugins/Coupons/src/EasyAbp.EShop.Orders.Plugins.Coupons/FodyWeavers.xml @@ -1,3 +1,3 @@  - + \ No newline at end of file