App:新增 operation_logs/quota_packages/tenant_payments/tenant_quota_package_purchases 表 Identity:修正 Avatar 字段类型(varchar(256)->text),保持现有数据不变
51 lines
1.7 KiB
C#
51 lines
1.7 KiB
C#
using MediatR;
|
|
using TakeoutSaaS.Application.App.Billings.Commands;
|
|
using TakeoutSaaS.Application.App.Billings.Dto;
|
|
using TakeoutSaaS.Domain.Tenants.Repositories;
|
|
using TakeoutSaaS.Shared.Abstractions.Constants;
|
|
using TakeoutSaaS.Shared.Abstractions.Exceptions;
|
|
|
|
namespace TakeoutSaaS.Application.App.Billings.Handlers;
|
|
|
|
/// <summary>
|
|
/// 更新账单状态处理器。
|
|
/// </summary>
|
|
public sealed class UpdateBillStatusCommandHandler(
|
|
ITenantBillingRepository billingRepository,
|
|
ITenantRepository tenantRepository)
|
|
: IRequestHandler<UpdateBillStatusCommand, BillDto?>
|
|
{
|
|
/// <summary>
|
|
/// 处理更新账单状态请求。
|
|
/// </summary>
|
|
/// <param name="request">更新命令。</param>
|
|
/// <param name="cancellationToken">取消标记。</param>
|
|
/// <returns>账单 DTO 或 null。</returns>
|
|
public async Task<BillDto?> Handle(UpdateBillStatusCommand request, CancellationToken cancellationToken)
|
|
{
|
|
// 1. 查询账单
|
|
var bill = await billingRepository.FindByIdAsync(request.BillId, cancellationToken);
|
|
if (bill is null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
// 2. 更新状态
|
|
bill.Status = request.Status;
|
|
if (!string.IsNullOrWhiteSpace(request.Notes))
|
|
{
|
|
bill.LineItemsJson = request.Notes;
|
|
}
|
|
|
|
// 3. 持久化变更
|
|
await billingRepository.UpdateAsync(bill, cancellationToken);
|
|
await billingRepository.SaveChangesAsync(cancellationToken);
|
|
|
|
// 4. 查询租户名称
|
|
var tenant = await tenantRepository.FindByIdAsync(bill.TenantId, cancellationToken);
|
|
|
|
// 5. 返回 DTO
|
|
return bill.ToDto(tenant?.Name);
|
|
}
|
|
}
|