2024-10-11 11:06:05 +10:00
using Microsoft.AspNetCore.Mvc ;
using Microsoft.EntityFrameworkCore ;
using PARR.API.Contracts.V1 ;
using PARR.API.Contracts.V1.Requests.BaseRequests ;
using PARR.API.Contracts.V1.Responses.Base ;
using PARR.API.Contracts.V1.Responses.Statistics ;
using PARR.API.Controllers.V1.Base ;
2026-03-05 10:19:54 +10:00
using PARR.API.Helpers ;
using PARR.DAL.NextRunServices ;
2024-10-11 11:06:05 +10:00
using PARR.DAL.Services.Interfaces ;
2026-04-13 16:58:30 +10:00
using PARR.Domain.Enums ;
2024-10-11 11:06:05 +10:00
namespace PARR.API.Controllers.V1.Statistics
{
public class StatTemplateAutoControlController : BaseApiController
{
private readonly ITemplateService templateService ;
private readonly ITemplateHistoryService templateHistoryService ;
2026-03-05 10:19:54 +10:00
private readonly INextRunService nextRunService ;
2024-10-11 11:06:05 +10:00
public StatTemplateAutoControlController (
ITemplateService templateService ,
ITemplateHistoryService templateHistoryService ,
2026-03-05 10:19:54 +10:00
INextRunService nextRunService
2024-10-11 11:06:05 +10:00
)
{
this . templateService = templateService ;
this . templateHistoryService = templateHistoryService ;
2026-03-05 10:19:54 +10:00
this . nextRunService = nextRunService ;
2024-10-11 11:06:05 +10:00
}
/// <summary>
/// Получить статистику авто-контроля по Р Р
/// </summary>
/// <param name="timeZoneQuery"></param>
/// <param name="startPeriodDays"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.StatTemplateAutoControl.GetForPeriod)]
public async Task < IActionResult > GetForPeriod ( [ FromQuery ] TimeZoneOffsetClient timeZoneQuery , [ FromQuery ] int startPeriodDays = 3 )
{
2026-03-05 10:19:54 +10:00
//var endPeriod = calendarService.GetDateWithTimeZoneOffset(DateTimeOffset.Now, timeZoneQuery.TimeZoneOffsetHours);
//var startPeriod = endPeriod.AddDays(-startPeriodDays);
var userEndPeriod = DateTimeOffset . UtcNow . Add ( timeZoneQuery . TimeZoneOffset ) ;
var userStartPeriod = userEndPeriod . AddDays ( - startPeriodDays ) ;
var utcEndPeriod = userEndPeriod . UtcDateTime ;
var utcStartPeriod = userStartPeriod . UtcDateTime ;
2024-10-11 11:06:05 +10:00
var templates = await templateService . Get ( )
2024-10-21 11:58:01 +10:00
. Where ( t = >
2026-04-13 16:58:30 +10:00
t . InitiatorParrComponentId = = ParrComponentsEnum . JobAutoControl
2024-10-21 11:58:01 +10:00
& &
( (
// измененные
t . DateModified . HasValue
2026-03-05 10:19:54 +10:00
//&& t.DateModified.Value.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
//&& t.DateModified.Value.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date <= endPeriod.Date
& & t . DateModified . Value . UtcDateTime > = utcStartPeriod
& & t . DateModified . Value . UtcDateTime < = utcEndPeriod
2024-10-21 11:58:01 +10:00
) | | (
// созданные
2026-03-05 10:19:54 +10:00
//t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
//&& t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date <= endPeriod.Date
t . DateCreated . UtcDateTime > = utcStartPeriod
& & t . DateCreated . UtcDateTime < = utcEndPeriod
2024-10-21 11:58:01 +10:00
& & t . InitiatorComment ! = null
& & ! t . InitiatorComment . Contains ( TemplateActivatorActionsEnum . ActivateAllForAutoControl . ToString ( ) )
& & ! t . InitiatorComment . Contains ( TemplateActivatorActionsEnum . DeactivateAllForAutoControl . ToString ( ) )
) )
)
. Select ( t = > new QueryResult
{
//TemplateId = t.Id,
DateCreated = t . DateCreated ,
DateModified = t . DateModified ,
InitiatorComment = t . InitiatorComment ,
//InitiatorParrComponentId = t.InitiatorParrComponentId
} )
. ToListAsync ( ) ;
#region и щ е м с о з д а н н ы е , н о у ж е п е р е м е щ е н н ы е в и с т о р и ю
var createdTemplatesAndMoveToHistory = await templateService . Get ( ) . Include ( t = > t . TemplateHistories )
2024-10-11 11:06:05 +10:00
. Where ( t = >
2026-03-05 10:19:54 +10:00
//t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
//&& t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date <= endPeriod.Date
t . DateCreated . UtcDateTime > = utcStartPeriod
& & t . DateCreated . UtcDateTime < = utcEndPeriod
2026-04-13 16:58:30 +10:00
& & t . TemplateHistories . Any ( x = > x . InitiatorParrComponentId = = ParrComponentsEnum . JobAutoControl )
2024-10-11 11:06:05 +10:00
)
. ToListAsync ( ) ;
2024-10-21 11:58:01 +10:00
// фильтруем чтобы инициатор коммент не содержал ActivateAllForAutoControl и DeactivateAllForAutoControl, если не содержит, то остается последнее единственное - генерация
createdTemplatesAndMoveToHistory = createdTemplatesAndMoveToHistory . Where ( t = >
t . TemplateHistories . Any ( x = >
x . InitiatorComment ! = null
& & ! x . InitiatorComment . Contains ( TemplateActivatorActionsEnum . ActivateAllForAutoControl . ToString ( ) )
& & ! x . InitiatorComment . Contains ( TemplateActivatorActionsEnum . DeactivateAllForAutoControl . ToString ( ) )
2026-04-13 16:58:30 +10:00
& & x . InitiatorParrComponentId = = ParrComponentsEnum . JobAutoControl
2024-10-21 11:58:01 +10:00
) ) . ToList ( ) ;
//TODO: createdTemplatesAndMoveToHistory - возможно тут ошибка. Н е убираются дубли шаблонов из template
#endregion
2024-10-11 11:06:05 +10:00
var history = await templateHistoryService . Get ( )
. Where ( t = >
2026-04-13 16:58:30 +10:00
t . InitiatorParrComponentId = = ParrComponentsEnum . JobAutoControl
2024-10-11 11:06:05 +10:00
& & t . DateModified . HasValue
2026-03-05 10:19:54 +10:00
//&& t.DateModified.Value.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
//&& t.DateModified.Value.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date <= endPeriod.Date
& & t . DateModified . Value . UtcDateTime > = utcStartPeriod
& & t . DateModified . Value . UtcDateTime < = utcEndPeriod
2024-10-11 11:06:05 +10:00
)
. Select ( t = > new QueryResult
{
//TemplateId = t.ParentId,
//DateCreated = t.DateCreated,
DateModified = t . DateModified ,
InitiatorComment = t . InitiatorComment ,
//InitiatorParrComponentId = t.InitiatorParrComponentId
} )
. ToListAsync ( ) ;
var objs = new List < QueryResult > ( ) ;
objs . AddRange ( templates ) ;
objs . AddRange ( history ) ;
2024-10-21 11:58:01 +10:00
objs . AddRange ( createdTemplatesAndMoveToHistory . Select ( t = > new QueryResult { DateCreated = t . DateCreated } ) ) ;
2024-10-11 11:06:05 +10:00
// создано
2026-03-05 10:19:54 +10:00
var creations = objs . Where ( t = > t . DateCreated . HasValue )
//.GroupBy(t => t.DateCreated!.Value.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date)
//.GroupBy(t => DateOnly.FromDateTime(t.DateCreated!.Value.ToOffset(timeZoneQuery.TimeZoneOffset).DateTime))
//.ToDictionary(t => t.Key, t => t.Count());
. GroupByUserDate ( t = > t . DateCreated ! . Value , timeZoneQuery . TimeZoneOffset ) ;
2024-10-11 11:06:05 +10:00
// активаций (сколько раз, а не сколько объектов)
var activations = objs . Where ( t = > t . DateModified . HasValue & & t . InitiatorComment ! = null & & t . InitiatorComment . Contains ( TemplateActivatorActionsEnum . ActivateAllForAutoControl . ToString ( ) ) )
2026-03-05 10:19:54 +10:00
//.GroupBy(t => t.DateModified!.Value.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date)
//.GroupBy(t => DateOnly.FromDateTime(t.DateModified!.Value.ToOffset(timeZoneQuery.TimeZoneOffset).DateTime))
//.ToDictionary(t => t.Key, t => t.Count());
. GroupByUserDate ( t = > t . DateModified ! . Value , timeZoneQuery . TimeZoneOffset ) ;
2024-10-11 11:06:05 +10:00
// деактиваций (сколько раз, а не сколько объектов)
var deactivations = objs . Where ( t = > t . DateModified . HasValue & & t . InitiatorComment ! = null & & t . InitiatorComment . Contains ( TemplateActivatorActionsEnum . DeactivateAllForAutoControl . ToString ( ) ) )
2026-03-05 10:19:54 +10:00
//.GroupBy(t => t.DateModified!.Value.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date)
//.GroupBy(t => DateOnly.FromDateTime(t.DateModified!.Value.ToOffset(timeZoneQuery.TimeZoneOffset).DateTime))
//.ToDictionary(t => t.Key, t => t.Count());
. GroupByUserDate ( t = > t . DateModified ! . Value , timeZoneQuery . TimeZoneOffset ) ;
2024-10-11 11:06:05 +10:00
2026-03-05 10:19:54 +10:00
//var daysList = calendarService.GetDatesForPeriod(startPeriod, endPeriod);
var daysList = await nextRunService . GetWorkDaysAsync ( DateOnly . FromDateTime ( userStartPeriod . DateTime ) , DateOnly . FromDateTime ( userEndPeriod . DateTime ) , false ) ;
2024-10-11 11:06:05 +10:00
2026-03-05 10:19:54 +10:00
var response = daysList . Select ( date = > new StatTemplateAutoControlResponse
2024-10-11 11:06:05 +10:00
{
Date = date ,
2026-03-05 10:19:54 +10:00
Activations = activations . TryGetValue ( date , out var countAct ) ? countAct : 0 ,
Creations = creations . TryGetValue ( date , out var countCrt ) ? countCrt : 0 ,
Deactivations = deactivations . TryGetValue ( date , out var countDeact ) ? countDeact : 0
} ) . OrderBy ( t = > t . Date ) . ToList ( ) ;
2024-10-11 11:06:05 +10:00
return Ok ( new Response < List < StatTemplateAutoControlResponse > > ( response , true ) ) ;
}
class QueryResult
{
//public Guid TemplateId { get; set; }
public DateTimeOffset ? DateCreated { get ; set ; }
public DateTimeOffset ? DateModified { get ; set ; }
public string? InitiatorComment { get ; set ; }
}
}
}