причесывание

This commit is contained in:
gorbenko.pavel
2026-08-19 09:44:31 +05:00
parent 1dff7c7112
commit 58c27b2aa5
5 changed files with 239 additions and 64 deletions
@@ -3,7 +3,6 @@ using Hangfire;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Tnsu.ApprovalRoute.Domain.Entities;
using Tnsu.ApprovalRoute.Infrastructure.Persistence;
using Tnsu.ApprovalRoute.Infrastructure.SharePoint;
@@ -72,16 +71,13 @@ public sealed class CreateNextListPartitionJob(
return;
}
// Задачу могли поставить раньше, чем реестр успел узнать про текущую
// партицию (например, ручным запуском) — регистрируем её, иначе серия
// осталась бы без своего первого номера.
var current = await registry.EnsureCurrentRegisteredAsync(requestType, cancellationToken);
// Партиция, на которую сейчас указывает RequestType.ListId, прямо сейчас
// перестаёт быть текущей — записываем её в архив (request_list_partitions
// хранит только архив, см. ListPartitionRegistry). До этого момента она
// нигде отдельной строкой не значилась.
var archivedCurrent = await registry.ArchiveCurrentAsync(requestType, cancellationToken);
var maxNumber = await db.RequestListPartitions
.Where(x => x.RequestTypeId == requestTypeId)
.MaxAsync(x => (int?)x.Number, cancellationToken) ?? current.Number;
var nextNumber = maxNumber + 1;
var nextNumber = archivedCurrent.Number + 1;
logger.LogInformation(
"Создаю партицию №{Number} для типа заявок {RequestTypeId} ({RequestTypeName}) " +
@@ -113,23 +109,12 @@ public sealed class CreateNextListPartitionJob(
throw;
}
// Реестр и переключение записи — одной транзакцией: иначе можно остаться
// с записанной в реестр партицией, в которую никто не пишет, или наоборот.
await using var transaction = await db.Database.BeginTransactionAsync(cancellationToken);
db.RequestListPartitions.Add(new RequestListPartition
{
RequestTypeId = requestTypeId,
Number = nextNumber,
ListId = created.ListId,
Title = created.Title,
CreatedAt = DateTimeOffset.UtcNow
});
// Новая партиция строкой в request_list_partitions пока не появляется —
// она получит свою запись только когда САМА станет архивом, следующим
// вызовом этой же задачи (см. doc-комментарий класса ListPartitionRegistry).
// Здесь переключаем только указатель.
requestType.ListId = created.ListId;
await db.SaveChangesAsync(cancellationToken);
await transaction.CommitAsync(cancellationToken);
logger.LogInformation(
"Партиция №{Number} ({ListId}) создана за {ElapsedMs} мс, запись по типу заявок " +