feat(dal): заготовка для хранения истории

This commit is contained in:
Mikhail Trubnikov
2024-10-07 15:08:46 +10:00
parent 5c03b6bc81
commit 4ec47b1dcb
15 changed files with 7144 additions and 84 deletions

View File

@@ -0,0 +1,76 @@
namespace PARR.Constants
{
/// <summary>
/// Компоненты ПАРР
/// </summary>
public enum ParrComponentsEnum
{
// Тут указываем только Worker`ы
// !!! При добавлении новых, добавлять в DataContext !!!
/// <summary>
/// API
/// </summary>
Api = 0,
/// <summary>
/// Загрузчик из АИХИТ
/// </summary>
AihitLoader = 1,
/// <summary>
/// Синхронизатор АИХИТ
/// </summary>
AihitSyncer = 2,
/// <summary>
/// Загрузчик нарядов из ЕСПП
/// </summary>
EsppOrderLoader = 3,
/// <summary>
/// Управление нарядами ЕСПП
/// </summary>
EsppOrderManager = 4,
/// <summary>
/// Синхронизатор расписаний
/// </summary>
EsppScheduleSync = 5,
/// <summary>
/// Синхронизатор шаблонов
/// </summary>
EsppTemplateSync = 6,
/// <summary>
/// Генератор шаблонов
/// </summary>
GeneratorTemplates = 7,
/// <summary>
/// Авто-контроль РР
/// </summary>
JobAutoControl = 8,
/// <summary>
/// Связывание нарядов ЕСПП с ПАРР (шаблонами, агентами)
/// </summary>
Master = 9,
/// <summary>
/// Рассчет даты следующего срабатывания
/// </summary>
NextRun = 10,
/// <summary>
/// Активатор шаблонов / расписаний
/// </summary>
TemplateActivator = 11,
/// <summary>
/// Автораспределение РР
/// </summary>
TemplateDistributor = 12
}
}

View File

