feat(api): applicationInWorks - статистика синхронизации шаблонов/расписаний

This commit is contained in:
Mikhail Trubnikov
2024-07-29 16:51:18 +10:00
parent c8a524b28f
commit 58adcace60
3 changed files with 107 additions and 3 deletions

View File

@@ -1,4 +1,6 @@
namespace PARR.API.Contracts.V1.Responses
using System.Runtime.InteropServices;
namespace PARR.API.Contracts.V1.Responses
{
public class ApplicationInWorkResponse
{
@@ -34,6 +36,16 @@
public int TemplatesCount { get; set; }
#region Статистика
public TemplateStats? TemplateStatistics { get; set; }
public ScheduleStats? ScheduleStatistics { get; set; }
#endregion
public ApplicationInWorkScheduleResponse? Schedule { get; set; }
public List<WorkGroupResponse>? WorkGroups { get; set; }
@@ -49,4 +61,42 @@
public List<EsppScheduleValResponse>? Values { get; set; }
}
public class TemplateStats
{
/// <summary>
/// Активированных шаблонов
/// </summary>
public int Activated { get; set; }
/// <summary>
/// Синхронизировано шаблонов (TaskStatus = 30/Ok)
/// </summary>
public int Synchronized { get; set; }
/// <summary>
/// Ошибок синхронизации (RobotStatus = 33/Error)
/// </summary>
public int Errors { get; set; }
}
public class ScheduleStats
{
/// <summary>
/// Активированных шаблонов
/// </summary>
public int Activated { get; set; }
/// <summary>
/// Синхронизировано шаблонов (TaskStatus = 30/Ok)
/// </summary>
public int Synchronized { get; set; }
/// <summary>
/// Ошибок синхронизации (RobotStatus = 33/Error)
/// </summary>
public int Errors { get; set; }
}
}

View File

@@ -15,10 +15,12 @@ using PARR.API.Settings;
using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainModels;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
using System.Text.Json;
using static PARR.API.Contracts.V1.ApiRoutes;
namespace PARR.API.Controllers.V1
{
@@ -92,10 +94,13 @@ namespace PARR.API.Controllers.V1
if (filter.IsLight != true)
{
//Если запрос не легкий, закгружаем кол-во шаблонов отдельно, это значительно ускоряет запрос
//Если запрос не легкий, загружаем кол-во шаблонов отдельно, это значительно ускоряет запрос
foreach (var item in response)
{
item.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == item.Id);
var statistics = await GetStatisticsAsync(item.Id);
BindStatistics(item, statistics);
}
}
@@ -126,6 +131,9 @@ namespace PARR.API.Controllers.V1
var response = mapper.Map<ApplicationInWorkResponse>(applicationInWork);
response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
var statistics = await GetStatisticsAsync(response.Id);
BindStatistics(response, statistics);
return Ok(new Response<ApplicationInWorkResponse>(response, true));
}
@@ -317,6 +325,9 @@ namespace PARR.API.Controllers.V1
var response = mapper.Map<ApplicationInWorkResponse>(updatedApplicationInWork);
response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
var statistics = await GetStatisticsAsync(response.Id);
BindStatistics(response, statistics);
return Ok(new Response<ApplicationInWorkResponse>(response, true));
}
@@ -392,5 +403,48 @@ namespace PARR.API.Controllers.V1
return isScheduleChanged;
}
/// <summary>
/// Загрузка статистики
/// </summary>
/// <param name="applicationInWorkId"></param>
/// <returns></returns>
private async Task<AppInWorkStatModel> GetStatisticsAsync(Guid applicationInWorkId)
{
var statResult = await applicationsInWorkService.Get()
.Include(t => t.Templates).ThenInclude(t => t.RobotConfigurations)
.Where(x => x.Id == applicationInWorkId)
.Select(t => new
{
TemplateActivated = t.Templates.Count(x => x.IsActiveTemplate),
TemplateSynchronized = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok && c.RobotCode == (int)RobotsEnum.TemplateOrder)),
TemplateErrors = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.RobotStatusCode == (int)RobotStatusEnum.Error && c.RobotCode == (int)RobotsEnum.TemplateOrder)),
ScheduleActivated = t.Templates.Count(x => x.IsActiveSchedule),
ScheduleSynchronized = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok && c.RobotCode == (int)RobotsEnum.ScheduleOrder)),
ScheduleErrors = t.Templates.Count(x => x.RobotConfigurations.Any(c => c.RobotStatusCode == (int)RobotStatusEnum.Error && c.RobotCode == (int)RobotsEnum.ScheduleOrder))
}).FirstOrDefaultAsync();
return new AppInWorkStatModel
{
ScheduleStatistics = new ScheduleStats { Activated = statResult?.ScheduleActivated ?? 0, Errors = statResult?.ScheduleErrors ?? 0, Synchronized = statResult?.ScheduleSynchronized ?? 0 },
TemplateStatistics = new TemplateStats { Activated = statResult?.TemplateActivated ?? 0, Errors = statResult?.TemplateErrors ?? 0, Synchronized = statResult?.TemplateSynchronized ?? 0 }
};
}
private void BindStatistics(ApplicationInWorkResponse applicationsInWork, AppInWorkStatModel statistics)
{
applicationsInWork.TemplateStatistics = new TemplateStats { Activated = statistics.TemplateStatistics.Activated, Errors = statistics.TemplateStatistics.Errors, Synchronized = statistics.TemplateStatistics.Synchronized };
applicationsInWork.ScheduleStatistics = new ScheduleStats { Activated = statistics.ScheduleStatistics.Activated, Errors = statistics.ScheduleStatistics.Errors, Synchronized = statistics.ScheduleStatistics.Synchronized };
}
}
public class AppInWorkStatModel
{
public TemplateStats TemplateStatistics { get; set; }
public ScheduleStats ScheduleStatistics { get; set; }
}
}

View File

@@ -107,7 +107,7 @@ internal class TemplateActivator : ITemplateActivator
/// <summary>
/// Обновить состояние расписаний по запросу query на newState, без записи в БД. Возвращает количество расписаний требующих фиксацию в БД
/// Обновить состояние шаблонов по запросу query на newState, без записи в БД. Возвращает количество расписаний требующих фиксацию в БД
/// </summary>
/// <param name="query"></param>
/// <param name="newState"></param>