| | | 1 | | using OzonDomains.Models; |
| | | 2 | | using OzonRepositories.Context; |
| | | 3 | | |
| | | 4 | | namespace OzonOrdersWeb.WebServices.Orders.Grid; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// Множественный выбор в справочных фильтрах грида (set-фильтр «как в AG Grid Enterprise»). |
| | | 8 | | /// Общий конвейер (<c>OrderDataFilterManager</c>) умеет только одно значение на поле, поэтому |
| | | 9 | | /// наборы из 2+ значений применяются отдельным <c>Where … Contains</c> через |
| | | 10 | | /// <see cref="OrdersIndexQueryRequest.QueryPostProcessor"/>. Одно значение идёт старым путём — |
| | | 11 | | /// там остаются спец-случаи (LIKE у клиента, «Засыл» у склада). |
| | | 12 | | /// </summary> |
| | | 13 | | public static class OrdersGridMultiValueFilters |
| | | 14 | | { |
| | 1 | 15 | | private static readonly HashSet<string> Supported = new(StringComparer.OrdinalIgnoreCase) |
| | 1 | 16 | | { |
| | 1 | 17 | | "ozonClient", "deliveryProvider", "deliveryName", "clientStatus", "appStatus", |
| | 1 | 18 | | "supplierStatus", "shipmentWarehouse", "supplier", "hasOzonPromotion" |
| | 1 | 19 | | }; |
| | | 20 | | |
| | 9 | 21 | | public static bool Supports(string colId) => Supported.Contains(colId); |
| | | 22 | | |
| | | 23 | | public static IQueryable<Order> Apply( |
| | | 24 | | IQueryable<Order> query, |
| | | 25 | | IReadOnlyDictionary<string, IReadOnlyList<string>> filters, |
| | | 26 | | ApplicationDbContext context) |
| | | 27 | | { |
| | 0 | 28 | | foreach (var (colId, rawValues) in filters) |
| | | 29 | | { |
| | 0 | 30 | | var values = rawValues.Select(v => v.ToLowerInvariant()).ToList(); |
| | 0 | 31 | | if (values.Count == 0) continue; |
| | | 32 | | |
| | 0 | 33 | | switch (colId.ToLowerInvariant()) |
| | | 34 | | { |
| | | 35 | | case "ozonclient": |
| | 0 | 36 | | query = query.Where(o => o.OzonClient != null && values.Contains(o.OzonClient.Name.ToLower())); |
| | 0 | 37 | | break; |
| | | 38 | | case "deliveryprovider": |
| | 0 | 39 | | query = query.Where(o => o.Delivery != null && o.Delivery.Provider != null && values.Contains(o.Deli |
| | 0 | 40 | | break; |
| | | 41 | | case "deliveryname": |
| | 0 | 42 | | query = query.Where(o => o.Delivery != null && o.Delivery.Name != null && values.Contains(o.Delivery |
| | 0 | 43 | | break; |
| | | 44 | | case "clientstatus": |
| | 0 | 45 | | query = query.Where(o => o.ClientStatus != null && values.Contains(o.ClientStatus.Name.ToLower())); |
| | 0 | 46 | | break; |
| | | 47 | | case "appstatus": |
| | | 48 | | { |
| | | 49 | | // «Не указан» в списке статусов = заказы без статуса в отчёте. |
| | 0 | 50 | | var includeEmpty = values.Contains("не указан"); |
| | 0 | 51 | | query = query.Where(o => |
| | 0 | 52 | | (o.AppStatus != null && o.AppStatus.Name != null && values.Contains(o.AppStatus.Name.ToLower())) |
| | 0 | 53 | | || (includeEmpty && o.AppStatus == null)); |
| | 0 | 54 | | break; |
| | | 55 | | } |
| | | 56 | | case "supplierstatus": |
| | | 57 | | { |
| | 0 | 58 | | var ids = rawValues.Select(v => int.TryParse(v, out var id) ? id : (int?)null) |
| | 0 | 59 | | .Where(id => id.HasValue).Select(id => id!.Value).ToList(); |
| | 0 | 60 | | if (ids.Count == 0) break; |
| | 0 | 61 | | query = query.Where(o => context.OrderSupplierStates.Any(state => |
| | 0 | 62 | | state.OrderId == o.Id && state.ActiveOrderId != null |
| | 0 | 63 | | && state.SupplierStatusId.HasValue && ids.Contains(state.SupplierStatusId.Value))); |
| | 0 | 64 | | break; |
| | | 65 | | } |
| | | 66 | | case "shipmentwarehouse": |
| | 0 | 67 | | query = query.Where(o => o.ShipmentWarehouse != null && o.ShipmentWarehouse.Name != null && values.C |
| | 0 | 68 | | break; |
| | | 69 | | case "supplier": |
| | 0 | 70 | | query = query.Where(o => o.Supplier != null && o.Supplier.Name != null && values.Contains(o.Supplier |
| | | 71 | | break; |
| | | 72 | | case "hasozonpromotion": |
| | | 73 | | // Оба значения выбраны — фильтр не сужает; здесь только на всякий случай. |
| | | 74 | | break; |
| | | 75 | | } |
| | | 76 | | } |
| | | 77 | | |
| | 0 | 78 | | return query; |
| | | 79 | | } |
| | | 80 | | } |