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); } }