feat(api): Изменение состояния у шаблона/расписания (акивировано/деактивировано)

This commit is contained in:
Mikhail Trubnikov
2023-10-13 14:21:49 +10:00
parent b177c0cc27
commit f69be40ad3
10 changed files with 148 additions and 40 deletions

View File

@@ -56,6 +56,7 @@
{
public const string GetAll = Base + "/templates/";
public const string Get = Base + "/templates/" + getParam;
public const string ChangeState = Base + "/templates/" + getParam + "/change-state";
//public const string SetOkStatus = Base + "/templates/" + getParam + "/status/ok";
//public const string GetByStatusCode = Base + "/templates/status/{statusCode}";

View File

@@ -0,0 +1,15 @@
namespace PARR.API.Contracts.V1.Requests
{
public class TemplateChangeStateRequest
{
/// <summary>
/// Активировать шаблон
/// </summary>
public bool IsActiveTemplate { get; set; }
/// <summary>
/// Активировать расписание
/// </summary>
public bool IsActiveSchedule { get; set; }
}
}

View File

@@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests;
using PARR.API.Contracts.V1.Requests.Queries;
using PARR.API.Contracts.V1.Responses;
using PARR.API.Contracts.V1.Responses.Base;
@@ -20,16 +21,19 @@ namespace PARR.API.Controllers.V1
private readonly IMapper mapper;
private readonly ITemplateService templateService;
private readonly SettingsFromDb settingsFromDb;
private readonly IRobotConfigurationService robotConfigurationService;
public TemplateController(
IMapper mapper,
ITemplateService templateService,
SettingsFromDb settingsFromDb
SettingsFromDb settingsFromDb,
IRobotConfigurationService robotConfigurationService
)
{
this.mapper = mapper;
this.templateService = templateService;
this.settingsFromDb = settingsFromDb;
this.robotConfigurationService = robotConfigurationService;
}
@@ -44,7 +48,7 @@ namespace PARR.API.Controllers.V1
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
IQueryable<Template> query = templateService.GetWithIncludes()
.Include(t => t.RobotConfigurations).ThenInclude(t=>t.Robot)
.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)
@@ -88,6 +92,56 @@ namespace PARR.API.Controllers.V1
return Ok(new Response<TemplateResponse>(response, true));
}
/// <summary>
/// Изменить статус у шаблона по ИД (активировать/деактивировать)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPut(ApiRoutes.Template.ChangeState)]
public async Task<IActionResult> ChangeState([FromRoute] Guid id, [FromBody] TemplateChangeStateRequest request)
{
var template = await 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)
.AsSplitQuery()
.FirstOrDefaultAsync(t => t.Id == id);
if (template == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Не найден шаблона с id: {id}" } }));
if (template.IsActiveTemplate != request.IsActiveTemplate)
{
template.IsActiveTemplate = request.IsActiveTemplate;
//необходимо обновить шаблон
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, ref template);
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, ref config);
}
if (template.IsActiveSchedule != request.IsActiveSchedule)
{
template.IsActiveSchedule = request.IsActiveSchedule;
//необходимо обновить расписание
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, ref template);
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, ref config);
}
if (!await templateService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении шаблона." } }));
var templateToResponse = await 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)
.AsSplitQuery()
.FirstOrDefaultAsync(t => t.Id == id);
var response = mapper.Map<TemplateResponse>(templateToResponse);
return Ok(new Response<TemplateResponse>(response, true));
}
/// <summary>
/// Получить один шаблон по заданному статусу
/// </summary>

View File

@@ -115,6 +115,7 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>())
.ForMember(d => d.GenerationTime, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.ScheduleGenerationTime))
.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetFirstStart(s.Template!.ApplicationsInWork!.ScheduleStartDate, s.Template!.ApplicationsInWork!.ScheduleGenerationTime)))
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextScheduleStart(s.Template!.NextScheduleStart)))
.ForMember(d => d.ScheduleType, o => o.MapFrom(s =>
s.Template!.ApplicationsInWork!.EsppSchValues!.First()!.EsppSchTypeConfig!.EsppSchTypeSchedule!.Description))
.ForMember(d => d.ScheduleTypeCode, o => o.MapFrom(s =>

View File

@@ -16,5 +16,15 @@ namespace PARR.BLL.Helpers
return date.ToString("dd/MM/yy HH:mm:ss", CultureInfo.InvariantCulture);
}
///// <summary>
///// Получить дату следующего старта в формате для ЕСПП
///// </summary>
///// <param name="date"></param>
///// <returns></returns>
//public static string GetNextScheduleStart(DateTimeOffset date)
//{
// return date.ToString("dd/MM/yy HH:mm:ss", CultureInfo.InvariantCulture);
//}
}
}

