| | | 1 | | using System.Text; |
| | | 2 | | using System.Text.Json; |
| | | 3 | | |
| | | 4 | | namespace OzonOrdersWeb.WebServices.SystemAlerts; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// Ссылки из алертов на «оригинальные» страницы с уже применённым фильтром: сетка заказов с нужными заказами, |
| | | 8 | | /// аудит API поставщика с нужным поставщиком и ошибками, журнал 1С только с ошибками, дашборд Hangfire. |
| | | 9 | | /// </summary> |
| | | 10 | | public static class SystemAlertLinks |
| | | 11 | | { |
| | | 12 | | /// <summary> |
| | | 13 | | /// Сколько заказов кладём в ссылку. Адрес хранится в <c>SystemAlertIncident.Url</c> (до 2000 символов), |
| | | 14 | | /// а base64 от списка идентификаторов раздувает его примерно на треть. |
| | | 15 | | /// </summary> |
| | | 16 | | public const int MaxOrdersInLink = 150; |
| | | 17 | | |
| | | 18 | | /// <summary>Сетка заказов, ограниченная этими заказами (вид «только выбранные», параметр <c>?v=</c> — тот же формат |
| | | 19 | | public static string Orders(IEnumerable<int> orderIds) |
| | | 20 | | { |
| | 1507 | 21 | | var ids = orderIds.Distinct().OrderByDescending(x => x).Take(MaxOrdersInLink).ToList(); |
| | 50 | 22 | | if (ids.Count == 0) return "/Studio2/OrdersGrid"; |
| | 48 | 23 | | var json = JsonSerializer.Serialize(new { i = ids }); |
| | 48 | 24 | | return "/Studio2/OrdersGrid?v=" + Convert.ToBase64String(Encoding.UTF8.GetBytes(json)).TrimEnd('=').Replace('+', |
| | | 25 | | } |
| | | 26 | | |
| | | 27 | | /// <summary>Аудит API поставщика: только ошибки указанного поставщика.</summary> |
| | | 28 | | public static string ApiAuditFailures(string providerKey) => |
| | 2 | 29 | | $"/Studio2/ApiSupplierRequestAudit?provider={Uri.EscapeDataString(providerKey)}&success=false"; |
| | | 30 | | |
| | | 31 | | /// <summary>Аудит API поставщика: конкретная запись.</summary> |
| | 0 | 32 | | public static string ApiAuditEntry(long id) => $"/Studio2/ApiSupplierRequestAudit?highlightId={id}"; |
| | | 33 | | |
| | | 34 | | /// <summary> |
| | | 35 | | /// Отчёт наката BitrixStock (<c>?report=</c>) с готовым видом грида (<c>?gv=</c>, base64url JSON): только строки |
| | | 36 | | /// с отказом Ozon, у которых текст ошибки содержит <paramref name="errorContains"/>, крупные по остатку 1С — выше, |
| | | 37 | | /// колонка «Ошибка Ozon» показана. |
| | | 38 | | /// </summary> |
| | | 39 | | public static string BitrixSyncReportFailures(string reportId, string errorContains) |
| | | 40 | | { |
| | 4 | 41 | | var view = new |
| | 4 | 42 | | { |
| | 4 | 43 | | f = new Dictionary<string, object> |
| | 4 | 44 | | { |
| | 4 | 45 | | ["ozonApplyStatus"] = new { filterType = "set", values = new[] { "Failed" } }, |
| | 4 | 46 | | ["ozonApplyError"] = new { filterType = "text", type = "contains", filter = errorContains } |
| | 4 | 47 | | }, |
| | 4 | 48 | | s = new[] { new { colId = "oneCQty", sort = "desc" } }, |
| | 4 | 49 | | c = new[] { "ozonApplyError" } |
| | 4 | 50 | | }; |
| | 4 | 51 | | var json = JsonSerializer.Serialize(view, new JsonSerializerOptions { Encoder = System.Text.Encodings.Web.JavaSc |
| | 4 | 52 | | var gv = Convert.ToBase64String(Encoding.UTF8.GetBytes(json)).TrimEnd('=').Replace('+', '-').Replace('/', '_'); |
| | 4 | 53 | | return $"/Studio2/BitrixStock?tab=sync&report={Uri.EscapeDataString(reportId)}&gv={gv}"; |
| | | 54 | | } |
| | | 55 | | |
| | | 56 | | /// <summary>Журнал проведений 1С: только неуспешные.</summary> |
| | | 57 | | public const string OneCPostingFailures = "/Studio2/JobLogs?tab=onec&failed=1"; |
| | | 58 | | |
| | | 59 | | public const string HangfireRecurring = "/Hangfire/recurring"; |
| | | 60 | | public const string HangfireServers = "/Hangfire/servers"; |
| | | 61 | | public const string OneCStock = "/Studio2/OneCStock"; |
| | | 62 | | } |