feat: 扩展领域模型与配置

This commit is contained in:
贺爱泽
2025-12-01 13:26:05 +08:00
parent a08804658b
commit 5ddad07658
148 changed files with 8519 additions and 2 deletions

View File

@@ -0,0 +1,125 @@
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 平台租户信息,描述租户的生命周期与基础资料。
/// </summary>
public sealed class Tenant : AuditableEntityBase
{
/// <summary>
/// 租户短编码,作为跨系统引用的唯一标识。
/// </summary>
public string Code { get; set; } = string.Empty;
/// <summary>
/// 租户全称或品牌名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 对外展示的简称。
/// </summary>
public string? ShortName { get; set; }
/// <summary>
/// 法人或公司主体名称。
/// </summary>
public string? LegalEntityName { get; set; }
/// <summary>
/// 所属行业,如餐饮、零售等。
/// </summary>
public string? Industry { get; set; }
/// <summary>
/// LOGO 图片地址。
/// </summary>
public string? LogoUrl { get; set; }
/// <summary>
/// 品牌海报或封面图。
/// </summary>
public string? CoverImageUrl { get; set; }
/// <summary>
/// 官网或主要宣传链接。
/// </summary>
public string? Website { get; set; }
/// <summary>
/// 所在国家/地区。
/// </summary>
public string? Country { get; set; }
/// <summary>
/// 所在省份或州。
/// </summary>
public string? Province { get; set; }
/// <summary>
/// 所在城市。
/// </summary>
public string? City { get; set; }
/// <summary>
/// 详细地址信息。
/// </summary>
public string? Address { get; set; }
/// <summary>
/// 主联系人姓名。
/// </summary>
public string? ContactName { get; set; }
/// <summary>
/// 主联系人电话。
/// </summary>
public string? ContactPhone { get; set; }
/// <summary>
/// 主联系人邮箱。
/// </summary>
public string? ContactEmail { get; set; }
/// <summary>
/// 系统内对应的租户所有者账号 ID。
/// </summary>
public Guid? PrimaryOwnerUserId { get; set; }
/// <summary>
/// 租户当前状态,涵盖审核、启用、停用等场景。
/// </summary>
public TenantStatus Status { get; set; } = TenantStatus.PendingReview;
/// <summary>
/// 服务生效时间UTC
/// </summary>
public DateTime? EffectiveFrom { get; set; }
/// <summary>
/// 服务到期时间UTC
/// </summary>
public DateTime? EffectiveTo { get; set; }
/// <summary>
/// 最近一次暂停服务时间。
/// </summary>
public DateTime? SuspendedAt { get; set; }
/// <summary>
/// 暂停或终止的原因说明。
/// </summary>
public string? SuspensionReason { get; set; }
/// <summary>
/// 业务标签集合(逗号分隔)。
/// </summary>
public string? Tags { get; set; }
/// <summary>
/// 备注信息,用于运营记录特殊说明。
/// </summary>
public string? Remarks { get; set; }
}

View File

@@ -0,0 +1,50 @@
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 租户账单,用于呈现周期性收费。
/// </summary>
public sealed class TenantBillingStatement : MultiTenantEntityBase
{
/// <summary>
/// 账单编号,供对账查询。
/// </summary>
public string StatementNo { get; set; } = string.Empty;
/// <summary>
/// 账单周期开始时间。
/// </summary>
public DateTime PeriodStart { get; set; }
/// <summary>
/// 账单周期结束时间。
/// </summary>
public DateTime PeriodEnd { get; set; }
/// <summary>
/// 应付金额。
/// </summary>
public decimal AmountDue { get; set; }
/// <summary>
/// 实付金额。
/// </summary>
public decimal AmountPaid { get; set; }
/// <summary>
/// 当前付款状态。
/// </summary>
public TenantBillingStatus Status { get; set; } = TenantBillingStatus.Pending;
/// <summary>
/// 到期日。
/// </summary>
public DateTime DueDate { get; set; }
/// <summary>
/// 账单明细 JSON记录各项费用。
/// </summary>
public string? LineItemsJson { get; set; }
}

View File

