using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using MassTransit;
using TakeoutSaaS.Domain.Analytics.Entities;
using TakeoutSaaS.Domain.Coupons.Entities;
using TakeoutSaaS.Domain.CustomerService.Entities;
using TakeoutSaaS.Domain.Deliveries.Entities;
using TakeoutSaaS.Domain.Distribution.Entities;
using TakeoutSaaS.Domain.Common.Enums;
using TakeoutSaaS.Domain.Engagement.Entities;
using TakeoutSaaS.Domain.Finance.Entities;
using TakeoutSaaS.Domain.GroupBuying.Entities;
using TakeoutSaaS.Domain.Inventory.Entities;
using TakeoutSaaS.Domain.Membership.Entities;
using TakeoutSaaS.Domain.Merchants.Entities;
using TakeoutSaaS.Domain.Navigation.Entities;
using TakeoutSaaS.Domain.Ordering.Entities;
using TakeoutSaaS.Domain.Orders.Entities;
using TakeoutSaaS.Domain.Payments.Entities;
using TakeoutSaaS.Domain.Products.Entities;
using TakeoutSaaS.Domain.Queues.Entities;
using TakeoutSaaS.Domain.Reservations.Entities;
using TakeoutSaaS.Domain.Stores.Entities;
using TakeoutSaaS.Domain.Stores.Enums;
using TakeoutSaaS.Domain.Tenants.Entities;
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Infrastructure.Common.Persistence;
using TakeoutSaaS.Shared.Abstractions.Ids;
using TakeoutSaaS.Shared.Abstractions.Security;
using TakeoutSaaS.Shared.Abstractions.Tenancy;
using TakeoutSaaS.Infrastructure.App.Persistence.Configurations;
namespace TakeoutSaaS.Infrastructure.App.Persistence;
///
/// 业务主库 DbContext。
///
public sealed class TakeoutAppDbContext(
DbContextOptions options,
ITenantProvider tenantProvider,
ICurrentUserAccessor? currentUserAccessor = null,
IIdGenerator? idGenerator = null)
: TenantAwareDbContext(options, tenantProvider, currentUserAccessor, idGenerator)
{
///
/// 租户聚合根。
///
public DbSet Tenants => Set();
///
/// 租户套餐。
///
public DbSet TenantPackages => Set();
///
/// 租户订阅。
///
public DbSet TenantSubscriptions => Set();
///
/// 租户订阅历史。
///
public DbSet TenantSubscriptionHistories => Set();
///
/// 租户配额使用记录。
///
public DbSet TenantQuotaUsages => Set();
///
/// 租户配额使用历史记录。
///
public DbSet TenantQuotaUsageHistories => Set();
///
/// 租户账单。
///
public DbSet TenantBillingStatements => Set();
///
/// 租户支付记录。
///
public DbSet TenantPayments => Set();
///
/// 租户通知。
///
public DbSet TenantNotifications => Set();
///
/// 租户公告。
///
public DbSet TenantAnnouncements => Set();
///
/// 租户公告已读记录。
///
public DbSet TenantAnnouncementReads => Set();
///
/// 租户认证资料。
///
public DbSet TenantVerificationProfiles => Set();
///
/// 租户账单/配额可见角色规则。
///
public DbSet TenantVisibilityRoleRules => Set();
///
/// 租户发票设置。
///
public DbSet TenantInvoiceSettings => Set();
///
/// 租户发票记录。
///
public DbSet TenantInvoiceRecords => Set();
///
/// 成本录入汇总。
///
public DbSet FinanceCostEntries => Set();
///
/// 成本录入明细。
///
public DbSet FinanceCostEntryItems => Set();
///
/// 配额包定义。
///
public DbSet QuotaPackages => Set();
///
/// 租户配额包购买记录。
///
public DbSet TenantQuotaPackagePurchases => Set();
///
/// 商户实体。
///
public DbSet Merchants => Set();
///
/// 商户资质文件。
///
public DbSet MerchantDocuments => Set();
///
/// 商户合同。
///
public DbSet MerchantContracts => Set();
///
/// 商户员工。
///
public DbSet MerchantStaff => Set();
///
/// 商户分类。
///
public DbSet MerchantCategories => Set();
///
/// 门店实体。
///
public DbSet Stores => Set();
///
/// 门店费用配置。
///
public DbSet StoreFees => Set();
///
/// 门店资质证照。
///
public DbSet StoreQualifications => Set();
///
/// 门店审核记录。
///
public DbSet StoreAuditRecords => Set();
///
/// 门店营业时间。
///
public DbSet StoreBusinessHours => Set();
///
/// 门店节假日。
///
public DbSet StoreHolidays => Set();
///
/// 门店配送区域。
///
public DbSet StoreDeliveryZones => Set();
///
/// 门店配送设置。
///
public DbSet StoreDeliverySettings => Set();
///
/// 门店堂食设置。
///
public DbSet StoreDineInSettings => Set();
///
/// 门店桌台区域。
///
public DbSet StoreTableAreas => Set();
///
/// 门店桌台。
///
public DbSet StoreTables => Set();
///
/// 门店员工班次。
///
public DbSet StoreEmployeeShifts => Set();
///
/// 自提配置。
///
public DbSet StorePickupSettings => Set();
///
/// 自提时间段。
///
public DbSet StorePickupSlots => Set();
///
/// 门店班次模板。
///
public DbSet StoreStaffTemplates => Set();
///
/// 门店每周排班。
///
public DbSet StoreStaffWeeklySchedules => Set();
///
/// 商品分类。
///
public DbSet ProductCategories => Set();
///
/// 商品。
///
public DbSet Products => Set();
///
/// 商品属性组。
///
public DbSet ProductAttributeGroups => Set();
///
/// 商品属性项。
///
public DbSet ProductAttributeOptions => Set();
///
/// 门店规格做法模板。
///
public DbSet ProductSpecTemplates => Set();
///
/// 门店规格做法模板选项。
///
public DbSet ProductSpecTemplateOptions => Set();
///
/// 门店规格做法模板关联商品。
///
public DbSet ProductSpecTemplateProducts => Set();
///
/// 商品标签。
///
public DbSet ProductLabels => Set();
///
/// 标签与商品关联。
///
public DbSet ProductLabelProducts => Set();
///
/// 商品时段规则。
///
public DbSet ProductSchedules => Set();
///
/// 时段规则与商品关联。
///
public DbSet ProductScheduleProducts => Set();
///
/// SKU 实体。
///
public DbSet ProductSkus => Set();
///
/// SKU 异步保存任务。
///
public DbSet ProductSkuSaveJobs => Set();
///
/// 套餐分组。
///
public DbSet ProductComboGroups => Set();
///
/// 套餐分组商品。
///
public DbSet ProductComboGroupItems => Set();
///
/// 加料分组。
///
public DbSet ProductAddonGroups => Set();
///
/// 加料选项。
///
public DbSet ProductAddonOptions => Set();
///
/// 定价规则。
///
public DbSet ProductPricingRules => Set();
///
/// 商品媒体资源。
///
public DbSet ProductMediaAssets => Set();
///
/// 库存项目。
///
public DbSet InventoryItems => Set();
///
/// 库存调整记录。
///
public DbSet InventoryAdjustments => Set();
///
/// 库存批次。
///
public DbSet InventoryBatches => Set();
///
/// 库存锁定记录。
///
public DbSet InventoryLockRecords => Set();
///
/// 购物车。
///
public DbSet ShoppingCarts => Set();
///
/// 购物车明细。
///
public DbSet CartItems => Set();
///
/// 购物车加料。
///
public DbSet CartItemAddons => Set();
///
/// 结账会话。
///
public DbSet CheckoutSessions => Set();
///
/// 订单聚合。
///
public DbSet Orders => Set();
///
/// 订单明细。
///
public DbSet OrderItems => Set();
///
/// 订单状态流转。
///
public DbSet OrderStatusHistories => Set();
///
/// 退款申请。
///
public DbSet RefundRequests => Set();
///
/// 支付记录。
///
public DbSet PaymentRecords => Set();
///
/// 支付退款记录。
///
public DbSet PaymentRefundRecords => Set();
///
/// 预订记录。
///
public DbSet Reservations => Set();
///
/// 排号记录。
///
public DbSet QueueTickets => Set();
///
/// 配送订单。
///
public DbSet DeliveryOrders => Set();
///
/// 配送事件。
///
public DbSet DeliveryEvents => Set();
///
/// 团购订单。
///
public DbSet GroupOrders => Set();
///
/// 团购参与者。
///
public DbSet GroupParticipants => Set();
///
/// 优惠券模板。
///
public DbSet CouponTemplates => Set();
///
/// 优惠券实例。
///
public DbSet Coupons => Set();
///
/// 营销活动。
///
public DbSet PromotionCampaigns => Set();
///
/// 新客有礼配置。
///
public DbSet NewCustomerGiftSettings => Set();
///
/// 新客有礼券规则。
///
public DbSet NewCustomerCouponRules => Set();
///
/// 新客邀请记录。
///
public DbSet NewCustomerInviteRecords => Set();
///
/// 新客成长记录。
///
public DbSet NewCustomerGrowthRecords => Set();
///
/// 次卡模板。
///
public DbSet PunchCardTemplates => Set();
///
/// 次卡实例。
///
public DbSet PunchCardInstances => Set();
///
/// 次卡使用记录。
///
public DbSet PunchCardUsageRecords => Set();
///
/// 会员档案。
///
public DbSet MemberProfiles => Set();
///
/// 会员等级。
///
public DbSet MemberTiers => Set();
///
/// 会员标签。
///
public DbSet MemberProfileTags => Set();
///
/// 会员日设置。
///
public DbSet MemberDaySettings => Set();
///
/// 积分流水。
///
public DbSet MemberPointLedgers => Set();
///
/// 积分商城规则。
///
public DbSet MemberPointMallRules => Set();
///
/// 积分商城兑换商品。
///
public DbSet MemberPointMallProducts => Set();
///
/// 积分商城兑换记录。
///
public DbSet MemberPointMallRecords => Set();
///
/// 会员储值方案。
///
public DbSet MemberStoredCardPlans => Set();
///
/// 会员储值充值记录。
///
public DbSet MemberStoredCardRechargeRecords => Set();
///
/// 会员消息触达记录。
///
public DbSet MemberReachMessages => Set();
///
/// 会员消息模板。
///
public DbSet MemberMessageTemplates => Set();
///
/// 会员消息触达收件明细。
///
public DbSet MemberReachRecipients => Set();
///
/// 会话记录。
///
public DbSet ChatSessions => Set();
///
/// 会话消息。
///
public DbSet ChatMessages => Set();
///
/// 工单记录。
///
public DbSet SupportTickets => Set();
///
/// 工单评论。
///
public DbSet TicketComments => Set();
///
/// 分销合作伙伴。
///
public DbSet AffiliatePartners => Set();
///
/// 分销订单。
///
public DbSet AffiliateOrders => Set();
///
/// 分销结算。
///
public DbSet AffiliatePayouts => Set();
///
/// 打卡活动。
///
public DbSet CheckInCampaigns => Set();
///
/// 打卡记录。
///
public DbSet CheckInRecords => Set();
///
/// 社区帖子。
///
public DbSet CommunityPosts => Set();
///
/// 社区评论。
///
public DbSet CommunityComments => Set();
///
/// 社区互动。
///
public DbSet CommunityReactions => Set();
///
/// 地图位置。
///
public DbSet MapLocations => Set();
///
/// 导航请求。
///
public DbSet NavigationRequests => Set();
///
/// 指标定义。
///
public DbSet MetricDefinitions => Set();
///
/// 指标快照。
///
public DbSet MetricSnapshots => Set();
///
/// 告警规则。
///
public DbSet MetricAlertRules => Set();
///
/// 配置实体映射关系。
///
/// 模型构建器。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 1. 调用基类配置
base.OnModelCreating(modelBuilder);
// 2. 配置全部实体映射
ConfigureTenant(modelBuilder.Entity());
ConfigureMerchant(modelBuilder.Entity());
ConfigureStore(modelBuilder.Entity());
ConfigureTenantPackage(modelBuilder.Entity());
ConfigureTenantSubscription(modelBuilder.Entity());
ConfigureTenantSubscriptionHistory(modelBuilder.Entity());
ConfigureTenantQuotaUsage(modelBuilder.Entity());
ConfigureTenantQuotaUsageHistory(modelBuilder.Entity());
ConfigureTenantBilling(modelBuilder.Entity());
ConfigureTenantPayment(modelBuilder.Entity());
ConfigureTenantNotification(modelBuilder.Entity());
ConfigureTenantAnnouncement(modelBuilder.Entity());
ConfigureTenantAnnouncementRead(modelBuilder.Entity());
ConfigureTenantVerificationProfile(modelBuilder.Entity());
ConfigureTenantVisibilityRoleRule(modelBuilder.Entity());
ConfigureTenantInvoiceSetting(modelBuilder.Entity