using System.Linq; using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Deliveries.Entities; using TakeoutSaaS.Domain.Deliveries.Enums; using TakeoutSaaS.Domain.Deliveries.Repositories; using TakeoutSaaS.Infrastructure.App.Persistence; namespace TakeoutSaaS.Infrastructure.App.Repositories; /// /// 配送聚合的 EF Core 仓储实现。 /// /// /// 初始化仓储。 /// public sealed class EfDeliveryRepository(TakeoutAppDbContext context) : IDeliveryRepository { /// public Task FindByIdAsync(long deliveryOrderId, long tenantId, CancellationToken cancellationToken = default) { return context.DeliveryOrders .AsNoTracking() .Where(x => x.TenantId == tenantId && x.Id == deliveryOrderId) .FirstOrDefaultAsync(cancellationToken); } /// public Task FindByOrderIdAsync(long orderId, long tenantId, CancellationToken cancellationToken = default) { return context.DeliveryOrders .AsNoTracking() .Where(x => x.TenantId == tenantId && x.OrderId == orderId) .FirstOrDefaultAsync(cancellationToken); } /// public async Task> GetEventsAsync(long deliveryOrderId, long tenantId, CancellationToken cancellationToken = default) { var events = await context.DeliveryEvents .AsNoTracking() .Where(x => x.TenantId == tenantId && x.DeliveryOrderId == deliveryOrderId) .OrderBy(x => x.CreatedAt) .ToListAsync(cancellationToken); return events; } /// public Task AddDeliveryOrderAsync(DeliveryOrder deliveryOrder, CancellationToken cancellationToken = default) { return context.DeliveryOrders.AddAsync(deliveryOrder, cancellationToken).AsTask(); } /// public Task AddEventAsync(DeliveryEvent deliveryEvent, CancellationToken cancellationToken = default) { return context.DeliveryEvents.AddAsync(deliveryEvent, cancellationToken).AsTask(); } /// public Task SaveChangesAsync(CancellationToken cancellationToken = default) { return context.SaveChangesAsync(cancellationToken); } /// public async Task> SearchAsync(long tenantId, DeliveryStatus? status, long? orderId, CancellationToken cancellationToken = default) { var query = context.DeliveryOrders .AsNoTracking() .Where(x => x.TenantId == tenantId); if (status.HasValue) { query = query.Where(x => x.Status == status.Value); } if (orderId.HasValue) { query = query.Where(x => x.OrderId == orderId.Value); } return await query .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } /// public Task UpdateDeliveryOrderAsync(DeliveryOrder deliveryOrder, CancellationToken cancellationToken = default) { context.DeliveryOrders.Update(deliveryOrder); return Task.CompletedTask; } /// public async Task DeleteDeliveryOrderAsync(long deliveryOrderId, long tenantId, CancellationToken cancellationToken = default) { var events = await context.DeliveryEvents .Where(x => x.TenantId == tenantId && x.DeliveryOrderId == deliveryOrderId) .ToListAsync(cancellationToken); if (events.Count > 0) { context.DeliveryEvents.RemoveRange(events); } var existing = await context.DeliveryOrders .Where(x => x.TenantId == tenantId && x.Id == deliveryOrderId) .FirstOrDefaultAsync(cancellationToken); if (existing == null) { return; } context.DeliveryOrders.Remove(existing); } }