Files
TakeoutSaaS.TenantApi/src/Infrastructure/TakeoutSaaS.Infrastructure/Migrations/20251202005208_InitSnowflake_App.cs

2551 lines
208 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace TakeoutSaaS.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class InitSnowflake_App : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "affiliate_orders",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
AffiliatePartnerId = table.Column<long>(type: "bigint", nullable: false, comment: "推广人标识。"),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "关联订单。"),
BuyerUserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户 ID。"),
OrderAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "订单金额。"),
EstimatedCommission = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "预计佣金。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "当前状态。"),
SettledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "结算完成时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_affiliate_orders", x => x.Id);
},
comment: "分销订单记录。");
migrationBuilder.CreateTable(
name: "affiliate_partners",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<long>(type: "bigint", nullable: true, comment: "用户 ID如绑定平台账号。"),
DisplayName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "昵称或渠道名称。"),
Phone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "联系电话。"),
ChannelType = table.Column<int>(type: "integer", nullable: false, comment: "渠道类型。"),
CommissionRate = table.Column<decimal>(type: "numeric", nullable: false, comment: "分成比例0-1。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "当前状态。"),
Remarks = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "审核备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_affiliate_partners", x => x.Id);
},
comment: "分销/推广合作伙伴。");
migrationBuilder.CreateTable(
name: "affiliate_payouts",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
AffiliatePartnerId = table.Column<long>(type: "bigint", nullable: false, comment: "合作伙伴标识。"),
Period = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "结算周期描述。"),
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "结算金额。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
PaidAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "打款时间。"),
Remarks = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_affiliate_payouts", x => x.Id);
},
comment: "佣金结算记录。");
migrationBuilder.CreateTable(
name: "cart_item_addons",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
CartItemId = table.Column<long>(type: "bigint", nullable: false, comment: "所属购物车条目。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "选项名称。"),
ExtraPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "附加价格。"),
OptionId = table.Column<long>(type: "bigint", nullable: true, comment: "选项 ID可对应 ProductAddonOption。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_cart_item_addons", x => x.Id);
},
comment: "购物车条目的加料/附加项。");
migrationBuilder.CreateTable(
name: "cart_items",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ShoppingCartId = table.Column<long>(type: "bigint", nullable: false, comment: "所属购物车标识。"),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "商品或 SKU 标识。"),
ProductSkuId = table.Column<long>(type: "bigint", nullable: true, comment: "SKU 标识。"),
ProductName = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "商品名称快照。"),
UnitPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "单价快照。"),
Quantity = table.Column<int>(type: "integer", nullable: false, comment: "数量。"),
Remark = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "自定义备注(口味要求)。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
AttributesJson = table.Column<string>(type: "text", nullable: true, comment: "扩展 JSON规格、加料选项等。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_cart_items", x => x.Id);
},
comment: "购物车条目。");
migrationBuilder.CreateTable(
name: "chat_messages",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ChatSessionId = table.Column<long>(type: "bigint", nullable: false, comment: "会话标识。"),
SenderType = table.Column<int>(type: "integer", nullable: false, comment: "发送方类型。"),
SenderUserId = table.Column<long>(type: "bigint", nullable: true, comment: "发送方用户 ID。"),
Content = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: false, comment: "消息内容。"),
ContentType = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "消息类型(文字/图片/语音等)。"),
IsRead = table.Column<bool>(type: "boolean", nullable: false, comment: "是否已读。"),
ReadAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "读取时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_chat_messages", x => x.Id);
},
comment: "会话消息。");
migrationBuilder.CreateTable(
name: "chat_sessions",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SessionCode = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "会话编号。"),
CustomerUserId = table.Column<long>(type: "bigint", nullable: false, comment: "顾客用户 ID。"),
AgentUserId = table.Column<long>(type: "bigint", nullable: true, comment: "当前客服员工 ID。"),
StoreId = table.Column<long>(type: "bigint", nullable: true, comment: "所属门店(可空为平台)。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "会话状态。"),
IsBotActive = table.Column<bool>(type: "boolean", nullable: false, comment: "是否机器人接待中。"),
StartedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "开始时间。"),
EndedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "结束时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_chat_sessions", x => x.Id);
},
comment: "客服会话。");
migrationBuilder.CreateTable(
name: "checkin_campaigns",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "活动名称。"),
Description = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "活动描述。"),
StartDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "开始日期。"),
EndDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "结束日期。"),
AllowMakeupCount = table.Column<int>(type: "integer", nullable: false, comment: "支持补签次数。"),
RewardsJson = table.Column<string>(type: "text", nullable: false, comment: "连签奖励 JSON。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_checkin_campaigns", x => x.Id);
},
comment: "签到活动配置。");
migrationBuilder.CreateTable(
name: "checkin_records",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
CheckInCampaignId = table.Column<long>(type: "bigint", nullable: false, comment: "活动标识。"),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户标识。"),
CheckInDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "签到日期(本地)。"),
IsMakeup = table.Column<bool>(type: "boolean", nullable: false, comment: "是否补签。"),
RewardJson = table.Column<string>(type: "text", nullable: false, comment: "获得奖励 JSON。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_checkin_records", x => x.Id);
},
comment: "用户签到记录。");
migrationBuilder.CreateTable(
name: "checkout_sessions",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户标识。"),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
SessionToken = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "会话 Token。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "会话状态。"),
ValidationResultJson = table.Column<string>(type: "text", nullable: false, comment: "校验结果明细 JSON。"),
ExpiresAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "过期时间UTC。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_checkout_sessions", x => x.Id);
},
comment: "结账会话,记录校验上下文。");
migrationBuilder.CreateTable(
name: "community_comments",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
PostId = table.Column<long>(type: "bigint", nullable: false, comment: "动态标识。"),
AuthorUserId = table.Column<long>(type: "bigint", nullable: false, comment: "评论人。"),
Content = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: false, comment: "评论内容。"),
ParentId = table.Column<long>(type: "bigint", nullable: true, comment: "父级评论 ID。"),
IsDeleted = table.Column<bool>(type: "boolean", nullable: false, comment: "状态。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_community_comments", x => x.Id);
},
comment: "社区评论。");
migrationBuilder.CreateTable(
name: "community_posts",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
AuthorUserId = table.Column<long>(type: "bigint", nullable: false, comment: "作者用户 ID。"),
Title = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "标题。"),
Content = table.Column<string>(type: "text", nullable: false, comment: "内容。"),
MediaJson = table.Column<string>(type: "text", nullable: true, comment: "媒体资源 JSON。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
LikeCount = table.Column<int>(type: "integer", nullable: false, comment: "点赞数。"),
CommentCount = table.Column<int>(type: "integer", nullable: false, comment: "评论数。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_community_posts", x => x.Id);
},
comment: "社区动态。");
migrationBuilder.CreateTable(
name: "community_reactions",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
PostId = table.Column<long>(type: "bigint", nullable: false, comment: "动态 ID。"),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户 ID。"),
ReactionType = table.Column<int>(type: "integer", nullable: false, comment: "反应类型。"),
ReactedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "时间戳。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_community_reactions", x => x.Id);
},
comment: "社区互动反馈。");
migrationBuilder.CreateTable(
name: "coupon_templates",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "模板名称。"),
CouponType = table.Column<int>(type: "integer", nullable: false, comment: "券类型。"),
Value = table.Column<decimal>(type: "numeric", nullable: false, comment: "面值或折扣额度。"),
DiscountCap = table.Column<decimal>(type: "numeric", nullable: true, comment: "折扣上限(针对折扣券)。"),
MinimumSpend = table.Column<decimal>(type: "numeric", nullable: true, comment: "最低消费门槛。"),
ValidFrom = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "可用开始时间。"),
ValidTo = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "可用结束时间。"),
RelativeValidDays = table.Column<int>(type: "integer", nullable: true, comment: "有效天数(相对发放时间)。"),
TotalQuantity = table.Column<int>(type: "integer", nullable: true, comment: "总发放数量上限。"),
ClaimedQuantity = table.Column<int>(type: "integer", nullable: false, comment: "已领取数量。"),
StoreScopeJson = table.Column<string>(type: "text", nullable: true, comment: "适用门店 ID 集合JSON。"),
ProductScopeJson = table.Column<string>(type: "text", nullable: true, comment: "适用品类或商品范围JSON。"),
ChannelsJson = table.Column<string>(type: "text", nullable: true, comment: "发放渠道JSON。"),
AllowStack = table.Column<bool>(type: "boolean", nullable: false, comment: "是否允许叠加其他优惠。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
Description = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_coupon_templates", x => x.Id);
},
comment: "优惠券模板。");
migrationBuilder.CreateTable(
name: "coupons",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
CouponTemplateId = table.Column<long>(type: "bigint", nullable: false, comment: "模板标识。"),
Code = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "券码或序列号。"),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "归属用户。"),
OrderId = table.Column<long>(type: "bigint", nullable: true, comment: "订单 ID已使用时记录。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
IssuedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "发放时间。"),
UsedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "使用时间。"),
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "到期时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_coupons", x => x.Id);
},
comment: "用户领取的券。");
migrationBuilder.CreateTable(
name: "delivery_events",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
DeliveryOrderId = table.Column<long>(type: "bigint", nullable: false, comment: "配送单标识。"),
EventType = table.Column<int>(type: "integer", nullable: false, comment: "事件类型。"),
Message = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false, comment: "事件描述。"),
Payload = table.Column<string>(type: "text", nullable: true, comment: "原始数据 JSON。"),
OccurredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "发生时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_delivery_events", x => x.Id);
},
comment: "配送状态事件流水。");
migrationBuilder.CreateTable(
name: "delivery_orders",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrderId = table.Column<long>(type: "bigint", nullable: false),
Provider = table.Column<int>(type: "integer", nullable: false, comment: "配送服务商。"),
ProviderOrderId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "第三方配送单号。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
DeliveryFee = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "配送费。"),
CourierName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "骑手姓名。"),
CourierPhone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "骑手电话。"),
DispatchedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "下发时间。"),
PickedUpAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "取餐时间。"),
DeliveredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "完成时间。"),
FailureReason = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "异常原因。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_delivery_orders", x => x.Id);
},
comment: "配送单。");
migrationBuilder.CreateTable(
name: "group_orders",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "关联商品或套餐。"),
GroupOrderNo = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "拼单编号。"),
LeaderUserId = table.Column<long>(type: "bigint", nullable: false, comment: "团长用户 ID。"),
TargetCount = table.Column<int>(type: "integer", nullable: false, comment: "成团需要的人数。"),
CurrentCount = table.Column<int>(type: "integer", nullable: false, comment: "当前已参与人数。"),
GroupPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "拼团价格。"),
StartAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "开始时间。"),
EndAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "结束时间。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "拼团状态。"),
SucceededAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "成团时间。"),
CancelledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "取消时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_group_orders", x => x.Id);
},
comment: "拼单活动。");
migrationBuilder.CreateTable(
name: "group_participants",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
GroupOrderId = table.Column<long>(type: "bigint", nullable: false, comment: "拼单活动标识。"),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "对应订单标识。"),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户标识。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "参与状态。"),
JoinedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "参与时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_group_participants", x => x.Id);
},
comment: "拼单参与者。");
migrationBuilder.CreateTable(
name: "inventory_adjustments",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
InventoryItemId = table.Column<long>(type: "bigint", nullable: false, comment: "对应的库存记录标识。"),
AdjustmentType = table.Column<int>(type: "integer", nullable: false, comment: "调整类型。"),
Quantity = table.Column<int>(type: "integer", nullable: false, comment: "调整数量,正数增加,负数减少。"),
Reason = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "原因说明。"),
OperatorId = table.Column<long>(type: "bigint", nullable: true, comment: "操作人标识。"),
OccurredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "发生时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_inventory_adjustments", x => x.Id);
},
comment: "库存调整记录。");
migrationBuilder.CreateTable(
name: "inventory_batches",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
ProductSkuId = table.Column<long>(type: "bigint", nullable: false, comment: "SKU 标识。"),
BatchNumber = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "批次编号。"),
ProductionDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "生产日期。"),
ExpireDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "过期日期。"),
Quantity = table.Column<int>(type: "integer", nullable: false, comment: "入库数量。"),
RemainingQuantity = table.Column<int>(type: "integer", nullable: false, comment: "剩余数量。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_inventory_batches", x => x.Id);
},
comment: "SKU 批次信息。");
migrationBuilder.CreateTable(
name: "inventory_items",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
ProductSkuId = table.Column<long>(type: "bigint", nullable: false, comment: "SKU 标识。"),
BatchNumber = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "批次编号,可为空表示混批。"),
QuantityOnHand = table.Column<int>(type: "integer", nullable: false, comment: "可用库存。"),
QuantityReserved = table.Column<int>(type: "integer", nullable: false, comment: "已锁定库存(订单占用)。"),
SafetyStock = table.Column<int>(type: "integer", nullable: true, comment: "安全库存阈值。"),
Location = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "储位或仓位信息。"),
ExpireDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "过期日期。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_inventory_items", x => x.Id);
},
comment: "SKU 在门店的库存信息。");
migrationBuilder.CreateTable(
name: "map_locations",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: true, comment: "关联门店 ID可空表示独立 POI。"),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "名称。"),
Address = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false, comment: "地址。"),
Longitude = table.Column<double>(type: "double precision", nullable: false, comment: "经度。"),
Latitude = table.Column<double>(type: "double precision", nullable: false, comment: "纬度。"),
Landmark = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "打车/导航落点描述。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_map_locations", x => x.Id);
},
comment: "地图 POI 信息,用于门店定位和推荐。");
migrationBuilder.CreateTable(
name: "member_growth_logs",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MemberId = table.Column<long>(type: "bigint", nullable: false, comment: "会员标识。"),
ChangeValue = table.Column<int>(type: "integer", nullable: false, comment: "变动数量。"),
CurrentValue = table.Column<int>(type: "integer", nullable: false, comment: "当前成长值。"),
Notes = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"),
OccurredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "发生时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_member_growth_logs", x => x.Id);
},
comment: "成长值变动日志。");
migrationBuilder.CreateTable(
name: "member_point_ledgers",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MemberId = table.Column<long>(type: "bigint", nullable: false, comment: "会员标识。"),
ChangeAmount = table.Column<int>(type: "integer", nullable: false, comment: "变动数量,可为负值。"),
BalanceAfterChange = table.Column<int>(type: "integer", nullable: false, comment: "变动后余额。"),
Reason = table.Column<int>(type: "integer", nullable: false, comment: "变动原因。"),
SourceId = table.Column<long>(type: "bigint", nullable: true, comment: "来源 ID订单、活动等。"),
OccurredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "发生时间。"),
ExpireAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "过期时间(如适用)。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_member_point_ledgers", x => x.Id);
},
comment: "积分变动流水。");
migrationBuilder.CreateTable(
name: "member_profiles",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户标识。"),
Mobile = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "手机号。"),
Nickname = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "昵称。"),
AvatarUrl = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "头像。"),
MemberTierId = table.Column<long>(type: "bigint", nullable: true, comment: "当前会员等级 ID。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "会员状态。"),
PointsBalance = table.Column<int>(type: "integer", nullable: false, comment: "会员积分余额。"),
GrowthValue = table.Column<int>(type: "integer", nullable: false, comment: "成长值/经验值。"),
BirthDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "生日。"),
JoinedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "注册时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_member_profiles", x => x.Id);
},
comment: "会员档案。");
migrationBuilder.CreateTable(
name: "member_tiers",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "等级名称。"),
RequiredGrowth = table.Column<int>(type: "integer", nullable: false, comment: "所需成长值。"),
BenefitsJson = table.Column<string>(type: "text", nullable: false, comment: "等级权益JSON。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_member_tiers", x => x.Id);
},
comment: "会员等级定义。");
migrationBuilder.CreateTable(
name: "merchant_contracts",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MerchantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商户标识。"),
ContractNumber = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "合同编号。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "合同状态。"),
StartDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "合同开始时间。"),
EndDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "合同结束时间。"),
FileUrl = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: false, comment: "合同文件存储地址。"),
SignedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "签署时间。"),
TerminatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "终止时间。"),
TerminationReason = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "终止原因。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_merchant_contracts", x => x.Id);
},
comment: "商户合同记录。");
migrationBuilder.CreateTable(
name: "merchant_documents",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MerchantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商户标识。"),
DocumentType = table.Column<int>(type: "integer", nullable: false, comment: "证照类型。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "审核状态。"),
FileUrl = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: false, comment: "证照文件链接。"),
DocumentNumber = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "证照编号。"),
IssuedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "签发日期。"),
ExpiresAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "到期日期。"),
Remarks = table.Column<string>(type: "text", nullable: true, comment: "审核备注或驳回原因。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_merchant_documents", x => x.Id);
},
comment: "商户提交的资质或证照材料。");
migrationBuilder.CreateTable(
name: "merchant_staff",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MerchantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商户标识。"),
StoreId = table.Column<long>(type: "bigint", nullable: true, comment: "可选的关联门店 ID。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "员工姓名。"),
Phone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "手机号。"),
Email = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "邮箱地址。"),
IdentityUserId = table.Column<long>(type: "bigint", nullable: true, comment: "登录账号 ID指向统一身份体系。"),
RoleType = table.Column<int>(type: "integer", nullable: false, comment: "员工角色类型。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "员工状态。"),
PermissionsJson = table.Column<string>(type: "text", nullable: true, comment: "自定义权限JSON。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_merchant_staff", x => x.Id);
},
comment: "商户员工账号,支持门店维度分配。");
migrationBuilder.CreateTable(
name: "merchants",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
BrandName = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "品牌名称(对外展示)。"),
BrandAlias = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "品牌简称或别名。"),
LogoUrl = table.Column<string>(type: "text", nullable: true, comment: "品牌 Logo。"),
Category = table.Column<string>(type: "text", nullable: true, comment: "品牌所属品类,如火锅、咖啡等。"),
BusinessLicenseNumber = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "营业执照号。"),
BusinessLicenseImageUrl = table.Column<string>(type: "text", nullable: true, comment: "营业执照扫描件地址。"),
TaxNumber = table.Column<string>(type: "text", nullable: true, comment: "税号/统一社会信用代码。"),
LegalPerson = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "法人或负责人姓名。"),
ContactPhone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "联系电话。"),
ContactEmail = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "联系邮箱。"),
ServicePhone = table.Column<string>(type: "text", nullable: true, comment: "客服电话。"),
SupportEmail = table.Column<string>(type: "text", nullable: true, comment: "客服邮箱。"),
Province = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在省份。"),
City = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在城市。"),
District = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在区县。"),
Address = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "详细地址。"),
Longitude = table.Column<double>(type: "double precision", nullable: true, comment: "经度信息。"),
Latitude = table.Column<double>(type: "double precision", nullable: true, comment: "纬度信息。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "入驻状态。"),
ReviewRemarks = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "审核备注或驳回原因。"),
JoinedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "入驻时间。"),
LastReviewedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次审核时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_merchants", x => x.Id);
},
comment: "商户主体信息,承载入驻和资质审核结果。");
migrationBuilder.CreateTable(
name: "metric_alert_rules",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MetricDefinitionId = table.Column<long>(type: "bigint", nullable: false, comment: "关联指标。"),
ConditionJson = table.Column<string>(type: "text", nullable: false, comment: "触发条件 JSON。"),
Severity = table.Column<int>(type: "integer", nullable: false, comment: "告警级别。"),
NotificationChannels = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false, comment: "通知渠道。"),
Enabled = table.Column<bool>(type: "boolean", nullable: false, comment: "是否启用。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_metric_alert_rules", x => x.Id);
},
comment: "指标告警规则。");
migrationBuilder.CreateTable(
name: "metric_definitions",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Code = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "指标编码。"),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "指标名称。"),
Description = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "说明。"),
DimensionsJson = table.Column<string>(type: "text", nullable: true, comment: "维度描述 JSON。"),
DefaultAggregation = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "默认聚合方式。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_metric_definitions", x => x.Id);
},
comment: "指标定义,描述可观测的数据点。");
migrationBuilder.CreateTable(
name: "metric_snapshots",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MetricDefinitionId = table.Column<long>(type: "bigint", nullable: false, comment: "指标定义 ID。"),
DimensionKey = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false, comment: "维度键JSON。"),
WindowStart = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "统计时间窗口开始。"),
WindowEnd = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "统计时间窗口结束。"),
Value = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false, comment: "数值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_metric_snapshots", x => x.Id);
},
comment: "指标快照,用于大盘展示。");
migrationBuilder.CreateTable(
name: "navigation_requests",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户 ID。"),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店 ID。"),
Channel = table.Column<int>(type: "integer", nullable: false, comment: "来源通道小程序、H5 等)。"),
TargetApp = table.Column<int>(type: "integer", nullable: false, comment: "跳转的地图应用。"),
RequestedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "请求时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_navigation_requests", x => x.Id);
},
comment: "用户发起的导航请求日志。");
migrationBuilder.CreateTable(
name: "order_status_histories",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "订单标识。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "变更后的状态。"),
OperatorId = table.Column<long>(type: "bigint", nullable: true, comment: "操作人标识(可为空表示系统)。"),
Notes = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注信息。"),
OccurredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "发生时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_order_status_histories", x => x.Id);
},
comment: "订单状态流转记录。");
migrationBuilder.CreateTable(
name: "orders",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrderNo = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "订单号。"),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店。"),
Channel = table.Column<int>(type: "integer", nullable: false, comment: "下单渠道。"),
DeliveryType = table.Column<int>(type: "integer", nullable: false, comment: "履约类型。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "当前状态。"),
PaymentStatus = table.Column<int>(type: "integer", nullable: false, comment: "支付状态。"),
CustomerName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "顾客姓名。"),
CustomerPhone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "顾客手机号。"),
TableNo = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "就餐桌号。"),
QueueNumber = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "排队号(如有)。"),
ReservationId = table.Column<long>(type: "bigint", nullable: true, comment: "预约 ID。"),
ItemsAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "商品总额。"),
DiscountAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "优惠金额。"),
PayableAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "应付金额。"),
PaidAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "实付金额。"),
PaidAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "支付时间。"),
FinishedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "完成时间。"),
CancelledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "取消时间。"),
CancelReason = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "取消原因。"),
Remark = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_orders", x => x.Id);
},
comment: "交易订单。");
migrationBuilder.CreateTable(
name: "payment_records",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "关联订单。"),
Method = table.Column<int>(type: "integer", nullable: false, comment: "支付方式。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "支付状态。"),
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "支付金额。"),
TradeNo = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "平台交易号。"),
ChannelTransactionId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "第三方渠道单号。"),
PaidAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "支付完成时间。"),
Remark = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "错误/备注。"),
Payload = table.Column<string>(type: "text", nullable: true, comment: "原始回调内容。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_payment_records", x => x.Id);
},
comment: "支付流水。");
migrationBuilder.CreateTable(
name: "payment_refund_records",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
PaymentRecordId = table.Column<long>(type: "bigint", nullable: false, comment: "原支付记录标识。"),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "关联订单标识。"),
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "退款金额。"),
ChannelRefundId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "渠道退款流水号。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "退款状态。"),
RequestedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "退款请求时间。"),
CompletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "完成时间。"),
Payload = table.Column<string>(type: "text", nullable: true, comment: "渠道返回的原始数据 JSON。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_payment_refund_records", x => x.Id);
},
comment: "支付渠道退款流水。");
migrationBuilder.CreateTable(
name: "product_addon_groups",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商品。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "分组名称。"),
SelectionType = table.Column<int>(type: "integer", nullable: false, comment: "选择类型。"),
MinSelect = table.Column<int>(type: "integer", nullable: true, comment: "最小选择数量。"),
MaxSelect = table.Column<int>(type: "integer", nullable: true, comment: "最大选择数量。"),
IsRequired = table.Column<bool>(type: "boolean", nullable: false, comment: "是否必选。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_addon_groups", x => x.Id);
},
comment: "加料/做法分组。");
migrationBuilder.CreateTable(
name: "product_addon_options",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
AddonGroupId = table.Column<long>(type: "bigint", nullable: false, comment: "所属加料分组。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "选项名称。"),
ExtraPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "附加价格。"),
IsDefault = table.Column<bool>(type: "boolean", nullable: false, comment: "是否默认选项。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_addon_options", x => x.Id);
},
comment: "加料选项。");
migrationBuilder.CreateTable(
name: "product_attribute_groups",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: true, comment: "关联门店,可为空表示所有门店共享。"),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商品标识。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "分组名称,例如“辣度”“份量”。"),
SelectionType = table.Column<int>(type: "integer", nullable: false, comment: "选择类型(单选/多选)。"),
IsRequired = table.Column<bool>(type: "boolean", nullable: false, comment: "是否必选。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "显示排序。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_attribute_groups", x => x.Id);
},
comment: "商品规格/属性分组。");
migrationBuilder.CreateTable(
name: "product_attribute_options",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
AttributeGroupId = table.Column<long>(type: "bigint", nullable: false, comment: "所属规格组。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "选项名称。"),
ExtraPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "附加价格。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序。"),
IsDefault = table.Column<bool>(type: "boolean", nullable: false, comment: "是否默认选中。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_attribute_options", x => x.Id);
},
comment: "商品规格选项。");
migrationBuilder.CreateTable(
name: "product_categories",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "所属门店。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "分类名称。"),
Description = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "分类描述。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
IsEnabled = table.Column<bool>(type: "boolean", nullable: false, comment: "是否启用。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_categories", x => x.Id);
},
comment: "商品分类。");
migrationBuilder.CreateTable(
name: "product_media_assets",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "商品标识。"),
MediaType = table.Column<int>(type: "integer", nullable: false, comment: "媒体类型。"),
Url = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: false, comment: "媒资链接。"),
Caption = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "描述或标题。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_media_assets", x => x.Id);
},
comment: "商品媒资素材。");
migrationBuilder.CreateTable(
name: "product_pricing_rules",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商品。"),
RuleType = table.Column<int>(type: "integer", nullable: false, comment: "策略类型。"),
ConditionsJson = table.Column<string>(type: "text", nullable: false, comment: "条件描述JSON如会员等级、渠道等。"),
Price = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "特殊价格。"),
StartTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "生效开始时间。"),
EndTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "生效结束时间。"),
WeekdaysJson = table.Column<string>(type: "text", nullable: true, comment: "生效星期JSON 数组)。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_pricing_rules", x => x.Id);
},
comment: "商品价格策略,支持会员价/时段价等。");
migrationBuilder.CreateTable(
name: "product_skus",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商品标识。"),
SkuCode = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "SKU 编码。"),
Barcode = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "条形码。"),
Price = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "售价。"),
OriginalPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "原价。"),
StockQuantity = table.Column<int>(type: "integer", nullable: true, comment: "可售库存。"),
Weight = table.Column<decimal>(type: "numeric(10,3)", precision: 10, scale: 3, nullable: true, comment: "重量(千克)。"),
AttributesJson = table.Column<string>(type: "text", nullable: false, comment: "规格属性 JSON记录选项 ID。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_product_skus", x => x.Id);
},
comment: "商品 SKU记录具体规格组合价格。");
migrationBuilder.CreateTable(
name: "products",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "所属门店。"),
CategoryId = table.Column<long>(type: "bigint", nullable: false, comment: "所属分类。"),
SpuCode = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "商品编码。"),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "商品名称。"),
Subtitle = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "副标题/卖点。"),
Unit = table.Column<string>(type: "character varying(16)", maxLength: 16, nullable: true, comment: "售卖单位(份/杯等)。"),
Price = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "现价。"),
OriginalPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "原价。"),
StockQuantity = table.Column<int>(type: "integer", nullable: true, comment: "库存数量(可选)。"),
MaxQuantityPerOrder = table.Column<int>(type: "integer", nullable: true, comment: "最大每单限购。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "商品状态。"),
CoverImage = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "主图。"),
GalleryImages = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: true, comment: "Gallery 图片逗号分隔。"),
Description = table.Column<string>(type: "text", nullable: true, comment: "商品描述。"),
EnableDineIn = table.Column<bool>(type: "boolean", nullable: false, comment: "支持堂食。"),
EnablePickup = table.Column<bool>(type: "boolean", nullable: false, comment: "支持自提。"),
EnableDelivery = table.Column<bool>(type: "boolean", nullable: false, comment: "支持配送。"),
IsFeatured = table.Column<bool>(type: "boolean", nullable: false, comment: "是否热门推荐。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_products", x => x.Id);
},
comment: "商品SPU信息。");
migrationBuilder.CreateTable(
name: "promotion_campaigns",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "活动名称。"),
PromotionType = table.Column<int>(type: "integer", nullable: false, comment: "活动类型。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "活动状态。"),
StartAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "开始时间。"),
EndAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "结束时间。"),
Budget = table.Column<decimal>(type: "numeric", nullable: true, comment: "预算金额。"),
RulesJson = table.Column<string>(type: "text", nullable: false, comment: "活动规则 JSON。"),
AudienceDescription = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "目标人群描述。"),
BannerUrl = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "营销素材(如 banner。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_promotion_campaigns", x => x.Id);
},
comment: "营销活动配置。");
migrationBuilder.CreateTable(
name: "queue_tickets",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false),
TicketNumber = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "排队编号。"),
PartySize = table.Column<int>(type: "integer", nullable: false, comment: "就餐人数。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
EstimatedWaitMinutes = table.Column<int>(type: "integer", nullable: true, comment: "预计等待分钟。"),
CalledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "叫号时间。"),
ExpiredAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "过号时间。"),
CancelledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "取消时间。"),
Remark = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_queue_tickets", x => x.Id);
},
comment: "排队叫号。");
migrationBuilder.CreateTable(
name: "refund_requests",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "关联订单标识。"),
RefundNo = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "退款单号。"),
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "申请金额。"),
Reason = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false, comment: "申请原因。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "退款状态。"),
RequestedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "用户提交时间。"),
ProcessedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "审核完成时间。"),
ReviewNotes = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "审核备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_refund_requests", x => x.Id);
},
comment: "售后/退款申请。");
migrationBuilder.CreateTable(
name: "reservations",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店。"),
ReservationNo = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "预约号。"),
CustomerName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "客户姓名。"),
CustomerPhone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "联系电话。"),
PeopleCount = table.Column<int>(type: "integer", nullable: false, comment: "用餐人数。"),
ReservationTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "预约时间UTC。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
TablePreference = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "桌型/标签。"),
Remark = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注。"),
CheckInCode = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "核销码/到店码。"),
CheckedInAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "实际签到时间。"),
CancelledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "取消时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_reservations", x => x.Id);
},
comment: "预约/预订记录。");
migrationBuilder.CreateTable(
name: "shopping_carts",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<long>(type: "bigint", nullable: false, comment: "用户标识。"),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "购物车状态,包含正常/锁定。"),
TableContext = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "桌码或场景标识(扫码点餐)。"),
DeliveryPreference = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "履约方式(堂食/自提/配送)缓存。"),
LastModifiedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "最近一次修改时间UTC。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_shopping_carts", x => x.Id);
},
comment: "用户购物车,按租户/门店隔离。");
migrationBuilder.CreateTable(
name: "store_business_hours",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
DayOfWeek = table.Column<int>(type: "integer", nullable: false, comment: "星期几0 表示周日。"),
HourType = table.Column<int>(type: "integer", nullable: false, comment: "时段类型(正常营业、休息、预约等)。"),
StartTime = table.Column<TimeSpan>(type: "interval", nullable: false, comment: "开始时间(本地时间)。"),
EndTime = table.Column<TimeSpan>(type: "interval", nullable: false, comment: "结束时间(本地时间)。"),
CapacityLimit = table.Column<int>(type: "integer", nullable: true, comment: "最大接待容量或单量限制。"),
Notes = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_store_business_hours", x => x.Id);
},
comment: "门店营业时段配置。");
migrationBuilder.CreateTable(
name: "store_delivery_zones",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
ZoneName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "区域名称。"),
PolygonGeoJson = table.Column<string>(type: "text", nullable: false, comment: "GeoJSON 表示的多边形范围。"),
MinimumOrderAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "起送价。"),
DeliveryFee = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "配送费。"),
EstimatedMinutes = table.Column<int>(type: "integer", nullable: true, comment: "预计送达分钟。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_store_delivery_zones", x => x.Id);
},
comment: "门店配送范围配置。");
migrationBuilder.CreateTable(
name: "store_employee_shifts",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
StaffId = table.Column<long>(type: "bigint", nullable: false, comment: "员工标识。"),
ShiftDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "班次日期。"),
StartTime = table.Column<TimeSpan>(type: "interval", nullable: false, comment: "开始时间。"),
EndTime = table.Column<TimeSpan>(type: "interval", nullable: false, comment: "结束时间。"),
RoleType = table.Column<int>(type: "integer", nullable: false, comment: "排班角色。"),
Notes = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_store_employee_shifts", x => x.Id);
},
comment: "门店员工排班记录。");
migrationBuilder.CreateTable(
name: "store_holidays",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "日期。"),
IsClosed = table.Column<bool>(type: "boolean", nullable: false, comment: "是否全天闭店。"),
Reason = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "说明内容。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_store_holidays", x => x.Id);
},
comment: "门店休息日或特殊营业日。");
migrationBuilder.CreateTable(
name: "store_table_areas",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
Name = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "区域名称。"),
Description = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "区域描述。"),
SortOrder = table.Column<int>(type: "integer", nullable: false, comment: "排序值。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_store_table_areas", x => x.Id);
},
comment: "门店桌台区域配置。");
migrationBuilder.CreateTable(
name: "store_tables",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column<long>(type: "bigint", nullable: false, comment: "门店标识。"),
AreaId = table.Column<long>(type: "bigint", nullable: true, comment: "所在区域 ID。"),
TableCode = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "桌码。"),
Capacity = table.Column<int>(type: "integer", nullable: false, comment: "可容纳人数。"),
Tags = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "桌台标签(堂食、快餐等)。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "当前桌台状态。"),
QrCodeUrl = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "桌码二维码地址。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_store_tables", x => x.Id);
},
comment: "桌台信息与二维码绑定。");
migrationBuilder.CreateTable(
name: "stores",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MerchantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属商户标识。"),
Code = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "门店编码,便于扫码及外部对接。"),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "门店名称。"),
Phone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "联系电话。"),
ManagerName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "门店负责人姓名。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "门店当前运营状态。"),
Country = table.Column<string>(type: "text", nullable: true, comment: "所在国家或地区。"),
Province = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在省份。"),
City = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在城市。"),
District = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "区县信息。"),
Address = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "详细地址。"),
Longitude = table.Column<double>(type: "double precision", nullable: true, comment: "高德/腾讯地图经度。"),
Latitude = table.Column<double>(type: "double precision", nullable: true, comment: "纬度。"),
Description = table.Column<string>(type: "text", nullable: true, comment: "门店描述或公告。"),
BusinessHours = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "门店营业时段描述(备用字符串)。"),
SupportsDineIn = table.Column<bool>(type: "boolean", nullable: false, comment: "是否支持堂食。"),
SupportsPickup = table.Column<bool>(type: "boolean", nullable: false, comment: "是否支持自提。"),
SupportsDelivery = table.Column<bool>(type: "boolean", nullable: false, comment: "是否支持配送。"),
SupportsReservation = table.Column<bool>(type: "boolean", nullable: false, comment: "支持预约。"),
SupportsQueueing = table.Column<bool>(type: "boolean", nullable: false, comment: "支持排队叫号。"),
DeliveryRadiusKm = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false, comment: "默认配送半径(公里)。"),
Announcement = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "门店公告。"),
Tags = table.Column<string>(type: "text", nullable: true, comment: "门店标签(逗号分隔)。"),
CoverImageUrl = table.Column<string>(type: "text", nullable: true, comment: "门店海报。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_stores", x => x.Id);
},
comment: "门店信息,承载营业配置与能力。");
migrationBuilder.CreateTable(
name: "support_tickets",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
TicketNo = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false, comment: "工单编号。"),
CustomerUserId = table.Column<long>(type: "bigint", nullable: false, comment: "客户用户 ID。"),
OrderId = table.Column<long>(type: "bigint", nullable: true, comment: "关联订单(如有)。"),
Subject = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "工单主题。"),
Description = table.Column<string>(type: "text", nullable: false, comment: "工单详情。"),
Priority = table.Column<int>(type: "integer", nullable: false, comment: "优先级。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "状态。"),
AssignedAgentId = table.Column<long>(type: "bigint", nullable: true, comment: "指派的客服。"),
ClosedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "关闭时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_support_tickets", x => x.Id);
},
comment: "客服工单。");
migrationBuilder.CreateTable(
name: "tenant_billing_statements",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StatementNo = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "账单编号,供对账查询。"),
PeriodStart = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "账单周期开始时间。"),
PeriodEnd = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "账单周期结束时间。"),
AmountDue = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "应付金额。"),
AmountPaid = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "实付金额。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "当前付款状态。"),
DueDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "到期日。"),
LineItemsJson = table.Column<string>(type: "text", nullable: true, comment: "账单明细 JSON记录各项费用。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_tenant_billing_statements", x => x.Id);
},
comment: "租户账单,用于呈现周期性收费。");
migrationBuilder.CreateTable(
name: "tenant_notifications",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Title = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "通知标题。"),
Message = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: false, comment: "通知正文。"),
Channel = table.Column<int>(type: "integer", nullable: false, comment: "发布通道(站内、邮件、短信等)。"),
Severity = table.Column<int>(type: "integer", nullable: false, comment: "通知重要级别。"),
SentAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "推送时间。"),
ReadAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "租户是否已阅读。"),
MetadataJson = table.Column<string>(type: "text", nullable: true, comment: "附加元数据 JSON。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_tenant_notifications", x => x.Id);
},
comment: "面向租户的站内通知或消息推送。");
migrationBuilder.CreateTable(
name: "tenant_packages",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "套餐名称,展示给租户的简称。"),
Description = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "套餐描述,包含适用场景、权益等。"),
PackageType = table.Column<int>(type: "integer", nullable: false, comment: "套餐分类(试用、标准、旗舰等)。"),
MonthlyPrice = table.Column<decimal>(type: "numeric", nullable: true, comment: "月付价格,单位:人民币元。"),
YearlyPrice = table.Column<decimal>(type: "numeric", nullable: true, comment: "年付价格,单位:人民币元。"),
MaxStoreCount = table.Column<int>(type: "integer", nullable: true, comment: "允许的最大门店数。"),
MaxAccountCount = table.Column<int>(type: "integer", nullable: true, comment: "允许创建的最大账号数。"),
MaxStorageGb = table.Column<int>(type: "integer", nullable: true, comment: "存储容量上限GB。"),
MaxSmsCredits = table.Column<int>(type: "integer", nullable: true, comment: "每月短信额度上限。"),
MaxDeliveryOrders = table.Column<int>(type: "integer", nullable: true, comment: "每月可调用的配送单数量上限。"),
FeaturePoliciesJson = table.Column<string>(type: "text", nullable: true, comment: "权益明细 JSON记录自定义特性开关。"),
IsActive = table.Column<bool>(type: "boolean", nullable: false, comment: "是否仍可售卖。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。")
},
constraints: table =>
{
table.PrimaryKey("PK_tenant_packages", x => x.Id);
},
comment: "平台提供的租户套餐定义。");
migrationBuilder.CreateTable(
name: "tenant_quota_usages",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
QuotaType = table.Column<int>(type: "integer", nullable: false, comment: "配额类型,例如门店数、短信条数等。"),
LimitValue = table.Column<decimal>(type: "numeric", nullable: false, comment: "当前配额上限。"),
UsedValue = table.Column<decimal>(type: "numeric", nullable: false, comment: "已消耗的数量。"),
ResetCycle = table.Column<string>(type: "text", nullable: true, comment: "配额刷新周期描述(如月、年)。"),
LastResetAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次重置时间。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_tenant_quota_usages", x => x.Id);
},
comment: "租户配额使用情况快照。");
migrationBuilder.CreateTable(
name: "tenant_subscriptions",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
TenantPackageId = table.Column<long>(type: "bigint", nullable: false, comment: "当前订阅关联的套餐标识。"),
EffectiveFrom = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "订阅生效时间UTC。"),
EffectiveTo = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "订阅到期时间UTC。"),
NextBillingDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "下一个计费时间,配合自动续费使用。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "订阅当前状态。"),
AutoRenew = table.Column<bool>(type: "boolean", nullable: false, comment: "是否开启自动续费。"),
ScheduledPackageId = table.Column<long>(type: "bigint", nullable: true, comment: "若已排期升降配,对应的新套餐 ID。"),
Notes = table.Column<string>(type: "text", nullable: true, comment: "运营备注信息。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_tenant_subscriptions", x => x.Id);
},
comment: "租户套餐订阅记录。");
migrationBuilder.CreateTable(
name: "tenants",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Code = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false, comment: "租户短编码,作为跨系统引用的唯一标识。"),
Name = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "租户全称或品牌名称。"),
ShortName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "对外展示的简称。"),
LegalEntityName = table.Column<string>(type: "text", nullable: true, comment: "法人或公司主体名称。"),
Industry = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所属行业,如餐饮、零售等。"),
LogoUrl = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "LOGO 图片地址。"),
CoverImageUrl = table.Column<string>(type: "text", nullable: true, comment: "品牌海报或封面图。"),
Website = table.Column<string>(type: "text", nullable: true, comment: "官网或主要宣传链接。"),
Country = table.Column<string>(type: "text", nullable: true, comment: "所在国家/地区。"),
Province = table.Column<string>(type: "text", nullable: true, comment: "所在省份或州。"),
City = table.Column<string>(type: "text", nullable: true, comment: "所在城市。"),
Address = table.Column<string>(type: "text", nullable: true, comment: "详细地址信息。"),
ContactName = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true, comment: "主联系人姓名。"),
ContactPhone = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: true, comment: "主联系人电话。"),
ContactEmail = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "主联系人邮箱。"),
PrimaryOwnerUserId = table.Column<long>(type: "bigint", nullable: true, comment: "系统内对应的租户所有者账号 ID。"),
Status = table.Column<int>(type: "integer", nullable: false, comment: "租户当前状态,涵盖审核、启用、停用等场景。"),
EffectiveFrom = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "服务生效时间UTC。"),
EffectiveTo = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "服务到期时间UTC。"),
SuspendedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次暂停服务时间。"),
SuspensionReason = table.Column<string>(type: "text", nullable: true, comment: "暂停或终止的原因说明。"),
Tags = table.Column<string>(type: "text", nullable: true, comment: "业务标签集合(逗号分隔)。"),
Remarks = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注信息,用于运营记录特殊说明。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。")
},
constraints: table =>
{
table.PrimaryKey("PK_tenants", x => x.Id);
},
comment: "平台租户信息,描述租户的生命周期与基础资料。");
migrationBuilder.CreateTable(
name: "ticket_comments",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SupportTicketId = table.Column<long>(type: "bigint", nullable: false, comment: "工单标识。"),
AuthorUserId = table.Column<long>(type: "bigint", nullable: true, comment: "评论人 ID。"),
Content = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: false, comment: "评论内容。"),
IsInternal = table.Column<bool>(type: "boolean", nullable: false, comment: "是否内部备注。"),
AttachmentsJson = table.Column<string>(type: "text", nullable: true, comment: "附件 JSON。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_ticket_comments", x => x.Id);
},
comment: "工单评论/流转记录。");
migrationBuilder.CreateTable(
name: "order_items",
columns: table => new
{
Id = table.Column<long>(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
OrderId = table.Column<long>(type: "bigint", nullable: false, comment: "订单 ID。"),
ProductId = table.Column<long>(type: "bigint", nullable: false, comment: "商品 ID。"),
ProductName = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: false, comment: "商品名称。"),
SkuName = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, comment: "SKU/规格描述。"),
Unit = table.Column<string>(type: "character varying(16)", maxLength: 16, nullable: true, comment: "单位。"),
Quantity = table.Column<int>(type: "integer", nullable: false, comment: "数量。"),
UnitPrice = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "单价。"),
DiscountAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "折扣金额。"),
SubTotal = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "小计。"),
AttributesJson = table.Column<string>(type: "text", nullable: true, comment: "自定义属性 JSON。"),
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, comment: "创建时间UTC。"),
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间UTC从未更新时为 null。"),
DeletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "软删除时间UTC未删除时为 null。"),
CreatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"),
UpdatedBy = table.Column<long>(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"),
DeletedBy = table.Column<long>(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"),
TenantId = table.Column<long>(type: "bigint", nullable: false, comment: "所属租户 ID。")
},
constraints: table =>
{
table.PrimaryKey("PK_order_items", x => x.Id);
table.ForeignKey(
name: "FK_order_items_orders_OrderId",
column: x => x.OrderId,
principalTable: "orders",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
},
comment: "订单明细。");
migrationBuilder.CreateIndex(
name: "IX_affiliate_orders_TenantId_AffiliatePartnerId_OrderId",
table: "affiliate_orders",
columns: new[] { "TenantId", "AffiliatePartnerId", "OrderId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_affiliate_partners_TenantId_DisplayName",
table: "affiliate_partners",
columns: new[] { "TenantId", "DisplayName" });
migrationBuilder.CreateIndex(
name: "IX_affiliate_payouts_TenantId_AffiliatePartnerId_Period",
table: "affiliate_payouts",
columns: new[] { "TenantId", "AffiliatePartnerId", "Period" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_cart_items_TenantId_ShoppingCartId",
table: "cart_items",
columns: new[] { "TenantId", "ShoppingCartId" });
migrationBuilder.CreateIndex(
name: "IX_chat_messages_TenantId_ChatSessionId_CreatedAt",
table: "chat_messages",
columns: new[] { "TenantId", "ChatSessionId", "CreatedAt" });
migrationBuilder.CreateIndex(
name: "IX_chat_sessions_TenantId_SessionCode",
table: "chat_sessions",
columns: new[] { "TenantId", "SessionCode" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_checkin_campaigns_TenantId_Name",
table: "checkin_campaigns",
columns: new[] { "TenantId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_checkin_records_TenantId_CheckInCampaignId_UserId_CheckInDa~",
table: "checkin_records",
columns: new[] { "TenantId", "CheckInCampaignId", "UserId", "CheckInDate" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_checkout_sessions_TenantId_SessionToken",
table: "checkout_sessions",
columns: new[] { "TenantId", "SessionToken" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_community_comments_TenantId_PostId_CreatedAt",
table: "community_comments",
columns: new[] { "TenantId", "PostId", "CreatedAt" });
migrationBuilder.CreateIndex(
name: "IX_community_posts_TenantId_AuthorUserId_CreatedAt",
table: "community_posts",
columns: new[] { "TenantId", "AuthorUserId", "CreatedAt" });
migrationBuilder.CreateIndex(
name: "IX_community_reactions_TenantId_PostId_UserId",
table: "community_reactions",
columns: new[] { "TenantId", "PostId", "UserId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_coupons_TenantId_Code",
table: "coupons",
columns: new[] { "TenantId", "Code" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_delivery_events_TenantId_DeliveryOrderId_EventType",
table: "delivery_events",
columns: new[] { "TenantId", "DeliveryOrderId", "EventType" });
migrationBuilder.CreateIndex(
name: "IX_delivery_orders_TenantId_OrderId",
table: "delivery_orders",
columns: new[] { "TenantId", "OrderId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_group_orders_TenantId_GroupOrderNo",
table: "group_orders",
columns: new[] { "TenantId", "GroupOrderNo" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_group_participants_TenantId_GroupOrderId_UserId",
table: "group_participants",
columns: new[] { "TenantId", "GroupOrderId", "UserId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_inventory_adjustments_TenantId_InventoryItemId_OccurredAt",
table: "inventory_adjustments",
columns: new[] { "TenantId", "InventoryItemId", "OccurredAt" });
migrationBuilder.CreateIndex(
name: "IX_inventory_batches_TenantId_StoreId_ProductSkuId_BatchNumber",
table: "inventory_batches",
columns: new[] { "TenantId", "StoreId", "ProductSkuId", "BatchNumber" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_inventory_items_TenantId_StoreId_ProductSkuId_BatchNumber",
table: "inventory_items",
columns: new[] { "TenantId", "StoreId", "ProductSkuId", "BatchNumber" });
migrationBuilder.CreateIndex(
name: "IX_map_locations_TenantId_StoreId",
table: "map_locations",
columns: new[] { "TenantId", "StoreId" });
migrationBuilder.CreateIndex(
name: "IX_member_growth_logs_TenantId_MemberId_OccurredAt",
table: "member_growth_logs",
columns: new[] { "TenantId", "MemberId", "OccurredAt" });
migrationBuilder.CreateIndex(
name: "IX_member_point_ledgers_TenantId_MemberId_OccurredAt",
table: "member_point_ledgers",
columns: new[] { "TenantId", "MemberId", "OccurredAt" });
migrationBuilder.CreateIndex(
name: "IX_member_profiles_TenantId_Mobile",
table: "member_profiles",
columns: new[] { "TenantId", "Mobile" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_member_tiers_TenantId_Name",
table: "member_tiers",
columns: new[] { "TenantId", "Name" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_merchant_contracts_TenantId_MerchantId_ContractNumber",
table: "merchant_contracts",
columns: new[] { "TenantId", "MerchantId", "ContractNumber" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_merchant_documents_TenantId_MerchantId_DocumentType",
table: "merchant_documents",
columns: new[] { "TenantId", "MerchantId", "DocumentType" });
migrationBuilder.CreateIndex(
name: "IX_merchant_staff_TenantId_MerchantId_Phone",
table: "merchant_staff",
columns: new[] { "TenantId", "MerchantId", "Phone" });
migrationBuilder.CreateIndex(
name: "IX_merchants_TenantId",
table: "merchants",
column: "TenantId");
migrationBuilder.CreateIndex(
name: "IX_metric_alert_rules_TenantId_MetricDefinitionId_Severity",
table: "metric_alert_rules",
columns: new[] { "TenantId", "MetricDefinitionId", "Severity" });
migrationBuilder.CreateIndex(
name: "IX_metric_definitions_TenantId_Code",
table: "metric_definitions",
columns: new[] { "TenantId", "Code" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_metric_snapshots_TenantId_MetricDefinitionId_DimensionKey_W~",
table: "metric_snapshots",
columns: new[] { "TenantId", "MetricDefinitionId", "DimensionKey", "WindowStart", "WindowEnd" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_navigation_requests_TenantId_UserId_StoreId_RequestedAt",
table: "navigation_requests",
columns: new[] { "TenantId", "UserId", "StoreId", "RequestedAt" });
migrationBuilder.CreateIndex(
name: "IX_order_items_OrderId",
table: "order_items",
column: "OrderId");
migrationBuilder.CreateIndex(
name: "IX_order_items_TenantId_OrderId",
table: "order_items",
columns: new[] { "TenantId", "OrderId" });
migrationBuilder.CreateIndex(
name: "IX_order_status_histories_TenantId_OrderId_OccurredAt",
table: "order_status_histories",
columns: new[] { "TenantId", "OrderId", "OccurredAt" });
migrationBuilder.CreateIndex(
name: "IX_orders_TenantId_OrderNo",
table: "orders",
columns: new[] { "TenantId", "OrderNo" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_orders_TenantId_StoreId_Status",
table: "orders",
columns: new[] { "TenantId", "StoreId", "Status" });
migrationBuilder.CreateIndex(
name: "IX_payment_records_TenantId_OrderId",
table: "payment_records",
columns: new[] { "TenantId", "OrderId" });
migrationBuilder.CreateIndex(
name: "IX_payment_refund_records_TenantId_PaymentRecordId",
table: "payment_refund_records",
columns: new[] { "TenantId", "PaymentRecordId" });
migrationBuilder.CreateIndex(
name: "IX_product_addon_groups_TenantId_ProductId_Name",
table: "product_addon_groups",
columns: new[] { "TenantId", "ProductId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_product_attribute_groups_TenantId_StoreId_Name",
table: "product_attribute_groups",
columns: new[] { "TenantId", "StoreId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_product_attribute_options_TenantId_AttributeGroupId_Name",
table: "product_attribute_options",
columns: new[] { "TenantId", "AttributeGroupId", "Name" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_product_categories_TenantId_StoreId",
table: "product_categories",
columns: new[] { "TenantId", "StoreId" });
migrationBuilder.CreateIndex(
name: "IX_product_pricing_rules_TenantId_ProductId_RuleType",
table: "product_pricing_rules",
columns: new[] { "TenantId", "ProductId", "RuleType" });
migrationBuilder.CreateIndex(
name: "IX_product_skus_TenantId_SkuCode",
table: "product_skus",
columns: new[] { "TenantId", "SkuCode" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_products_TenantId_SpuCode",
table: "products",
columns: new[] { "TenantId", "SpuCode" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_products_TenantId_StoreId",
table: "products",
columns: new[] { "TenantId", "StoreId" });
migrationBuilder.CreateIndex(
name: "IX_queue_tickets_TenantId_StoreId",
table: "queue_tickets",
columns: new[] { "TenantId", "StoreId" });
migrationBuilder.CreateIndex(
name: "IX_queue_tickets_TenantId_StoreId_TicketNumber",
table: "queue_tickets",
columns: new[] { "TenantId", "StoreId", "TicketNumber" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_refund_requests_TenantId_RefundNo",
table: "refund_requests",
columns: new[] { "TenantId", "RefundNo" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_reservations_TenantId_ReservationNo",
table: "reservations",
columns: new[] { "TenantId", "ReservationNo" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_reservations_TenantId_StoreId",
table: "reservations",
columns: new[] { "TenantId", "StoreId" });
migrationBuilder.CreateIndex(
name: "IX_shopping_carts_TenantId_UserId_StoreId",
table: "shopping_carts",
columns: new[] { "TenantId", "UserId", "StoreId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_store_business_hours_TenantId_StoreId_DayOfWeek",
table: "store_business_hours",
columns: new[] { "TenantId", "StoreId", "DayOfWeek" });
migrationBuilder.CreateIndex(
name: "IX_store_delivery_zones_TenantId_StoreId_ZoneName",
table: "store_delivery_zones",
columns: new[] { "TenantId", "StoreId", "ZoneName" });
migrationBuilder.CreateIndex(
name: "IX_store_employee_shifts_TenantId_StoreId_ShiftDate_StaffId",
table: "store_employee_shifts",
columns: new[] { "TenantId", "StoreId", "ShiftDate", "StaffId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_store_holidays_TenantId_StoreId_Date",
table: "store_holidays",
columns: new[] { "TenantId", "StoreId", "Date" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_store_table_areas_TenantId_StoreId_Name",
table: "store_table_areas",
columns: new[] { "TenantId", "StoreId", "Name" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_store_tables_TenantId_StoreId_TableCode",
table: "store_tables",
columns: new[] { "TenantId", "StoreId", "TableCode" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_stores_TenantId_Code",
table: "stores",
columns: new[] { "TenantId", "Code" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_stores_TenantId_MerchantId",
table: "stores",
columns: new[] { "TenantId", "MerchantId" });
migrationBuilder.CreateIndex(
name: "IX_support_tickets_TenantId_TicketNo",
table: "support_tickets",
columns: new[] { "TenantId", "TicketNo" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_tenant_billing_statements_TenantId_StatementNo",
table: "tenant_billing_statements",
columns: new[] { "TenantId", "StatementNo" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_tenant_notifications_TenantId_Channel_SentAt",
table: "tenant_notifications",
columns: new[] { "TenantId", "Channel", "SentAt" });
migrationBuilder.CreateIndex(
name: "IX_tenant_quota_usages_TenantId_QuotaType",
table: "tenant_quota_usages",
columns: new[] { "TenantId", "QuotaType" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_tenant_subscriptions_TenantId_TenantPackageId",
table: "tenant_subscriptions",
columns: new[] { "TenantId", "TenantPackageId" });
migrationBuilder.CreateIndex(
name: "IX_tenants_Code",
table: "tenants",
column: "Code",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_ticket_comments_TenantId_SupportTicketId",
table: "ticket_comments",
columns: new[] { "TenantId", "SupportTicketId" });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "affiliate_orders");
migrationBuilder.DropTable(
name: "affiliate_partners");
migrationBuilder.DropTable(
name: "affiliate_payouts");
migrationBuilder.DropTable(
name: "cart_item_addons");
migrationBuilder.DropTable(
name: "cart_items");
migrationBuilder.DropTable(
name: "chat_messages");
migrationBuilder.DropTable(
name: "chat_sessions");
migrationBuilder.DropTable(
name: "checkin_campaigns");
migrationBuilder.DropTable(
name: "checkin_records");
migrationBuilder.DropTable(
name: "checkout_sessions");
migrationBuilder.DropTable(
name: "community_comments");
migrationBuilder.DropTable(
name: "community_posts");
migrationBuilder.DropTable(
name: "community_reactions");
migrationBuilder.DropTable(
name: "coupon_templates");
migrationBuilder.DropTable(
name: "coupons");
migrationBuilder.DropTable(
name: "delivery_events");
migrationBuilder.DropTable(
name: "delivery_orders");
migrationBuilder.DropTable(
name: "group_orders");
migrationBuilder.DropTable(
name: "group_participants");
migrationBuilder.DropTable(
name: "inventory_adjustments");
migrationBuilder.DropTable(
name: "inventory_batches");
migrationBuilder.DropTable(
name: "inventory_items");
migrationBuilder.DropTable(
name: "map_locations");
migrationBuilder.DropTable(
name: "member_growth_logs");
migrationBuilder.DropTable(
name: "member_point_ledgers");
migrationBuilder.DropTable(
name: "member_profiles");
migrationBuilder.DropTable(
name: "member_tiers");
migrationBuilder.DropTable(
name: "merchant_contracts");
migrationBuilder.DropTable(
name: "merchant_documents");
migrationBuilder.DropTable(
name: "merchant_staff");
migrationBuilder.DropTable(
name: "merchants");
migrationBuilder.DropTable(
name: "metric_alert_rules");
migrationBuilder.DropTable(
name: "metric_definitions");
migrationBuilder.DropTable(
name: "metric_snapshots");
migrationBuilder.DropTable(
name: "navigation_requests");
migrationBuilder.DropTable(
name: "order_items");
migrationBuilder.DropTable(
name: "order_status_histories");
migrationBuilder.DropTable(
name: "payment_records");
migrationBuilder.DropTable(
name: "payment_refund_records");
migrationBuilder.DropTable(
name: "product_addon_groups");
migrationBuilder.DropTable(
name: "product_addon_options");
migrationBuilder.DropTable(
name: "product_attribute_groups");
migrationBuilder.DropTable(
name: "product_attribute_options");
migrationBuilder.DropTable(
name: "product_categories");
migrationBuilder.DropTable(
name: "product_media_assets");
migrationBuilder.DropTable(
name: "product_pricing_rules");
migrationBuilder.DropTable(
name: "product_skus");
migrationBuilder.DropTable(
name: "products");
migrationBuilder.DropTable(
name: "promotion_campaigns");
migrationBuilder.DropTable(
name: "queue_tickets");
migrationBuilder.DropTable(
name: "refund_requests");
migrationBuilder.DropTable(
name: "reservations");
migrationBuilder.DropTable(
name: "shopping_carts");
migrationBuilder.DropTable(
name: "store_business_hours");
migrationBuilder.DropTable(
name: "store_delivery_zones");
migrationBuilder.DropTable(
name: "store_employee_shifts");
migrationBuilder.DropTable(
name: "store_holidays");
migrationBuilder.DropTable(
name: "store_table_areas");
migrationBuilder.DropTable(
name: "store_tables");
migrationBuilder.DropTable(
name: "stores");
migrationBuilder.DropTable(
name: "support_tickets");
migrationBuilder.DropTable(
name: "tenant_billing_statements");
migrationBuilder.DropTable(
name: "tenant_notifications");
migrationBuilder.DropTable(
name: "tenant_packages");
migrationBuilder.DropTable(
name: "tenant_quota_usages");
migrationBuilder.DropTable(
name: "tenant_subscriptions");
migrationBuilder.DropTable(
name: "tenants");
migrationBuilder.DropTable(
name: "ticket_comments");
migrationBuilder.DropTable(
name: "orders");
}
}
}