From 3b8b86a25864e2a5ab62d4adf9302db337038cf6 Mon Sep 17 00:00:00 2001 From: Sam <315859133@qq.com> Date: Mon, 9 Feb 2026 19:10:11 +0800 Subject: [PATCH] feat: add points rule migration --- ...0209110951_AddPointsRuleSystem.Designer.cs | 598 ++++++++++++++++++ .../20260209110951_AddPointsRuleSystem.cs | 206 ++++++ .../ApplicationDbContextModelSnapshot.cs | 179 +++++- 3 files changed, 978 insertions(+), 5 deletions(-) create mode 100644 src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.Designer.cs create mode 100644 src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.cs diff --git a/src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.Designer.cs b/src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.Designer.cs new file mode 100644 index 0000000..0174790 --- /dev/null +++ b/src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.Designer.cs @@ -0,0 +1,598 @@ +// +using System; +using Fengling.Member.Infrastructure; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Fengling.Member.Infrastructure.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20260209110951_AddPointsRuleSystem")] + partial class AddPointsRuleSystem + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsModel.PointsAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("FrozenPoints") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("frozen_points"); + + b.Property("MemberId") + .HasColumnType("bigint") + .HasColumnName("user_id"); + + b.Property("TenantId") + .HasColumnType("bigint") + .HasColumnName("tenant_id"); + + b.Property("TotalPoints") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("points"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1) + .HasColumnName("version"); + + b.HasKey("Id"); + + b.HasIndex("MemberId") + .IsUnique() + .HasDatabaseName("idx_points_account_memberid"); + + b.HasIndex("MemberId", "TenantId") + .HasDatabaseName("idx_points_account_member_tenant"); + + b.ToTable("mka_integraldetails", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsModel.PointsTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("MemberId") + .HasColumnType("bigint"); + + b.Property("Points") + .HasColumnType("integer"); + + b.Property("PointsAccountId") + .HasColumnType("bigint"); + + b.Property("Remark") + .HasColumnType("text"); + + b.Property("SourceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("TransactionType") + .IsRequired() + .HasColumnType("text"); + + b.Property("TransactionTypeCategory") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PointsAccountId"); + + b.ToTable("PointsTransactions"); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRule", b => + { + b.Property("Id") + .HasColumnType("uuid") + .HasComment("规则标识"); + + b.Property("BasePoints") + .HasColumnType("integer") + .HasComment("基础积分"); + + b.Property("CalculationMode") + .HasColumnType("integer") + .HasComment("计算模式"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasComment("规则编码"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasComment("创建时间"); + + b.Property("EffectiveFrom") + .HasColumnType("timestamp with time zone") + .HasComment("生效开始时间"); + + b.Property("EffectiveTo") + .HasColumnType("timestamp with time zone") + .HasComment("生效结束时间"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasComment("是否启用"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasComment("规则名称"); + + b.Property("Priority") + .HasColumnType("integer") + .HasComment("优先级"); + + b.Property("RuleType") + .HasColumnType("integer") + .HasComment("规则类型"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasComment("更新时间"); + + b.Property("ValidityDays") + .HasColumnType("integer") + .HasComment("有效期天数"); + + b.Property("WeightFactor") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)") + .HasComment("权重因子"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("PointsRules", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRuleCondition", b => + { + b.Property("Id") + .HasColumnType("uuid") + .HasComment("条件标识"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasComment("创建时间"); + + b.Property("DimensionType") + .HasColumnType("integer") + .HasComment("维度类型"); + + b.Property("DimensionValue") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasComment("维度值"); + + b.Property("Operator") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasComment("操作符"); + + b.Property("RuleId") + .HasColumnType("uuid") + .HasComment("关联规则标识"); + + b.HasKey("Id"); + + b.HasIndex("RuleId", "DimensionType"); + + b.ToTable("PointsRuleConditions", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("OpenId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("open_id"); + + b.Property("PhoneNumber") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("phone_number"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasColumnName("status"); + + b.Property("TenantId") + .HasColumnType("bigint") + .HasColumnName("tenant_id"); + + b.Property("UnionId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("union_id"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1) + .HasColumnName("version"); + + b.HasKey("Id"); + + b.HasIndex("OpenId") + .HasDatabaseName("idx_member_openid"); + + b.HasIndex("TenantId") + .HasDatabaseName("idx_member_tenantid"); + + b.HasIndex("UnionId") + .HasDatabaseName("idx_member_unionid"); + + b.HasIndex("TenantId", "PhoneNumber") + .HasDatabaseName("idx_member_tenant_phone"); + + b.ToTable("fls_member", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("MemberId") + .HasColumnType("bigint") + .HasColumnName("member_id"); + + b.Property("TagId") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("tag_id"); + + b.Property("TagName") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("tag_name"); + + b.HasKey("Id"); + + b.HasIndex("TagId") + .HasDatabaseName("idx_membertag_tagid"); + + b.HasIndex("MemberId", "TagId") + .IsUnique() + .HasDatabaseName("idx_membertag_member_tag"); + + b.ToTable("fls_member_tag", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.OAuthAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccessToken") + .HasColumnType("text"); + + b.Property("AuthorizedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("MemberId") + .HasColumnType("bigint"); + + b.Property("OpenId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Provider") + .HasColumnType("integer"); + + b.Property("RefreshToken") + .HasColumnType("text"); + + b.Property("TokenExpiredAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UnionId") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("MemberId"); + + b.ToTable("OAuthAuthorization"); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.WechatAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorizedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("authorized_at"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_login_at"); + + b.Property("MemberId") + .HasColumnType("bigint") + .HasColumnName("member_id"); + + b.Property("OpenId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("open_id"); + + b.Property("UnionId") + .HasMaxLength(64) + .HasColumnType("character varying(64)") + .HasColumnName("union_id"); + + b.HasKey("Id"); + + b.HasIndex("MemberId") + .HasDatabaseName("idx_wechat_auth_memberid"); + + b.HasIndex("OpenId") + .IsUnique() + .HasDatabaseName("idx_wechat_auth_openid"); + + b.HasIndex("UnionId") + .HasDatabaseName("idx_wechat_auth_unionid"); + + b.ToTable("fls_wechat_authorization", (string)null); + }); + + modelBuilder.Entity("NetCorePal.Extensions.DistributedTransactions.CAP.Persistence.CapLock", b => + { + b.Property("Key") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Instance") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LastLockTime") + .HasColumnType("TIMESTAMP"); + + b.HasKey("Key"); + + b.ToTable("CAPLock", (string)null); + }); + + modelBuilder.Entity("NetCorePal.Extensions.DistributedTransactions.CAP.Persistence.PublishedMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Added") + .HasColumnType("TIMESTAMP"); + + b.Property("Content") + .HasColumnType("TEXT"); + + b.Property("ExpiresAt") + .HasColumnType("TIMESTAMP"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Retries") + .HasColumnType("integer"); + + b.Property("StatusName") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b.Property("Version") + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "ExpiresAt", "StatusName" }, "IX_ExpiresAt_StatusName"); + + b.HasIndex(new[] { "Version", "ExpiresAt", "StatusName" }, "IX_Version_ExpiresAt_StatusName"); + + b.ToTable("CAPPublishedMessage", (string)null); + }); + + modelBuilder.Entity("NetCorePal.Extensions.DistributedTransactions.CAP.Persistence.ReceivedMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Added") + .HasColumnType("TIMESTAMP"); + + b.Property("Content") + .HasColumnType("TEXT"); + + b.Property("ExpiresAt") + .HasColumnType("TIMESTAMP"); + + b.Property("Group") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(400) + .HasColumnType("character varying(400)"); + + b.Property("Retries") + .HasColumnType("integer"); + + b.Property("StatusName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Version") + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "ExpiresAt", "StatusName" }, "IX_ExpiresAt_StatusName") + .HasDatabaseName("IX_ExpiresAt_StatusName1"); + + b.HasIndex(new[] { "Version", "ExpiresAt", "StatusName" }, "IX_Version_ExpiresAt_StatusName") + .HasDatabaseName("IX_Version_ExpiresAt_StatusName1"); + + b.ToTable("CAPReceivedMessage", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsModel.PointsTransaction", b => + { + b.HasOne("Fengling.Member.Domain.Aggregates.PointsModel.PointsAccount", null) + .WithMany("Transactions") + .HasForeignKey("PointsAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRuleCondition", b => + { + b.HasOne("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberTag", b => + { + b.HasOne("Fengling.Member.Domain.Aggregates.Users.MemberEntity", null) + .WithMany("Tags") + .HasForeignKey("MemberId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.OAuthAuthorization", b => + { + b.HasOne("Fengling.Member.Domain.Aggregates.Users.MemberEntity", null) + .WithMany("OAuthAuthorizations") + .HasForeignKey("MemberId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsModel.PointsAccount", b => + { + b.Navigation("Transactions"); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRule", b => + { + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberEntity", b => + { + b.Navigation("OAuthAuthorizations"); + + b.Navigation("Tags"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.cs b/src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.cs new file mode 100644 index 0000000..b80df7a --- /dev/null +++ b/src/Fengling.Member.Infrastructure/Migrations/20260209110951_AddPointsRuleSystem.cs @@ -0,0 +1,206 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Fengling.Member.Infrastructure.Migrations +{ + /// + public partial class AddPointsRuleSystem : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_fls_wechat_authorization_fls_member_member_id", + table: "fls_wechat_authorization"); + + migrationBuilder.DropForeignKey( + name: "FK_PointsTransaction_mka_integraldetails_PointsAccountId", + table: "PointsTransaction"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PointsTransaction", + table: "PointsTransaction"); + + migrationBuilder.RenameTable( + name: "PointsTransaction", + newName: "PointsTransactions"); + + migrationBuilder.RenameIndex( + name: "IX_PointsTransaction_PointsAccountId", + table: "PointsTransactions", + newName: "IX_PointsTransactions_PointsAccountId"); + + migrationBuilder.AddColumn( + name: "ExpireAt", + table: "PointsTransactions", + type: "timestamp with time zone", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddPrimaryKey( + name: "PK_PointsTransactions", + table: "PointsTransactions", + column: "Id"); + + migrationBuilder.CreateTable( + name: "OAuthAuthorization", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + MemberId = table.Column(type: "bigint", nullable: false), + Provider = table.Column(type: "integer", nullable: false), + OpenId = table.Column(type: "text", nullable: false), + UnionId = table.Column(type: "text", nullable: true), + AccessToken = table.Column(type: "text", nullable: true), + RefreshToken = table.Column(type: "text", nullable: true), + TokenExpiredAt = table.Column(type: "timestamp with time zone", nullable: true), + AuthorizedAt = table.Column(type: "timestamp with time zone", nullable: false), + LastLoginAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OAuthAuthorization", x => x.Id); + table.ForeignKey( + name: "FK_OAuthAuthorization_fls_member_MemberId", + column: x => x.MemberId, + principalTable: "fls_member", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "PointsRules", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, comment: "规则标识"), + Name = table.Column(type: "character varying(200)", maxLength: 200, nullable: false, comment: "规则名称"), + Code = table.Column(type: "character varying(50)", maxLength: 50, nullable: false, comment: "规则编码"), + RuleType = table.Column(type: "integer", nullable: false, comment: "规则类型"), + BasePoints = table.Column(type: "integer", nullable: false, comment: "基础积分"), + WeightFactor = table.Column(type: "numeric(18,4)", precision: 18, scale: 4, nullable: true, comment: "权重因子"), + ValidityDays = table.Column(type: "integer", nullable: false, comment: "有效期天数"), + Priority = table.Column(type: "integer", nullable: false, comment: "优先级"), + CalculationMode = table.Column(type: "integer", nullable: false, comment: "计算模式"), + IsActive = table.Column(type: "boolean", nullable: false, comment: "是否启用"), + EffectiveFrom = table.Column(type: "timestamp with time zone", nullable: false, comment: "生效开始时间"), + EffectiveTo = table.Column(type: "timestamp with time zone", nullable: true, comment: "生效结束时间"), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间"), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "更新时间") + }, + constraints: table => + { + table.PrimaryKey("PK_PointsRules", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "PointsRuleConditions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, comment: "条件标识"), + RuleId = table.Column(type: "uuid", nullable: false, comment: "关联规则标识"), + DimensionType = table.Column(type: "integer", nullable: false, comment: "维度类型"), + DimensionValue = table.Column(type: "character varying(200)", maxLength: 200, nullable: false, comment: "维度值"), + Operator = table.Column(type: "character varying(20)", maxLength: 20, nullable: true, comment: "操作符"), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, comment: "创建时间") + }, + constraints: table => + { + table.PrimaryKey("PK_PointsRuleConditions", x => x.Id); + table.ForeignKey( + name: "FK_PointsRuleConditions_PointsRules_RuleId", + column: x => x.RuleId, + principalTable: "PointsRules", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_OAuthAuthorization_MemberId", + table: "OAuthAuthorization", + column: "MemberId"); + + migrationBuilder.CreateIndex( + name: "IX_PointsRuleConditions_RuleId_DimensionType", + table: "PointsRuleConditions", + columns: new[] { "RuleId", "DimensionType" }); + + migrationBuilder.CreateIndex( + name: "IX_PointsRules_Code", + table: "PointsRules", + column: "Code", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_PointsRules_IsActive", + table: "PointsRules", + column: "IsActive"); + + migrationBuilder.AddForeignKey( + name: "FK_PointsTransactions_mka_integraldetails_PointsAccountId", + table: "PointsTransactions", + column: "PointsAccountId", + principalTable: "mka_integraldetails", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_PointsTransactions_mka_integraldetails_PointsAccountId", + table: "PointsTransactions"); + + migrationBuilder.DropTable( + name: "OAuthAuthorization"); + + migrationBuilder.DropTable( + name: "PointsRuleConditions"); + + migrationBuilder.DropTable( + name: "PointsRules"); + + migrationBuilder.DropPrimaryKey( + name: "PK_PointsTransactions", + table: "PointsTransactions"); + + migrationBuilder.DropColumn( + name: "ExpireAt", + table: "PointsTransactions"); + + migrationBuilder.RenameTable( + name: "PointsTransactions", + newName: "PointsTransaction"); + + migrationBuilder.RenameIndex( + name: "IX_PointsTransactions_PointsAccountId", + table: "PointsTransaction", + newName: "IX_PointsTransaction_PointsAccountId"); + + migrationBuilder.AddPrimaryKey( + name: "PK_PointsTransaction", + table: "PointsTransaction", + column: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_fls_wechat_authorization_fls_member_member_id", + table: "fls_wechat_authorization", + column: "member_id", + principalTable: "fls_member", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_PointsTransaction_mka_integraldetails_PointsAccountId", + table: "PointsTransaction", + column: "PointsAccountId", + principalTable: "mka_integraldetails", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/src/Fengling.Member.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Fengling.Member.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs index 034b851..c6ffc10 100644 --- a/src/Fengling.Member.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Fengling.Member.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs @@ -89,6 +89,9 @@ namespace Fengling.Member.Infrastructure.Migrations b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + b.Property("MemberId") .HasColumnType("bigint"); @@ -116,7 +119,116 @@ namespace Fengling.Member.Infrastructure.Migrations b.HasIndex("PointsAccountId"); - b.ToTable("PointsTransaction"); + b.ToTable("PointsTransactions"); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRule", b => + { + b.Property("Id") + .HasColumnType("uuid") + .HasComment("规则标识"); + + b.Property("BasePoints") + .HasColumnType("integer") + .HasComment("基础积分"); + + b.Property("CalculationMode") + .HasColumnType("integer") + .HasComment("计算模式"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasComment("规则编码"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasComment("创建时间"); + + b.Property("EffectiveFrom") + .HasColumnType("timestamp with time zone") + .HasComment("生效开始时间"); + + b.Property("EffectiveTo") + .HasColumnType("timestamp with time zone") + .HasComment("生效结束时间"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasComment("是否启用"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasComment("规则名称"); + + b.Property("Priority") + .HasColumnType("integer") + .HasComment("优先级"); + + b.Property("RuleType") + .HasColumnType("integer") + .HasComment("规则类型"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasComment("更新时间"); + + b.Property("ValidityDays") + .HasColumnType("integer") + .HasComment("有效期天数"); + + b.Property("WeightFactor") + .HasPrecision(18, 4) + .HasColumnType("numeric(18,4)") + .HasComment("权重因子"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("PointsRules", (string)null); + }); + + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRuleCondition", b => + { + b.Property("Id") + .HasColumnType("uuid") + .HasComment("条件标识"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasComment("创建时间"); + + b.Property("DimensionType") + .HasColumnType("integer") + .HasComment("维度类型"); + + b.Property("DimensionValue") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasComment("维度值"); + + b.Property("Operator") + .HasMaxLength(20) + .HasColumnType("character varying(20)") + .HasComment("操作符"); + + b.Property("RuleId") + .HasColumnType("uuid") + .HasComment("关联规则标识"); + + b.HasKey("Id"); + + b.HasIndex("RuleId", "DimensionType"); + + b.ToTable("PointsRuleConditions", (string)null); }); modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberEntity", b => @@ -225,6 +337,49 @@ namespace Fengling.Member.Infrastructure.Migrations b.ToTable("fls_member_tag", (string)null); }); + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.OAuthAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccessToken") + .HasColumnType("text"); + + b.Property("AuthorizedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("MemberId") + .HasColumnType("bigint"); + + b.Property("OpenId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Provider") + .HasColumnType("integer"); + + b.Property("RefreshToken") + .HasColumnType("text"); + + b.Property("TokenExpiredAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UnionId") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("MemberId"); + + b.ToTable("OAuthAuthorization"); + }); + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.WechatAuthorization", b => { b.Property("Id") @@ -391,6 +546,15 @@ namespace Fengling.Member.Infrastructure.Migrations .IsRequired(); }); + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRuleCondition", b => + { + b.HasOne("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberTag", b => { b.HasOne("Fengling.Member.Domain.Aggregates.Users.MemberEntity", null) @@ -400,10 +564,10 @@ namespace Fengling.Member.Infrastructure.Migrations .IsRequired(); }); - modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.WechatAuthorization", b => + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.OAuthAuthorization", b => { b.HasOne("Fengling.Member.Domain.Aggregates.Users.MemberEntity", null) - .WithMany("WechatAuthorizations") + .WithMany("OAuthAuthorizations") .HasForeignKey("MemberId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -414,11 +578,16 @@ namespace Fengling.Member.Infrastructure.Migrations b.Navigation("Transactions"); }); + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.PointsRuleModel.PointsRule", b => + { + b.Navigation("Conditions"); + }); + modelBuilder.Entity("Fengling.Member.Domain.Aggregates.Users.MemberEntity", b => { - b.Navigation("Tags"); + b.Navigation("OAuthAuthorizations"); - b.Navigation("WechatAuthorizations"); + b.Navigation("Tags"); }); #pragma warning restore 612, 618 }