Статусы ЭК вынесены из Hosts. Добавлен фильтр по статусам эк в генератор.

This commit is contained in:
Mikhail Trubnikov
2023-09-25 15:32:22 +10:00
parent 322ac75111
commit 59eb80a0b4
14 changed files with 1844 additions and 20 deletions

View File

@@ -214,7 +214,9 @@ namespace PARR.AIHIT
await GetAppTypesAsync(); await GetAppTypesAsync();
//Получаем зоны ответственности из БД //Получаем зоны ответственности из БД
var respAreas = settingService.Get().Where(ra => ra.Group == AIHTITSettings.RespAreaGroupName).ToList(); var respAreas = await settingService.Get()
.Where(ra => ra.Group == AIHTITSettings.RespAreaGroupName)
.ToListAsync();
//Запускаем хранимую процедуру в АИХ ИТ и складываем в таблицу RawDataEKs, предварительно почистив старые данные //Запускаем хранимую процедуру в АИХ ИТ и складываем в таблицу RawDataEKs, предварительно почистив старые данные
//foreach (var respArea in respAreas) //foreach (var respArea in respAreas)
@@ -249,17 +251,24 @@ namespace PARR.AIHIT
//Разбираем сырые данные //Разбираем сырые данные
//Получаем интересующие статусы ЭК //Получаем интересующие статусы ЭК
var statusList = settingService.Get().Where(s => s.Group == AIHTITSettings.StatusGroupName).Select(s => s.Value.Trim()).ToList(); var statusList = await settingService.Get()
if (statusList == null || statusList.Count == 0) return; .Where(s => s.Group == AIHTITSettings.StatusGroupName)
.Select(s => s.Value.Trim())
.ToListAsync();
if (statusList == null || statusList.Count == 0)
return;
//Берём только активные шаблоны //Берём только активные шаблоны
var eks = rawDataEKService.Get().Where(e => e.IsActive == "t" var eks = await rawDataEKService.Get()
&& (e.Status != null && statusList.Contains(e.Status.Trim())) .Where(e => e.IsActive == "t" && (e.Status != null && statusList.Contains(e.Status.Trim())))
).ToList(); .ToListAsync();
foreach (var ek in eks) foreach (var ek in eks)
{ {
if (ek.IP == null) continue; if (ek.IP == null)
continue;
var foundHost = await hostService.GetHostWithAppsAsync(ek.IP); var foundHost = await hostService.GetHostWithAppsAsync(ek.IP);
var mappedHost = mapper.Map<Host>(ek); var mappedHost = mapper.Map<Host>(ek);

View File

@@ -21,5 +21,10 @@
/// ЭК, принимает регулярное выражение. Например: *, ВРТ-*-ДВС /// ЭК, принимает регулярное выражение. Например: *, ВРТ-*-ДВС
/// </summary> /// </summary>
public required string Ek { get; set; } public required string Ek { get; set; }
/// <summary>
/// Статус ЭК. 0 - все статусы, 1,2,3,4,5,6,7,9
/// </summary>
public int Status { get; set; }
} }
} }

View File

@@ -48,7 +48,8 @@ namespace PARR.API.Controllers.V1
Action = request.Action, Action = request.Action,
ApplicationId = request.ApplicationId, ApplicationId = request.ApplicationId,
Ek = request.Ek, Ek = request.Ek,
WorkId = request.WorkId WorkId = request.WorkId,
StatusEk = request.Status
}; };
var msg = JsonSerializer.Serialize(obj); var msg = JsonSerializer.Serialize(obj);

View File

@@ -29,6 +29,10 @@ namespace PARR.API.Validators
RuleFor(t => t.Action) RuleFor(t => t.Action)
.Must(t => t.ToLower() == GenerateTemplateActionsEnum.create.ToString() || t.ToLower() == GenerateTemplateActionsEnum.deactivate.ToString()) .Must(t => t.ToLower() == GenerateTemplateActionsEnum.create.ToString() || t.ToLower() == GenerateTemplateActionsEnum.deactivate.ToString())
.WithMessage($"Допустимые значения: {GenerateTemplateActionsEnum.create}, {GenerateTemplateActionsEnum.deactivate}"); .WithMessage($"Допустимые значения: {GenerateTemplateActionsEnum.create}, {GenerateTemplateActionsEnum.deactivate}");
//0 - все статусы, 1,2,3,4,5,6,7,9
var ekStatuses = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 9 };
RuleFor(t => t.Status).Must(t => ekStatuses.Contains(t)).WithMessage("Допустимые значения: 0 - все статусы, 1,2,3,4,5,6,7,9");
} }
private async Task<bool> IsApplicationContainWork(GeneratorTemplateRequest request, Guid applicationId) private async Task<bool> IsApplicationContainWork(GeneratorTemplateRequest request, Guid applicationId)

