feat: 扩展领域模型与配置
This commit is contained in:
125
src/Domain/TakeoutSaaS.Domain/Tenants/Entities/Tenant.cs
Normal file
125
src/Domain/TakeoutSaaS.Domain/Tenants/Entities/Tenant.cs
Normal 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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
32
src/Domain/TakeoutSaaS.Domain/Tenants/Enums/TenantStatus.cs
Normal file
32
src/Domain/TakeoutSaaS.Domain/Tenants/Enums/TenantStatus.cs
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user