feat(generator): добавлена судьба заказов

- Зачем:
  - issue #91 требует решать исход и расхождение заказа в день его рождения.
- Что:
  - добавлены три исхода, моменты оплаты и отмены и дельта одной позиции.
  - обновлены проверки повторяемости и архитектурное описание заказов.
- Проверка:
  - cd generator && make lint && make typecheck && make test (418 passed).
This commit is contained in:
2026-08-18 16:02:12 +03:00
parent 62941d2ee5
commit 0d90bd566b
6 changed files with 264 additions and 36 deletions
+32 -1
View File
@@ -232,7 +232,7 @@ COUPONS = (
GOAL_CART_ID = 42150001
GOAL_PURCHASE_ID = 42150002
# --- Числа заказов бэкенда: деньги магазина -------------------------------
# --- Числа заказов бэкенда: деньги магазина и судьба заказа ----------------
# Стоимость доставки: пары «копейки — вес». Бесплатно (самовывоз или акция),
# обычная курьерская, срочная. Это единственные деньги заказа, которых нет
@@ -245,3 +245,34 @@ DELIVERY_KOPECKS_WEIGHTS = (
(29_900, 50),
(59_000, 15),
)
# Чем кончается окно изменяемости заказа: веса трёх исходов, в порядке
# `orders.OrderOutcome`. «Создан» навсегда мир не допускает — из окна заказ
# выходит либо оплаченным, либо отменённым. Доли черновые: калибровка —
# пересборка эталонного мира, этап 7.
ORDER_OUTCOME_WEIGHTS = (
95, # оплачен
3, # оплачен, потом отменён
2, # отменён неоплаченным
)
# Когда внутри окна случается момент заказа — оплата или отмена: веса часов
# от 0 до 143, по часу от рождения заказа. Читается по парам «сколько часов —
# с каким весом»; часов в сумме ровно 144 — самый узкий край окна, у заказа,
# рождённого в конце суток (docs/architecture/orders/fate.md). Почти всё в
# первые сутки, дальше затухание до края:
# профиль гаснет, поэтому обрыв окна в данных не виден. Веса черновые, как и
# доли исходов.
ORDER_MOMENT_HOUR_WEIGHTS = tuple(
weight
for hours, weight in ((6, 100), (18, 60), (24, 25), (48, 8), (48, 2))
for _ in range(hours)
)
# Доля заказов, у которых со склада вычеркнули позицию: товара не оказалось в
# наличии, и заказ приезжает на строку короче клиентской корзины. Бросается
# доля на все заказы дня, а достаётся дельта не всем — однопозиционному заказу
# терять нечего, и таких больше половины, — поэтому в сверке наблюдаемая доля
# выходит вдвое-втрое ниже броска, около ориентира мастер-спеки в 1–2%. Число
# черновое: калибровка — пересборка эталонного мира, этап 7.
ORDER_DELTA_PERCENT = 4