chore: 提交现有修改

This commit is contained in:
2025-12-02 12:11:25 +08:00
parent 541b75ecd8
commit 5332c87d9d
37 changed files with 429 additions and 677 deletions

View File

@@ -10,22 +10,17 @@ namespace TakeoutSaaS.Infrastructure.App.Repositories;
/// <summary>
/// 配送聚合的 EF Core 仓储实现。
/// </summary>
public sealed class EfDeliveryRepository : IDeliveryRepository
/// <remarks>
/// 初始化仓储。
/// </remarks>
public sealed class EfDeliveryRepository(TakeoutAppDbContext context) : IDeliveryRepository
{
private readonly TakeoutAppDbContext _context;
/// <summary>
/// 初始化仓储。
/// </summary>
public EfDeliveryRepository(TakeoutAppDbContext context)
{
_context = context;
}
/// <inheritdoc />
public Task<DeliveryOrder?> FindByIdAsync(long deliveryOrderId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.DeliveryOrders
return context.DeliveryOrders
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == deliveryOrderId)
.FirstOrDefaultAsync(cancellationToken);
@@ -34,7 +29,7 @@ public sealed class EfDeliveryRepository : IDeliveryRepository
/// <inheritdoc />
public Task<DeliveryOrder?> FindByOrderIdAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.DeliveryOrders
return context.DeliveryOrders
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.FirstOrDefaultAsync(cancellationToken);
@@ -43,7 +38,7 @@ public sealed class EfDeliveryRepository : IDeliveryRepository
/// <inheritdoc />
public async Task<IReadOnlyList<DeliveryEvent>> GetEventsAsync(long deliveryOrderId, long tenantId, CancellationToken cancellationToken = default)
{
var events = await _context.DeliveryEvents
var events = await context.DeliveryEvents
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.DeliveryOrderId == deliveryOrderId)
.OrderBy(x => x.CreatedAt)
@@ -55,25 +50,25 @@ public sealed class EfDeliveryRepository : IDeliveryRepository
/// <inheritdoc />
public Task AddDeliveryOrderAsync(DeliveryOrder deliveryOrder, CancellationToken cancellationToken = default)
{
return _context.DeliveryOrders.AddAsync(deliveryOrder, cancellationToken).AsTask();
return context.DeliveryOrders.AddAsync(deliveryOrder, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddEventAsync(DeliveryEvent deliveryEvent, CancellationToken cancellationToken = default)
{
return _context.DeliveryEvents.AddAsync(deliveryEvent, cancellationToken).AsTask();
return context.DeliveryEvents.AddAsync(deliveryEvent, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
return context.SaveChangesAsync(cancellationToken);
}
/// <inheritdoc />
public async Task<IReadOnlyList<DeliveryOrder>> SearchAsync(long tenantId, DeliveryStatus? status, long? orderId, CancellationToken cancellationToken = default)
{
var query = _context.DeliveryOrders
var query = context.DeliveryOrders
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
@@ -95,23 +90,23 @@ public sealed class EfDeliveryRepository : IDeliveryRepository
/// <inheritdoc />
public Task UpdateDeliveryOrderAsync(DeliveryOrder deliveryOrder, CancellationToken cancellationToken = default)
{
_context.DeliveryOrders.Update(deliveryOrder);
context.DeliveryOrders.Update(deliveryOrder);
return Task.CompletedTask;
}
/// <inheritdoc />
public async Task DeleteDeliveryOrderAsync(long deliveryOrderId, long tenantId, CancellationToken cancellationToken = default)
{
var events = await _context.DeliveryEvents
var events = await context.DeliveryEvents
.Where(x => x.TenantId == tenantId && x.DeliveryOrderId == deliveryOrderId)
.ToListAsync(cancellationToken);
if (events.Count > 0)
{
_context.DeliveryEvents.RemoveRange(events);
context.DeliveryEvents.RemoveRange(events);
}
var existing = await _context.DeliveryOrders
var existing = await context.DeliveryOrders
.Where(x => x.TenantId == tenantId && x.Id == deliveryOrderId)
.FirstOrDefaultAsync(cancellationToken);
@@ -120,6 +115,6 @@ public sealed class EfDeliveryRepository : IDeliveryRepository
return;
}
_context.DeliveryOrders.Remove(existing);
context.DeliveryOrders.Remove(existing);
}
}

View File

@@ -10,22 +10,17 @@ namespace TakeoutSaaS.Infrastructure.App.Repositories;
/// <summary>
/// 商户聚合的 EF Core 仓储实现。
/// </summary>
public sealed class EfMerchantRepository : IMerchantRepository
/// <remarks>
/// 初始化仓储。
/// </remarks>
public sealed class EfMerchantRepository(TakeoutAppDbContext context) : 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
return context.Merchants
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == merchantId)
.FirstOrDefaultAsync(cancellationToken);
@@ -34,7 +29,7 @@ public sealed class EfMerchantRepository : IMerchantRepository
/// <inheritdoc />
public async Task<IReadOnlyList<Merchant>> SearchAsync(long tenantId, MerchantStatus? status, CancellationToken cancellationToken = default)
{
var query = _context.Merchants
var query = context.Merchants
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
@@ -51,7 +46,7 @@ public sealed class EfMerchantRepository : IMerchantRepository
/// <inheritdoc />
public async Task<IReadOnlyList<MerchantStaff>> GetStaffAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var staffs = await _context.MerchantStaff
var staffs = await context.MerchantStaff
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.MerchantId == merchantId)
.OrderBy(x => x.Name)
@@ -63,7 +58,7 @@ public sealed class EfMerchantRepository : IMerchantRepository
/// <inheritdoc />
public async Task<IReadOnlyList<MerchantContract>> GetContractsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var contracts = await _context.MerchantContracts
var contracts = await context.MerchantContracts
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.MerchantId == merchantId)
.OrderByDescending(x => x.CreatedAt)
@@ -75,7 +70,7 @@ public sealed class EfMerchantRepository : IMerchantRepository
/// <inheritdoc />
public async Task<IReadOnlyList<MerchantDocument>> GetDocumentsAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var documents = await _context.MerchantDocuments
var documents = await context.MerchantDocuments
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.MerchantId == merchantId)
.OrderBy(x => x.CreatedAt)
@@ -87,44 +82,44 @@ public sealed class EfMerchantRepository : IMerchantRepository
/// <inheritdoc />
public Task AddMerchantAsync(Merchant merchant, CancellationToken cancellationToken = default)
{
return _context.Merchants.AddAsync(merchant, cancellationToken).AsTask();
return context.Merchants.AddAsync(merchant, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddStaffAsync(MerchantStaff staff, CancellationToken cancellationToken = default)
{
return _context.MerchantStaff.AddAsync(staff, cancellationToken).AsTask();
return context.MerchantStaff.AddAsync(staff, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddContractAsync(MerchantContract contract, CancellationToken cancellationToken = default)
{
return _context.MerchantContracts.AddAsync(contract, cancellationToken).AsTask();
return context.MerchantContracts.AddAsync(contract, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddDocumentAsync(MerchantDocument document, CancellationToken cancellationToken = default)
{
return _context.MerchantDocuments.AddAsync(document, cancellationToken).AsTask();
return context.MerchantDocuments.AddAsync(document, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
return context.SaveChangesAsync(cancellationToken);
}
/// <inheritdoc />
public Task UpdateMerchantAsync(Merchant merchant, CancellationToken cancellationToken = default)
{
_context.Merchants.Update(merchant);
context.Merchants.Update(merchant);
return Task.CompletedTask;
}
/// <inheritdoc />
public async Task DeleteMerchantAsync(long merchantId, long tenantId, CancellationToken cancellationToken = default)
{
var existing = await _context.Merchants
var existing = await context.Merchants
.Where(x => x.TenantId == tenantId && x.Id == merchantId)
.FirstOrDefaultAsync(cancellationToken);
@@ -133,6 +128,6 @@ public sealed class EfMerchantRepository : IMerchantRepository
return;
}
_context.Merchants.Remove(existing);
context.Merchants.Remove(existing);
}
}

View File

@@ -11,22 +11,17 @@ namespace TakeoutSaaS.Infrastructure.App.Repositories;
/// <summary>
/// 订单聚合的 EF Core 仓储实现。
/// </summary>
public sealed class EfOrderRepository : IOrderRepository
/// <remarks>
/// 初始化仓储。
/// </remarks>
public sealed class EfOrderRepository(TakeoutAppDbContext context) : IOrderRepository
{
private readonly TakeoutAppDbContext _context;
/// <summary>
/// 初始化仓储。
/// </summary>
public EfOrderRepository(TakeoutAppDbContext context)
{
_context = context;
}
/// <inheritdoc />
public Task<Order?> FindByIdAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.Orders
return context.Orders
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == orderId)
.FirstOrDefaultAsync(cancellationToken);
@@ -35,7 +30,7 @@ public sealed class EfOrderRepository : IOrderRepository
/// <inheritdoc />
public Task<Order?> FindByOrderNoAsync(string orderNo, long tenantId, CancellationToken cancellationToken = default)
{
return _context.Orders
return context.Orders
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.OrderNo == orderNo)
.FirstOrDefaultAsync(cancellationToken);
@@ -44,7 +39,7 @@ public sealed class EfOrderRepository : IOrderRepository
/// <inheritdoc />
public async Task<IReadOnlyList<Order>> SearchAsync(long tenantId, OrderStatus? status, PaymentStatus? paymentStatus, CancellationToken cancellationToken = default)
{
var query = _context.Orders
var query = context.Orders
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
@@ -68,7 +63,7 @@ public sealed class EfOrderRepository : IOrderRepository
/// <inheritdoc />
public async Task<IReadOnlyList<OrderItem>> GetItemsAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
var items = await _context.OrderItems
var items = await context.OrderItems
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.OrderBy(x => x.Id)
@@ -80,7 +75,7 @@ public sealed class EfOrderRepository : IOrderRepository
/// <inheritdoc />
public async Task<IReadOnlyList<OrderStatusHistory>> GetStatusHistoryAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
var histories = await _context.OrderStatusHistories
var histories = await context.OrderStatusHistories
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.OrderBy(x => x.CreatedAt)
@@ -92,7 +87,7 @@ public sealed class EfOrderRepository : IOrderRepository
/// <inheritdoc />
public async Task<IReadOnlyList<RefundRequest>> GetRefundsAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
var refunds = await _context.RefundRequests
var refunds = await context.RefundRequests
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.OrderByDescending(x => x.CreatedAt)
@@ -104,68 +99,68 @@ public sealed class EfOrderRepository : IOrderRepository
/// <inheritdoc />
public Task AddOrderAsync(Order order, CancellationToken cancellationToken = default)
{
return _context.Orders.AddAsync(order, cancellationToken).AsTask();
return context.Orders.AddAsync(order, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddItemsAsync(IEnumerable<OrderItem> items, CancellationToken cancellationToken = default)
{
return _context.OrderItems.AddRangeAsync(items, cancellationToken);
return context.OrderItems.AddRangeAsync(items, cancellationToken);
}
/// <inheritdoc />
public Task AddStatusHistoryAsync(OrderStatusHistory history, CancellationToken cancellationToken = default)
{
return _context.OrderStatusHistories.AddAsync(history, cancellationToken).AsTask();
return context.OrderStatusHistories.AddAsync(history, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddRefundAsync(RefundRequest refund, CancellationToken cancellationToken = default)
{
return _context.RefundRequests.AddAsync(refund, cancellationToken).AsTask();
return context.RefundRequests.AddAsync(refund, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
return context.SaveChangesAsync(cancellationToken);
}
/// <inheritdoc />
public Task UpdateOrderAsync(Order order, CancellationToken cancellationToken = default)
{
_context.Orders.Update(order);
context.Orders.Update(order);
return Task.CompletedTask;
}
/// <inheritdoc />
public async Task DeleteOrderAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
var items = await _context.OrderItems
var items = await context.OrderItems
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.ToListAsync(cancellationToken);
if (items.Count > 0)
{
_context.OrderItems.RemoveRange(items);
context.OrderItems.RemoveRange(items);
}
var histories = await _context.OrderStatusHistories
var histories = await context.OrderStatusHistories
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.ToListAsync(cancellationToken);
if (histories.Count > 0)
{
_context.OrderStatusHistories.RemoveRange(histories);
context.OrderStatusHistories.RemoveRange(histories);
}
var refunds = await _context.RefundRequests
var refunds = await context.RefundRequests
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.ToListAsync(cancellationToken);
if (refunds.Count > 0)
{
_context.RefundRequests.RemoveRange(refunds);
context.RefundRequests.RemoveRange(refunds);
}
var existing = await _context.Orders
var existing = await context.Orders
.Where(x => x.TenantId == tenantId && x.Id == orderId)
.FirstOrDefaultAsync(cancellationToken);
if (existing == null)
@@ -173,6 +168,6 @@ public sealed class EfOrderRepository : IOrderRepository
return;
}
_context.Orders.Remove(existing);
context.Orders.Remove(existing);
}
}

View File

@@ -10,22 +10,17 @@ namespace TakeoutSaaS.Infrastructure.App.Repositories;
/// <summary>
/// 支付记录的 EF Core 仓储实现。
/// </summary>
public sealed class EfPaymentRepository : IPaymentRepository
/// <remarks>
/// 初始化仓储。
/// </remarks>
public sealed class EfPaymentRepository(TakeoutAppDbContext context) : IPaymentRepository
{
private readonly TakeoutAppDbContext _context;
/// <summary>
/// 初始化仓储。
/// </summary>
public EfPaymentRepository(TakeoutAppDbContext context)
{
_context = context;
}
/// <inheritdoc />
public Task<PaymentRecord?> FindByIdAsync(long paymentId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.PaymentRecords
return context.PaymentRecords
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == paymentId)
.FirstOrDefaultAsync(cancellationToken);
@@ -34,7 +29,7 @@ public sealed class EfPaymentRepository : IPaymentRepository
/// <inheritdoc />
public Task<PaymentRecord?> FindByOrderIdAsync(long orderId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.PaymentRecords
return context.PaymentRecords
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.OrderId == orderId)
.FirstOrDefaultAsync(cancellationToken);
@@ -43,7 +38,7 @@ public sealed class EfPaymentRepository : IPaymentRepository
/// <inheritdoc />
public async Task<IReadOnlyList<PaymentRefundRecord>> GetRefundsAsync(long paymentId, long tenantId, CancellationToken cancellationToken = default)
{
var refunds = await _context.PaymentRefundRecords
var refunds = await context.PaymentRefundRecords
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.PaymentRecordId == paymentId)
.OrderByDescending(x => x.CreatedAt)
@@ -55,19 +50,19 @@ public sealed class EfPaymentRepository : IPaymentRepository
/// <inheritdoc />
public Task AddPaymentAsync(PaymentRecord payment, CancellationToken cancellationToken = default)
{
return _context.PaymentRecords.AddAsync(payment, cancellationToken).AsTask();
return context.PaymentRecords.AddAsync(payment, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddRefundAsync(PaymentRefundRecord refund, CancellationToken cancellationToken = default)
{
return _context.PaymentRefundRecords.AddAsync(refund, cancellationToken).AsTask();
return context.PaymentRefundRecords.AddAsync(refund, cancellationToken).AsTask();
}
/// <inheritdoc />
public async Task<IReadOnlyList<PaymentRecord>> SearchAsync(long tenantId, PaymentStatus? status, CancellationToken cancellationToken = default)
{
var query = _context.PaymentRecords
var query = context.PaymentRecords
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
@@ -84,28 +79,28 @@ public sealed class EfPaymentRepository : IPaymentRepository
/// <inheritdoc />
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
return context.SaveChangesAsync(cancellationToken);
}
/// <inheritdoc />
public Task UpdatePaymentAsync(PaymentRecord payment, CancellationToken cancellationToken = default)
{
_context.PaymentRecords.Update(payment);
context.PaymentRecords.Update(payment);
return Task.CompletedTask;
}
/// <inheritdoc />
public async Task DeletePaymentAsync(long paymentId, long tenantId, CancellationToken cancellationToken = default)
{
var refunds = await _context.PaymentRefundRecords
var refunds = await context.PaymentRefundRecords
.Where(x => x.TenantId == tenantId && x.PaymentRecordId == paymentId)
.ToListAsync(cancellationToken);
if (refunds.Count > 0)
{
_context.PaymentRefundRecords.RemoveRange(refunds);
context.PaymentRefundRecords.RemoveRange(refunds);
}
var existing = await _context.PaymentRecords
var existing = await context.PaymentRecords
.Where(x => x.TenantId == tenantId && x.Id == paymentId)
.FirstOrDefaultAsync(cancellationToken);
if (existing == null)
@@ -113,6 +108,6 @@ public sealed class EfPaymentRepository : IPaymentRepository
return;
}
_context.PaymentRecords.Remove(existing);
context.PaymentRecords.Remove(existing);
}
}

View File

@@ -10,22 +10,17 @@ namespace TakeoutSaaS.Infrastructure.App.Repositories;
/// <summary>
/// 商品聚合的 EF Core 仓储实现。
/// </summary>
public sealed class EfProductRepository : IProductRepository
/// <remarks>
/// 初始化仓储。
/// </remarks>
public sealed class EfProductRepository(TakeoutAppDbContext context) : IProductRepository
{
private readonly TakeoutAppDbContext _context;
/// <summary>
/// 初始化仓储。
/// </summary>
public EfProductRepository(TakeoutAppDbContext context)
{
_context = context;
}
/// <inheritdoc />
public Task<Product?> FindByIdAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.Products
return context.Products
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == productId)
.FirstOrDefaultAsync(cancellationToken);
@@ -34,7 +29,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<Product>> SearchAsync(long tenantId, long? categoryId, ProductStatus? status, CancellationToken cancellationToken = default)
{
var query = _context.Products
var query = context.Products
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
@@ -58,7 +53,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductCategory>> GetCategoriesAsync(long tenantId, CancellationToken cancellationToken = default)
{
var categories = await _context.ProductCategories
var categories = await context.ProductCategories
.AsNoTracking()
.Where(x => x.TenantId == tenantId)
.OrderBy(x => x.SortOrder)
@@ -70,7 +65,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductSku>> GetSkusAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var skus = await _context.ProductSkus
var skus = await context.ProductSkus
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.OrderBy(x => x.SortOrder)
@@ -82,7 +77,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductAddonGroup>> GetAddonGroupsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var groups = await _context.ProductAddonGroups
var groups = await context.ProductAddonGroups
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.OrderBy(x => x.SortOrder)
@@ -94,7 +89,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductAddonOption>> GetAddonOptionsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var groupIds = await _context.ProductAddonGroups
var groupIds = await context.ProductAddonGroups
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.Select(x => x.Id)
@@ -105,7 +100,7 @@ public sealed class EfProductRepository : IProductRepository
return Array.Empty<ProductAddonOption>();
}
var options = await _context.ProductAddonOptions
var options = await context.ProductAddonOptions
.AsNoTracking()
.Where(x => x.TenantId == tenantId && groupIds.Contains(x.AddonGroupId))
.OrderBy(x => x.SortOrder)
@@ -117,7 +112,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductAttributeGroup>> GetAttributeGroupsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var groups = await _context.ProductAttributeGroups
var groups = await context.ProductAttributeGroups
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.OrderBy(x => x.SortOrder)
@@ -129,7 +124,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductAttributeOption>> GetAttributeOptionsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var groupIds = await _context.ProductAttributeGroups
var groupIds = await context.ProductAttributeGroups
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.Select(x => x.Id)
@@ -140,7 +135,7 @@ public sealed class EfProductRepository : IProductRepository
return Array.Empty<ProductAttributeOption>();
}
var options = await _context.ProductAttributeOptions
var options = await context.ProductAttributeOptions
.AsNoTracking()
.Where(x => x.TenantId == tenantId && groupIds.Contains(x.AttributeGroupId))
.OrderBy(x => x.SortOrder)
@@ -152,7 +147,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductMediaAsset>> GetMediaAssetsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var assets = await _context.ProductMediaAssets
var assets = await context.ProductMediaAssets
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.OrderBy(x => x.SortOrder)
@@ -164,7 +159,7 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public async Task<IReadOnlyList<ProductPricingRule>> GetPricingRulesAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var rules = await _context.ProductPricingRules
var rules = await context.ProductPricingRules
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.OrderBy(x => x.SortOrder)
@@ -176,59 +171,59 @@ public sealed class EfProductRepository : IProductRepository
/// <inheritdoc />
public Task AddCategoryAsync(ProductCategory category, CancellationToken cancellationToken = default)
{
return _context.ProductCategories.AddAsync(category, cancellationToken).AsTask();
return context.ProductCategories.AddAsync(category, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddProductAsync(Product product, CancellationToken cancellationToken = default)
{
return _context.Products.AddAsync(product, cancellationToken).AsTask();
return context.Products.AddAsync(product, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddSkusAsync(IEnumerable<ProductSku> skus, CancellationToken cancellationToken = default)
{
return _context.ProductSkus.AddRangeAsync(skus, cancellationToken);
return context.ProductSkus.AddRangeAsync(skus, cancellationToken);
}
/// <inheritdoc />
public Task AddAddonGroupsAsync(IEnumerable<ProductAddonGroup> groups, IEnumerable<ProductAddonOption> options, CancellationToken cancellationToken = default)
{
var addGroupsTask = _context.ProductAddonGroups.AddRangeAsync(groups, cancellationToken);
var addOptionsTask = _context.ProductAddonOptions.AddRangeAsync(options, cancellationToken);
var addGroupsTask = context.ProductAddonGroups.AddRangeAsync(groups, cancellationToken);
var addOptionsTask = context.ProductAddonOptions.AddRangeAsync(options, cancellationToken);
return Task.WhenAll(addGroupsTask, addOptionsTask);
}
/// <inheritdoc />
public Task AddAttributeGroupsAsync(IEnumerable<ProductAttributeGroup> groups, IEnumerable<ProductAttributeOption> options, CancellationToken cancellationToken = default)
{
var addGroupsTask = _context.ProductAttributeGroups.AddRangeAsync(groups, cancellationToken);
var addOptionsTask = _context.ProductAttributeOptions.AddRangeAsync(options, cancellationToken);
var addGroupsTask = context.ProductAttributeGroups.AddRangeAsync(groups, cancellationToken);
var addOptionsTask = context.ProductAttributeOptions.AddRangeAsync(options, cancellationToken);
return Task.WhenAll(addGroupsTask, addOptionsTask);
}
/// <inheritdoc />
public Task AddMediaAssetsAsync(IEnumerable<ProductMediaAsset> assets, CancellationToken cancellationToken = default)
{
return _context.ProductMediaAssets.AddRangeAsync(assets, cancellationToken);
return context.ProductMediaAssets.AddRangeAsync(assets, cancellationToken);
}
/// <inheritdoc />
public Task AddPricingRulesAsync(IEnumerable<ProductPricingRule> rules, CancellationToken cancellationToken = default)
{
return _context.ProductPricingRules.AddRangeAsync(rules, cancellationToken);
return context.ProductPricingRules.AddRangeAsync(rules, cancellationToken);
}
/// <inheritdoc />
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
return context.SaveChangesAsync(cancellationToken);
}
/// <inheritdoc />
public Task UpdateProductAsync(Product product, CancellationToken cancellationToken = default)
{
_context.Products.Update(product);
context.Products.Update(product);
return Task.CompletedTask;
}
@@ -241,7 +236,7 @@ public sealed class EfProductRepository : IProductRepository
await RemoveAddonGroupsAsync(productId, tenantId, cancellationToken);
await RemoveSkusAsync(productId, tenantId, cancellationToken);
var existing = await _context.Products
var existing = await context.Products
.Where(x => x.TenantId == tenantId && x.Id == productId)
.FirstOrDefaultAsync(cancellationToken);
@@ -250,20 +245,20 @@ public sealed class EfProductRepository : IProductRepository
return;
}
_context.Products.Remove(existing);
context.Products.Remove(existing);
}
/// <inheritdoc />
public Task UpdateCategoryAsync(ProductCategory category, CancellationToken cancellationToken = default)
{
_context.ProductCategories.Update(category);
context.ProductCategories.Update(category);
return Task.CompletedTask;
}
/// <inheritdoc />
public async Task DeleteCategoryAsync(long categoryId, long tenantId, CancellationToken cancellationToken = default)
{
var existing = await _context.ProductCategories
var existing = await context.ProductCategories
.Where(x => x.TenantId == tenantId && x.Id == categoryId)
.FirstOrDefaultAsync(cancellationToken);
@@ -272,13 +267,13 @@ public sealed class EfProductRepository : IProductRepository
return;
}
_context.ProductCategories.Remove(existing);
context.ProductCategories.Remove(existing);
}
/// <inheritdoc />
public async Task RemoveSkusAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var skus = await _context.ProductSkus
var skus = await context.ProductSkus
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.ToListAsync(cancellationToken);
@@ -287,13 +282,13 @@ public sealed class EfProductRepository : IProductRepository
return;
}
_context.ProductSkus.RemoveRange(skus);
context.ProductSkus.RemoveRange(skus);
}
/// <inheritdoc />
public async Task RemoveAddonGroupsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var groupIds = await _context.ProductAddonGroups
var groupIds = await context.ProductAddonGroups
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.Select(x => x.Id)
.ToListAsync(cancellationToken);
@@ -303,29 +298,29 @@ public sealed class EfProductRepository : IProductRepository
return;
}
var options = await _context.ProductAddonOptions
var options = await context.ProductAddonOptions
.Where(x => x.TenantId == tenantId && groupIds.Contains(x.AddonGroupId))
.ToListAsync(cancellationToken);
if (options.Count > 0)
{
_context.ProductAddonOptions.RemoveRange(options);
context.ProductAddonOptions.RemoveRange(options);
}
var groups = await _context.ProductAddonGroups
var groups = await context.ProductAddonGroups
.Where(x => groupIds.Contains(x.Id))
.ToListAsync(cancellationToken);
if (groups.Count > 0)
{
_context.ProductAddonGroups.RemoveRange(groups);
context.ProductAddonGroups.RemoveRange(groups);
}
}
/// <inheritdoc />
public async Task RemoveAttributeGroupsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var groupIds = await _context.ProductAttributeGroups
var groupIds = await context.ProductAttributeGroups
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.Select(x => x.Id)
.ToListAsync(cancellationToken);
@@ -335,29 +330,29 @@ public sealed class EfProductRepository : IProductRepository
return;
}
var options = await _context.ProductAttributeOptions
var options = await context.ProductAttributeOptions
.Where(x => x.TenantId == tenantId && groupIds.Contains(x.AttributeGroupId))
.ToListAsync(cancellationToken);
if (options.Count > 0)
{
_context.ProductAttributeOptions.RemoveRange(options);
context.ProductAttributeOptions.RemoveRange(options);
}
var groups = await _context.ProductAttributeGroups
var groups = await context.ProductAttributeGroups
.Where(x => groupIds.Contains(x.Id))
.ToListAsync(cancellationToken);
if (groups.Count > 0)
{
_context.ProductAttributeGroups.RemoveRange(groups);
context.ProductAttributeGroups.RemoveRange(groups);
}
}
/// <inheritdoc />
public async Task RemoveMediaAssetsAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var assets = await _context.ProductMediaAssets
var assets = await context.ProductMediaAssets
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.ToListAsync(cancellationToken);
@@ -366,13 +361,13 @@ public sealed class EfProductRepository : IProductRepository
return;
}
_context.ProductMediaAssets.RemoveRange(assets);
context.ProductMediaAssets.RemoveRange(assets);
}
/// <inheritdoc />
public async Task RemovePricingRulesAsync(long productId, long tenantId, CancellationToken cancellationToken = default)
{
var rules = await _context.ProductPricingRules
var rules = await context.ProductPricingRules
.Where(x => x.TenantId == tenantId && x.ProductId == productId)
.ToListAsync(cancellationToken);
@@ -381,6 +376,6 @@ public sealed class EfProductRepository : IProductRepository
return;
}
_context.ProductPricingRules.RemoveRange(rules);
context.ProductPricingRules.RemoveRange(rules);
}
}

