Appearance
Передача партий между юр.лицами
Обновлено: 17.05.2026 Статус: wave K-O4 закрыт codex-ревью 13.05, доступен на dev-стенде. Раздел показывает архитектурный flow; реальные передачи на свежем Кочарин-стенде пока не запускались — список пустой до первого live use case. Адресат: диспетчер отправляющего юр.лица, диспетчер принимающего, интегратор настройки кооперационных маршрутов.
Описывает реализацию K-O4 — передача партий между юр.лицами внутри Кочарина (ВСП → ИКС термообработка, ИП-1 → Арлиз Курган сборка и т.д.) через накопители участка с time-based будильниками.
1. Зачем это нужно
Кочарин — 5 юр.лиц + 2 ИП-кооператора. Изделие проходит несколько предприятий: например, заготовку делает ВСП, термообработку — ИКС, шлифовку — ИП-1. Каждое предприятие — отдельный tenant в AntRoute с изоляцией данных.
Inter-org handover решает три задачи:
- Отправка — диспетчер отправляющего юр.лица переводит партию из своего пространства в shared «накопитель участка» с заранее настроенным receiver org.
- Приёмка — диспетчер принимающего видит handover в своём списке, нажимает Receive — партия появляется в его пространстве со связанной историей передачи.
- Time-based alarms — если приёмка не произошла в SLA-окно (по умолчанию 4-12 часов в зависимости от типа кооперации), система создаёт Notification критичности
criticalдиспетчеру иhighотправителю.
2. Архитектура (упрощённо)
TechnologicalObjectShare— модель «один объект (например, чертёж изделия) доступен другому юр.лицу read-only». Создаётся вручную интегратором или автоматически через cooperation_routes импорта.InterOrgHandover— модель отдельной передачи:from_org+to_org+batch_id+status(sent/received/cancelled) +sent_at+received_at+sla_due_at+alarm_triggered_at.Notification— генерируется service'ом alarms; каждый Notification связан с конкретным Handover черезpayload.handover_id./api/v1/organizations/cooperators/— endpoint показывает какие orgs можно выбрать какto_org(это список изcooperation_routes+ всех org'ов, у которых есть active share с этим юр.лицом).
3. UI flow
3.1. Endpoint Cooperators
При открытии диалога «Передать партию» frontend вызывает GET /api/v1/organizations/cooperators/. Backend возвращает orgs, для которых:
- есть запись в cooperation_routes текущей organization, OR
- есть active
TechnologicalObjectShare(to_org=...)от текущей organization.
Под kocharin-integrator (superuser bypass) возвращаются все 7 Кочарин orgs.
3.2. Список Handover'ов
Раздел /planning/inter-org-handovers под диспетчером (ВСП-admin / ИКС-admin / итд.). Показывает Handover'ы, где текущая org — либо from_org, либо to_org. По умолчанию sort by created_at DESC.

