Нестабильный канал на судне — не исключение из нормального режима, а одно из исходных условий проекта. Пользовательская операция не должна зависеть от того, доступен ли береговой контур в эту минуту.
Промышленный обмен «Борта» с ERP пока не включён. Архитектура, контракты и тестовые сценарии подготовлены, но целевые объекты ERP и правила первого пилота ещё должны быть утверждены. Поэтому ниже описана принятая модель обмена, а не работающий сквозной контур.
Не web-клиент с кэшем
Если при записи заявки или рапорта судовая система синхронно вызывает ERP, она остаётся удалённым клиентом центральной базы.
При обрыве связи пользователь не знает, записался ли документ, нужно ли повторять действие и не появится ли дубль. Правильный процесс начинается с локального завершения операции.
Одна база — одно судно
Каждая локальная база имеет постоянный идентификатор, закреплённое судно, собственную НСИ и состояние обмена.
Название судна не подходит на роль технического ключа: оно может измениться, быть записано иначе или совпасть с исторической записью.
Outbox и inbox
Целевая последовательность выглядит так:
документ записан локально
→ изменение зарегистрировано
→ сформирован пакет
→ тело сохранено в исходящей очереди
→ транспорт передал пакет
→ ERP сохранила его во входящей очереди
→ отдельное задание выполнило бизнес-обработку
→ сформирована прикладная квитанция
→ судовая база закрыла регистрацию
В обратном направлении действует тот же принцип.
Очередь отделяет пользовательскую операцию от состояния канала. Документ остаётся записанным локально, даже если передача состоится позднее.
Почему пакет должен быть неизменяемым
После формирования у пакета сохраняются номер, тело, размер, контрольная сумма, отправитель, получатель и версия контракта. При повторной попытке должны отправляться те же данные.
Если после тайм-аута сформировать сообщение заново, под прежним номером может оказаться другое содержимое. Получатель уже не отличит безопасный повтор от конфликта.
Неизменяемый пакет позволяет повторять передачу без создания второго бизнес-события.
Ответ транспорта — ещё не результат
Транспортный endpoint должен проверить отправителя, ограничить размер, вычислить контрольную сумму, сохранить тело и вернуть технический идентификатор запроса.
Он не должен в рамках того же вызова создавать НСИ, проводить документы и выполнять длительную обработку.
Успешный HTTP-ответ означает только, что пакет принят транспортом. Бизнес-результат подтверждается отдельной прикладной квитанцией после обработки.
Потерянный ответ и потерянная квитанция
Если ERP сохранила пакет, но сеть оборвалась до ответа, судовая база повторяет тот же пакет. Получатель распознаёт дубль и не создаёт второй документ.
Если пакет обработан, но обратная квитанция не дошла до судна, бизнес-обработка также не должна повторяться. При запросе возвращается прежний результат.
Так обмен становится идемпотентным: технический повтор не меняет бизнес-смысл.
Владельцы данных важнее формата
До выбора XML или JSON нужно определить, кто имеет право менять каждую сущность.
| Данные | Владелец |
|---|---|
| Корпоративная номенклатура | ERP |
| Физический остаток на судне | «Борт» |
| Учётный остаток и стоимость | ERP |
| Исходный судовой рапорт | «Борт» |
| Ресурсный дефект и ремонтный заказ | ERP |
| Фактическое выполнение | «Борт» |
Конфликт между контурами нельзя разрешать правилом «последняя запись побеждает».
Судовая заявка не является финансовым документом
Потребность в запасной части может позднее привести к закупке и оплате. Но в момент создания судно обычно не определяет поставщика, цену, договор и платёжные реквизиты.
Поэтому «Борт» должен передавать техническую потребность. ERP нормализует номенклатуру и выбирает механизм обеспечения в своём контуре.
Что ещё не закрыто
До включения промышленного обмена нужно утвердить:
- целевые объекты ERP;
- соответствия полей контрактов;
- статусы и правила проведения;
- связи судов, технических объектов и номенклатуры;
- ответственных за обработку;
- транспорт первого пилота.
Offline-first — не кнопка «синхронизировать позже». Это обязательство завершать операцию локально, безопасно повторять неизменяемый пакет, отделять транспорт от бизнес-обработки и подтверждать результат прикладной квитанцией.