View File

@@ -10,22 +10,17 @@ namespace TakeoutSaaS.Infrastructure.App.Repositories;
/// <summary>
/// 门店聚合的 EF Core 仓储实现。
/// </summary>
public sealed class EfStoreRepository : IStoreRepository
/// <remarks>
/// 初始化仓储。
/// </remarks>
public sealed class EfStoreRepository(TakeoutAppDbContext context) : IStoreRepository
{
private readonly TakeoutAppDbContext _context;
/// <summary>
/// 初始化仓储。
/// </summary>
public EfStoreRepository(TakeoutAppDbContext context)
{
_context = context;
}
/// <inheritdoc />
public Task<Store?> FindByIdAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
return _context.Stores
return context.Stores
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.Id == storeId)
.FirstOrDefaultAsync(cancellationToken);
@@ -34,7 +29,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<Store>> SearchAsync(long tenantId, StoreStatus? status, CancellationToken cancellationToken = default)
{
var query = _context.Stores
var query = context.Stores
.AsNoTracking()
.Where(x => x.TenantId == tenantId);
@@ -53,7 +48,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<StoreBusinessHour>> GetBusinessHoursAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var hours = await _context.StoreBusinessHours
var hours = await context.StoreBusinessHours
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.DayOfWeek)
@@ -66,7 +61,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<StoreDeliveryZone>> GetDeliveryZonesAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var zones = await _context.StoreDeliveryZones
var zones = await context.StoreDeliveryZones
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.SortOrder)
@@ -78,7 +73,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<StoreHoliday>> GetHolidaysAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var holidays = await _context.StoreHolidays
var holidays = await context.StoreHolidays
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.Date)
@@ -90,7 +85,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<StoreTableArea>> GetTableAreasAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var areas = await _context.StoreTableAreas
var areas = await context.StoreTableAreas
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.SortOrder)
@@ -102,7 +97,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<StoreTable>> GetTablesAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var tables = await _context.StoreTables
var tables = await context.StoreTables
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.TableCode)
@@ -114,7 +109,7 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public async Task<IReadOnlyList<StoreEmployeeShift>> GetShiftsAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var shifts = await _context.StoreEmployeeShifts
var shifts = await context.StoreEmployeeShifts
.AsNoTracking()
.Where(x => x.TenantId == tenantId && x.StoreId == storeId)
.OrderBy(x => x.ShiftDate)
@@ -127,62 +122,62 @@ public sealed class EfStoreRepository : IStoreRepository
/// <inheritdoc />
public Task AddStoreAsync(Store store, CancellationToken cancellationToken = default)
{
return _context.Stores.AddAsync(store, cancellationToken).AsTask();
return context.Stores.AddAsync(store, cancellationToken).AsTask();
}
/// <inheritdoc />
public Task AddBusinessHoursAsync(IEnumerable<StoreBusinessHour> hours, CancellationToken cancellationToken = default)
{
return _context.StoreBusinessHours.AddRangeAsync(hours, cancellationToken);
return context.StoreBusinessHours.AddRangeAsync(hours, cancellationToken);
}
/// <inheritdoc />
public Task AddDeliveryZonesAsync(IEnumerable<StoreDeliveryZone> zones, CancellationToken cancellationToken = default)
{
return _context.StoreDeliveryZones.AddRangeAsync(zones, cancellationToken);
return context.StoreDeliveryZones.AddRangeAsync(zones, cancellationToken);
}
/// <inheritdoc />
public Task AddHolidaysAsync(IEnumerable<StoreHoliday> holidays, CancellationToken cancellationToken = default)
{
return _context.StoreHolidays.AddRangeAsync(holidays, cancellationToken);
return context.StoreHolidays.AddRangeAsync(holidays, cancellationToken);
}
/// <inheritdoc />
public Task AddTableAreasAsync(IEnumerable<StoreTableArea> areas, CancellationToken cancellationToken = default)
{
return _context.StoreTableAreas.AddRangeAsync(areas, cancellationToken);
return context.StoreTableAreas.AddRangeAsync(areas, cancellationToken);
}
/// <inheritdoc />
public Task AddTablesAsync(IEnumerable<StoreTable> tables, CancellationToken cancellationToken = default)
{
return _context.StoreTables.AddRangeAsync(tables, cancellationToken);
return context.StoreTables.AddRangeAsync(tables, cancellationToken);
}
/// <inheritdoc />
public Task AddShiftsAsync(IEnumerable<StoreEmployeeShift> shifts, CancellationToken cancellationToken = default)
{
return _context.StoreEmployeeShifts.AddRangeAsync(shifts, cancellationToken);
return context.StoreEmployeeShifts.AddRangeAsync(shifts, cancellationToken);
}
/// <inheritdoc />
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
return _context.SaveChangesAsync(cancellationToken);
return context.SaveChangesAsync(cancellationToken);
}
/// <inheritdoc />
public Task UpdateStoreAsync(Store store, CancellationToken cancellationToken = default)
{
_context.Stores.Update(store);
context.Stores.Update(store);
return Task.CompletedTask;
}
/// <inheritdoc />
public async Task DeleteStoreAsync(long storeId, long tenantId, CancellationToken cancellationToken = default)
{
var existing = await _context.Stores
var existing = await context.Stores
.Where(x => x.TenantId == tenantId && x.Id == storeId)
.FirstOrDefaultAsync(cancellationToken);
@@ -191,6 +186,6 @@ public sealed class EfStoreRepository : IStoreRepository
return;
}
_context.Stores.Remove(existing);
context.Stores.Remove(existing);
}
}