using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Orders.Entities; using TakeoutSaaS.Domain.Orders.Enums; using TakeoutSaaS.Domain.Orders.Repositories; using TakeoutSaaS.Domain.Payments.Enums; using TakeoutSaaS.Infrastructure.App.Persistence; namespace TakeoutSaaS.Infrastructure.App.Repositories; /// /// 订单聚合的 EF Core 仓储实现。 /// /// /// 初始化仓储。 /// public sealed class EfOrderRepository(TakeoutAppDbContext context) : IOrderRepository { /// public Task FindByIdAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { return context.Orders .AsNoTracking() .Where(x => x.TenantId == tenantId && x.Id == orderId) .FirstOrDefaultAsync(cancellationToken); } /// public Task FindByOrderNoAsync(string orderNo, long tenantId, CancellationToken cancellationToken = default) { return context.Orders .AsNoTracking() .Where(x => x.TenantId == tenantId && x.OrderNo == orderNo) .FirstOrDefaultAsync(cancellationToken); } /// public async Task> SearchAsync(long tenantId, OrderStatus? status, PaymentStatus? paymentStatus, CancellationToken cancellationToken = default) { var query = context.Orders .AsNoTracking() .Where(x => x.TenantId == tenantId); if (status.HasValue) { query = query.Where(x => x.Status == status.Value); } if (paymentStatus.HasValue) { query = query.Where(x => x.PaymentStatus == paymentStatus.Value); } var orders = await query .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); return orders; } /// public async Task> GetItemsAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { var items = await context.OrderItems .AsNoTracking() .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .OrderBy(x => x.Id) .ToListAsync(cancellationToken); return items; } /// public async Task> GetStatusHistoryAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { var histories = await context.OrderStatusHistories .AsNoTracking() .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .OrderBy(x => x.CreatedAt) .ToListAsync(cancellationToken); return histories; } /// public async Task> GetRefundsAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { var refunds = await context.RefundRequests .AsNoTracking() .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); return refunds; } /// public Task AddOrderAsync(Order order, CancellationToken cancellationToken = default) { return context.Orders.AddAsync(order, cancellationToken).AsTask(); } /// public Task AddItemsAsync(IEnumerable items, CancellationToken cancellationToken = default) { return context.OrderItems.AddRangeAsync(items, cancellationToken); } /// public Task AddStatusHistoryAsync(OrderStatusHistory history, CancellationToken cancellationToken = default) { return context.OrderStatusHistories.AddAsync(history, cancellationToken).AsTask(); } /// public Task AddRefundAsync(RefundRequest refund, CancellationToken cancellationToken = default) { return context.RefundRequests.AddAsync(refund, cancellationToken).AsTask(); } /// public Task SaveChangesAsync(CancellationToken cancellationToken = default) { return context.SaveChangesAsync(cancellationToken); } /// public Task UpdateOrderAsync(Order order, CancellationToken cancellationToken = default) { context.Orders.Update(order); return Task.CompletedTask; } /// public async Task DeleteOrderAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { var items = await context.OrderItems .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .ToListAsync(cancellationToken); if (items.Count > 0) { context.OrderItems.RemoveRange(items); } var histories = await context.OrderStatusHistories .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .ToListAsync(cancellationToken); if (histories.Count > 0) { context.OrderStatusHistories.RemoveRange(histories); } var refunds = await context.RefundRequests .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .ToListAsync(cancellationToken); if (refunds.Count > 0) { context.RefundRequests.RemoveRange(refunds); } var existing = await context.Orders .Where(x => x.TenantId == tenantId && x.Id == orderId) .FirstOrDefaultAsync(cancellationToken); if (existing == null) { return; } context.Orders.Remove(existing); } }