| | | 1 | | using Microsoft.AspNetCore.SignalR; |
| | | 2 | | using Services.SignalRServices; |
| | | 3 | | |
| | | 4 | | namespace OzonOrdersWeb.WebServices.Transactions; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// Настоящий ход проведения документа для оверлея на форме транзакции. |
| | | 8 | | /// Раньше этапы на странице оценивались по секундомеру и к действительности отношения не имели: |
| | | 9 | | /// «Отправляем документы в 1С» показывалось всем, даже когда 1С в проведении не участвует. |
| | | 10 | | /// Сообщения идут через JobProgressHub в группу с ключом, который страница передала в форме. |
| | | 11 | | /// </summary> |
| | | 12 | | public sealed class TransactionProgressReporter |
| | | 13 | | { |
| | | 14 | | private readonly IHubContext<JobProgressHub> _hub; |
| | | 15 | | private readonly ILogger<TransactionProgressReporter> _logger; |
| | | 16 | | |
| | 20 | 17 | | public TransactionProgressReporter(IHubContext<JobProgressHub> hub, ILogger<TransactionProgressReporter> logger) |
| | | 18 | | { |
| | 20 | 19 | | _hub = hub; |
| | 20 | 20 | | _logger = logger; |
| | 20 | 21 | | } |
| | | 22 | | |
| | | 23 | | /// <param name="key">Ключ прогресса из формы; без него сообщать некому.</param> |
| | | 24 | | /// <param name="code">Устойчивый код этапа: страница по нему находит и обновляет строку.</param> |
| | | 25 | | /// <param name="title">Что показать пользователю.</param> |
| | | 26 | | /// <param name="detail">Уточнение под заголовком: сколько заказов, номер документа 1С и т.п.</param> |
| | | 27 | | public async Task StageAsync(string? key, string code, string title, string? detail = null) |
| | | 28 | | { |
| | 23 | 29 | | if (string.IsNullOrWhiteSpace(key)) |
| | 23 | 30 | | return; |
| | | 31 | | |
| | | 32 | | try |
| | | 33 | | { |
| | 0 | 34 | | await _hub.Clients.Group(key.Trim()).SendAsync("TransactionStage", new |
| | 0 | 35 | | { |
| | 0 | 36 | | code, |
| | 0 | 37 | | title, |
| | 0 | 38 | | detail, |
| | 0 | 39 | | atUtc = DateTime.UtcNow |
| | 0 | 40 | | }); |
| | 0 | 41 | | } |
| | 0 | 42 | | catch (Exception ex) |
| | | 43 | | { |
| | | 44 | | // Прогресс — вспомогательная информация: его сбой не должен ломать проведение. |
| | 0 | 45 | | _logger.LogDebug(ex, "Не удалось отправить этап {Code} прогресса транзакции", code); |
| | 0 | 46 | | } |
| | 23 | 47 | | } |
| | | 48 | | |
| | | 49 | | /// <summary>Проведение закончилось: страница гасит спиннер и перестаёт ждать этапы.</summary> |
| | | 50 | | public async Task CompleteAsync(string? key, bool success, string? message = null) |
| | | 51 | | { |
| | 22 | 52 | | if (string.IsNullOrWhiteSpace(key)) |
| | 22 | 53 | | return; |
| | | 54 | | |
| | | 55 | | try |
| | | 56 | | { |
| | 0 | 57 | | await _hub.Clients.Group(key.Trim()).SendAsync("TransactionFinished", new { success, message }); |
| | 0 | 58 | | } |
| | 0 | 59 | | catch (Exception ex) |
| | | 60 | | { |
| | 0 | 61 | | _logger.LogDebug(ex, "Не удалось отправить завершение прогресса транзакции"); |
| | 0 | 62 | | } |
| | 22 | 63 | | } |
| | | 64 | | } |