View File

@@ -1,5 +1,8 @@
namespace PARR.DAL.Contracts
{
/// <summary>
/// Статус задания на синхронизацию
/// </summary>
public enum TaskStatusEnum
{
Creating = 10,

View File

@@ -392,7 +392,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ApplicationTypeId");
b.ToTable("Applications");
b.ToTable("Applications", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.ApplicationInHost", b =>
@@ -419,7 +419,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("HostId");
b.ToTable("ApplicationsInHost");
b.ToTable("ApplicationsInHost", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.ApplicationType", b =>
@@ -443,7 +443,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("ApplicationTypes");
b.ToTable("ApplicationTypes", (string)null);
b.HasData(
new
@@ -516,7 +516,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("WorkId", "ApplicationId")
.IsUnique();
b.ToTable("ApplicationsInWorks");
b.ToTable("ApplicationsInWorks", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.EkStatus", b =>
@@ -533,7 +533,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code");
b.ToTable("EkStatuses");
b.ToTable("EkStatuses", (string)null);
b.HasData(
new
@@ -596,7 +596,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("EsppSchTypes");
b.ToTable("EsppSchTypes", (string)null);
b.HasData(
new
@@ -665,7 +665,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TypeScheduleId", "TypeId")
.IsUnique();
b.ToTable("EsppSchTypeConfigs");
b.ToTable("EsppSchTypeConfigs", (string)null);
b.HasData(
new
@@ -768,7 +768,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("EsppSchTypeSchedules");
b.ToTable("EsppSchTypeSchedules", (string)null);
b.HasData(
new
@@ -829,7 +829,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TypeId");
b.ToTable("EsppSchTypeValues");
b.ToTable("EsppSchTypeValues", (string)null);
b.HasData(
new
@@ -1432,7 +1432,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TypeValueId");
b.ToTable("EsppSchValues");
b.ToTable("EsppSchValues", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.Host", b =>
@@ -1470,7 +1470,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ResponseAreaCode");
b.ToTable("Hosts");
b.ToTable("Hosts", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.Process", b =>
@@ -1494,7 +1494,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("Processes");
b.ToTable("Processes", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.ResponseArea", b =>
@@ -1511,7 +1511,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code");
b.ToTable("ResponseAreas");
b.ToTable("ResponseAreas", (string)null);
b.HasData(
new
@@ -1622,7 +1622,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Name")
.IsUnique();
b.ToTable("Robots");
b.ToTable("Robots", (string)null);
b.HasData(
new
@@ -1677,7 +1677,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TemplateId", "RobotCode")
.IsUnique();
b.ToTable("RobotConfigurations");
b.ToTable("RobotConfigurations", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.RobotHistory", b =>
@@ -1712,7 +1712,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TaskStatusCode");
b.ToTable("RobotHistories");
b.ToTable("RobotHistories", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.RobotHistoryLevel", b =>
@@ -1733,7 +1733,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Level");
b.ToTable("RobotHistoryLevels");
b.ToTable("RobotHistoryLevels", (string)null);
b.HasData(
new
@@ -1780,7 +1780,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code");
b.ToTable("RobotStatuses");
b.ToTable("RobotStatuses", (string)null);
b.HasData(
new
@@ -1824,7 +1824,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Name");
b.ToTable("Settings");
b.ToTable("Settings", (string)null);
b.HasData(
new
@@ -1909,7 +1909,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ProcessId");
b.ToTable("Subprocesses");
b.ToTable("Subprocesses", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.TaskStatus", b =>
@@ -1930,7 +1930,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Code");
b.ToTable("TaskStatuses");
b.ToTable("TaskStatuses", (string)null);
b.HasData(
new
@@ -1993,7 +1993,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("Name")
.IsUnique();
b.ToTable("Templates");
b.ToTable("Templates", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.Tnk", b =>
@@ -2022,7 +2022,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("SubprocessId");
b.ToTable("Tnks");
b.ToTable("Tnks", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_Application", b =>
@@ -2048,7 +2048,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("ApplicationTypeId");
b.ToTable("V1_Applications");
b.ToTable("V1_Applications", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_ApplicationInHost", b =>
@@ -2080,7 +2080,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("V1_ApplicationId");
b.ToTable("V1_ApplicationsInHost");
b.ToTable("V1_ApplicationsInHost", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_ApplicationType", b =>
@@ -2109,7 +2109,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("V1_ApplicationTypeId");
b.ToTable("V1_ApplicationTypes");
b.ToTable("V1_ApplicationTypes", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_Host", b =>
@@ -2148,7 +2148,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("V1_Hosts");
b.ToTable("V1_Hosts", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_Job", b =>
@@ -2202,7 +2202,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("JobTypeId");
b.ToTable("V1_Jobs");
b.ToTable("V1_Jobs", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_JobCategory", b =>
@@ -2226,7 +2226,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("V1_JobCategorys");
b.ToTable("V1_JobCategorys", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_JobJournal", b =>
@@ -2270,7 +2270,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("JobStatusId");
b.ToTable("V1_JobJournals");
b.ToTable("V1_JobJournals", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.V1.V1_JobMode", b =>
@@ -2291,7 +2291,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("V1_JobModes");
b.ToTable("V1_JobModes", (string)null);
b.HasData(
new
@@ -2329,7 +2329,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("V1_JobStatuses");
b.ToTable("V1_JobStatuses", (string)null);
b.HasData(
new
@@ -2369,7 +2369,7 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.ToTable("V1_JobTypes");
b.ToTable("V1_JobTypes", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.Work", b =>
@@ -2398,7 +2398,7 @@ namespace PARR.DAL.Migrations
b.HasIndex("TnkId");
b.ToTable("Works");
b.ToTable("Works", (string)null);
});
modelBuilder.Entity("PARR.DAL.Models.Application", b =>

View File

@@ -28,13 +28,28 @@ namespace PARR.DAL.Models
public required string Solution { get; set; }
///// <summary>
///// Выполняется автоматически агентом на сервере, скриптами
///// </summary>
//public bool? IsAutomatic { get; set; }
///// <summary>
///// Скрипт для автоматического выполнения
///// </summary>
//public string AgentScript { get; set; } = string.Empty;
///// <summary>
///// Какое-то имя которое мы передаем агенту, пока непонятно что это такое.
///// </summary>
//public string AgentName { get; set; } = string.Empty;
/// <summary>
/// Расписание: Время создания наряда (чч:мм:сс)
/// Расписание: Время создания наряда и выполнения скрипта (чч:мм:сс)
/// </summary>
public TimeSpan ScheduleGenerationTime { get; set; }
/// <summary>
/// Расписание: Следующее срабатывание
/// Расписание: Первое срабатывание
/// </summary>
public DateOnly ScheduleStartDate { get; set; }

View File

@@ -27,6 +27,17 @@ namespace PARR.DAL.Models
/// </summary>
public string? ScheduleEsppId { get; set; }
///// <summary>
///// Следующая дата срабатываения генерации наряда
///// </summary>
//public DateTimeOffset NextScheduleStart { get; set; }
///// <summary>
///// Следующа дата выполнения скрипта агентом. Может быть нулл если шаблон не автоматический (не выполняется скриптом)
///// </summary>
//public DateTimeOffset? NextScriptStart { get; set; }
public Guid ApplicationInWorkId { get; set; }
[ForeignKey(nameof(ApplicationInWorkId))]

View File

@@ -6,8 +6,6 @@ using PARR.BLL.Services.Interfaces;
using PARR.DAL.Models;
using PARR.GeneratorTemplates.Services;
using PARR.GeneratorTemplates.Settings;
using System.Text;
using System.Text.Json;
namespace PARR.GeneratorTemplates
{