Взаимозачёт

Демо-сессия

Единый интерфейс для компаний, цепочек и репутации

Сценарий

Компании и лоты

Добавить компанию

Добавить лот

Catalog source: loading...
Catalog node не выбран

Политики

Read-only интеграция с внешним каталогом

Demo UI показывает контракт solver-а: правила и публикация живут во внешнем catalog service, а расчёт получает только immutable snapshot.

Роли

  • Аналитик создаёт draft-правила, валидирует и симулирует влияние.
  • Админ утверждает, публикует новый snapshot и активирует/откатывает версию.
  • Solver ничего не редактирует, читает только опубликованный export по snapshot id.

Lifecycle snapshot-а

  1. draft
  2. validate
  3. simulate
  4. approve
  5. publish new snapshot
  6. activate

Активный snapshot не меняется in-place: same input + same catalog_snapshot_id = same result.

Catalog browser

loading
Catalog source: loading...
Проверяю внешний catalog service...

Контракт demo solve

Top-level поле
catalog_snapshot_id
Поля лота
catalog_node_id, catalog_attributes
Explain ребра
catalog_match с reason и snapshot id
Snapshot
активный snapshot берётся из настроенного read-only catalog export
Неизвестный ID
возвращает 400 catalog snapshot not found до запуска optimizer-а

Почему здесь read-only

Demo UI solver-а показывает, какая версия политик участвует в расчёте, но не редактирует сами правила.

Редактирование, согласование и публикация правил должны происходить во внешнем catalog service: там живут draft-статусы, права, audit log, validate, simulate, approve, publish и rollback.

Так solver сохраняет контракт детерминизма: same input + same catalog_snapshot_id = same result.

Примеры правил замены

[
  {
    "id": "subst.white_bread_to_toast_bread.v1",
    "status": "published",
    "demand_node_id": "bread.white",
    "offer_node_id": "bread.toast",
    "priority": 100,
    "direction": "demand_to_offer",
    "conditions": { "attributes": { "sliced": "true" } },
    "reason_code": "allowed_substitution"
  },
  {
    "id": "subst.milk_3_2_to_2_5.v1",
    "status": "published",
    "demand_node_id": "milk.whole.3_2",
    "offer_node_id": "milk.whole.2_5",
    "priority": 80,
    "direction": "demand_to_offer",
    "conditions": { "attributes": { "package": "carton" } },
    "reason_code": "allowed_substitution"
  },
  {
    "id": "subst.diesel_to_winter_diesel.v1",
    "status": "published",
    "demand_node_id": "fuel.diesel",
    "offer_node_id": "fuel.diesel.winter",
    "priority": 120,
    "direction": "demand_to_offer",
    "conditions": { "attributes": { "temperature_class": "winter" } },
    "reason_code": "allowed_substitution"
  }
]

Цепочки

Поиск 5 → 4 → 3 звена

Результат группируется по длине; forbidden-компании применяются к следующему пересчёту.

catalog_snapshot_id отправляется как top-level поле solve request. Поле автоматически заполняется активным snapshot-ом каталога; произвольный ID вроде 1234 вернёт catalog snapshot not found.

Рейтинг

Распределение и кабинет компании

Распределение по рейтингу

Детализация

Выберите компанию в таблице или бакет на графике.

vzaimozachet · новый Demo UI · embedded static