View File

@@ -24,5 +24,10 @@
/// ЭК, принимает регулярное выражение. Например: *, ВРТ-*-ДВС /// ЭК, принимает регулярное выражение. Например: *, ВРТ-*-ДВС
/// </summary> /// </summary>
public required string Ek { get; set; } public required string Ek { get; set; }
/// <summary>
/// Статус ЭК. Допустимые значения: 0 - все статусы, 1,2,3,4,5,6,7,9
/// </summary>
public int StatusEk { get; set; }
} }
} }

View File

@@ -24,6 +24,7 @@ namespace PARR.DAL.Context
#endregion #endregion
public DbSet<Host> Hosts { get; set; } public DbSet<Host> Hosts { get; set; }
public DbSet<EkStatus> EkStatuses { get; set; }
public DbSet<Application> Applications { get; set; } public DbSet<Application> Applications { get; set; }
public DbSet<ApplicationType> ApplicationTypes { get; set; } public DbSet<ApplicationType> ApplicationTypes { get; set; }
public DbSet<ApplicationInHost> ApplicationsInHosts { get; set; } public DbSet<ApplicationInHost> ApplicationsInHosts { get; set; }
@@ -42,6 +43,7 @@ namespace PARR.DAL.Context
public DbSet<Models.Setting> Setting { get; set; } public DbSet<Models.Setting> Setting { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
@@ -121,6 +123,20 @@ namespace PARR.DAL.Context
); );
}); });
modelBuilder.Entity<EkStatus>(f =>
{
f.HasData(
new { Code = (int)EkStatusEnum.New, Name = "1-Новый" },
new { Code = (int)EkStatusEnum.Preapre, Name = "2-Подготовка к эксплуатации" },
new { Code = (int)EkStatusEnum.Exploitation, Name = "3-В эксплуатации" },
new { Code = (int)EkStatusEnum.Repair, Name = "4-В ремонте" },
new { Code = (int)EkStatusEnum.Reserve, Name = "5-В резерве" },
new { Code = (int)EkStatusEnum.OutOfService, Name = "6-Выведен из эксплуатации" },
new { Code = (int)EkStatusEnum.Test, Name = "7-Тестовый" },
new { Code = (int)EkStatusEnum.Development, Name = "9-В разработке" }
);
});
} }

View File

@@ -0,0 +1,53 @@
namespace PARR.DAL.Contracts
{
/// <summary>
/// Статусы ЭК
/// </summary>
public enum EkStatusEnum
{
/// <summary>
/// Все записи, используется только внутри проекта
/// </summary>
All = 0,
/// <summary>
/// 1-Новый
/// </summary>
New = 1,
/// <summary>
/// 2-Подготовка к эксплуатации
/// </summary>
Preapre = 2,
/// <summary>
/// 3-В эксплуатации
/// </summary>
Exploitation = 3,
/// <summary>
/// 4-В ремонте
/// </summary>
Repair = 4,
/// <summary>
/// 5-В резерве
/// </summary>
Reserve = 5,
/// <summary>
/// 6-Выведен из эксплуатации
/// </summary>
OutOfService = 6,
/// <summary>
/// 7-Тестовый
/// </summary>
Test = 7,
/// <summary>
/// 9-В разработке
/// </summary>
Development = 9
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class TblCreateEkStatus : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "EkStatusCode",
table: "Hosts",
type: "integer",
nullable: false,
defaultValue: 3);
migrationBuilder.CreateTable(
name: "EkStatuses",
columns: table => new
{
Code = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EkStatuses", x => x.Code);
});
migrationBuilder.InsertData(
table: "EkStatuses",
columns: new[] { "Code", "Name" },
values: new object[,]
{
{ 1, "1-Новый" },
{ 2, "2-Подготовка к эксплуатации" },
{ 3, "3-В эксплуатации" },
{ 4, "4-В ремонте" },
{ 5, "5-В резерве" },
{ 6, "6-Выведен из эксплуатации" },
{ 7, "7-Тестовый" },
{ 9, "9-В разработке" }
});
migrationBuilder.CreateIndex(
name: "IX_Hosts_EkStatusCode",
table: "Hosts",
column: "EkStatusCode");
migrationBuilder.AddForeignKey(
name: "FK_Hosts_EkStatuses_EkStatusCode",
table: "Hosts",
column: "EkStatusCode",
principalTable: "EkStatuses",
principalColumn: "Code",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Hosts_EkStatuses_EkStatusCode",
table: "Hosts");
migrationBuilder.DropTable(
name: "EkStatuses");
migrationBuilder.DropIndex(
name: "IX_Hosts_EkStatusCode",
table: "Hosts");
migrationBuilder.DropColumn(
name: "EkStatusCode",
table: "Hosts");
}
}
}

