using MediatR; using TakeoutSaaS.Application.App.Tenants.Commands; using TakeoutSaaS.Application.App.Tenants.Dto; using TakeoutSaaS.Domain.Tenants.Entities; using TakeoutSaaS.Domain.Tenants.Enums; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Exceptions; namespace TakeoutSaaS.Application.App.Tenants.Handlers; /// /// 创建租户套餐处理器。 /// public sealed class CreateTenantPackageCommandHandler(ITenantPackageRepository packageRepository) : IRequestHandler { /// public async Task Handle(CreateTenantPackageCommand request, CancellationToken cancellationToken) { // 1. 校验套餐名称 if (string.IsNullOrWhiteSpace(request.Name)) { throw new BusinessException(ErrorCodes.BadRequest, "套餐名称不能为空"); } // 2. 构建套餐实体 var package = new TenantPackage { Name = request.Name.Trim(), Description = request.Description, PackageType = request.PackageType, MonthlyPrice = request.MonthlyPrice, YearlyPrice = request.YearlyPrice, MaxStoreCount = request.MaxStoreCount, MaxAccountCount = request.MaxAccountCount, MaxStorageGb = request.MaxStorageGb, MaxSmsCredits = request.MaxSmsCredits, MaxDeliveryOrders = request.MaxDeliveryOrders, FeaturePoliciesJson = request.FeaturePoliciesJson, IsActive = request.IsActive, IsPublicVisible = request.IsPublicVisible, IsAllowNewTenantPurchase = request.IsAllowNewTenantPurchase, PublishStatus = request.PublishStatus ?? TenantPackagePublishStatus.Draft, IsRecommended = request.IsRecommended, Tags = request.Tags ?? [], SortOrder = request.SortOrder }; // 3. 持久化并返回 await packageRepository.AddAsync(package, cancellationToken); await packageRepository.SaveChangesAsync(cancellationToken); return package.ToDto(); } }