Browse Source

Improve FlashSales

pull/184/head
Jadyn 4 years ago
parent
commit
f805c3b177
  1. 23
      plugins/FlashSales/src/EasyAbp.EShop.Orders.Plugins.FlashSales.Application/EasyAbp/EShop/Orders/Orders/FlashSalesOrderCreationAuthorizationHandler.cs
  2. 17
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateDto.cs
  3. 20
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanCreateOrUpdateDtoBase.cs
  4. 15
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application.Contracts/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/Dtos/FlashSalesPlanUpdateDto.cs
  5. 65
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanAppService.cs
  6. 13
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductIsNotInThisStoreException.cs
  7. 12
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Application/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/ProductSkuIsNotFoundException.cs
  8. 10
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesErrorCodes.cs
  9. 12
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResultStatus.cs
  10. 34
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/en.json
  11. 22
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hans.json
  12. 72
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain.Shared/EasyAbp/EShop/Plugins/FlashSales/Localization/zh-Hant.json
  13. 2
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/EndTimeMustBeLaterThanBeginTimeException.cs
  14. 6
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan.cs
  15. 44
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanManager.cs
  16. 6
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan/index.js
  17. 13
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/ViewModels/ViewFlashSalesResultViewModel.cs
  18. 13
      plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Web/Pages/EShop/Plugins/FlashSales/FlashSalesResults/FlashSalesResult/index.js

23
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<FlashSalesResource> Localizer { get; }
public FlashSalesOrderCreationAuthorizationHandler(IAbpLazyServiceProvider lazyServiceProvider)
public FlashSalesOrderCreationAuthorizationHandler(
IAbpLazyServiceProvider lazyServiceProvider,
IStringLocalizer<FlashSalesResource> 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<bool> IsFlashSalesPlanProductSkuAsync(OrderCreationResource resource)
{
var flashSalesPlanAppService = LazyServiceProvider.LazyGetRequiredService<IFlashSalesPlanAppService>();
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;
}
}

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

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

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

65
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<FlashSalesPlanCacheItem, Guid> 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<string> 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<string> GetCacheHashTokenAsync(FlashSalesPlanCacheItem plan)

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

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

10
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)}";

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

34
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"
}
}

22
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": "失败"
}
}

72
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": "失敗"
}
}

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

6
plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlan.cs

@ -28,9 +28,8 @@ public class FlashSalesPlan : FullAuditedAggregateRoot<Guid>, 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<Guid>, 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;
}

44
plugins/FlashSales/src/EasyAbp.EShop.Plugins.FlashSales.Domain/EasyAbp/EShop/Plugins/FlashSales/FlashSalesPlans/FlashSalesPlanManager.cs

@ -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<FlashSalesPlan> 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<FlashSalesPlan> 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);
}
}

6
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'),

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

13
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'),

Loading…
Cancel
Save