using MediatR; using TakeoutSaaS.Application.App.Tenants.Commands; using TakeoutSaaS.Application.App.Tenants.Dto; using TakeoutSaaS.Domain.Tenants.Entities; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Exceptions; namespace TakeoutSaaS.Application.App.Tenants.Handlers; /// /// 创建租户账单处理器。 /// public sealed class CreateTenantBillingCommandHandler(ITenantBillingRepository billingRepository) : IRequestHandler { public async Task Handle(CreateTenantBillingCommand request, CancellationToken cancellationToken) { // 1. 校验账单编号 if (string.IsNullOrWhiteSpace(request.StatementNo)) { throw new BusinessException(ErrorCodes.BadRequest, "账单编号不能为空"); } // 2. 构建账单实体 var bill = new TenantBillingStatement { TenantId = request.TenantId, StatementNo = request.StatementNo.Trim(), PeriodStart = request.PeriodStart, PeriodEnd = request.PeriodEnd, AmountDue = request.AmountDue, AmountPaid = request.AmountPaid, Status = request.Status, DueDate = request.DueDate, LineItemsJson = request.LineItemsJson }; // 3. 持久化账单 await billingRepository.AddAsync(bill, cancellationToken); await billingRepository.SaveChangesAsync(cancellationToken); // 4. 返回 DTO return bill.ToDto(); } }