| | | 1 | | @model OzonOrdersWeb.Areas.Studio2.ViewModels.TransactionJobs.BackgroundJobsExecutionsPageViewModel |
| | | 2 | | @{ |
| | | 3 | | // Списки из модели страницы → гриды (job-logs-grids.js); журнал запусков — серверный грид (grid/transactions). |
| | 0 | 4 | | var lookup = Model.OrderLookup; |
| | | 5 | | string Warehouses(OzonOrdersWeb.Areas.Studio2.ViewModels.TransactionJobs.OrderExecutionLookupPostingViewModel p) => |
| | 0 | 6 | | !string.IsNullOrWhiteSpace(p.WarehouseSender) || !string.IsNullOrWhiteSpace(p.WarehouseRecipient) |
| | 0 | 7 | | ? $"{(string.IsNullOrWhiteSpace(p.WarehouseSender) ? "?" : p.WarehouseSender)} → {(string.IsNullOrWhiteSpace |
| | 0 | 8 | | : p.WarehouseName ?? "-"; |
| | 0 | 9 | | var localData = new Dictionary<string, object> |
| | 0 | 10 | | { |
| | 0 | 11 | | ["schedules"] = Model.Schedules.Select(s => new |
| | 0 | 12 | | { |
| | 0 | 13 | | s.Id, s.Name, ClientName = s.OzonClient?.Name, s.JobType, Cron = s.CronExpression, s.IsActive, s.LastRunTime |
| | 0 | 14 | | }) |
| | 0 | 15 | | }; |
| | 0 | 16 | | if (lookup != null && !lookup.IsEmpty) |
| | | 17 | | { |
| | 0 | 18 | | localData["lookupOrders"] = lookup.Orders.Select(o => new |
| | 0 | 19 | | { |
| | 0 | 20 | | o.OrderId, o.ShipmentNumber, o.Article, Status = o.AppStatusName ?? o.ClientStatusName, ClientName = o.OzonC |
| | 0 | 21 | | WarehouseName = o.ShipmentWarehouseName, o.TransactionId, |
| | 0 | 22 | | TransactionSummary = string.Join(", ", new[] |
| | 0 | 23 | | { |
| | 0 | 24 | | o.TransactionTypeName, |
| | 0 | 25 | | o.TransactionCreatedAt.HasValue ? o.TransactionCreatedAt.Value.ToString("dd.MM.yyyy HH:mm") : null, |
| | 0 | 26 | | o.TransactionCreateBy |
| | 0 | 27 | | }.Where(x => !string.IsNullOrWhiteSpace(x))) |
| | 0 | 28 | | }); |
| | 0 | 29 | | localData["lookupPostings"] = lookup.Postings.Select(p => new |
| | 0 | 30 | | { |
| | 0 | 31 | | p.PerformedAt, p.ExecutionId, p.JobType, p.ScheduleName, p.TransactionId, p.TransactionTypeName, p.Performed |
| | 0 | 32 | | p.ShipmentNumber, p.OrderId, Warehouses = Warehouses(p), p.DocumentNumbers, p.IsPosted, p.Status, p.Comment, |
| | 0 | 33 | | }); |
| | 0 | 34 | | localData["lookupMatches"] = lookup.Matches.Select(m => new |
| | 0 | 35 | | { |
| | 0 | 36 | | m.ExecutionId, m.JobType, m.ScheduleName, m.StartedAt, m.OrderNumber, m.Article, m.IsMatchedInDb, m.IsEligib |
| | 0 | 37 | | }); |
| | | 38 | | } |
| | | 39 | | } |
| | 0 | 40 | | <script>window.jobLogsLocalData = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(localData, new System.Text.Json.Js |
| | | 41 | | <div class="job-logs-intro"> |
| | | 42 | | <i class="fas fa-circle-info"></i> |
| | | 43 | | <span> |
| | | 44 | | Запуск создаётся расписанием («Авто-транзакции Ozon») либо кнопкой «Выполнить сейчас». |
| | | 45 | | Статус <strong>«Частично успешно»</strong> значит, что часть заказов не провелась — |
| | | 46 | | детали ищите на вкладке «Проведения 1С» по номеру запуска. |
| | | 47 | | </span> |
| | | 48 | | </div> |
| | | 49 | | |
| | | 50 | | <div class="job-logs-workflow"> |
| | | 51 | | <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">1</span><div><strong>Срабатывает расписание< |
| | | 52 | | <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">2</span><div><strong>Отбираются заказы</stro |
| | | 53 | | <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">3</span><div><strong>Транзакция проводится в |
| | | 54 | | <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">4</span><div><strong>Результат в журнале</st |
| | | 55 | | </div> |
| | | 56 | | |
| | | 57 | | |
| | | 58 | | <div class="job-logs-panel card mb-3"> |
| | | 59 | | <div class="card-header bsx-grid-toolbar"> |
| | | 60 | | <strong><i class="fas fa-search me-1 text-primary"></i>Поиск заказа по запускам</strong> |
| | | 61 | | <form method="get" action="/Studio2/JobLogs" class="d-flex gap-2 flex-grow-1 flex-wrap"> |
| | | 62 | | <input type="hidden" name="tab" value="transactions"/> |
| | | 63 | | <div class="bsx-grid-search bsx-grid-search--wide"> |
| | | 64 | | <i class="fas fa-box"></i> |
| | | 65 | | <input type="search" name="orderNumber" value="@Model.OrderNumber" placeholder="Номер отправления (можно |
| | | 66 | | </div> |
| | | 67 | | <button class="btn btn-sm btn-primary" type="submit">Найти</button> |
| | 0 | 68 | | @if (lookup != null) |
| | | 69 | | { |
| | | 70 | | <a href="/Studio2/JobLogs?tab=transactions" class="btn btn-sm btn-outline-secondary"><i class="fas fa-ti |
| | | 71 | | } |
| | | 72 | | </form> |
| | | 73 | | <div class="bsx-grid-toolbar-end"> |
| | | 74 | | <a href="@Url.Action("Index", "TransactionJobs", new { area = "Studio2" })" class="btn btn-sm btn-outline-se |
| | | 75 | | <i class="fas fa-calendar-alt me-1"></i>Расписания |
| | | 76 | | </a> |
| | | 77 | | </div> |
| | | 78 | | </div> |
| | | 79 | | <div class="card-body p-2"> |
| | | 80 | | <div class="small bsx-muted mb-1">Поиск показывает, в каких транзакциях заказ проведён и почему фоновый запуск е |
| | | 81 | | </div> |
| | | 82 | | </div> |
| | | 83 | | |
| | 0 | 84 | | @if (lookup != null) |
| | | 85 | | { |
| | | 86 | | <div class="job-logs-panel card mb-3 border-primary"> |
| | 0 | 87 | | <div class="card-header"><strong><i class="fas fa-search me-1 text-primary"></i>Поиск заказа: <code>@lookup.Quer |
| | | 88 | | <div class="card-body p-2"> |
| | 0 | 89 | | @if (lookup.IsEmpty) |
| | | 90 | | { |
| | | 91 | | <div class="alert alert-warning mb-0"> |
| | | 92 | | Заказ не найден ни в заказах, ни в отборах фоновых запусков. |
| | | 93 | | Проверьте номер отправления — искать можно по части номера или по Id заказа. |
| | | 94 | | </div> |
| | | 95 | | } |
| | | 96 | | else |
| | | 97 | | { |
| | 0 | 98 | | @if (lookup.Orders.Count > 0) |
| | | 99 | | { |
| | 0 | 100 | | <div class="fw-semibold mb-1"><i class="fas fa-box me-1"></i>Заказы (@lookup.Orders.Count)</div> |
| | | 101 | | <div id="jobLogsLookupOrdersGrid" class="bsx-grid bsx-grid--auto mb-3"></div> |
| | | 102 | | } |
| | | 103 | | <div class="fw-semibold mb-1"> |
| | 0 | 104 | | <i class="fas fa-file-invoice me-1"></i>Проведения заказа (@lookup.Postings.Count) |
| | | 105 | | <span class="small bsx-muted ms-2">Фоновая задача — со ссылкой на запуск, остальное проведено вручну |
| | | 106 | | </div> |
| | | 107 | | <div id="jobLogsLookupPostingsGrid" class="bsx-grid bsx-grid--auto mb-3"></div> |
| | | 108 | | <div class="fw-semibold mb-1"> |
| | 0 | 109 | | <i class="fas fa-filter me-1"></i>Отбор в фоновых запусках (@lookup.Matches.Count) |
| | | 110 | | <span class="small bsx-muted ms-2">Здесь видно, почему заказ не был проведён</span> |
| | | 111 | | </div> |
| | | 112 | | <div id="jobLogsLookupMatchesGrid" class="bsx-grid bsx-grid--auto"></div> |
| | | 113 | | } |
| | | 114 | | </div> |
| | | 115 | | </div> |
| | | 116 | | } |
| | | 117 | | |
| | 0 | 118 | | @if (Model.HighlightExecutionId is > 0) |
| | | 119 | | { |
| | | 120 | | <div class="alert alert-info d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3"> |
| | 0 | 121 | | <span>Выбран запуск <strong>#@Model.HighlightExecutionId</strong> (подсвечен в журнале)</span> |
| | 0 | 122 | | <a asp-area="Studio2" asp-controller="TransactionJobs" asp-action="ExecutionDetails" asp-route-id="@Model.Highli |
| | | 123 | | <i class="fas fa-eye me-1"></i>Просмотр подробностей |
| | | 124 | | </a> |
| | | 125 | | </div> |
| | | 126 | | } |
| | | 127 | | |
| | 0 | 128 | | @await Html.PartialAsync("_JobLogsGridPanel", new OzonOrdersWeb.Areas.Studio2.ViewModels.JobLogs.JobLogsGridPanelViewMod |
| | 0 | 129 | | "Запуски", "fa-play-circle", "Расписание, ошибка…", |
| | 0 | 130 | | "Двойной клик — подробности запуска. Фильтры по статусу, типу, расписанию и датам — в строке под заголовками; сортир |
| | | 131 | | |
| | | 132 | | <div class="job-logs-panel card mb-3"> |
| | | 133 | | <div class="card-header d-flex justify-content-between align-items-center"> |
| | | 134 | | <strong><i class="fas fa-calendar-check me-1"></i>Расписания</strong> |
| | 0 | 135 | | <span class="badge bg-secondary">@Model.Schedules.Count</span> |
| | | 136 | | </div> |
| | | 137 | | <div class="card-body p-2"> |
| | | 138 | | <div id="jobLogsSchedulesGrid" class="bsx-grid bsx-grid--auto"></div> |
| | | 139 | | </div> |
| | | 140 | | </div> |