diff --git a/PARR.Core/Services/RobotSnapshotServices/RobotSnapshotService.cs b/PARR.Core/Services/RobotSnapshotServices/RobotSnapshotService.cs index 32156387..6439f409 100644 --- a/PARR.Core/Services/RobotSnapshotServices/RobotSnapshotService.cs +++ b/PARR.Core/Services/RobotSnapshotServices/RobotSnapshotService.cs @@ -150,6 +150,7 @@ namespace PARR.Core.Services.RobotSnapshotServices MaxTemplateRobots = g.MaxTemplates, MaxScheduleRobots = g.MaxSchedules, // Считаем среднее количество роботов, деля поминутную сумму строго на 60 минут часа + //todo: тут не всегда нужно делить на 60, если час последний, то там может быть 50 минут или 20 и тп AvgTemplateRobots = Math.Round(g.SumTemplates / 60.0, 1), AvgScheduleRobots = Math.Round(g.SumSchedules / 60.0, 1) }) @@ -258,12 +259,29 @@ namespace PARR.Core.Services.RobotSnapshotServices if (!data.Any()) return new List(); + // Фиксируем текущее время в UTC и «округляем» его до начала часа + var nowLocal = DateTimeOffset.UtcNow.ToOffset(queryDto.Offset); + var currentHourLocal = new DateTime(nowLocal.Year, nowLocal.Month, nowLocal.Day, nowLocal.Hour, 0, 0); + var dbDataDict = data.ToDictionary( k => new DateTime(k.LocalYear, k.LocalMonth, k.LocalDay, k.LocalHour, 0, 0), - v => new + v => { - //MaxAllowedRobots = t.MaxAllowed, - AvgRobots = Math.Round(v.Sum / 60.0, 1) + double minutesInHour = 60.0; + var dbLocalHour = new DateTime(v.LocalYear, v.LocalMonth, v.LocalDay, v.LocalHour, 0, 0); + // Строгая проверка: совпадает ли час из базы данных ИМЕННО с текущим часом сегодня? + // Если да, то нужно делить не на 60, а на прошедние минуты + if (dbLocalHour == currentHourLocal) + { + // Если идет первая минута часа, делим на 1, чтобы избежать деления на ноль + minutesInHour = nowLocal.Minute == 0 ? 1.0 : (double)nowLocal.Minute; + } + + return new + { + //MaxAllowedRobots = t.MaxAllowed, + AvgRobots = Math.Round(v.Sum / minutesInHour, 1) + }; }); // Заполняем модель