Files
TakeoutSaaS.TenantApi/src/Application/TakeoutSaaS.Application/App/Stores/Handlers/UpdateStoreQualificationCommandHandler.cs
2026-02-17 12:12:01 +08:00

80 lines
2.8 KiB
C#

using MediatR;
using Microsoft.Extensions.Logging;
using TakeoutSaaS.Application.App.Stores.Commands;
using TakeoutSaaS.Application.App.Stores.Dto;
using TakeoutSaaS.Domain.Stores.Enums;
using TakeoutSaaS.Domain.Stores.Repositories;
using TakeoutSaaS.Shared.Abstractions.Constants;
using TakeoutSaaS.Shared.Abstractions.Exceptions;
using TakeoutSaaS.Shared.Abstractions.Tenancy;
namespace TakeoutSaaS.Application.App.Stores.Handlers;
/// <summary>
/// 更新门店资质处理器。
/// </summary>
public sealed class UpdateStoreQualificationCommandHandler(
IStoreRepository storeRepository,
ITenantProvider tenantProvider,
ILogger<UpdateStoreQualificationCommandHandler> logger)
: IRequestHandler<UpdateStoreQualificationCommand, StoreQualificationDto?>
{
/// <inheritdoc />
public async Task<StoreQualificationDto?> Handle(UpdateStoreQualificationCommand request, CancellationToken cancellationToken)
{
// 1. 校验门店存在
var tenantId = tenantProvider.GetCurrentTenantId();
var store = await storeRepository.FindByIdAsync(request.StoreId, tenantId, cancellationToken);
if (store is null)
{
throw new BusinessException(ErrorCodes.NotFound, "门店不存在");
}
// 2. (空行后) 审核中门店禁止修改资质
if (store.AuditStatus == StoreAuditStatus.Pending)
{
throw new BusinessException(ErrorCodes.Conflict, "门店审核中,无法修改资质");
}
// 3. (空行后) 校验资质记录
var qualification = await storeRepository.FindQualificationByIdAsync(request.QualificationId, tenantId, cancellationToken);
if (qualification is null || qualification.StoreId != request.StoreId)
{
return null;
}
// 4. (空行后) 更新字段
if (!string.IsNullOrWhiteSpace(request.FileUrl))
{
qualification.FileUrl = request.FileUrl.Trim();
}
if (request.DocumentNumber is not null)
{
qualification.DocumentNumber = request.DocumentNumber.Trim();
}
if (request.IssuedAt.HasValue)
{
qualification.IssuedAt = request.IssuedAt;
}
if (request.ExpiresAt.HasValue)
{
qualification.ExpiresAt = request.ExpiresAt;
}
if (request.SortOrder.HasValue)
{
qualification.SortOrder = request.SortOrder.Value;
}
// 5. (空行后) 保存变更并返回结果
await storeRepository.UpdateQualificationAsync(qualification, cancellationToken);
await storeRepository.SaveChangesAsync(cancellationToken);
logger.LogInformation("更新门店资质 {QualificationId} 对应门店 {StoreId}", qualification.Id, request.StoreId);
return StoreMapping.ToDto(qualification);
}
}