diff --git a/backend/api/Database/Models/Inspection.cs b/backend/api/Database/Models/Inspection.cs
index e3d738af1..8bcd2a34b 100644
--- a/backend/api/Database/Models/Inspection.cs
+++ b/backend/api/Database/Models/Inspection.cs
@@ -47,6 +47,7 @@ public Inspection(Inspection copy, InspectionStatus? inspectionStatus = null, bo
{
Id = useEmptyID ? "" : Guid.NewGuid().ToString();
IsarTaskId = useEmptyID ? "" : copy.IsarTaskId;
+ IsarInspectionId = useEmptyID ? "" : copy.IsarInspectionId;
Status = inspectionStatus ?? copy.Status;
InspectionType = copy.InspectionType;
VideoDuration = copy.VideoDuration;
@@ -64,6 +65,10 @@ public Inspection(Inspection copy, InspectionStatus? inspectionStatus = null, bo
// ReSharper disable once AutoPropertyCanBeMadeGetOnly.Local
public string IsarTaskId { get; set; } = Guid.NewGuid().ToString();
+ [Required]
+ [MaxLength(200)]
+ public string IsarInspectionId { get; set; } = Guid.NewGuid().ToString();
+
[Required]
public Position InspectionTarget { get; set; }
@@ -126,6 +131,7 @@ public void UpdateWithIsarInfo(IsarTask isarTask)
)
};
IsarTaskId = isarTask.IsarTaskId;
+ if (isarTask.IsarInspectionId != null) { IsarInspectionId = isarTask.IsarInspectionId; }
}
public void UpdateStatus(IsarTaskStatus isarStatus)
diff --git a/backend/api/Migrations/20241213081436_AddIsarInspectionIdToInspections.Designer.cs b/backend/api/Migrations/20241213081436_AddIsarInspectionIdToInspections.Designer.cs
new file mode 100644
index 000000000..7f32d0061
--- /dev/null
+++ b/backend/api/Migrations/20241213081436_AddIsarInspectionIdToInspections.Designer.cs
@@ -0,0 +1,1337 @@
+//
+using System;
+using Api.Database.Context;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Api.Migrations
+{
+ [DbContext(typeof(FlotillaDbContext))]
+ [Migration("20241213081436_AddIsarInspectionIdToInspections")]
+ partial class AddIsarInspectionIdToInspections
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.11")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Api.Database.Models.AccessRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("AccessLevel")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("InstallationId")
+ .HasColumnType("text");
+
+ b.Property("RoleName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstallationId");
+
+ b.ToTable("AccessRoles");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Area", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("DeckId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DefaultLocalizationPoseId")
+ .HasColumnType("text");
+
+ b.Property("InstallationId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("PlantId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DeckId");
+
+ b.HasIndex("DefaultLocalizationPoseId");
+
+ b.HasIndex("InstallationId");
+
+ b.HasIndex("PlantId");
+
+ b.ToTable("Areas");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Deck", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("DefaultLocalizationPoseId")
+ .HasColumnType("text");
+
+ b.Property("InstallationId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("PlantId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DefaultLocalizationPoseId");
+
+ b.HasIndex("InstallationId");
+
+ b.HasIndex("PlantId");
+
+ b.ToTable("Decks");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.DefaultLocalizationPose", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("DockingEnabled")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.ToTable("DefaultLocalizationPoses");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Inspection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("AnalysisType")
+ .HasColumnType("text");
+
+ b.Property("EndTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("InspectionTargetName")
+ .HasColumnType("text");
+
+ b.Property("InspectionType")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("InspectionUrl")
+ .HasMaxLength(250)
+ .HasColumnType("character varying(250)");
+
+ b.Property("IsarInspectionId")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("IsarTaskId")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("StartTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("VideoDuration")
+ .HasColumnType("real");
+
+ b.HasKey("Id");
+
+ b.ToTable("Inspections");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.InspectionFinding", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("Finding")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("InspectionDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("InspectionId")
+ .HasColumnType("text");
+
+ b.Property("IsarTaskId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InspectionId");
+
+ b.ToTable("InspectionFindings");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Installation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("InstallationCode")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("character varying(10)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstallationCode")
+ .IsUnique();
+
+ b.ToTable("Installations");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("AreaId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Comment")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("InspectionFrequency")
+ .HasColumnType("bigint");
+
+ b.Property("InstallationCode")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsDeprecated")
+ .HasColumnType("boolean");
+
+ b.Property("LastSuccessfulRunId")
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("SourceId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AreaId");
+
+ b.HasIndex("LastSuccessfulRunId");
+
+ b.HasIndex("SourceId");
+
+ b.ToTable("MissionDefinitions");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionRun", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("AreaId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Comment")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("Description")
+ .HasMaxLength(450)
+ .HasColumnType("character varying(450)");
+
+ b.Property("DesiredStartTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("EndTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("EstimatedDuration")
+ .HasColumnType("bigint");
+
+ b.Property("InstallationCode")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("IsDeprecated")
+ .HasColumnType("boolean");
+
+ b.Property("IsarMissionId")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("MissionId")
+ .HasColumnType("text");
+
+ b.Property("MissionRunType")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("RobotId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("StartTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("StatusReason")
+ .HasMaxLength(450)
+ .HasColumnType("character varying(450)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AreaId");
+
+ b.HasIndex("RobotId");
+
+ b.ToTable("MissionRuns");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionTask", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("EndTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("InspectionId")
+ .HasColumnType("text");
+
+ b.Property("IsarTaskId")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("MissionRunId")
+ .HasColumnType("text");
+
+ b.Property("PoseId")
+ .HasColumnType("integer");
+
+ b.Property("StartTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TagId")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("TagLink")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("TaskOrder")
+ .HasColumnType("integer");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InspectionId");
+
+ b.HasIndex("MissionRunId");
+
+ b.ToTable("MissionTasks");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Plant", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("InstallationId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("PlantCode")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("character varying(10)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("InstallationId");
+
+ b.HasIndex("PlantCode")
+ .IsUnique();
+
+ b.ToTable("Plants");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Robot", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("BatteryLevel")
+ .HasColumnType("real");
+
+ b.Property("CurrentAreaId")
+ .HasColumnType("text");
+
+ b.Property("CurrentInstallationId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CurrentMissionId")
+ .HasColumnType("text");
+
+ b.Property("Deprecated")
+ .HasColumnType("boolean");
+
+ b.Property("FlotillaStatus")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Host")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("IsarConnected")
+ .HasColumnType("boolean");
+
+ b.Property("IsarId")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("MissionQueueFrozen")
+ .HasColumnType("boolean");
+
+ b.Property("ModelId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("Port")
+ .HasColumnType("integer");
+
+ b.Property("PressureLevel")
+ .HasColumnType("real");
+
+ b.Property("RobotCapabilities")
+ .HasColumnType("text");
+
+ b.Property("SerialNumber")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CurrentAreaId");
+
+ b.HasIndex("CurrentInstallationId");
+
+ b.HasIndex("ModelId");
+
+ b.ToTable("Robots");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.RobotBatteryTimeseries", b =>
+ {
+ b.Property("BatteryLevel")
+ .HasColumnType("real");
+
+ b.Property("MissionId")
+ .HasColumnType("text");
+
+ b.Property("RobotId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Time")
+ .HasColumnType("timestamp with time zone");
+
+ b.ToTable("RobotBatteryTimeseries");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.RobotModel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("AverageDurationPerTag")
+ .HasColumnType("real");
+
+ b.Property("BatteryMissionStartThreshold")
+ .HasColumnType("real");
+
+ b.Property("BatteryWarningThreshold")
+ .HasColumnType("real");
+
+ b.Property("LowerPressureWarningThreshold")
+ .HasColumnType("real");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("UpperPressureWarningThreshold")
+ .HasColumnType("real");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Type")
+ .IsUnique();
+
+ b.ToTable("RobotModels");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.RobotPoseTimeseries", b =>
+ {
+ b.Property("MissionId")
+ .HasColumnType("text");
+
+ b.Property("OrientationW")
+ .HasColumnType("real");
+
+ b.Property("OrientationX")
+ .HasColumnType("real");
+
+ b.Property("OrientationY")
+ .HasColumnType("real");
+
+ b.Property("OrientationZ")
+ .HasColumnType("real");
+
+ b.Property("PositionX")
+ .HasColumnType("real");
+
+ b.Property("PositionY")
+ .HasColumnType("real");
+
+ b.Property("PositionZ")
+ .HasColumnType("real");
+
+ b.Property("RobotId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Time")
+ .HasColumnType("timestamp with time zone");
+
+ b.ToTable("RobotPoseTimeseries");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.RobotPressureTimeseries", b =>
+ {
+ b.Property("MissionId")
+ .HasColumnType("text");
+
+ b.Property("Pressure")
+ .HasColumnType("real");
+
+ b.Property("RobotId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Time")
+ .HasColumnType("timestamp with time zone");
+
+ b.ToTable("RobotPressureTimeseries");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Source", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("CustomMissionTasks")
+ .HasColumnType("text");
+
+ b.Property("SourceId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Sources");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.UserInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b.Property("Oid")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("UserInfos");
+ });
+
+ modelBuilder.Entity("Api.Services.MissionLoaders.TagInspectionMetadata", b =>
+ {
+ b.Property("TagId")
+ .HasColumnType("text");
+
+ b.HasKey("TagId");
+
+ b.ToTable("TagInspectionMetadata");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.AccessRole", b =>
+ {
+ b.HasOne("Api.Database.Models.Installation", "Installation")
+ .WithMany()
+ .HasForeignKey("InstallationId");
+
+ b.Navigation("Installation");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Area", b =>
+ {
+ b.HasOne("Api.Database.Models.Deck", "Deck")
+ .WithMany()
+ .HasForeignKey("DeckId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.HasOne("Api.Database.Models.DefaultLocalizationPose", "DefaultLocalizationPose")
+ .WithMany()
+ .HasForeignKey("DefaultLocalizationPoseId");
+
+ b.HasOne("Api.Database.Models.Installation", "Installation")
+ .WithMany()
+ .HasForeignKey("InstallationId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.HasOne("Api.Database.Models.Plant", "Plant")
+ .WithMany()
+ .HasForeignKey("PlantId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.OwnsOne("Api.Database.Models.MapMetadata", "MapMetadata", b1 =>
+ {
+ b1.Property("AreaId")
+ .HasColumnType("text");
+
+ b1.Property("MapName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b1.HasKey("AreaId");
+
+ b1.ToTable("Areas");
+
+ b1.WithOwner()
+ .HasForeignKey("AreaId");
+
+ b1.OwnsOne("Api.Database.Models.Boundary", "Boundary", b2 =>
+ {
+ b2.Property("MapMetadataAreaId")
+ .HasColumnType("text");
+
+ b2.Property("X1")
+ .HasColumnType("double precision");
+
+ b2.Property("X2")
+ .HasColumnType("double precision");
+
+ b2.Property("Y1")
+ .HasColumnType("double precision");
+
+ b2.Property("Y2")
+ .HasColumnType("double precision");
+
+ b2.Property("Z1")
+ .HasColumnType("double precision");
+
+ b2.Property("Z2")
+ .HasColumnType("double precision");
+
+ b2.HasKey("MapMetadataAreaId");
+
+ b2.ToTable("Areas");
+
+ b2.WithOwner()
+ .HasForeignKey("MapMetadataAreaId");
+ });
+
+ b1.OwnsOne("Api.Database.Models.TransformationMatrices", "TransformationMatrices", b2 =>
+ {
+ b2.Property("MapMetadataAreaId")
+ .HasColumnType("text");
+
+ b2.Property("C1")
+ .HasColumnType("double precision");
+
+ b2.Property("C2")
+ .HasColumnType("double precision");
+
+ b2.Property("D1")
+ .HasColumnType("double precision");
+
+ b2.Property("D2")
+ .HasColumnType("double precision");
+
+ b2.HasKey("MapMetadataAreaId");
+
+ b2.ToTable("Areas");
+
+ b2.WithOwner()
+ .HasForeignKey("MapMetadataAreaId");
+ });
+
+ b1.Navigation("Boundary")
+ .IsRequired();
+
+ b1.Navigation("TransformationMatrices")
+ .IsRequired();
+ });
+
+ b.Navigation("Deck");
+
+ b.Navigation("DefaultLocalizationPose");
+
+ b.Navigation("Installation");
+
+ b.Navigation("MapMetadata")
+ .IsRequired();
+
+ b.Navigation("Plant");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Deck", b =>
+ {
+ b.HasOne("Api.Database.Models.DefaultLocalizationPose", "DefaultLocalizationPose")
+ .WithMany()
+ .HasForeignKey("DefaultLocalizationPoseId");
+
+ b.HasOne("Api.Database.Models.Installation", "Installation")
+ .WithMany()
+ .HasForeignKey("InstallationId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.HasOne("Api.Database.Models.Plant", "Plant")
+ .WithMany()
+ .HasForeignKey("PlantId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.Navigation("DefaultLocalizationPose");
+
+ b.Navigation("Installation");
+
+ b.Navigation("Plant");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.DefaultLocalizationPose", b =>
+ {
+ b.OwnsOne("Api.Database.Models.Pose", "Pose", b1 =>
+ {
+ b1.Property("DefaultLocalizationPoseId")
+ .HasColumnType("text");
+
+ b1.HasKey("DefaultLocalizationPoseId");
+
+ b1.ToTable("DefaultLocalizationPoses");
+
+ b1.WithOwner()
+ .HasForeignKey("DefaultLocalizationPoseId");
+
+ b1.OwnsOne("Api.Database.Models.Orientation", "Orientation", b2 =>
+ {
+ b2.Property("PoseDefaultLocalizationPoseId")
+ .HasColumnType("text");
+
+ b2.Property("W")
+ .HasColumnType("real");
+
+ b2.Property("X")
+ .HasColumnType("real");
+
+ b2.Property("Y")
+ .HasColumnType("real");
+
+ b2.Property("Z")
+ .HasColumnType("real");
+
+ b2.HasKey("PoseDefaultLocalizationPoseId");
+
+ b2.ToTable("DefaultLocalizationPoses");
+
+ b2.WithOwner()
+ .HasForeignKey("PoseDefaultLocalizationPoseId");
+ });
+
+ b1.OwnsOne("Api.Database.Models.Position", "Position", b2 =>
+ {
+ b2.Property("PoseDefaultLocalizationPoseId")
+ .HasColumnType("text");
+
+ b2.Property("X")
+ .HasColumnType("real");
+
+ b2.Property("Y")
+ .HasColumnType("real");
+
+ b2.Property("Z")
+ .HasColumnType("real");
+
+ b2.HasKey("PoseDefaultLocalizationPoseId");
+
+ b2.ToTable("DefaultLocalizationPoses");
+
+ b2.WithOwner()
+ .HasForeignKey("PoseDefaultLocalizationPoseId");
+ });
+
+ b1.Navigation("Orientation")
+ .IsRequired();
+
+ b1.Navigation("Position")
+ .IsRequired();
+ });
+
+ b.Navigation("Pose")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Inspection", b =>
+ {
+ b.OwnsOne("Api.Database.Models.Position", "InspectionTarget", b1 =>
+ {
+ b1.Property("InspectionId")
+ .HasColumnType("text");
+
+ b1.Property("X")
+ .HasColumnType("real");
+
+ b1.Property("Y")
+ .HasColumnType("real");
+
+ b1.Property("Z")
+ .HasColumnType("real");
+
+ b1.HasKey("InspectionId");
+
+ b1.ToTable("Inspections");
+
+ b1.WithOwner()
+ .HasForeignKey("InspectionId");
+ });
+
+ b.Navigation("InspectionTarget")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Api.Database.Models.InspectionFinding", b =>
+ {
+ b.HasOne("Api.Database.Models.Inspection", null)
+ .WithMany("InspectionFindings")
+ .HasForeignKey("InspectionId");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionDefinition", b =>
+ {
+ b.HasOne("Api.Database.Models.Area", "Area")
+ .WithMany()
+ .HasForeignKey("AreaId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Api.Database.Models.MissionRun", "LastSuccessfulRun")
+ .WithMany()
+ .HasForeignKey("LastSuccessfulRunId");
+
+ b.HasOne("Api.Database.Models.Source", "Source")
+ .WithMany()
+ .HasForeignKey("SourceId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Area");
+
+ b.Navigation("LastSuccessfulRun");
+
+ b.Navigation("Source");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionRun", b =>
+ {
+ b.HasOne("Api.Database.Models.Area", "Area")
+ .WithMany()
+ .HasForeignKey("AreaId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Api.Database.Models.Robot", "Robot")
+ .WithMany()
+ .HasForeignKey("RobotId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsOne("Api.Database.Models.MapMetadata", "Map", b1 =>
+ {
+ b1.Property("MissionRunId")
+ .HasColumnType("text");
+
+ b1.Property("MapName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b1.HasKey("MissionRunId");
+
+ b1.ToTable("MissionRuns");
+
+ b1.WithOwner()
+ .HasForeignKey("MissionRunId");
+
+ b1.OwnsOne("Api.Database.Models.Boundary", "Boundary", b2 =>
+ {
+ b2.Property("MapMetadataMissionRunId")
+ .HasColumnType("text");
+
+ b2.Property("X1")
+ .HasColumnType("double precision");
+
+ b2.Property("X2")
+ .HasColumnType("double precision");
+
+ b2.Property("Y1")
+ .HasColumnType("double precision");
+
+ b2.Property("Y2")
+ .HasColumnType("double precision");
+
+ b2.Property("Z1")
+ .HasColumnType("double precision");
+
+ b2.Property("Z2")
+ .HasColumnType("double precision");
+
+ b2.HasKey("MapMetadataMissionRunId");
+
+ b2.ToTable("MissionRuns");
+
+ b2.WithOwner()
+ .HasForeignKey("MapMetadataMissionRunId");
+ });
+
+ b1.OwnsOne("Api.Database.Models.TransformationMatrices", "TransformationMatrices", b2 =>
+ {
+ b2.Property("MapMetadataMissionRunId")
+ .HasColumnType("text");
+
+ b2.Property("C1")
+ .HasColumnType("double precision");
+
+ b2.Property("C2")
+ .HasColumnType("double precision");
+
+ b2.Property("D1")
+ .HasColumnType("double precision");
+
+ b2.Property("D2")
+ .HasColumnType("double precision");
+
+ b2.HasKey("MapMetadataMissionRunId");
+
+ b2.ToTable("MissionRuns");
+
+ b2.WithOwner()
+ .HasForeignKey("MapMetadataMissionRunId");
+ });
+
+ b1.Navigation("Boundary")
+ .IsRequired();
+
+ b1.Navigation("TransformationMatrices")
+ .IsRequired();
+ });
+
+ b.Navigation("Area");
+
+ b.Navigation("Map");
+
+ b.Navigation("Robot");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionTask", b =>
+ {
+ b.HasOne("Api.Database.Models.Inspection", "Inspection")
+ .WithMany()
+ .HasForeignKey("InspectionId");
+
+ b.HasOne("Api.Database.Models.MissionRun", null)
+ .WithMany("Tasks")
+ .HasForeignKey("MissionRunId");
+
+ b.OwnsOne("Api.Services.Models.IsarZoomDescription", "IsarZoomDescription", b1 =>
+ {
+ b1.Property("MissionTaskId")
+ .HasColumnType("text");
+
+ b1.Property("ObjectHeight")
+ .HasColumnType("double precision")
+ .HasAnnotation("Relational:JsonPropertyName", "objectHeight");
+
+ b1.Property("ObjectWidth")
+ .HasColumnType("double precision")
+ .HasAnnotation("Relational:JsonPropertyName", "objectWidth");
+
+ b1.HasKey("MissionTaskId");
+
+ b1.ToTable("MissionTasks");
+
+ b1.WithOwner()
+ .HasForeignKey("MissionTaskId");
+ });
+
+ b.OwnsOne("Api.Database.Models.Pose", "RobotPose", b1 =>
+ {
+ b1.Property("MissionTaskId")
+ .HasColumnType("text");
+
+ b1.HasKey("MissionTaskId");
+
+ b1.ToTable("MissionTasks");
+
+ b1.WithOwner()
+ .HasForeignKey("MissionTaskId");
+
+ b1.OwnsOne("Api.Database.Models.Orientation", "Orientation", b2 =>
+ {
+ b2.Property("PoseMissionTaskId")
+ .HasColumnType("text");
+
+ b2.Property("W")
+ .HasColumnType("real");
+
+ b2.Property("X")
+ .HasColumnType("real");
+
+ b2.Property("Y")
+ .HasColumnType("real");
+
+ b2.Property("Z")
+ .HasColumnType("real");
+
+ b2.HasKey("PoseMissionTaskId");
+
+ b2.ToTable("MissionTasks");
+
+ b2.WithOwner()
+ .HasForeignKey("PoseMissionTaskId");
+ });
+
+ b1.OwnsOne("Api.Database.Models.Position", "Position", b2 =>
+ {
+ b2.Property("PoseMissionTaskId")
+ .HasColumnType("text");
+
+ b2.Property("X")
+ .HasColumnType("real");
+
+ b2.Property("Y")
+ .HasColumnType("real");
+
+ b2.Property("Z")
+ .HasColumnType("real");
+
+ b2.HasKey("PoseMissionTaskId");
+
+ b2.ToTable("MissionTasks");
+
+ b2.WithOwner()
+ .HasForeignKey("PoseMissionTaskId");
+ });
+
+ b1.Navigation("Orientation")
+ .IsRequired();
+
+ b1.Navigation("Position")
+ .IsRequired();
+ });
+
+ b.Navigation("Inspection");
+
+ b.Navigation("IsarZoomDescription");
+
+ b.Navigation("RobotPose")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Plant", b =>
+ {
+ b.HasOne("Api.Database.Models.Installation", "Installation")
+ .WithMany()
+ .HasForeignKey("InstallationId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.Navigation("Installation");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Robot", b =>
+ {
+ b.HasOne("Api.Database.Models.Area", "CurrentArea")
+ .WithMany()
+ .HasForeignKey("CurrentAreaId");
+
+ b.HasOne("Api.Database.Models.Installation", "CurrentInstallation")
+ .WithMany()
+ .HasForeignKey("CurrentInstallationId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Api.Database.Models.RobotModel", "Model")
+ .WithMany()
+ .HasForeignKey("ModelId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsMany("Api.Database.Models.DocumentInfo", "Documentation", b1 =>
+ {
+ b1.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("text");
+
+ b1.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b1.Property("RobotId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b1.Property("Url")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b1.HasKey("Id");
+
+ b1.HasIndex("RobotId");
+
+ b1.ToTable("DocumentInfo");
+
+ b1.WithOwner()
+ .HasForeignKey("RobotId");
+ });
+
+ b.OwnsOne("Api.Database.Models.Pose", "Pose", b1 =>
+ {
+ b1.Property("RobotId")
+ .HasColumnType("text");
+
+ b1.HasKey("RobotId");
+
+ b1.ToTable("Robots");
+
+ b1.WithOwner()
+ .HasForeignKey("RobotId");
+
+ b1.OwnsOne("Api.Database.Models.Orientation", "Orientation", b2 =>
+ {
+ b2.Property("PoseRobotId")
+ .HasColumnType("text");
+
+ b2.Property("W")
+ .HasColumnType("real");
+
+ b2.Property("X")
+ .HasColumnType("real");
+
+ b2.Property("Y")
+ .HasColumnType("real");
+
+ b2.Property("Z")
+ .HasColumnType("real");
+
+ b2.HasKey("PoseRobotId");
+
+ b2.ToTable("Robots");
+
+ b2.WithOwner()
+ .HasForeignKey("PoseRobotId");
+ });
+
+ b1.OwnsOne("Api.Database.Models.Position", "Position", b2 =>
+ {
+ b2.Property("PoseRobotId")
+ .HasColumnType("text");
+
+ b2.Property("X")
+ .HasColumnType("real");
+
+ b2.Property("Y")
+ .HasColumnType("real");
+
+ b2.Property("Z")
+ .HasColumnType("real");
+
+ b2.HasKey("PoseRobotId");
+
+ b2.ToTable("Robots");
+
+ b2.WithOwner()
+ .HasForeignKey("PoseRobotId");
+ });
+
+ b1.Navigation("Orientation")
+ .IsRequired();
+
+ b1.Navigation("Position")
+ .IsRequired();
+ });
+
+ b.Navigation("CurrentArea");
+
+ b.Navigation("CurrentInstallation");
+
+ b.Navigation("Documentation");
+
+ b.Navigation("Model");
+
+ b.Navigation("Pose")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Api.Services.MissionLoaders.TagInspectionMetadata", b =>
+ {
+ b.OwnsOne("Api.Services.Models.IsarZoomDescription", "ZoomDescription", b1 =>
+ {
+ b1.Property("TagInspectionMetadataTagId")
+ .HasColumnType("text");
+
+ b1.Property("ObjectHeight")
+ .HasColumnType("double precision")
+ .HasAnnotation("Relational:JsonPropertyName", "objectHeight");
+
+ b1.Property("ObjectWidth")
+ .HasColumnType("double precision")
+ .HasAnnotation("Relational:JsonPropertyName", "objectWidth");
+
+ b1.HasKey("TagInspectionMetadataTagId");
+
+ b1.ToTable("TagInspectionMetadata");
+
+ b1.WithOwner()
+ .HasForeignKey("TagInspectionMetadataTagId");
+ });
+
+ b.Navigation("ZoomDescription");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.Inspection", b =>
+ {
+ b.Navigation("InspectionFindings");
+ });
+
+ modelBuilder.Entity("Api.Database.Models.MissionRun", b =>
+ {
+ b.Navigation("Tasks");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/backend/api/Migrations/20241213081436_AddIsarInspectionIdToInspections.cs b/backend/api/Migrations/20241213081436_AddIsarInspectionIdToInspections.cs
new file mode 100644
index 000000000..ad9c91025
--- /dev/null
+++ b/backend/api/Migrations/20241213081436_AddIsarInspectionIdToInspections.cs
@@ -0,0 +1,30 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Api.Migrations
+{
+ ///
+ public partial class AddIsarInspectionIdToInspections : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "IsarInspectionId",
+ table: "Inspections",
+ type: "character varying(200)",
+ maxLength: 200,
+ nullable: false,
+ defaultValue: "");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "IsarInspectionId",
+ table: "Inspections");
+ }
+ }
+}
diff --git a/backend/api/Migrations/FlotillaDbContextModelSnapshot.cs b/backend/api/Migrations/FlotillaDbContextModelSnapshot.cs
index a0387239b..d983d30c7 100644
--- a/backend/api/Migrations/FlotillaDbContextModelSnapshot.cs
+++ b/backend/api/Migrations/FlotillaDbContextModelSnapshot.cs
@@ -17,7 +17,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "8.0.7")
+ .HasAnnotation("ProductVersion", "8.0.11")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -155,6 +155,11 @@ protected override void BuildModel(ModelBuilder modelBuilder)
.HasMaxLength(250)
.HasColumnType("character varying(250)");
+ b.Property("IsarInspectionId")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
b.Property("IsarTaskId")
.IsRequired()
.HasMaxLength(200)
diff --git a/backend/api/Services/Models/IsarMissionDefinition.cs b/backend/api/Services/Models/IsarMissionDefinition.cs
index 7d4347488..e6aa5f4be 100644
--- a/backend/api/Services/Models/IsarMissionDefinition.cs
+++ b/backend/api/Services/Models/IsarMissionDefinition.cs
@@ -10,9 +10,6 @@ namespace Api.Services.Models
///
public struct IsarMissionDefinition
{
- [JsonPropertyName("id")]
- public string? Id { get; set; }
-
[JsonPropertyName("name")]
public string? Name { get; set; }
@@ -30,14 +27,12 @@ public struct IsarMissionDefinition
public IsarMissionDefinition(List tasks)
{
- Id = null;
Name = null;
Tasks = tasks;
}
public IsarMissionDefinition(MissionRun missionRun, bool includeStartPose = false)
{
- Id = missionRun.IsarMissionId;
Name = missionRun.Name;
Tasks = missionRun.Tasks.Select(task => new IsarTaskDefinition(task, missionRun)).ToList();
StartPose = includeStartPose && missionRun.Area.Deck.DefaultLocalizationPose != null ? new IsarPose(missionRun.Area.Deck.DefaultLocalizationPose.Pose) : null;
@@ -80,9 +75,6 @@ public IsarTaskDefinition(MissionTask missionTask, MissionRun missionRun)
public struct IsarInspectionDefinition
{
- [JsonPropertyName("id")]
- public string? Id { get; set; }
-
[JsonPropertyName("type")]
public string Type { get; set; }
@@ -97,7 +89,6 @@ public struct IsarInspectionDefinition
public IsarInspectionDefinition(Inspection inspection, MissionRun missionRun)
{
- Id = inspection.Id;
Type = inspection.InspectionType.ToString();
InspectionTarget = inspection.InspectionTarget != null ? new IsarPosition(
inspection.InspectionTarget.X,
diff --git a/backend/api/Services/Models/IsarStartMissionResponse.cs b/backend/api/Services/Models/IsarStartMissionResponse.cs
index 2c3063f79..16dbae617 100644
--- a/backend/api/Services/Models/IsarStartMissionResponse.cs
+++ b/backend/api/Services/Models/IsarStartMissionResponse.cs
@@ -1,30 +1,31 @@
using System.Text.Json.Serialization;
-#nullable disable
+
namespace Api.Services.Models
{
public class IsarStartMissionResponse
{
[JsonPropertyName("id")]
- public string MissionId { get; set; }
+ public required string MissionId { get; set; }
[JsonPropertyName("tasks")]
- public IList Tasks { get; set; }
+ public required IList Tasks { get; set; }
}
public class IsarTaskResponse
{
[JsonPropertyName("id")]
- public string IsarTaskId { get; set; }
+ public required string IsarTaskId { get; set; }
[JsonPropertyName("tag_id")]
- public string TagId { get; set; }
+ public required string TagId { get; set; }
+
+ [JsonPropertyName("inspection_id")]
+ public string? IsarInspectionId { get; set; }
[JsonPropertyName("type")]
- public string TaskType { get; set; }
+ public required string TaskType { get; set; }
- [JsonPropertyName("task_action_id")]
- public string TaskActionId { get; set; }
}
}
diff --git a/backend/api/Services/Models/IsarTask.cs b/backend/api/Services/Models/IsarTask.cs
index cd98ee82e..7ff14fbcc 100644
--- a/backend/api/Services/Models/IsarTask.cs
+++ b/backend/api/Services/Models/IsarTask.cs
@@ -4,6 +4,8 @@ public class IsarTask(IsarTaskResponse taskResponse)
{
public string IsarTaskId { get; } = taskResponse.IsarTaskId;
+ public string? IsarInspectionId { get; } = taskResponse.IsarInspectionId;
+
public IsarTaskStatus TaskStatus { get; } = IsarTaskStatus.NotStarted;
public IsarTaskType TaskType { get; } = TaskTypeFromString(taskResponse.TaskType);