RequestUniqueCode из данных заявк
Tests / frontend-test (push) Successful in 50s
Tests / backend-test (push) Successful in 2m9s

This commit is contained in:
gorbenko.pavel
2026-08-18 10:46:28 +05:00
parent 7bd4acb7a6
commit 36fb71da02
3 changed files with 44 additions and 2 deletions
@@ -11,6 +11,10 @@ namespace Tnsu.ApprovalRoute.Application.Reminders;
/// наследованием (шаг перекрывает тип заявки). /// наследованием (шаг перекрывает тип заявки).
/// </param> /// </param>
/// <param name="Status">Статус просроченного шага (ApprovalStatus строки списка «… — согласование»).</param> /// <param name="Status">Статус просроченного шага (ApprovalStatus строки списка «… — согласование»).</param>
/// <param name="RequestUniqueCode">
/// Уникальный код заявки (колонка RequestUniqueCode списка данных) — null, если у
/// заявки его нет или строка данных не найдена.
/// </param>
public sealed record ReminderDto( public sealed record ReminderDto(
string Email, string Email,
int HoursOverdue, int HoursOverdue,
@@ -19,4 +23,5 @@ public sealed record ReminderDto(
int RequestTypeId, int RequestTypeId,
string RequestTypeName, string RequestTypeName,
int RequestId, int RequestId,
string Status); string Status,
string? RequestUniqueCode);
@@ -96,6 +96,9 @@ public sealed class ReminderService(
var active = await ReadRowsAsync(siteUrl, approvalListTitle, ActiveStatusFilter, cancellationToken); var active = await ReadRowsAsync(siteUrl, approvalListTitle, ActiveStatusFilter, cancellationToken);
if (active.Count == 0) return []; if (active.Count == 0) return [];
var uniqueCodes = await ReadUniqueCodesAsync(
siteUrl, type.ListId!, active.Select(r => r.TicketId).Distinct(), cancellationToken);
var reminders = new List<ReminderDto>(); var reminders = new List<ReminderDto>();
foreach (var row in active) foreach (var row in active)
{ {
@@ -127,7 +130,8 @@ public sealed class ReminderService(
type.Id, type.Id,
type.Name, type.Name,
row.TicketId, row.TicketId,
row.Status)); row.Status,
uniqueCodes.GetValueOrDefault(row.TicketId)));
} }
return reminders; return reminders;
@@ -172,4 +176,30 @@ public sealed class ReminderService(
private static List<ApprovalRow> Parse(IEnumerable<JsonElement> items) => private static List<ApprovalRow> Parse(IEnumerable<JsonElement> items) =>
items.Select(ApprovalRow.TryParse).Where(r => r is not null).Select(r => r!).ToList(); items.Select(ApprovalRow.TryParse).Where(r => r is not null).Select(r => r!).ToList();
/// <summary>
/// RequestUniqueCode заявок из списка данных — только по заявкам, у которых
/// сейчас есть просроченный шаг (а не по всему списку: он может быть большим).
/// </summary>
private async Task<IReadOnlyDictionary<int, string?>> ReadUniqueCodesAsync(
string siteUrl, string dataListUrl, IEnumerable<int> ticketIds, CancellationToken cancellationToken)
{
var filter = string.Join(" or ", ticketIds.Select(id => $"Id eq {id}"));
if (filter.Length == 0) return new Dictionary<int, string?>();
var items = await sharePoint.GetItemsByListUrlAsync(
siteUrl, dataListUrl, $"$select=Id,RequestUniqueCode&$filter={filter}", cancellationToken);
var result = new Dictionary<int, string?>();
foreach (var item in items)
{
if (!item.TryGetProperty("Id", out var idProp) || !idProp.TryGetInt32(out var id)) continue;
result[id] = item.TryGetProperty("RequestUniqueCode", out var code) && code.ValueKind == JsonValueKind.String
? code.GetString()
: null;
}
return result;
}
} }
@@ -92,6 +92,13 @@ public sealed class ReminderServiceTests : IClassFixture<PostgresDatabaseFixture
SiteUrl, ApprovalListTitle, It.Is<string>(q => q.Contains("ApprovalStatus eq")), It.IsAny<CancellationToken>())) SiteUrl, ApprovalListTitle, It.Is<string>(q => q.Contains("ApprovalStatus eq")), It.IsAny<CancellationToken>()))
.ReturnsAsync(activeRows.Select(Json).ToList()); .ReturnsAsync(activeRows.Select(Json).ToList());
// RequestUniqueCode запрашивается по списку данных сразу для всех активных
// заявок — по умолчанию тесты его не проверяют, поэтому мок отдаёт пусто.
sharePoint
.Setup(x => x.GetItemsByListUrlAsync(
SiteUrl, listUrl, It.Is<string>(q => q.Contains("RequestUniqueCode")), It.IsAny<CancellationToken>()))
.ReturnsAsync([]);
return new ReminderService( return new ReminderService(
_services.GetRequiredService<ApprovalRouteDbContext>(), _services.GetRequiredService<ApprovalRouteDbContext>(),
sharePoint.Object, sharePoint.Object,