diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Orders.Plugins.FlashSales.Application/EasyAbp/EShop/Orders/Orders/FlashSalesOrderCreationAuthorizationHandler.cs b/plugins/FlashSales/src/EasyAbp.EShop.Orders.Plugins.FlashSales.Application/EasyAbp/EShop/Orders/Orders/FlashSalesOrderCreationAuthorizationHandler.cs index 16750493..3723c4d6 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Orders.Plugins.FlashSales.Application/EasyAbp/EShop/Orders/Orders/FlashSalesOrderCreationAuthorizationHandler.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Orders.Plugins.FlashSales.Application/EasyAbp/EShop/Orders/Orders/FlashSalesOrderCreationAuthorizationHandler.cs @@ -1,7 +1,9 @@ using System.Threading.Tasks; using EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans; using EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans.Dtos; +using EasyAbp.EShop.Plugins.FlashSales.Localization; using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Localization; using Volo.Abp.DependencyInjection; namespace EasyAbp.EShop.Orders.Orders; @@ -9,14 +11,28 @@ namespace EasyAbp.EShop.Orders.Orders; public class FlashSalesOrderCreationAuthorizationHandler : OrderCreationAuthorizationHandler { protected IAbpLazyServiceProvider LazyServiceProvider { get; } + protected IStringLocalizer Localizer { get; } - public FlashSalesOrderCreationAuthorizationHandler(IAbpLazyServiceProvider lazyServiceProvider) + public FlashSalesOrderCreationAuthorizationHandler( + IAbpLazyServiceProvider lazyServiceProvider, + IStringLocalizer localizer) { LazyServiceProvider = lazyServiceProvider; + Localizer = localizer; } protected override async Task HandleOrderCreationAsync(AuthorizationHandlerContext context, OrderOperationAuthorizationRequirement requirement, OrderCreationResource resource) + { + if (await IsFlashSalesPlanProductSkuAsync(resource)) + { + context.Fail(new AuthorizationFailureReason(this, Localizer["ExistFlashSalesPlanProduct"])); + } + + context.Succeed(requirement); + } + + protected virtual async Task IsFlashSalesPlanProductSkuAsync(OrderCreationResource resource) { var flashSalesPlanAppService = LazyServiceProvider.LazyGetRequiredService(); foreach (var orderLine in resource.Input.OrderLines) @@ -30,11 +46,10 @@ public class FlashSalesOrderCreationAuthorizationHandler : OrderCreationAuthoriz }); if (plans.Items.Count > 0) { - context.Fail(); - return; + return true; } } - context.Succeed(requirement); + return false; } } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateDto.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateDto.cs index c3be88e7..45c740bc 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateDto.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateDto.cs @@ -1,21 +1,8 @@ using System; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Entities; namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans.Dtos; [Serializable] -public class FlashSalesPlanCreateDto : ExtensibleEntityDto +public class FlashSalesPlanCreateDto : FlashSalesPlanCreateOrUpdateDtoBase { - public Guid StoreId { get; set; } - - public DateTime BeginTime { get; set; } - - public DateTime EndTime { get; set; } - - public Guid ProductId { get; set; } - - public Guid ProductSkuId { get; set; } - - public bool IsPublished { get; set; } -} \ No newline at end of file +} diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateOrUpdateDtoBase.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateOrUpdateDtoBase.cs new file mode 100644 index 00000000..85403c03 --- /dev/null +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateOrUpdateDtoBase.cs @@ -0,0 +1,20 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans.Dtos; + +[Serializable] +public abstract class FlashSalesPlanCreateOrUpdateDtoBase : ExtensibleEntityDto +{ + public Guid StoreId { get; set; } + + public DateTime BeginTime { get; set; } + + public DateTime EndTime { get; set; } + + public Guid ProductId { get; set; } + + public Guid ProductSkuId { get; set; } + + public bool IsPublished { get; set; } +} \ No newline at end of file diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanUpdateDto.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanUpdateDto.cs index 36db2173..4a02dfa7 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanUpdateDto.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanUpdateDto.cs @@ -1,23 +1,10 @@ using System; -using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Entities; namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans.Dtos; [Serializable] -public class FlashSalesPlanUpdateDto : ExtensibleEntityDto, IHasConcurrencyStamp +public class FlashSalesPlanUpdateDto : FlashSalesPlanCreateOrUpdateDtoBase, IHasConcurrencyStamp { - public Guid StoreId { get; set; } - - public DateTime BeginTime { get; set; } - - public DateTime EndTime { get; set; } - - public Guid ProductId { get; set; } - - public Guid ProductSkuId { get; set; } - - public bool IsPublished { get; set; } - public string ConcurrencyStamp { get; set; } } \ No newline at end of file diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanAppService.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanAppService.cs index 72794d3b..db951ed3 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanAppService.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanAppService.cs @@ -45,8 +45,6 @@ public class FlashSalesPlanAppService : protected IDistributedEventBus DistributedEventBus { get; } - protected FlashSalesPlanManager FlashSalesPlanManager { get; } - protected IFlashSalesResultRepository FlashSalesResultRepository { get; } protected IAbpDistributedLock DistributedLock { get; } @@ -60,7 +58,6 @@ public class FlashSalesPlanAppService : IDistributedCache tokenDistributedCache, IDistributedCache distributedCache, IDistributedEventBus distributedEventBus, - FlashSalesPlanManager flashSalesPlanManager, IFlashSalesResultRepository flashSalesResultRepository, IAbpDistributedLock distributedLock, IFlashSalesPlanHasher flashSalesPlanHasher) @@ -72,7 +69,6 @@ public class FlashSalesPlanAppService : TokenDistributedCache = tokenDistributedCache; DistributedCache = distributedCache; DistributedEventBus = distributedEventBus; - FlashSalesPlanManager = flashSalesPlanManager; FlashSalesResultRepository = flashSalesResultRepository; DistributedLock = distributedLock; FlashSalesPlanHasher = flashSalesPlanHasher; @@ -96,7 +92,22 @@ public class FlashSalesPlanAppService : { await AuthorizationService.CheckMultiStorePolicyAsync(input.StoreId, CreatePolicyName); - var flashSalesPlan = await FlashSalesPlanManager.CreateAsync( + var product = await ProductAppService.GetAsync(input.ProductId); + var productSku = product.FindSkuById(input.ProductSkuId); + + if (product.StoreId != input.StoreId) + { + throw new ProductIsNotInThisStoreException(input.ProductId, input.StoreId); + } + + if (productSku == null) + { + throw new ProductSkuIsNotFoundException(input.ProductSkuId); + } + + var flashSalesPlan = new FlashSalesPlan( + GuidGenerator.Create(), + CurrentTenant.Id, input.StoreId, input.BeginTime, input.EndTime, @@ -114,16 +125,24 @@ public class FlashSalesPlanAppService : { await AuthorizationService.CheckMultiStorePolicyAsync(input.StoreId, UpdatePolicyName); + var product = await ProductAppService.GetAsync(input.ProductId); + var productSku = product.FindSkuById(input.ProductSkuId); + + if (product.StoreId != input.StoreId) + { + throw new ProductIsNotInThisStoreException(input.ProductId, input.StoreId); + } + + if (productSku == null) + { + throw new ProductSkuIsNotFoundException(input.ProductSkuId); + } + var flashSalesPlan = await GetEntityByIdAsync(id); - await FlashSalesPlanManager.UpdateAsync( - flashSalesPlan, - input.BeginTime, - input.EndTime, - input.ProductId, - input.ProductSkuId, - input.IsPublished - ); + flashSalesPlan.SetTimeRange(input.BeginTime, input.EndTime); + flashSalesPlan.SetProductSku(input.StoreId, input.ProductId, input.ProductSkuId); + flashSalesPlan.SetPublished(input.IsPublished); flashSalesPlan.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); @@ -170,7 +189,7 @@ public class FlashSalesPlanAppService : if (product.InventoryStrategy != InventoryStrategy.FlashSales) { - throw new BusinessException(FlashSalesErrorCodes.IsNotFlashSalesProduct); + throw new BusinessException(FlashSalesErrorCodes.ProductInventoryStrategyIsNotFlashSales); } if (!plan.IsPublished) @@ -183,6 +202,11 @@ public class FlashSalesPlanAppService : throw new BusinessException(FlashSalesErrorCodes.FlashSalesPlanIsExpired); } + if (productSku.Inventory < 1) + { + throw new BusinessException(FlashSalesErrorCodes.ProductSkuInventoryExceeded); + } + await SetCacheHashTokenAsync(plan, product, productSku); } @@ -197,15 +221,20 @@ public class FlashSalesPlanAppService : var cacheHashToken = await GetCacheHashTokenAsync(plan); if (cacheHashToken.IsNullOrWhiteSpace()) { - throw new BusinessException(FlashSalesErrorCodes.PreOrderExipred); + throw new BusinessException(FlashSalesErrorCodes.PreOrderExpried); } var product = await ProductAppService.GetAsync(plan.ProductId); var productSku = product.GetSkuById(plan.ProductSkuId); + if (productSku.Inventory < 1) + { + throw new BusinessException(FlashSalesErrorCodes.ProductSkuInventoryExceeded); + } + if (!await ComparekHashTokenAsync(cacheHashToken, plan, product, productSku)) { - throw new BusinessException(FlashSalesErrorCodes.PreOrderExipred); + throw new BusinessException(FlashSalesErrorCodes.PreOrderExpried); } } @@ -226,7 +255,7 @@ public class FlashSalesPlanAppService : var cacheHashToken = await GetCacheHashTokenAsync(plan); if (cacheHashToken.IsNullOrWhiteSpace()) { - throw new BusinessException(FlashSalesErrorCodes.PreOrderExipred); + throw new BusinessException(FlashSalesErrorCodes.PreOrderExpried); } await RemoveCacheHashTokenAsync(plan); @@ -288,7 +317,7 @@ public class FlashSalesPlanAppService : protected virtual Task GetCacheKeyAsync(FlashSalesPlanCacheItem plan) { - return Task.FromResult($"eshopflashsales_{CurrentUser.Id}_{plan.ProductSkuId}"); + return Task.FromResult($"eshopflashsales_{CurrentTenant.Id}_{CurrentUser.Id}_{plan.ProductSkuId}"); } protected virtual async Task GetCacheHashTokenAsync(FlashSalesPlanCacheItem plan) diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductIsNotInThisStoreException.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductIsNotInThisStoreException.cs new file mode 100644 index 00000000..b6f7e9f9 --- /dev/null +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductIsNotInThisStoreException.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp; + +namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans; + +public class ProductIsNotInThisStoreException : BusinessException +{ + public ProductIsNotInThisStoreException(Guid productId, Guid storeId) : base(FlashSalesErrorCodes.ProductIsNotInThisStore) + { + WithData(nameof(productId), productId); + WithData(nameof(storeId), storeId); + } +} diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductSkuIsNotFoundException.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductSkuIsNotFoundException.cs new file mode 100644 index 00000000..f3679fe6 --- /dev/null +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductSkuIsNotFoundException.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp; + +namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans; + +public class ProductSkuIsNotFoundException : BusinessException +{ + public ProductSkuIsNotFoundException(Guid productSkuId) : base(FlashSalesErrorCodes.ProductSkuIsNotFound) + { + WithData(nameof(productSkuId), productSkuId); + } +} diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesErrorCodes.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesErrorCodes.cs index 033cd4a7..a445de23 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesErrorCodes.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesErrorCodes.cs @@ -6,11 +6,17 @@ public static class FlashSalesErrorCodes public const string EndTimeMustBeLaterThanBeginTime = $"{Namespace}:{nameof(EndTimeMustBeLaterThanBeginTime)}"; + public const string ProductIsNotInThisStore = $"{Namespace}:{nameof(ProductIsNotInThisStore)}"; + + public const string ProductSkuIsNotFound = $"{Namespace}:{nameof(ProductSkuIsNotFound)}"; + public const string ProductIsNotPublished = $"{Namespace}:{nameof(ProductIsNotPublished)}"; - public const string IsNotFlashSalesProduct = $"{Namespace}:{nameof(IsNotFlashSalesProduct)}"; + public const string ProductSkuInventoryExceeded = $"{Namespace}:{nameof(ProductSkuInventoryExceeded)}"; + + public const string ProductInventoryStrategyIsNotFlashSales = $"{Namespace}:{nameof(ProductInventoryStrategyIsNotFlashSales)}"; - public const string PreOrderExipred = $"{Namespace}:{nameof(PreOrderExipred)}"; + public const string PreOrderExpried = $"{Namespace}:{nameof(PreOrderExpried)}"; public const string FlashSalesPlanIsNotStart = $"{Namespace}:{nameof(FlashSalesPlanIsNotStart)}"; diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResultStatus.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResultStatus.cs index 3d88d0cc..2f242858 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResultStatus.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResultStatus.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesResults; +namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesResults; public enum FlashSalesResultStatus { - Pending, - Successful, - Failed + Pending = 0, + Successful = 1, + Failed = 2 } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/en.json b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/en.json index f92545a9..7bd649b8 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/en.json +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/en.json @@ -2,14 +2,25 @@ "culture": "en", "texts": { "EasyAbp.EShop.Plugins.FlashSales:EndTimeMustBeLaterThanBeginTime": "End time must be later than start time", - "Menu:FlashSalesManagement": "FlashSalesManagement", - "Permission:FlashSalesPlan": "FlashSalesPlan", + "EasyAbp.EShop.Plugins.FlashSales:ProductIsNotInThisStore": "Product '{productId}' is not in this store '{storeId}'", + "EasyAbp.EShop.Plugins.FlashSales:ProductSkuIsNotFound": "ProductSku '{productSkuId}' is not found", + "EasyAbp.EShop.Plugins.FlashSales:ProductIsNotPublished": "Product is not published", + "EasyAbp.EShop.Plugins.FlashSales:ProductSkuInventoryExceeded": "Product SKU inventory exceeded", + "EasyAbp.EShop.Plugins.FlashSales:ProductInventoryStrategyIsNotFlashSales": "Product inventory strategy is not flash-sales", + "EasyAbp.EShop.Plugins.FlashSales:PreOrderExpried": "Pre order expired", + "EasyAbp.EShop.Plugins.FlashSales:FlashSalesPlanIsNotStart": "FlashSales plan is not start", + "EasyAbp.EShop.Plugins.FlashSales:FlashSalesPlanIsExpired": "FlashSales plan is expired", + "EasyAbp.EShop.Plugins.FlashSales:CreateFlashSalesOrderBusy": "Create flash-sales order busy", + "EasyAbp.EShop.Plugins.FlashSales:AlreadySubmitCreateFlashSalesOrder": "Already submit create flash-sales order", + "ExistFlashSalesPlanProduct": "Exist unexpected flash-sales plan product", + "Menu:FlashSalesManagement": "FlashSales Management", + "Permission:FlashSalesPlan": "FlashSales Plan", "Permission:Manage": "Manage", "Permission:Create": "Create", "Permission:Update": "Update", "Permission:Delete": "Delete", - "Menu:FlashSalesPlan": "FlashSalesPlan", - "FlashSalesPlan": "FlashSalesPlan", + "Menu:FlashSalesPlan": "FlashSales Plan", + "FlashSalesPlan": "FlashSales Plan", "FlashSalesPlanStoreId": "Store ID", "FlashSalesPlanBeginTime": "Begin Time", "FlashSalesPlanEndTime": "End Time", @@ -20,15 +31,22 @@ "EditFlashSalesPlan": "Edit", "FlashSalesPlanDeletionConfirmationMessage": "Are you sure to delete the flashSalesPlan {0}?", "SuccessfullyDeleted": "Successfully deleted", - "Permission:FlashSalesResult": "FlashSalesResult", - "Menu:FlashSalesResult": "FlashSalesResult", - "FlashSalesResult": "FlashSalesResult", + "Permission:FlashSalesResult": "FlashSales Result", + "Menu:FlashSalesResult": "FlashSales Result", + "FlashSalesResult": "FlashSales Result", "FlashSalesResultStoreId": "Store ID", "FlashSalesResultPlanId": "Plan ID", "FlashSalesResultStatus": "Status", + "FlashSalesResultReason": "Reason", "FlashSalesResultUserId": "User ID", "FlashSalesResultOrderId": "Order ID", "FlashSalesResultCreationTime": "Creation Time", - "ViewFlashSalesPlan": "View" + "ViewFlashSalesResult": "View", + "Enum:FlashSalesResultStatus.Pending": "Pending", + "Enum:FlashSalesResultStatus.Successful": "Successful", + "Enum:FlashSalesResultStatus.Failed": "Failed", + "Enum:FlashSalesResultStatus.0": "Pending", + "Enum:FlashSalesResultStatus.1": "Successful", + "Enum:FlashSalesResultStatus.2": "Failed" } } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hans.json b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hans.json index 5061f16b..c13420e7 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hans.json +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hans.json @@ -2,6 +2,17 @@ "culture": "zh-Hans", "texts": { "EasyAbp.EShop.Plugins.FlashSales:EndTimeMustBeLaterThanBeginTime": "结束时间必须晚于开始时间", + "EasyAbp.EShop.Plugins.FlashSales:ProductIsNotInThisStore": "产品'{productId}'不在此店铺'{storeId}'中", + "EasyAbp.EShop.Plugins.FlashSales:ProductSkuIsNotFound": "产品SKU'{productSkuId}'不存在", + "EasyAbp.EShop.Plugins.FlashSales:ProductIsNotPublished": "产品尚未发布", + "EasyAbp.EShop.Plugins.FlashSales:ProductSkuInventoryExceeded": "产品SKU库存不足", + "EasyAbp.EShop.Plugins.FlashSales:ProductInventoryStrategyIsNotFlashSales": "产品库存策略不是闪购", + "EasyAbp.EShop.Plugins.FlashSales:PreOrderExpried": "预下单已过期", + "EasyAbp.EShop.Plugins.FlashSales:FlashSalesPlanIsNotStart": "闪购计划尚未开始", + "EasyAbp.EShop.Plugins.FlashSales:FlashSalesPlanIsExpired": "闪购计划已经结束", + "EasyAbp.EShop.Plugins.FlashSales:CreateFlashSalesOrderBusy": "闪购计划下单繁忙", + "EasyAbp.EShop.Plugins.FlashSales:AlreadySubmitCreateFlashSalesOrder": "已经提交闪购下单", + "ExistFlashSalesPlanProduct": "清單中不允許存在閃購計畫中的產品", "Menu:FlashSalesManagement": "闪购", "Permission:FlashSalesPlan": "闪购计划", "Permission:Manage": "管理", @@ -17,7 +28,7 @@ "FlashSalesPlanProductSkuId": "产品SKU ID", "FlashSalesPlanIsPublished": "发布", "CreateFlashSalesPlan": "新建", - "EditFlashSalesPlan": "编辑", + "EditFlashSalesPlan": "編輯", "FlashSalesPlanDeletionConfirmationMessage": "确认删除闪购计划 {0}?", "SuccessfullyDeleted": "删除成功", "Permission:FlashSalesResult": "闪购结果", @@ -26,9 +37,16 @@ "FlashSalesResultStoreId": "店铺 ID", "FlashSalesResultPlanId": "计划 ID", "FlashSalesResultStatus": "状态", + "FlashSalesResultReason": "原因", "FlashSalesResultUserId": "用户 ID", "FlashSalesResultOrderId": "订单 ID", "FlashSalesResultCreationTime": "创建时间", - "ViewFlashSalesPlan": "查看" + "ViewFlashSalesResult": "查看", + "Enum:FlashSalesResultStatus.Pending": "等待中", + "Enum:FlashSalesResultStatus.Successful": "成功", + "Enum:FlashSalesResultStatus.Failed": "失败", + "Enum:FlashSalesResultStatus.0": "等待中", + "Enum:FlashSalesResultStatus.1": "成功", + "Enum:FlashSalesResultStatus.2": "失败" } } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hant.json b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hant.json index 24fd0adc..2311abec 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hant.json +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hant.json @@ -2,33 +2,51 @@ "culture": "zh-Hant", "texts": { "EasyAbp.EShop.Plugins.FlashSales:EndTimeMustBeLaterThanBeginTime": "結束時間必須晚於開始時間", - "Menu:FlashSalesManagement": "FlashSalesManagement", - "Permission:FlashSalesPlan": "FlashSalesPlan", - "Permission:Manage": "Manage", - "Permission:Create": "Create", - "Permission:Update": "Update", - "Permission:Delete": "Delete", - "Menu:FlashSalesPlan": "FlashSalesPlan", - "FlashSalesPlan": "FlashSalesPlan", - "FlashSalesPlanStoreId": "FlashSalesPlanStoreId", - "FlashSalesPlanBeginTime": "FlashSalesPlanBeginTime", - "FlashSalesPlanEndTime": "FlashSalesPlanEndTime", - "FlashSalesPlanProductId": "FlashSalesPlanProductId", - "FlashSalesPlanProductSkuId": "FlashSalesPlanProductSkuId", - "FlashSalesPlanIsPublished": "FlashSalesPlanIsActive", - "CreateFlashSalesPlan": "CreateFlashSalesPlan", - "EditFlashSalesPlan": "EditFlashSalesPlan", - "FlashSalesPlanDeletionConfirmationMessage": "Are you sure to delete the flashSalesPlan {0}?", - "SuccessfullyDeleted": "Successfully deleted", - "Permission:FlashSalesResult": "闪购结果", - "Menu:FlashSalesResult": "闪购计划", - "FlashSalesResult": "闪购结果", + "EasyAbp.EShop.Plugins.FlashSales:ProductIsNotInThisStore": "產品'{productId}'不在此店鋪'{storeId}'中", + "EasyAbp.EShop.Plugins.FlashSales:ProductSkuIsNotFound": "產品SKU'{productSkuId}'不存在", + "EasyAbp.EShop.Plugins.FlashSales:ProductIsNotPublished": "產品尚未發佈", + "EasyAbp.EShop.Plugins.FlashSales:ProductSkuInventoryExceeded": "產品SKU庫存不足", + "EasyAbp.EShop.Plugins.FlashSales:ProductInventoryStrategyIsNotFlashSales": "產品庫存策略不是閃購", + "EasyAbp.EShop.Plugins.FlashSales:PreOrderExpried": "預下單已過期", + "EasyAbp.EShop.Plugins.FlashSales:FlashSalesPlanIsNotStart": "閃購計畫尚未開始", + "EasyAbp.EShop.Plugins.FlashSales:FlashSalesPlanIsExpired": "閃購計畫已經結束", + "EasyAbp.EShop.Plugins.FlashSales:CreateFlashSalesOrderBusy": "閃購計畫下單繁忙", + "EasyAbp.EShop.Plugins.FlashSales:AlreadySubmitCreateFlashSalesOrder": "已經提交閃購下單", + "ExistFlashSalesPlanProduct": "清单中不允许存在闪购计划中的产品", + "Menu:FlashSalesManagement": "閃購管理", + "Permission:FlashSalesPlan": "閃購計畫", + "Permission:Manage": "管理", + "Permission:Create": "新建", + "Permission:Update": "更新", + "Permission:Delete": "删除", + "Menu:FlashSalesPlan": "閃購計畫", + "FlashSalesPlan": "閃購計畫", + "FlashSalesPlanStoreId": "店鋪ID", + "FlashSalesPlanBeginTime": "開始時間", + "FlashSalesPlanEndTime": "結束時間", + "FlashSalesPlanProductId": "產品ID", + "FlashSalesPlanProductSkuId": "產品SKU ID", + "FlashSalesPlanIsPublished": "發佈", + "CreateFlashSalesPlan": "新建", + "EditFlashSalesPlan": "更新", + "FlashSalesPlanDeletionConfirmationMessage": "確認删除閃購計畫 {0}?", + "SuccessfullyDeleted": "删除成功", + "Permission:FlashSalesResult": "閃購結果", + "Menu:FlashSalesResult": "閃購結果", + "FlashSalesResult": "閃購結果", "FlashSalesResultStoreId": "店铺 ID", - "FlashSalesResultPlanId": "计划 ID", - "FlashSalesResultStatus": "状态", - "FlashSalesResultUserId": "用户 ID", - "FlashSalesResultOrderId": "订单 ID", - "FlashSalesResultCreationTime": "创建时间", - "ViewFlashSalesPlan": "查看" + "FlashSalesResultPlanId": "計畫 ID", + "FlashSalesResultStatus": "狀態", + "FlashSalesResultReason": "原因", + "FlashSalesResultUserId": "用戶 ID", + "FlashSalesResultOrderId": "訂單 ID", + "FlashSalesResultCreationTime": "創建時間", + "ViewFlashSalesResult": "查看", + "Enum:FlashSalesResultStatus.Pending": "等待中", + "Enum:FlashSalesResultStatus.Successful": "成功", + "Enum:FlashSalesResultStatus.Failed": "失敗", + "Enum:FlashSalesResultStatus.0": "等待中", + "Enum:FlashSalesResultStatus.1": "成功", + "Enum:FlashSalesResultStatus.2": "失敗" } } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/EndTimeMustBeLaterThanBeginTimeException.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/EndTimeMustBeLaterThanBeginTimeException.cs index 4b9fdad2..7d3b0938 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/EndTimeMustBeLaterThanBeginTimeException.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/EndTimeMustBeLaterThanBeginTimeException.cs @@ -2,7 +2,7 @@ namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans; -internal class EndTimeMustBeLaterThanBeginTimeException : BusinessException +public class EndTimeMustBeLaterThanBeginTimeException : BusinessException { public EndTimeMustBeLaterThanBeginTimeException() : base(FlashSalesErrorCodes.EndTimeMustBeLaterThanBeginTime) diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan.cs index 0de27f9a..e52b4c1d 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan.cs @@ -28,9 +28,8 @@ public class FlashSalesPlan : FullAuditedAggregateRoot, IMultiTenant : base(id) { TenantId = tenantId; - StoreId = storeId; SetTimeRange(beginTime, endTime); - SetProduct(productId, productSkuId); + SetProductSku(storeId, productId, productSkuId); SetPublished(isPublished); } @@ -45,8 +44,9 @@ public class FlashSalesPlan : FullAuditedAggregateRoot, IMultiTenant EndTime = endTime; } - public void SetProduct(Guid productId, Guid productSkuId) + public void SetProductSku(Guid storeId, Guid productId, Guid productSkuId) { + StoreId = storeId; ProductId = productId; ProductSkuId = productSkuId; } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanManager.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanManager.cs deleted file mode 100644 index d8654316..00000000 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanManager.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.Domain.Services; - -namespace EasyAbp.EShop.Plugins.FlashSales.FlashSalesPlans; - -public class FlashSalesPlanManager : DomainService -{ - public virtual Task CreateAsync( - Guid storeId, - DateTime beginTime, - DateTime endTime, - Guid productId, - Guid productSkuId, - bool isActive) - { - var flashSalesPlan = new FlashSalesPlan( - GuidGenerator.Create(), - CurrentTenant.Id, - storeId, - beginTime, - endTime, - productId, - productSkuId, - isActive - ); - return Task.FromResult(flashSalesPlan); - } - - public virtual Task UpdateAsync( - FlashSalesPlan flashSalesPlan, - DateTime beginTime, - DateTime endTime, - Guid productId, - Guid productSkuId, - bool isPublished) - { - flashSalesPlan.SetTimeRange(beginTime, endTime); - flashSalesPlan.SetProduct(productId, productSkuId); - flashSalesPlan.SetPublished(isPublished); - - return Task.FromResult(flashSalesPlan); - } -} diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan/index.js b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan/index.js index 8b4a951e..9845f13f 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan/index.js +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan/index.js @@ -50,11 +50,13 @@ $(function () { }, { title: l('FlashSalesPlanBeginTime'), - data: "beginTime" + data: "beginTime", + dataFormat: 'datetime' }, { title: l('FlashSalesPlanEndTime'), - data: "endTime" + data: "endTime", + dataFormat: 'datetime' }, { title: l('FlashSalesPlanProductId'), diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/ViewModels/ViewFlashSalesResultViewModel.cs b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/ViewModels/ViewFlashSalesResultViewModel.cs index c72ba9f0..02a2267c 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/ViewModels/ViewFlashSalesResultViewModel.cs +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/ViewModels/ViewFlashSalesResultViewModel.cs @@ -7,17 +7,20 @@ namespace EasyAbp.EShop.Plugins.FlashSales.Web.Pages.EShop.Plugins.FlashSales.Fl public class ViewFlashSalesResultViewModel { [Display(Name = "FlashSalesResultStoreId")] - public virtual Guid StoreId { get; protected set; } + public Guid StoreId { get; set; } [Display(Name = "FlashSalesResultPlanId")] - public virtual Guid PlanId { get; protected set; } + public Guid PlanId { get; set; } [Display(Name = "FlashSalesResultStatus")] - public virtual FlashSalesResultStatus Status { get; protected set; } + public FlashSalesResultStatus Status { get; set; } + + [Display(Name = "FlashSalesResultReason")] + public string Reason { get; set; } [Display(Name = "FlashSalesResultUserId")] - public virtual Guid UserId { get; protected set; } + public Guid UserId { get; set; } [Display(Name = "FlashSalesResultOrderId")] - public virtual Guid? OrderId { get; protected set; } + public Guid? OrderId { get; set; } } diff --git a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/index.js b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/index.js index d29f6825..bd3bc6dd 100644 --- a/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/index.js +++ b/plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/index.js @@ -2,7 +2,7 @@ $(function () { var l = abp.localization.getResource('EasyAbpEShopPluginsFlashSales'); - var service = easyAbp.eShop.plugins.flashSales.flashSalesPlans.flashSalesPlan; + var service = easyAbp.eShop.plugins.flashSales.flashSalesResults.flashSalesResult; var viewModal = new abp.ModalManager(abp.appPath + 'EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/ViewModal'); var dataTable = $('#FlashSalesResultTable').DataTable(abp.libs.datatables.normalizeConfiguration({ @@ -20,7 +20,7 @@ $(function () { items: [ { - text: l('ViewFlashSalesPlan'), + text: l('ViewFlashSalesResult'), action: function (data) { viewModal.open({ id: data.record.id }); } @@ -38,7 +38,14 @@ $(function () { }, { title: l('FlashSalesResultStatus'), - data: "status" + data: "status", + render: function (data) { + return l('Enum:FlashSalesResultStatus.' + data); + } + }, + { + title: l('FlashSalesResultReason'), + data: "reason" }, { title: l('FlashSalesResultUserId'),