причесывание
This commit is contained in:
+10
-25
@@ -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} мс, запись по типу заявок " +
|
||||
|
||||
Reference in New Issue
Block a user