78 lines
3.5 KiB
C#
78 lines
3.5 KiB
C#
using Distribution.Data;
|
|
using Distribution.Models;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Distribution.Features.LoadingEvent;
|
|
|
|
public class LoadingSheetRepository(AppDBContext context) : ILoadingSheetRepository
|
|
{
|
|
public async Task<LoadingSheet?> 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.Items).ThenInclude(i => i.ShopPOItem).ThenInclude(p => p!.ShopPO).ThenInclude(p => p.Store)
|
|
.Include(s => s.Orders)
|
|
.FirstOrDefaultAsync(s => s.Id == id);
|
|
|
|
public async Task<LoadingSheet?> GetActiveByRideIdAsync(Guid rideId) =>
|
|
await context.LoadingSheets
|
|
.FirstOrDefaultAsync(s => s.FK_RideId == rideId && s.Status == LoadingSheetStatus.Planned);
|
|
|
|
public async Task<List<LoadingSheet>> 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.Items).ThenInclude(i => i.ShopPOItem).ThenInclude(p => p!.ShopPO).ThenInclude(p => p.Store)
|
|
.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<int> 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<LoadingSheetItem> items) =>
|
|
context.LoadingSheetItems.RemoveRange(items);
|
|
|
|
public async Task AddItemsAsync(IEnumerable<LoadingSheetItem> items) =>
|
|
await context.LoadingSheetItems.AddRangeAsync(items);
|
|
|
|
public async Task<List<Guid>> GetShopPOIdsByItemIdsAsync(IEnumerable<Guid> shopPOItemIds) =>
|
|
await context.ShopPOItems
|
|
.Where(i => shopPOItemIds.Contains(i.Id))
|
|
.Select(i => i.FK_ShopPOId)
|
|
.Distinct()
|
|
.ToListAsync();
|
|
|
|
public async Task ReplaceOrdersAsync(Guid loadingSheetId, List<Guid> 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
|
|
}));
|
|
}
|
|
}
|