feat: 扩展领域模型与配置
This commit is contained in:
13
.config/dotnet-tools.json
Normal file
13
.config/dotnet-tools.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"isRoot": true,
|
||||||
|
"tools": {
|
||||||
|
"dotnet-ef": {
|
||||||
|
"version": "10.0.0",
|
||||||
|
"commands": [
|
||||||
|
"dotnet-ef"
|
||||||
|
],
|
||||||
|
"rollForward": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -198,6 +198,32 @@ dotnet ef database update
|
|||||||
dotnet run
|
dotnet run
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 2.7 EF Core 迁移基线
|
||||||
|
|
||||||
|
现已内置 `dotnet-ef` 本地工具与设计时 DbContext 工厂,可直接在命令行生成/更新数据库。运行前可通过环境变量 `TAKEOUTSAAS_APP_CONNECTION`、`TAKEOUTSAAS_IDENTITY_CONNECTION` 覆盖默认连接串(默认指向本地 PostgreSQL)。
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 业务主库(TakeoutAppDbContext,含租户/商户/门店/商品/订单等)
|
||||||
|
dotnet tool run dotnet-ef database update `
|
||||||
|
--project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||||
|
--startup-project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||||
|
--context TakeoutSaaS.Infrastructure.App.Persistence.TakeoutAppDbContext
|
||||||
|
|
||||||
|
# 身份库(IdentityDbContext)
|
||||||
|
dotnet tool run dotnet-ef database update `
|
||||||
|
--project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||||
|
--startup-project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||||
|
--context TakeoutSaaS.Infrastructure.Identity.Persistence.IdentityDbContext
|
||||||
|
|
||||||
|
# 业务/字典库(DictionaryDbContext,归属 AppDatabase)
|
||||||
|
dotnet tool run dotnet-ef database update `
|
||||||
|
--project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||||
|
--startup-project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||||
|
--context TakeoutSaaS.Infrastructure.Dictionary.Persistence.DictionaryDbContext
|
||||||
|
```
|
||||||
|
|
||||||
|
> Hangfire 使用 Scheduler.ConnectionString 指向的数据库,首次启动服务会自动建表;只需提前创建空数据库并授予账号权限。
|
||||||
|
|
||||||
## 3. Docker部署
|
## 3. Docker部署
|
||||||
|
|
||||||
### 3.1 创建Dockerfile
|
### 3.1 创建Dockerfile
|
||||||
|
|||||||
@@ -134,7 +134,7 @@
|
|||||||
"PrefetchCount": 20
|
"PrefetchCount": 20
|
||||||
},
|
},
|
||||||
"Scheduler": {
|
"Scheduler": {
|
||||||
"ConnectionString": "Host=120.53.222.17;Port=5432;Database=takeout_saas_scheduler;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
|
"ConnectionString": "Host=120.53.222.17;Port=5432;Database=takeout_saas_hangfire;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
|
||||||
"WorkerCount": 5,
|
"WorkerCount": 5,
|
||||||
"DashboardEnabled": false,
|
"DashboardEnabled": false,
|
||||||
"DashboardPath": "/hangfire"
|
"DashboardPath": "/hangfire"
|
||||||
|
|||||||
@@ -134,7 +134,7 @@
|
|||||||
"PrefetchCount": 20
|
"PrefetchCount": 20
|
||||||
},
|
},
|
||||||
"Scheduler": {
|
"Scheduler": {
|
||||||
"ConnectionString": "Host=120.53.222.17;Port=5432;Database=takeout_saas_scheduler;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
|
"ConnectionString": "Host=120.53.222.17;Port=5432;Database=takeout_saas_hangfire;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
|
||||||
"WorkerCount": 5,
|
"WorkerCount": 5,
|
||||||
"DashboardEnabled": false,
|
"DashboardEnabled": false,
|
||||||
"DashboardPath": "/hangfire"
|
"DashboardPath": "/hangfire"
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.Analytics.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Analytics.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指标告警规则。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MetricAlertRule : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 关联指标。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MetricDefinitionId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 触发条件 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string ConditionJson { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 告警级别。
|
||||||
|
/// </summary>
|
||||||
|
public MetricAlertSeverity Severity { get; set; } = MetricAlertSeverity.Warning;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通知渠道。
|
||||||
|
/// </summary>
|
||||||
|
public string NotificationChannels { get; set; } = "email";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用。
|
||||||
|
/// </summary>
|
||||||
|
public bool Enabled { get; set; } = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Analytics.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指标定义,描述可观测的数据点。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MetricDefinition : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 指标编码。
|
||||||
|
/// </summary>
|
||||||
|
public string Code { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指标名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 说明。
|
||||||
|
/// </summary>
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 维度描述 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string? DimensionsJson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 默认聚合方式。
|
||||||
|
/// </summary>
|
||||||
|
public string DefaultAggregation { get; set; } = "sum";
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Analytics.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指标快照,用于大盘展示。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MetricSnapshot : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 指标定义 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MetricDefinitionId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 维度键(JSON)。
|
||||||
|
/// </summary>
|
||||||
|
public string DimensionKey { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 统计时间窗口开始。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime WindowStart { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 统计时间窗口结束。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime WindowEnd { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数值。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Value { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Analytics.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指标告警严重程度。
|
||||||
|
/// </summary>
|
||||||
|
public enum MetricAlertSeverity
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 信息提示。
|
||||||
|
/// </summary>
|
||||||
|
Info = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 告警。
|
||||||
|
/// </summary>
|
||||||
|
Warning = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 严重。
|
||||||
|
/// </summary>
|
||||||
|
Critical = 2
|
||||||
|
}
|
||||||
50
src/Domain/TakeoutSaaS.Domain/Coupons/Entities/Coupon.cs
Normal file
50
src/Domain/TakeoutSaaS.Domain/Coupons/Entities/Coupon.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Coupons.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户领取的券。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Coupon : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 模板标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid CouponTemplateId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 券码或序列号。
|
||||||
|
/// </summary>
|
||||||
|
public string Code { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 归属用户。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单 ID(已使用时记录)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public CouponStatus Status { get; set; } = CouponStatus.Available;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发放时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime IssuedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 使用时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? UsedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 到期时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ExpireAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
using TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Coupons.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 优惠券模板。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CouponTemplate : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 模板名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 券类型。
|
||||||
|
/// </summary>
|
||||||
|
public CouponType CouponType { get; set; } = CouponType.AmountOff;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 面值或折扣额度。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Value { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 折扣上限(针对折扣券)。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? DiscountCap { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 最低消费门槛。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? MinimumSpend { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 可用开始时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ValidFrom { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 可用结束时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ValidTo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 有效天数(相对发放时间)。
|
||||||
|
/// </summary>
|
||||||
|
public int? RelativeValidDays { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 总发放数量上限。
|
||||||
|
/// </summary>
|
||||||
|
public int? TotalQuantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已领取数量。
|
||||||
|
/// </summary>
|
||||||
|
public int ClaimedQuantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 适用门店 ID 集合(JSON)。
|
||||||
|
/// </summary>
|
||||||
|
public string? StoreScopeJson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 适用品类或商品范围(JSON)。
|
||||||
|
/// </summary>
|
||||||
|
public string? ProductScopeJson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发放渠道(JSON)。
|
||||||
|
/// </summary>
|
||||||
|
public string? ChannelsJson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否允许叠加其他优惠。
|
||||||
|
/// </summary>
|
||||||
|
public bool AllowStack { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public CouponTemplateStatus Status { get; set; } = CouponTemplateStatus.Draft;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? Description { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Coupons.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 营销活动配置。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class PromotionCampaign : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 活动名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 活动类型。
|
||||||
|
/// </summary>
|
||||||
|
public PromotionType PromotionType { get; set; } = PromotionType.Coupon;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 活动状态。
|
||||||
|
/// </summary>
|
||||||
|
public PromotionStatus Status { get; set; } = PromotionStatus.Draft;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结束时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预算金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? Budget { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 活动规则 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string RulesJson { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 目标人群描述。
|
||||||
|
/// </summary>
|
||||||
|
public string? AudienceDescription { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 营销素材(如 banner)。
|
||||||
|
/// </summary>
|
||||||
|
public string? BannerUrl { get; set; }
|
||||||
|
}
|
||||||
32
src/Domain/TakeoutSaaS.Domain/Coupons/Enums/CouponStatus.cs
Normal file
32
src/Domain/TakeoutSaaS.Domain/Coupons/Enums/CouponStatus.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 券使用状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum CouponStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 可使用。
|
||||||
|
/// </summary>
|
||||||
|
Available = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已锁定。
|
||||||
|
/// </summary>
|
||||||
|
Locked = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已使用。
|
||||||
|
/// </summary>
|
||||||
|
Redeemed = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已过期。
|
||||||
|
/// </summary>
|
||||||
|
Expired = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已作废。
|
||||||
|
/// </summary>
|
||||||
|
Voided = 4
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 券模板状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum CouponTemplateStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 草稿状态。
|
||||||
|
/// </summary>
|
||||||
|
Draft = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已上线可发放。
|
||||||
|
/// </summary>
|
||||||
|
Active = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已下架。
|
||||||
|
/// </summary>
|
||||||
|
Archived = 2
|
||||||
|
}
|
||||||
32
src/Domain/TakeoutSaaS.Domain/Coupons/Enums/CouponType.cs
Normal file
32
src/Domain/TakeoutSaaS.Domain/Coupons/Enums/CouponType.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 券类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum CouponType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 满减券。
|
||||||
|
/// </summary>
|
||||||
|
AmountOff = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 折扣券。
|
||||||
|
/// </summary>
|
||||||
|
Percentage = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 现金券/无门槛券。
|
||||||
|
/// </summary>
|
||||||
|
Cash = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 免配送费券。
|
||||||
|
/// </summary>
|
||||||
|
DeliveryFee = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 礼品/兑换券。
|
||||||
|
/// </summary>
|
||||||
|
Gift = 4
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 营销活动状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum PromotionStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 草稿。
|
||||||
|
/// </summary>
|
||||||
|
Draft = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 进行中。
|
||||||
|
/// </summary>
|
||||||
|
Active = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已结束。
|
||||||
|
/// </summary>
|
||||||
|
Completed = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 暂停。
|
||||||
|
/// </summary>
|
||||||
|
Paused = 3
|
||||||
|
}
|
||||||
27
src/Domain/TakeoutSaaS.Domain/Coupons/Enums/PromotionType.cs
Normal file
27
src/Domain/TakeoutSaaS.Domain/Coupons/Enums/PromotionType.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Coupons.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 营销活动类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum PromotionType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 优惠券活动。
|
||||||
|
/// </summary>
|
||||||
|
Coupon = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 秒杀/限时购。
|
||||||
|
/// </summary>
|
||||||
|
FlashSale = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 满减活动。
|
||||||
|
/// </summary>
|
||||||
|
FullReduction = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 抽奖活动。
|
||||||
|
/// </summary>
|
||||||
|
Lottery = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会话消息。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ChatMessage : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 会话标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ChatSessionId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发送方类型。
|
||||||
|
/// </summary>
|
||||||
|
public MessageSenderType SenderType { get; set; } = MessageSenderType.Customer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发送方用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? SenderUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 消息内容。
|
||||||
|
/// </summary>
|
||||||
|
public string Content { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 消息类型(文字/图片/语音等)。
|
||||||
|
/// </summary>
|
||||||
|
public string ContentType { get; set; } = "text/plain";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否已读。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsRead { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读取时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ReadAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客服会话。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ChatSession : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 会话编号。
|
||||||
|
/// </summary>
|
||||||
|
public string SessionCode { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顾客用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid CustomerUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前客服员工 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? AgentUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 所属门店(可空为平台)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会话状态。
|
||||||
|
/// </summary>
|
||||||
|
public ChatSessionStatus Status { get; set; } = ChatSessionStatus.Waiting;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否机器人接待中。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsBotActive { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结束时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EndedAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客服工单。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class SupportTicket : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 工单编号。
|
||||||
|
/// </summary>
|
||||||
|
public string TicketNo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客户用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid CustomerUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关联订单(如有)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工单主题。
|
||||||
|
/// </summary>
|
||||||
|
public string Subject { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工单详情。
|
||||||
|
/// </summary>
|
||||||
|
public string Description { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 优先级。
|
||||||
|
/// </summary>
|
||||||
|
public TicketPriority Priority { get; set; } = TicketPriority.Normal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public TicketStatus Status { get; set; } = TicketStatus.Open;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指派的客服。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? AssignedAgentId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关闭时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ClosedAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工单评论/流转记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class TicketComment : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 工单标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid SupportTicketId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 评论人 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? AuthorUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 评论内容。
|
||||||
|
/// </summary>
|
||||||
|
public string Content { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否内部备注。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsInternal { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附件 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string? AttachmentsJson { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客服会话状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum ChatSessionStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 等待客服接入。
|
||||||
|
/// </summary>
|
||||||
|
Waiting = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 聊天进行中。
|
||||||
|
/// </summary>
|
||||||
|
Active = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已转人工排队。
|
||||||
|
/// </summary>
|
||||||
|
Queueing = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已结束。
|
||||||
|
/// </summary>
|
||||||
|
Closed = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 消息发送方类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum MessageSenderType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 顾客。
|
||||||
|
/// </summary>
|
||||||
|
Customer = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客服人员。
|
||||||
|
/// </summary>
|
||||||
|
Agent = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 机器人。
|
||||||
|
/// </summary>
|
||||||
|
Bot = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 系统通知。
|
||||||
|
/// </summary>
|
||||||
|
System = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工单优先级。
|
||||||
|
/// </summary>
|
||||||
|
public enum TicketPriority
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 普通。
|
||||||
|
/// </summary>
|
||||||
|
Normal = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 高。
|
||||||
|
/// </summary>
|
||||||
|
High = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 紧急。
|
||||||
|
/// </summary>
|
||||||
|
Urgent = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.CustomerService.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工单状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum TicketStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 新建未处理。
|
||||||
|
/// </summary>
|
||||||
|
Open = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理中。
|
||||||
|
/// </summary>
|
||||||
|
InProgress = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 等待客户反馈。
|
||||||
|
/// </summary>
|
||||||
|
PendingCustomer = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已解决。
|
||||||
|
/// </summary>
|
||||||
|
Resolved = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已关闭。
|
||||||
|
/// </summary>
|
||||||
|
Closed = 4
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.Deliveries.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Deliveries.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送状态事件流水。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class DeliveryEvent : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 配送单标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid DeliveryOrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 事件类型。
|
||||||
|
/// </summary>
|
||||||
|
public DeliveryEventType EventType { get; set; } = DeliveryEventType.Updated;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 事件描述。
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原始数据 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string? Payload { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发生时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime OccurredAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
using TakeoutSaaS.Domain.Deliveries.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Deliveries.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送单。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class DeliveryOrder : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送服务商。
|
||||||
|
/// </summary>
|
||||||
|
public DeliveryProvider Provider { get; set; } = DeliveryProvider.InHouse;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 第三方配送单号。
|
||||||
|
/// </summary>
|
||||||
|
public string? ProviderOrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public DeliveryStatus Status { get; set; } = DeliveryStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送费。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? DeliveryFee { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 骑手姓名。
|
||||||
|
/// </summary>
|
||||||
|
public string? CourierName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 骑手电话。
|
||||||
|
/// </summary>
|
||||||
|
public string? CourierPhone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下发时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? DispatchedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取餐时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? PickedUpAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 完成时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? DeliveredAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异常原因。
|
||||||
|
/// </summary>
|
||||||
|
public string? FailureReason { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Deliveries.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送事件类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum DeliveryEventType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 状态更新。
|
||||||
|
/// </summary>
|
||||||
|
Updated = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 渠道回调。
|
||||||
|
/// </summary>
|
||||||
|
Callback = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加价或异常通知。
|
||||||
|
/// </summary>
|
||||||
|
Exception = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Deliveries.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送服务商类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum DeliveryProvider
|
||||||
|
{
|
||||||
|
InHouse = 0,
|
||||||
|
Dada = 1,
|
||||||
|
FlashEx = 2,
|
||||||
|
Meituan = 3,
|
||||||
|
Eleme = 4,
|
||||||
|
Shunfeng = 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Deliveries.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum DeliveryStatus
|
||||||
|
{
|
||||||
|
Pending = 0,
|
||||||
|
Accepted = 1,
|
||||||
|
PickingUp = 2,
|
||||||
|
Delivering = 3,
|
||||||
|
Completed = 4,
|
||||||
|
Cancelled = 5,
|
||||||
|
Failed = 6
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Distribution.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分销订单记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class AffiliateOrder : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 推广人标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid AffiliatePartnerId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关联订单。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid BuyerUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal OrderAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预计佣金。
|
||||||
|
/// </summary>
|
||||||
|
public decimal EstimatedCommission { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前状态。
|
||||||
|
/// </summary>
|
||||||
|
public AffiliateOrderStatus Status { get; set; } = AffiliateOrderStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结算完成时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? SettledAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Distribution.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分销/推广合作伙伴。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class AffiliatePartner : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户 ID(如绑定平台账号)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 昵称或渠道名称。
|
||||||
|
/// </summary>
|
||||||
|
public string DisplayName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 联系电话。
|
||||||
|
/// </summary>
|
||||||
|
public string? Phone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 渠道类型。
|
||||||
|
/// </summary>
|
||||||
|
public AffiliateChannelType ChannelType { get; set; } = AffiliateChannelType.Personal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分成比例(0-1)。
|
||||||
|
/// </summary>
|
||||||
|
public decimal CommissionRate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前状态。
|
||||||
|
/// </summary>
|
||||||
|
public AffiliateStatus Status { get; set; } = AffiliateStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Distribution.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 佣金结算记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class AffiliatePayout : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 合作伙伴标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid AffiliatePartnerId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结算周期描述。
|
||||||
|
/// </summary>
|
||||||
|
public string Period { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结算金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public PayoutStatus Status { get; set; } = PayoutStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 打款时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? PaidAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推广渠道类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum AffiliateChannelType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 个人。
|
||||||
|
/// </summary>
|
||||||
|
Personal = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自媒体。
|
||||||
|
/// </summary>
|
||||||
|
Media = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 门店地推。
|
||||||
|
/// </summary>
|
||||||
|
Offline = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 第三方联盟。
|
||||||
|
/// </summary>
|
||||||
|
Alliance = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分销订单状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum AffiliateOrderStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 待成交通知。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已完成待结算。
|
||||||
|
/// </summary>
|
||||||
|
AwaitingPayout = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已结算。
|
||||||
|
/// </summary>
|
||||||
|
Settled = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 因退款失效。
|
||||||
|
/// </summary>
|
||||||
|
Invalidated = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 合作伙伴状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum AffiliateStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 待审核。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已激活。
|
||||||
|
/// </summary>
|
||||||
|
Active = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已冻结。
|
||||||
|
/// </summary>
|
||||||
|
Suspended = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已退出。
|
||||||
|
/// </summary>
|
||||||
|
Closed = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Distribution.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 佣金结算状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum PayoutStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 待打款。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已打款。
|
||||||
|
/// </summary>
|
||||||
|
Paid = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已驳回。
|
||||||
|
/// </summary>
|
||||||
|
Rejected = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Engagement.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Engagement.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签到活动配置。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CheckInCampaign : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 活动名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 活动描述。
|
||||||
|
/// </summary>
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结束日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支持补签次数。
|
||||||
|
/// </summary>
|
||||||
|
public int AllowMakeupCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 连签奖励 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string RewardsJson { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public CheckInCampaignStatus Status { get; set; } = CheckInCampaignStatus.Draft;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Engagement.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户签到记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CheckInRecord : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 活动标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid CheckInCampaignId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签到日期(本地)。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CheckInDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否补签。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsMakeup { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获得奖励 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string RewardJson { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Engagement.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 社区评论。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CommunityComment : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 动态标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid PostId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 评论人。
|
||||||
|
/// </summary>
|
||||||
|
public Guid AuthorUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 评论内容。
|
||||||
|
/// </summary>
|
||||||
|
public string Content { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 父级评论 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? ParentId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsDeleted { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Engagement.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Engagement.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 社区动态。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CommunityPost : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 作者用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid AuthorUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标题。
|
||||||
|
/// </summary>
|
||||||
|
public string? Title { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 内容。
|
||||||
|
/// </summary>
|
||||||
|
public string Content { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 媒体资源 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string? MediaJson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public PostStatus Status { get; set; } = PostStatus.PendingReview;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 点赞数。
|
||||||
|
/// </summary>
|
||||||
|
public int LikeCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 评论数。
|
||||||
|
/// </summary>
|
||||||
|
public int CommentCount { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
using TakeoutSaaS.Domain.Engagement.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Engagement.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 社区互动反馈。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CommunityReaction : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 动态 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid PostId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 反应类型。
|
||||||
|
/// </summary>
|
||||||
|
public ReactionType ReactionType { get; set; } = ReactionType.Like;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 时间戳。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ReactedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Engagement.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签到活动状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum CheckInCampaignStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 草稿。
|
||||||
|
/// </summary>
|
||||||
|
Draft = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 进行中。
|
||||||
|
/// </summary>
|
||||||
|
Active = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已结束。
|
||||||
|
/// </summary>
|
||||||
|
Completed = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已停用。
|
||||||
|
/// </summary>
|
||||||
|
Disabled = 3
|
||||||
|
}
|
||||||
27
src/Domain/TakeoutSaaS.Domain/Engagement/Enums/PostStatus.cs
Normal file
27
src/Domain/TakeoutSaaS.Domain/Engagement/Enums/PostStatus.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Engagement.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 社区动态状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum PostStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 待审核。
|
||||||
|
/// </summary>
|
||||||
|
PendingReview = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已发布。
|
||||||
|
/// </summary>
|
||||||
|
Published = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已屏蔽。
|
||||||
|
/// </summary>
|
||||||
|
Blocked = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已删除。
|
||||||
|
/// </summary>
|
||||||
|
Deleted = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Engagement.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 互动类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum ReactionType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 点赞。
|
||||||
|
/// </summary>
|
||||||
|
Like = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 收藏。
|
||||||
|
/// </summary>
|
||||||
|
Favorite = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 点踩。
|
||||||
|
/// </summary>
|
||||||
|
Dislike = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
using TakeoutSaaS.Domain.GroupBuying.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.GroupBuying.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼单活动。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class GroupOrder : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 门店标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关联商品或套餐。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼单编号。
|
||||||
|
/// </summary>
|
||||||
|
public string GroupOrderNo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 团长用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid LeaderUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 成团需要的人数。
|
||||||
|
/// </summary>
|
||||||
|
public int TargetCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前已参与人数。
|
||||||
|
/// </summary>
|
||||||
|
public int CurrentCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼团价格。
|
||||||
|
/// </summary>
|
||||||
|
public decimal GroupPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结束时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼团状态。
|
||||||
|
/// </summary>
|
||||||
|
public GroupOrderStatus Status { get; set; } = GroupOrderStatus.Open;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 成团时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? SucceededAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取消时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? CancelledAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.GroupBuying.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.GroupBuying.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼单参与者。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class GroupParticipant : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 拼单活动标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid GroupOrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 对应订单标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 参与状态。
|
||||||
|
/// </summary>
|
||||||
|
public GroupParticipantStatus Status { get; set; } = GroupParticipantStatus.Joined;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 参与时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime JoinedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.GroupBuying.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼单状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum GroupOrderStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 开放中。
|
||||||
|
/// </summary>
|
||||||
|
Open = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已成团。
|
||||||
|
/// </summary>
|
||||||
|
Succeeded = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已取消。
|
||||||
|
/// </summary>
|
||||||
|
Cancelled = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 超时失败。
|
||||||
|
/// </summary>
|
||||||
|
Failed = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.GroupBuying.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拼单参与者状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum GroupParticipantStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 已参团。
|
||||||
|
/// </summary>
|
||||||
|
Joined = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 因退款或取消退出。
|
||||||
|
/// </summary>
|
||||||
|
Exited = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 团失败待退款。
|
||||||
|
/// </summary>
|
||||||
|
PendingRefund = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using TakeoutSaaS.Domain.Inventory.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Inventory.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 库存调整记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class InventoryAdjustment : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 对应的库存记录标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid InventoryItemId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 调整类型。
|
||||||
|
/// </summary>
|
||||||
|
public InventoryAdjustmentType AdjustmentType { get; set; } = InventoryAdjustmentType.Manual;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 调整数量,正数增加,负数减少。
|
||||||
|
/// </summary>
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原因说明。
|
||||||
|
/// </summary>
|
||||||
|
public string? Reason { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 操作人标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? OperatorId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发生时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime OccurredAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Inventory.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SKU 批次信息。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class InventoryBatch : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 门店标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SKU 标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductSkuId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 批次编号。
|
||||||
|
/// </summary>
|
||||||
|
public string BatchNumber { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生产日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ProductionDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 过期日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ExpireDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 入库数量。
|
||||||
|
/// </summary>
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 剩余数量。
|
||||||
|
/// </summary>
|
||||||
|
public int RemainingQuantity { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Inventory.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SKU 在门店的库存信息。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class InventoryItem : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 门店标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SKU 标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductSkuId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 批次编号,可为空表示混批。
|
||||||
|
/// </summary>
|
||||||
|
public string? BatchNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 可用库存。
|
||||||
|
/// </summary>
|
||||||
|
public int QuantityOnHand { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已锁定库存(订单占用)。
|
||||||
|
/// </summary>
|
||||||
|
public int QuantityReserved { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 安全库存阈值。
|
||||||
|
/// </summary>
|
||||||
|
public int? SafetyStock { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 储位或仓位信息。
|
||||||
|
/// </summary>
|
||||||
|
public string? Location { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 过期日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ExpireDate { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Inventory.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 库存调整类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum InventoryAdjustmentType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 手动盘点调整。
|
||||||
|
/// </summary>
|
||||||
|
Manual = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 采购入库。
|
||||||
|
/// </summary>
|
||||||
|
Purchase = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退货回库。
|
||||||
|
/// </summary>
|
||||||
|
Return = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 报损。
|
||||||
|
/// </summary>
|
||||||
|
Damage = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 过期销毁。
|
||||||
|
/// </summary>
|
||||||
|
Expiration = 4
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Membership.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 成长值变动日志。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MemberGrowthLog : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 会员标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MemberId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 变动数量。
|
||||||
|
/// </summary>
|
||||||
|
public int ChangeValue { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前成长值。
|
||||||
|
/// </summary>
|
||||||
|
public int CurrentValue { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? Notes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发生时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime OccurredAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Membership.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Membership.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 积分变动流水。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MemberPointLedger : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 会员标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MemberId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 变动数量,可为负值。
|
||||||
|
/// </summary>
|
||||||
|
public int ChangeAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 变动后余额。
|
||||||
|
/// </summary>
|
||||||
|
public int BalanceAfterChange { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 变动原因。
|
||||||
|
/// </summary>
|
||||||
|
public PointChangeReason Reason { get; set; } = PointChangeReason.Purchase;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 来源 ID(订单、活动等)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? SourceId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发生时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime OccurredAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 过期时间(如适用)。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ExpireAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
using TakeoutSaaS.Domain.Membership.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Membership.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会员档案。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MemberProfile : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 手机号。
|
||||||
|
/// </summary>
|
||||||
|
public string Mobile { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 昵称。
|
||||||
|
/// </summary>
|
||||||
|
public string? Nickname { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 头像。
|
||||||
|
/// </summary>
|
||||||
|
public string? AvatarUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前会员等级 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? MemberTierId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会员状态。
|
||||||
|
/// </summary>
|
||||||
|
public MemberStatus Status { get; set; } = MemberStatus.Active;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会员积分余额。
|
||||||
|
/// </summary>
|
||||||
|
public int PointsBalance { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 成长值/经验值。
|
||||||
|
/// </summary>
|
||||||
|
public int GrowthValue { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生日。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? BirthDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 注册时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime JoinedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Membership.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会员等级定义。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MemberTier : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 等级名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 所需成长值。
|
||||||
|
/// </summary>
|
||||||
|
public int RequiredGrowth { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 等级权益(JSON)。
|
||||||
|
/// </summary>
|
||||||
|
public string BenefitsJson { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序值。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Membership.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会员状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum MemberStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 正常。
|
||||||
|
/// </summary>
|
||||||
|
Active = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已冻结。
|
||||||
|
/// </summary>
|
||||||
|
Frozen = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已注销。
|
||||||
|
/// </summary>
|
||||||
|
Cancelled = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Membership.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 积分变动原因。
|
||||||
|
/// </summary>
|
||||||
|
public enum PointChangeReason
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 正常消费获得。
|
||||||
|
/// </summary>
|
||||||
|
Purchase = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 活动奖励。
|
||||||
|
/// </summary>
|
||||||
|
Promotion = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签到或任务。
|
||||||
|
/// </summary>
|
||||||
|
Task = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 管理员调整。
|
||||||
|
/// </summary>
|
||||||
|
Manual = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 抵扣消费。
|
||||||
|
/// </summary>
|
||||||
|
Redeem = 4
|
||||||
|
}
|
||||||
120
src/Domain/TakeoutSaaS.Domain/Merchants/Entities/Merchant.cs
Normal file
120
src/Domain/TakeoutSaaS.Domain/Merchants/Entities/Merchant.cs
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
using TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Merchants.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户主体信息,承载入驻和资质审核结果。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Merchant : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 品牌名称(对外展示)。
|
||||||
|
/// </summary>
|
||||||
|
public string BrandName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 品牌简称或别名。
|
||||||
|
/// </summary>
|
||||||
|
public string? BrandAlias { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 品牌 Logo。
|
||||||
|
/// </summary>
|
||||||
|
public string? LogoUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 品牌所属品类,如火锅、咖啡等。
|
||||||
|
/// </summary>
|
||||||
|
public string? Category { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 营业执照号。
|
||||||
|
/// </summary>
|
||||||
|
public string? BusinessLicenseNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 营业执照扫描件地址。
|
||||||
|
/// </summary>
|
||||||
|
public string? BusinessLicenseImageUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 税号/统一社会信用代码。
|
||||||
|
/// </summary>
|
||||||
|
public string? TaxNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 法人或负责人姓名。
|
||||||
|
/// </summary>
|
||||||
|
public string? LegalPerson { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 联系电话。
|
||||||
|
/// </summary>
|
||||||
|
public string ContactPhone { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 联系邮箱。
|
||||||
|
/// </summary>
|
||||||
|
public string? ContactEmail { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客服电话。
|
||||||
|
/// </summary>
|
||||||
|
public string? ServicePhone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客服邮箱。
|
||||||
|
/// </summary>
|
||||||
|
public string? SupportEmail { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 所在省份。
|
||||||
|
/// </summary>
|
||||||
|
public string? Province { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 所在城市。
|
||||||
|
/// </summary>
|
||||||
|
public string? City { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 所在区县。
|
||||||
|
/// </summary>
|
||||||
|
public string? District { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 详细地址。
|
||||||
|
/// </summary>
|
||||||
|
public string? Address { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 经度信息。
|
||||||
|
/// </summary>
|
||||||
|
public double? Longitude { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 纬度信息。
|
||||||
|
/// </summary>
|
||||||
|
public double? Latitude { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 入驻状态。
|
||||||
|
/// </summary>
|
||||||
|
public MerchantStatus Status { get; set; } = MerchantStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核备注或驳回原因。
|
||||||
|
/// </summary>
|
||||||
|
public string? ReviewRemarks { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 入驻时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? JoinedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 最近一次审核时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? LastReviewedAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Merchants.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户合同记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MerchantContract : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属商户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MerchantId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 合同编号。
|
||||||
|
/// </summary>
|
||||||
|
public string ContractNumber { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 合同状态。
|
||||||
|
/// </summary>
|
||||||
|
public ContractStatus Status { get; set; } = ContractStatus.Draft;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 合同开始时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 合同结束时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 合同文件存储地址。
|
||||||
|
/// </summary>
|
||||||
|
public string FileUrl { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签署时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? SignedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 终止时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? TerminatedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 终止原因。
|
||||||
|
/// </summary>
|
||||||
|
public string? TerminationReason { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Merchants.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户提交的资质或证照材料。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MerchantDocument : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属商户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MerchantId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 证照类型。
|
||||||
|
/// </summary>
|
||||||
|
public MerchantDocumentType DocumentType { get; set; } = MerchantDocumentType.BusinessLicense;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核状态。
|
||||||
|
/// </summary>
|
||||||
|
public MerchantDocumentStatus Status { get; set; } = MerchantDocumentStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 证照文件链接。
|
||||||
|
/// </summary>
|
||||||
|
public string FileUrl { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 证照编号。
|
||||||
|
/// </summary>
|
||||||
|
public string? DocumentNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签发日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? IssuedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 到期日期。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ExpiresAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核备注或驳回原因。
|
||||||
|
/// </summary>
|
||||||
|
public string? Remarks { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Merchants.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户员工账号,支持门店维度分配。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MerchantStaff : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属商户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid MerchantId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 可选的关联门店 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 员工姓名。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 手机号。
|
||||||
|
/// </summary>
|
||||||
|
public string Phone { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 邮箱地址。
|
||||||
|
/// </summary>
|
||||||
|
public string? Email { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 登录账号 ID(指向统一身份体系)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? IdentityUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 员工角色类型。
|
||||||
|
/// </summary>
|
||||||
|
public StaffRoleType RoleType { get; set; } = StaffRoleType.FrontDesk;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 员工状态。
|
||||||
|
/// </summary>
|
||||||
|
public StaffStatus Status { get; set; } = StaffStatus.Active;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自定义权限(JSON)。
|
||||||
|
/// </summary>
|
||||||
|
public string? PermissionsJson { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户合同状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum ContractStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 草拟中。
|
||||||
|
/// </summary>
|
||||||
|
Draft = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已生效。
|
||||||
|
/// </summary>
|
||||||
|
Active = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已到期。
|
||||||
|
/// </summary>
|
||||||
|
Expired = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已解除。
|
||||||
|
/// </summary>
|
||||||
|
Terminated = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 证照审核状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum MerchantDocumentStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 等待审核。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核通过。
|
||||||
|
/// </summary>
|
||||||
|
Approved = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核驳回。
|
||||||
|
/// </summary>
|
||||||
|
Rejected = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已过期待更新。
|
||||||
|
/// </summary>
|
||||||
|
Expired = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户证照类型。
|
||||||
|
/// </summary>
|
||||||
|
public enum MerchantDocumentType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 营业执照。
|
||||||
|
/// </summary>
|
||||||
|
BusinessLicense = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 餐饮服务许可证。
|
||||||
|
/// </summary>
|
||||||
|
CateringPermit = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 税务登记证。
|
||||||
|
/// </summary>
|
||||||
|
TaxCertificate = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 其他补充资质。
|
||||||
|
/// </summary>
|
||||||
|
Other = 99
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户入驻状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum MerchantStatus
|
||||||
|
{
|
||||||
|
Pending = 0,
|
||||||
|
Approved = 1,
|
||||||
|
Rejected = 2,
|
||||||
|
Frozen = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户员工角色。
|
||||||
|
/// </summary>
|
||||||
|
public enum StaffRoleType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 管理员。
|
||||||
|
/// </summary>
|
||||||
|
Admin = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 前台收银。
|
||||||
|
/// </summary>
|
||||||
|
FrontDesk = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 后厨制作。
|
||||||
|
/// </summary>
|
||||||
|
Kitchen = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配送骑手。
|
||||||
|
/// </summary>
|
||||||
|
Courier = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 运营人员。
|
||||||
|
/// </summary>
|
||||||
|
Operator = 4
|
||||||
|
}
|
||||||
22
src/Domain/TakeoutSaaS.Domain/Merchants/Enums/StaffStatus.cs
Normal file
22
src/Domain/TakeoutSaaS.Domain/Merchants/Enums/StaffStatus.cs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Merchants.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 员工账号状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum StaffStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 正常在职。
|
||||||
|
/// </summary>
|
||||||
|
Active = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 停用。
|
||||||
|
/// </summary>
|
||||||
|
Disabled = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已离职。
|
||||||
|
/// </summary>
|
||||||
|
Resigned = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Navigation.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 地图 POI 信息,用于门店定位和推荐。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class MapLocation : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 关联门店 ID,可空表示独立 POI。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 地址。
|
||||||
|
/// </summary>
|
||||||
|
public string Address { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 经度。
|
||||||
|
/// </summary>
|
||||||
|
public double Longitude { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 纬度。
|
||||||
|
/// </summary>
|
||||||
|
public double Latitude { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 打车/导航落点描述。
|
||||||
|
/// </summary>
|
||||||
|
public string? Landmark { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.Navigation.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Navigation.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户发起的导航请求日志。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class NavigationRequest : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 门店 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 来源通道(小程序、H5 等)。
|
||||||
|
/// </summary>
|
||||||
|
public NavigationChannel Channel { get; set; } = NavigationChannel.MiniProgram;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 跳转的地图应用。
|
||||||
|
/// </summary>
|
||||||
|
public NavigationTargetApp TargetApp { get; set; } = NavigationTargetApp.WechatMap;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime RequestedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Navigation.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 导航请求来源渠道。
|
||||||
|
/// </summary>
|
||||||
|
public enum NavigationChannel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 小程序。
|
||||||
|
/// </summary>
|
||||||
|
MiniProgram = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// H5/公众号。
|
||||||
|
/// </summary>
|
||||||
|
Web = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// App。
|
||||||
|
/// </summary>
|
||||||
|
MobileApp = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Navigation.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 导航目标应用。
|
||||||
|
/// </summary>
|
||||||
|
public enum NavigationTargetApp
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 微信地图。
|
||||||
|
/// </summary>
|
||||||
|
WechatMap = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 腾讯地图。
|
||||||
|
/// </summary>
|
||||||
|
Tencent = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 高德。
|
||||||
|
/// </summary>
|
||||||
|
Amap = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 百度地图。
|
||||||
|
/// </summary>
|
||||||
|
Baidu = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Apple Map。
|
||||||
|
/// </summary>
|
||||||
|
Apple = 4
|
||||||
|
}
|
||||||
55
src/Domain/TakeoutSaaS.Domain/Ordering/Entities/CartItem.cs
Normal file
55
src/Domain/TakeoutSaaS.Domain/Ordering/Entities/CartItem.cs
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
using TakeoutSaaS.Domain.Ordering.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Ordering.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 购物车条目。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CartItem : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属购物车标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ShoppingCartId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品或 SKU 标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SKU 标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? ProductSkuId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品名称快照。
|
||||||
|
/// </summary>
|
||||||
|
public string ProductName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 单价快照。
|
||||||
|
/// </summary>
|
||||||
|
public decimal UnitPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数量。
|
||||||
|
/// </summary>
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自定义备注(口味要求)。
|
||||||
|
/// </summary>
|
||||||
|
public string? Remark { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 状态。
|
||||||
|
/// </summary>
|
||||||
|
public CartItemStatus Status { get; set; } = CartItemStatus.Normal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 扩展 JSON(规格、加料选项等)。
|
||||||
|
/// </summary>
|
||||||
|
public string? AttributesJson { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Ordering.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 购物车条目的加料/附加项。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CartItemAddon : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属购物车条目。
|
||||||
|
/// </summary>
|
||||||
|
public Guid CartItemId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选项名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附加价格。
|
||||||
|
/// </summary>
|
||||||
|
public decimal ExtraPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选项 ID(可对应 ProductAddonOption)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? OptionId { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using TakeoutSaaS.Domain.Ordering.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Ordering.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结账会话,记录校验上下文。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class CheckoutSession : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 门店标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会话 Token。
|
||||||
|
/// </summary>
|
||||||
|
public string SessionToken { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会话状态。
|
||||||
|
/// </summary>
|
||||||
|
public CheckoutSessionStatus Status { get; set; } = CheckoutSessionStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 校验结果明细 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string ValidationResultJson { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 过期时间(UTC)。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ExpiresAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using TakeoutSaaS.Domain.Ordering.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Ordering.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户购物车,按租户/门店隔离。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ShoppingCart : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 门店标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 购物车状态,包含正常/锁定。
|
||||||
|
/// </summary>
|
||||||
|
public ShoppingCartStatus Status { get; set; } = ShoppingCartStatus.Active;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 桌码或场景标识(扫码点餐)。
|
||||||
|
/// </summary>
|
||||||
|
public string? TableContext { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 履约方式(堂食/自提/配送)缓存。
|
||||||
|
/// </summary>
|
||||||
|
public string? DeliveryPreference { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 最近一次修改时间(UTC)。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime LastModifiedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Ordering.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 购物车条目状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum CartItemStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 正常可结算。
|
||||||
|
/// </summary>
|
||||||
|
Normal = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 不可售(售罄或下架)。
|
||||||
|
/// </summary>
|
||||||
|
Unavailable = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已被删除。
|
||||||
|
/// </summary>
|
||||||
|
Removed = 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Ordering.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 结账会话状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum CheckoutSessionStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 等待用户提交或支付。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 校验失败。
|
||||||
|
/// </summary>
|
||||||
|
Failed = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已用于创建订单。
|
||||||
|
/// </summary>
|
||||||
|
Completed = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 超时作废。
|
||||||
|
/// </summary>
|
||||||
|
Expired = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Ordering.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 购物车状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum ShoppingCartStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 可正常使用。
|
||||||
|
/// </summary>
|
||||||
|
Active = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已锁定(进行结账中)。
|
||||||
|
/// </summary>
|
||||||
|
Locked = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已清空或失效。
|
||||||
|
/// </summary>
|
||||||
|
Cleared = 2
|
||||||
|
}
|
||||||
111
src/Domain/TakeoutSaaS.Domain/Orders/Entities/Order.cs
Normal file
111
src/Domain/TakeoutSaaS.Domain/Orders/Entities/Order.cs
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
using TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
using TakeoutSaaS.Domain.Payments.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Orders.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 交易订单。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Order : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 订单号。
|
||||||
|
/// </summary>
|
||||||
|
public string OrderNo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 门店。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下单渠道。
|
||||||
|
/// </summary>
|
||||||
|
public OrderChannel Channel { get; set; } = OrderChannel.MiniProgram;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 履约类型。
|
||||||
|
/// </summary>
|
||||||
|
public DeliveryType DeliveryType { get; set; } = DeliveryType.DineIn;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前状态。
|
||||||
|
/// </summary>
|
||||||
|
public OrderStatus Status { get; set; } = OrderStatus.PendingPayment;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付状态。
|
||||||
|
/// </summary>
|
||||||
|
public PaymentStatus PaymentStatus { get; set; } = PaymentStatus.Unpaid;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顾客姓名。
|
||||||
|
/// </summary>
|
||||||
|
public string? CustomerName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顾客手机号。
|
||||||
|
/// </summary>
|
||||||
|
public string? CustomerPhone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 就餐桌号。
|
||||||
|
/// </summary>
|
||||||
|
public string? TableNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排队号(如有)。
|
||||||
|
/// </summary>
|
||||||
|
public string? QueueNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 预约 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? ReservationId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品总额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal ItemsAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 优惠金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal DiscountAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 应付金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal PayableAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 实付金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal PaidAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? PaidAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 完成时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? FinishedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取消时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? CancelledAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取消原因。
|
||||||
|
/// </summary>
|
||||||
|
public string? CancelReason { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? Remark { get; set; }
|
||||||
|
}
|
||||||
59
src/Domain/TakeoutSaaS.Domain/Orders/Entities/OrderItem.cs
Normal file
59
src/Domain/TakeoutSaaS.Domain/Orders/Entities/OrderItem.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Orders.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单明细。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class OrderItem : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 订单 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品 ID。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品名称。
|
||||||
|
/// </summary>
|
||||||
|
public string ProductName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SKU/规格描述。
|
||||||
|
/// </summary>
|
||||||
|
public string? SkuName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 单位。
|
||||||
|
/// </summary>
|
||||||
|
public string? Unit { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数量。
|
||||||
|
/// </summary>
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 单价。
|
||||||
|
/// </summary>
|
||||||
|
public decimal UnitPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 折扣金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal DiscountAmount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 小计。
|
||||||
|
/// </summary>
|
||||||
|
public decimal SubTotal { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自定义属性 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string? AttributesJson { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Orders.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单状态流转记录。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class OrderStatusHistory : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 订单标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 变更后的状态。
|
||||||
|
/// </summary>
|
||||||
|
public OrderStatus Status { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 操作人标识(可为空表示系统)。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? OperatorId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注信息。
|
||||||
|
/// </summary>
|
||||||
|
public string? Notes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发生时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime OccurredAt { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Orders.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 售后/退款申请。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class RefundRequest : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 关联订单标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款单号。
|
||||||
|
/// </summary>
|
||||||
|
public string RefundNo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 申请金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 申请原因。
|
||||||
|
/// </summary>
|
||||||
|
public string Reason { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款状态。
|
||||||
|
/// </summary>
|
||||||
|
public RefundStatus Status { get; set; } = RefundStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户提交时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime RequestedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核完成时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ProcessedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? ReviewNotes { get; set; }
|
||||||
|
}
|
||||||
11
src/Domain/TakeoutSaaS.Domain/Orders/Enums/DeliveryType.cs
Normal file
11
src/Domain/TakeoutSaaS.Domain/Orders/Enums/DeliveryType.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 履约/交付方式。
|
||||||
|
/// </summary>
|
||||||
|
public enum DeliveryType
|
||||||
|
{
|
||||||
|
DineIn = 0,
|
||||||
|
Pickup = 1,
|
||||||
|
Delivery = 2
|
||||||
|
}
|
||||||
14
src/Domain/TakeoutSaaS.Domain/Orders/Enums/OrderChannel.cs
Normal file
14
src/Domain/TakeoutSaaS.Domain/Orders/Enums/OrderChannel.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下单渠道。
|
||||||
|
/// </summary>
|
||||||
|
public enum OrderChannel
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
MiniProgram = 1,
|
||||||
|
ScanToOrder = 2,
|
||||||
|
StaffConsole = 3,
|
||||||
|
PhoneReservation = 4,
|
||||||
|
ThirdPartyDelivery = 5
|
||||||
|
}
|
||||||
14
src/Domain/TakeoutSaaS.Domain/Orders/Enums/OrderStatus.cs
Normal file
14
src/Domain/TakeoutSaaS.Domain/Orders/Enums/OrderStatus.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum OrderStatus
|
||||||
|
{
|
||||||
|
PendingPayment = 0,
|
||||||
|
AwaitingPreparation = 1,
|
||||||
|
InProgress = 2,
|
||||||
|
Ready = 3,
|
||||||
|
Completed = 4,
|
||||||
|
Cancelled = 5
|
||||||
|
}
|
||||||
27
src/Domain/TakeoutSaaS.Domain/Orders/Enums/RefundStatus.cs
Normal file
27
src/Domain/TakeoutSaaS.Domain/Orders/Enums/RefundStatus.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Orders.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款申请状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum RefundStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 等待审核。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 审核通过,待原路退款。
|
||||||
|
/// </summary>
|
||||||
|
Approved = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已拒绝。
|
||||||
|
/// </summary>
|
||||||
|
Rejected = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已完成退款。
|
||||||
|
/// </summary>
|
||||||
|
Refunded = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using TakeoutSaaS.Domain.Payments.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Payments.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付流水。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class PaymentRecord : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 关联订单。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付方式。
|
||||||
|
/// </summary>
|
||||||
|
public PaymentMethod Method { get; set; } = PaymentMethod.Unknown;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付状态。
|
||||||
|
/// </summary>
|
||||||
|
public PaymentStatus Status { get; set; } = PaymentStatus.Unpaid;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 平台交易号。
|
||||||
|
/// </summary>
|
||||||
|
public string? TradeNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 第三方渠道单号。
|
||||||
|
/// </summary>
|
||||||
|
public string? ChannelTransactionId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付完成时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? PaidAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 错误/备注。
|
||||||
|
/// </summary>
|
||||||
|
public string? Remark { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原始回调内容。
|
||||||
|
/// </summary>
|
||||||
|
public string? Payload { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using TakeoutSaaS.Domain.Payments.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Payments.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付渠道退款流水。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class PaymentRefundRecord : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 原支付记录标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid PaymentRecordId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关联订单标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid OrderId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款金额。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 渠道退款流水号。
|
||||||
|
/// </summary>
|
||||||
|
public string? ChannelRefundId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款状态。
|
||||||
|
/// </summary>
|
||||||
|
public PaymentRefundStatus Status { get; set; } = PaymentRefundStatus.Pending;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款请求时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime RequestedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 完成时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? CompletedAt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 渠道返回的原始数据 JSON。
|
||||||
|
/// </summary>
|
||||||
|
public string? Payload { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Payments.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付方式。
|
||||||
|
/// </summary>
|
||||||
|
public enum PaymentMethod
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
WeChatPay = 1,
|
||||||
|
Alipay = 2,
|
||||||
|
Cash = 3,
|
||||||
|
Card = 4,
|
||||||
|
Balance = 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Payments.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付退款状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum PaymentRefundStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 已提交至渠道。
|
||||||
|
/// </summary>
|
||||||
|
Pending = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款成功。
|
||||||
|
/// </summary>
|
||||||
|
Succeeded = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退款失败。
|
||||||
|
/// </summary>
|
||||||
|
Failed = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 渠道处理中。
|
||||||
|
/// </summary>
|
||||||
|
Processing = 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
namespace TakeoutSaaS.Domain.Payments.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付记录状态。
|
||||||
|
/// </summary>
|
||||||
|
public enum PaymentStatus
|
||||||
|
{
|
||||||
|
Unpaid = 0,
|
||||||
|
Paying = 1,
|
||||||
|
Paid = 2,
|
||||||
|
Failed = 3,
|
||||||
|
Refunded = 4
|
||||||
|
}
|
||||||
100
src/Domain/TakeoutSaaS.Domain/Products/Entities/Product.cs
Normal file
100
src/Domain/TakeoutSaaS.Domain/Products/Entities/Product.cs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
using TakeoutSaaS.Domain.Products.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品(SPU)信息。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Product : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属门店。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 所属分类。
|
||||||
|
/// </summary>
|
||||||
|
public Guid CategoryId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品编码。
|
||||||
|
/// </summary>
|
||||||
|
public string SpuCode { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 副标题/卖点。
|
||||||
|
/// </summary>
|
||||||
|
public string? Subtitle { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 售卖单位(份/杯等)。
|
||||||
|
/// </summary>
|
||||||
|
public string? Unit { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 现价。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Price { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原价。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? OriginalPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 库存数量(可选)。
|
||||||
|
/// </summary>
|
||||||
|
public int? StockQuantity { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 最大每单限购。
|
||||||
|
/// </summary>
|
||||||
|
public int? MaxQuantityPerOrder { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品状态。
|
||||||
|
/// </summary>
|
||||||
|
public ProductStatus Status { get; set; } = ProductStatus.Draft;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 主图。
|
||||||
|
/// </summary>
|
||||||
|
public string? CoverImage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gallery 图片逗号分隔。
|
||||||
|
/// </summary>
|
||||||
|
public string? GalleryImages { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品描述。
|
||||||
|
/// </summary>
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支持堂食。
|
||||||
|
/// </summary>
|
||||||
|
public bool EnableDineIn { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支持自提。
|
||||||
|
/// </summary>
|
||||||
|
public bool EnablePickup { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支持配送。
|
||||||
|
/// </summary>
|
||||||
|
public bool EnableDelivery { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否热门推荐。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsFeatured { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Products.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加料/做法分组。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductAddonGroup : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属商品。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分组名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选择类型。
|
||||||
|
/// </summary>
|
||||||
|
public AddonSelectionType SelectionType { get; set; } = AddonSelectionType.Single;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 最小选择数量。
|
||||||
|
/// </summary>
|
||||||
|
public int? MinSelect { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 最大选择数量。
|
||||||
|
/// </summary>
|
||||||
|
public int? MaxSelect { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否必选。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsRequired { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序值。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加料选项。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductAddonOption : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属加料分组。
|
||||||
|
/// </summary>
|
||||||
|
public Guid AddonGroupId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选项名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附加价格。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? ExtraPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否默认选项。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsDefault { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.Products.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品规格/属性分组。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductAttributeGroup : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 关联门店,可为空表示所有门店共享。
|
||||||
|
/// </summary>
|
||||||
|
public Guid? StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分组名称,例如“辣度”“份量”。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选择类型(单选/多选)。
|
||||||
|
/// </summary>
|
||||||
|
public AttributeSelectionType SelectionType { get; set; } = AttributeSelectionType.Single;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否必选。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsRequired { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 显示排序。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品规格选项。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductAttributeOption : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属规格组。
|
||||||
|
/// </summary>
|
||||||
|
public Guid AttributeGroupId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选项名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附加价格。
|
||||||
|
/// </summary>
|
||||||
|
public decimal? ExtraPrice { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否默认选中。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsDefault { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品分类。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductCategory : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属门店。
|
||||||
|
/// </summary>
|
||||||
|
public Guid StoreId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分类名称。
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分类描述。
|
||||||
|
/// </summary>
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序值。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用。
|
||||||
|
/// </summary>
|
||||||
|
public bool IsEnabled { get; set; } = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using TakeoutSaaS.Domain.Products.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品媒资素材。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductMediaAsset : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 商品标识。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 媒体类型。
|
||||||
|
/// </summary>
|
||||||
|
public MediaAssetType MediaType { get; set; } = MediaAssetType.Image;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 媒资链接。
|
||||||
|
/// </summary>
|
||||||
|
public string Url { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 描述或标题。
|
||||||
|
/// </summary>
|
||||||
|
public string? Caption { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序。
|
||||||
|
/// </summary>
|
||||||
|
public int SortOrder { get; set; } = 100;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using TakeoutSaaS.Domain.Products.Enums;
|
||||||
|
using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||||
|
|
||||||
|
namespace TakeoutSaaS.Domain.Products.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品价格策略,支持会员价/时段价等。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ProductPricingRule : MultiTenantEntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 所属商品。
|
||||||
|
/// </summary>
|
||||||
|
public Guid ProductId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 策略类型。
|
||||||
|
/// </summary>
|
||||||
|
public PricingRuleType RuleType { get; set; } = PricingRuleType.Member;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 条件描述(JSON),如会员等级、渠道等。
|
||||||
|
/// </summary>
|
||||||
|
public string ConditionsJson { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 特殊价格。
|
||||||
|
/// </summary>
|
||||||
|
public decimal Price { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生效开始时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? StartTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生效结束时间。
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EndTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生效星期(JSON 数组)。
|
||||||
|
/// </summary>
|
||||||
|
public string? WeekdaysJson { get; set; }
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user