using MediatR; using TakeoutSaaS.Application.App.Tenants.Commands; using TakeoutSaaS.Application.App.Tenants.Dto; using TakeoutSaaS.Domain.Tenants.Enums; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Exceptions; namespace TakeoutSaaS.Application.App.Tenants.Handlers; /// /// 更新公告处理器。 /// public sealed class UpdateTenantAnnouncementCommandHandler(ITenantAnnouncementRepository announcementRepository) : IRequestHandler { public async Task Handle(UpdateTenantAnnouncementCommand request, CancellationToken cancellationToken) { // 1. 校验输入 if (string.IsNullOrWhiteSpace(request.Title) || string.IsNullOrWhiteSpace(request.Content)) { throw new BusinessException(ErrorCodes.ValidationFailed, "公告标题和内容不能为空"); } if (request.RowVersion == null || request.RowVersion.Length == 0) { throw new BusinessException(ErrorCodes.ValidationFailed, "RowVersion 不能为空"); } // 2. 查询公告 var announcement = await announcementRepository.FindByIdAsync(request.TenantId, request.AnnouncementId, cancellationToken); if (announcement == null) { return null; } if (announcement.Status != AnnouncementStatus.Draft) { if (announcement.Status == AnnouncementStatus.Published) { throw new BusinessException(ErrorCodes.Conflict, "已发布公告不可编辑,要编辑已发布公告,请先撤销"); } throw new BusinessException(ErrorCodes.Conflict, "仅草稿公告允许编辑"); } // 3. 更新字段 announcement.Title = request.Title.Trim(); announcement.Content = request.Content; announcement.TargetType = string.IsNullOrWhiteSpace(request.TargetType) ? announcement.TargetType : request.TargetType.Trim(); announcement.TargetParameters = request.TargetParameters; announcement.IsActive = false; announcement.RowVersion = request.RowVersion; // 4. 持久化 await announcementRepository.UpdateAsync(announcement, cancellationToken); await announcementRepository.SaveChangesAsync(cancellationToken); // 5. 返回 DTO return announcement.ToDto(false, null); } }