Empty state — это нормально для свежего пилотного стенда
На скриншоте список пустой потому что на свежем dev-стенде Кочарин-импорт прошёл, но live-передач партий между юр.лицами через UI ещё не запускали. Архитектура и endpoint'ы готовы; первая передача появится здесь как только диспетчер ВСП отправит первую партию в ИКС.
Что в каждой строке (когда будут данные):
- handover_id (UUID, кликабельный → detail);
- from_org → to_org с org-кодами (KOC-{numCode});
- batch — артикул изделия + количество;
- status:
sent(отправлено, ждёт receive) /received/cancelled; - sent_at + sla_due_at — когда отправлено, когда истекает SLA;
- alarm — иконка если будильник сработал.
3.3. Detail Handover'а
Открывается по клику на строку. Содержит:
- header с org-кодами + batch info;
- timeline: sent → received (или sent → alarm_triggered → received);
- кнопка
Receive— видна только диспетчеруto_orgи только в status='sent'; - кнопка
Cancel— видна только диспетчеруfrom_orgи только в status='sent' (после receive отмена невозможна); - linked Notifications (если будильник сработал).
Detail не снят, потому что список пустой
Когда появится первая передача, скриншот detail добавится в следующее обновление этой страницы. Архитектура endpoint'а — см. evidence ниже.
4. Time-based alarms
Management command python manage.py check_handover_alarms (запускается cron каждые 5 мин) ищет:
- Handover.status='sent';
- sla_due_at < now;
- alarm_triggered_at IS NULL.
Для каждого такого — создаёт два Notification:
- severity='critical', recipient=диспетчер
to_org, payload={handover_id, batch_artikul, hours_overdue}; - severity='high', recipient=диспетчер
from_org, payload={handover_id, batch_artikul, hours_overdue}.
Затем alarm_triggered_at ставится в now() — это idempotency lock против повторных алармов.
SLA по типам кооперации (из K-O4 methodology §3.4):
- Термообработка: 12 часов от sent до due;
- Шлифовка: 8 часов;
- Сборка: 24 часа;
- По умолчанию: 4 часа.
(Конкретные SLA настраиваются через DSL-конфиг — в kocharin.yaml#cooperation_routes#sla_hours.)
5. Маршрут просмотра (когда будут данные)
После того как первая партия будет отправлена через UI:
- Под
koc-4505016987-admin(диспетчер ВСП) — открыть Batch detail, нажать кнопку «Передать в кооперацию», выбрать ИКС, заполнить comment, отправить. - Открыть
/planning/inter-org-handovers— увидеть строку в status='sent'. - Logout, login под
koc-7203456955-admin(ИКС). - Открыть
/planning/inter-org-handovers— увидеть ту же строку (видна в обеих orgs). - Открыть handover detail, нажать Receive → status переходит в 'received', batch появляется в ИКС-пространстве.
- Если SLA истёк до receive — увидеть в обеих сессиях Notification severity=critical/high.
6. Что отложено
- UI создания handover из карточки Batch. Метод frontend есть (
InterOrgTransferDialog), но в этой статье не снят — нужен живой Batch. - Bulk receive. Сейчас только по одной handover приёмка; bulk «receive все sent для моей org» — отдельная задача.
- Email уведомления при будильнике — пока только in-app Notifications.
- Mobile push. Mobile приложение не входит в этот wave.
- History глубина. Сейчас все Handover'ы хранятся бессрочно; cleanup старше 1 года — после пилота.
7. Что искать в обратной связи
- Достаточно ли информации в списке Handover'ов, или нужны дополнительные столбцы (например, ожидаемая дата возврата для возвратных кооперационных передач)?
- Кнопка
Receive— нужны ли дополнительные confirmation'ы (например, ввод comment'а перед receive), или одного клика достаточно? - Timeline detail'а — какие events важно видеть кроме sent/received/alarm/cancelled?
- SLA-значения по умолчанию (12/8/24/4 часа) — корректны или нужно подкрутить?
Приложение. Evidence в репозитории
docs/sprint_2026_may/closed/2026-05/K-O4-inter-org-batch-transfer.md— закрытая methodology с Block 1A/1B/2/3/4.docs/sprint_2026_may/closed/2026-05/K-O4-inter-org-batch-transfer.md§6 — live API walkthrough на dev:h_api=d231542a-…7e88received,h_alarm=272c63a3-…edb57 critical Notifications.antroute_backend/operational/models/inter_org_handover.py— модель.antroute_backend/operational/services/handover_alarms.py— alarm logic.antroute_backend/operational/management/commands/check_handover_alarms.py— cron entry.frontend/src/features/planning/InterOrgHandoversPage.tsx— list page.frontend/src/features/planning/InterOrgHandoverDetailPage.tsx— detail page.frontend/src/features/planning/InterOrgTransferDialog.tsx— modal из Batch detail.frontend/src/api/cooperators.ts+frontend/src/api/interOrgHandover.ts— клиенты.- 48 backend pytest (operational.tests) + frontend vitest для UI компонентов.