| | | 1 | | using Hangfire; |
| | | 2 | | using Microsoft.Extensions.Logging; |
| | | 3 | | using Services.SignalRServices; |
| | | 4 | | using Services.SystemMonitoringServices; |
| | | 5 | | |
| | | 6 | | namespace Services.FidSupplierLinkServices; |
| | | 7 | | |
| | | 8 | | public sealed class FidSupplierLinkDiscoveryJob |
| | | 9 | | { |
| | | 10 | | public const string JobId = "fid-supplier-link-discovery"; |
| | | 11 | | public const string DefaultCron = "0 */3 * * *"; |
| | | 12 | | private readonly FidSupplierLinkService _links; |
| | | 13 | | private readonly FidSuppliersFeedCache _feed; |
| | | 14 | | private readonly ILogger<FidSupplierLinkDiscoveryJob> _logger; |
| | | 15 | | private readonly ISystemMonitoringSignalWriter? _signals; |
| | | 16 | | |
| | 4 | 17 | | public FidSupplierLinkDiscoveryJob(FidSupplierLinkService links, FidSuppliersFeedCache feed, ILogger<FidSupplierLink |
| | 20 | 18 | | { _links = links; _feed = feed; _logger = logger; _signals = signals; } |
| | | 19 | | |
| | | 20 | | [DisableConcurrentExecution(timeoutInSeconds: 0)] |
| | | 21 | | public async Task<string> ExecuteAsync() |
| | | 22 | | { |
| | 4 | 23 | | var (feed, error) = await _feed.GetAsync(forceRefresh: true); |
| | 6 | 24 | | if (feed is null) { _logger.LogWarning("{JobId}: {Error}", JobId, error); return error ?? "Фид недоступен"; } |
| | | 25 | | try |
| | | 26 | | { |
| | 3 | 27 | | await _links.SyncDiscoveredAsync(feed); |
| | 3 | 28 | | await (_signals?.RecordAsync("fid-suppliers-mapping", "success") ?? Task.CompletedTask); |
| | 3 | 29 | | } |
| | 0 | 30 | | catch |
| | | 31 | | { |
| | 0 | 32 | | await (_signals?.RecordAsync("fid-suppliers-mapping", "failure", message: "Ошибка сопоставления поставщиков |
| | 0 | 33 | | throw; |
| | | 34 | | } |
| | 3 | 35 | | var pending = await _links.GetPendingNotificationsAsync(TimeSpan.FromDays(7)); |
| | 4 | 36 | | if (pending.Count == 0) return "Новых несвязанных поставщиков фида нет."; |
| | 8 | 37 | | var names = pending.Select(x => x.FidSupplierName).OrderBy(x => x).ToArray(); |
| | | 38 | | try |
| | | 39 | | { |
| | 2 | 40 | | await NotificationService.NotifyAsync("Связи фида", "#D97706", "Несвязанные поставщики фида: " + string.Join |
| | 1 | 41 | | await _links.MarkNotifiedAsync(names); |
| | 1 | 42 | | } |
| | 3 | 43 | | catch (Exception ex) { _logger.LogWarning(ex, "{JobId}: не удалось отправить уведомление", JobId); } |
| | 2 | 44 | | return $"Несвязанных поставщиков: {names.Length}"; |
| | 4 | 45 | | } |
| | | 46 | | } |