diff --git a/PARR.TemplateMatcher/Services/Implemetaions/SimpleTemplateSynchronizer.cs b/PARR.TemplateMatcher/Services/Implemetaions/SimpleTemplateSynchronizer.cs index c14d9ffe..1a0c4eae 100644 --- a/PARR.TemplateMatcher/Services/Implemetaions/SimpleTemplateSynchronizer.cs +++ b/PARR.TemplateMatcher/Services/Implemetaions/SimpleTemplateSynchronizer.cs @@ -492,9 +492,13 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer // Генерируем ожидаемое имя один раз var expectedName = await GenerateUnusedTemplateNameAsync(template, unusedJob); + // Извлекаем "базовые" имена + var currentBaseName = ExtractBaseName(template.Name); + var expectedBaseName = ExtractBaseName(expectedName); + // Проверяем, нужно ли обновление bool needsUpdate = template.JobId != unusedJobId || - !string.Equals(template.Name, expectedName, StringComparison.OrdinalIgnoreCase); + currentBaseName != expectedBaseName; if (!needsUpdate) { @@ -612,4 +616,29 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer TimeSpan.FromMinutes(30) ); } + + + private static string ExtractBaseName(string name) + { + var lastUnderscoreIndex = name.LastIndexOf('_'); + if (lastUnderscoreIndex > 0) + { + var suffix = name.Substring(lastUnderscoreIndex + 1); + if (long.TryParse(suffix, out long unixTimestampMs)) + { + try + { + // Проверяем, является ли это валидным временем + var dto = DateTimeOffset.FromUnixTimeMilliseconds(unixTimestampMs); + return name.Substring(0, lastUnderscoreIndex); + } + catch (ArgumentOutOfRangeException) + { + // Значение вне диапазона для DateTimeOffset + return name; // Не трогаем имя, если суффикс невалиден + } + } + } + return name; + } } \ No newline at end of file