using System.Linq;
using Microsoft.EntityFrameworkCore;
using TakeoutSaaS.Domain.Stores.Entities;
using TakeoutSaaS.Domain.Stores.Enums;
using TakeoutSaaS.Domain.Stores.Repositories;
using TakeoutSaaS.Infrastructure.App.Persistence;
namespace TakeoutSaaS.Infrastructure.App.Repositories;
///
/// 门店聚合的 EF Core 仓储实现。
///
///
/// 初始化仓储。
///
public sealed class EfStoreRepository(TakeoutAppDbContext context) : IStoreRepository
{
///
public Task FindByIdAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
return context.Stores
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == storeId)
.FirstOrDefaultAsync(cancellationToken);
}
///
public async Task> SearchAsync(long tenantId, StoreStatus? status, CancellationToken cancellationToken = default)
{
var query = context.Stores
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
if (status.HasValue)
{
query = query.Where(x => x.Status == status.Value);
}
var stores = await query
.OrderBy(x => x.Name)
.ToListAsync(cancellationToken);
return stores;
}
///
public async Task> GetBusinessHoursAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var hours = await context.StoreBusinessHours
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.DayOfWeek)
.ThenBy(x => x.StartTime)
.ToListAsync(cancellationToken);
return hours;
}
///
public async Task> GetDeliveryZonesAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var zones = await context.StoreDeliveryZones
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.SortOrder)
.ToListAsync(cancellationToken);
return zones;
}
///
public async Task> GetHolidaysAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var holidays = await context.StoreHolidays
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.Date)
.ToListAsync(cancellationToken);
return holidays;
}
///
public async Task> GetTableAreasAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var areas = await context.StoreTableAreas
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.SortOrder)
.ToListAsync(cancellationToken);
return areas;
}
///
public async Task> GetTablesAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var tables = await context.StoreTables
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.TableCode)
.ToListAsync(cancellationToken);
return tables;
}
///
public async Task> GetShiftsAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var shifts = await context.StoreEmployeeShifts
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.ShiftDate)
.ThenBy(x => x.StartTime)
.ToListAsync(cancellationToken);
return shifts;
}
///
public Task AddStoreAsync(Store store, CancellationToken cancellationToken = default)
{
return context.Stores.AddAsync(store, cancellationToken).AsTask();
}
///
public Task AddBusinessHoursAsync(IEnumerable hours, CancellationToken cancellationToken = default)
{
return context.StoreBusinessHours.AddRangeAsync(hours, cancellationToken);
}
///
public Task AddDeliveryZonesAsync(IEnumerable zones, CancellationToken cancellationToken = default)
{
return context.StoreDeliveryZones.AddRangeAsync(zones, cancellationToken);
}
///
public Task AddHolidaysAsync(IEnumerable holidays, CancellationToken cancellationToken = default)
{
return context.StoreHolidays.AddRangeAsync(holidays, cancellationToken);
}
///
public Task AddTableAreasAsync(IEnumerable areas, CancellationToken cancellationToken = default)
{
return context.StoreTableAreas.AddRangeAsync(areas, cancellationToken);
}
///
public Task AddTablesAsync(IEnumerable tables, CancellationToken cancellationToken = default)
{
return context.StoreTables.AddRangeAsync(tables, cancellationToken);
}
///
public Task AddShiftsAsync(IEnumerable shifts, CancellationToken cancellationToken = default)
{
return context.StoreEmployeeShifts.AddRangeAsync(shifts, cancellationToken);
}
///
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return context.SaveChangesAsync(cancellationToken);
}
///
public Task UpdateStoreAsync(Store store, CancellationToken cancellationToken = default)
{
context.Stores.Update(store);
return Task.CompletedTask;
}
///
public async Task DeleteStoreAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var existing = await context.Stores
.Where(x => x.TenantId == tenantId && x.Id == storeId)
.FirstOrDefaultAsync(cancellationToken);
if (existing == null)
{
return;
}
context.Stores.Remove(existing);
}
}