feat(api): TemplateController адаптировал метод getAll под новую структуру
This commit is contained in:
@@ -2,10 +2,10 @@
|
|||||||
{
|
{
|
||||||
public class TemplateQuery
|
public class TemplateQuery
|
||||||
{
|
{
|
||||||
/// <summary>
|
///// <summary>
|
||||||
/// Статус шаблона: 10, 20, 30
|
///// Статус шаблона: 10, 20, 30
|
||||||
/// </summary>
|
///// </summary>
|
||||||
public int? StatusCode { get; set; }
|
//public int? StatusCode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Поиск по маске. Например: "*-ДВС"
|
/// Поиск по маске. Например: "*-ДВС"
|
||||||
|
|||||||
@@ -4,24 +4,18 @@
|
|||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public required string Name { get; set; }
|
public required string Name { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActiveTemplate { get; set; }
|
||||||
|
public bool IsActiveSchedule { get; set; }
|
||||||
|
|
||||||
public required string Category { get; set; }
|
public required string Category { get; set; }
|
||||||
public required string Initiator { get; set; }
|
public required string Initiator { get; set; }
|
||||||
public required string ClosingCode { get; set; }
|
public required string ClosingCode { get; set; }
|
||||||
|
|
||||||
public int StatusCode { get; set; }
|
|
||||||
|
|
||||||
public required string ShortDescription { get; set; }
|
public required string ShortDescription { get; set; }
|
||||||
public required string FullDescription { get; set; }
|
public required string FullDescription { get; set; }
|
||||||
public required string Solution { get; set; }
|
public required string Solution { get; set; }
|
||||||
public required string TemplateDuration { get; set; }
|
public required string TemplateDuration { get; set; }
|
||||||
|
|
||||||
public int RobotAttemptsNumber { get; set; }
|
|
||||||
public DateTimeOffset? RobotLastStatusUpdated { get; set; }
|
|
||||||
public RobotStatusResponse? RobotStatus { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
//work
|
//work
|
||||||
//public required string Title { get; set; }
|
//public required string Title { get; set; }
|
||||||
//public required string SlaInterval { get; set; }
|
//public required string SlaInterval { get; set; }
|
||||||
@@ -48,37 +42,39 @@
|
|||||||
//tnk
|
//tnk
|
||||||
//public required string RzdMTNKtnk { get; set; }
|
//public required string RzdMTNKtnk { get; set; }
|
||||||
public TnkResponse? Tnk { get; set; }
|
public TnkResponse? Tnk { get; set; }
|
||||||
|
|
||||||
|
public List<RobotConfigurationResponse>? SyncStatus { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TemplateStringResponse
|
//public class TemplateStringResponse
|
||||||
{
|
//{
|
||||||
public required string Name { get; set; }
|
// public required string Name { get; set; }
|
||||||
public required string IsActive { get; set; }
|
// public required string IsActive { get; set; }
|
||||||
public required string Assignment { get; set; }
|
// public required string Assignment { get; set; }
|
||||||
public required string Title { get; set; }
|
// public required string Title { get; set; }
|
||||||
public required string Category { get; set; }
|
// public required string Category { get; set; }
|
||||||
public required string Branch { get; set; }
|
// public required string Branch { get; set; }
|
||||||
public required string SlaInterval { get; set; }
|
// public required string SlaInterval { get; set; }
|
||||||
public required string ConfigurationItem { get; set; }
|
// public required string ConfigurationItem { get; set; }
|
||||||
public required string ContactName { get; set; }
|
// public required string ContactName { get; set; }
|
||||||
public required string Description { get; set; }
|
// public required string Description { get; set; }
|
||||||
public required string ResolutionCode { get; set; }
|
// public required string ResolutionCode { get; set; }
|
||||||
public required string Resolution { get; set; }
|
// public required string Resolution { get; set; }
|
||||||
|
|
||||||
public required string RzdMTNKprocess { get; set; }
|
// public required string RzdMTNKprocess { get; set; }
|
||||||
public required string RzdMTNKprocessId { get; set; }
|
// public required string RzdMTNKprocessId { get; set; }
|
||||||
|
|
||||||
public required string RzdMTNKsubprocess { get; set; }
|
// public required string RzdMTNKsubprocess { get; set; }
|
||||||
public required string RzdMTNKsubprocessId { get; set; }
|
// public required string RzdMTNKsubprocessId { get; set; }
|
||||||
|
|
||||||
public required string RzdMTNKtnk { get; set; }
|
// public required string RzdMTNKtnk { get; set; }
|
||||||
public required string RzdMTNKtnkId { get; set; }
|
// public required string RzdMTNKtnkId { get; set; }
|
||||||
|
|
||||||
public required string RzdMTNKjob { get; set; }
|
// public required string RzdMTNKjob { get; set; }
|
||||||
public required string RzdMTNKjobId { get; set; }
|
// public required string RzdMTNKjobId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public required string Id { get; set; }
|
// public required string Id { get; set; }
|
||||||
public required string StatusCode { get; set; }
|
// public required string StatusCode { get; set; }
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
var configToResonse = await robotConfigurationService.Get()
|
var configToResonse = await robotConfigurationService.Get()
|
||||||
.Include(t => t.Robot)
|
.Include(t => t.Robot)
|
||||||
.Include(t => t.StatusTask)
|
.Include(t => t.TaskStatus)
|
||||||
.Include(t => t.RobotStatus)
|
.Include(t => t.RobotStatus)
|
||||||
.FirstOrDefaultAsync(t => t.Id == taskId);
|
.FirstOrDefaultAsync(t => t.Id == taskId);
|
||||||
|
|
||||||
|
|||||||
@@ -44,28 +44,12 @@ namespace PARR.API.Controllers.V1
|
|||||||
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
|
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
|
||||||
|
|
||||||
IQueryable<Template> query = templateService.GetWithIncludes()
|
IQueryable<Template> query = templateService.GetWithIncludes()
|
||||||
|
.Include(t => t.RobotConfigurations).ThenInclude(t=>t.Robot)
|
||||||
|
.Include(t => t.RobotConfigurations).ThenInclude(t => t.TaskStatus)
|
||||||
|
.Include(t => t.RobotConfigurations).ThenInclude(t => t.RobotStatus)
|
||||||
.OrderBy(t => t.Name)
|
.OrderBy(t => t.Name)
|
||||||
.AsSplitQuery();
|
.AsSplitQuery();
|
||||||
|
|
||||||
//TODO:!!!
|
|
||||||
|
|
||||||
//if (filter.StatusCode.HasValue)
|
|
||||||
//{
|
|
||||||
// switch (filter.StatusCode.Value)
|
|
||||||
// {
|
|
||||||
// case (int)TaskStatusEnum.Ok:
|
|
||||||
// query = query.Where(t => t.StatusCode == (int)TaskStatusEnum.Ok);
|
|
||||||
// break;
|
|
||||||
// case (int)TaskStatusEnum.Creating:
|
|
||||||
// query = query.Where(t => t.StatusCode == (int)TaskStatusEnum.Creating);
|
|
||||||
// break;
|
|
||||||
// case (int)TaskStatusEnum.Updating:
|
|
||||||
// query = query.Where(t => t.StatusCode == (int)TaskStatusEnum.Updating);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(filter.Mask))
|
if (!string.IsNullOrEmpty(filter.Mask))
|
||||||
query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(filter.Mask)));
|
query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(filter.Mask)));
|
||||||
|
|||||||
@@ -40,27 +40,8 @@ namespace PARR.API.MappingProfiles
|
|||||||
.ForMember(d => d.TemplateDuration, o => o.MapFrom(s => s.ApplicationsInWork!.TemplateDuration))
|
.ForMember(d => d.TemplateDuration, o => o.MapFrom(s => s.ApplicationsInWork!.TemplateDuration))
|
||||||
.ForMember(d => d.Initiator, o => o.MapFrom<TemplateInitiatorResolver>())
|
.ForMember(d => d.Initiator, o => o.MapFrom<TemplateInitiatorResolver>())
|
||||||
.ForMember(d => d.ClosingCode, o => o.MapFrom<TemplateClosingCodeResolver>())
|
.ForMember(d => d.ClosingCode, o => o.MapFrom<TemplateClosingCodeResolver>())
|
||||||
.ForMember(d => d.Category, o => o.MapFrom<TemplateCategoryResolver>());
|
.ForMember(d => d.Category, o => o.MapFrom<TemplateCategoryResolver>())
|
||||||
|
.ForMember(d => d.SyncStatus, o => o.MapFrom(s => s.RobotConfigurations));
|
||||||
CreateMap<TemplateResponse, TemplateStringResponse>()
|
|
||||||
.ForMember(d => d.Assignment, o => o.MapFrom(s => s.Host!.WorkGroup))
|
|
||||||
.ForMember(d => d.Title, o => o.MapFrom(s => s.ShortDescription))
|
|
||||||
.ForMember(d => d.Branch, o => o.MapFrom(s => s.Host!.ResponseArea))
|
|
||||||
.ForMember(d => d.SlaInterval, o => o.MapFrom(s => s.TemplateDuration))
|
|
||||||
.ForMember(d => d.ConfigurationItem, o => o.MapFrom(s => s.Host!.Ek))
|
|
||||||
.ForMember(d => d.ContactName, o => o.MapFrom(s => s.Initiator))
|
|
||||||
.ForMember(d => d.Description, o => o.MapFrom(s => s.FullDescription))
|
|
||||||
.ForMember(d => d.ResolutionCode, o => o.MapFrom(s => s.ClosingCode))
|
|
||||||
.ForMember(d => d.Resolution, o => o.MapFrom(s => s.Solution))
|
|
||||||
.ForMember(d => d.RzdMTNKprocess, o => o.MapFrom(s => s.Process!.Name))
|
|
||||||
.ForMember(d => d.RzdMTNKprocessId, o => o.MapFrom(s => s.Process!.EsppId))
|
|
||||||
.ForMember(d => d.RzdMTNKsubprocess, o => o.MapFrom(s => s.Subprocess!.Name))
|
|
||||||
.ForMember(d => d.RzdMTNKsubprocessId, o => o.MapFrom(s => s.Subprocess!.EsppId))
|
|
||||||
.ForMember(d => d.RzdMTNKtnk, o => o.MapFrom(s => s.Tnk!.Name))
|
|
||||||
.ForMember(d => d.RzdMTNKtnkId, o => o.MapFrom(s => s.Tnk!.EsppId))
|
|
||||||
.ForMember(d => d.RzdMTNKjob, o => o.MapFrom(s => s.Work!.Name))
|
|
||||||
.ForMember(d => d.RzdMTNKjobId, o => o.MapFrom(s => s.Work!.EsppId));
|
|
||||||
|
|
||||||
// === Template ===
|
// === Template ===
|
||||||
|
|
||||||
CreateMap<DAL.Models.TaskStatus, TaskStatusResponse>();
|
CreateMap<DAL.Models.TaskStatus, TaskStatusResponse>();
|
||||||
@@ -123,7 +104,7 @@ namespace PARR.API.MappingProfiles
|
|||||||
|
|
||||||
CreateMap<RobotConfiguration, RobotConfigurationResponse>()
|
CreateMap<RobotConfiguration, RobotConfigurationResponse>()
|
||||||
.ForMember(d => d.Robot, o => o.MapFrom(s => s.Robot))
|
.ForMember(d => d.Robot, o => o.MapFrom(s => s.Robot))
|
||||||
.ForMember(d => d.TaskStatus, o => o.MapFrom(s => s.StatusTask))
|
.ForMember(d => d.TaskStatus, o => o.MapFrom(s => s.TaskStatus))
|
||||||
.ForMember(d => d.RobotStatus, o => o.MapFrom(s => s.RobotStatus));
|
.ForMember(d => d.RobotStatus, o => o.MapFrom(s => s.RobotStatus));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1934
PARR.DAL/Migrations/20231006044458_TblTemplatesUpd2.Designer.cs
generated
Normal file
1934
PARR.DAL/Migrations/20231006044458_TblTemplatesUpd2.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
78
PARR.DAL/Migrations/20231006044458_TblTemplatesUpd2.cs
Normal file
78
PARR.DAL/Migrations/20231006044458_TblTemplatesUpd2.cs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace PARR.DAL.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class TblTemplatesUpd2 : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_Templates_RobotStatuses_RobotStatusCode",
|
||||||
|
table: "Templates");
|
||||||
|
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_Templates_TaskStatuses_TaskStatusCode",
|
||||||
|
table: "Templates");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_Templates_RobotStatusCode",
|
||||||
|
table: "Templates");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_Templates_TaskStatusCode",
|
||||||
|
table: "Templates");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "RobotStatusCode",
|
||||||
|
table: "Templates");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "TaskStatusCode",
|
||||||
|
table: "Templates");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<int>(
|
||||||
|
name: "RobotStatusCode",
|
||||||
|
table: "Templates",
|
||||||
|
type: "integer",
|
||||||
|
nullable: true);
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>(
|
||||||
|
name: "TaskStatusCode",
|
||||||
|
table: "Templates",
|
||||||
|
type: "integer",
|
||||||
|
nullable: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Templates_RobotStatusCode",
|
||||||
|
table: "Templates",
|
||||||
|
column: "RobotStatusCode");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Templates_TaskStatusCode",
|
||||||
|
table: "Templates",
|
||||||
|
column: "TaskStatusCode");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_Templates_RobotStatuses_RobotStatusCode",
|
||||||
|
table: "Templates",
|
||||||
|
column: "RobotStatusCode",
|
||||||
|
principalTable: "RobotStatuses",
|
||||||
|
principalColumn: "Code");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_Templates_TaskStatuses_TaskStatusCode",
|
||||||
|
table: "Templates",
|
||||||
|
column: "TaskStatusCode",
|
||||||
|
principalTable: "TaskStatuses",
|
||||||
|
principalColumn: "Code");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1100,12 +1100,6 @@ namespace PARR.DAL.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
|
|
||||||
b.Property<int?>("RobotStatusCode")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<int?>("TaskStatusCode")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("ApplicationInWorkId");
|
b.HasIndex("ApplicationInWorkId");
|
||||||
@@ -1115,10 +1109,6 @@ namespace PARR.DAL.Migrations
|
|||||||
b.HasIndex("Name")
|
b.HasIndex("Name")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
b.HasIndex("RobotStatusCode");
|
|
||||||
|
|
||||||
b.HasIndex("TaskStatusCode");
|
|
||||||
|
|
||||||
b.ToTable("Templates");
|
b.ToTable("Templates");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1604,13 +1594,13 @@ namespace PARR.DAL.Migrations
|
|||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("PARR.DAL.Models.RobotStatus", "RobotStatus")
|
b.HasOne("PARR.DAL.Models.RobotStatus", "RobotStatus")
|
||||||
.WithMany()
|
.WithMany("RobotConfigurations")
|
||||||
.HasForeignKey("RobotStatusCode")
|
.HasForeignKey("RobotStatusCode")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("PARR.DAL.Models.TaskStatus", "StatusTask")
|
b.HasOne("PARR.DAL.Models.TaskStatus", "TaskStatus")
|
||||||
.WithMany()
|
.WithMany("RobotConfigurations")
|
||||||
.HasForeignKey("TaskStatusCode")
|
.HasForeignKey("TaskStatusCode")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
@@ -1625,7 +1615,7 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
b.Navigation("RobotStatus");
|
b.Navigation("RobotStatus");
|
||||||
|
|
||||||
b.Navigation("StatusTask");
|
b.Navigation("TaskStatus");
|
||||||
|
|
||||||
b.Navigation("Template");
|
b.Navigation("Template");
|
||||||
});
|
});
|
||||||
@@ -1645,7 +1635,7 @@ namespace PARR.DAL.Migrations
|
|||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("PARR.DAL.Models.TaskStatus", "StatusTask")
|
b.HasOne("PARR.DAL.Models.TaskStatus", "StatusTask")
|
||||||
.WithMany()
|
.WithMany("RobotHistories")
|
||||||
.HasForeignKey("TaskStatusCode")
|
.HasForeignKey("TaskStatusCode")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
@@ -1682,14 +1672,6 @@ namespace PARR.DAL.Migrations
|
|||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("PARR.DAL.Models.RobotStatus", null)
|
|
||||||
.WithMany("Templates")
|
|
||||||
.HasForeignKey("RobotStatusCode");
|
|
||||||
|
|
||||||
b.HasOne("PARR.DAL.Models.TaskStatus", null)
|
|
||||||
.WithMany("Templates")
|
|
||||||
.HasForeignKey("TaskStatusCode");
|
|
||||||
|
|
||||||
b.Navigation("ApplicationsInWork");
|
b.Navigation("ApplicationsInWork");
|
||||||
|
|
||||||
b.Navigation("Host");
|
b.Navigation("Host");
|
||||||
@@ -1872,7 +1854,7 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("PARR.DAL.Models.RobotStatus", b =>
|
modelBuilder.Entity("PARR.DAL.Models.RobotStatus", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Templates");
|
b.Navigation("RobotConfigurations");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("PARR.DAL.Models.Subprocess", b =>
|
modelBuilder.Entity("PARR.DAL.Models.Subprocess", b =>
|
||||||
@@ -1882,7 +1864,9 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("PARR.DAL.Models.TaskStatus", b =>
|
modelBuilder.Entity("PARR.DAL.Models.TaskStatus", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Templates");
|
b.Navigation("RobotConfigurations");
|
||||||
|
|
||||||
|
b.Navigation("RobotHistories");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("PARR.DAL.Models.Template", b =>
|
modelBuilder.Entity("PARR.DAL.Models.Template", b =>
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ namespace PARR.DAL.Models
|
|||||||
public Robot? Robot { get; set; }
|
public Robot? Robot { get; set; }
|
||||||
|
|
||||||
[ForeignKey(nameof(TaskStatusCode))]
|
[ForeignKey(nameof(TaskStatusCode))]
|
||||||
public TaskStatus? StatusTask { get; set; }
|
public TaskStatus? TaskStatus { get; set; }
|
||||||
|
|
||||||
[ForeignKey(nameof(RobotStatusCode))]
|
[ForeignKey(nameof(RobotStatusCode))]
|
||||||
public RobotStatus? RobotStatus { get; set; }
|
public RobotStatus? RobotStatus { get; set; }
|
||||||
|
|||||||
@@ -18,6 +18,6 @@ namespace PARR.DAL.Models
|
|||||||
[Required]
|
[Required]
|
||||||
public string Description { get; set; } = string.Empty;
|
public string Description { get; set; } = string.Empty;
|
||||||
|
|
||||||
public ICollection<Template> Templates { get; set; } = new HashSet<Template>();
|
public ICollection<RobotConfiguration> RobotConfigurations { get; set; } = new HashSet<RobotConfiguration>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ namespace PARR.DAL.Models
|
|||||||
[Required]
|
[Required]
|
||||||
public string Description { get; set; } = string.Empty;
|
public string Description { get; set; } = string.Empty;
|
||||||
|
|
||||||
public ICollection<Template> Templates { get; set; } = new HashSet<Template>();
|
public ICollection<RobotConfiguration> RobotConfigurations { get; set; } = new HashSet<RobotConfiguration>();
|
||||||
|
|
||||||
|
public ICollection<RobotHistory> RobotHistories { get; set; } = new HashSet<RobotHistory>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user