fix: 修复手动入驻未绑定管理员商户问题
All checks were successful
Build and Deploy AdminApi / build-and-deploy (push) Successful in 39s

This commit is contained in:
2026-02-06 14:38:00 +08:00
parent c02a15f1b9
commit 2bf33e753f

View File

@@ -1,6 +1,8 @@
using MassTransit; using MassTransit;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TakeoutSaaS.Domain.Common.Enums; using TakeoutSaaS.Domain.Common.Enums;
using TakeoutSaaS.Domain.Identity.Enums;
using TakeoutSaaS.Domain.Identity.Repositories;
using TakeoutSaaS.Domain.Merchants.Entities; using TakeoutSaaS.Domain.Merchants.Entities;
using TakeoutSaaS.Domain.Merchants.Enums; using TakeoutSaaS.Domain.Merchants.Enums;
using TakeoutSaaS.Domain.Merchants.Repositories; using TakeoutSaaS.Domain.Merchants.Repositories;
@@ -18,6 +20,7 @@ namespace TakeoutSaaS.Infrastructure.App.Consumers;
/// </remarks> /// </remarks>
public sealed class TenantCreatedEventConsumer( public sealed class TenantCreatedEventConsumer(
IMerchantRepository merchantRepository, IMerchantRepository merchantRepository,
IIdentityUserRepository identityUserRepository,
IIdGenerator idGenerator, IIdGenerator idGenerator,
ILogger<TenantCreatedEventConsumer> logger) : IConsumer<TenantCreatedEvent> ILogger<TenantCreatedEventConsumer> logger) : IConsumer<TenantCreatedEvent>
{ {
@@ -32,10 +35,13 @@ public sealed class TenantCreatedEventConsumer(
if (existingMerchant is not null) if (existingMerchant is not null)
{ {
logger.LogInformation("租户 {TenantId} 的商户已存在(商户 ID{MerchantId}),跳过创建", tenantId, existingMerchant.Id); logger.LogInformation("租户 {TenantId} 的商户已存在(商户 ID{MerchantId}),跳过创建", tenantId, existingMerchant.Id);
// 2. 已存在商户时,仍然确保管理员账号已绑定商户
await BindAdminUserMerchantAsync(message.AdminUserId, tenantId, existingMerchant.Id, context.CancellationToken);
return; return;
} }
// 2. 创建商户实体 // 3. 创建商户实体
var merchantId = idGenerator.NextId(); var merchantId = idGenerator.NextId();
var merchantStatus = message.IsSkipApproval ? MerchantStatus.Approved : MerchantStatus.Pending; var merchantStatus = message.IsSkipApproval ? MerchantStatus.Approved : MerchantStatus.Pending;
var documentStatus = message.IsSkipApproval ? MerchantDocumentStatus.Approved : MerchantDocumentStatus.Pending; var documentStatus = message.IsSkipApproval ? MerchantDocumentStatus.Approved : MerchantDocumentStatus.Pending;
@@ -65,7 +71,7 @@ public sealed class TenantCreatedEventConsumer(
await merchantRepository.AddMerchantAsync(merchant, context.CancellationToken); await merchantRepository.AddMerchantAsync(merchant, context.CancellationToken);
logger.LogInformation("租户 {TenantId} 的商户 {MerchantId} 创建成功", tenantId, merchantId); logger.LogInformation("租户 {TenantId} 的商户 {MerchantId} 创建成功", tenantId, merchantId);
// 3. 创建证照记录(营业执照) // 4. 创建证照记录(营业执照)
if (!string.IsNullOrWhiteSpace(message.BusinessLicenseUrl)) if (!string.IsNullOrWhiteSpace(message.BusinessLicenseUrl))
{ {
var businessLicenseDoc = new MerchantDocument var businessLicenseDoc = new MerchantDocument
@@ -83,7 +89,7 @@ public sealed class TenantCreatedEventConsumer(
logger.LogInformation("商户 {MerchantId} 营业执照证照记录创建成功", merchantId); logger.LogInformation("商户 {MerchantId} 营业执照证照记录创建成功", merchantId);
} }
// 4. 创建证照记录(法人身份证正面) // 5. 创建证照记录(法人身份证正面)
if (!string.IsNullOrWhiteSpace(message.LegalPersonIdFrontUrl)) if (!string.IsNullOrWhiteSpace(message.LegalPersonIdFrontUrl))
{ {
var idFrontDoc = new MerchantDocument var idFrontDoc = new MerchantDocument
@@ -102,7 +108,7 @@ public sealed class TenantCreatedEventConsumer(
logger.LogInformation("商户 {MerchantId} 法人身份证正面证照记录创建成功", merchantId); logger.LogInformation("商户 {MerchantId} 法人身份证正面证照记录创建成功", merchantId);
} }
// 5. 创建证照记录(法人身份证背面) // 6. 创建证照记录(法人身份证背面)
if (!string.IsNullOrWhiteSpace(message.LegalPersonIdBackUrl)) if (!string.IsNullOrWhiteSpace(message.LegalPersonIdBackUrl))
{ {
var idBackDoc = new MerchantDocument var idBackDoc = new MerchantDocument
@@ -119,8 +125,53 @@ public sealed class TenantCreatedEventConsumer(
logger.LogInformation("商户 {MerchantId} 法人身份证背面证照记录创建成功", merchantId); logger.LogInformation("商户 {MerchantId} 法人身份证背面证照记录创建成功", merchantId);
} }
// 6. 持久化所有变更 // 7. 持久化所有变更
await merchantRepository.SaveChangesAsync(context.CancellationToken); await merchantRepository.SaveChangesAsync(context.CancellationToken);
logger.LogInformation("租户 {TenantId} 的商户 {MerchantId} 及证照记录全部创建完成", tenantId, merchantId); logger.LogInformation("租户 {TenantId} 的商户 {MerchantId} 及证照记录全部创建完成", tenantId, merchantId);
// 8. 创建商户成功后,绑定管理员账号与商户关系
await BindAdminUserMerchantAsync(message.AdminUserId, tenantId, merchantId, context.CancellationToken);
}
private async Task BindAdminUserMerchantAsync(long adminUserId, long tenantId, long merchantId, CancellationToken cancellationToken)
{
// 1. 忽略无效管理员用户标识
if (adminUserId <= 0)
{
logger.LogWarning("租户 {TenantId} 的管理员用户 ID 无效,跳过商户绑定", tenantId);
return;
}
// 2. 查询管理员用户(可跟踪)
var adminUser = await identityUserRepository.GetForUpdateAsync(adminUserId, cancellationToken);
if (adminUser is null)
{
logger.LogWarning("租户 {TenantId} 的管理员用户 {AdminUserId} 不存在,跳过商户绑定", tenantId, adminUserId);
return;
}
// 3. 校验用户归属
if (adminUser.Portal != PortalType.Tenant || adminUser.TenantId != tenantId)
{
logger.LogWarning(
"管理员用户 {AdminUserId} 归属不匹配,预期租户 {TenantId},实际 Portal={Portal} TenantId={UserTenantId},跳过商户绑定",
adminUserId,
tenantId,
adminUser.Portal,
adminUser.TenantId);
return;
}
// 4. 已绑定相同商户则直接返回
if (adminUser.MerchantId == merchantId)
{
logger.LogInformation("管理员用户 {AdminUserId} 已绑定商户 {MerchantId},无需重复绑定", adminUserId, merchantId);
return;
}
// 5. 更新并保存商户绑定
adminUser.MerchantId = merchantId;
await identityUserRepository.SaveChangesAsync(cancellationToken);
logger.LogInformation("管理员用户 {AdminUserId} 已绑定商户 {MerchantId}", adminUserId, merchantId);
} }
} }