@@ -0,0 +1,45 @@
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 面向租户的站内通知或消息推送。
/// </summary>
public sealed class TenantNotification : MultiTenantEntityBase
{
/// <summary>
/// 通知标题。
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 通知正文。
/// </summary>
public string Message { get; set; } = string.Empty;
/// <summary>
/// 发布通道(站内、邮件、短信等)。
/// </summary>
public TenantNotificationChannel Channel { get; set; } = TenantNotificationChannel.InApp;
/// <summary>
/// 通知重要级别。
/// </summary>
public TenantNotificationSeverity Severity { get; set; } = TenantNotificationSeverity.Info;
/// <summary>
/// 推送时间。
/// </summary>
public DateTime SentAt { get; set; } = DateTime.UtcNow;
/// <summary>
/// 租户是否已阅读。
/// </summary>
public DateTime? ReadAt { get; set; }
/// <summary>
/// 附加元数据 JSON。
/// </summary>
public string? MetadataJson { get; set; }
}

View File

@@ -0,0 +1,70 @@
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 平台提供的租户套餐定义。
/// </summary>
public sealed class TenantPackage : AuditableEntityBase
{
/// <summary>
/// 套餐名称,展示给租户的简称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 套餐描述,包含适用场景、权益等。
/// </summary>
public string? Description { get; set; }
/// <summary>
/// 套餐分类(试用、标准、旗舰等)。
/// </summary>
public TenantPackageType PackageType { get; set; } = TenantPackageType.Standard;
/// <summary>
/// 月付价格,单位:人民币元。
/// </summary>
public decimal? MonthlyPrice { get; set; }
/// <summary>
/// 年付价格,单位:人民币元。
/// </summary>
public decimal? YearlyPrice { get; set; }
/// <summary>
/// 允许的最大门店数。
/// </summary>
public int? MaxStoreCount { get; set; }
/// <summary>
/// 允许创建的最大账号数。
/// </summary>
public int? MaxAccountCount { get; set; }
/// <summary>
/// 存储容量上限GB
/// </summary>
public int? MaxStorageGb { get; set; }
/// <summary>
/// 每月短信额度上限。
/// </summary>
public int? MaxSmsCredits { get; set; }
/// <summary>
/// 每月可调用的配送单数量上限。
/// </summary>
public int? MaxDeliveryOrders { get; set; }
/// <summary>
/// 权益明细 JSON记录自定义特性开关。
/// </summary>
public string? FeaturePoliciesJson { get; set; }
/// <summary>
/// 是否仍可售卖。
/// </summary>
public bool IsActive { get; set; } = true;
}

View File

@@ -0,0 +1,35 @@
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 租户配额使用情况快照。
/// </summary>
public sealed class TenantQuotaUsage : MultiTenantEntityBase
{
/// <summary>
/// 配额类型,例如门店数、短信条数等。
/// </summary>
public TenantQuotaType QuotaType { get; set; }
/// <summary>
/// 当前配额上限。
/// </summary>
public decimal LimitValue { get; set; }
/// <summary>
/// 已消耗的数量。
/// </summary>
public decimal UsedValue { get; set; }
/// <summary>
/// 配额刷新周期描述(如月、年)。
/// </summary>
public string? ResetCycle { get; set; }
/// <summary>
/// 最近一次重置时间。
/// </summary>
public DateTime? LastResetAt { get; set; }
}

View File

@@ -0,0 +1,50 @@
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 租户套餐订阅记录。
/// </summary>
public sealed class TenantSubscription : MultiTenantEntityBase
{
/// <summary>
/// 当前订阅关联的套餐标识。
/// </summary>
public Guid TenantPackageId { get; set; }
/// <summary>
/// 订阅生效时间UTC
/// </summary>
public DateTime EffectiveFrom { get; set; }
/// <summary>
/// 订阅到期时间UTC
/// </summary>
public DateTime EffectiveTo { get; set; }
/// <summary>
/// 下一个计费时间,配合自动续费使用。
/// </summary>
public DateTime? NextBillingDate { get; set; }
/// <summary>
/// 订阅当前状态。
/// </summary>
public SubscriptionStatus Status { get; set; } = SubscriptionStatus.Pending;
/// <summary>
/// 是否开启自动续费。
/// </summary>
public bool AutoRenew { get; set; }
/// <summary>
/// 若已排期升降配,对应的新套餐 ID。
/// </summary>
public Guid? ScheduledPackageId { get; set; }
/// <summary>
/// 运营备注信息。
/// </summary>
public string? Notes { get; set; }
}

