delivery.md 3.7 KB

DeliveryService

Назначение

Сервис рассчитывает возможность и стоимость доставки по заданному тарифу, точке на карте и весу заказа. Также отдаёт «книгу тарифов» (полный справочник тарифных зон и сеток цен).

Публичные методы

  • GetTariffsBookAsync(): TariffsBook - вернуть текущую конфигурацию: все тарифы и все зоны.
  • SearchDeliveryInfoAsync(tariffName, pin, weight): DeliveryInfo - вычислить зону по координатам, подобрать подходящую «ступень» веса и вернуть цену. Если доставка недоступна - вернётся DeliveryInfo.NotAvailable (IsAvailable = false).

Контроль доступа осуществляется из NBSession (как и в других сервисах): вызов выполняется от имени текущего пользователя.

Модели

TariffsBook

Справочник, который агрегирует:

  • Tariff[] Tariffs - перечень тарифов (название + «сетка» цен).
  • TariffZone[] Zones - перечень геозон (имя + полигон координат).

Tariff и TariffNet

  • Tariff.Name - имя тарифа (например, «Курьер», «Самовывоз-город»).
  • Tariff.Net[] - набор правил «до веса X → цена Y» в привязке к зоне:

    • ZoneName - имя зоны, к которой относится правило,
    • UntilWeightKg - верхняя граница веса (включительно),
    • Price - цена.

TariffZone

  • Name - идентификатор зоны (например, «City», «RegionA»).
  • Coordinates[] - массив точек полигона зоны (для попадания по pin).

DeliveryConfig

Конфигурация, из которой формируется «книга тарифов»:

  • Zones[] - зоны,
  • Tariffs[] - тарифы.

DeliveryInfo

Результат поиска:

  • IsAvailable - доступна ли доставка,
  • TariffName, ZoneName - что выбрано,
  • UntilWeightKg - порог, сработавший по весу,
  • Price - расчётная стоимость.

Практические рекомендации

  • Единые названия зон: Tariff.Net.ZoneName должен совпадать с TariffZone.Name - это ключ связывания.
  • Границы веса: формируйте «сетку» без дырок и перекрытий. Рекомендуемый набор: [0.5, 1, 2, 5, 10, 20, 999].
  • Полигон зон: координаты упорядочивайте по обходу (по/против часовой) и закрывайте полигон (первая точка = последняя), если это требуется вашим утилитам попадания.
  • NotAvailable: используйте готовую константу для отказов - DeliveryInfo.NotAvailable. Это унифицирует ответы.

Конфигурация

Сервис читает конфиг (зоны + тарифы) из config.json в DeliveryConfig и формирует TariffsBook. Изменение конфигурации осуществляется заменой json файла. Для обновления конфигурации требуется перезагрузка сервиса.

Назад