@@ -62,6 +62,8 @@ namespace PARR.DAL.Context
public DbSet<DistributionPeriod> DistributionPeriods { get; set; } public DbSet<DistributionPeriod> DistributionPeriods { get; set; }
public DbSet<ParrComponent> ParrComponents { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
@@ -386,6 +388,29 @@ namespace PARR.DAL.Context
#endregion #endregion
#region ParrComponents
modelBuilder.Entity<ParrComponent>(f =>
{
f.HasData(
new() { Id = ParrComponentsEnum.Api, Name = ParrComponentsEnum.Api.ToString(), Description = "API" },
new() { Id = ParrComponentsEnum.AihitLoader, Name = ParrComponentsEnum.AihitLoader.ToString(), Description = "Загрузчик из АИХИТ" },
new() { Id = ParrComponentsEnum.AihitSyncer, Name = ParrComponentsEnum.AihitSyncer.ToString(), Description = "Синхронизатор АИХИТ" },
new() { Id = ParrComponentsEnum.EsppOrderLoader, Name = ParrComponentsEnum.EsppOrderLoader.ToString(), Description = "Загрузчик нарядов из ЕСПП" },
new() { Id = ParrComponentsEnum.EsppOrderManager, Name = ParrComponentsEnum.EsppOrderManager.ToString(), Description = "Управление нарядами ЕСПП" },
new() { Id = ParrComponentsEnum.EsppScheduleSync, Name = ParrComponentsEnum.EsppScheduleSync.ToString(), Description = "Синхронизатор расписаний" },
new() { Id = ParrComponentsEnum.EsppTemplateSync, Name = ParrComponentsEnum.EsppTemplateSync.ToString(), Description = "Синхронизатор шаблонов" },
new() { Id = ParrComponentsEnum.GeneratorTemplates, Name = ParrComponentsEnum.GeneratorTemplates.ToString(), Description = "Генератор шаблонов" },
new() { Id = ParrComponentsEnum.JobAutoControl, Name = ParrComponentsEnum.JobAutoControl.ToString(), Description = "Авто-контроль РР" },
new() { Id = ParrComponentsEnum.Master, Name = ParrComponentsEnum.Master.ToString(), Description = "Связывание нарядов ЕСПП с ПАРР (шаблонами, агентами)" },
new() { Id = ParrComponentsEnum.NextRun, Name = ParrComponentsEnum.NextRun.ToString(), Description = "Рассчет даты следующего срабатывания" },
new() { Id = ParrComponentsEnum.TemplateActivator, Name = ParrComponentsEnum.TemplateActivator.ToString(), Description = "Активатор шаблонов / расписаний" },
new() { Id = ParrComponentsEnum.TemplateDistributor, Name = ParrComponentsEnum.TemplateDistributor.ToString(), Description = "Автораспределение РР" }
);
});
#endregion
} }
//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,62 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class tblParrComponents : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ParrComponents",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ParrComponents", x => x.Id);
});
migrationBuilder.InsertData(
table: "ParrComponents",
columns: new[] { "Id", "Description", "Name" },
values: new object[,]
{
{ 0, "API", "Api" },
{ 1, "Загрузчик из АИХИТ", "AihitLoader" },
{ 2, "Синхронизатор АИХИТ", "AihitSyncer" },
{ 3, "Загрузчик нарядов из ЕСПП", "EsppOrderLoader" },
{ 4, "Управление нарядами ЕСПП", "EsppOrderManager" },
{ 5, "Синхронизатор расписаний", "EsppScheduleSync" },
{ 6, "Синхронизатор шаблонов", "EsppTemplateSync" },
{ 7, "Генератор шаблонов", "GeneratorTemplates" },
{ 8, "Авто-контроль РР", "JobAutoControl" },
{ 9, "Связывание нарядов ЕСПП с ПАРР (шаблонами, агентами)", "Master" },
{ 10, "Рассчет даты следующего срабатывания", "NextRun" },
{ 11, "Активатор шаблонов / расписаний", "TemplateActivator" },
{ 12, "Автораспределение РР", "TemplateDistributor" }
});
migrationBuilder.CreateIndex(
name: "IX_ParrComponents_Name",
table: "ParrComponents",
column: "Name",
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ParrComponents");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,85 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class tblTemplateHistory : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "InitiatorComment",
table: "Templates",
type: "text",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "InitiatorIp",
table: "Templates",
type: "text",
nullable: true);
migrationBuilder.AddColumn<int>(
name: "InitiatorParrComponentId",
table: "Templates",
type: "integer",
nullable: true);
migrationBuilder.CreateTable(
name: "TemplateHistories",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
ParentId = table.Column<Guid>(type: "uuid", nullable: false),
DateAddedToHistory = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
InitiatorIp = table.Column<string>(type: "text", nullable: true),
InitiatorParrComponentId = table.Column<int>(type: "integer", nullable: true),
InitiatorComment = table.Column<string>(type: "text", nullable: true),
DateModified = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
Name = table.Column<string>(type: "text", nullable: false),
IsActiveTemplate = table.Column<bool>(type: "boolean", nullable: false),
IsActiveSchedule = table.Column<bool>(type: "boolean", nullable: false),
LastRun = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
NextRun = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_TemplateHistories", x => x.Id);
table.ForeignKey(
name: "FK_TemplateHistories_Templates_ParentId",
column: x => x.ParentId,
principalTable: "Templates",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_TemplateHistories_ParentId",
table: "TemplateHistories",
column: "ParentId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "TemplateHistories");
migrationBuilder.DropColumn(
name: "InitiatorComment",
table: "Templates");
migrationBuilder.DropColumn(
name: "InitiatorIp",
table: "Templates");
migrationBuilder.DropColumn(
name: "InitiatorParrComponentId",
table: "Templates");
}
}
}

View File

