From 2bf33e753f476bf536527cd0dade5acc9112cf6e Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Fri, 6 Feb 2026 14:38:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=85=A5=E9=A9=BB=E6=9C=AA=E7=BB=91=E5=AE=9A=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E5=95=86=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Consumers/TenantCreatedEventConsumer.cs | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Consumers/TenantCreatedEventConsumer.cs b/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Consumers/TenantCreatedEventConsumer.cs index d17b146..b46847a 100644 --- a/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Consumers/TenantCreatedEventConsumer.cs +++ b/src/Infrastructure/TakeoutSaaS.Infrastructure/App/Consumers/TenantCreatedEventConsumer.cs @@ -1,6 +1,8 @@ using MassTransit; using Microsoft.Extensions.Logging; using TakeoutSaaS.Domain.Common.Enums; +using TakeoutSaaS.Domain.Identity.Enums; +using TakeoutSaaS.Domain.Identity.Repositories; using TakeoutSaaS.Domain.Merchants.Entities; using TakeoutSaaS.Domain.Merchants.Enums; using TakeoutSaaS.Domain.Merchants.Repositories; @@ -18,6 +20,7 @@ namespace TakeoutSaaS.Infrastructure.App.Consumers; /// public sealed class TenantCreatedEventConsumer( IMerchantRepository merchantRepository, + IIdentityUserRepository identityUserRepository, IIdGenerator idGenerator, ILogger logger) : IConsumer { @@ -32,10 +35,13 @@ public sealed class TenantCreatedEventConsumer( if (existingMerchant is not null) { logger.LogInformation("租户 {TenantId} 的商户已存在(商户 ID:{MerchantId}),跳过创建", tenantId, existingMerchant.Id); + + // 2. 已存在商户时,仍然确保管理员账号已绑定商户 + await BindAdminUserMerchantAsync(message.AdminUserId, tenantId, existingMerchant.Id, context.CancellationToken); return; } - // 2. 创建商户实体 + // 3. 创建商户实体 var merchantId = idGenerator.NextId(); var merchantStatus = message.IsSkipApproval ? MerchantStatus.Approved : MerchantStatus.Pending; var documentStatus = message.IsSkipApproval ? MerchantDocumentStatus.Approved : MerchantDocumentStatus.Pending; @@ -65,7 +71,7 @@ public sealed class TenantCreatedEventConsumer( await merchantRepository.AddMerchantAsync(merchant, context.CancellationToken); logger.LogInformation("租户 {TenantId} 的商户 {MerchantId} 创建成功", tenantId, merchantId); - // 3. 创建证照记录(营业执照) + // 4. 创建证照记录(营业执照) if (!string.IsNullOrWhiteSpace(message.BusinessLicenseUrl)) { var businessLicenseDoc = new MerchantDocument @@ -83,7 +89,7 @@ public sealed class TenantCreatedEventConsumer( logger.LogInformation("商户 {MerchantId} 营业执照证照记录创建成功", merchantId); } - // 4. 创建证照记录(法人身份证正面) + // 5. 创建证照记录(法人身份证正面) if (!string.IsNullOrWhiteSpace(message.LegalPersonIdFrontUrl)) { var idFrontDoc = new MerchantDocument @@ -102,7 +108,7 @@ public sealed class TenantCreatedEventConsumer( logger.LogInformation("商户 {MerchantId} 法人身份证正面证照记录创建成功", merchantId); } - // 5. 创建证照记录(法人身份证背面) + // 6. 创建证照记录(法人身份证背面) if (!string.IsNullOrWhiteSpace(message.LegalPersonIdBackUrl)) { var idBackDoc = new MerchantDocument @@ -119,8 +125,53 @@ public sealed class TenantCreatedEventConsumer( logger.LogInformation("商户 {MerchantId} 法人身份证背面证照记录创建成功", merchantId); } - // 6. 持久化所有变更 + // 7. 持久化所有变更 await merchantRepository.SaveChangesAsync(context.CancellationToken); 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); } }