feat: 租户创建时自动创建商户和证照记录
- 扩展 MerchantDocumentType 枚举,新增法人身份证、卫生许可证等类型 - 新增 TenantCreatedEvent 领域事件 - 修改 CreateTenantManuallyCommandHandler 发布租户创建事件 - 新增 TenantCreatedEventConsumer 消费者,自动创建商户和证照 - 实现 Tenant 1:1 Merchant 的业务关系 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging;
|
||||
using TakeoutSaaS.Application.App.Tenants.Commands;
|
||||
using TakeoutSaaS.Application.App.Tenants.Contracts;
|
||||
using TakeoutSaaS.Application.App.Tenants.Queries;
|
||||
using TakeoutSaaS.Application.Messaging.Abstractions;
|
||||
using TakeoutSaaS.Domain.Billings.Entities;
|
||||
using TakeoutSaaS.Domain.Billings.Enums;
|
||||
using TakeoutSaaS.Domain.Identity.Entities;
|
||||
@@ -11,6 +12,7 @@ using TakeoutSaaS.Domain.Identity.Enums;
|
||||
using TakeoutSaaS.Domain.Identity.Repositories;
|
||||
using TakeoutSaaS.Domain.Tenants.Entities;
|
||||
using TakeoutSaaS.Domain.Tenants.Enums;
|
||||
using TakeoutSaaS.Domain.Tenants.Events;
|
||||
using TakeoutSaaS.Domain.Tenants.Repositories;
|
||||
using TakeoutSaaS.Shared.Abstractions.Constants;
|
||||
using TakeoutSaaS.Shared.Abstractions.Exceptions;
|
||||
@@ -38,6 +40,7 @@ public sealed class CreateTenantManuallyCommandHandler(
|
||||
ICurrentUserAccessor currentUserAccessor,
|
||||
IIdGenerator idGenerator,
|
||||
IMediator mediator,
|
||||
IEventPublisher eventPublisher,
|
||||
ILogger<CreateTenantManuallyCommandHandler> logger)
|
||||
: IRequestHandler<CreateTenantManuallyCommand, TenantDetailDto>
|
||||
{
|
||||
@@ -224,6 +227,34 @@ public sealed class CreateTenantManuallyCommandHandler(
|
||||
// 19. 【Saga 步骤 2】在 App 库创建租户、订阅、认证资料、配额使用记录、账单、支付记录(使用事务)
|
||||
await tenantRepository.CreateTenantWithRelatedDataAsync(tenant, subscription, verification, quotaUsages, billing, payment, cancellationToken);
|
||||
logger.LogInformation("租户 {TenantId} 及相关数据创建成功,跳过审核:{IsSkipApproval}", tenantId, request.IsSkipApproval);
|
||||
|
||||
// 20. 发布租户创建完成事件(用于自动创建商户和证照)
|
||||
var tenantCreatedEvent = new TenantCreatedEvent
|
||||
{
|
||||
TenantId = tenantId,
|
||||
Code = code,
|
||||
Name = name,
|
||||
ShortName = request.ShortName?.Trim(),
|
||||
LegalEntityName = request.LegalEntityName?.Trim(),
|
||||
LogoUrl = request.LogoUrl?.Trim(),
|
||||
Province = request.Province?.Trim(),
|
||||
City = request.City?.Trim(),
|
||||
Address = request.Address?.Trim(),
|
||||
ContactName = request.ContactName?.Trim(),
|
||||
ContactPhone = request.ContactPhone?.Trim(),
|
||||
ContactEmail = request.ContactEmail?.Trim(),
|
||||
BusinessLicenseNumber = request.BusinessLicenseNumber?.Trim(),
|
||||
BusinessLicenseUrl = request.BusinessLicenseUrl?.Trim(),
|
||||
LegalPersonName = request.LegalPersonName?.Trim(),
|
||||
LegalPersonIdNumber = request.LegalPersonIdNumber?.Trim(),
|
||||
LegalPersonIdFrontUrl = request.LegalPersonIdFrontUrl?.Trim(),
|
||||
LegalPersonIdBackUrl = request.LegalPersonIdBackUrl?.Trim(),
|
||||
AdminUserId = adminUser.Id,
|
||||
IsSkipApproval = request.IsSkipApproval,
|
||||
CreatedAt = DateTime.UtcNow
|
||||
};
|
||||
await eventPublisher.PublishAsync("tenant.created", tenantCreatedEvent, cancellationToken);
|
||||
logger.LogInformation("租户 {TenantId} 创建事件已发布", tenantId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user