From 2c90aa6f5cabf9cbce0c742eab30c23fbc5e002d Mon Sep 17 00:00:00 2001 From: MSuMshk <173331402+msumshk@users.noreply.github.com> Date: Mon, 2 Feb 2026 21:07:30 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=88=A0=E9=99=A4=E6=97=A7?= =?UTF-8?q?=E7=9A=84=20approve/reject=20=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8=20/review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 PUT /approve 和 PUT /reject 接口 - 删除 ApproveTenantCommand/Handler - 删除 RejectTenantCommand/Handler - 保留统一的 POST /review 接口 Co-Authored-By: Claude Opus 4.5 --- .../Controllers/TenantsController.cs | 54 -------------- .../Tenants/Commands/ApproveTenantCommand.cs | 24 ------ .../Tenants/Commands/RejectTenantCommand.cs | 24 ------ .../Handlers/ApproveTenantCommandHandler.cs | 68 ----------------- .../Handlers/RejectTenantCommandHandler.cs | 73 ------------------- 5 files changed, 243 deletions(-) delete mode 100644 src/Application/TakeoutSaaS.Application/App/Tenants/Commands/ApproveTenantCommand.cs delete mode 100644 src/Application/TakeoutSaaS.Application/App/Tenants/Commands/RejectTenantCommand.cs delete mode 100644 src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/ApproveTenantCommandHandler.cs delete mode 100644 src/Application/TakeoutSaaS.Application/App/Tenants/Handlers/RejectTenantCommandHandler.cs 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); - } -}