using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace TakeoutSaaS.Infrastructure.Migrations
{
///
public partial class AddMemberMessageReachModule : Migration
{
///
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "member_message_templates",
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: "模板名称。"),
Category = table.Column(type: "integer", nullable: false, comment: "模板分类。"),
Content = table.Column(type: "text", nullable: false, comment: "模板内容。"),
UsageCount = table.Column(type: "integer", nullable: false, comment: "使用次数。"),
LastUsedAt = table.Column(type: "timestamp with time zone", nullable: true, 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_member_message_templates", x => x.Id);
},
comment: "会员消息模板。");
migrationBuilder.CreateTable(
name: "member_reach_messages",
columns: table => new
{
Id = table.Column(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StoreId = table.Column(type: "bigint", nullable: true, comment: "门店标识。"),
TemplateId = table.Column(type: "bigint", nullable: true, comment: "模板标识。"),
Title = table.Column(type: "character varying(128)", maxLength: 128, nullable: false, comment: "消息标题。"),
Content = table.Column(type: "text", nullable: false, comment: "消息内容。"),
ChannelsJson = table.Column(type: "text", nullable: false, comment: "发送渠道 JSON。"),
AudienceType = table.Column(type: "integer", nullable: false, comment: "目标人群类型。"),
AudienceTagsJson = table.Column(type: "text", nullable: false, comment: "目标标签 JSON。"),
EstimatedReachCount = table.Column(type: "integer", nullable: false, comment: "预计触达人数。"),
ScheduleType = table.Column(type: "integer", nullable: false, comment: "发送时间类型。"),
ScheduledAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "定时发送时间(UTC)。"),
Status = table.Column(type: "integer", nullable: false, comment: "消息状态。"),
SentAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "发送时间(UTC)。"),
SentCount = table.Column(type: "integer", nullable: false, comment: "发送成功数量。"),
ReadCount = table.Column(type: "integer", nullable: false, comment: "已读数量。"),
ConvertedCount = table.Column(type: "integer", nullable: false, comment: "转化数量。"),
HangfireJobId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true, comment: "Hangfire 任务 ID。"),
LastError = table.Column(type: "character varying(1024)", maxLength: 1024, 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_reach_messages", x => x.Id);
},
comment: "会员消息触达主记录。");
migrationBuilder.CreateTable(
name: "member_reach_recipients",
columns: table => new
{
Id = table.Column(type: "bigint", nullable: false, comment: "实体唯一标识。")
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
MessageId = table.Column(type: "bigint", nullable: false, comment: "消息标识。"),
MemberId = table.Column(type: "bigint", nullable: false, comment: "会员标识。"),
Channel = table.Column(type: "integer", nullable: false, comment: "触达渠道。"),
Mobile = table.Column(type: "character varying(32)", maxLength: 32, nullable: true, comment: "手机号快照。"),
OpenId = table.Column(type: "character varying(128)", maxLength: 128, nullable: true, comment: "OpenId 快照。"),
Status = table.Column(type: "integer", nullable: false, comment: "发送状态。"),
SentAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "发送时间(UTC)。"),
ReadAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "已读时间(UTC)。"),
ConvertedAt = table.Column(type: "timestamp with time zone", nullable: true, comment: "转化时间(UTC)。"),
ErrorMessage = 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_member_reach_recipients", x => x.Id);
},
comment: "会员消息触达收件明细。");
migrationBuilder.CreateIndex(
name: "IX_member_message_templates_TenantId_Category_UsageCount",
table: "member_message_templates",
columns: new[] { "TenantId", "Category", "UsageCount" });
migrationBuilder.CreateIndex(
name: "IX_member_message_templates_TenantId_Name",
table: "member_message_templates",
columns: new[] { "TenantId", "Name" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_member_reach_messages_TenantId_CreatedAt",
table: "member_reach_messages",
columns: new[] { "TenantId", "CreatedAt" });
migrationBuilder.CreateIndex(
name: "IX_member_reach_messages_TenantId_Status_ScheduledAt",
table: "member_reach_messages",
columns: new[] { "TenantId", "Status", "ScheduledAt" });
migrationBuilder.CreateIndex(
name: "IX_member_reach_recipients_TenantId_MessageId_MemberId_Channel",
table: "member_reach_recipients",
columns: new[] { "TenantId", "MessageId", "MemberId", "Channel" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_member_reach_recipients_TenantId_MessageId_Status",
table: "member_reach_recipients",
columns: new[] { "TenantId", "MessageId", "Status" });
}
///
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "member_message_templates");
migrationBuilder.DropTable(
name: "member_reach_messages");
migrationBuilder.DropTable(
name: "member_reach_recipients");
}
}
}