diff --git a/GSS2.Core/Analysis/AmineContent/Database/BrandRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/BrandRecord.cs new file mode 100644 index 0000000..1ca58fe --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/BrandRecord.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; + +using Microsoft.EntityFrameworkCore; + +namespace GSS2.Core.Analysis.AmineContent.Database; + +public class BrandRecord +{ + [Comment("Идентификатор")] + public int Id { get; set; } + [Comment("Уникальный идентификатор")] + [MaxLength(36)] + public string Uuid { get; set; } + [Comment("Марка пробы")] + [MaxLength(256)] + public string BrandName { get; set; } + [Comment("Название кондиционирующей смеси")] + [MaxLength(256)] + public string MixtureName { get; set; } + [Comment("Норма расхода кондиционирующей смеси (кг/т | гр/кг)")] + public double MixtureNormalRate { get; set; } + + public BrandRecord() + : this(0, null, "", "", 0) + { } + + public BrandRecord( + int id = 0, + string? uuid = null, + string brandName = "", + string mixtureName = "", + double mixtureNormalRate = 0) + { + Id = id; + if (uuid is null) + Uuid = Guid.NewGuid().ToString(); + else + Uuid = uuid; + BrandName = brandName; + MixtureName = mixtureName; + MixtureNormalRate = mixtureNormalRate; + } +} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/CalibrationContext.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/CalibrationContext.cs deleted file mode 100644 index 558e6c0..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/CalibrationContext.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; - -public class CalibrationContext : DbContext -{ - public DbSet SeparatorRecords => Set(); - public DbSet SampleRecords => Set(); - public DbSet VectorRecords => Set(); - - public CalibrationContext(DbContextOptions options) - : base(options) - { } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasMany(x => x.VectorRecords) - .WithOne(x => x.SeparatorRecord) - .HasForeignKey(x => x.SeparatorRecordId) - .OnDelete(DeleteBehavior.Cascade); - - modelBuilder.Entity() - .HasMany(x => x.VectorRecords) - .WithOne(x => x.SampleRecord) - .HasForeignKey(x => x.SampleRecordId) - .OnDelete(DeleteBehavior.Cascade); - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/SampleRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/SampleRecord.cs deleted file mode 100644 index cc3cb17..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/SampleRecord.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; - -public record SampleRecord -{ - [Comment("Уникальный идентификатор")] - public int Id { get; set; } - [Comment("Название пробы")] - [MaxLength(256)] - public required string SampleName { get; set; } - [Comment("Дополнительная информация о пробе")] - [MaxLength(512)] - public required string SampleComment { get; set; } - [Comment("Марка пробы")] - [MaxLength(256)] - public required string SampleBrand { get; set; } - [Comment("Масса пробы (кг)")] - public required double SampleMass { get; set; } - [Comment("Дата и время отбора пробы")] - public required DateTime SamplingDateTime { get; set; } - [Comment("Место отбора пробы")] - [MaxLength(256)] - public required string SamplingPlace { get; set; } - [Comment("Название используемой кондиционирующей смеси")] - [MaxLength(256)] - public required string MixtureName { get; set; } - [Comment("Содержание аминов в кондиционирующей смеси (%)")] - public required double MixtureAmineContent { get; set; } - [Comment("Норма расхода кондиционирующей смеси (кг/т | гр/кг)")] - public required double MixtureNormalRate { get; set; } - [Comment("Фактический расход кондиционирующей смеси (кг/т | гр/кг)")] - public required double MixtureActualRate { get; set; } - [Comment("Измеренное количество масла (кг/т | гр/кг)")] - public required double MeasuredContent { get; set; } - [Comment("Изображение")] - [MaxLength(256)] - public required string Image { get; set; } - [Comment("Векторы")] - public required List VectorRecords { get; set; } = new(); -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/SeparatorRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/SeparatorRecord.cs deleted file mode 100644 index 7e559ea..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/SeparatorRecord.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; - -public record SeparatorRecord -{ - [Comment("Уникальный идентификатор")] - public int Id { get; set; } - [Comment("Тип сепаратора")] - [MaxLength(256)] - public required string Type { get; set; } - [Comment("Партия сепаратора")] - [MaxLength(256)] - public required string Batch { get; set; } - [Comment("Изображение")] - [MaxLength(256)] - public required string Image { get; set; } - [Comment("Векторы")] - public required List VectorRecords { get; set; } = new(); -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/VectorRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/Calibration/VectorRecord.cs deleted file mode 100644 index e120cbf..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/VectorRecord.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; - -public record VectorRecord -{ - [Comment("Уникальный идентификатор")] - public int Id { get; set; } - [Comment("Значения вектора")] - public required float[] Values { get; set; } - - public int? SeparatorRecordId { get; set; } - public SeparatorRecord? SeparatorRecord { get; set; } - - public int? SampleRecordId { get; set; } - public SampleRecord? SampleRecord { get; set; } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Context.cs b/GSS2.Core/Analysis/AmineContent/Database/Context.cs new file mode 100644 index 0000000..207cb35 --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/Context.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; + +namespace GSS2.Core.Analysis.AmineContent.Database; + +public class Context : DbContext +{ + public DbSet BrandRecords => Set(); + public DbSet FeatureRecords => Set(); + public DbSet ImageRecords => Set(); + // public DbSet ResultRecords => Set(); + public DbSet SeparatorRecords => Set(); + public DbSet SampleRecords => Set(); + + public Context(DbContextOptions options) + : base(options) + { } +} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/CalibrationContextFactory.cs b/GSS2.Core/Analysis/AmineContent/Database/ContextFactory.cs similarity index 50% rename from GSS2.Core/Analysis/AmineContent/Database/Calibration/CalibrationContextFactory.cs rename to GSS2.Core/Analysis/AmineContent/Database/ContextFactory.cs index d5cdf23..d8201fe 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/CalibrationContextFactory.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/ContextFactory.cs @@ -1,18 +1,18 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration; +namespace GSS2.Core.Analysis.AmineContent.Database; -public class CalibrationContextFactory : IDesignTimeDbContextFactory +public class ContextFactory : IDesignTimeDbContextFactory { - public CalibrationContext CreateDbContext(string[] args) + public Context CreateDbContext(string[] args) { - var optionsBuilder = new DbContextOptionsBuilder(); + var optionsBuilder = new DbContextOptionsBuilder(); // Строка подключения для миграций в design-time // в runtime должна использоваться настоящая ConnectionString optionsBuilder.UseSqlite("Data Source=AmineContentCalibration.db"); - return new CalibrationContext(optionsBuilder.Options); + return new Context(optionsBuilder.Options); } } diff --git a/GSS2.Core/Analysis/AmineContent/Database/FeatureRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/FeatureRecord.cs new file mode 100644 index 0000000..ebe7485 --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/FeatureRecord.cs @@ -0,0 +1,37 @@ +using System.ComponentModel.DataAnnotations; + +using Microsoft.EntityFrameworkCore; + +namespace GSS2.Core.Analysis.AmineContent.Database; + +public class FeatureRecord +{ + [Comment("Идентификатор")] + public int Id { get; set; } + [Comment("Значения вектора")] + public List Values { get; set; } + [Comment("Сепаратор")] + public int SeparatorRecordId { get; set; } + [Comment("Проба")] + public int SampleRecordId { get; set; } + + public FeatureRecord() + : this(0, null, 0, 0) + { } + + public FeatureRecord( + int id = 0, + List? values = null, + int separatorRecordId = 0, + int sampleRecordId = 0 + ) + { + Id = id; + if (values is null) + Values = new List(); + else + Values = values; + SeparatorRecordId = separatorRecordId; + SampleRecordId = sampleRecordId; + } +} diff --git a/GSS2.Core/Analysis/AmineContent/Database/ImageRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/ImageRecord.cs new file mode 100644 index 0000000..f955d56 --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/ImageRecord.cs @@ -0,0 +1,26 @@ +using System.ComponentModel.DataAnnotations.Schema; + +using Microsoft.EntityFrameworkCore; + +namespace GSS2.Core.Analysis.AmineContent.Database; + +public class ImageRecord +{ + [Comment("Идентификатор")] + public int Id { get; set; } + [Comment("Значения вектора")] + public string Base64 { get; set; } + + public ImageRecord() + : this(0, "") + { } + + public ImageRecord( + int id = 0, + string base64 = "" + ) + { + Id = id; + Base64 = base64; + } +} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/20260428223237_Calibration0.Designer.cs b/GSS2.Core/Analysis/AmineContent/Database/Migrations/20260615113305_Migration0.Designer.cs similarity index 60% rename from GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/20260428223237_Calibration0.Designer.cs rename to GSS2.Core/Analysis/AmineContent/Database/Migrations/20260615113305_Migration0.Designer.cs index 98a1c29..4ef0c6d 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/20260428223237_Calibration0.Designer.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Migrations/20260615113305_Migration0.Designer.cs @@ -1,6 +1,6 @@ // using System; -using GSS2.Core.Analysis.AmineContent.Database.Calibration; +using GSS2.Core.Analysis.AmineContent.Database; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; @@ -8,11 +8,11 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations +namespace GSS2.Core.Analysis.AmineContent.Database.Migrations { - [DbContext(typeof(CalibrationContext))] - [Migration("20260428223237_Calibration0")] - partial class Calibration0 + [DbContext(typeof(Context))] + [Migration("20260615113305_Migration0")] + partial class Migration0 { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -20,46 +20,109 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SampleRecord", b => + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.BrandRecord", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); + .HasComment("Идентификатор"); - b.Property("Image") + b.Property("BrandName") .IsRequired() .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Изображение"); - - b.Property("MeasuredContent") - .HasColumnType("REAL") - .HasComment("Измеренное количество масла (кг/т | гр/кг)"); - - b.Property("MixtureActualRate") - .HasColumnType("REAL") - .HasComment("Фактический расход кондиционирующей смеси (кг/т | гр/кг)"); - - b.Property("MixtureAmineContent") - .HasColumnType("REAL") - .HasComment("Содержание аминов в кондиционирующей смеси (%)"); + .HasComment("Марка пробы"); b.Property("MixtureName") .IsRequired() .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Название используемой кондиционирующей смеси"); + .HasComment("Название кондиционирующей смеси"); b.Property("MixtureNormalRate") .HasColumnType("REAL") .HasComment("Норма расхода кондиционирующей смеси (кг/т | гр/кг)"); - b.Property("SampleBrand") + b.Property("Uuid") .IsRequired() - .HasMaxLength(256) + .HasMaxLength(36) .HasColumnType("TEXT") - .HasComment("Марка пробы"); + .HasComment("Уникальный идентификатор"); + + b.HasKey("Id"); + + b.ToTable("BrandRecords"); + }); + + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.FeatureRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasComment("Идентификатор"); + + b.Property("SampleRecordId") + .HasColumnType("INTEGER") + .HasComment("Проба"); + + b.Property("SeparatorRecordId") + .HasColumnType("INTEGER") + .HasComment("Сепаратор"); + + b.PrimitiveCollection("Values") + .IsRequired() + .HasColumnType("TEXT") + .HasComment("Значения вектора"); + + b.HasKey("Id"); + + b.ToTable("FeatureRecords"); + }); + + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.ImageRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasComment("Идентификатор"); + + b.Property("Base64") + .IsRequired() + .HasColumnType("TEXT") + .HasComment("Значения вектора"); + + b.HasKey("Id"); + + b.ToTable("ImageRecords"); + }); + + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.SampleRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasComment("Идентификатор"); + + b.Property("BrandId") + .HasColumnType("INTEGER") + .HasComment("Марка"); + + b.PrimitiveCollection("FeatureIds") + .IsRequired() + .HasColumnType("TEXT") + .HasComment("Признаки"); + + b.Property("ImageId") + .HasColumnType("INTEGER") + .HasComment("Изображение"); + + b.Property("MeasuredContent") + .HasColumnType("REAL") + .HasComment("Измеренное количество кондиционирующей смеси (кг/т | гр/кг)"); + + b.Property("MixtureActualRate") + .HasColumnType("REAL") + .HasComment("Фактический расход кондиционирующей смеси (кг/т | гр/кг)"); b.Property("SampleComment") .IsRequired() @@ -67,10 +130,6 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations .HasColumnType("TEXT") .HasComment("Дополнительная информация о пробе"); - b.Property("SampleMass") - .HasColumnType("REAL") - .HasComment("Масса пробы (кг)"); - b.Property("SampleName") .IsRequired() .HasMaxLength(256) @@ -79,7 +138,7 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations b.Property("SamplingDateTime") .HasColumnType("TEXT") - .HasComment("Дата и время отбора пробы"); + .HasComment("Дата и время отбора пробы (utc)"); b.Property("SamplingPlace") .IsRequired() @@ -87,94 +146,49 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations .HasColumnType("TEXT") .HasComment("Место отбора пробы"); + b.Property("Uuid") + .IsRequired() + .HasMaxLength(36) + .HasColumnType("TEXT") + .HasComment("Уникальный идентификатор"); + b.HasKey("Id"); b.ToTable("SampleRecords"); }); - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b => + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.SeparatorRecord", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); + .HasComment("Идентификатор"); - b.Property("Batch") + b.PrimitiveCollection("FeatureIds") .IsRequired() - .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Партия сепаратора"); + .HasComment("Признаки"); - b.Property("Image") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") + b.Property("ImageId") + .HasColumnType("INTEGER") .HasComment("Изображение"); b.Property("Type") .IsRequired() .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Тип сепаратора"); + .HasComment("Тип"); + + b.Property("Uuid") + .IsRequired() + .HasMaxLength(36) + .HasColumnType("TEXT") + .HasComment("Уникальный идентификатор"); b.HasKey("Id"); b.ToTable("SeparatorRecords"); }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.VectorRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); - - b.Property("SampleRecordId") - .HasColumnType("INTEGER"); - - b.Property("SeparatorRecordId") - .HasColumnType("INTEGER"); - - b.PrimitiveCollection("Values") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Значения вектора"); - - b.HasKey("Id"); - - b.HasIndex("SampleRecordId"); - - b.HasIndex("SeparatorRecordId"); - - b.ToTable("VectorRecords"); - }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.VectorRecord", b => - { - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SampleRecord", "SampleRecord") - .WithMany("VectorRecords") - .HasForeignKey("SampleRecordId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", "SeparatorRecord") - .WithMany("VectorRecords") - .HasForeignKey("SeparatorRecordId") - .OnDelete(DeleteBehavior.Cascade); - - b.Navigation("SampleRecord"); - - b.Navigation("SeparatorRecord"); - }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SampleRecord", b => - { - b.Navigation("VectorRecords"); - }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b => - { - b.Navigation("VectorRecords"); - }); #pragma warning restore 612, 618 } } diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/20260428223237_Calibration0.cs b/GSS2.Core/Analysis/AmineContent/Database/Migrations/20260615113305_Migration0.cs similarity index 51% rename from GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/20260428223237_Calibration0.cs rename to GSS2.Core/Analysis/AmineContent/Database/Migrations/20260615113305_Migration0.cs index 5c9ba37..fc5a2fe 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/20260428223237_Calibration0.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Migrations/20260615113305_Migration0.cs @@ -3,32 +3,74 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations +namespace GSS2.Core.Analysis.AmineContent.Database.Migrations { /// - public partial class Calibration0 : Migration + public partial class Migration0 : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.CreateTable( + name: "BrandRecords", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false, comment: "Идентификатор") + .Annotation("Sqlite:Autoincrement", true), + Uuid = table.Column(type: "TEXT", maxLength: 36, nullable: false, comment: "Уникальный идентификатор"), + BrandName = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Марка пробы"), + MixtureName = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Название кондиционирующей смеси"), + MixtureNormalRate = table.Column(type: "REAL", nullable: false, comment: "Норма расхода кондиционирующей смеси (кг/т | гр/кг)") + }, + constraints: table => + { + table.PrimaryKey("PK_BrandRecords", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "FeatureRecords", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false, comment: "Идентификатор") + .Annotation("Sqlite:Autoincrement", true), + Values = table.Column(type: "TEXT", nullable: false, comment: "Значения вектора"), + SeparatorRecordId = table.Column(type: "INTEGER", nullable: false, comment: "Сепаратор"), + SampleRecordId = table.Column(type: "INTEGER", nullable: false, comment: "Проба") + }, + constraints: table => + { + table.PrimaryKey("PK_FeatureRecords", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "ImageRecords", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false, comment: "Идентификатор") + .Annotation("Sqlite:Autoincrement", true), + Base64 = table.Column(type: "TEXT", nullable: false, comment: "Значения вектора") + }, + constraints: table => + { + table.PrimaryKey("PK_ImageRecords", x => x.Id); + }); + migrationBuilder.CreateTable( name: "SampleRecords", columns: table => new { - Id = table.Column(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор") + Id = table.Column(type: "INTEGER", nullable: false, comment: "Идентификатор") .Annotation("Sqlite:Autoincrement", true), + Uuid = table.Column(type: "TEXT", maxLength: 36, nullable: false, comment: "Уникальный идентификатор"), SampleName = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Название пробы"), SampleComment = table.Column(type: "TEXT", maxLength: 512, nullable: false, comment: "Дополнительная информация о пробе"), - SampleBrand = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Марка пробы"), - SampleMass = table.Column(type: "REAL", nullable: false, comment: "Масса пробы (кг)"), - SamplingDateTime = table.Column(type: "TEXT", nullable: false, comment: "Дата и время отбора пробы"), + SamplingDateTime = table.Column(type: "TEXT", nullable: false, comment: "Дата и время отбора пробы (utc)"), + BrandId = table.Column(type: "INTEGER", nullable: false, comment: "Марка"), SamplingPlace = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Место отбора пробы"), - MixtureName = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Название используемой кондиционирующей смеси"), - MixtureAmineContent = table.Column(type: "REAL", nullable: false, comment: "Содержание аминов в кондиционирующей смеси (%)"), - MixtureNormalRate = table.Column(type: "REAL", nullable: false, comment: "Норма расхода кондиционирующей смеси (кг/т | гр/кг)"), MixtureActualRate = table.Column(type: "REAL", nullable: false, comment: "Фактический расход кондиционирующей смеси (кг/т | гр/кг)"), - MeasuredContent = table.Column(type: "REAL", nullable: false, comment: "Измеренное количество масла (кг/т | гр/кг)"), - Image = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Изображение") + MeasuredContent = table.Column(type: "REAL", nullable: false, comment: "Измеренное количество кондиционирующей смеси (кг/т | гр/кг)"), + ImageId = table.Column(type: "INTEGER", nullable: false, comment: "Изображение"), + FeatureIds = table.Column(type: "TEXT", nullable: false, comment: "Признаки") }, constraints: table => { @@ -39,60 +81,30 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations name: "SeparatorRecords", columns: table => new { - Id = table.Column(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор") + Id = table.Column(type: "INTEGER", nullable: false, comment: "Идентификатор") .Annotation("Sqlite:Autoincrement", true), - Type = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Тип сепаратора"), - Batch = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Партия сепаратора"), - Image = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Изображение") + Uuid = table.Column(type: "TEXT", maxLength: 36, nullable: false, comment: "Уникальный идентификатор"), + Type = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Тип"), + ImageId = table.Column(type: "INTEGER", nullable: false, comment: "Изображение"), + FeatureIds = table.Column(type: "TEXT", nullable: false, comment: "Признаки") }, constraints: table => { table.PrimaryKey("PK_SeparatorRecords", x => x.Id); }); - - migrationBuilder.CreateTable( - name: "VectorRecords", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор") - .Annotation("Sqlite:Autoincrement", true), - SeparatorRecordId = table.Column(type: "INTEGER", nullable: true), - SampleRecordId = table.Column(type: "INTEGER", nullable: true), - Values = table.Column(type: "TEXT", nullable: false, comment: "Значения вектора") - }, - constraints: table => - { - table.PrimaryKey("PK_VectorRecords", x => x.Id); - table.ForeignKey( - name: "FK_VectorRecords_SampleRecords_SampleRecordId", - column: x => x.SampleRecordId, - principalTable: "SampleRecords", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_VectorRecords_SeparatorRecords_SeparatorRecordId", - column: x => x.SeparatorRecordId, - principalTable: "SeparatorRecords", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_VectorRecords_SampleRecordId", - table: "VectorRecords", - column: "SampleRecordId"); - - migrationBuilder.CreateIndex( - name: "IX_VectorRecords_SeparatorRecordId", - table: "VectorRecords", - column: "SeparatorRecordId"); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "VectorRecords"); + name: "BrandRecords"); + + migrationBuilder.DropTable( + name: "FeatureRecords"); + + migrationBuilder.DropTable( + name: "ImageRecords"); migrationBuilder.DropTable( name: "SampleRecords"); diff --git a/GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/CalibrationContextModelSnapshot.cs b/GSS2.Core/Analysis/AmineContent/Database/Migrations/ContextModelSnapshot.cs similarity index 60% rename from GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/CalibrationContextModelSnapshot.cs rename to GSS2.Core/Analysis/AmineContent/Database/Migrations/ContextModelSnapshot.cs index 341515c..6b57d15 100644 --- a/GSS2.Core/Analysis/AmineContent/Database/Calibration/Migrations/CalibrationContextModelSnapshot.cs +++ b/GSS2.Core/Analysis/AmineContent/Database/Migrations/ContextModelSnapshot.cs @@ -1,62 +1,125 @@ // using System; -using GSS2.Core.Analysis.AmineContent.Database.Calibration; +using GSS2.Core.Analysis.AmineContent.Database; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations +namespace GSS2.Core.Analysis.AmineContent.Database.Migrations { - [DbContext(typeof(CalibrationContext))] - partial class CalibrationContextModelSnapshot : ModelSnapshot + [DbContext(typeof(Context))] + partial class ContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SampleRecord", b => + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.BrandRecord", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); + .HasComment("Идентификатор"); - b.Property("Image") + b.Property("BrandName") .IsRequired() .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Изображение"); - - b.Property("MeasuredContent") - .HasColumnType("REAL") - .HasComment("Измеренное количество масла (кг/т | гр/кг)"); - - b.Property("MixtureActualRate") - .HasColumnType("REAL") - .HasComment("Фактический расход кондиционирующей смеси (кг/т | гр/кг)"); - - b.Property("MixtureAmineContent") - .HasColumnType("REAL") - .HasComment("Содержание аминов в кондиционирующей смеси (%)"); + .HasComment("Марка пробы"); b.Property("MixtureName") .IsRequired() .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Название используемой кондиционирующей смеси"); + .HasComment("Название кондиционирующей смеси"); b.Property("MixtureNormalRate") .HasColumnType("REAL") .HasComment("Норма расхода кондиционирующей смеси (кг/т | гр/кг)"); - b.Property("SampleBrand") + b.Property("Uuid") .IsRequired() - .HasMaxLength(256) + .HasMaxLength(36) .HasColumnType("TEXT") - .HasComment("Марка пробы"); + .HasComment("Уникальный идентификатор"); + + b.HasKey("Id"); + + b.ToTable("BrandRecords"); + }); + + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.FeatureRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasComment("Идентификатор"); + + b.Property("SampleRecordId") + .HasColumnType("INTEGER") + .HasComment("Проба"); + + b.Property("SeparatorRecordId") + .HasColumnType("INTEGER") + .HasComment("Сепаратор"); + + b.PrimitiveCollection("Values") + .IsRequired() + .HasColumnType("TEXT") + .HasComment("Значения вектора"); + + b.HasKey("Id"); + + b.ToTable("FeatureRecords"); + }); + + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.ImageRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasComment("Идентификатор"); + + b.Property("Base64") + .IsRequired() + .HasColumnType("TEXT") + .HasComment("Значения вектора"); + + b.HasKey("Id"); + + b.ToTable("ImageRecords"); + }); + + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.SampleRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasComment("Идентификатор"); + + b.Property("BrandId") + .HasColumnType("INTEGER") + .HasComment("Марка"); + + b.PrimitiveCollection("FeatureIds") + .IsRequired() + .HasColumnType("TEXT") + .HasComment("Признаки"); + + b.Property("ImageId") + .HasColumnType("INTEGER") + .HasComment("Изображение"); + + b.Property("MeasuredContent") + .HasColumnType("REAL") + .HasComment("Измеренное количество кондиционирующей смеси (кг/т | гр/кг)"); + + b.Property("MixtureActualRate") + .HasColumnType("REAL") + .HasComment("Фактический расход кондиционирующей смеси (кг/т | гр/кг)"); b.Property("SampleComment") .IsRequired() @@ -64,10 +127,6 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations .HasColumnType("TEXT") .HasComment("Дополнительная информация о пробе"); - b.Property("SampleMass") - .HasColumnType("REAL") - .HasComment("Масса пробы (кг)"); - b.Property("SampleName") .IsRequired() .HasMaxLength(256) @@ -76,7 +135,7 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations b.Property("SamplingDateTime") .HasColumnType("TEXT") - .HasComment("Дата и время отбора пробы"); + .HasComment("Дата и время отбора пробы (utc)"); b.Property("SamplingPlace") .IsRequired() @@ -84,94 +143,49 @@ namespace GSS2.Core.Analysis.AmineContent.Database.Calibration.Migrations .HasColumnType("TEXT") .HasComment("Место отбора пробы"); + b.Property("Uuid") + .IsRequired() + .HasMaxLength(36) + .HasColumnType("TEXT") + .HasComment("Уникальный идентификатор"); + b.HasKey("Id"); b.ToTable("SampleRecords"); }); - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b => + modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.SeparatorRecord", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); + .HasComment("Идентификатор"); - b.Property("Batch") + b.PrimitiveCollection("FeatureIds") .IsRequired() - .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Партия сепаратора"); + .HasComment("Признаки"); - b.Property("Image") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") + b.Property("ImageId") + .HasColumnType("INTEGER") .HasComment("Изображение"); b.Property("Type") .IsRequired() .HasMaxLength(256) .HasColumnType("TEXT") - .HasComment("Тип сепаратора"); + .HasComment("Тип"); + + b.Property("Uuid") + .IsRequired() + .HasMaxLength(36) + .HasColumnType("TEXT") + .HasComment("Уникальный идентификатор"); b.HasKey("Id"); b.ToTable("SeparatorRecords"); }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.VectorRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); - - b.Property("SampleRecordId") - .HasColumnType("INTEGER"); - - b.Property("SeparatorRecordId") - .HasColumnType("INTEGER"); - - b.PrimitiveCollection("Values") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Значения вектора"); - - b.HasKey("Id"); - - b.HasIndex("SampleRecordId"); - - b.HasIndex("SeparatorRecordId"); - - b.ToTable("VectorRecords"); - }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.VectorRecord", b => - { - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SampleRecord", "SampleRecord") - .WithMany("VectorRecords") - .HasForeignKey("SampleRecordId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", "SeparatorRecord") - .WithMany("VectorRecords") - .HasForeignKey("SeparatorRecordId") - .OnDelete(DeleteBehavior.Cascade); - - b.Navigation("SampleRecord"); - - b.Navigation("SeparatorRecord"); - }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SampleRecord", b => - { - b.Navigation("VectorRecords"); - }); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Calibration.SeparatorRecord", b => - { - b.Navigation("VectorRecords"); - }); #pragma warning restore 612, 618 } } diff --git a/GSS2.Core/Analysis/AmineContent/Database/ResultRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/ResultRecord.cs new file mode 100644 index 0000000..1999997 --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/ResultRecord.cs @@ -0,0 +1,60 @@ +// using System.ComponentModel.DataAnnotations; + +// using Microsoft.EntityFrameworkCore; + +// namespace GSS2.Core.Analysis.AmineContent.Database; + +// public class ResultRecord +// { +// [Comment("Идентификатор")] +// public int Id { get; set; } +// [Comment("Уникальный идентификатор")] +// [MaxLength(36)] +// public required string Uuid { get; set; } +// [Comment("Название пробы")] +// [MaxLength(256)] +// public required string SampleName { get; set; } +// [Comment("Дополнительная информация о пробе")] +// [MaxLength(512)] +// public required string SampleComment { get; set; } +// [Comment("Дата и время отбора пробы")] +// public required DateTime SamplingDateTime { get; set; } +// [Comment("Место отбора пробы")] +// [MaxLength(256)] +// public required string SamplingPlace { get; set; } +// [Comment("Изображение")] +// [MaxLength(256)] +// public required string Image { get; set; } +// [Comment("Тип сепаратора")] +// [MaxLength(256)] +// public required string SeparatorType { get; set; } +// [Comment("Марка пробы")] +// [MaxLength(256)] +// public required string SampleBrand { get; set; } +// [Comment("Маска")] +// [MaxLength(256)] +// public required string MaskImage { get; set; } +// [Comment("Изображение результата")] +// [MaxLength(256)] +// public required string ResultImage { get; set; } +// [Comment("Минимальное значение")] +// public required double MinValue { get; set; } +// [Comment("Максимальное значение")] +// public required double MaxValue { get; set; } +// [Comment("Количество частиц")] +// public required int ParticlesCount { get; set; } +// [Comment("Среднее значение")] +// public required double MeanValue { get; set; } +// [Comment("Средняя дисперсия")] +// public required double MeanVariance { get; set; } +// [Comment("Дисперсия среднего")] +// public required double VarianceOfMean { get; set; } +// [Comment("Среднее качество обработки")] +// public required double? MeanQuality { get; set; } +// [Comment("Средние значения")] +// public required double[] MeanValues { get; set; } +// [Comment("Дисперсии")] +// public required double[] Variances { get; set; } +// [Comment("Качества обработки")] +// public required double[]? Qualities { get; set; } +// } diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260429070705_Results0.Designer.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260429070705_Results0.Designer.cs deleted file mode 100644 index ed6a903..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260429070705_Results0.Designer.cs +++ /dev/null @@ -1,123 +0,0 @@ -// -using System; -using GSS2.Core.Analysis.AmineContent.Database.Results; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace GSS2.Core.Analysis.AmineContent.Database.Results.Migrations -{ - [DbContext(typeof(ResultsContext))] - [Migration("20260429070705_Results0")] - partial class Results0 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Results.ResultRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); - - b.Property("Image") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Изображение"); - - b.Property("MaskImage") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Маска"); - - b.Property("MaxValue") - .HasColumnType("REAL") - .HasComment("Максимальное значение"); - - b.Property("MeanValue") - .HasColumnType("REAL") - .HasComment("Среднее значение"); - - b.PrimitiveCollection("MeanValues") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Средние значения"); - - b.Property("MeanVariance") - .HasColumnType("REAL") - .HasComment("Средняя дисперсия"); - - b.Property("MinValue") - .HasColumnType("REAL") - .HasComment("Минимальное значение"); - - b.Property("ParticlesCount") - .HasColumnType("INTEGER") - .HasComment("Количество частиц"); - - b.Property("ResultImage") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Изображение результата"); - - b.Property("SampleBrand") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Марка пробы"); - - b.Property("SampleComment") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("TEXT") - .HasComment("Дополнительная информация о пробе"); - - b.Property("SampleName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Название пробы"); - - b.Property("SamplingDateTime") - .HasColumnType("TEXT") - .HasComment("Дата и время отбора пробы"); - - b.Property("SamplingPlace") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Место отбора пробы"); - - b.Property("SeparatorType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Тип сепаратора"); - - b.Property("VarianceOfMean") - .HasColumnType("REAL") - .HasComment("Дисперсия среднего"); - - b.PrimitiveCollection("Variances") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Дисперсии"); - - b.HasKey("Id"); - - b.ToTable("ResultRecords"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260429070705_Results0.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260429070705_Results0.cs deleted file mode 100644 index 38dcd8d..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260429070705_Results0.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace GSS2.Core.Analysis.AmineContent.Database.Results.Migrations -{ - /// - public partial class Results0 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "ResultRecords", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false, comment: "Уникальный идентификатор") - .Annotation("Sqlite:Autoincrement", true), - SampleName = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Название пробы"), - SampleComment = table.Column(type: "TEXT", maxLength: 512, nullable: false, comment: "Дополнительная информация о пробе"), - SamplingDateTime = table.Column(type: "TEXT", nullable: false, comment: "Дата и время отбора пробы"), - SamplingPlace = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Место отбора пробы"), - Image = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Изображение"), - SeparatorType = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Тип сепаратора"), - SampleBrand = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Марка пробы"), - MaskImage = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Маска"), - ResultImage = table.Column(type: "TEXT", maxLength: 256, nullable: false, comment: "Изображение результата"), - MinValue = table.Column(type: "REAL", nullable: false, comment: "Минимальное значение"), - MaxValue = table.Column(type: "REAL", nullable: false, comment: "Максимальное значение"), - ParticlesCount = table.Column(type: "INTEGER", nullable: false, comment: "Количество частиц"), - MeanValue = table.Column(type: "REAL", nullable: false, comment: "Среднее значение"), - MeanVariance = table.Column(type: "REAL", nullable: false, comment: "Средняя дисперсия"), - VarianceOfMean = table.Column(type: "REAL", nullable: false, comment: "Дисперсия среднего"), - MeanValues = table.Column(type: "TEXT", nullable: false, comment: "Средние значения"), - Variances = table.Column(type: "TEXT", nullable: false, comment: "Дисперсии") - }, - constraints: table => - { - table.PrimaryKey("PK_ResultRecords", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "ResultRecords"); - } - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260608053836_Results1.Designer.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260608053836_Results1.Designer.cs deleted file mode 100644 index 37d5b97..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260608053836_Results1.Designer.cs +++ /dev/null @@ -1,131 +0,0 @@ -// -using System; -using GSS2.Core.Analysis.AmineContent.Database.Results; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace GSS2.Core.Analysis.AmineContent.Database.Results.Migrations -{ - [DbContext(typeof(ResultsContext))] - [Migration("20260608053836_Results1")] - partial class Results1 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Results.ResultRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); - - b.Property("Image") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Изображение"); - - b.Property("MaskImage") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Маска"); - - b.Property("MaxValue") - .HasColumnType("REAL") - .HasComment("Максимальное значение"); - - b.Property("MeanQuality") - .HasColumnType("REAL") - .HasComment("Среднее качество обработки"); - - b.Property("MeanValue") - .HasColumnType("REAL") - .HasComment("Среднее значение"); - - b.PrimitiveCollection("MeanValues") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Средние значения"); - - b.Property("MeanVariance") - .HasColumnType("REAL") - .HasComment("Средняя дисперсия"); - - b.Property("MinValue") - .HasColumnType("REAL") - .HasComment("Минимальное значение"); - - b.Property("ParticlesCount") - .HasColumnType("INTEGER") - .HasComment("Количество частиц"); - - b.PrimitiveCollection("Qualities") - .HasColumnType("TEXT") - .HasComment("Качества обработки"); - - b.Property("ResultImage") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Изображение результата"); - - b.Property("SampleBrand") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Марка пробы"); - - b.Property("SampleComment") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("TEXT") - .HasComment("Дополнительная информация о пробе"); - - b.Property("SampleName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Название пробы"); - - b.Property("SamplingDateTime") - .HasColumnType("TEXT") - .HasComment("Дата и время отбора пробы"); - - b.Property("SamplingPlace") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Место отбора пробы"); - - b.Property("SeparatorType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Тип сепаратора"); - - b.Property("VarianceOfMean") - .HasColumnType("REAL") - .HasComment("Дисперсия среднего"); - - b.PrimitiveCollection("Variances") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Дисперсии"); - - b.HasKey("Id"); - - b.ToTable("ResultRecords"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260608053836_Results1.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260608053836_Results1.cs deleted file mode 100644 index 1507277..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/20260608053836_Results1.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace GSS2.Core.Analysis.AmineContent.Database.Results.Migrations -{ - /// - public partial class Results1 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "MeanQuality", - table: "ResultRecords", - type: "REAL", - nullable: true, - comment: "Среднее качество обработки"); - - migrationBuilder.AddColumn( - name: "Qualities", - table: "ResultRecords", - type: "TEXT", - nullable: true, - comment: "Качества обработки"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "MeanQuality", - table: "ResultRecords"); - - migrationBuilder.DropColumn( - name: "Qualities", - table: "ResultRecords"); - } - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/ResultsContextModelSnapshot.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/ResultsContextModelSnapshot.cs deleted file mode 100644 index 801fec2..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/Migrations/ResultsContextModelSnapshot.cs +++ /dev/null @@ -1,128 +0,0 @@ -// -using System; -using GSS2.Core.Analysis.AmineContent.Database.Results; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace GSS2.Core.Analysis.AmineContent.Database.Results.Migrations -{ - [DbContext(typeof(ResultsContext))] - partial class ResultsContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); - - modelBuilder.Entity("GSS2.Core.Analysis.AmineContent.Database.Results.ResultRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasComment("Уникальный идентификатор"); - - b.Property("Image") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Изображение"); - - b.Property("MaskImage") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Маска"); - - b.Property("MaxValue") - .HasColumnType("REAL") - .HasComment("Максимальное значение"); - - b.Property("MeanQuality") - .HasColumnType("REAL") - .HasComment("Среднее качество обработки"); - - b.Property("MeanValue") - .HasColumnType("REAL") - .HasComment("Среднее значение"); - - b.PrimitiveCollection("MeanValues") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Средние значения"); - - b.Property("MeanVariance") - .HasColumnType("REAL") - .HasComment("Средняя дисперсия"); - - b.Property("MinValue") - .HasColumnType("REAL") - .HasComment("Минимальное значение"); - - b.Property("ParticlesCount") - .HasColumnType("INTEGER") - .HasComment("Количество частиц"); - - b.PrimitiveCollection("Qualities") - .HasColumnType("TEXT") - .HasComment("Качества обработки"); - - b.Property("ResultImage") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Изображение результата"); - - b.Property("SampleBrand") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Марка пробы"); - - b.Property("SampleComment") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("TEXT") - .HasComment("Дополнительная информация о пробе"); - - b.Property("SampleName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Название пробы"); - - b.Property("SamplingDateTime") - .HasColumnType("TEXT") - .HasComment("Дата и время отбора пробы"); - - b.Property("SamplingPlace") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Место отбора пробы"); - - b.Property("SeparatorType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT") - .HasComment("Тип сепаратора"); - - b.Property("VarianceOfMean") - .HasColumnType("REAL") - .HasComment("Дисперсия среднего"); - - b.PrimitiveCollection("Variances") - .IsRequired() - .HasColumnType("TEXT") - .HasComment("Дисперсии"); - - b.HasKey("Id"); - - b.ToTable("ResultRecords"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/ResultRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/ResultRecord.cs deleted file mode 100644 index 3938e27..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/ResultRecord.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Results; - -public class ResultRecord -{ - [Comment("Уникальный идентификатор")] - public int Id { get; set; } - [Comment("Название пробы")] - [MaxLength(256)] - public required string SampleName { get; set; } - [Comment("Дополнительная информация о пробе")] - [MaxLength(512)] - public required string SampleComment { get; set; } - [Comment("Дата и время отбора пробы")] - public required DateTime SamplingDateTime { get; set; } - [Comment("Место отбора пробы")] - [MaxLength(256)] - public required string SamplingPlace { get; set; } - [Comment("Изображение")] - [MaxLength(256)] - public required string Image { get; set; } - [Comment("Тип сепаратора")] - [MaxLength(256)] - public required string SeparatorType { get; set; } - [Comment("Марка пробы")] - [MaxLength(256)] - public required string SampleBrand { get; set; } - [Comment("Маска")] - [MaxLength(256)] - public required string MaskImage { get; set; } - [Comment("Изображение результата")] - [MaxLength(256)] - public required string ResultImage { get; set; } - [Comment("Минимальное значение")] - public required double MinValue { get; set; } - [Comment("Максимальное значение")] - public required double MaxValue { get; set; } - [Comment("Количество частиц")] - public required int ParticlesCount { get; set; } - [Comment("Среднее значение")] - public required double MeanValue { get; set; } - [Comment("Средняя дисперсия")] - public required double MeanVariance { get; set; } - [Comment("Дисперсия среднего")] - public required double VarianceOfMean { get; set; } - [Comment("Среднее качество обработки")] - public required double? MeanQuality { get; set; } - [Comment("Средние значения")] - public required double[] MeanValues { get; set; } - [Comment("Дисперсии")] - public required double[] Variances { get; set; } - [Comment("Качества обработки")] - public required double[]? Qualities { get; set; } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/ResultsContext.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/ResultsContext.cs deleted file mode 100644 index e36c301..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/ResultsContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace GSS2.Core.Analysis.AmineContent.Database.Results; - -public class ResultsContext : DbContext -{ - public DbSet ResultRecords => Set(); - - public ResultsContext(DbContextOptions options) - : base(options) - { } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/Results/ResultsContextFactory.cs b/GSS2.Core/Analysis/AmineContent/Database/Results/ResultsContextFactory.cs deleted file mode 100644 index 1eb9a68..0000000 --- a/GSS2.Core/Analysis/AmineContent/Database/Results/ResultsContextFactory.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; - -namespace GSS2.Core.Analysis.AmineContent.Database.Results; - -public class ResultsContextFactory : IDesignTimeDbContextFactory -{ - public ResultsContext CreateDbContext(string[] args) - { - var optionsBuilder = new DbContextOptionsBuilder(); - - // Строка подключения для миграций в design-time - // в runtime должна использоваться настоящая ConnectionString - optionsBuilder.UseSqlite("Data Source=AmineContentResults.db"); - - return new ResultsContext(optionsBuilder.Options); - } -} diff --git a/GSS2.Core/Analysis/AmineContent/Database/SampleRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/SampleRecord.cs new file mode 100644 index 0000000..e85ac64 --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/SampleRecord.cs @@ -0,0 +1,74 @@ +using System.ComponentModel.DataAnnotations; + +using Microsoft.EntityFrameworkCore; + +namespace GSS2.Core.Analysis.AmineContent.Database; + +public class SampleRecord +{ + [Comment("Идентификатор")] + public int Id { get; set; } + [Comment("Уникальный идентификатор")] + [MaxLength(36)] + public string Uuid { get; set; } + [Comment("Название пробы")] + [MaxLength(256)] + public string SampleName { get; set; } + [Comment("Дополнительная информация о пробе")] + [MaxLength(512)] + public string SampleComment { get; set; } + [Comment("Дата и время отбора пробы (utc)")] + public DateTime SamplingDateTime { get; set; } + [Comment("Марка")] + public int BrandId { get; set; } + [Comment("Место отбора пробы")] + [MaxLength(256)] + public string SamplingPlace { get; set; } + [Comment("Фактический расход кондиционирующей смеси (кг/т | гр/кг)")] + public double MixtureActualRate { get; set; } + [Comment("Измеренное количество кондиционирующей смеси (кг/т | гр/кг)")] + public double MeasuredContent { get; set; } + [Comment("Изображение")] + public int ImageId { get; set; } + [Comment("Признаки")] + public List FeatureIds { get; set; } + + public SampleRecord() + : this(0, null, "", "", null, 0, "", -1, -1, 0, null) + { } + public SampleRecord( + int id = 0, + string? uuid = null, + string sampleName = "", + string sampleComment = "", + DateTime? samplingDateTime = null, + int brandId = 0, + string samplingPlace = "", + double mixtureActualRate = -1, + double measuredContent = -1, + int imageId = 0, + List? featureIds = null + ) + { + Id = id; + if (uuid is null) + Uuid = Guid.NewGuid().ToString(); + else + Uuid = uuid; + SampleName = sampleName; + SampleComment = sampleComment; + if (samplingDateTime is null) + SamplingDateTime = DateTime.UtcNow; + else + SamplingDateTime = samplingDateTime.Value; + BrandId = brandId; + SamplingPlace = samplingPlace; + MixtureActualRate = mixtureActualRate; + MeasuredContent = measuredContent; + ImageId = imageId; + if (featureIds is null) + FeatureIds = new List(); + else + FeatureIds = featureIds; + } +} diff --git a/GSS2.Core/Analysis/AmineContent/Database/SeparatorRecord.cs b/GSS2.Core/Analysis/AmineContent/Database/SeparatorRecord.cs new file mode 100644 index 0000000..ede805c --- /dev/null +++ b/GSS2.Core/Analysis/AmineContent/Database/SeparatorRecord.cs @@ -0,0 +1,46 @@ +using System.ComponentModel.DataAnnotations; + +using Microsoft.EntityFrameworkCore; + +namespace GSS2.Core.Analysis.AmineContent.Database; + +public class SeparatorRecord +{ + [Comment("Идентификатор")] + public int Id { get; set; } + [Comment("Уникальный идентификатор")] + [MaxLength(36)] + public string Uuid { get; set; } + [Comment("Тип")] + [MaxLength(256)] + public string Type { get; set; } + [Comment("Изображение")] + public int ImageId { get; set; } + [Comment("Признаки")] + public List FeatureIds { get; set; } + + public SeparatorRecord() + : this(0, "", "", 0, null) + { } + + public SeparatorRecord( + int id = 0, + string? uuid = null, + string type = "", + int imageId = 0, + List? featureIds = null + ) + { + Id = id; + if (uuid is null) + Uuid = Guid.NewGuid().ToString(); + else + Uuid = uuid; + Type = type; + ImageId = imageId; + if (featureIds is null) + FeatureIds = new List(); + else + FeatureIds = featureIds; + } +}