View File

@@ -518,6 +518,65 @@ namespace PARR.DAL.Migrations
b.ToTable("ApplicationsInWorks"); b.ToTable("ApplicationsInWorks");
}); });
modelBuilder.Entity("PARR.DAL.Models.EkStatus", b =>
{
b.Property<int>("Code")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Code"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Code");
b.ToTable("EkStatuses");
b.HasData(
new
{
Code = 1,
Name = "1-Новый"
},
new
{
Code = 2,
Name = "2-Подготовка к эксплуатации"
},
new
{
Code = 3,
Name = "3-В эксплуатации"
},
new
{
Code = 4,
Name = "4-В ремонте"
},
new
{
Code = 5,
Name = "5-В резерве"
},
new
{
Code = 6,
Name = "6-Выведен из эксплуатации"
},
new
{
Code = 7,
Name = "7-Тестовый"
},
new
{
Code = 9,
Name = "9-В разработке"
});
});
modelBuilder.Entity("PARR.DAL.Models.Host", b => modelBuilder.Entity("PARR.DAL.Models.Host", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@@ -534,6 +593,9 @@ namespace PARR.DAL.Migrations
.IsRequired() .IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<int>("EkStatusCode")
.HasColumnType("integer");
b.Property<string>("IP") b.Property<string>("IP")
.IsRequired() .IsRequired()
.HasColumnType("text"); .HasColumnType("text");
@@ -549,6 +611,8 @@ namespace PARR.DAL.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("EkStatusCode");
b.ToTable("Hosts"); b.ToTable("Hosts");
}); });
@@ -1193,6 +1257,17 @@ namespace PARR.DAL.Migrations
b.Navigation("Work"); b.Navigation("Work");
}); });
modelBuilder.Entity("PARR.DAL.Models.Host", b =>
{
b.HasOne("PARR.DAL.Models.EkStatus", "EkStatus")
.WithMany("Hosts")
.HasForeignKey("EkStatusCode")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("EkStatus");
});
modelBuilder.Entity("PARR.DAL.Models.Subprocess", b => modelBuilder.Entity("PARR.DAL.Models.Subprocess", b =>
{ {
b.HasOne("PARR.DAL.Models.Process", "Process") b.HasOne("PARR.DAL.Models.Process", "Process")
@@ -1369,6 +1444,11 @@ namespace PARR.DAL.Migrations
b.Navigation("Templates"); b.Navigation("Templates");
}); });
modelBuilder.Entity("PARR.DAL.Models.EkStatus", b =>
{
b.Navigation("Hosts");
});
modelBuilder.Entity("PARR.DAL.Models.Host", b => modelBuilder.Entity("PARR.DAL.Models.Host", b =>
{ {
b.Navigation("ApplicationsInHosts"); b.Navigation("ApplicationsInHosts");

View File

@@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace PARR.DAL.Models
{
[Table("EkStatuses")]
public class EkStatus
{
[Key]
public int Code { get; set; }
[Required]
public string Name { get; set; } = string.Empty;
public ICollection<Host> Hosts { get; set; } = new HashSet<Host>();
}
}

View File

@@ -16,11 +16,14 @@ namespace PARR.DAL.Models
public string Ek { get; set; } public string Ek { get; set; }
public int EkStatusCode { get; set; }
public required string IP { get; set; } public required string IP { get; set; }
//public string? RegionalEK { get; set; } //public string? RegionalEK { get; set; }
//public string? LinkEK { get; set; } //public string? LinkEK { get; set; }
//TODO: удалить поле Status, вместо него использовать EkStatusCode
public string? Status { get; set; } public string? Status { get; set; }
public string? WorkGroup { get; set; } public string? WorkGroup { get; set; }
@@ -31,5 +34,9 @@ namespace PARR.DAL.Models
public ICollection<ApplicationInHost> ApplicationsInHosts { get; set; } = new HashSet<ApplicationInHost>(); public ICollection<ApplicationInHost> ApplicationsInHosts { get; set; } = new HashSet<ApplicationInHost>();
public ICollection<Template> Templates { get; set; } = new HashSet<Template>(); public ICollection<Template> Templates { get; set; } = new HashSet<Template>();
[ForeignKey(nameof(EkStatusCode))]
public EkStatus? EkStatus { get; set; }
} }
} }

