using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Payments.Entities; using TakeoutSaaS.Domain.Payments.Enums; using TakeoutSaaS.Domain.Payments.Repositories; using TakeoutSaaS.Infrastructure.App.Persistence; namespace TakeoutSaaS.Infrastructure.App.Repositories; /// /// 支付记录的 EF Core 仓储实现。 /// /// /// 初始化仓储。 /// public sealed class EfPaymentRepository(TakeoutAdminDbContext context) : IPaymentRepository { /// public Task FindByIdAsync(long paymentId, long tenantId, CancellationToken cancellationToken = default) { return context.PaymentRecords .AsNoTracking() .Where(x => x.TenantId == tenantId && x.Id == paymentId) .FirstOrDefaultAsync(cancellationToken); } /// public Task FindByIdAsync(long paymentId, CancellationToken cancellationToken = default) { // 1. 按主键查询(跨租户) return context.PaymentRecords .AsNoTracking() .Where(x => x.Id == paymentId) .FirstOrDefaultAsync(cancellationToken); } /// public Task FindByOrderIdAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { return context.PaymentRecords .AsNoTracking() .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .FirstOrDefaultAsync(cancellationToken); } /// public async Task> GetRefundsAsync(long paymentId, long tenantId, CancellationToken cancellationToken = default) { var refunds = await context.PaymentRefundRecords .AsNoTracking() .Where(x => x.TenantId == tenantId && x.PaymentRecordId == paymentId) .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); return refunds; } /// public Task AddPaymentAsync(PaymentRecord payment, CancellationToken cancellationToken = default) { return context.PaymentRecords.AddAsync(payment, cancellationToken).AsTask(); } /// public Task AddRefundAsync(PaymentRefundRecord refund, CancellationToken cancellationToken = default) { return context.PaymentRefundRecords.AddAsync(refund, cancellationToken).AsTask(); } /// public async Task> SearchAsync(long tenantId, PaymentStatus? status, CancellationToken cancellationToken = default) { var query = context.PaymentRecords .AsNoTracking() .Where(x => x.TenantId == tenantId); if (status.HasValue) { query = query.Where(x => x.Status == status.Value); } return await query .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } /// public async Task> SearchAsync(long? tenantId, PaymentStatus? status, CancellationToken cancellationToken = default) { // 1. 构建查询(可选租户过滤) var query = context.PaymentRecords.AsNoTracking(); if (tenantId.HasValue) { query = query.Where(x => x.TenantId == tenantId.Value); } // 2. (空行后) 可选过滤:支付状态 if (status.HasValue) { query = query.Where(x => x.Status == status.Value); } // 3. (空行后) 排序并返回 return await query .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } /// public Task SaveChangesAsync(CancellationToken cancellationToken = default) { return context.SaveChangesAsync(cancellationToken); } /// public Task UpdatePaymentAsync(PaymentRecord payment, CancellationToken cancellationToken = default) { context.PaymentRecords.Update(payment); return Task.CompletedTask; } /// public async Task DeletePaymentAsync(long paymentId, long tenantId, CancellationToken cancellationToken = default) { var refunds = await context.PaymentRefundRecords .Where(x => x.TenantId == tenantId && x.PaymentRecordId == paymentId) .ToListAsync(cancellationToken); if (refunds.Count > 0) { context.PaymentRefundRecords.RemoveRange(refunds); } var existing = await context.PaymentRecords .Where(x => x.TenantId == tenantId && x.Id == paymentId) .FirstOrDefaultAsync(cancellationToken); if (existing == null) { return; } context.PaymentRecords.Remove(existing); } }