package lkgateway import "sync" // submitguard.go — защита от повторной/параллельной отправки одного и того же // поручения в НРД. Триггеры подачи независимы (авто-поллер m2mauto + ручная // кнопка в карточке + возможный двойной клик), а точка отправки одна. НРД и так // отсекает дубль по исходящему номеру (идемпотентность на стороне НРД — см. // isDuplicateOrderAbort), но полагаться только на это нельзя: дубль поднимает // лишние документы и путает оператора. Поэтому защищаемся и на стороне bj. // // beginSubmit даёт атомарный «захват» по ключу: пока один вызов шлёт поручение, // параллельный получит false и повторно отправлять не станет. После отправки // (успех или ошибка) ключ освобождается endSubmit — поэтому законный повтор // после ошибки работает. Идемпотентность «после УСПЕШНОЙ подачи» обеспечивается // отдельно — проверкой сохранённого факта подачи в сторе (в submitOutgoingFor / // submitIncomingOrderFor): если поручение уже подано, повторно в НРД не шлём. var inflightSubmit = struct { mu sync.Mutex set map[string]bool }{set: map[string]bool{}} // beginSubmit пытается захватить ключ. true — захвачено (можно слать); false — // по этому ключу уже идёт отправка в другом вызове. func beginSubmit(key string) bool { inflightSubmit.mu.Lock() defer inflightSubmit.mu.Unlock() if inflightSubmit.set[key] { return false } inflightSubmit.set[key] = true return true } // endSubmit освобождает ключ (вызывать через defer сразу после beginSubmit). func endSubmit(key string) { inflightSubmit.mu.Lock() delete(inflightSubmit.set, key) inflightSubmit.mu.Unlock() }