feature: Optional OCR-Assisted Draft Pre-Fill
This commit is contained in:
@@ -24,6 +24,7 @@ public class AppDbContext : DbContext
|
||||
public DbSet<LiveObservation> LiveObservations => Set<LiveObservation>();
|
||||
public DbSet<PromotionAttempt> PromotionAttempts => Set<PromotionAttempt>();
|
||||
public DbSet<CoverSheet> CoverSheets => Set<CoverSheet>();
|
||||
public DbSet<OcrResult> OcrResults => Set<OcrResult>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@ public class DigitizationEventConfiguration : IEntityTypeConfiguration<Digitizat
|
||||
builder.ToTable("digitization_events", t =>
|
||||
{
|
||||
t.HasCheckConstraint("chk_digitization_events_event_type",
|
||||
"event_type IN ('uploaded', 'entry_started', 'submitted_for_verification', 'rejected', 'verified', 'verified_pending_clinical', 'awaiting_clinical_approval', 'approved', 'promoted', 'live_capture_attested', 'correction_requested', 'verification_failed', 'superseded', 'correction_promoted', 'correction_uploaded', 'promotion_retry_succeeded', 'promotion_retry_failed', 'promotion_retry_exhausted', 'promotion_failed', 'document_accessed', 'cancelled', 'draft_field_updated', 'draft_observation_deleted')");
|
||||
"event_type IN ('uploaded', 'entry_started', 'submitted_for_verification', 'rejected', 'verified', 'verified_pending_clinical', 'awaiting_clinical_approval', 'approved', 'promoted', 'live_capture_attested', 'correction_requested', 'verification_failed', 'superseded', 'correction_promoted', 'correction_uploaded', 'promotion_retry_succeeded', 'promotion_retry_failed', 'promotion_retry_exhausted', 'promotion_failed', 'document_accessed', 'cancelled', 'draft_field_updated', 'draft_observation_deleted', 'ocr_started', 'ocr_completed', 'ocr_failed')");
|
||||
});
|
||||
builder.HasKey(e => e.Id);
|
||||
builder.Property(e => e.Id).HasColumnName("id").HasDefaultValueSql("gen_random_uuid()");
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||
|
||||
public class OcrResultConfiguration : IEntityTypeConfiguration<OcrResult>
|
||||
{
|
||||
public void Configure(EntityTypeBuilder<OcrResult> builder)
|
||||
{
|
||||
builder.ToTable("ocr_results");
|
||||
builder.HasKey(o => o.Id);
|
||||
builder.Property(o => o.Id).HasColumnName("id").HasDefaultValueSql("gen_random_uuid()");
|
||||
builder.Property(o => o.BatchId).HasColumnName("batch_id").IsRequired();
|
||||
builder.Property(o => o.Provider).HasColumnName("provider").HasMaxLength(20).IsRequired();
|
||||
builder.Property(o => o.FieldConfidencesJson).HasColumnName("field_confidences_json").HasColumnType("jsonb").IsRequired();
|
||||
builder.Property(o => o.RawText).HasColumnName("raw_text");
|
||||
builder.Property(o => o.DurationMs).HasColumnName("duration_ms").IsRequired();
|
||||
builder.Property(o => o.ProcessedAt).HasColumnName("processed_at").HasDefaultValueSql("NOW()");
|
||||
|
||||
builder.HasIndex(o => o.BatchId).IsUnique();
|
||||
builder.HasOne(o => o.Batch)
|
||||
.WithOne()
|
||||
.HasForeignKey<OcrResult>(o => o.BatchId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
}
|
||||
}
|
||||
+1628
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace VigilCareRecordsAPI.Data.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddOcrResult : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropCheckConstraint(
|
||||
name: "chk_digitization_events_event_type",
|
||||
table: "digitization_events");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "ocr_results",
|
||||
columns: table => new
|
||||
{
|
||||
id = table.Column<Guid>(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"),
|
||||
batch_id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||
provider = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
|
||||
field_confidences_json = table.Column<string>(type: "jsonb", nullable: false),
|
||||
raw_text = table.Column<string>(type: "text", nullable: true),
|
||||
duration_ms = table.Column<int>(type: "integer", nullable: false),
|
||||
processed_at = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ocr_results", x => x.id);
|
||||
table.ForeignKey(
|
||||
name: "FK_ocr_results_digitization_batches_batch_id",
|
||||
column: x => x.batch_id,
|
||||
principalTable: "digitization_batches",
|
||||
principalColumn: "id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.AddCheckConstraint(
|
||||
name: "chk_digitization_events_event_type",
|
||||
table: "digitization_events",
|
||||
sql: "event_type IN ('uploaded', 'entry_started', 'submitted_for_verification', 'rejected', 'verified', 'verified_pending_clinical', 'awaiting_clinical_approval', 'approved', 'promoted', 'live_capture_attested', 'correction_requested', 'verification_failed', 'superseded', 'correction_promoted', 'correction_uploaded', 'promotion_retry_succeeded', 'promotion_retry_failed', 'promotion_retry_exhausted', 'promotion_failed', 'document_accessed', 'cancelled', 'draft_field_updated', 'draft_observation_deleted', 'ocr_started', 'ocr_completed', 'ocr_failed')");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ocr_results_batch_id",
|
||||
table: "ocr_results",
|
||||
column: "batch_id",
|
||||
unique: true);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "ocr_results");
|
||||
|
||||
migrationBuilder.DropCheckConstraint(
|
||||
name: "chk_digitization_events_event_type",
|
||||
table: "digitization_events");
|
||||
|
||||
migrationBuilder.AddCheckConstraint(
|
||||
name: "chk_digitization_events_event_type",
|
||||
table: "digitization_events",
|
||||
sql: "event_type IN ('uploaded', 'entry_started', 'submitted_for_verification', 'rejected', 'verified', 'verified_pending_clinical', 'awaiting_clinical_approval', 'approved', 'promoted', 'live_capture_attested', 'correction_requested', 'verification_failed', 'superseded', 'correction_promoted', 'correction_uploaded', 'promotion_retry_succeeded', 'promotion_retry_failed', 'promotion_retry_exhausted', 'promotion_failed', 'document_accessed', 'cancelled', 'draft_field_updated', 'draft_observation_deleted')");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -476,7 +476,7 @@ namespace VigilCareRecordsAPI.Data.Migrations
|
||||
|
||||
b.ToTable("digitization_events", null, t =>
|
||||
{
|
||||
t.HasCheckConstraint("chk_digitization_events_event_type", "event_type IN ('uploaded', 'entry_started', 'submitted_for_verification', 'rejected', 'verified', 'verified_pending_clinical', 'awaiting_clinical_approval', 'approved', 'promoted', 'live_capture_attested', 'correction_requested', 'verification_failed', 'superseded', 'correction_promoted', 'correction_uploaded', 'promotion_retry_succeeded', 'promotion_retry_failed', 'promotion_retry_exhausted', 'promotion_failed', 'document_accessed', 'cancelled', 'draft_field_updated', 'draft_observation_deleted')");
|
||||
t.HasCheckConstraint("chk_digitization_events_event_type", "event_type IN ('uploaded', 'entry_started', 'submitted_for_verification', 'rejected', 'verified', 'verified_pending_clinical', 'awaiting_clinical_approval', 'approved', 'promoted', 'live_capture_attested', 'correction_requested', 'verification_failed', 'superseded', 'correction_promoted', 'correction_uploaded', 'promotion_retry_succeeded', 'promotion_retry_failed', 'promotion_retry_exhausted', 'promotion_failed', 'document_accessed', 'cancelled', 'draft_field_updated', 'draft_observation_deleted', 'ocr_started', 'ocr_completed', 'ocr_failed')");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1007,6 +1007,51 @@ namespace VigilCareRecordsAPI.Data.Migrations
|
||||
b.ToTable("observations", "clinical");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OcrResult", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("uuid")
|
||||
.HasColumnName("id")
|
||||
.HasDefaultValueSql("gen_random_uuid()");
|
||||
|
||||
b.Property<Guid>("BatchId")
|
||||
.HasColumnType("uuid")
|
||||
.HasColumnName("batch_id");
|
||||
|
||||
b.Property<int>("DurationMs")
|
||||
.HasColumnType("integer")
|
||||
.HasColumnName("duration_ms");
|
||||
|
||||
b.Property<string>("FieldConfidencesJson")
|
||||
.IsRequired()
|
||||
.HasColumnType("jsonb")
|
||||
.HasColumnName("field_confidences_json");
|
||||
|
||||
b.Property<DateTimeOffset>("ProcessedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("timestamp with time zone")
|
||||
.HasColumnName("processed_at")
|
||||
.HasDefaultValueSql("NOW()");
|
||||
|
||||
b.Property<string>("Provider")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("character varying(20)")
|
||||
.HasColumnName("provider");
|
||||
|
||||
b.Property<string>("RawText")
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("raw_text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("BatchId")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("ocr_results", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OutboxEvent", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
@@ -1506,6 +1551,17 @@ namespace VigilCareRecordsAPI.Data.Migrations
|
||||
b.Navigation("Patient");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OcrResult", b =>
|
||||
{
|
||||
b.HasOne("DigitizationBatch", "Batch")
|
||||
.WithOne()
|
||||
.HasForeignKey("OcrResult", "BatchId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Batch");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("PromotionAttempt", b =>
|
||||
{
|
||||
b.HasOne("DigitizationBatch", "Batch")
|
||||
|
||||
Reference in New Issue
Block a user