From 92ab9ea6c284d257fd155448899a72a50350dcd4 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Thu, 19 Mar 2026 16:52:41 +1000 Subject: [PATCH] =?UTF-8?q?feat(dal):=20Task=20-=20=D0=B4=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 5 ++ .../V1/Statistics/StatWorkloadController.cs | 34 +++++++++++++ PARR.API/Controllers/V1/TestController.cs | 50 ++++++++++--------- PARR.DAL/Context/DataContext.cs | 20 ++++---- ...askStatusEnum.cs => TaskItemStatusEnum.cs} | 10 ++-- .../Models/{Task => TaskModels}/TaskError.cs | 4 +- .../{Task/Task.cs => TaskModels/TaskItem.cs} | 12 +++-- .../Models/{Task => TaskModels}/TaskStatus.cs | 6 +-- .../Models/{Task => TaskModels}/TaskType.cs | 19 ++++++- PARR.DAL/ParrDalInstaller.cs | 4 +- .../TaskErrorService.cs | 6 +-- .../{Task => TaskServices}/TaskService.cs | 9 ++-- .../Services/Interfaces/Task/ITaskService.cs | 8 --- .../ITaskErrorService.cs | 4 +- .../Interfaces/TaskServices/ITaskService.cs | 9 ++++ 15 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs rename PARR.DAL/Contracts/{TaskTaskStatusEnum.cs => TaskItemStatusEnum.cs} (83%) rename PARR.DAL/Models/{Task => TaskModels}/TaskError.cs (90%) rename PARR.DAL/Models/{Task/Task.cs => TaskModels/TaskItem.cs} (76%) rename PARR.DAL/Models/{Task => TaskModels}/TaskStatus.cs (73%) rename PARR.DAL/Models/{Task => TaskModels}/TaskType.cs (50%) rename PARR.DAL/Services/Implementations/{Task => TaskServices}/TaskErrorService.cs (81%) rename PARR.DAL/Services/Implementations/{Task => TaskServices}/TaskService.cs (64%) delete mode 100644 PARR.DAL/Services/Interfaces/Task/ITaskService.cs rename PARR.DAL/Services/Interfaces/{Task => TaskServices}/ITaskErrorService.cs (58%) create mode 100644 PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index f2ced40a..594ad678 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -296,6 +296,11 @@ public const string GetByApplicationInWork = BaseStat + "/work-workloads/"; } + public static class Workload + { + public const string Build = BaseStat + "/workload/build"; + } + #endregion #region Наряды diff --git a/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs b/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs new file mode 100644 index 00000000..78a0ca3f --- /dev/null +++ b/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PARR.API.Contracts.V1; +using PARR.API.Controllers.V1.Base; +using PARR.Constants; + +namespace PARR.API.Controllers.V1.Statistics +{ + /// + /// Статистика загруженности по ЗО, РГ + /// + [Authorize(Roles = ParrRoles.EsppRobot.RoleOrAdmin)] + public class StatWorkloadController : BaseApiController + { + public StatWorkloadController() + { + + } + + + /// + /// Сформировать отчетность + /// + /// + [HttpPost(ApiRoutes.Workload.Build)] + public async Task Build() + { + + return Ok(); + } + + + } +} diff --git a/PARR.API/Controllers/V1/TestController.cs b/PARR.API/Controllers/V1/TestController.cs index e76fa8c6..ccc11361 100644 --- a/PARR.API/Controllers/V1/TestController.cs +++ b/PARR.API/Controllers/V1/TestController.cs @@ -65,39 +65,41 @@ namespace PARR.API.Controllers.V1 - ///// - ///// Записать в кэш - ///// - ///// - ///// - //[HttpPost(ApiRoutes.Test.CreateCache)] - //public async Task CreateCache() - //{ - // var hashKey = redisCacheService.GetKey(new[] { "test", "mxa" }); - // var ttl = TimeSpan.FromMinutes(10); + /// + /// Записать в кэш + /// + /// + /// + [HttpPost(ApiRoutes.Test.CreateCache)] + public async Task CreateCache() + { + //var val = await redisCacheService.GetCachedDataAsync("96dAoIH/8Q9Bg8VY"); - // await redisCacheService.SetHashFieldAsync(hashKey, "t1", "val1", ttl); - // await redisCacheService.SetHashFieldAsync(hashKey, "t2", "val2"); - // await redisCacheService.SetHashFieldAsync(hashKey, "t3", "val3"); + //var hashKey = redisCacheService.GetKey(new[] { "test", "mxa" }); + //var ttl = TimeSpan.FromMinutes(10); - // var length = await redisCacheService.GetHashLengthAsync(hashKey); + //await redisCacheService.SetHashFieldAsync(hashKey, "t1", "val1", ttl); + //await redisCacheService.SetHashFieldAsync(hashKey, "t2", "val2"); + //await redisCacheService.SetHashFieldAsync(hashKey, "t3", "val3"); - // var get = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + //var length = await redisCacheService.GetHashLengthAsync(hashKey); - // var getAll = await redisCacheService.GetAllHashFieldsAsync(hashKey); + //var get = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); - // await redisCacheService.DeleteHashFieldAsync(hashKey, "t1"); - // var getT1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + //var getAll = await redisCacheService.GetAllHashFieldsAsync(hashKey); - // var exist = await redisCacheService.HashFieldExistsAsync(hashKey, "t2"); + //await redisCacheService.DeleteHashFieldAsync(hashKey, "t1"); + //var getT1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); - // await redisCacheService.DeleteHashAsync(hashKey); - // var getT_1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + //var exist = await redisCacheService.HashFieldExistsAsync(hashKey, "t2"); - // await redisCacheService.SetHashTtlAsync(hashKey, ttl); + //await redisCacheService.DeleteHashAsync(hashKey); + //var getT_1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); - // return Ok(); - //} + //await redisCacheService.SetHashTtlAsync(hashKey, ttl); + + return Ok(); + } diff --git a/PARR.DAL/Context/DataContext.cs b/PARR.DAL/Context/DataContext.cs index 1a64080d..71511e92 100644 --- a/PARR.DAL/Context/DataContext.cs +++ b/PARR.DAL/Context/DataContext.cs @@ -6,7 +6,7 @@ using PARR.DAL.Extensions; using PARR.DAL.Models; using PARR.DAL.Models.Job; using PARR.DAL.Models.Schedule; -using PARR.DAL.Models.Task; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Models.Unit; namespace PARR.DAL.Context @@ -120,8 +120,8 @@ namespace PARR.DAL.Context #region Tasks - public DbSet Tasks { get; set; } - public DbSet TaskStatus { get; set; } + public DbSet Tasks { get; set; } + public DbSet TaskStatus { get; set; } public DbSet TaskTypes { get; set; } public DbSet TaskErrors { get; set; } @@ -572,7 +572,7 @@ namespace PARR.DAL.Context { f.HasData(new TaskType[] { - new() { Code = TaskTypeEnum.Workload, Name = TaskTypeEnum.Workload.ToString(), Description = "Формирование данных для отчетности - Загруженность", MaxRetries = 2 } + new() { Code = TaskTypeEnum.Workload, Name = TaskTypeEnum.Workload.ToString(), Description = "Формирование данных для отчетности - Загруженность", MaxRetries = 2, IsSingleton=true, MaxExecutionTimeMinutes=30, RetantionsDays=90 } } ); }); @@ -581,14 +581,14 @@ namespace PARR.DAL.Context #region TaskStatus - modelBuilder.Entity(f => + modelBuilder.Entity(f => { - f.HasData(new PARR.DAL.Models.Task.TaskStatus[] + f.HasData(new PARR.DAL.Models.TaskModels.TaskStatus[] { - new(){Code=TaskTaskStatusEnum.Wait, Name=TaskTaskStatusEnum.Wait.ToString(), Description="Ожидание"}, - new(){Code=TaskTaskStatusEnum.Processing, Name=TaskTaskStatusEnum.Processing.ToString(), Description="В работе"}, - new(){Code=TaskTaskStatusEnum.Success, Name=TaskTaskStatusEnum.Success.ToString(), Description="Выполнено успешно"}, - new(){Code=TaskTaskStatusEnum.Error, Name=TaskTaskStatusEnum.Error.ToString(), Description="Ошибка"} + new(){Code=TaskItemStatusEnum.Pending, Name=TaskItemStatusEnum.Pending.ToString(), Description="Ожидание"}, + new(){Code=TaskItemStatusEnum.Processing, Name=TaskItemStatusEnum.Processing.ToString(), Description="В работе"}, + new(){Code=TaskItemStatusEnum.Success, Name=TaskItemStatusEnum.Success.ToString(), Description="Выполнено успешно"}, + new(){Code=TaskItemStatusEnum.Failed, Name=TaskItemStatusEnum.Failed.ToString(), Description="Ошибка"} }); }); diff --git a/PARR.DAL/Contracts/TaskTaskStatusEnum.cs b/PARR.DAL/Contracts/TaskItemStatusEnum.cs similarity index 83% rename from PARR.DAL/Contracts/TaskTaskStatusEnum.cs rename to PARR.DAL/Contracts/TaskItemStatusEnum.cs index 7377435a..299273d3 100644 --- a/PARR.DAL/Contracts/TaskTaskStatusEnum.cs +++ b/PARR.DAL/Contracts/TaskItemStatusEnum.cs @@ -5,26 +5,26 @@ /// /// Статус задач Task /// - public enum TaskTaskStatusEnum + public enum TaskItemStatusEnum { /// /// Ожидание /// - Wait=10, + Pending=0, /// /// В работе /// - Processing = 20, + Processing = 1, /// /// Выполнено успешно /// - Success = 30, + Success = 2, /// /// Ошибка /// - Error = 40 + Failed = 3 } } diff --git a/PARR.DAL/Models/Task/TaskError.cs b/PARR.DAL/Models/TaskModels/TaskError.cs similarity index 90% rename from PARR.DAL/Models/Task/TaskError.cs rename to PARR.DAL/Models/TaskModels/TaskError.cs index 51709574..59b16d75 100644 --- a/PARR.DAL/Models/Task/TaskError.cs +++ b/PARR.DAL/Models/TaskModels/TaskError.cs @@ -4,7 +4,7 @@ using PARR.DAL.Models.Base; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Errors", Schema = DataContextSettings.Task)] [Comment("Таблица ошибок заданий")] @@ -27,6 +27,6 @@ namespace PARR.DAL.Models.Task public string? StackTrace { get; set; } [ForeignKey(nameof(TaskId))] - public Task? Task { get; set; } + public TaskItem? TaskItem { get; set; } } } diff --git a/PARR.DAL/Models/Task/Task.cs b/PARR.DAL/Models/TaskModels/TaskItem.cs similarity index 76% rename from PARR.DAL/Models/Task/Task.cs rename to PARR.DAL/Models/TaskModels/TaskItem.cs index 9ca5a78c..33a515d7 100644 --- a/PARR.DAL/Models/Task/Task.cs +++ b/PARR.DAL/Models/TaskModels/TaskItem.cs @@ -1,15 +1,17 @@ using Microsoft.EntityFrameworkCore; +using PARR.Common.Domain; +using PARR.Constants; using PARR.DAL.Context; using PARR.DAL.Contracts; using PARR.DAL.Models.Base; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Tasks", Schema = DataContextSettings.Task)] [Comment("Таблица заданий")] - public class Task : IBase + public class TaskItem : IBase, IHistoryInitiator { [Key] public Guid Id { get; set; } @@ -20,7 +22,7 @@ namespace PARR.DAL.Models.Task public TaskTypeEnum TypeCode { get; set; } - public TaskTaskStatusEnum StatusCode { get; set; } + public TaskItemStatusEnum StatusCode { get; set; } public string? Payload { get; set; } @@ -35,6 +37,10 @@ namespace PARR.DAL.Models.Task public DateTimeOffset? ProcessedAt { get; set; } + public string? InitiatorIp { get; set; } + public ParrComponentsEnum? InitiatorParrComponentId { get; set; } + public string? InitiatorComment { get; set; } + [ForeignKey(nameof(TypeCode))] public TaskType? TaskType { get; set; } diff --git a/PARR.DAL/Models/Task/TaskStatus.cs b/PARR.DAL/Models/TaskModels/TaskStatus.cs similarity index 73% rename from PARR.DAL/Models/Task/TaskStatus.cs rename to PARR.DAL/Models/TaskModels/TaskStatus.cs index 4879bf7b..6bd1d6a0 100644 --- a/PARR.DAL/Models/Task/TaskStatus.cs +++ b/PARR.DAL/Models/TaskModels/TaskStatus.cs @@ -4,20 +4,20 @@ using PARR.DAL.Contracts; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Statuses", Schema = DataContextSettings.Task)] [Comment("Таблица статусов заданий")] public class TaskStatus { [Key] - public TaskTaskStatusEnum Code { get; set; } + public TaskItemStatusEnum Code { get; set; } public required string Name { get; set; } public required string Description { get; set; } - public ICollection Tasks { get; set; } = new HashSet(); + public ICollection Tasks { get; set; } = new HashSet(); } } diff --git a/PARR.DAL/Models/Task/TaskType.cs b/PARR.DAL/Models/TaskModels/TaskType.cs similarity index 50% rename from PARR.DAL/Models/Task/TaskType.cs rename to PARR.DAL/Models/TaskModels/TaskType.cs index fc61b5a6..7a520de8 100644 --- a/PARR.DAL/Models/Task/TaskType.cs +++ b/PARR.DAL/Models/TaskModels/TaskType.cs @@ -4,7 +4,7 @@ using PARR.DAL.Contracts; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Types", Schema = DataContextSettings.Task)] [Comment("Таблица типов заданий")] @@ -22,7 +22,22 @@ namespace PARR.DAL.Models.Task /// public int MaxRetries { get; set; } + /// + /// Максимальное время выполнения + /// + public int MaxExecutionTimeMinutes { get; set; } - public ICollection Tasks { get; set; } = new HashSet(); + /// + /// Одновременно может быть только одна задача или несколько + /// + public bool IsSingleton { get; set; } + + /// + /// Сколько дней хранить в БД + /// + public int RetentionDays { get; set; } + + + public ICollection Tasks { get; set; } = new HashSet(); } } diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs index 758a30e4..10b69f40 100644 --- a/PARR.DAL/ParrDalInstaller.cs +++ b/PARR.DAL/ParrDalInstaller.cs @@ -18,12 +18,12 @@ using PARR.DAL.Services.Implementation; using PARR.DAL.Services.Implementations; using PARR.DAL.Services.Implementations.Job; using PARR.DAL.Services.Implementations.Schedule; -using PARR.DAL.Services.Implementations.Task; +using PARR.DAL.Services.Implementations.TaskServices; using PARR.DAL.Services.Implementations.Unit; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.DAL.Services.Interfaces.Schedule; -using PARR.DAL.Services.Interfaces.Task; +using PARR.DAL.Services.Interfaces.TaskServices; using PARR.DAL.Services.Interfaces.Unit; using PARR.DAL.Settings; using StackExchange.Redis; diff --git a/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs b/PARR.DAL/Services/Implementations/TaskServices/TaskErrorService.cs similarity index 81% rename from PARR.DAL/Services/Implementations/Task/TaskErrorService.cs rename to PARR.DAL/Services/Implementations/TaskServices/TaskErrorService.cs index 5fe91e66..a29a02a1 100644 --- a/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs +++ b/PARR.DAL/Services/Implementations/TaskServices/TaskErrorService.cs @@ -1,11 +1,11 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; -using PARR.DAL.Models.Task; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Services.Abstracts; -using PARR.DAL.Services.Interfaces.Task; +using PARR.DAL.Services.Interfaces.TaskServices; -namespace PARR.DAL.Services.Implementations.Task +namespace PARR.DAL.Services.Implementations.TaskServices { internal class TaskErrorService : BaseService, ITaskErrorService { diff --git a/PARR.DAL/Services/Implementations/Task/TaskService.cs b/PARR.DAL/Services/Implementations/TaskServices/TaskService.cs similarity index 64% rename from PARR.DAL/Services/Implementations/Task/TaskService.cs rename to PARR.DAL/Services/Implementations/TaskServices/TaskService.cs index adf0ef2d..98f67f71 100644 --- a/PARR.DAL/Services/Implementations/Task/TaskService.cs +++ b/PARR.DAL/Services/Implementations/TaskServices/TaskService.cs @@ -1,16 +1,17 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Services.Abstracts; -using PARR.DAL.Services.Interfaces.Task; +using PARR.DAL.Services.Interfaces.TaskServices; -namespace PARR.DAL.Services.Implementations.Task +namespace PARR.DAL.Services.Implementations.TaskServices { - internal class TaskService : BaseService, ITaskService + internal class TaskService : BaseService, ITaskService { private readonly DataContext dataContext; - protected override DbSet EntitySet => dataContext.Tasks; + protected override DbSet EntitySet => dataContext.Tasks; protected override DataContext EntitiContext => dataContext; diff --git a/PARR.DAL/Services/Interfaces/Task/ITaskService.cs b/PARR.DAL/Services/Interfaces/Task/ITaskService.cs deleted file mode 100644 index dc2878ed..00000000 --- a/PARR.DAL/Services/Interfaces/Task/ITaskService.cs +++ /dev/null @@ -1,8 +0,0 @@ -using PARR.DAL.Services.Interfaces.Base; - -namespace PARR.DAL.Services.Interfaces.Task -{ - public interface ITaskService : IBaseService - { - } -} diff --git a/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs b/PARR.DAL/Services/Interfaces/TaskServices/ITaskErrorService.cs similarity index 58% rename from PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs rename to PARR.DAL/Services/Interfaces/TaskServices/ITaskErrorService.cs index 46345ad4..4ded533c 100644 --- a/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs +++ b/PARR.DAL/Services/Interfaces/TaskServices/ITaskErrorService.cs @@ -1,7 +1,7 @@ -using PARR.DAL.Models.Task; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Services.Interfaces.Base; -namespace PARR.DAL.Services.Interfaces.Task +namespace PARR.DAL.Services.Interfaces.TaskServices { public interface ITaskErrorService : IBaseService { diff --git a/PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs b/PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs new file mode 100644 index 00000000..aa22eb81 --- /dev/null +++ b/PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs @@ -0,0 +1,9 @@ +using PARR.DAL.Models.TaskModels; +using PARR.DAL.Services.Interfaces.Base; + +namespace PARR.DAL.Services.Interfaces.TaskServices +{ + public interface ITaskService : IBaseService + { + } +}