using System; using Microsoft.EntityFrameworkCore.Migrations; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; #nullable disable namespace TakeoutSaaS.Infrastructure.Migrations { /// public partial class InitSnowflake_App : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "affiliate_orders", columns: table => new { Id = table.Column(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), AffiliatePartnerId = table.Column(type: "bigint", nullable: false, comment: "推广人标识。"), OrderId = table.Column(type: "bigint", nullable: false, comment: "关联订单。"), BuyerUserId = table.Column(type: "bigint", nullable: false, comment: "用户 ID。"), OrderAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "订单金额。"), EstimatedCommission = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "预计佣金。"), Status = table.Column(type: "integer", nullable: false, comment: "当前状态。"), SettledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "结算完成时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), UserId = table.Column(type: "bigint", nullable: true, comment: "用户 ID(如绑定平台账号)。"), DisplayName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "昵称或渠道名称。"), Phone = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "联系电话。"), ChannelType = table.Column(type: "integer", nullable: false, comment: "渠道类型。"), CommissionRate = table.Column(type: "numeric", nullable: false, comment: "分成比例(0-1)。"), Status = table.Column(type: "integer", nullable: false, comment: "当前状态。"), Remarks = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "审核备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), AffiliatePartnerId = table.Column(type: "bigint", nullable: false, comment: "合作伙伴标识。"), Period = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "结算周期描述。"), Amount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "结算金额。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), PaidAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "打款时间。"), Remarks = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), CartItemId = table.Column(type: "bigint", nullable: false, comment: "所属购物车条目。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "选项名称。"), ExtraPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "附加价格。"), OptionId = table.Column(type: "bigint", nullable: true, comment: "选项 ID(可对应 ProductAddonOption)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ShoppingCartId = table.Column(type: "bigint", nullable: false, comment: "所属购物车标识。"), ProductId = table.Column(type: "bigint", nullable: false, comment: "商品或 SKU 标识。"), ProductSkuId = table.Column(type: "bigint", nullable: true, comment: "SKU 标识。"), ProductName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "商品名称快照。"), UnitPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "单价快照。"), Quantity = table.Column(type: "integer", nullable: false, comment: "数量。"), Remark = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "自定义备注(口味要求)。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), AttributesJson = table.Column(type: "text", nullable: true, comment: "扩展 JSON(规格、加料选项等)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ChatSessionId = table.Column(type: "bigint", nullable: false, comment: "会话标识。"), SenderType = table.Column(type: "integer", nullable: false, comment: "发送方类型。"), SenderUserId = table.Column(type: "bigint", nullable: true, comment: "发送方用户 ID。"), Content = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: false, comment: "消息内容。"), ContentType = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "消息类型(文字/图片/语音等)。"), IsRead = table.Column(type: "boolean", nullable: false, comment: "是否已读。"), ReadAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "读取时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), SessionCode = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "会话编号。"), CustomerUserId = table.Column(type: "bigint", nullable: false, comment: "顾客用户 ID。"), AgentUserId = table.Column(type: "bigint", nullable: true, comment: "当前客服员工 ID。"), StoreId = table.Column(type: "bigint", nullable: true, comment: "所属门店(可空为平台)。"), Status = table.Column(type: "integer", nullable: false, comment: "会话状态。"), IsBotActive = table.Column(type: "boolean", nullable: false, comment: "是否机器人接待中。"), StartedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "开始时间。"), EndedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "结束时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "活动名称。"), Description = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "活动描述。"), StartDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "开始日期。"), EndDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "结束日期。"), AllowMakeupCount = table.Column(type: "integer", nullable: false, comment: "支持补签次数。"), RewardsJson = table.Column(type: "text", nullable: false, comment: "连签奖励 JSON。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), CheckInCampaignId = table.Column(type: "bigint", nullable: false, comment: "活动标识。"), UserId = table.Column(type: "bigint", nullable: false, comment: "用户标识。"), CheckInDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "签到日期(本地)。"), IsMakeup = table.Column(type: "boolean", nullable: false, comment: "是否补签。"), RewardJson = table.Column(type: "text", nullable: false, comment: "获得奖励 JSON。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), UserId = table.Column(type: "bigint", nullable: false, comment: "用户标识。"), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), SessionToken = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "会话 Token。"), Status = table.Column(type: "integer", nullable: false, comment: "会话状态。"), ValidationResultJson = table.Column(type: "text", nullable: false, comment: "校验结果明细 JSON。"), ExpiresAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "过期时间(UTC)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), PostId = table.Column(type: "bigint", nullable: false, comment: "动态标识。"), AuthorUserId = table.Column(type: "bigint", nullable: false, comment: "评论人。"), Content = table.Column(type: "character varying(512)", maxLength: 512, nullable: false, comment: "评论内容。"), ParentId = table.Column(type: "bigint", nullable: true, comment: "父级评论 ID。"), IsDeleted = table.Column(type: "boolean", nullable: false, comment: "状态。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), AuthorUserId = table.Column(type: "bigint", nullable: false, comment: "作者用户 ID。"), Title = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "标题。"), Content = table.Column(type: "text", nullable: false, comment: "内容。"), MediaJson = table.Column(type: "text", nullable: true, comment: "媒体资源 JSON。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), LikeCount = table.Column(type: "integer", nullable: false, comment: "点赞数。"), CommentCount = table.Column(type: "integer", nullable: false, comment: "评论数。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), PostId = table.Column(type: "bigint", nullable: false, comment: "动态 ID。"), UserId = table.Column(type: "bigint", nullable: false, comment: "用户 ID。"), ReactionType = table.Column(type: "integer", nullable: false, comment: "反应类型。"), ReactedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "时间戳。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "模板名称。"), CouponType = table.Column(type: "integer", nullable: false, comment: "券类型。"), Value = table.Column(type: "numeric", nullable: false, comment: "面值或折扣额度。"), DiscountCap = table.Column(type: "numeric", nullable: true, comment: "折扣上限(针对折扣券)。"), MinimumSpend = table.Column(type: "numeric", nullable: true, comment: "最低消费门槛。"), ValidFrom = table.Column(type: "timestamp with time zone", nullable: true, comment: "可用开始时间。"), ValidTo = table.Column(type: "timestamp with time zone", nullable: true, comment: "可用结束时间。"), RelativeValidDays = table.Column(type: "integer", nullable: true, comment: "有效天数(相对发放时间)。"), TotalQuantity = table.Column(type: "integer", nullable: true, comment: "总发放数量上限。"), ClaimedQuantity = table.Column(type: "integer", nullable: false, comment: "已领取数量。"), StoreScopeJson = table.Column(type: "text", nullable: true, comment: "适用门店 ID 集合(JSON)。"), ProductScopeJson = table.Column(type: "text", nullable: true, comment: "适用品类或商品范围(JSON)。"), ChannelsJson = table.Column(type: "text", nullable: true, comment: "发放渠道(JSON)。"), AllowStack = table.Column(type: "boolean", nullable: false, comment: "是否允许叠加其他优惠。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), Description = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), CouponTemplateId = table.Column(type: "bigint", nullable: false, comment: "模板标识。"), Code = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "券码或序列号。"), UserId = table.Column(type: "bigint", nullable: false, comment: "归属用户。"), OrderId = table.Column(type: "bigint", nullable: true, comment: "订单 ID(已使用时记录)。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), IssuedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "发放时间。"), UsedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "使用时间。"), ExpireAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "到期时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), DeliveryOrderId = table.Column(type: "bigint", nullable: false, comment: "配送单标识。"), EventType = table.Column(type: "integer", nullable: false, comment: "事件类型。"), Message = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "事件描述。"), Payload = table.Column(type: "text", nullable: true, comment: "原始数据 JSON。"), OccurredAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "发生时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), OrderId = table.Column(type: "bigint", nullable: false), Provider = table.Column(type: "integer", nullable: false, comment: "配送服务商。"), ProviderOrderId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "第三方配送单号。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), DeliveryFee = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "配送费。"), CourierName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "骑手姓名。"), CourierPhone = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "骑手电话。"), DispatchedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "下发时间。"), PickedUpAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "取餐时间。"), DeliveredAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "完成时间。"), FailureReason = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "异常原因。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), ProductId = table.Column(type: "bigint", nullable: false, comment: "关联商品或套餐。"), GroupOrderNo = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "拼单编号。"), LeaderUserId = table.Column(type: "bigint", nullable: false, comment: "团长用户 ID。"), TargetCount = table.Column(type: "integer", nullable: false, comment: "成团需要的人数。"), CurrentCount = table.Column(type: "integer", nullable: false, comment: "当前已参与人数。"), GroupPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "拼团价格。"), StartAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "开始时间。"), EndAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "结束时间。"), Status = table.Column(type: "integer", nullable: false, comment: "拼团状态。"), SucceededAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "成团时间。"), CancelledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "取消时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), GroupOrderId = table.Column(type: "bigint", nullable: false, comment: "拼单活动标识。"), OrderId = table.Column(type: "bigint", nullable: false, comment: "对应订单标识。"), UserId = table.Column(type: "bigint", nullable: false, comment: "用户标识。"), Status = table.Column(type: "integer", nullable: false, comment: "参与状态。"), JoinedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "参与时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), InventoryItemId = table.Column(type: "bigint", nullable: false, comment: "对应的库存记录标识。"), AdjustmentType = table.Column(type: "integer", nullable: false, comment: "调整类型。"), Quantity = table.Column(type: "integer", nullable: false, comment: "调整数量,正数增加,负数减少。"), Reason = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "原因说明。"), OperatorId = table.Column(type: "bigint", nullable: true, comment: "操作人标识。"), OccurredAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "发生时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), ProductSkuId = table.Column(type: "bigint", nullable: false, comment: "SKU 标识。"), BatchNumber = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "批次编号。"), ProductionDate = table.Column(type: "timestamp with time zone", nullable: true, comment: "生产日期。"), ExpireDate = table.Column(type: "timestamp with time zone", nullable: true, comment: "过期日期。"), Quantity = table.Column(type: "integer", nullable: false, comment: "入库数量。"), RemainingQuantity = table.Column(type: "integer", nullable: false, comment: "剩余数量。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), ProductSkuId = table.Column(type: "bigint", nullable: false, comment: "SKU 标识。"), BatchNumber = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "批次编号,可为空表示混批。"), QuantityOnHand = table.Column(type: "integer", nullable: false, comment: "可用库存。"), QuantityReserved = table.Column(type: "integer", nullable: false, comment: "已锁定库存(订单占用)。"), SafetyStock = table.Column(type: "integer", nullable: true, comment: "安全库存阈值。"), Location = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "储位或仓位信息。"), ExpireDate = table.Column(type: "timestamp with time zone", nullable: true, comment: "过期日期。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: true, comment: "关联门店 ID,可空表示独立 POI。"), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "名称。"), Address = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "地址。"), Longitude = table.Column(type: "double precision", nullable: false, comment: "经度。"), Latitude = table.Column(type: "double precision", nullable: false, comment: "纬度。"), Landmark = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "打车/导航落点描述。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MemberId = table.Column(type: "bigint", nullable: false, comment: "会员标识。"), ChangeValue = table.Column(type: "integer", nullable: false, comment: "变动数量。"), CurrentValue = table.Column(type: "integer", nullable: false, comment: "当前成长值。"), Notes = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"), OccurredAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "发生时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MemberId = table.Column(type: "bigint", nullable: false, comment: "会员标识。"), ChangeAmount = table.Column(type: "integer", nullable: false, comment: "变动数量,可为负值。"), BalanceAfterChange = table.Column(type: "integer", nullable: false, comment: "变动后余额。"), Reason = table.Column(type: "integer", nullable: false, comment: "变动原因。"), SourceId = table.Column(type: "bigint", nullable: true, comment: "来源 ID(订单、活动等)。"), OccurredAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "发生时间。"), ExpireAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "过期时间(如适用)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), UserId = table.Column(type: "bigint", nullable: false, comment: "用户标识。"), Mobile = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "手机号。"), Nickname = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "昵称。"), AvatarUrl = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "头像。"), MemberTierId = table.Column(type: "bigint", nullable: true, comment: "当前会员等级 ID。"), Status = table.Column(type: "integer", nullable: false, comment: "会员状态。"), PointsBalance = table.Column(type: "integer", nullable: false, comment: "会员积分余额。"), GrowthValue = table.Column(type: "integer", nullable: false, comment: "成长值/经验值。"), BirthDate = table.Column(type: "timestamp with time zone", nullable: true, comment: "生日。"), JoinedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "注册时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "等级名称。"), RequiredGrowth = table.Column(type: "integer", nullable: false, comment: "所需成长值。"), BenefitsJson = table.Column(type: "text", nullable: false, comment: "等级权益(JSON)。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MerchantId = table.Column(type: "bigint", nullable: false, comment: "所属商户标识。"), ContractNumber = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "合同编号。"), Status = table.Column(type: "integer", nullable: false, comment: "合同状态。"), StartDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "合同开始时间。"), EndDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "合同结束时间。"), FileUrl = table.Column(type: "character varying(512)", maxLength: 512, nullable: false, comment: "合同文件存储地址。"), SignedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "签署时间。"), TerminatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "终止时间。"), TerminationReason = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "终止原因。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MerchantId = table.Column(type: "bigint", nullable: false, comment: "所属商户标识。"), DocumentType = table.Column(type: "integer", nullable: false, comment: "证照类型。"), Status = table.Column(type: "integer", nullable: false, comment: "审核状态。"), FileUrl = table.Column(type: "character varying(512)", maxLength: 512, nullable: false, comment: "证照文件链接。"), DocumentNumber = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "证照编号。"), IssuedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "签发日期。"), ExpiresAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "到期日期。"), Remarks = table.Column(type: "text", nullable: true, comment: "审核备注或驳回原因。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MerchantId = table.Column(type: "bigint", nullable: false, comment: "所属商户标识。"), StoreId = table.Column(type: "bigint", nullable: true, comment: "可选的关联门店 ID。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "员工姓名。"), Phone = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "手机号。"), Email = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "邮箱地址。"), IdentityUserId = table.Column(type: "bigint", nullable: true, comment: "登录账号 ID(指向统一身份体系)。"), RoleType = table.Column(type: "integer", nullable: false, comment: "员工角色类型。"), Status = table.Column(type: "integer", nullable: false, comment: "员工状态。"), PermissionsJson = table.Column(type: "text", nullable: true, comment: "自定义权限(JSON)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), BrandName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "品牌名称(对外展示)。"), BrandAlias = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "品牌简称或别名。"), LogoUrl = table.Column(type: "text", nullable: true, comment: "品牌 Logo。"), Category = table.Column(type: "text", nullable: true, comment: "品牌所属品类,如火锅、咖啡等。"), BusinessLicenseNumber = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "营业执照号。"), BusinessLicenseImageUrl = table.Column(type: "text", nullable: true, comment: "营业执照扫描件地址。"), TaxNumber = table.Column(type: "text", nullable: true, comment: "税号/统一社会信用代码。"), LegalPerson = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "法人或负责人姓名。"), ContactPhone = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "联系电话。"), ContactEmail = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "联系邮箱。"), ServicePhone = table.Column(type: "text", nullable: true, comment: "客服电话。"), SupportEmail = table.Column(type: "text", nullable: true, comment: "客服邮箱。"), Province = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在省份。"), City = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在城市。"), District = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在区县。"), Address = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "详细地址。"), Longitude = table.Column(type: "double precision", nullable: true, comment: "经度信息。"), Latitude = table.Column(type: "double precision", nullable: true, comment: "纬度信息。"), Status = table.Column(type: "integer", nullable: false, comment: "入驻状态。"), ReviewRemarks = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "审核备注或驳回原因。"), JoinedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "入驻时间。"), LastReviewedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次审核时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MetricDefinitionId = table.Column(type: "bigint", nullable: false, comment: "关联指标。"), ConditionJson = table.Column(type: "text", nullable: false, comment: "触发条件 JSON。"), Severity = table.Column(type: "integer", nullable: false, comment: "告警级别。"), NotificationChannels = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "通知渠道。"), Enabled = table.Column(type: "boolean", nullable: false, comment: "是否启用。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Code = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "指标编码。"), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "指标名称。"), Description = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "说明。"), DimensionsJson = table.Column(type: "text", nullable: true, comment: "维度描述 JSON。"), DefaultAggregation = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "默认聚合方式。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MetricDefinitionId = table.Column(type: "bigint", nullable: false, comment: "指标定义 ID。"), DimensionKey = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "维度键(JSON)。"), WindowStart = table.Column(type: "timestamp with time zone", nullable: false, comment: "统计时间窗口开始。"), WindowEnd = table.Column(type: "timestamp with time zone", nullable: false, comment: "统计时间窗口结束。"), Value = table.Column(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false, comment: "数值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), UserId = table.Column(type: "bigint", nullable: false, comment: "用户 ID。"), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店 ID。"), Channel = table.Column(type: "integer", nullable: false, comment: "来源通道(小程序、H5 等)。"), TargetApp = table.Column(type: "integer", nullable: false, comment: "跳转的地图应用。"), RequestedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "请求时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), OrderId = table.Column(type: "bigint", nullable: false, comment: "订单标识。"), Status = table.Column(type: "integer", nullable: false, comment: "变更后的状态。"), OperatorId = table.Column(type: "bigint", nullable: true, comment: "操作人标识(可为空表示系统)。"), Notes = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注信息。"), OccurredAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "发生时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), OrderNo = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "订单号。"), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店。"), Channel = table.Column(type: "integer", nullable: false, comment: "下单渠道。"), DeliveryType = table.Column(type: "integer", nullable: false, comment: "履约类型。"), Status = table.Column(type: "integer", nullable: false, comment: "当前状态。"), PaymentStatus = table.Column(type: "integer", nullable: false, comment: "支付状态。"), CustomerName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "顾客姓名。"), CustomerPhone = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "顾客手机号。"), TableNo = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "就餐桌号。"), QueueNumber = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "排队号(如有)。"), ReservationId = table.Column(type: "bigint", nullable: true, comment: "预约 ID。"), ItemsAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "商品总额。"), DiscountAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "优惠金额。"), PayableAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "应付金额。"), PaidAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "实付金额。"), PaidAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "支付时间。"), FinishedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "完成时间。"), CancelledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "取消时间。"), CancelReason = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "取消原因。"), Remark = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), OrderId = table.Column(type: "bigint", nullable: false, comment: "关联订单。"), Method = table.Column(type: "integer", nullable: false, comment: "支付方式。"), Status = table.Column(type: "integer", nullable: false, comment: "支付状态。"), Amount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "支付金额。"), TradeNo = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "平台交易号。"), ChannelTransactionId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "第三方渠道单号。"), PaidAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "支付完成时间。"), Remark = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "错误/备注。"), Payload = table.Column(type: "text", nullable: true, comment: "原始回调内容。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), PaymentRecordId = table.Column(type: "bigint", nullable: false, comment: "原支付记录标识。"), OrderId = table.Column(type: "bigint", nullable: false, comment: "关联订单标识。"), Amount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "退款金额。"), ChannelRefundId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "渠道退款流水号。"), Status = table.Column(type: "integer", nullable: false, comment: "退款状态。"), RequestedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "退款请求时间。"), CompletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "完成时间。"), Payload = table.Column(type: "text", nullable: true, comment: "渠道返回的原始数据 JSON。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ProductId = table.Column(type: "bigint", nullable: false, comment: "所属商品。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "分组名称。"), SelectionType = table.Column(type: "integer", nullable: false, comment: "选择类型。"), MinSelect = table.Column(type: "integer", nullable: true, comment: "最小选择数量。"), MaxSelect = table.Column(type: "integer", nullable: true, comment: "最大选择数量。"), IsRequired = table.Column(type: "boolean", nullable: false, comment: "是否必选。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), AddonGroupId = table.Column(type: "bigint", nullable: false, comment: "所属加料分组。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "选项名称。"), ExtraPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "附加价格。"), IsDefault = table.Column(type: "boolean", nullable: false, comment: "是否默认选项。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: true, comment: "关联门店,可为空表示所有门店共享。"), ProductId = table.Column(type: "bigint", nullable: false, comment: "所属商品标识。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "分组名称,例如“辣度”“份量”。"), SelectionType = table.Column(type: "integer", nullable: false, comment: "选择类型(单选/多选)。"), IsRequired = table.Column(type: "boolean", nullable: false, comment: "是否必选。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "显示排序。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), AttributeGroupId = table.Column(type: "bigint", nullable: false, comment: "所属规格组。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "选项名称。"), ExtraPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "附加价格。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序。"), IsDefault = table.Column(type: "boolean", nullable: false, comment: "是否默认选中。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "所属门店。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "分类名称。"), Description = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "分类描述。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), IsEnabled = table.Column(type: "boolean", nullable: false, comment: "是否启用。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ProductId = table.Column(type: "bigint", nullable: false, comment: "商品标识。"), MediaType = table.Column(type: "integer", nullable: false, comment: "媒体类型。"), Url = table.Column(type: "character varying(512)", maxLength: 512, nullable: false, comment: "媒资链接。"), Caption = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "描述或标题。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ProductId = table.Column(type: "bigint", nullable: false, comment: "所属商品。"), RuleType = table.Column(type: "integer", nullable: false, comment: "策略类型。"), ConditionsJson = table.Column(type: "text", nullable: false, comment: "条件描述(JSON),如会员等级、渠道等。"), Price = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "特殊价格。"), StartTime = table.Column(type: "timestamp with time zone", nullable: true, comment: "生效开始时间。"), EndTime = table.Column(type: "timestamp with time zone", nullable: true, comment: "生效结束时间。"), WeekdaysJson = table.Column(type: "text", nullable: true, comment: "生效星期(JSON 数组)。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), ProductId = table.Column(type: "bigint", nullable: false, comment: "所属商品标识。"), SkuCode = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "SKU 编码。"), Barcode = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "条形码。"), Price = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "售价。"), OriginalPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "原价。"), StockQuantity = table.Column(type: "integer", nullable: true, comment: "可售库存。"), Weight = table.Column(type: "numeric(10,3)", precision: 10, scale: 3, nullable: true, comment: "重量(千克)。"), AttributesJson = table.Column(type: "text", nullable: false, comment: "规格属性 JSON(记录选项 ID)。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "所属门店。"), CategoryId = table.Column(type: "bigint", nullable: false, comment: "所属分类。"), SpuCode = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "商品编码。"), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "商品名称。"), Subtitle = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "副标题/卖点。"), Unit = table.Column(type: "character varying(16)", maxLength: 16, nullable: true, comment: "售卖单位(份/杯等)。"), Price = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "现价。"), OriginalPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "原价。"), StockQuantity = table.Column(type: "integer", nullable: true, comment: "库存数量(可选)。"), MaxQuantityPerOrder = table.Column(type: "integer", nullable: true, comment: "最大每单限购。"), Status = table.Column(type: "integer", nullable: false, comment: "商品状态。"), CoverImage = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "主图。"), GalleryImages = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true, comment: "Gallery 图片逗号分隔。"), Description = table.Column(type: "text", nullable: true, comment: "商品描述。"), EnableDineIn = table.Column(type: "boolean", nullable: false, comment: "支持堂食。"), EnablePickup = table.Column(type: "boolean", nullable: false, comment: "支持自提。"), EnableDelivery = table.Column(type: "boolean", nullable: false, comment: "支持配送。"), IsFeatured = table.Column(type: "boolean", nullable: false, comment: "是否热门推荐。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "活动名称。"), PromotionType = table.Column(type: "integer", nullable: false, comment: "活动类型。"), Status = table.Column(type: "integer", nullable: false, comment: "活动状态。"), StartAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "开始时间。"), EndAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "结束时间。"), Budget = table.Column(type: "numeric", nullable: true, comment: "预算金额。"), RulesJson = table.Column(type: "text", nullable: false, comment: "活动规则 JSON。"), AudienceDescription = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "目标人群描述。"), BannerUrl = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "营销素材(如 banner)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false), TicketNumber = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "排队编号。"), PartySize = table.Column(type: "integer", nullable: false, comment: "就餐人数。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), EstimatedWaitMinutes = table.Column(type: "integer", nullable: true, comment: "预计等待分钟。"), CalledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "叫号时间。"), ExpiredAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "过号时间。"), CancelledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "取消时间。"), Remark = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), OrderId = table.Column(type: "bigint", nullable: false, comment: "关联订单标识。"), RefundNo = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "退款单号。"), Amount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "申请金额。"), Reason = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "申请原因。"), Status = table.Column(type: "integer", nullable: false, comment: "退款状态。"), RequestedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "用户提交时间。"), ProcessedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "审核完成时间。"), ReviewNotes = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "审核备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店。"), ReservationNo = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "预约号。"), CustomerName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "客户姓名。"), CustomerPhone = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "联系电话。"), PeopleCount = table.Column(type: "integer", nullable: false, comment: "用餐人数。"), ReservationTime = table.Column(type: "timestamp with time zone", nullable: false, comment: "预约时间(UTC)。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), TablePreference = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "桌型/标签。"), Remark = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注。"), CheckInCode = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "核销码/到店码。"), CheckedInAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "实际签到时间。"), CancelledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "取消时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), UserId = table.Column(type: "bigint", nullable: false, comment: "用户标识。"), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), Status = table.Column(type: "integer", nullable: false, comment: "购物车状态,包含正常/锁定。"), TableContext = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "桌码或场景标识(扫码点餐)。"), DeliveryPreference = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "履约方式(堂食/自提/配送)缓存。"), LastModifiedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "最近一次修改时间(UTC)。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), DayOfWeek = table.Column(type: "integer", nullable: false, comment: "星期几,0 表示周日。"), HourType = table.Column(type: "integer", nullable: false, comment: "时段类型(正常营业、休息、预约等)。"), StartTime = table.Column(type: "interval", nullable: false, comment: "开始时间(本地时间)。"), EndTime = table.Column(type: "interval", nullable: false, comment: "结束时间(本地时间)。"), CapacityLimit = table.Column(type: "integer", nullable: true, comment: "最大接待容量或单量限制。"), Notes = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), ZoneName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "区域名称。"), PolygonGeoJson = table.Column(type: "text", nullable: false, comment: "GeoJSON 表示的多边形范围。"), MinimumOrderAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "起送价。"), DeliveryFee = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true, comment: "配送费。"), EstimatedMinutes = table.Column(type: "integer", nullable: true, comment: "预计送达分钟。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), StaffId = table.Column(type: "bigint", nullable: false, comment: "员工标识。"), ShiftDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "班次日期。"), StartTime = table.Column(type: "interval", nullable: false, comment: "开始时间。"), EndTime = table.Column(type: "interval", nullable: false, comment: "结束时间。"), RoleType = table.Column(type: "integer", nullable: false, comment: "排班角色。"), Notes = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "备注。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), Date = table.Column(type: "timestamp with time zone", nullable: false, comment: "日期。"), IsClosed = table.Column(type: "boolean", nullable: false, comment: "是否全天闭店。"), Reason = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "说明内容。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "区域名称。"), Description = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "区域描述。"), SortOrder = table.Column(type: "integer", nullable: false, comment: "排序值。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StoreId = table.Column(type: "bigint", nullable: false, comment: "门店标识。"), AreaId = table.Column(type: "bigint", nullable: true, comment: "所在区域 ID。"), TableCode = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "桌码。"), Capacity = table.Column(type: "integer", nullable: false, comment: "可容纳人数。"), Tags = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "桌台标签(堂食、快餐等)。"), Status = table.Column(type: "integer", nullable: false, comment: "当前桌台状态。"), QrCodeUrl = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "桌码二维码地址。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), MerchantId = table.Column(type: "bigint", nullable: false, comment: "所属商户标识。"), Code = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "门店编码,便于扫码及外部对接。"), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "门店名称。"), Phone = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "联系电话。"), ManagerName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "门店负责人姓名。"), Status = table.Column(type: "integer", nullable: false, comment: "门店当前运营状态。"), Country = table.Column(type: "text", nullable: true, comment: "所在国家或地区。"), Province = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在省份。"), City = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所在城市。"), District = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "区县信息。"), Address = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "详细地址。"), Longitude = table.Column(type: "double precision", nullable: true, comment: "高德/腾讯地图经度。"), Latitude = table.Column(type: "double precision", nullable: true, comment: "纬度。"), Description = table.Column(type: "text", nullable: true, comment: "门店描述或公告。"), BusinessHours = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "门店营业时段描述(备用字符串)。"), SupportsDineIn = table.Column(type: "boolean", nullable: false, comment: "是否支持堂食。"), SupportsPickup = table.Column(type: "boolean", nullable: false, comment: "是否支持自提。"), SupportsDelivery = table.Column(type: "boolean", nullable: false, comment: "是否支持配送。"), SupportsReservation = table.Column(type: "boolean", nullable: false, comment: "支持预约。"), SupportsQueueing = table.Column(type: "boolean", nullable: false, comment: "支持排队叫号。"), DeliveryRadiusKm = table.Column(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false, comment: "默认配送半径(公里)。"), Announcement = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "门店公告。"), Tags = table.Column(type: "text", nullable: true, comment: "门店标签(逗号分隔)。"), CoverImageUrl = table.Column(type: "text", nullable: true, comment: "门店海报。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), TicketNo = table.Column(type: "character varying(32)", maxLength: 32, nullable: false, comment: "工单编号。"), CustomerUserId = table.Column(type: "bigint", nullable: false, comment: "客户用户 ID。"), OrderId = table.Column(type: "bigint", nullable: true, comment: "关联订单(如有)。"), Subject = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "工单主题。"), Description = table.Column(type: "text", nullable: false, comment: "工单详情。"), Priority = table.Column(type: "integer", nullable: false, comment: "优先级。"), Status = table.Column(type: "integer", nullable: false, comment: "状态。"), AssignedAgentId = table.Column(type: "bigint", nullable: true, comment: "指派的客服。"), ClosedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "关闭时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), StatementNo = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "账单编号,供对账查询。"), PeriodStart = table.Column(type: "timestamp with time zone", nullable: false, comment: "账单周期开始时间。"), PeriodEnd = table.Column(type: "timestamp with time zone", nullable: false, comment: "账单周期结束时间。"), AmountDue = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "应付金额。"), AmountPaid = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "实付金额。"), Status = table.Column(type: "integer", nullable: false, comment: "当前付款状态。"), DueDate = table.Column(type: "timestamp with time zone", nullable: false, comment: "到期日。"), LineItemsJson = table.Column(type: "text", nullable: true, comment: "账单明细 JSON,记录各项费用。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Title = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "通知标题。"), Message = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: false, comment: "通知正文。"), Channel = table.Column(type: "integer", nullable: false, comment: "发布通道(站内、邮件、短信等)。"), Severity = table.Column(type: "integer", nullable: false, comment: "通知重要级别。"), SentAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "推送时间。"), ReadAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "租户是否已阅读。"), MetadataJson = table.Column(type: "text", nullable: true, comment: "附加元数据 JSON。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "套餐名称,展示给租户的简称。"), Description = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "套餐描述,包含适用场景、权益等。"), PackageType = table.Column(type: "integer", nullable: false, comment: "套餐分类(试用、标准、旗舰等)。"), MonthlyPrice = table.Column(type: "numeric", nullable: true, comment: "月付价格,单位:人民币元。"), YearlyPrice = table.Column(type: "numeric", nullable: true, comment: "年付价格,单位:人民币元。"), MaxStoreCount = table.Column(type: "integer", nullable: true, comment: "允许的最大门店数。"), MaxAccountCount = table.Column(type: "integer", nullable: true, comment: "允许创建的最大账号数。"), MaxStorageGb = table.Column(type: "integer", nullable: true, comment: "存储容量上限(GB)。"), MaxSmsCredits = table.Column(type: "integer", nullable: true, comment: "每月短信额度上限。"), MaxDeliveryOrders = table.Column(type: "integer", nullable: true, comment: "每月可调用的配送单数量上限。"), FeaturePoliciesJson = table.Column(type: "text", nullable: true, comment: "权益明细 JSON,记录自定义特性开关。"), IsActive = table.Column(type: "boolean", nullable: false, comment: "是否仍可售卖。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), QuotaType = table.Column(type: "integer", nullable: false, comment: "配额类型,例如门店数、短信条数等。"), LimitValue = table.Column(type: "numeric", nullable: false, comment: "当前配额上限。"), UsedValue = table.Column(type: "numeric", nullable: false, comment: "已消耗的数量。"), ResetCycle = table.Column(type: "text", nullable: true, comment: "配额刷新周期描述(如月、年)。"), LastResetAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次重置时间。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), TenantPackageId = table.Column(type: "bigint", nullable: false, comment: "当前订阅关联的套餐标识。"), EffectiveFrom = table.Column(type: "timestamp with time zone", nullable: false, comment: "订阅生效时间(UTC)。"), EffectiveTo = table.Column(type: "timestamp with time zone", nullable: false, comment: "订阅到期时间(UTC)。"), NextBillingDate = table.Column(type: "timestamp with time zone", nullable: true, comment: "下一个计费时间,配合自动续费使用。"), Status = table.Column(type: "integer", nullable: false, comment: "订阅当前状态。"), AutoRenew = table.Column(type: "boolean", nullable: false, comment: "是否开启自动续费。"), ScheduledPackageId = table.Column(type: "bigint", nullable: true, comment: "若已排期升降配,对应的新套餐 ID。"), Notes = table.Column(type: "text", nullable: true, comment: "运营备注信息。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), Code = table.Column(type: "character varying(64)", maxLength: 64, nullable: false, comment: "租户短编码,作为跨系统引用的唯一标识。"), Name = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "租户全称或品牌名称。"), ShortName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "对外展示的简称。"), LegalEntityName = table.Column(type: "text", nullable: true, comment: "法人或公司主体名称。"), Industry = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "所属行业,如餐饮、零售等。"), LogoUrl = table.Column(type: "character varying(256)", maxLength: 256, nullable: true, comment: "LOGO 图片地址。"), CoverImageUrl = table.Column(type: "text", nullable: true, comment: "品牌海报或封面图。"), Website = table.Column(type: "text", nullable: true, comment: "官网或主要宣传链接。"), Country = table.Column(type: "text", nullable: true, comment: "所在国家/地区。"), Province = table.Column(type: "text", nullable: true, comment: "所在省份或州。"), City = table.Column(type: "text", nullable: true, comment: "所在城市。"), Address = table.Column(type: "text", nullable: true, comment: "详细地址信息。"), ContactName = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "主联系人姓名。"), ContactPhone = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "主联系人电话。"), ContactEmail = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "主联系人邮箱。"), PrimaryOwnerUserId = table.Column(type: "bigint", nullable: true, comment: "系统内对应的租户所有者账号 ID。"), Status = table.Column(type: "integer", nullable: false, comment: "租户当前状态,涵盖审核、启用、停用等场景。"), EffectiveFrom = table.Column(type: "timestamp with time zone", nullable: true, comment: "服务生效时间(UTC)。"), EffectiveTo = table.Column(type: "timestamp with time zone", nullable: true, comment: "服务到期时间(UTC)。"), SuspendedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次暂停服务时间。"), SuspensionReason = table.Column(type: "text", nullable: true, comment: "暂停或终止的原因说明。"), Tags = table.Column(type: "text", nullable: true, comment: "业务标签集合(逗号分隔)。"), Remarks = table.Column(type: "character varying(512)", maxLength: 512, nullable: true, comment: "备注信息,用于运营记录特殊说明。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), SupportTicketId = table.Column(type: "bigint", nullable: false, comment: "工单标识。"), AuthorUserId = table.Column(type: "bigint", nullable: true, comment: "评论人 ID。"), Content = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: false, comment: "评论内容。"), IsInternal = table.Column(type: "boolean", nullable: false, comment: "是否内部备注。"), AttachmentsJson = table.Column(type: "text", nullable: true, comment: "附件 JSON。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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(type: "bigint", nullable: false, comment: "实体唯一标识。") .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), OrderId = table.Column(type: "bigint", nullable: false, comment: "订单 ID。"), ProductId = table.Column(type: "bigint", nullable: false, comment: "商品 ID。"), ProductName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "商品名称。"), SkuName = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "SKU/规格描述。"), Unit = table.Column(type: "character varying(16)", maxLength: 16, nullable: true, comment: "单位。"), Quantity = table.Column(type: "integer", nullable: false, comment: "数量。"), UnitPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "单价。"), DiscountAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "折扣金额。"), SubTotal = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false, comment: "小计。"), AttributesJson = table.Column(type: "text", nullable: true, comment: "自定义属性 JSON。"), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间(UTC)。"), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "最近一次更新时间(UTC),从未更新时为 null。"), DeletedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "软删除时间(UTC),未删除时为 null。"), CreatedBy = table.Column(type: "bigint", nullable: true, comment: "创建人用户标识,匿名或系统操作时为 null。"), UpdatedBy = table.Column(type: "bigint", nullable: true, comment: "最后更新人用户标识,匿名或系统操作时为 null。"), DeletedBy = table.Column(type: "bigint", nullable: true, comment: "删除人用户标识(软删除),未删除时为 null。"), TenantId = table.Column(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" }); } /// 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"); } } }