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 GetAll = Base + "/templates/";
public const string Get = Base + "/templates/" + getParam; 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 SetOkStatus = Base + "/templates/" + getParam + "/status/ok";
//public const string GetByStatusCode = Base + "/templates/status/{statusCode}"; //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.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using PARR.API.Contracts.V1; using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests;
using PARR.API.Contracts.V1.Requests.Queries; using PARR.API.Contracts.V1.Requests.Queries;
using PARR.API.Contracts.V1.Responses; using PARR.API.Contracts.V1.Responses;
using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Contracts.V1.Responses.Base;
@@ -20,16 +21,19 @@ namespace PARR.API.Controllers.V1
private readonly IMapper mapper; private readonly IMapper mapper;
private readonly ITemplateService templateService; private readonly ITemplateService templateService;
private readonly SettingsFromDb settingsFromDb; private readonly SettingsFromDb settingsFromDb;
private readonly IRobotConfigurationService robotConfigurationService;
public TemplateController( public TemplateController(
IMapper mapper, IMapper mapper,
ITemplateService templateService, ITemplateService templateService,
SettingsFromDb settingsFromDb SettingsFromDb settingsFromDb,
IRobotConfigurationService robotConfigurationService
) )
{ {
this.mapper = mapper; this.mapper = mapper;
this.templateService = templateService; this.templateService = templateService;
this.settingsFromDb = settingsFromDb; this.settingsFromDb = settingsFromDb;
this.robotConfigurationService = robotConfigurationService;
} }
@@ -88,6 +92,56 @@ namespace PARR.API.Controllers.V1
return Ok(new Response<TemplateResponse>(response, true)); 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>
/// Получить один шаблон по заданному статусу /// Получить один шаблон по заданному статусу
/// </summary> /// </summary>

View File

@@ -115,6 +115,7 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>()) .ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>())
.ForMember(d => d.GenerationTime, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.ScheduleGenerationTime)) .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.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 => .ForMember(d => d.ScheduleType, o => o.MapFrom(s =>
s.Template!.ApplicationsInWork!.EsppSchValues!.First()!.EsppSchTypeConfig!.EsppSchTypeSchedule!.Description)) s.Template!.ApplicationsInWork!.EsppSchValues!.First()!.EsppSchTypeConfig!.EsppSchTypeSchedule!.Description))
.ForMember(d => d.ScheduleTypeCode, o => o.MapFrom(s => .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); 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 namespace PARR.DAL.Contracts
{ {
/// <summary>
/// Статус задания на синхронизацию
/// </summary>
public enum TaskStatusEnum public enum TaskStatusEnum
{ {
Creating = 10, Creating = 10,

View File

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

View File

@@ -28,13 +28,28 @@ namespace PARR.DAL.Models
public required string Solution { get; set; } 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>
/// Расписание: Время создания наряда (чч:мм:сс) /// Расписание: Время создания наряда и выполнения скрипта (чч:мм:сс)
/// </summary> /// </summary>
public TimeSpan ScheduleGenerationTime { get; set; } public TimeSpan ScheduleGenerationTime { get; set; }
/// <summary> /// <summary>
/// Расписание: Следующее срабатывание /// Расписание: Первое срабатывание
/// </summary> /// </summary>
public DateOnly ScheduleStartDate { get; set; } public DateOnly ScheduleStartDate { get; set; }

View File

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

View File

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