| | | 1 | | @{ |
| | 0 | 2 | | ViewData["Title"] = "Анализ продуктов"; |
| | 0 | 3 | | var ozonErrorDashboardBaseUrl = (ViewBag.OzonErrorDashboardBaseUrl as string ?? string.Empty).TrimEnd('/'); |
| | | 4 | | |
| | | 5 | | // key — значение ?tab=; id кнопки — <key>-tab (на неё подписаны ленивые модули pa-*.js), id панели — <key> |
| | 0 | 6 | | var tabs = new (string Key, string Icon, string Title, string Hint)[] |
| | 0 | 7 | | { |
| | 0 | 8 | | ("summary", "fa-tachometer-alt", "Обзор", "Главные показатели, динамика, топы и убыточные продукты"), |
| | 0 | 9 | | ("products", "fa-boxes", "Продукты", "Все продукты с фильтрами; двойной клик — детализация"), |
| | 0 | 10 | | ("overall", "fa-globe", "Общая статистика", "Прибыль, средний чек и заказы по месяцам и клиентам"), |
| | 0 | 11 | | ("metrics", "fa-chart-line", "Доп. метрики", "ROI, возвраты, время выполнения, популярные товары"), |
| | 0 | 12 | | ("comparative", "fa-balance-scale", "Сравнительная", "Текущий месяц против предыдущего периода"), |
| | 0 | 13 | | ("seasonality", "fa-calendar-alt", "Сезонность", "Спрос по месяцам, дням недели и часам"), |
| | 0 | 14 | | ("orderStatuses", "fa-tags", "Статусы заказов", "Распределение и динамика статусов"), |
| | 0 | 15 | | ("warehouseRegion", "fa-warehouse", "Склады и регионы", "Итоги по складам отгрузки и городам доставки"), |
| | 0 | 16 | | ("forecast", "fa-chart-area", "Прогноз и тренды", "Прогноз продаж, тренды и рекомендации по закупкам"), |
| | 0 | 17 | | ("defectIndex", "fa-exclamation-triangle", "Индекс ошибок", "Индекс ошибок по кабинетам Ozon"), |
| | 0 | 18 | | ("ozonErrors", "fa-bug", "Ошибки Ozon", "Ссылки на dashboard ошибок по клиентам"), |
| | 0 | 19 | | }; |
| | | 20 | | } |
| | | 21 | | |
| | | 22 | | @* Оболочка AG Grid (тема, токены --og-*, BsxGrid); шапка и вкладки — как у BitrixStock/JobLogs. Правила — docs/frontend |
| | 0 | 23 | | @await Html.PartialAsync("_BsxGridShell") |
| | | 24 | | <link rel="stylesheet" href="~/css/Studio2/ProductAnalysis/pa-analysis.css" asp-append-version="true"/> |
| | | 25 | | |
| | | 26 | | <div class="container-fluid mt-3 pa-page bsx-surface"> |
| | | 27 | | <div class="app-section-hero"> |
| | | 28 | | <div class="d-flex flex-wrap justify-content-between align-items-start gap-3"> |
| | | 29 | | <div> |
| | | 30 | | <h1><i class="fas fa-chart-bar text-primary me-2"></i>Анализ продуктов</h1> |
| | | 31 | | <div class="subtitle">Продажи, прибыль, возвраты, склады и прогноз по заказам Studio2</div> |
| | | 32 | | <div class="subtitle-help">Выберите период — данные вкладок подгружаются при открытии. Ссылка вида <code |
| | | 33 | | <div class="app-section-hero__quick-links"> |
| | | 34 | | <a href="/Studio2/FidStat"><i class="fas fa-broadcast-tower"></i>Статистика фидов</a> |
| | | 35 | | <a href="/TransactionTimeTrackingReport" title="Трекинг времени проведения транзакций"><i class="fas |
| | | 36 | | <a asp-area="Studio2" asp-controller="JobLogs" asp-action="Index"><i class="fas fa-clipboard-list">< |
| | | 37 | | </div> |
| | | 38 | | </div> |
| | | 39 | | </div> |
| | | 40 | | </div> |
| | | 41 | | |
| | | 42 | | <ul class="nav pa-tabs" id="paTabs" role="tablist"> |
| | 0 | 43 | | @foreach (var t in tabs) |
| | | 44 | | { |
| | | 45 | | <li class="nav-item" role="presentation"> |
| | 0 | 46 | | <a class="nav-link @(t.Key == "summary" ? "active" : "")" id="@(t.Key)-tab" data-pa-tab="@t.Key" href="? |
| | 0 | 47 | | <i class="fas @t.Icon me-1"></i>@t.Title |
| | | 48 | | </a> |
| | | 49 | | </li> |
| | | 50 | | } |
| | | 51 | | </ul> |
| | | 52 | | |
| | | 53 | | <div class="pa-period" id="paPeriodBar"> |
| | | 54 | | <label for="periodSelect"><i class="fas fa-calendar-alt me-1"></i>Период</label> |
| | | 55 | | <select id="periodSelect" class="form-select form-select-sm"> |
| | | 56 | | <option value="all" selected>За все время</option> |
| | | 57 | | <option value="today">Сегодня</option> |
| | | 58 | | <option value="yesterday">Вчера</option> |
| | | 59 | | <option value="week">7 дней</option> |
| | | 60 | | <option value="month">Месяц</option> |
| | | 61 | | <option value="3months">3 месяца</option> |
| | | 62 | | <option value="6months">6 месяцев</option> |
| | | 63 | | <option value="year">Год</option> |
| | | 64 | | <option value="custom">Произвольный</option> |
| | | 65 | | </select> |
| | | 66 | | <span id="customPeriodContainer" class="pa-period-custom" hidden> |
| | | 67 | | <input type="date" id="startDate" class="form-control form-control-sm" title="Дата начала"> |
| | | 68 | | <span class="pa-muted">—</span> |
| | | 69 | | <input type="date" id="endDate" class="form-control form-control-sm" title="Дата окончания"> |
| | | 70 | | </span> |
| | | 71 | | <span class="pa-period-note" id="periodNotificationText"></span> |
| | | 72 | | </div> |
| | | 73 | | |
| | | 74 | | <div id="mainTabContent"> |
| | 0 | 75 | | <div class="pa-pane active" id="summary" role="tabpanel">@await Html.PartialAsync("_Summary")</div> |
| | 0 | 76 | | <div class="pa-pane" id="products" role="tabpanel">@await Html.PartialAsync("_Products")</div> |
| | 0 | 77 | | <div class="pa-pane" id="overall" role="tabpanel">@await Html.PartialAsync("_Overall")</div> |
| | 0 | 78 | | <div class="pa-pane" id="metrics" role="tabpanel">@await Html.PartialAsync("_Metrics")</div> |
| | 0 | 79 | | <div class="pa-pane" id="comparative" role="tabpanel">@await Html.PartialAsync("_Comparative")</div> |
| | 0 | 80 | | <div class="pa-pane" id="seasonality" role="tabpanel">@await Html.PartialAsync("_Seasonality")</div> |
| | 0 | 81 | | <div class="pa-pane" id="orderStatuses" role="tabpanel">@await Html.PartialAsync("_Statuses")</div> |
| | 0 | 82 | | <div class="pa-pane" id="warehouseRegion" role="tabpanel">@await Html.PartialAsync("_WarehouseRegion")</div> |
| | 0 | 83 | | <div class="pa-pane" id="forecast" role="tabpanel">@await Html.PartialAsync("_Forecast")</div> |
| | 0 | 84 | | <div class="pa-pane" id="defectIndex" role="tabpanel">@await Html.PartialAsync("_DefectIndex")</div> |
| | 0 | 85 | | <div class="pa-pane" id="ozonErrors" role="tabpanel">@await Html.PartialAsync("_OzonErrors")</div> |
| | | 86 | | </div> |
| | | 87 | | </div> |
| | | 88 | | |
| | | 89 | | @section Scripts { |
| | | 90 | | <!-- AG Charts Community (MIT), локально: wwwroot/lib/ag-charts --> |
| | | 91 | | <script src="~/lib/ag-charts/ag-charts-community.min.js" asp-append-version="true"></script> |
| | | 92 | | <script> |
| | | 93 | | window.paConfig = { |
| | 0 | 94 | | baseUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Url.Action("Index", "ProductAnalysis", new { ar |
| | 0 | 95 | | gridUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Url.Action("GetProductGroupsGrid", "ProductAnal |
| | 0 | 96 | | facetsUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Url.Action("GetProductGroupsFacets", "Product |
| | 0 | 97 | | ozonErrorDashboardBaseUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(ozonErrorDashboardBaseUrl)) |
| | | 98 | | }; |
| | | 99 | | </script> |
| | | 100 | | <script src="~/js/Studio2/ProductAnalysis/pa-common.js" asp-append-version="true"></script> |
| | | 101 | | <script src="~/js/Studio2/ProductAnalysis/pa-help.js" asp-append-version="true"></script> |
| | | 102 | | <script src="~/js/Studio2/ProductAnalysis/pa-charts.js" asp-append-version="true"></script> |
| | | 103 | | <script src="~/js/Studio2/ProductAnalysis/pa-page.js" asp-append-version="true"></script> |
| | | 104 | | <script src="~/js/Studio2/ProductAnalysis/pa-products.js" asp-append-version="true"></script> |
| | | 105 | | <script src="~/js/Studio2/ProductAnalysis/pa-summary.js" asp-append-version="true"></script> |
| | | 106 | | <script src="~/js/Studio2/ProductAnalysis/pa-overall.js" asp-append-version="true"></script> |
| | | 107 | | <script src="~/js/Studio2/ProductAnalysis/pa-metrics.js" asp-append-version="true"></script> |
| | | 108 | | <script src="~/js/Studio2/ProductAnalysis/pa-comparative.js" asp-append-version="true"></script> |
| | | 109 | | <script src="~/js/Studio2/ProductAnalysis/pa-seasonality.js" asp-append-version="true"></script> |
| | | 110 | | <script src="~/js/Studio2/ProductAnalysis/pa-statuses.js" asp-append-version="true"></script> |
| | | 111 | | <script src="~/js/Studio2/ProductAnalysis/pa-warehouse.js" asp-append-version="true"></script> |
| | | 112 | | <script src="~/js/Studio2/ProductAnalysis/pa-forecast.js" asp-append-version="true"></script> |
| | | 113 | | <script src="~/js/Studio2/ProductAnalysis/pa-defect.js" asp-append-version="true"></script> |
| | | 114 | | } |