feat(core, api): Workload - Controller для формирования отчетов
This commit is contained in:
@@ -299,6 +299,10 @@
|
|||||||
public static class Workload
|
public static class Workload
|
||||||
{
|
{
|
||||||
public const string Build = BaseStat + "/workload/build";
|
public const string Build = BaseStat + "/workload/build";
|
||||||
|
|
||||||
|
public const string WorkGroup = BaseStat + "/workload/work-groups";
|
||||||
|
|
||||||
|
public const string ResponseArea = BaseStat + "/workload/response-areas";
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ namespace PARR.API.Contracts.V1.Requests.BaseRequests
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class TimeZoneOffsetClient
|
public class TimeZoneOffsetClient
|
||||||
{
|
{
|
||||||
/// <summary>
|
///// <summary>
|
||||||
/// Удалить TimeZoneOffsetHours и не использовать!!!!!! Использовать только в минутах TimeZoneOffsetMinutes
|
///// Удалить TimeZoneOffsetHours и не использовать!!!!!! Использовать только в минутах TimeZoneOffsetMinutes
|
||||||
/// </summary>
|
///// </summary>
|
||||||
public int TimeZoneOffsetHours { get; set; } = 0;
|
//public int TimeZoneOffsetHours { get; set; } = 0;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Часовая зона клиента, в минутах
|
/// Часовая зона клиента, в минутах
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
using PARR.API.Contracts.V1.Requests.BaseRequests;
|
namespace PARR.API.Contracts.V1.Requests.Queries
|
||||||
|
|
||||||
namespace PARR.API.Contracts.V1.Requests.Queries
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Базовый запрос по загрузке по ЗО, РГ...
|
/// Базовый запрос по загрузке по ЗО, РГ...
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WorkloadBaseQuery: TimeZoneOffsetClient
|
public class WorkloadBaseQuery
|
||||||
{
|
{
|
||||||
public bool? IsActiveTemplate { get; set; }
|
/// <summary>
|
||||||
|
/// Период отчетности (по умолчанию 7 дней)
|
||||||
public bool? IsActiveSchedule { get; set; }
|
/// </summary>
|
||||||
|
public int DurationDays { get; set; } = 7;
|
||||||
public bool? IsMonth { get; set; }
|
|
||||||
|
|
||||||
//public int TimeZoneOffsetHours { get; set; } = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace PARR.API.Contracts.V1.Responses.Statistics
|
|
||||||
{
|
|
||||||
public class StatResponseAreaWorkLoadResponse : StatWorkLoadDataBaseResponse
|
|
||||||
{
|
|
||||||
//public required ResponseAreaResponse ResponseArea { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace PARR.API.Contracts.V1.Responses.Statistics
|
|
||||||
{
|
|
||||||
public class StatWorkGroupWorkLoadResponse : StatWorkLoadDataBaseResponse
|
|
||||||
{
|
|
||||||
//public required WorkGroupResponse WorkGroup { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
namespace PARR.API.Contracts.V1.Responses.Statistics
|
|
||||||
{
|
|
||||||
public class StatWorkLoadDataBaseResponse
|
|
||||||
{
|
|
||||||
public List<StatWorkLoadDataResponse> WorkLoad { get; set; }
|
|
||||||
|
|
||||||
public int WorksCount => WorkLoad?.Sum(t => t.TemplateCount) ?? 0;
|
|
||||||
|
|
||||||
public double AverageWorksCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
int divider = WorkLoad.Where(t => t.TemplateCount > 0).Count();
|
|
||||||
if (divider > 0)
|
|
||||||
return Math.Round((double)WorksCount / divider, 2);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}//=> Math.Round((double)WorksCount / WorkLoad.Where(t => t.TemplateCount > 0).Count(), 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class StatWorkLoadDataResponse
|
|
||||||
{
|
|
||||||
//public DateTimeOffset Date { get; set; }
|
|
||||||
public DateOnly Date { get; set; }
|
|
||||||
public int TemplateCount { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace PARR.API.Contracts.V1.Responses.Statistics
|
|
||||||
{
|
|
||||||
public class StatWorkWorkLoadResponse : StatWorkLoadDataBaseResponse
|
|
||||||
{
|
|
||||||
//public required ApplicationInWorkBaseResponse Job { get; set; }
|
|
||||||
|
|
||||||
//public required WorkGroupResponse WorkGroup { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
using PARR.Domain.Enums;
|
||||||
|
|
||||||
|
namespace PARR.API.Contracts.V1.Responses.Statistics
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Response отчета о загруженности
|
||||||
|
/// </summary>
|
||||||
|
public record StatWorkloadReportResponse
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Тип отчета (все ЗО, все РГ, одна ЗО, одна РГ)
|
||||||
|
/// </summary>
|
||||||
|
public WorkloadReportType Type { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название отчета (По всем ЗО, по одной ЗО)
|
||||||
|
/// </summary>
|
||||||
|
public required string DisplayName { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Подзаголовок, наименование конкретной ЗО/РГ
|
||||||
|
/// </summary>
|
||||||
|
public string? SubfilterName { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дата формирования отчета
|
||||||
|
/// </summary>
|
||||||
|
public DateTimeOffset ReportCacheCreatedAt { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дата формирования кэша ЗО и РГ
|
||||||
|
/// </summary>
|
||||||
|
public DateTimeOffset TemplateCacheCreatedAt { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список дней
|
||||||
|
/// </summary>
|
||||||
|
public required List<WorkloadDayItemResponse> Days { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Нагруженность
|
||||||
|
/// </summary>
|
||||||
|
public required List<WorkloadStatisticItemResponse> Statistics { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public record WorkloadSummaryResponse
|
||||||
|
{
|
||||||
|
public required WorkloadSummaryItemResponse Total { get; init; }
|
||||||
|
|
||||||
|
public required WorkloadSummaryItemResponse Activated { get; init; }
|
||||||
|
|
||||||
|
public required WorkloadSummaryItemResponse Deactivated { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public record WorkloadSummaryItemResponse
|
||||||
|
{
|
||||||
|
public int Count { get; init; }
|
||||||
|
|
||||||
|
public double Average { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public record WorkloadDayItemResponse
|
||||||
|
{
|
||||||
|
public DateOnly Date { get; init; }
|
||||||
|
|
||||||
|
public bool IsWeekend { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public record WorkloadStatisticItemResponse
|
||||||
|
{
|
||||||
|
public required string Title { get; init; }
|
||||||
|
|
||||||
|
public required WorkloadSummaryResponse Summary { get; init; }
|
||||||
|
|
||||||
|
public required List<WorkloadDailyItemResponse> DailyMetrics { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public record WorkloadDailyItemResponse
|
||||||
|
{
|
||||||
|
public DateOnly Date { get; init; }
|
||||||
|
|
||||||
|
public bool IsWeekend { get; init; }
|
||||||
|
|
||||||
|
public int Total { get; init; }
|
||||||
|
|
||||||
|
public int Activated { get; init; }
|
||||||
|
|
||||||
|
public int Deactivated { get; init; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using AutoMapper;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using NodaTime;
|
||||||
using PARR.API.Contracts.V1;
|
using PARR.API.Contracts.V1;
|
||||||
|
using PARR.API.Contracts.V1.Requests.BaseRequests;
|
||||||
|
using PARR.API.Contracts.V1.Requests.Queries;
|
||||||
using PARR.API.Contracts.V1.Responses.Base;
|
using PARR.API.Contracts.V1.Responses.Base;
|
||||||
|
using PARR.API.Contracts.V1.Responses.Statistics;
|
||||||
using PARR.API.Controllers.V1.Base;
|
using PARR.API.Controllers.V1.Base;
|
||||||
using PARR.API.Services.Interfaces;
|
using PARR.API.Services.Interfaces;
|
||||||
using PARR.API.Settings;
|
|
||||||
using PARR.Core.Services.TaskServices.Interfaces;
|
using PARR.Core.Services.TaskServices.Interfaces;
|
||||||
using PARR.Core.Services.TaskServices.Providers;
|
using PARR.Core.Services.TaskServices.Providers;
|
||||||
|
using PARR.Core.Services.Workload.Interfaces;
|
||||||
using PARR.Domain.Common.Roles;
|
using PARR.Domain.Common.Roles;
|
||||||
using PARR.Domain.Entities.Base.History;
|
using PARR.Domain.Entities.Base.History;
|
||||||
using PARR.Domain.Enums;
|
using PARR.Domain.Enums;
|
||||||
@@ -21,26 +26,53 @@ namespace PARR.API.Controllers.V1.Statistics
|
|||||||
{
|
{
|
||||||
private readonly ITaskManagementService taskManagementService;
|
private readonly ITaskManagementService taskManagementService;
|
||||||
private readonly IClientService clientService;
|
private readonly IClientService clientService;
|
||||||
//private readonly MqSettings mqSettings;
|
|
||||||
private readonly ILogger<StatWorkloadController> logger;
|
private readonly ILogger<StatWorkloadController> logger;
|
||||||
private readonly ITaskMqSettingsProvider taskMqSettingsProvider;
|
private readonly ITaskMqSettingsProvider taskMqSettingsProvider;
|
||||||
|
private readonly IWorkloadService workloadService;
|
||||||
|
private readonly IMapper mapper;
|
||||||
|
|
||||||
public StatWorkloadController(
|
public StatWorkloadController(
|
||||||
ITaskManagementService taskManagementService,
|
ITaskManagementService taskManagementService,
|
||||||
IClientService clientService,
|
IClientService clientService,
|
||||||
//MqSettings mqSettings,
|
|
||||||
ILogger<StatWorkloadController> logger,
|
ILogger<StatWorkloadController> logger,
|
||||||
ITaskMqSettingsProvider taskMqSettingsProvider
|
ITaskMqSettingsProvider taskMqSettingsProvider,
|
||||||
|
IWorkloadService workloadService,
|
||||||
|
IMapper mapper
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.taskManagementService = taskManagementService;
|
this.taskManagementService = taskManagementService;
|
||||||
this.clientService = clientService;
|
this.clientService = clientService;
|
||||||
//this.mqSettings = mqSettings;
|
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.taskMqSettingsProvider = taskMqSettingsProvider;
|
this.taskMqSettingsProvider = taskMqSettingsProvider;
|
||||||
|
this.workloadService = workloadService;
|
||||||
|
this.mapper = mapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отчет о загруженности по всем РГ
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet(ApiRoutes.Workload.WorkGroup)]
|
||||||
|
public async Task<IActionResult> GetWorkGroupReport([FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request)
|
||||||
|
{
|
||||||
|
return await GetReportAsync(WorkloadReportType.WorkGroupAll, request.DurationDays, offset.TimeZoneOffset, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Отчет о загруженности по всем ЗО
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet(ApiRoutes.Workload.ResponseArea)]
|
||||||
|
public async Task<IActionResult> GetResponseAreaReport([FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request)
|
||||||
|
{
|
||||||
|
return await GetReportAsync(WorkloadReportType.ResponseAreaAll, request.DurationDays, offset.TimeZoneOffset, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Сформировать отчетность
|
/// Сформировать отчетность
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -79,5 +111,26 @@ namespace PARR.API.Controllers.V1.Statistics
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Универсальный метод получения отчетности
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task<IActionResult> GetReportAsync(WorkloadReportType reportType, int durationDays, TimeSpan offset, string? filter)
|
||||||
|
{
|
||||||
|
var utcNow = DateTimeOffset.UtcNow;
|
||||||
|
var localTime = utcNow.ToOffset(offset);
|
||||||
|
var dateStart = DateOnly.FromDateTime(localTime.Date);
|
||||||
|
|
||||||
|
var report = await workloadService.GetWorkloadReport(reportType, dateStart, durationDays, offset, filter);
|
||||||
|
|
||||||
|
if (report == null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Необходимо сформировать отчетность." } }));
|
||||||
|
|
||||||
|
var resonse = mapper.Map<StatWorkloadReportResponse>(report);
|
||||||
|
|
||||||
|
return Ok(new Response<StatWorkloadReportResponse>(resonse, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using PARR.API.Authentication.Models;
|
using PARR.API.Authentication.Models;
|
||||||
using PARR.API.Contracts.V1.Responses;
|
using PARR.API.Contracts.V1.Responses;
|
||||||
|
using PARR.API.Contracts.V1.Responses.Statistics;
|
||||||
using PARR.API.MappingProfiles.Resolvers;
|
using PARR.API.MappingProfiles.Resolvers;
|
||||||
using PARR.Core.Repositories.Interfaces.Schedule;
|
using PARR.Core.Repositories.Interfaces.Schedule;
|
||||||
using PARR.Domain.DTOs.Matching;
|
using PARR.Domain.DTOs.Matching;
|
||||||
using PARR.Domain.DTOs.Shortcode;
|
using PARR.Domain.DTOs.Shortcode;
|
||||||
|
using PARR.Domain.DTOs.Workload;
|
||||||
using PARR.Domain.Entities;
|
using PARR.Domain.Entities;
|
||||||
using PARR.Domain.Entities.Base.History;
|
using PARR.Domain.Entities.Base.History;
|
||||||
using PARR.Domain.Entities.Job;
|
using PARR.Domain.Entities.Job;
|
||||||
@@ -425,6 +427,24 @@ namespace PARR.API.MappingProfiles
|
|||||||
.ForMember(d => d.DetailsJobs, o => o.MapFrom(s => s.DetailsJobs != null ? s.DetailsJobs.Select(t => t.Data) : null));
|
.ForMember(d => d.DetailsJobs, o => o.MapFrom(s => s.DetailsJobs != null ? s.DetailsJobs.Select(t => t.Data) : null));
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region StatWorkloadReportResponse
|
||||||
|
|
||||||
|
CreateMap<WorkloadReport, StatWorkloadReportResponse>();
|
||||||
|
|
||||||
|
CreateMap<WorkloadSummary, WorkloadSummaryResponse>();
|
||||||
|
|
||||||
|
CreateMap<WorkloadSummaryItem, WorkloadSummaryItemResponse>();
|
||||||
|
|
||||||
|
CreateMap<WorkloadDayItem, WorkloadDayItemResponse>();
|
||||||
|
|
||||||
|
CreateMap<WorkloadStatisticItem, WorkloadStatisticItemResponse>();
|
||||||
|
|
||||||
|
CreateMap<WorkloadDailyItem, WorkloadDailyItemResponse>();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
|
|
||||||
var cacheItem = new TemplateCache
|
var cacheItem = new TemplateCache
|
||||||
{
|
{
|
||||||
Data = new TemplateCacheDto { TemplateId = template.Id, ResponseArea = responseArea, WorkGroup = workGroup },
|
Data = new TemplateCacheDto { TemplateId = template.Id, ResponseArea = responseArea, WorkGroup = workGroup, JobGroupId = template.Job!.GroupId, JobId = template.JobId },
|
||||||
Source = nameof(WorkloadCacheService),
|
Source = nameof(WorkloadCacheService),
|
||||||
Timestamp = DateTimeOffset.UtcNow
|
Timestamp = DateTimeOffset.UtcNow
|
||||||
};
|
};
|
||||||
@@ -193,11 +193,15 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
var dtStart = new DateTimeOffset(dateStart.Year, dateStart.Month, dateStart.Day, 0, 0, 0, offset);
|
var dtStart = new DateTimeOffset(dateStart.Year, dateStart.Month, dateStart.Day, 0, 0, 0, offset);
|
||||||
var dtEnd = dtStart.AddDays(durationDays);
|
var dtEnd = dtStart.AddDays(durationDays);
|
||||||
|
|
||||||
|
// Конвертируем в UTC для совместимости с PostgreSQL timestamptz
|
||||||
|
var dtStartUtc = dtStart.ToUniversalTime();
|
||||||
|
var dtEndUtc = dtEnd.ToUniversalTime();
|
||||||
|
|
||||||
logger.LogDebug("Фильтруем шаблоны в БД по интервалу: Start={DtStart:yyyy-MM-dd HH:mm:ss zzz}, End={DtEnd:yyyy-MM-dd HH:mm:ss zzz}", dtStart, dtEnd);
|
logger.LogDebug("Фильтруем шаблоны в БД по интервалу: Start={DtStart:yyyy-MM-dd HH:mm:ss zzz}, End={DtEnd:yyyy-MM-dd HH:mm:ss zzz}", dtStart, dtEnd);
|
||||||
|
|
||||||
var templates = await templateRepository.Get()
|
var templates = await templateRepository.Get()
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(t => dtStart <= t.NextRun && t.NextRun < dtEnd)
|
.Where(t => dtStartUtc <= t.NextRun && t.NextRun < dtEndUtc)
|
||||||
.Select(t => new { Id = t.Id, IsActiveTemplate = t.IsActiveTemplate, IsActiveSchedule = t.IsActiveSchedule, Name = t.Name, NextRun = t.NextRun })
|
.Select(t => new { Id = t.Id, IsActiveTemplate = t.IsActiveTemplate, IsActiveSchedule = t.IsActiveSchedule, Name = t.Name, NextRun = t.NextRun })
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
@@ -231,7 +235,7 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
template.NextRun,
|
template.NextRun,
|
||||||
template.IsActiveTemplate,
|
template.IsActiveTemplate,
|
||||||
template.IsActiveSchedule,
|
template.IsActiveSchedule,
|
||||||
DateTimeOffset.UtcNow);
|
cacheDate);
|
||||||
reportData.Add(data);
|
reportData.Add(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,7 +270,7 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
// Запишем результат в кэш
|
// Запишем результат в кэш
|
||||||
var cacheItem = new TemplateCache
|
var cacheItem = new TemplateCache
|
||||||
{
|
{
|
||||||
Data = new TemplateCacheDto { TemplateId = template.Id, ResponseArea = responseArea, WorkGroup = workGroup },
|
Data = new TemplateCacheDto { TemplateId = template.Id, ResponseArea = responseArea, WorkGroup = workGroup, JobId = template.JobId, JobGroupId = template.Job!.GroupId },
|
||||||
Source = nameof(WorkloadCacheService),
|
Source = nameof(WorkloadCacheService),
|
||||||
Timestamp = DateTimeOffset.UtcNow
|
Timestamp = DateTimeOffset.UtcNow
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
break;
|
break;
|
||||||
case WorkloadReportType.ResponseAreaItem:
|
case WorkloadReportType.ResponseAreaItem:
|
||||||
displayName = "По зоне ответственности";
|
displayName = "По зоне ответственности";
|
||||||
|
//todo: тут нужно вернуть другой отчет, либо группы работ, либо список работ
|
||||||
var filteredRA = templates.Where(t => t.ResponseArea.Equals(filterParam, StringComparison.OrdinalIgnoreCase)).ToList();
|
var filteredRA = templates.Where(t => t.ResponseArea.Equals(filterParam, StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
statistics.Add(BuildStatisticItem(filterParam!, filteredRA, reportDays, offset));
|
statistics.Add(BuildStatisticItem(filterParam!, filteredRA, reportDays, offset));
|
||||||
break;
|
break;
|
||||||
@@ -82,6 +83,7 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
break;
|
break;
|
||||||
case WorkloadReportType.WorkGroupItem:
|
case WorkloadReportType.WorkGroupItem:
|
||||||
displayName = "По рабочей группе";
|
displayName = "По рабочей группе";
|
||||||
|
//todo: тут нужно вернуть другой отчет, либо группы работ, либо список работ
|
||||||
var filteredWG = templates.Where(t => t.WorkGroup.Equals(filterParam, StringComparison.OrdinalIgnoreCase)).ToList();
|
var filteredWG = templates.Where(t => t.WorkGroup.Equals(filterParam, StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
statistics.Add(BuildStatisticItem(filterParam!, filteredWG, reportDays, offset));
|
statistics.Add(BuildStatisticItem(filterParam!, filteredWG, reportDays, offset));
|
||||||
break;
|
break;
|
||||||
@@ -95,7 +97,7 @@ namespace PARR.Core.Services.Workload.Implementations
|
|||||||
ReportCacheCreatedAt = DateTimeOffset.UtcNow,
|
ReportCacheCreatedAt = DateTimeOffset.UtcNow,
|
||||||
TemplateCacheCreatedAt = templates.FirstOrDefault()?.CacheDate ?? DateTimeOffset.MinValue,
|
TemplateCacheCreatedAt = templates.FirstOrDefault()?.CacheDate ?? DateTimeOffset.MinValue,
|
||||||
Days = reportDays,
|
Days = reportDays,
|
||||||
Statistics = statistics
|
Statistics = statistics.OrderBy(t => t.Title).ToList()
|
||||||
};
|
};
|
||||||
|
|
||||||
// Сохраним в кэш
|
// Сохраним в кэш
|
||||||
|
|||||||
@@ -1,9 +1,22 @@
|
|||||||
namespace PARR.Core.Services.Workload.Interfaces
|
using PARR.Domain.DTOs.Workload;
|
||||||
|
using PARR.Domain.Enums;
|
||||||
|
|
||||||
|
namespace PARR.Core.Services.Workload.Interfaces
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Сервис формирования отчетности о загруженности
|
/// Сервис формирования отчетности о загруженности
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IWorkloadService
|
public interface IWorkloadService
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Получить отчет о загруженности
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reportType"></param>
|
||||||
|
/// <param name="dateStart"></param>
|
||||||
|
/// <param name="durationDays"></param>
|
||||||
|
/// <param name="offset"></param>
|
||||||
|
/// <param name="filterParam"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<WorkloadReport?> GetWorkloadReport(WorkloadReportType reportType, DateOnly dateStart, int durationDays, TimeSpan offset, string? filterParam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,5 +18,7 @@ namespace PARR.Domain.Cache.Models
|
|||||||
public Guid TemplateId { get; init; }
|
public Guid TemplateId { get; init; }
|
||||||
public required string WorkGroup { get; init; }
|
public required string WorkGroup { get; init; }
|
||||||
public required string ResponseArea { get; init; }
|
public required string ResponseArea { get; init; }
|
||||||
|
public Guid JobId { get; init; }
|
||||||
|
public Guid JobGroupId { get; init; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user