using Distribution.Data; using Distribution.Models; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.LoadingEvent; public class LoadingSheetRepository(AppDBContext context) : ILoadingSheetRepository { public async Task GetByIdAsync(Guid id) => await context.LoadingSheets .Include(s => s.Items).ThenInclude(i => i.Item) .Include(s => s.Items).ThenInclude(i => i.Warehouse) .Include(s => s.Orders) .FirstOrDefaultAsync(s => s.Id == id); public async Task GetActiveByRideIdAsync(Guid rideId) => await context.LoadingSheets .FirstOrDefaultAsync(s => s.FK_RideId == rideId && s.Status == LoadingSheetStatus.Planned); public async Task> GetAllAsync(Guid? rideId, LoadingSheetStatus? status, Guid? routeId, Guid? regionId, int page, int pageSize) => await context.LoadingSheets .Include(s => s.Items).ThenInclude(i => i.Item) .Include(s => s.Items).ThenInclude(i => i.Warehouse) .Include(s => s.Orders) .Where(s => (rideId == null || s.FK_RideId == rideId) && (status == null || s.Status == status) && (routeId == null || s.Orders.Any(o => o.ShopPO.Store.FK_RouteId == routeId)) && (regionId == null || s.Orders.Any(o => o.ShopPO.Store.Route.FK_RegionId == regionId))) .OrderByDescending(s => s.CreatedAt) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); public async Task GetCountAsync(Guid? rideId, LoadingSheetStatus? status, Guid? routeId, Guid? regionId) => await context.LoadingSheets .CountAsync(s => (rideId == null || s.FK_RideId == rideId) && (status == null || s.Status == status) && (routeId == null || s.Orders.Any(o => o.ShopPO.Store.FK_RouteId == routeId)) && (regionId == null || s.Orders.Any(o => o.ShopPO.Store.Route.FK_RegionId == regionId))); public async Task AddAsync(LoadingSheet sheet) => await context.LoadingSheets.AddAsync(sheet); public void Update(LoadingSheet sheet) => context.LoadingSheets.Update(sheet); public void RemoveItems(IEnumerable items) => context.LoadingSheetItems.RemoveRange(items); public async Task AddItemsAsync(IEnumerable items) => await context.LoadingSheetItems.AddRangeAsync(items); public async Task> GetShopPOIdsByItemIdsAsync(IEnumerable shopPOItemIds) => await context.ShopPOItems .Where(i => shopPOItemIds.Contains(i.Id)) .Select(i => i.FK_ShopPOId) .Distinct() .ToListAsync(); public async Task ReplaceOrdersAsync(Guid loadingSheetId, List shopPOIds) { var current = await context.LoadingSheetOrders .Where(o => o.FK_LoadingSheetId == loadingSheetId) .ToListAsync(); context.LoadingSheetOrders.RemoveRange(current); await context.LoadingSheetOrders.AddRangeAsync(shopPOIds.Select(shopPOId => new LoadingSheetOrder { FK_LoadingSheetId = loadingSheetId, FK_ShopPOId = shopPOId })); } }