@@ -51,7 +51,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TemplateId"); b.HasIndex("TemplateId");
b.ToTable("AgentHistories", (string)null); b.ToTable("AgentHistories");
}); });
modelBuilder.Entity("PARR.DAL.Models.AgentHistoryLevel", b => modelBuilder.Entity("PARR.DAL.Models.AgentHistoryLevel", b =>
@@ -72,7 +72,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("AgentHistoryLevels", (string)null); b.ToTable("AgentHistoryLevels");
b.HasData( b.HasData(
new new
@@ -101,7 +101,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("WorkGroupId"); b.HasIndex("WorkGroupId");
b.ToTable("AppInWorkInWorkGroups", (string)null); b.ToTable("AppInWorkInWorkGroups");
}); });
modelBuilder.Entity("PARR.DAL.Models.Application", b => modelBuilder.Entity("PARR.DAL.Models.Application", b =>
@@ -130,7 +130,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Name", "ApplicationTypeId") b.HasIndex("Name", "ApplicationTypeId")
.IsUnique(); .IsUnique();
b.ToTable("Applications", (string)null); b.ToTable("Applications");
}); });
modelBuilder.Entity("PARR.DAL.Models.ApplicationInHost", b => modelBuilder.Entity("PARR.DAL.Models.ApplicationInHost", b =>
@@ -157,7 +157,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("HostId"); b.HasIndex("HostId");
b.ToTable("ApplicationsInHost", (string)null); b.ToTable("ApplicationsInHost");
}); });
modelBuilder.Entity("PARR.DAL.Models.ApplicationType", b => modelBuilder.Entity("PARR.DAL.Models.ApplicationType", b =>
@@ -181,7 +181,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("ApplicationTypes", (string)null); b.ToTable("ApplicationTypes");
b.HasData( b.HasData(
new new
@@ -294,7 +294,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("WorkId", "ApplicationId") b.HasIndex("WorkId", "ApplicationId")
.IsUnique(); .IsUnique();
b.ToTable("ApplicationsInWorks", (string)null); b.ToTable("ApplicationsInWorks");
}); });
modelBuilder.Entity("PARR.DAL.Models.DistributionPeriod", b => modelBuilder.Entity("PARR.DAL.Models.DistributionPeriod", b =>
@@ -319,7 +319,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Type"); b.HasIndex("Type");
b.ToTable("DistributionPeriods", (string)null); b.ToTable("DistributionPeriods");
b.HasData( b.HasData(
new new
@@ -349,7 +349,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Type"); b.HasKey("Type");
b.ToTable("DistributionPeriodTypes", (string)null); b.ToTable("DistributionPeriodTypes");
b.HasData( b.HasData(
new new
@@ -383,7 +383,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code"); b.HasKey("Code");
b.ToTable("EkStatuses", (string)null); b.ToTable("EkStatuses");
b.HasData( b.HasData(
new new
@@ -446,7 +446,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("EsppSchTypes", (string)null); b.ToTable("EsppSchTypes");
b.HasData( b.HasData(
new new
@@ -515,7 +515,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TypeScheduleId", "TypeId") b.HasIndex("TypeScheduleId", "TypeId")
.IsUnique(); .IsUnique();
b.ToTable("EsppSchTypeConfigs", (string)null); b.ToTable("EsppSchTypeConfigs");
b.HasData( b.HasData(
new new
@@ -618,7 +618,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("EsppSchTypeSchedules", (string)null); b.ToTable("EsppSchTypeSchedules");
b.HasData( b.HasData(
new new
@@ -691,7 +691,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TypeId"); b.HasIndex("TypeId");
b.ToTable("EsppSchTypeValues", (string)null); b.ToTable("EsppSchTypeValues");
b.HasData( b.HasData(
new new
@@ -1492,7 +1492,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TypeValueId"); b.HasIndex("TypeValueId");
b.ToTable("EsppSchValues", (string)null); b.ToTable("EsppSchValues");
}); });
modelBuilder.Entity("PARR.DAL.Models.Host", b => modelBuilder.Entity("PARR.DAL.Models.Host", b =>
@@ -1539,7 +1539,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("WorkGroupId"); b.HasIndex("WorkGroupId");
b.ToTable("Hosts", (string)null); b.ToTable("Hosts");
}); });
modelBuilder.Entity("PARR.DAL.Models.JobAutoControl", b => modelBuilder.Entity("PARR.DAL.Models.JobAutoControl", b =>
@@ -1583,7 +1583,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ApplicationInWorkId") b.HasIndex("ApplicationInWorkId")
.IsUnique(); .IsUnique();
b.ToTable("JobAutoControls", (string)null); b.ToTable("JobAutoControls");
}); });
modelBuilder.Entity("PARR.DAL.Models.JobAutoControlInEkStatus", b => modelBuilder.Entity("PARR.DAL.Models.JobAutoControlInEkStatus", b =>
@@ -1598,7 +1598,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("EkStatusCode"); b.HasIndex("EkStatusCode");
b.ToTable("JobAutoControlInEkStatus", (string)null); b.ToTable("JobAutoControlInEkStatus");
}); });
modelBuilder.Entity("PARR.DAL.Models.JobEkMask", b => modelBuilder.Entity("PARR.DAL.Models.JobEkMask", b =>
@@ -1622,7 +1622,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("JobAutoControlId", "Name") b.HasIndex("JobAutoControlId", "Name")
.IsUnique(); .IsUnique();
b.ToTable("JobEkMasks", (string)null); b.ToTable("JobEkMasks");
}); });
modelBuilder.Entity("PARR.DAL.Models.Order", b => modelBuilder.Entity("PARR.DAL.Models.Order", b =>
@@ -1674,7 +1674,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TemplateId"); b.HasIndex("TemplateId");
b.ToTable("Orders", (string)null); b.ToTable("Orders");
}); });
modelBuilder.Entity("PARR.DAL.Models.OrderStatus", b => modelBuilder.Entity("PARR.DAL.Models.OrderStatus", b =>
@@ -1695,7 +1695,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code"); b.HasKey("Code");
b.ToTable("OrderStatuses", (string)null); b.ToTable("OrderStatuses");
b.HasData( b.HasData(
new new
@@ -1730,6 +1730,107 @@ namespace PARR.DAL.Migrations
}); });
}); });
modelBuilder.Entity("PARR.DAL.Models.ParrComponent", b =>
{
b.Property<int>("Id")
.HasColumnType("integer");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("ParrComponents");
b.HasData(
new
{
Id = 0,
Description = "API",
Name = "Api"
},
new
{
Id = 1,
Description = "Загрузчик из АИХИТ",
Name = "AihitLoader"
},
new
{
Id = 2,
Description = "Синхронизатор АИХИТ",
Name = "AihitSyncer"
},
new
{
Id = 3,
Description = "Загрузчик нарядов из ЕСПП",
Name = "EsppOrderLoader"
},
new
{
Id = 4,
Description = "Управление нарядами ЕСПП",
Name = "EsppOrderManager"
},
new
{
Id = 5,
Description = "Синхронизатор расписаний",
Name = "EsppScheduleSync"
},
new
{
Id = 6,
Description = "Синхронизатор шаблонов",
Name = "EsppTemplateSync"
},
new
{
Id = 7,
Description = "Генератор шаблонов",
Name = "GeneratorTemplates"
},
new
{
Id = 8,
Description = "Авто-контроль РР",
Name = "JobAutoControl"
},
new
{
Id = 9,
Description = "Связывание нарядов ЕСПП с ПАРР (шаблонами, агентами)",
Name = "Master"
},
new
{
Id = 10,
Description = "Рассчет даты следующего срабатывания",
Name = "NextRun"
},
new
{
Id = 11,
Description = "Активатор шаблонов / расписаний",
Name = "TemplateActivator"
},
new
{
Id = 12,
Description = "Автораспределение РР",
Name = "TemplateDistributor"
});
});
modelBuilder.Entity("PARR.DAL.Models.Process", b => modelBuilder.Entity("PARR.DAL.Models.Process", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@@ -1754,7 +1855,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("EsppId") b.HasIndex("EsppId")
.IsUnique(); .IsUnique();
b.ToTable("Processes", (string)null); b.ToTable("Processes");
}); });
modelBuilder.Entity("PARR.DAL.Models.ResponseArea", b => modelBuilder.Entity("PARR.DAL.Models.ResponseArea", b =>
@@ -1771,7 +1872,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code"); b.HasKey("Code");
b.ToTable("ResponseAreas", (string)null); b.ToTable("ResponseAreas");
b.HasData( b.HasData(
new new
@@ -1897,7 +1998,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Name") b.HasIndex("Name")
.IsUnique(); .IsUnique();
b.ToTable("Robots", (string)null); b.ToTable("Robots");
b.HasData( b.HasData(
new new
@@ -1952,7 +2053,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TemplateId", "RobotCode") b.HasIndex("TemplateId", "RobotCode")
.IsUnique(); .IsUnique();
b.ToTable("RobotConfigurations", (string)null); b.ToTable("RobotConfigurations");
}); });
modelBuilder.Entity("PARR.DAL.Models.RobotHistory", b => modelBuilder.Entity("PARR.DAL.Models.RobotHistory", b =>
@@ -1990,7 +2091,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TaskStatusCode"); b.HasIndex("TaskStatusCode");
b.ToTable("RobotHistories", (string)null); b.ToTable("RobotHistories");
}); });
modelBuilder.Entity("PARR.DAL.Models.RobotHistoryLevel", b => modelBuilder.Entity("PARR.DAL.Models.RobotHistoryLevel", b =>
@@ -2011,7 +2112,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Level"); b.HasKey("Level");
b.ToTable("RobotHistoryLevels", (string)null); b.ToTable("RobotHistoryLevels");
b.HasData( b.HasData(
new new
@@ -2058,7 +2159,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code"); b.HasKey("Code");
b.ToTable("RobotStatuses", (string)null); b.ToTable("RobotStatuses");
b.HasData( b.HasData(
new new
@@ -2106,7 +2207,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("Roles", (string)null); b.ToTable("Roles");
b.HasData( b.HasData(
new new
@@ -2140,7 +2241,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Name"); b.HasKey("Name");
b.ToTable("Settings", (string)null); b.ToTable("Settings");
b.HasData( b.HasData(
new new
@@ -2246,7 +2347,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ProcessId"); b.HasIndex("ProcessId");
b.ToTable("Subprocesses", (string)null); b.ToTable("Subprocesses");
}); });
modelBuilder.Entity("PARR.DAL.Models.TaskStatus", b => modelBuilder.Entity("PARR.DAL.Models.TaskStatus", b =>
@@ -2267,7 +2368,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code"); b.HasKey("Code");
b.ToTable("TaskStatuses", (string)null); b.ToTable("TaskStatuses");
b.HasData( b.HasData(
new new
@@ -2308,6 +2409,15 @@ namespace PARR.DAL.Migrations
b.Property<Guid>("HostId") b.Property<Guid>("HostId")
.HasColumnType("uuid"); .HasColumnType("uuid");
b.Property<string>("InitiatorComment")
.HasColumnType("text");
b.Property<string>("InitiatorIp")
.HasColumnType("text");
b.Property<int?>("InitiatorParrComponentId")
.HasColumnType("integer");
b.Property<bool>("IsActiveSchedule") b.Property<bool>("IsActiveSchedule")
.HasColumnType("boolean"); .HasColumnType("boolean");
@@ -2336,7 +2446,54 @@ namespace PARR.DAL.Migrations
b.HasIndex("Name") b.HasIndex("Name")
.IsUnique(); .IsUnique();
b.ToTable("Templates", (string)null); b.ToTable("Templates");
});
modelBuilder.Entity("PARR.DAL.Models.TemplateHistory", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<DateTimeOffset>("DateAddedToHistory")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset?>("DateModified")
.HasColumnType("timestamp with time zone");
b.Property<string>("InitiatorComment")
.HasColumnType("text");
b.Property<string>("InitiatorIp")
.HasColumnType("text");
b.Property<int?>("InitiatorParrComponentId")
.HasColumnType("integer");
b.Property<bool>("IsActiveSchedule")
.HasColumnType("boolean");
b.Property<bool>("IsActiveTemplate")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LastRun")
.HasColumnType("timestamp with time zone");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<DateTimeOffset>("NextRun")
.HasColumnType("timestamp with time zone");
b.Property<Guid>("ParentId")
.HasColumnType("uuid");
b.HasKey("Id");
b.HasIndex("ParentId");
b.ToTable("TemplateHistories");
}); });
modelBuilder.Entity("PARR.DAL.Models.Tnk", b => modelBuilder.Entity("PARR.DAL.Models.Tnk", b =>
@@ -2368,7 +2525,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("SubprocessId"); b.HasIndex("SubprocessId");
b.ToTable("Tnks", (string)null); b.ToTable("Tnks");
}); });
modelBuilder.Entity("PARR.DAL.Models.User", b => modelBuilder.Entity("PARR.DAL.Models.User", b =>
@@ -2399,7 +2556,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Ip") b.HasIndex("Ip")
.IsUnique(); .IsUnique();
b.ToTable("Users", (string)null); b.ToTable("Users");
}); });
modelBuilder.Entity("PARR.DAL.Models.UsersInRole", b => modelBuilder.Entity("PARR.DAL.Models.UsersInRole", b =>
@@ -2414,7 +2571,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("UserId"); b.HasIndex("UserId");
b.ToTable("UsersInRoles", (string)null); b.ToTable("UsersInRoles");
}); });
modelBuilder.Entity("PARR.DAL.Models.WeekendDay", b => modelBuilder.Entity("PARR.DAL.Models.WeekendDay", b =>
@@ -2431,7 +2588,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Date") b.HasIndex("Date")
.IsUnique(); .IsUnique();
b.ToTable("WeekendDays", (string)null); b.ToTable("WeekendDays");
}); });
modelBuilder.Entity("PARR.DAL.Models.Work", b => modelBuilder.Entity("PARR.DAL.Models.Work", b =>
@@ -2466,7 +2623,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TnkId"); b.HasIndex("TnkId");
b.ToTable("Works", (string)null); b.ToTable("Works");
}); });
modelBuilder.Entity("PARR.DAL.Models.WorkGroup", b => modelBuilder.Entity("PARR.DAL.Models.WorkGroup", b =>
@@ -2489,7 +2646,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ResponseAreaCode"); b.HasIndex("ResponseAreaCode");
b.ToTable("WorkGroups", (string)null); b.ToTable("WorkGroups");
}); });
modelBuilder.Entity("PARR.DAL.Models.AgentHistory", b => modelBuilder.Entity("PARR.DAL.Models.AgentHistory", b =>
@@ -2840,6 +2997,17 @@ namespace PARR.DAL.Migrations
b.Navigation("Host"); b.Navigation("Host");
}); });
modelBuilder.Entity("PARR.DAL.Models.TemplateHistory", b =>
{
b.HasOne("PARR.DAL.Models.Template", "Template")
.WithMany("TemplateHistories")
.HasForeignKey("ParentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Template");
});
modelBuilder.Entity("PARR.DAL.Models.Tnk", b => modelBuilder.Entity("PARR.DAL.Models.Tnk", b =>
{ {
b.HasOne("PARR.DAL.Models.Subprocess", "Subprocess") b.HasOne("PARR.DAL.Models.Subprocess", "Subprocess")
@@ -3041,6 +3209,8 @@ namespace PARR.DAL.Migrations
b.Navigation("Orders"); b.Navigation("Orders");
b.Navigation("RobotConfigurations"); b.Navigation("RobotConfigurations");
b.Navigation("TemplateHistories");
}); });
modelBuilder.Entity("PARR.DAL.Models.Tnk", b => modelBuilder.Entity("PARR.DAL.Models.Tnk", b =>

View File

@@ -0,0 +1,25 @@
using PARR.Constants;
namespace PARR.DAL.Models.Base.History.Base
{
/// <summary>
/// Инициатор изменений, ведение истории
/// </summary>
public interface IHistoryInitiator
{
/// <summary>
/// IP инициатора изменений (пользователь)
/// </summary>
public string? InitiatorIp { get; set; }
/// <summary>
/// Id инициатора компонента ПАРР
/// </summary>
public ParrComponentsEnum? InitiatorParrComponentId { get; set; }
/// <summary>
/// Комментарий от инициатора
/// </summary>
public string? InitiatorComment { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
namespace PARR.DAL.Models.Base.History.Base
{
/// <summary>
/// Таблица отслеживания изменений основной таблицы (таблица истории)
/// </summary>
public interface IHistoryTable : IBase
{
/// <summary>
/// Id записи в родительской таблице
/// </summary>
public Guid ParentId { get; set; }
/// <summary>
/// Дата добавления в историю
/// </summary>
public DateTimeOffset DateAddedToHistory { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace PARR.DAL.Models.Base.History.Base
{
/// <summary>
/// По этому интерфейсу определям, что хотим вести историю.
/// В родительской таблице, по которой ведется история, указываются настройки истории.
/// </summary>
/// <typeparam name="HistoryTable">Таблица истории</typeparam>
public interface IMyHistory<HistoryTable> where HistoryTable : class { }
}

View File

@@ -1,7 +1,9 @@
namespace PARR.DAL.Models.Base namespace PARR.DAL.Models.Base.History
{ {
public interface ITemplateBase public interface ITemplateGeneralProps
{ {
public string Name { get; set; }
public bool IsActiveTemplate { get; set; } public bool IsActiveTemplate { get; set; }
public bool IsActiveSchedule { get; set; } public bool IsActiveSchedule { get; set; }

View File

@@ -0,0 +1,19 @@
using Microsoft.EntityFrameworkCore;
using PARR.Constants;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models
{
[Table("ParrComponents")]
[Index(nameof(Name), IsUnique = true)]
public class ParrComponent
{
[Key]
public ParrComponentsEnum Id { get; set; }
public required string Name { get; set; }
public required string Description { get; set; }
}
}

View File

@@ -1,5 +1,8 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using PARR.Constants;
using PARR.DAL.Models.Base; using PARR.DAL.Models.Base;
using PARR.DAL.Models.Base.History;
using PARR.DAL.Models.Base.History.Base;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
@@ -7,7 +10,7 @@ namespace PARR.DAL.Models
{ {
[Table("Templates")] [Table("Templates")]
[Index(nameof(Name), IsUnique = true)] [Index(nameof(Name), IsUnique = true)]
public class Template : IBase, ITemplateBase public class Template : IBase, ITemplateGeneralProps, IHistoryInitiator, IMyHistory<TemplateHistory>
{ {
[Key] [Key]
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -41,12 +44,19 @@ namespace PARR.DAL.Models
public DateTimeOffset? LastRun { get; set; } public DateTimeOffset? LastRun { get; set; }
public DateTimeOffset NextRun { get; set; } public DateTimeOffset NextRun { get; set; }
public Guid ApplicationInWorkId { get; set; } public Guid ApplicationInWorkId { get; set; }
#region Initiator
public string? InitiatorIp { get; set; }
public ParrComponentsEnum? InitiatorParrComponentId { get; set; }
public string? InitiatorComment { get; set; }
#endregion
[ForeignKey(nameof(ApplicationInWorkId))] [ForeignKey(nameof(ApplicationInWorkId))]
public ApplicationsInWork? ApplicationsInWork { get; set; } public ApplicationsInWork? ApplicationsInWork { get; set; }
@@ -62,6 +72,8 @@ namespace PARR.DAL.Models
public ICollection<Order> Orders { get; set; } = new HashSet<Order>(); public ICollection<Order> Orders { get; set; } = new HashSet<Order>();
//public ICollection<TemplateHistory> TemplateHistories { get; set; } = new HashSet<TemplateHistory>();
public ICollection<TemplateHistory> TemplateHistories { get; set; } = new HashSet<TemplateHistory>();
} }
} }

View File

@@ -1,24 +1,36 @@
using PARR.DAL.Models.Base; using PARR.Constants;
using PARR.DAL.Models.Base;
using PARR.DAL.Models.Base.History;
using PARR.DAL.Models.Base.History.Base;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models namespace PARR.DAL.Models
{ {
[Table("TemplateHistories")] [Table("TemplateHistories")]
public class TemplateHistory : IBase, ITemplateBase public class TemplateHistory : IBase, ITemplateGeneralProps, IHistoryInitiator, IHistoryTable
{ {
//!!! Не используется !!!
[Key] [Key]
public Guid Id { get; set; } public Guid Id { get; set; }
public Guid ParentId { get; set; }
public DateTimeOffset DateAddedToHistory { get; set; }
public string? InitiatorIp { get; set; }
public ParrComponentsEnum? InitiatorParrComponentId { get; set; }
public string? InitiatorComment { get; set; }
[NotMapped] [NotMapped]
public DateTimeOffset DateCreated { get; set; } public DateTimeOffset DateCreated { get; set; }
public DateTimeOffset? DateModified { get; set; } public DateTimeOffset? DateModified { get; set; }
public Guid TemplateId { get; set; } public required string Name { get; set; }
public bool IsActiveTemplate { get; set; } public bool IsActiveTemplate { get; set; }
@@ -28,8 +40,9 @@ namespace PARR.DAL.Models
public DateTimeOffset NextRun { get; set; } public DateTimeOffset NextRun { get; set; }
//[ForeignKey(nameof(TemplateId))]
//public Template? Template { get; set; } [ForeignKey(nameof(ParentId))]
public Template? Template { get; set; }
} }

View File

@@ -1,10 +1,14 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using PARR.DAL.Context; using PARR.DAL.Context;
using PARR.DAL.DomainModels; using PARR.DAL.DomainModels;
using PARR.DAL.Models; using PARR.DAL.Models;
using PARR.DAL.Models.Base; using PARR.DAL.Models.Base;
using PARR.DAL.Models.Base.History;
using PARR.DAL.Models.Base.History.Base;
using PARR.DAL.Services.Interfaces.Base; using PARR.DAL.Services.Interfaces.Base;
using System.Reflection;
namespace PARR.DAL.Services.Abstracts namespace PARR.DAL.Services.Abstracts
{ {
@@ -38,39 +42,17 @@ namespace PARR.DAL.Services.Abstracts
public async Task<bool> CommitAsync() public async Task<bool> CommitAsync()
{ {
#region test var modifiedEntrities = EntitiContext.ChangeTracker.Entries()
////https://stackoverflow.com/questions/53064528/entityframework-core-get-changes-occured-in-entity-and-related-data .Where(t => t.State == EntityState.Modified/* || t.State == EntityState.Deleted*/);
//var modifiedEntrities = EntitiContext.ChangeTracker.Entries()
// .Where(t => t.State == EntityState.Modified || t.State == EntityState.Deleted);
//foreach (var change in modifiedEntrities) foreach (var obj in modifiedEntrities)
//{ {
// ////var type = change.Entity.GetType(); // Если нунжо, обновляем дату изменения
// ////var userType = typeof(User); DateModifiedResolver(obj);
// if (change.Entity.GetType() == typeof(User))
// {
// // это пользователь
// var user = change.Entity as User;
// if (user!.Name == "string")
// {
// //user.LastLogon = DateTimeOffset.UtcNow;
// user.Description = "Новый description " + DateTime.Now.Microsecond;
// }
// } //Если нужно, пишем историю
TableHistoryResolver(obj);
// // интерфейс IBase? }
// //if (change.Entity.GetType().IsAssignableFrom(typeof(IBase)))
// if (change.Entity.GetType().GetInterface(nameof(IBase)) != null)
// {
// (change.Entity as IBase)!.DateModified = DateTimeOffset.UtcNow;
// }
//}
#endregion
try try
{ {
@@ -84,6 +66,151 @@ namespace PARR.DAL.Services.Abstracts
} }
} }
/// <summary>
/// Обновления DateModified у таблиц с IBase
/// </summary>
/// <param name="obj"></param>
private void DateModifiedResolver(EntityEntry obj)
{
if (obj.Entity is IBase)
(obj.Entity as IBase)!.DateModified = DateTimeOffset.UtcNow;
}
/// <summary>
/// При необходимости, записывать историю таблиц
/// </summary>
/// <param name="obj"></param>
private void TableHistoryResolver(EntityEntry obj)
{
var myHistoryInterface = obj.Entity.GetType().GetInterfaces()
.Where(t => t.IsGenericType)
.Where(t => t.GetGenericTypeDefinition() == typeof(IMyHistory<>))
.FirstOrDefault();
// у этого объекта нет интерфейса IMyHistory<>. Не ведем историю
if (myHistoryInterface == null)
return;
// !!! Эта таблица хочет хранить историю !!!
// Получаем тип таблицы где хранится история
var historyType = myHistoryInterface.GetGenericArguments().First();
var historyProps = historyType.GetProperties(/*BindingFlags.DeclaredOnly | */ /*BindingFlags.Public*/).ToList();
var historyInstance = Activator.CreateInstance(historyType);
if (historyInstance == null)
{
logger.LogError($"Не смог создать инстанс для ведения истории {historyType.Name}");
return;
}
// Заполняем поля истории, полями которые есть в исходной таблице
FillHistoryProps(obj, ref historyInstance, historyProps);
// Заполняем поля интерфейса IHistoryTable
// Заполняем Id
// EntitiContext.Add(historyInstance);
}
/// <summary>
/// Заполнить объект истории
/// </summary>
/// <param name="originalObj"></param>
/// <param name="historyInstance"></param>
/// <param name="propsList"></param>
private void FillHistoryProps(EntityEntry originalObj, ref object historyInstance, List<PropertyInfo> propsList)
{
foreach (var prop in propsList)
{
if (originalObj.OriginalValues.Properties.FirstOrDefault(t => t.Name == prop.Name) == null)
continue;
var sourceObjProp = originalObj.Property(prop.Name);
if (sourceObjProp == null)
return;
//Смотрим, если это Id, записываем его в ParentId
var histPropName = prop.Name == nameof(IBase.Id) ? nameof(IHistoryTable.ParentId) : prop.Name;
var histProp = historyInstance.GetType().GetProperty(histPropName);
if (histProp == null) continue;
//сравним типы
if (sourceObjProp.Metadata.PropertyInfo?.PropertyType != histProp.PropertyType)
continue;
var origValues = originalObj.Property(prop.Name).OriginalValue;
histProp.SetValue(historyInstance, origValues);
}
}
//private void SaveHistory(EntityEntry obj)
//{
// // пока просто попробуем для шаблонов
// if (obj.Entity is Template == false)
// return;
// var template = (Template)obj.Entity;
// // https://stackoverflow.com/questions/15012621/how-to-get-original-entity-from-changetracker
// var history = new TemplateHistory();
// // {
// history.Id = Guid.NewGuid();
// history.ParentId = template.Id;
// history.DateAddedToHistory = DateTimeOffset.UtcNow;
// history.InitiatorIp = null;
// history.InitiatorParrComponentId = null;
// history.InitiatorComment = null;
// //---
// //DateModified="",
// //Name ="",
// //IsActiveTemplate = null,
// //IsActiveSchedule = null,
// //LastRun = null,
// //NextRun = null
// // DateModified = template.DateModified,
// // Name = template.Name,
// // IsActiveTemplate = template.IsActiveTemplate,
// // IsActiveSchedule = template.IsActiveSchedule,
// // LastRun = template.LastRun,
// // NextRun = template.NextRun
// //};
// // obj.OriginalValues.GetValue
// //ITemplateBase хочу получить все поля из интерфейса, потом заполнить по ним в хистори
// var interfaceType = typeof(ITemplateGeneralProps);
// foreach (var prop in interfaceType.GetProperties())
// {
// var propName = prop.Name;
// //var propType = prop.PropertyType;
// var originalPropValue = obj.OriginalValues.GetValue<object>(propName);
// var histProp = history.GetType().GetProperty(propName);
// histProp.SetValue(histProp, originalPropValue);
// }
// EntitiContext.Add(history);
//}
public virtual async Task<bool> CreateAsync(T obj) public virtual async Task<bool> CreateAsync(T obj)
{ {
obj.DateCreated = DateTimeOffset.UtcNow; obj.DateCreated = DateTimeOffset.UtcNow;