View File

@@ -0,0 +1,32 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 订阅状态。
/// </summary>
public enum SubscriptionStatus
{
/// <summary>
/// 尚未支付或等待审批。
/// </summary>
Pending = 0,
/// <summary>
/// 订阅已生效。
/// </summary>
Active = 1,
/// <summary>
/// 已到期但仍保留数据。
/// </summary>
GracePeriod = 2,
/// <summary>
/// 已取消。
/// </summary>
Cancelled = 3,
/// <summary>
/// 因欠费被暂停。
/// </summary>
Suspended = 4
}

View File

@@ -0,0 +1,27 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 账单状态。
/// </summary>
public enum TenantBillingStatus
{
/// <summary>
/// 等待付款。
/// </summary>
Pending = 0,
/// <summary>
/// 已付款结清。
/// </summary>
Paid = 1,
/// <summary>
/// 已逾期。
/// </summary>
Overdue = 2,
/// <summary>
/// 已取消或作废。
/// </summary>
Cancelled = 3
}

View File

@@ -0,0 +1,27 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 通知推送渠道。
/// </summary>
public enum TenantNotificationChannel
{
/// <summary>
/// 站内消息。
/// </summary>
InApp = 0,
/// <summary>
/// 邮件推送。
/// </summary>
Email = 1,
/// <summary>
/// 短信提醒。
/// </summary>
Sms = 2,
/// <summary>
/// 管理后台弹窗。
/// </summary>
Portal = 3
}

View File

@@ -0,0 +1,22 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 租户通知的重要程度。
/// </summary>
public enum TenantNotificationSeverity
{
/// <summary>
/// 普通提示。
/// </summary>
Info = 0,
/// <summary>
/// 需要关注的提醒。
/// </summary>
Warning = 1,
/// <summary>
/// 影响业务的严重事件。
/// </summary>
Critical = 2
}

View File

@@ -0,0 +1,27 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 套餐类型枚举。
/// </summary>
public enum TenantPackageType
{
/// <summary>
/// 免费试用套餐。
/// </summary>
Trial = 0,
/// <summary>
/// 标准商业套餐。
/// </summary>
Standard = 1,
/// <summary>
/// 面向成长型商户的高级套餐。
/// </summary>
Professional = 2,
/// <summary>
/// 提供完整能力的旗舰套餐。
/// </summary>
Enterprise = 3
}

View File

@@ -0,0 +1,37 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 配额类型,覆盖容量及调用次数。
/// </summary>
public enum TenantQuotaType
{
/// <summary>
/// 门店数量限制。
/// </summary>
StoreCount = 0,
/// <summary>
/// 员工账号数量限制。
/// </summary>
AccountCount = 1,
/// <summary>
/// 存储空间限制。
/// </summary>
Storage = 2,
/// <summary>
/// 短信额度。
/// </summary>
SmsCredits = 3,
/// <summary>
/// 配送订单数量限制。
/// </summary>
DeliveryOrders = 4,
/// <summary>
/// 营销活动并发数量。
/// </summary>
PromotionSlots = 5
}

View File

@@ -0,0 +1,32 @@
namespace TakeoutSaaS.Domain.Tenants.Enums;
/// <summary>
/// 租户服务状态。
/// </summary>
public enum TenantStatus
{
/// <summary>
/// 已提交信息,等待审核。
/// </summary>
PendingReview = 0,
/// <summary>
/// 审核通过并正常运营。
/// </summary>
Active = 1,
/// <summary>
/// 因欠费或违规被暂时停用。
/// </summary>
Suspended = 2,
/// <summary>
/// 服务到期尚未续费。
/// </summary>
Expired = 3,
/// <summary>
/// 主动或被动注销,数据进入归档状态。
/// </summary>
Closed = 4
}