using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Merchants.Entities; using TakeoutSaaS.Domain.Merchants.Enums; using TakeoutSaaS.Domain.Merchants.Repositories; using TakeoutSaaS.Infrastructure.App.Persistence; namespace TakeoutSaaS.Infrastructure.App.Repositories; /// /// 商户聚合的 EF Core 仓储实现。 /// /// /// 初始化仓储。 /// public sealed class EfMerchantRepository(TakeoutAppDbContext context) : IMerchantRepository { /// public Task FindByIdAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default) { return context.Merchants .AsNoTracking() .Where(x => x.TenantId == tenantId && x.Id == merchantId) .FirstOrDefaultAsync(cancellationToken); } /// public async Task> SearchAsync(long tenantId, MerchantStatus? status, CancellationToken cancellationToken = default) { var query = context.Merchants .AsNoTracking() .Where(x => x.TenantId == tenantId); if (status.HasValue) { query = query.Where(x => x.Status == status.Value); } return await query .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } /// public async Task> GetStaffAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default) { var staffs = await context.MerchantStaff .AsNoTracking() .Where(x => x.TenantId == tenantId && x.MerchantId == merchantId) .OrderBy(x => x.Name) .ToListAsync(cancellationToken); return staffs; } /// public async Task> GetStaffByStoreAsync(long storeId, long tenantId, CancellationToken cancellationToken = default) { var staffs = await context.MerchantStaff .AsNoTracking() .Where(x => x.TenantId == tenantId && x.StoreId == storeId) .OrderBy(x => x.Name) .ToListAsync(cancellationToken); return staffs; } /// public Task FindStaffByIdAsync(long staffId, long tenantId, CancellationToken cancellationToken = default) { return context.MerchantStaff .Where(x => x.TenantId == tenantId && x.Id == staffId) .FirstOrDefaultAsync(cancellationToken); } /// public async Task> GetContractsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default) { var contracts = await context.MerchantContracts .AsNoTracking() .Where(x => x.TenantId == tenantId && x.MerchantId == merchantId) .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); return contracts; } /// public Task FindContractByIdAsync(long merchantId, long tenantId, long contractId, CancellationToken cancellationToken = default) { return context.MerchantContracts .Where(x => x.TenantId == tenantId && x.MerchantId == merchantId && x.Id == contractId) .FirstOrDefaultAsync(cancellationToken); } /// public async Task> GetDocumentsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default) { var documents = await context.MerchantDocuments .AsNoTracking() .Where(x => x.TenantId == tenantId && x.MerchantId == merchantId) .OrderBy(x => x.CreatedAt) .ToListAsync(cancellationToken); return documents; } /// public Task FindDocumentByIdAsync(long merchantId, long tenantId, long documentId, CancellationToken cancellationToken = default) { return context.MerchantDocuments .Where(x => x.TenantId == tenantId && x.MerchantId == merchantId && x.Id == documentId) .FirstOrDefaultAsync(cancellationToken); } /// public Task AddMerchantAsync(Merchant merchant, CancellationToken cancellationToken = default) { return context.Merchants.AddAsync(merchant, cancellationToken).AsTask(); } /// public Task AddStaffAsync(MerchantStaff staff, CancellationToken cancellationToken = default) { return context.MerchantStaff.AddAsync(staff, cancellationToken).AsTask(); } /// public Task AddContractAsync(MerchantContract contract, CancellationToken cancellationToken = default) { return context.MerchantContracts.AddAsync(contract, cancellationToken).AsTask(); } /// public Task UpdateContractAsync(MerchantContract contract, CancellationToken cancellationToken = default) { context.MerchantContracts.Update(contract); return Task.CompletedTask; } /// public Task AddDocumentAsync(MerchantDocument document, CancellationToken cancellationToken = default) { return context.MerchantDocuments.AddAsync(document, cancellationToken).AsTask(); } /// public Task UpdateDocumentAsync(MerchantDocument document, CancellationToken cancellationToken = default) { context.MerchantDocuments.Update(document); return Task.CompletedTask; } /// public Task SaveChangesAsync(CancellationToken cancellationToken = default) { return context.SaveChangesAsync(cancellationToken); } /// public Task UpdateMerchantAsync(Merchant merchant, CancellationToken cancellationToken = default) { context.Merchants.Update(merchant); return Task.CompletedTask; } /// public async Task DeleteMerchantAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default) { var existing = await context.Merchants .Where(x => x.TenantId == tenantId && x.Id == merchantId) .FirstOrDefaultAsync(cancellationToken); if (existing == null) { return; } context.Merchants.Remove(existing); } /// public async Task DeleteStaffAsync(long staffId, long tenantId, CancellationToken cancellationToken = default) { var existing = await context.MerchantStaff .Where(x => x.TenantId == tenantId && x.Id == staffId) .FirstOrDefaultAsync(cancellationToken); if (existing == null) { return; } context.MerchantStaff.Remove(existing); } /// public Task AddAuditLogAsync(MerchantAuditLog log, CancellationToken cancellationToken = default) { return context.MerchantAuditLogs.AddAsync(log, cancellationToken).AsTask(); } /// public async Task> GetAuditLogsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default) { return await context.MerchantAuditLogs .AsNoTracking() .Where(x => x.TenantId == tenantId && x.MerchantId == merchantId) .OrderByDescending(x => x.CreatedAt) .ToListAsync(cancellationToken); } }