117 lines
3.9 KiB
C#
117 lines
3.9 KiB
C#
using System.Linq;
|
|
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;
|
|
|
|
/// <summary>
|
|
/// 商户聚合的 EF Core 仓储实现。
|
|
/// </summary>
|
|
public sealed class EfMerchantRepository : IMerchantRepository
|
|
{
|
|
private readonly TakeoutAppDbContext _context;
|
|
|
|
/// <summary>
|
|
/// 初始化仓储。
|
|
/// </summary>
|
|
public EfMerchantRepository(TakeoutAppDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task<Merchant?> FindByIdAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
|
|
{
|
|
return _context.Merchants
|
|
.AsNoTracking()
|
|
.Where(x => x.TenantId == tenantId && x.Id == merchantId)
|
|
.FirstOrDefaultAsync(cancellationToken);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<IReadOnlyList<Merchant>> 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);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<IReadOnlyList<MerchantStaff>> 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;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<IReadOnlyList<MerchantContract>> 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;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public async Task<IReadOnlyList<MerchantDocument>> 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;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task AddMerchantAsync(Merchant merchant, CancellationToken cancellationToken = default)
|
|
{
|
|
return _context.Merchants.AddAsync(merchant, cancellationToken).AsTask();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task AddStaffAsync(MerchantStaff staff, CancellationToken cancellationToken = default)
|
|
{
|
|
return _context.MerchantStaff.AddAsync(staff, cancellationToken).AsTask();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task AddContractAsync(MerchantContract contract, CancellationToken cancellationToken = default)
|
|
{
|
|
return _context.MerchantContracts.AddAsync(contract, cancellationToken).AsTask();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task AddDocumentAsync(MerchantDocument document, CancellationToken cancellationToken = default)
|
|
{
|
|
return _context.MerchantDocuments.AddAsync(document, cancellationToken).AsTask();
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
return _context.SaveChangesAsync(cancellationToken);
|
|
}
|
|
}
|