View File

@@ -44,9 +44,10 @@ namespace PARR.GeneratorTemplates
// logger.LogInformation($"Привет откуда надо!!! ${msg}"); // logger.LogInformation($"Привет откуда надо!!! ${msg}");
// //todo: идем дальеш! // //todo: идем дальеш!
//string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"create\",\"Ek\":\"вРТ-*RZD\"}";
string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"create\",\"Ek\":\"*ДВС\"}"; // string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"create\",\"Ek\":\"ВРТ*ДВС\",\"StatusEk\":0}";
//string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"deactivate\",\"Ek\":\"*\"}"; string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"deactivate\",\"Ek\":\"ВРТ*ДВС\",\"StatusEk\":0}";
await GenerateTemplates(msg); await GenerateTemplates(msg);
// // проверить как ту дела с асинком // // проверить как ту дела с асинком

View File

@@ -38,13 +38,12 @@ namespace PARR.GeneratorTemplates.Services
string ekPattern = SqlHelpers.RegexToLike(query.Ek); string ekPattern = SqlHelpers.RegexToLike(query.Ek);
// список хостов для создания шаблонов // список хостов для создания шаблонов
var hosts = await hostService.Get() var queryHosts = hostService.Get()
.Include(t => t.ApplicationsInHosts) .Include(t => t.ApplicationsInHosts)
.ThenInclude(t => t.Application).ThenInclude(t => t!.ApplicationsInWorks).ThenInclude(w => w.Work) .ThenInclude(t => t.Application).ThenInclude(t => t!.ApplicationsInWorks).ThenInclude(w => w.Work)
.Include(t => t.Templates) .Include(t => t.Templates)
.ThenInclude(w => w.ApplicationsInWork) .ThenInclude(w => w.ApplicationsInWork)
.Where(t => .Where(t =>
//TODO: add status ЭК
t.ApplicationsInHosts.Any(h => t.ApplicationsInHosts.Any(h =>
h.ApplicationId == query.ApplicationId h.ApplicationId == query.ApplicationId
&& h.Application!.ApplicationsInWorks.Any(w => w.WorkId == query.WorkId) && h.Application!.ApplicationsInWorks.Any(w => w.WorkId == query.WorkId)
@@ -52,7 +51,13 @@ namespace PARR.GeneratorTemplates.Services
&& EF.Functions.Like(t.Ek.ToLower(), ekPattern) && EF.Functions.Like(t.Ek.ToLower(), ekPattern)
// смотрим что нет такого шаблона // смотрим что нет такого шаблона
&& t.Templates.Any(templ => templ.ApplicationsInWork!.WorkId == query.WorkId && templ.ApplicationsInWork.ApplicationId == query.ApplicationId) == false && t.Templates.Any(templ => templ.ApplicationsInWork!.WorkId == query.WorkId && templ.ApplicationsInWork.ApplicationId == query.ApplicationId) == false
) );
// статус ЭК
if (query.StatusEk > 0)
queryHosts = queryHosts.Where(t => t.EkStatusCode == query.StatusEk);
var hosts = await queryHosts
.AsSplitQuery() .AsSplitQuery()
.ToListAsync(); .ToListAsync();
@@ -104,16 +109,22 @@ namespace PARR.GeneratorTemplates.Services
// делаем sql формат для like из запроса. // делаем sql формат для like из запроса.
string ekPattern = SqlHelpers.RegexToLike(query.Ek); string ekPattern = SqlHelpers.RegexToLike(query.Ek);
var existTemplates = await templateService.Get() var queryTemplates = templateService.Get()
.Include(t => t.Host) .Include(t => t.Host)
.Include(t => t.ApplicationsInWork) .Include(t => t.ApplicationsInWork)
.Where(t => .Where(t =>
t.IsActive == true t.IsActive == true
&& t.ApplicationsInWork!.ApplicationId == query.ApplicationId && t.ApplicationsInWork!.ApplicationId == query.ApplicationId
&& t.ApplicationsInWork!.WorkId == query.WorkId && t.ApplicationsInWork!.WorkId == query.WorkId
//TODO: add status ЭК
&& EF.Functions.Like(t.Host!.Ek.ToLower(), ekPattern) && EF.Functions.Like(t.Host!.Ek.ToLower(), ekPattern)
) );
// статус ЭК
if (query.StatusEk > 0)
queryTemplates = queryTemplates.Where(t => t.Host!.EkStatusCode == query.StatusEk);
var existTemplates = await queryTemplates
.AsSplitQuery()
.ToListAsync(); .ToListAsync();
if (!existTemplates.Any()) if (!existTemplates.Any())