fix: 修复手动入驻未绑定管理员商户问题
All checks were successful
Build and Deploy AdminApi / build-and-deploy (push) Successful in 39s
All checks were successful
Build and Deploy AdminApi / build-and-deploy (push) Successful in 39s
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user