diff --git a/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Repositories/EfMenuRepository.cs b/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Repositories/EfMenuRepository.cs index 97167ef..fcacf21 100644 --- a/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Repositories/EfMenuRepository.cs +++ b/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Repositories/EfMenuRepository.cs @@ -10,30 +10,52 @@ namespace TakeoutSaaS.Infrastructure.Identity.Repositories; /// public sealed class EfMenuRepository(IdentityDbContext dbContext) : IMenuRepository { - private const long PlatformRootTenantId = 1000000000001; - /// - public Task> GetByTenantAsync(long tenantId, CancellationToken cancellationToken = default) + public async Task> GetByTenantAsync(long tenantId, CancellationToken cancellationToken = default) { - return dbContext.MenuDefinitions + // 1. 优先返回租户自定义菜单 + var tenantMenus = await dbContext.MenuDefinitions .AsNoTracking() - .IgnoreQueryFilters() - .Where(x => x.TenantId == PlatformRootTenantId && x.DeletedAt == null) + .Where(x => x.TenantId == tenantId) .OrderBy(x => x.ParentId) .ThenBy(x => x.SortOrder) - .ToListAsync(cancellationToken) - .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); + .ToListAsync(cancellationToken); + if (tenantMenus.Count > 0) + { + return tenantMenus; + } + + // 2. (空行后) 回退系统默认菜单(TenantId=0) + var systemMenus = await dbContext.MenuDefinitions + .AsNoTracking() + .IgnoreQueryFilters() + .Where(x => x.TenantId == 0 && x.DeletedAt == null) + .OrderBy(x => x.ParentId) + .ThenBy(x => x.SortOrder) + .ToListAsync(cancellationToken); + + return systemMenus; } /// - public Task FindByIdAsync(long id, long tenantId, CancellationToken cancellationToken = default) + public async Task FindByIdAsync(long id, long tenantId, CancellationToken cancellationToken = default) { - return dbContext.MenuDefinitions + // 1. 优先查租户菜单 + var tenantMenu = await dbContext.MenuDefinitions + .AsNoTracking() + .FirstOrDefaultAsync( + x => x.Id == id && x.TenantId == tenantId, + cancellationToken); + if (tenantMenu != null) + { + return tenantMenu; + } + + // 2. (空行后) 回退查系统默认菜单(TenantId=0) + return await dbContext.MenuDefinitions .AsNoTracking() .IgnoreQueryFilters() - .FirstOrDefaultAsync( - x => x.Id == id && x.TenantId == PlatformRootTenantId && x.DeletedAt == null, - cancellationToken); + .FirstOrDefaultAsync(x => x.Id == id && x.TenantId == 0 && x.DeletedAt == null, cancellationToken); } ///