diff --git a/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs b/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs index 64576b6..3ab1c0a 100644 --- a/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs +++ b/src/Api/TakeoutSaaS.AdminApi/Controllers/TenantsController.cs @@ -212,60 +212,6 @@ public sealed class TenantsController(IMediator mediator) : BaseApiController return ApiResponse>.Ok(result); } - /// - /// 审核通过租户。 - /// - /// 租户 ID(雪花算法)。 - /// 审核通过命令。 - /// 取消标记。 - /// 无内容。 - [HttpPut("{id:long}/approve")] - [PermissionAuthorize("tenant:review")] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status400BadRequest)] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] - public async Task> Approve( - long id, - [FromBody] ApproveTenantCommand command, - CancellationToken cancellationToken = default) - { - // 1. 确保路径参数与请求体一致 - var updatedCommand = command with { TenantId = id.ToString() }; - - // 2. 执行命令 - await mediator.Send(updatedCommand, cancellationToken); - - // 3. 返回成功 - return ApiResponse.Ok(null, "审核通过"); - } - - /// - /// 审核驳回租户。 - /// - /// 租户 ID(雪花算法)。 - /// 审核驳回命令。 - /// 取消标记。 - /// 无内容。 - [HttpPut("{id:long}/reject")] - [PermissionAuthorize("tenant:review")] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status400BadRequest)] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] - public async Task> Reject( - long id, - [FromBody] RejectTenantCommand command, - CancellationToken cancellationToken = default) - { - // 1. 确保路径参数与请求体一致 - var updatedCommand = command with { TenantId = id.ToString() }; - - // 2. 执行命令 - await mediator.Send(updatedCommand, cancellationToken); - - // 3. 返回成功 - return ApiResponse.Ok(null, "审核驳回"); - } - /// /// 审核租户(统一接口,支持通过/驳回)。 /// diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Commands/ApproveTenantCommand.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Commands/ApproveTenantCommand.cs deleted file mode 100644 index 3d41d4d..0000000 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Commands/ApproveTenantCommand.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MediatR; - -namespace TakeoutSaaS.Application.App.Tenants.Commands; - -/// -/// 审核通过租户命令。 -/// -public sealed record ApproveTenantCommand : IRequest -{ - /// - /// 租户 ID(雪花算法,字符串传输)。 - /// - public required string TenantId { get; init; } - - /// - /// 审核人姓名(可选,用于显示)。 - /// - public string? ReviewedByName { get; init; } - - /// - /// 审核备注。 - /// - public string? ReviewRemarks { get; init; } -} diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Commands/RejectTenantCommand.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Commands/RejectTenantCommand.cs deleted file mode 100644 index 11c5be7..0000000 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Commands/RejectTenantCommand.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MediatR; - -namespace TakeoutSaaS.Application.App.Tenants.Commands; - -/// -/// 审核驳回租户命令。 -/// -public sealed record RejectTenantCommand : IRequest -{ - /// - /// 租户 ID(雪花算法,字符串传输)。 - /// - public required string TenantId { get; init; } - - /// - /// 审核人姓名(可选,用于显示)。 - /// - public string? ReviewedByName { get; init; } - - /// - /// 驳回原因(必填)。 - /// - public required string RejectReason { get; init; } -} diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ApproveTenantCommandHandler.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ApproveTenantCommandHandler.cs deleted file mode 100644 index b393233..0000000 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ApproveTenantCommandHandler.cs +++ /dev/null @@ -1,68 +0,0 @@ -using MediatR; -using Microsoft.Extensions.Logging; -using TakeoutSaaS.Application.App.Tenants.Commands; -using TakeoutSaaS.Domain.Tenants.Enums; -using TakeoutSaaS.Domain.Tenants.Repositories; -using TakeoutSaaS.Shared.Abstractions.Constants; -using TakeoutSaaS.Shared.Abstractions.Exceptions; -using TakeoutSaaS.Shared.Abstractions.Security; - -namespace TakeoutSaaS.Application.App.Tenants.Handlers; - -/// -/// 审核通过租户命令处理器。 -/// -public sealed class ApproveTenantCommandHandler( - ITenantRepository tenantRepository, - ICurrentUserAccessor currentUserAccessor, - ILogger logger) - : IRequestHandler -{ - /// - public async Task Handle(ApproveTenantCommand request, CancellationToken cancellationToken) - { - // 1. 解析租户 ID - if (!long.TryParse(request.TenantId, out var tenantId) || tenantId <= 0) - { - throw new BusinessException(ErrorCodes.BadRequest, "租户 ID 无效"); - } - - // 2. 获取租户(带跟踪) - var tenant = await tenantRepository.GetByIdForUpdateAsync(tenantId, cancellationToken); - if (tenant is null) - { - throw new BusinessException(ErrorCodes.NotFound, "租户不存在"); - } - - // 3. 校验租户状态(只有待审核状态才能审核通过) - if (tenant.Status != TenantStatus.PendingReview) - { - throw new BusinessException(ErrorCodes.BadRequest, $"租户当前状态为 {tenant.Status},无法审核通过"); - } - - // 4. 获取认证资料(带跟踪) - var verification = await tenantRepository.GetVerificationForUpdateAsync(tenantId, cancellationToken); - if (verification is null) - { - throw new BusinessException(ErrorCodes.NotFound, "租户认证资料不存在"); - } - - // 5. 更新租户状态 - tenant.Status = TenantStatus.Active; - - // 6. 更新认证资料状态 - verification.Status = TenantVerificationStatus.Approved; - verification.ReviewedAt = DateTime.UtcNow; - verification.ReviewedBy = currentUserAccessor.UserId; - verification.ReviewedByName = request.ReviewedByName?.Trim(); - verification.ReviewRemarks = request.ReviewRemarks?.Trim(); - - // 7. 保存变更 - await tenantRepository.SaveChangesAsync(cancellationToken); - - logger.LogInformation( - "租户 {TenantId} 审核通过,审核人:{ReviewedBy}", - tenantId, - currentUserAccessor.UserId); - } -} diff --git a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/RejectTenantCommandHandler.cs b/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/RejectTenantCommandHandler.cs deleted file mode 100644 index 1038d32..0000000 --- a/src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/RejectTenantCommandHandler.cs +++ /dev/null @@ -1,73 +0,0 @@ -using MediatR; -using Microsoft.Extensions.Logging; -using TakeoutSaaS.Application.App.Tenants.Commands; -using TakeoutSaaS.Domain.Tenants.Enums; -using TakeoutSaaS.Domain.Tenants.Repositories; -using TakeoutSaaS.Shared.Abstractions.Constants; -using TakeoutSaaS.Shared.Abstractions.Exceptions; -using TakeoutSaaS.Shared.Abstractions.Security; - -namespace TakeoutSaaS.Application.App.Tenants.Handlers; - -/// -/// 审核驳回租户命令处理器。 -/// -public sealed class RejectTenantCommandHandler( - ITenantRepository tenantRepository, - ICurrentUserAccessor currentUserAccessor, - ILogger logger) - : IRequestHandler -{ - /// - public async Task Handle(RejectTenantCommand request, CancellationToken cancellationToken) - { - // 1. 解析租户 ID - if (!long.TryParse(request.TenantId, out var tenantId) || tenantId <= 0) - { - throw new BusinessException(ErrorCodes.BadRequest, "租户 ID 无效"); - } - - // 2. 校验驳回原因 - var rejectReason = request.RejectReason?.Trim(); - if (string.IsNullOrWhiteSpace(rejectReason)) - { - throw new BusinessException(ErrorCodes.BadRequest, "驳回原因不能为空"); - } - - // 3. 获取租户(带跟踪) - var tenant = await tenantRepository.GetByIdForUpdateAsync(tenantId, cancellationToken); - if (tenant is null) - { - throw new BusinessException(ErrorCodes.NotFound, "租户不存在"); - } - - // 4. 校验租户状态(只有待审核状态才能驳回) - if (tenant.Status != TenantStatus.PendingReview) - { - throw new BusinessException(ErrorCodes.BadRequest, $"租户当前状态为 {tenant.Status},无法驳回"); - } - - // 5. 获取认证资料(带跟踪) - var verification = await tenantRepository.GetVerificationForUpdateAsync(tenantId, cancellationToken); - if (verification is null) - { - throw new BusinessException(ErrorCodes.NotFound, "租户认证资料不存在"); - } - - // 6. 更新认证资料状态(租户状态保持 PendingReview,等待重新提交) - verification.Status = TenantVerificationStatus.Rejected; - verification.ReviewedAt = DateTime.UtcNow; - verification.ReviewedBy = currentUserAccessor.UserId; - verification.ReviewedByName = request.ReviewedByName?.Trim(); - verification.ReviewRemarks = rejectReason; - - // 7. 保存变更 - await tenantRepository.SaveChangesAsync(cancellationToken); - - logger.LogInformation( - "租户 {TenantId} 审核驳回,驳回原因:{RejectReason},审核人:{ReviewedBy}", - tenantId, - rejectReason, - currentUserAccessor.UserId); - } -}